OSDN Git Service

Merge branch 'skinnable-master'
[nucleus-jp/nucleus-next.git] / nucleus / plugins / skinfiles / index.php
1 <?php
2
3    /* ==========================================================================================
4         * Nucleus SkinFiles Plugin
5         *
6         * Copyright 2005-2007 by Jeff MacMichael and Niels Leenheer
7         *
8         * @version $Id: index.php 1796 2012-04-29 03:46:09Z sakamocchi $
9         * @version $NucleusJP: index.php,v 1.5.2.1 2005/08/25 07:04:13 kimitake Exp $
10         *
11         * ==========================================================================================
12         * This program is free software and open source software; you can redistribute
13         * it and/or modify it under the terms of the GNU General Public License as
14         * published by the Free Software Foundation; either version 2 of the License,
15         * or (at your option) any later version.
16         *
17         * This program is distributed in the hope that it will be useful, but WITHOUT
18         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
20         * more details.
21         *
22         * You should have received a copy of the GNU General Public License along
23         * with this program; if not, write to the Free Software Foundation, Inc.,
24         * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  or visit
25         * http://www.gnu.org/licenses/gpl.html
26         * ==========================================================================================
27         */
28
29         $strRel = '../../../'; 
30         require($strRel . 'config.php');
31         include_libs('PLUGINADMIN.php');
32         
33         /**
34           * Create admin area
35           */
36
37         $oPluginAdmin  = new PluginAdmin('SkinFiles');
38
39         if (!($member->isLoggedIn() && $member->isAdmin()))
40         {
41                 $oPluginAdmin->start();
42                 echo '<p>' . _ERROR_DISALLOWED . '</p>';
43                 $oPluginAdmin->end();
44                 exit;
45         }
46
47
48         
49         /**
50           * Setup main variables
51           */
52
53         $rootDirectory = sfRealPath($DIR_SKINS);                        
54         $rootUrl       = $CONF['SkinsURL'];
55         $pluginUrl         = $oPluginAdmin->plugin->getAdminURL();
56
57         $filetypes = array (
58                 'text'  => array ('inc', 'txt', 'css', 'js', 'php'),
59                 'html'  => array ('htm', 'html'),
60                 'img'   => array ('png', 'gif', 'jpg', 'jpeg', 'bmp', 'ico', 'swf'),
61         );
62         
63         
64         /**
65           * Bypass admin area for downloads
66           */
67         
68         $action = requestVar('action');
69
70         if ($action == 'download') { 
71                 _skinfiles_download();
72                 exit;
73         }
74
75
76         /**
77           * Build admin area
78           */
79
80         $oPluginAdmin->start("<style type='text/css'>
81         <!--
82         
83                 div#content a {
84                         text-decoration: none;
85                 }
86                 div#content img {
87                         vertical-align: middle;
88                         margin-top: -3px;
89                 }
90                 p.message {
91                         font-weight: bold;
92                 }
93                 p.error {
94                         font-size: 100%;
95                         font-weight: bold;
96                         color: #880000;
97                 }
98                 pre {
99                         overflow: auto;
100                         height: 400px;
101                 }
102                 iframe {
103                         width: 100%;
104                         height: 400px;
105                         border: 1px solid gray;
106                 }
107                 div.dialogbox {
108                         border: 1px solid #ddd;
109                         background-color: #F6F6F6;
110                         margin: 18px 0 1.5em 0;
111                 }
112                 div.dialogbox h4 {
113                         background-color: #bbc;
114                         color: #000;
115                         margin: 0;
116                         padding: 5px;
117                 }
118                 div.dialogbox h4.light {
119                         background-color: #ddd;
120                 }
121                 div.dialogbox div {
122                         margin: 0;
123                         padding: 10px;
124                 }
125                 div.dialogbox button {
126                         margin: 10px 0 0 6px;
127                         float: right;
128                 }
129                 div.dialogbox p {
130                         margin: 0;
131                 }
132                 div.dialogbox p.buttons {
133                         text-align: right;
134                         overflow: auto;
135                 }
136                 div.dialogbox textarea {
137                         width: 100%;
138                         margin: 0;
139                 }
140         
141         -->
142         </style>");
143         
144         echo "<h2>" . _SKINFILES_MANAGEMENT . "</h2>";
145         
146         $actions = array (
147                 'renfile', 'renfile_process', 'delfile', 'delfile_process', 
148                 'editfile', 'editfile_process', 'uploadfile', 'createfile', 'viewfile',
149                 'rendir', 'rendir_process', 'deldir', 'deldir_process',
150                 'emptydir', 'emptydir_process', 'createdir'
151         );
152         
153         if (in_array($action, $actions)) 
154         { 
155                 if (!$manager->checkTicket())
156                 {
157                         echo '<p class="error">Error: ' . _ERROR_BADTICKET . '</p>';
158                         sfShowDirectory();
159                         
160                 } 
161                 else 
162                 {
163                         call_user_func('_skinfiles_' . $action);
164                 }
165         } 
166         else 
167         {
168                 sfShowDirectory();
169         }
170
171         $oPluginAdmin->end();
172         exit;
173         
174         
175
176
177
178
179
180         /* Helper functions **************************************************************************************************************/
181
182         function sfExpandDirectory ($path) {
183            /* IN:  relative directory
184                 * OUT: full path to directory
185                 */
186
187                 global $rootDirectory;
188                 return sfRealPath($rootDirectory . $path);
189         }
190         
191         function sfRealPath ($path) {
192            /* IN:  full path 
193                 * OUT: canonicalized absolute pathname
194                 */
195
196                 $path = realpath($path);
197                 $path = str_replace('\\', '/', $path);  
198                 $path = i18n::substr($path, i18n::strlen($path) - 1) != '/' ? $path . '/' : $path;
199                 return $path;
200         }
201
202         function sfFullUrl ($path) {
203            /* IN:  full path including filename
204                 * OUT: url including filename
205                 */
206
207                 global $rootDirectory, $rootUrl;
208                 
209                 $path = str_replace($rootDirectory, '', $path);
210                 $path = rawurlencode($path);
211                 $path = str_replace('%2F', '/', $path);
212                 return $rootUrl . $path;
213         }
214
215         function sfValidPath ($path) {
216            /* IN:  full path excluding or including filename
217                 * OUT: boolean, true if full path is or is within rootDirectory
218                 */
219
220                 global $rootDirectory;
221                 return i18n::substr($path, 0, i18n::strlen($rootDirectory)) == $rootDirectory;
222         }
223         
224         function sfRelativePath ($path) {
225            /* IN:  full path including or excluding filename
226                 * OUT: relative path from rootDirectory
227                 */
228
229                 global $rootDirectory;
230                 return str_replace($rootDirectory, '', $path);
231         }
232         
233         function sfIsFileType ($type, $file) {
234
235                 global $filetypes;
236                 return isset($filetypes[$type]) && in_array(strtolower(i18n::substr(strrchr($file, "."), 1)), $filetypes[$type]);
237         }
238
239         function sfAllowEditing ($file) {
240                 return sfIsFileType('html', $file) || sfIsFileType('text', $file);
241         }
242         
243         function sfAllowViewing ($file) {
244                 return sfIsFileType('html', $file) || sfIsFileType('text', $file) || sfIsFileType('img', $file);
245         }
246
247
248         function sfDisplayPath ($relative) {
249         
250                 global $pluginUrl;
251                 
252                 $result  = '<a href="' . Entity::hsc($pluginUrl) . '" title="Go back to &laquo;skins&raquo;">';
253                 $result .= '<img src="' . Entity::hsc($pluginUrl . 'home.gif') . '" alt="" /> skins</a> / ';
254
255                 $parts = preg_split('#/#', $relative);
256                 $part = '';
257                 
258                 while (list(,$v) = each ($parts)) {
259                         if ($v != '') {
260                                 $part .= $v . '/';
261                                 
262                                 $result .= '<a href="' . Entity::hsc($pluginUrl . '?dir=' . rawurlencode($part)) . '" ';
263                                 $result .= 'title="Go back to &laquo;' . Entity::hsc($v) . '&raquo;">';
264                                 $result .= '<img src="' . Entity::hsc($pluginUrl . 'dir.gif') . '" alt="" /> ';
265                                 $result .= Entity::hsc($v) . '</a> / ';
266                         }
267                 }
268                 
269                 return $result;
270         }
271
272         function sfIcon ($file) {
273         
274                 global $pluginUrl;
275         
276                 $ext = strtolower(i18n::substr(strrchr($file, "."), 1));
277                 
278                 switch ($ext) {
279                         case 'htm':
280                         case 'html':
281                                 return $pluginUrl . 'html.gif';
282                                 break;
283
284                         case 'txt':
285                         case 'js':
286                         case 'css':
287                         case 'inc':
288                                 return $pluginUrl . 'text.gif';
289                                 break;
290
291                         case 'gif':
292                         case 'png':
293                         case 'jpg':
294                         case 'jpeg':
295                         case 'bmp':
296                         case 'xbmp':
297                         case 'ico':
298                                 return $pluginUrl . 'image.gif';
299                                 break;
300
301                         case 'php':
302                         case 'php3':
303                         case 'php4':
304                                 return $pluginUrl . 'php.gif';
305                                 break;
306                                 
307                         default:
308                                 return $pluginUrl . 'generic.gif';
309                                 break;
310                 }
311         }
312
313         function sfIllegalFilename($name) {
314                 return preg_match('#[\n\r\\\/\:\*\?\"\<\>\|]#', $name);
315         }
316
317         function sfDirectoryIsEmpty($dir) {
318                 
319                 $count = 0;
320                 
321                 if ($dh = opendir($dir)) 
322                 {
323                         while (($file = readdir($dh)) !== false) 
324                         $count++;
325                         
326                         closedir($dh);
327                 }
328                 
329                 // $count must be smaller or equal than 2, because '.' 
330                 // and '..' are always returned by readdir().
331                 return $count <= 2;
332         }
333
334
335
336
337
338
339
340
341
342         /* Show directory ****************************************************************************************************************/
343
344         function sfShowDirectory($default = '') {
345
346                 global $pluginUrl, $rootDirectory, $CONF, $manager;
347                 
348                 $directory = $default != '' ? 
349                         $default : 
350                         sfExpandDirectory(trim(requestVar('dir')));
351                 
352                 if (!sfValidPath($directory) || !is_dir($directory)) {
353                         $directory = $rootDirectory;
354                 }
355
356                 $relative  = sfRelativePath ($directory);
357                 
358                 echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative) . '</p>';                  
359
360                         
361                 $dirs = array();
362                 $files = array();
363
364                 if ($dh = @opendir($directory)) { 
365                         while (($file = readdir($dh)) !== false) { 
366                                 if (!preg_match("/^\.{1,2}$/", $file)) {
367                                         $fstat = @stat($directory . $file);
368                                 
369                                         if ($fstat['mode'] & 040000)
370                                                 $dirs[$file] = $fstat;
371                                         else
372                                                 $files[$file] = $fstat;
373                                 }
374                         }
375                         closedir($dh); 
376                 }                       
377                 
378                 ksort($dirs);
379                 ksort($files);
380                 
381                 echo '<table><thead><tr>';
382                 echo '<th>' . _SKINFILES_NAME . '</th><th>' . _SKINFILES_SIZE . '</th><th>' . _SKINFILES_LAST_MODIFIED . '</th><th colspan="4">' . _SKINFILES_ACTIONS . '</th>';
383                 echo '</tr></thead>';
384
385                 while (list($name, $stat) = each($dirs)) {
386                         
387                         $dir = sfRelativePath($directory . $name . '/');
388                                 
389                         echo '<tr onmouseover="focusRow(this);" onmouseout="blurRow(this);"><td>';
390                         
391                         if (is_readable ($directory . $name)) 
392                         {
393                                 echo '<a href="' . Entity::hsc($pluginUrl . '?dir=' . rawurlencode($dir)) . '">';
394                                 echo '<img src="' . Entity::hsc($pluginUrl . 'dir.gif') . '" alt="folder" /> ';
395                                 echo Entity::hsc($name).'</a>';                 
396                         }
397                         else
398                         {
399                                 echo '<img src="' . Entity::hsc($pluginUrl . 'dir.gif') . '" alt="folder" /> ';
400                                 echo Entity::hsc($name);                        
401                         }
402                                                 
403                         echo '</td>';
404                                 
405                         $renUrl = $manager->addTicketToUrl($pluginUrl . '?action=rendir&dir=' . rawurlencode($dir));
406                         $delUrl = $manager->addTicketToUrl($pluginUrl . '?action=deldir&dir=' . rawurlencode($dir));
407                                 
408                         echo '<td>&ndash;</td>';
409                         echo '<td>' . date(_SKINFILES_DATE_FORMAT, $stat['mtime']);
410                         
411                         
412                         if (is_writable($directory . $name)) {
413                                 echo '<td><a href="' . Entity::hsc($renUrl) . '" title="' . _SKINFILES_RENAME . ' &laquo;' . Entity::hsc($name) . '&raquo;">' . _SKINFILES_RENAME . '</a></td>';
414                         } else {
415                                 echo '<td>&nbsp;</td>';
416                         }
417                         
418                         if (is_writable($directory . $name) && sfDirectoryIsEmpty($directory . $name)) {
419                                 echo '<td><a href="' . Entity::hsc($delUrl) . '" title="' . _SKINFILES_DELETE . ' &laquo;' . Entity::hsc($name) . '&raquo;">' . _SKINFILES_DELETE . '</a></td>';
420                         } else {
421                                 echo '<td>&nbsp;</td>';
422                         }
423                         
424                         echo '<td>&nbsp;</td><td>&nbsp;</td>';
425                         echo '</tr>';
426                 }
427
428
429                 while (list($name, $stat) = each($files)) {
430
431                         $file = sfRelativePath($directory . $name);
432
433                         $renUrl   = $manager->addTicketToUrl($pluginUrl . '?action=renfile&file='  . rawurlencode($file));
434                         $delUrl   = $manager->addTicketToUrl($pluginUrl . '?action=delfile&file='  . rawurlencode($file));
435                         $editUrl  = $manager->addTicketToUrl($pluginUrl . '?action=editfile&file=' . rawurlencode($file));
436                         $viewUrl  = $manager->addTicketToUrl($pluginUrl . '?action=viewfile&file=' . rawurlencode($file));
437                         $dlUrl    = $manager->addTicketToUrl($pluginUrl . '?action=download&file=' . rawurlencode($file));
438
439                         echo '<tr onmouseover="focusRow(this);" onmouseout="blurRow(this);"><td>';
440                         
441                         if (is_readable ($directory . $name) && sfAllowViewing($name)) 
442                         {
443                                 echo '<a href="' . Entity::hsc($viewUrl) . '">';
444                                 echo '<img src="' . Entity::hsc(sfIcon($name)) . '" alt="" /> ';
445                                 echo Entity::hsc($name).'</a>';
446                         }
447                         else
448                         {
449                                 echo '<img src="' . Entity::hsc(sfIcon($name)) . '" alt="" /> ';
450                                 echo Entity::hsc($name);
451                         }
452
453                         echo '</td><td>';
454                         echo ceil($stat['size'] / 1024) . ' kB';
455                         echo '</td><td>';
456                         echo date(_SKINFILES_DATE_FORMAT, $stat['mtime']);
457                         echo '</td><td>';
458                                 
459                         if (is_writable($directory . $name)) {
460                                 echo '<a href="' . Entity::hsc($renUrl) . '" title="' . _SKINFILES_RENAME . ' &laquo;' . Entity::hsc($name) . '&raquo;">' . _SKINFILES_RENAME . '</a>';
461                         } else {
462                                 echo '&nbsp;';
463                         }
464                                 
465                         echo '</td><td>';
466
467                         if (is_writable($directory . $name)) {
468                                 echo '<a href="' . Entity::hsc($delUrl) . '" title="' . _SKINFILES_DELETE . ' &laquo;' . Entity::hsc($name) . '&raquo;">' . _SKINFILES_DELETE . '</a>';
469                         } else {
470                                 echo '&nbsp;';
471                         }
472                                 
473                         echo '</td><td>';
474                         
475                         if (is_writable($directory . $name) && sfAllowEditing($name))
476                                 echo '<a href="'. Entity::hsc($editUrl) . '" title="' . _SKINFILES_EDIT . ' &laquo;' . Entity::hsc($name) . '&raquo;">' . _SKINFILES_EDIT . '</a>';
477                         else
478                                 echo '&nbsp;';
479
480                         echo '</td><td>';
481                         
482                         if (is_readable ($directory . $name))
483                                 echo '<a href="' . Entity::hsc($dlUrl) . '" title="' . _SKINFILES_DOWNLOAD . ' &laquo;' . Entity::hsc($name) . '&raquo;">' . _SKINFILES_DOWNLOAD . '</a>';
484                         else
485                                 echo '&nbsp;';
486                                 
487                         echo '</td></tr>';
488                 }
489
490                 if (!count($dirs) && !count($files)) {
491                         echo '<tr><td colspan="7">' . _SKINFILES_ERR_DIR_DOES_NOT_CONTAIN . '</td></tr>';
492                 }
493
494                 echo '</table>';
495
496                 if ($relative != '') {
497                 
498                         if (is_writable($directory)) {
499                                 echo '<div class="dialogbox">';
500                                 echo '<h4 class="light">' . _SKINFILES_CREATE_NEW_FILE . '</h4><div>';
501                                 echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
502                                 $manager->addTicketHidden();
503                                 echo '<input type="hidden" name="action" value="createfile" />';
504                                 echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative) . '" />';
505                                 echo '<input type="text" name="name" size="40" value="untitled.txt" />';
506                                 echo '<p class="buttons"><input type="submit" value="' . _SKINFILES_CREATE_FILE . '" /></p></form>';
507                                 echo '</div></div>';
508         
509                                 echo '<div class="dialogbox">';
510                                 echo '<h4 class="light">' . _SKINFILES_UPLOAD_NEW_FILE . '</h4><div>';
511                                 echo '<form method="post" enctype="multipart/form-data" action="' . Entity::hsc($pluginUrl) . '">';
512                                 $manager->addTicketHidden();
513                                 echo '<input type="hidden" name="action" value="uploadfile" />';
514                                 echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative) . '" />';
515                                 echo '<input type="hidden" name="MAX_FILE_SIZE" value="' . $CONF['MaxUploadSize'] . '" />';
516                                 echo '<input type="file" name="name" size="40" />';
517                                 echo '<p class="buttons"><input type="submit" value="' . _SKINFILES_UPLOAD . '" /></p></form>';
518                                 echo '</div></div>';
519                         }
520         
521                         if (count($files)) {
522                                 echo '<div class="dialogbox">';
523                                 echo '<h4 class="light">' . _SKINFILES_DEL_ALL_FILES . '</h4><div>';
524                                 echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
525                                 $manager->addTicketHidden();
526                                 echo '<input type="hidden" name="action" value="emptydir" />';
527                                 echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative) . '" />';
528                                 echo _SKINFILES_DEL_ALL_FILES_MSG;
529                                 echo '<p class="buttons"><input type="submit" value="' . _SKINFILES_DELETE_ALL . '" tabindex="140" onclick="return checkSubmit();" /></p>';
530                                 echo '</form>';
531                                 echo '</div></div>';
532                         }
533                 }
534         
535                 if (is_writable($directory)) {
536                         echo '<div class="dialogbox">';
537                         echo '<h4 class="light">' . _SKINFILES_CREATE_NEW_DIR . '</h4><div>';
538                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
539                         $manager->addTicketHidden();
540                         echo '<input type="hidden" name="action" value="createdir" />';
541                         echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative) . '" />';
542                         echo '<input type="text" name="name" value="untitled" tabindex="90" size="40" />';
543                         echo '<p class="buttons"><input type="submit" value="' . _SKINFILES_CREATE . '" tabindex="140" onclick="return checkSubmit();" /></p>';
544                         echo '</form>';
545                         echo '</div></div>';
546                 }
547         }
548         
549         
550         
551
552         /* Rename directory **************************************************************************************************************/
553
554         function _skinfiles_rendir($preset = '') {
555
556                 global $pluginUrl, $manager;
557                 
558                 $file      = trim(basename(requestVar('dir')));
559                 $directory = trim(dirname(requestVar('dir')));
560                 $directory = sfExpandDirectory ($directory);
561                 
562                 if (sfValidPath($directory . $file) && file_exists($directory . $file) && 
563                         is_dir($directory . $file) && is_writable($directory . $file)) 
564                 {
565                         $relative = sfRelativePath ($directory);
566                         $editUrl  = $manager->addTicketToUrl($pluginUrl . '?action=rendir&dir=' . rawurlencode($relative . $file));
567
568                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
569                         echo '<a href="' . Entity::hsc($editUrl) . '" title="' . _SKINFILES_RENAME . ' &laquo;' . $file . '&raquo;">';
570                         echo '<img src="' . $pluginUrl . 'dir.gif' . '" alt="" /> ' . $file . '</a></p>';
571
572                         echo '<div class="dialogbox">';
573                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
574                         $manager->addTicketHidden();
575                         echo '<input type="hidden" name="action" value="rendir_process" />';
576                         echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative . $file) . '" />';
577
578                         echo '<h4>' . _SKINFILES_RENAME_DIR_MSG . ' &laquo;' . Entity::hsc($file) . '&raquo; ' . _SKINFILES_RENAME_DIR_MSG2 . '</h4><div>';
579                         echo '<p><input type="text" name="name" size="40" value="' . Entity::hsc($preset != '' ? $preset : $file) . '" /></p>';
580                         echo '<p class="buttons">';
581                         echo '<input type="hidden" name="sure" value="yes" />';
582                         echo '<input type="submit" value="' . _SKINFILES_RENAME . '" />';
583                         echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
584                         echo '</p>';
585                         echo '</div></form></div>';
586                 }
587                 else
588                 {
589                         echo "<p class='error'>" . _SKINFILES_ERR_DIR_DOES_NOT_EXIST1 . " &laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DIR_DOES_NOT_EXIST2;
590                         echo _SKINFILES_ERR_DIR_DOES_NOT_EXIST3 . "</p>";
591                 }
592         }
593         
594         function _skinfiles_rendir_process() {
595
596                 global $pluginUrl, $manager;
597                 
598                 $file      = trim(basename(requestVar('dir')));
599                 $directory = trim(dirname(requestVar('dir')));
600                 $directory = sfExpandDirectory ($directory);
601                 
602                 if (requestVar('sure') == 'yes')
603                 {
604                         if (sfValidPath($directory . $file) && file_exists($directory . $file) && 
605                                 is_dir($directory . $file) && is_writable($directory . $file)) 
606                         {
607                                 $name = requestVar('name');
608                                 
609                                 if ($name == '') {
610                                         echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_RENAME_DIR1 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
611                                         echo _SKINFILES_ERR_COULD_NOT_RENAME_DIR2 . "</p>";
612                                         _skinfiles_rendir($name);
613                                         return;
614                                 }
615                                 
616                                 if (sfIllegalFilename($name)) {
617                                         echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_RENAME_DIR3 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
618                                         echo _SKINFILES_ERR_COULD_NOT_RENAME_DIR4 . "</p>";
619                                         _skinfiles_rendir($name);
620                                         return;
621                                 } 
622                                 
623                                 if ($name == $file) {
624                                         echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_RENAME_DIR5 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
625                                         echo _SKINFILES_ERR_COULD_NOT_RENAME_DIR6 . _SKINFILES_ERR_COULD_NOT_RENAME_DIR7 . "</p>";
626                                         _skinfiles_rendir($name);
627                                         return;
628                                 }
629                                 
630                                 if (file_exists($directory . $name)) {
631                                         echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_RENAME_DIR8 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
632                                         echo _SKINFILES_ERR_COULD_NOT_RENAME_DIR9 . _SKINFILES_ERR_COULD_NOT_RENAME_DIR10 . "</p>";
633                                         _skinfiles_rendir($name);
634                                         return;
635                                 }
636                                 
637                                 if (!@rename($directory . $file, $directory . $name)) 
638                                 {
639                                         echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_RENAME_DIR11 . "&laquo;" . Entity::hsc($file) . "&raquo;</p>";
640                                         _skinfiles_rendir($name);
641                                         return;
642                                 }
643         
644                                 echo "<p class='message'>" . _SKINFILES_RENAMED_DIR1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_RENAMED_DIR2;
645                                 echo _SKINFILES_RENAMED_DIR3 . "&laquo;" . Entity::hsc($name) . "&raquo;" . _SKINFILES_RENAMED_DIR4 . "</p>";
646                                 sfShowDirectory($directory);
647                         }               
648                         else
649                         {
650                                 echo "<p class='error'>" . _SKINFILES_ERR_DIR_DOES_NOT_EXIST1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DIR_DOES_NOT_EXIST2;
651                                 echo _SKINFILES_ERR_DIR_DOES_NOT_EXIST3 . "</p>";
652                         }
653                 }
654                 else
655                 {
656                         // User cancelled
657                         sfShowDirectory($directory);
658                 }
659         }
660
661
662
663
664         /* Create directory **************************************************************************************************************/
665
666         function _skinfiles_createdir() {
667         
668                 $directory = trim(requestVar('dir'));
669                 $directory = sfExpandDirectory($directory);
670
671                 if (sfValidPath($directory) && is_dir($directory) && is_writable($directory)) 
672                 {
673                         $name = requestVar('name');
674                         
675                         if ($name == '') {
676                                 echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_CREATE_DIR1 . "</p>";
677                                 sfShowDirectory($directory);
678                                 return;
679                         }
680                         
681                         if (sfIllegalFilename($name)) {
682                                 echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_CREATE_DIR2 . "&laquo;" . Entity::hsc($name) . "&raquo; ";
683                                 echo _SKINFILES_ERR_COULD_NOT_CREATE_DIR3 . "</p>";
684                                 sfShowDirectory($directory);
685                                 return;
686                         } 
687                         
688                         if (file_exists($directory . $name)) {
689                                 echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_CREATE_DIR4 . "&laquo;" . Entity::hsc($name) . "&raquo; ";
690                                 echo _SKINFILES_ERR_COULD_NOT_CREATE_DIR5 . _SKINFILES_ERR_COULD_NOT_CREATE_DIR6 . "</p>";
691                                 sfShowDirectory($directory);
692                                 return;
693                         }
694                         
695                         $mask = @umask(0000);
696
697                         if (!@mkdir($directory . $name, 0755)) 
698                         {
699                                 echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_CREATE_DIR2 . "&laquo;" . Entity::hsc($name) . "&raquo;</p>";
700                                 sfShowDirectory($directory);
701                                 return;
702                         }
703
704                         @umask($mask);
705                         
706                         echo "<p class='message'>" . _SKINFILES_ERR_COULD_NOT_CREATE_DIR7 . "&laquo;" . Entity::hsc($name) . "&raquo; " . _SKINFILES_ERR_COULD_NOT_CREATE_DIR8 . "</p>";
707                         sfShowDirectory($directory);
708                 }               
709                 else
710                 {
711                         echo "<p class='error'>" . _SKINFILES_ERR_COULD_NOT_CREATE_DIR9 . "&laquo;" . Entity::hsc(basename($directory)) . "&raquo; " .  _SKINFILES_ERR_COULD_NOT_CREATE_DIR10;
712                         echo _SKINFILES_ERR_COULD_NOT_CREATE_DIR11 . "</p>";
713                 }
714         }
715         
716         
717         
718
719         /* Delete directory **************************************************************************************************************/
720
721         function _skinfiles_deldir() {
722
723                 global $pluginUrl, $manager;
724                 
725                 $file      = trim(basename(requestVar('dir')));
726                 $directory = trim(dirname(requestVar('dir')));
727                 $directory = sfExpandDirectory ($directory);
728                 
729                 if (sfValidPath($directory . $file) && file_exists($directory . $file) && 
730                         is_dir($directory . $file) && is_writable($directory . $file) &&
731                         sfDirectoryIsEmpty($directory . $file)) 
732                 {
733                         $relative = sfRelativePath ($directory);
734                         $delUrl  = $manager->addTicketToUrl($pluginUrl . '?action=deldir&dir=' . rawurlencode($relative . $file));
735
736                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
737                         echo '<a href="' . Entity::hsc($delUrl) . '" title="' . _SKINFILES_DELETE . ' &laquo;' . $file . '&raquo;">';
738                         echo '<img src="' . $pluginUrl . 'dir.gif' . '" alt="" /> ' . $file . '</a></p>';
739
740                         echo '<div class="dialogbox">';
741                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
742                         $manager->addTicketHidden();
743                         echo '<input type="hidden" name="action" value="deldir_process" />';
744                         echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative . $file) . '" />';
745
746                         echo '<h4>' . _SKINFILES_DELETE_DIR . ' &laquo;' . Entity::hsc($file) . '&raquo; ' . _SKINFILES_DELETE_DIR2 . '</h4><div>';
747                         echo '<p class="buttons">';
748                         echo '<input type="hidden" name="sure" value="yes" />';
749                         echo '<input type="submit" value="' . _SKINFILES_DELETE . '" />';
750                         echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
751                         echo '</p>';
752                         echo '</div></form></div>';
753                 }
754                 else
755                 {
756                         echo "<p class='error'>" . _SKINFILES_ERR_DELETE_DIR1 . " &laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_DIR2;
757                         echo _SKINFILES_ERR_DELETE_DIR3 . "</p>";
758                 }
759         }
760         
761         function _skinfiles_deldir_process() {
762
763                 global $pluginUrl, $manager;
764                 
765                 $file      = trim(basename(requestVar('dir')));
766                 $directory = trim(dirname(requestVar('dir')));
767                 $directory = sfExpandDirectory ($directory);
768                 
769                 if (requestVar('sure') == 'yes')
770                 {
771                         if (sfValidPath($directory . $file) && file_exists($directory . $file) && 
772                                 is_dir($directory . $file) && is_writable($directory . $file) &&
773                                 sfDirectoryIsEmpty($directory . $file)) 
774                         {
775                                 if (!@rmdir($directory . $file)) 
776                                 {
777                                         echo "<p class='error'>" . _SKINFILES_ERR_DELETE_DIR4 . "&laquo;" . Entity::hsc($file) . "&raquo;</p>";
778                                         sfShowDirectory($directory);
779                                         return;
780                                 }
781         
782                                 echo "<p class='message'>" . _SKINFILES_ERR_DELETE_DIR5 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_DIR6 . "</p>";
783                                 sfShowDirectory($directory);
784                         }               
785                         else
786                         {
787                                 echo "<p class='error'>" . _SKINFILES_ERR_DELETE_DIR1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_DIR2;
788                                 echo _SKINFILES_ERR_DELETE_DIR3 . "</p>";
789                         }
790                 }
791                 else
792                 {
793                         // User cancelled
794                         sfShowDirectory($directory);
795                 }
796         }       
797         
798         
799         
800         
801         /* Empty directory ***************************************************************************************************************/
802
803         function _skinfiles_emptydir() {
804
805                 global $pluginUrl, $manager;
806                 
807                 $file      = trim(basename(requestVar('dir')));
808                 $directory = trim(dirname(requestVar('dir')));
809                 $directory = sfExpandDirectory ($directory);
810                 
811                 if (sfValidPath($directory . $file) && file_exists($directory . $file) && is_dir($directory . $file)) 
812                 {
813                         $files = array();
814         
815                         if ($dh = @opendir($directory . $file)) 
816                         { 
817                                 while (($name = readdir($dh)) !== false) {
818                                         if(!preg_match("/^\.{1,2}$/", $name) && 
819                                            !is_dir($directory . $file . '/' . $name) &&
820                                            is_writable($directory . $file . '/' . $name)) 
821                                                         $files[] = $name;
822                                 }
823                                 
824                                 closedir($dh); 
825                                 sort($files);
826                         }
827                         
828                         $relative = sfRelativePath ($directory);
829                         $emptyUrl  = $manager->addTicketToUrl($pluginUrl . '?action=emptydir&dir=' . rawurlencode($relative . $file));
830
831                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
832                         echo '<a href="' . Entity::hsc($emptyUrl) . '" title="Empty &laquo;' . $file . '&raquo;">';
833                         echo '<img src="' . $pluginUrl . 'dir.gif' . '" alt="" /> ' . $file . '</a></p>';
834
835                         echo '<div class="dialogbox">';
836                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
837                         $manager->addTicketHidden();
838                         echo '<input type="hidden" name="action" value="emptydir_process" />';
839                         echo '<input type="hidden" name="dir" value="' . Entity::hsc($relative . $file) . '" />';
840
841                         echo '<h4>' . _SKINFILES_DELETE_FILE_MSG . ' &laquo;' . Entity::hsc($file) . '&raquo;' . _SKINFILES_DELETE_FILE_MSG2 . '</h4><div>';
842                         
843                         if (count($files)) 
844                         {
845                                 echo '<ul>';
846                                 foreach ($files as $name) {     echo '<li>' . Entity::hsc($name) . '</li>'; }
847                                 echo '</ul>';
848         
849                                 echo '<p class="buttons">';
850                                 echo '<input type="hidden" name="sure" value="yes" />';
851                                 echo '<input type="submit" value="' . _SKINFILES_DELETE . '" />';
852                                 echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
853                                 echo '</p>';
854                         }
855                         else
856                         {
857                                 echo '<p>' . _SKINFILES_ERR_DELETE_DIR7 . '</p>';
858                                 echo '<p class="buttons">';
859                                 echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
860                                 echo '</p>';
861                         }
862                         
863                         echo '</div></form></div>';
864                         
865                 }
866                 else
867                 {
868                         echo "<p class='error'>" . _SKINFILES_ERR_DELETE_DIR1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_DIR2;
869                         echo _SKINFILES_ERR_DELETE_DIR3 . "</p>";
870                 }
871         }
872
873         function _skinfiles_emptydir_process() {
874
875                 global $pluginUrl, $manager;
876                 
877                 $file      = trim(basename(requestVar('dir')));
878                 $directory = trim(dirname(requestVar('dir')));
879                 $directory = sfExpandDirectory ($directory);
880                 
881                 if (requestVar('sure') == 'yes')
882                 {
883                         if (sfValidPath($directory . $file) && file_exists($directory . $file) && is_dir($directory . $file)) 
884                         {
885                                 if ($dh = @opendir($directory . $file)) 
886                                 { 
887                                         while (($name = readdir($dh)) !== false) 
888                                         {
889                                                 if(!preg_match("/^\.{1,2}$/", $name) &&  !is_dir($directory . $file . '/' . $name) &&
890                                                    is_writable($directory . $file . '/' . $name)) 
891                                                 {
892                                                         if (unlink ($directory .$file . '/' . $name)) 
893                                                                 echo "<p class='message'>" . _SKINFILES_ERR_EMPTY_DIR1 . "&laquo;" . Entity::hsc($name) . "&raquo; " . _SKINFILES_ERR_EMPTY_DIR2 . "</p>";
894                                                         else
895                                                                 echo "<p class='error'>" . _SKINFILES_ERR_EMPTY_DIR3 . "&laquo;" . Entity::hsc($name) . "&raquo; " . _SKINFILES_ERR_EMPTY_DIR4 . "</p>";
896                                                 }
897                                         }
898                                         
899                                         closedir($dh); 
900         
901                                         sfShowDirectory($directory . $file . '/');
902                                 }
903                         }
904                         else
905                         {
906                                 echo "<p class='error'>" . _SKINFILES_ERR_EMPTY_DIR5 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_EMPTY_DIR6;
907                                 echo _SKINFILES_ERR_EMPTY_DIR7 . "</p>";
908                         }
909                 }
910                 else
911                 {
912                         // User cancelled
913                         sfShowDirectory($directory . $file . '/');
914                 }
915         }
916
917
918
919
920         /* Download file *****************************************************************************************************************/
921
922         function _skinfiles_download() {
923
924                 global $pluginUrl, $manager;
925                 
926                 $file = basename(trim(requestVar('file')));
927
928                 $directory = dirname(trim(requestVar('file')));
929                 $directory = sfExpandDirectory ($directory);
930                 
931                 if (sfValidPath($directory) && file_exists($directory . $file) && 
932                         is_file($directory . $file) && is_readable($directory . $file)) 
933                 {
934                         if ( i18n::strpos(serverVar('HTTP_USER_AGENT'), "MSIE") !== FALSE )
935                                 $name = preg_replace('/\./', '%2e', $file, substr_count($file, '.') - 1);
936                         else
937                                 $name = $file;
938                                 
939                         if ($fp = @fopen($directory . $file, 'r')) {
940                                 header("Cache-Control: ");      // leave blank to avoid IE errors
941                                 header("Pragma: ");                     // leave blank to avoid IE errors
942                                 header("Content-type: application/octet-stream");
943                                 header('Content-Disposition: attachment; filename="'.$name.'"');
944                                 header("Content-length: ".(string)(filesize($directory . $file)));
945                                 sleep(1);
946                                 
947                                 fpassthru($fp);
948                                 fclose($fp);
949                         }
950                         else
951                         {
952                                 echo _SKINFILES_ERR_DOWNLOAD_FILE1;
953                         }
954                 }
955                 else
956                 {
957                         echo _SKINFILES_ERR_DOWNLOAD_FILE2;
958                 }
959
960                 exit;
961         }
962
963
964
965
966         /* View file *********************************************************************************************************************/
967
968         function _skinfiles_viewfile() {
969
970                 global $pluginUrl, $manager;
971                 
972                 $file      = basename(trim(requestVar('file')));
973                 $directory = dirname(trim(requestVar('file')));
974                 $directory = sfExpandDirectory ($directory);
975                 
976                 if (sfValidPath($directory) && file_exists($directory . $file) && 
977                         is_file($directory . $file) && is_readable($directory . $file) && sfAllowViewing($file)) 
978                 {
979                         $relative = sfRelativePath ($directory);
980                         $viewUrl  = $manager->addTicketToUrl($pluginUrl . '?action=viewfile&file=' . rawurlencode(sfRelativePath($directory . $file)));
981
982                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
983                         echo '<a href="' . Entity::hsc($viewUrl) . '" title="View &laquo;' . $file . '&raquo;">';
984                         echo '<img src="' . Entity::hsc(sfIcon($file)) . '" alt="" /> ' . $file . '</a></p>';
985
986                         echo '<h4>' . _SKINFILES_VIEW_FILE . '&laquo;' . Entity::hsc($file) . '&raquo;</h4>';
987
988                         if (sfIsFileType('html', $file))
989                         {
990                                 echo '<iframe src="' . sfFullUrl($directory . $file) . '"></iframe>';
991                         }
992
993                         if (sfIsFileType('text', $file))
994                         {
995                                 $content = implode('', file($directory . $file));
996
997                                 echo '<pre>';
998                                 echo Entity::hsc($content);
999                                 echo '</pre>';
1000                         }
1001
1002                         if (sfIsFileType('img', $file))
1003                         {
1004                                 $size = getimagesize($directory . $file, $info);
1005                                 
1006                                 switch ($size[2]) {
1007                                         case IMAGETYPE_GIF:             $type = 'GIF document'; break;
1008                                         case IMAGETYPE_JPEG:    $type = 'JPEG photograph'; break;
1009                                         case IMAGETYPE_PNG:             $type = 'PNG document'; break;
1010                                         case IMAGETYPE_SWF:             $type = 'Flash animation'; break;
1011                                         case IMAGETYPE_PSD:             $type = 'Photoshop document'; break;
1012                                         case IMAGETYPE_BMP:             $type = 'BMP document'; break;
1013                                         case IMAGETYPE_TIFF_II: $type = 'TIFF document (Intel Byte Order)'; break;
1014                                         case IMAGETYPE_TIFF_MM: $type = 'TIFF document (Motorola Byte Order)'; break;
1015                                         case IMAGETYPE_JPC:             $type = 'JPEG2000 photograph'; break;
1016                                         case IMAGETYPE_JP2:     $type = 'JPEG2000 photograph'; break;
1017                                         case IMAGETYPE_JPX:     $type = 'JPEG2000 photograph'; break;
1018                                         case IMAGETYPE_JB2:     $type = 'Slowview document'; break;
1019                                         case IMAGETYPE_SWC:     $type = 'Flash animation (compressed)'; break;
1020                                         case IMAGETYPE_IFF:     $type = 'IFF document'; break;
1021                                         case IMAGETYPE_WBMP:    $type = 'WBMP document'; break;
1022                                         case IMAGETYPE_XBM:     $type = 'XBM document'; break;
1023                                         default:                                $type = 'Unknown document'; break;
1024                                 }
1025
1026                                 if ($size[2] == IMAGETYPE_GIF || $size[2] == IMAGETYPE_JPEG ||
1027                                         $size[2] == IMAGETYPE_PNG)
1028                                 {
1029                                         echo '<p><img src="' . sfFullUrl($directory . $file) . '" alt="" /></p>';
1030                                 }
1031                                 
1032                                 echo '<table>';
1033                                 echo '<tr><th colspan="2">' . _SKINFILES_VIEW_FILE_IMG_INFO . '</th></tr>';
1034                                 echo '<tr><td>' . _SKINFILES_VIEW_FILE_TYPE . '</td><td>' . Entity::hsc($type) . '</td></tr>';
1035                                 echo '<tr><td>' . _SKINFILES_VIEW_FILE_WIDTH . '</td><td>' . Entity::hsc($size[0]) . _SKINFILES_VIEW_FILE_PX . '</td></tr>';
1036                                 echo '<tr><td>' . _SKINFILES_VIEW_FILE_HEIGHT . '</td><td>' . Entity::hsc($size[1]) . _SKINFILES_VIEW_FILE_PX . '</td></tr>';   
1037                                 
1038                                 if (isset($size['channels']) || isset($size['bits'])) 
1039                                 {
1040                                         $channels = isset($size['channels']) ? $size['channels'] : 3;
1041                                         $depth    = $size[2] == IMAGETYPE_GIF ? $size['bits'] : $size['bits'] * $channels;
1042                                         echo '<tr><td>' . _SKINFILES_VIEW_FILE_CHANNELS . '</td><td>' . Entity::hsc($channels) . '</td></tr>';
1043                                         echo '<tr><td>' . _SKINFILES_VIEW_FILE_COLOR_DEPTH . '</td><td>' . Entity::hsc($depth) . _SKINFILES_VIEW_FILE_BITS . '</td></tr>';
1044                                         echo '<tr><td>' . _SKINFILES_VIEW_FILE_COLORS . '</td><td>' . Entity::hsc(pow(2, $depth)) . _SKINFILES_VIEW_FILE_COLORS2 . '</td></tr>';
1045                                 }
1046
1047                                 
1048                                 if (function_exists('exif_read_data') && ($size[2] == IMAGETYPE_JPEG || 
1049                                         $size[2] == IMAGETYPE_TIFF_II || $size[2] == IMAGETYPE_TIFF_MM))
1050                                 {
1051                                         $exif = exif_read_data($directory . $file, 'EXIF');
1052                                         
1053                                         if ($exif) 
1054                                         {
1055                                                 echo '<tr><th colspan="2">Exif information</th></tr>';
1056                                                 
1057                                                 if (isset($exif['Make']) && isset($exif['Model']))
1058                                                         echo '<tr><td>Camera:</td><td>' . Entity::hsc($exif['Make'] . ' ' . $exif['Model']) . '</td></tr>';
1059                                                 
1060                                                 if (isset($exif['DateTime']))
1061                                                         echo '<tr><td>Created on:</td><td>' . Entity::hsc($exif['DateTime']) . '</td></tr>';
1062                                                 
1063                                                 if (isset($exif['XResolution']))
1064                                                         echo '<tr><td>Horizontal resolution:</td><td>' . Entity::hsc(_skinfiles_exif_prepare($exif['XResolution'])) . ' dpi</td></tr>';
1065                                                 
1066                                                 if (isset($exif['YResolution']))
1067                                                         echo '<tr><td>Vertical resolution:</td><td>' . Entity::hsc(_skinfiles_exif_prepare($exif['YResolution'])) . ' dpi</td></tr>';
1068                                                 
1069                                                 if (isset($exif['FocalLength']))
1070                                                         echo '<tr><td>Focal length:</td><td>' . Entity::hsc(_skinfiles_exif_prepare($exif['FocalLength'])) . ' mm</td></tr>';
1071                                                 
1072                                                 if (isset($exif['FNumber']))
1073                                                         echo '<tr><td>F-number:</td><td>F/' . Entity::hsc(_skinfiles_exif_prepare($exif['FNumber'])) . '</td></tr>';
1074                                                 
1075                                                 if (isset($exif['ExposureTime']))
1076                                                         echo '<tr><td>Exposuretime:</td><td>' . Entity::hsc(_skinfiles_exif_prepare($exif['ExposureTime'])) . ' sec</td></tr>';
1077                                                 
1078                                                 if (isset($exif['ISOSpeedRatings']))
1079                                                         echo '<tr><td>ISO-speed:</td><td>' . Entity::hsc(_skinfiles_exif_prepare($exif['ISOSpeedRatings'])) . '</td></tr>';
1080                                         }
1081                                 }
1082
1083                                 echo '</table>';
1084                         }
1085                 }
1086                 else
1087                 {
1088                         echo "<p class='error'>" . _SKINFILES_ERR_VIEW_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_VIEW_FILE2;
1089                         echo _SKINFILES_ERR_VIEW_FILE3 . "</p>";
1090                 }
1091         }
1092
1093         function _skinfiles_exif_prepare($value) {
1094                 if (preg_match('#([0-9]+)/([0-9]+)#', $value, $matches))
1095                         if ($matches[1] < $matches[2])
1096                                 return '1/' . round($matches[2] / $matches[1]);
1097                         else
1098                                 return round($matches[1] / $matches[2]);
1099                 else
1100                         return $value;
1101         }
1102
1103
1104
1105
1106         /* Edit file *********************************************************************************************************************/
1107
1108         function _skinfiles_editfile() {
1109
1110                 global $pluginUrl, $manager;
1111                 
1112                 $file      = basename(trim(requestVar('file')));
1113                 $directory = dirname(trim(requestVar('file')));
1114                 $directory = sfExpandDirectory ($directory);
1115                 
1116                 if (sfValidPath($directory) && file_exists($directory . $file) && 
1117                         is_file($directory . $file) && is_writable($directory . $file) && sfAllowEditing($file)) 
1118                 {
1119                         $relative = sfRelativePath ($directory);
1120                         $editUrl  = $manager->addTicketToUrl($pluginUrl . '?action=editfile&file=' . rawurlencode(sfRelativePath($directory . $file)));
1121
1122                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
1123                         echo '<a href="' . Entity::hsc($editUrl) . '" title="Edit &laquo;' . $file . '&raquo;">';
1124                         echo '<img src="' . Entity::hsc(sfIcon($file)) . '" alt="" /> ' . $file . '</a></p>';
1125
1126                         $content = implode('', file($directory . $file));
1127
1128                         echo '<div class="dialogbox">';
1129                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
1130                         $manager->addTicketHidden();
1131                         echo '<input type="hidden" name="action" value="editfile_process" />';
1132                         echo '<input type="hidden" name="file" value="' . Entity::hsc(sfRelativePath($directory . $file)) . '" />';
1133
1134                         echo '<h4>' . _SKINFILES_EDIT_FILE_MSG . ' &laquo;' . Entity::hsc($file) . '&raquo;</h4><div>';
1135                         echo '<p><textarea class="skinedit" tabindex="8" rows="20" cols="80" name="content">';
1136                         echo Entity::hsc($content);
1137                         echo '</textarea></p>';
1138                         
1139                         echo '<p class="buttons">';
1140                         echo '<input type="hidden" name="sure" value="yes" /">';
1141                         echo '<input type="submit" value="' .  _SKINFILES_SAVE_CHANGES . '" />';
1142                         echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
1143                         echo '</p>';
1144                         echo '</div></form></div>';
1145                 }
1146                 else
1147                 {
1148                         echo "<p class='error'>" . _SKINFILES_ERR_EDIT_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_EDIT_FILE2;
1149                         echo _SKINFILES_ERR_EDIT_FILE3 . "</p>";
1150                 }
1151         }
1152
1153         function _skinfiles_editfile_process() {
1154
1155                 $file      = basename(trim(requestVar('file')));
1156                 $directory = dirname(trim(requestVar('file')));
1157                 $directory = sfExpandDirectory ($directory);
1158                 
1159                 if (requestVar('sure') == 'yes')
1160                 {
1161                         if (sfValidPath($directory) && file_exists($directory . $file) && 
1162                                 is_file($directory . $file) && is_writable($directory . $file) && sfAllowEditing($file)) 
1163                         {
1164                                 $content = postVar('content');
1165                                 $success = false;
1166                                 
1167                                 if ($fh = @fopen($directory . $file, 'wb')) { 
1168                                         
1169                                         if (@fwrite($fh, $content) !== false)
1170                                                 $success = true;
1171                                                 
1172                                         @fclose($fh);
1173                                 }
1174                                 
1175                                 if ($success)
1176                                         echo "<p class='message'>" . _SKINFILES_ERR_EDIT_FILE4 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_EDIT_FILE5 . "</p>";
1177                                 else
1178                                         echo "<p class='error'>" . _SKINFILES_ERR_EDIT_FILE6 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_EDIT_FILE7 . "</p>";
1179                         
1180                                 _skinfiles_editfile();
1181                         }
1182                         else
1183                         {
1184                                 echo "<p class='error'>" . _SKINFILES_ERR_EDIT_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_EDIT_FILE2;
1185                                 echo _SKINFILES_ERR_EDIT_FILE3 . "</p>";
1186                         }
1187                 }
1188                 else
1189                 {
1190                         // User cancelled
1191                         sfShowDirectory($directory);
1192                 }
1193         }
1194
1195
1196
1197         /* Rename file *******************************************************************************************************************/
1198
1199         function _skinfiles_renfile($preset = '') {
1200
1201                 global $pluginUrl, $manager;
1202                 
1203                 $file      = basename(trim(requestVar('file')));
1204                 $directory = dirname(trim(requestVar('file')));
1205                 $directory = sfExpandDirectory ($directory);
1206                 
1207                 if (sfValidPath($directory) && file_exists($directory . $file) && 
1208                         is_file($directory . $file) && is_writable($directory . $file)) 
1209                 {
1210                         $relative = sfRelativePath ($directory);
1211                         $editUrl  = $manager->addTicketToUrl($pluginUrl . '?action=renfile&file=' . rawurlencode(sfRelativePath($directory . $file)));
1212
1213                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
1214                         echo '<a href="' . Entity::hsc($editUrl) . '" title="' . _SKINFILES_RENAME . ' &laquo;' . $file . '&raquo;">';
1215                         echo '<img src="' . Entity::hsc(sfIcon($file)) . '" alt="" /> ' . $file . '</a></p>';
1216
1217                         echo '<div class="dialogbox">';
1218                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
1219                         $manager->addTicketHidden();
1220                         echo '<input type="hidden" name="action" value="renfile_process" />';
1221                         echo '<input type="hidden" name="file" value="' . Entity::hsc(sfRelativePath($directory . $file)) . '" />';
1222
1223                         echo '<h4>' . _SKINFILES_RENAME_FILE_MSG . '&laquo;' . Entity::hsc($file) . '&raquo; ' . _SKINFILES_RENAME_FILE_MSG2 . '</h4><div>';
1224                         echo '<p><input type="text" name="name" size="40" value="' . Entity::hsc($preset != '' ? $preset : $file) . '" /></p>';
1225                         echo '<p class="buttons">';
1226                         echo '<input type="hidden" name="sure" value="yes" /">';
1227                         echo '<input type="submit" value="' . _SKINFILES_RENAME . '" />';
1228                         echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
1229                         echo '</p>';
1230                         echo '</div></form></div>';
1231                 }
1232                 else
1233                 {
1234                         echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_RENAME_FILE2;
1235                         echo _SKINFILES_ERR_RENAME_FILE3 . "</p>";
1236                 }
1237         }
1238         
1239         function _skinfiles_renfile_process() {
1240
1241                 global $pluginUrl, $manager;
1242                 
1243                 $file      = basename(trim(requestVar('file')));
1244                 $directory = dirname(trim(requestVar('file')));
1245                 $directory = sfExpandDirectory ($directory);
1246                 
1247                 if (requestVar('sure') == 'yes')
1248                 {
1249                         if (sfValidPath($directory) && file_exists($directory . $file) && 
1250                                 is_file($directory . $file) && is_writable($directory . $file)) 
1251                         {
1252                                 $name = requestVar('name');
1253
1254                                 if ($name == '') {
1255                                         echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE4 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
1256                                         echo _SKINFILES_ERR_RENAME_FILE5 . "</p>";
1257                                         _skinfiles_renfile($name);
1258                                         return;
1259                                 }
1260                                 
1261                                 if (sfIllegalFilename($name)) {
1262                                         echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE6 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
1263                                         echo _SKINFILES_ERR_RENAME_FILE7 . "</p>";
1264                                         _skinfiles_renfile($name);
1265                                         return;
1266                                 } 
1267                                 
1268                                 if ($name == $file) {
1269                                         echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE8 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
1270                                         echo _SKINFILES_ERR_RENAME_FILE9 . "</p>";
1271                                         _skinfiles_renfile($name);
1272                                         return;
1273                                 }
1274                                 
1275                                 if (file_exists($directory . $name)) {
1276                                         echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE10 . "&laquo;" . Entity::hsc($file) . "&raquo; ";
1277                                         echo _SKINFILES_ERR_RENAME_FILE11;
1278                                         echo _SKINFILES_ERR_RENAME_FILE12 . "</p>";
1279                                         _skinfiles_renfile($name);
1280                                         return;
1281                                 }
1282
1283                                 if (!@rename($directory . $file, $directory . $name)) 
1284                                 {
1285                                         echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE13 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_RENAME_FILE14 . "</p>";
1286                                         _skinfiles_renfile($name);
1287                                         return;
1288                                 }
1289         
1290                                 echo "<p class='message'>" . _SKINFILES_ERR_RENAME_FILE15 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_RENAME_FILE16;
1291                                 echo _SKINFILES_ERR_RENAME_FILE17 . "&laquo;" . Entity::hsc($name) . "&raquo;" . _SKINFILES_ERR_RENAME_FILE18 . "</p>";
1292                                 sfShowDirectory($directory);
1293                         }               
1294                         else
1295                         {
1296                                 echo "<p class='error'>" . _SKINFILES_ERR_RENAME_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_RENAME_FILE2;
1297                                 echo _SKINFILES_ERR_RENAME_FILE3 . "</p>";
1298                         }
1299                 }
1300                 else
1301                 {
1302                         // User cancelled
1303                         sfShowDirectory($directory);
1304                 }
1305         }
1306
1307
1308
1309
1310         /* Create file *******************************************************************************************************************/
1311
1312         function _skinfiles_createfile() {
1313         
1314                 $directory = trim(requestVar('dir'));
1315                 $directory = sfExpandDirectory($directory);
1316
1317                 if (sfValidPath($directory) && is_dir($directory) && is_writable($directory)) 
1318                 {
1319                         $name = requestVar('name');
1320                         
1321                         if ($name == '') {
1322                                 echo "<p class='error'>" . _SKINFILES_ERR_CREATE_FILE1 . "</p>";
1323                                 sfShowDirectory($directory);
1324                                 return;
1325                         }
1326                         
1327                         if (sfIllegalFilename($name)) {
1328                                 echo "<p class='error'>" . _SKINFILES_ERR_CREATE_FILE2 . "&laquo;" . Entity::hsc($name) . "&raquo; ";
1329                                 echo _SKINFILES_ERR_CREATE_FILE3 . "</p>";
1330                                 sfShowDirectory($directory);
1331                                 return;
1332                         } 
1333                         
1334                         if (file_exists($directory . $name)) {
1335                                 echo "<p class='error'>" . _SKINFILES_ERR_CREATE_FILE4 . "&laquo;" . Entity::hsc($name) . "&raquo; ";
1336                                 echo _SKINFILES_ERR_CREATE_FILE5;
1337                                 echo _SKINFILES_ERR_CREATE_FILE6 . "</p>";
1338                                 sfShowDirectory($directory);
1339                                 return;
1340                         }
1341                         
1342                         if (!@touch($directory . $name)) 
1343                         {
1344                                 echo "<p class='error'>" . _SKINFILES_ERR_CREATE_FILE7 . "&laquo;" . Entity::hsc($name) . "&raquo; " . _SKINFILES_ERR_CREATE_FILE8 . "</p>";
1345                                 sfShowDirectory($directory);
1346                                 return;
1347                         }
1348
1349                         $mask = @umask(0000);
1350                         @chmod($directory . $name, 0755);
1351                         @umask($mask);
1352                         
1353                         echo "<p class='message'>" . _SKINFILES_ERR_CREATE_FILE9 . "&laquo;" . Entity::hsc($name) . "&raquo; " . _SKINFILES_ERR_CREATE_FILE10 . "</p>";
1354                         sfShowDirectory($directory);
1355                 }               
1356                 else
1357                 {
1358                         echo "<p class='error'>" . _SKINFILES_ERR_CREATE_FILE11 . "&laquo;" . Entity::hsc(basename($directory)) . "&raquo; " . _SKINFILES_ERR_CREATE_FILE12;
1359                         echo _SKINFILES_ERR_CREATE_FILE13 . "</p>";
1360                 }
1361         }
1362
1363
1364
1365
1366         /* Delete file *******************************************************************************************************************/
1367
1368         function _skinfiles_delfile() {
1369
1370                 global $pluginUrl, $manager;
1371                 
1372                 $file      = basename(trim(requestVar('file')));
1373                 $directory = dirname(trim(requestVar('file')));
1374                 $directory = sfExpandDirectory ($directory);
1375                 
1376                 if (sfValidPath($directory) && file_exists($directory . $file) && 
1377                         is_file($directory . $file) && is_writable($directory . $file)) 
1378                 {
1379                         $relative = sfRelativePath ($directory);
1380                         $delUrl  = $manager->addTicketToUrl($pluginUrl . '?action=delfile&file=' . rawurlencode(sfRelativePath($directory . $file)));
1381
1382                         echo '<p class="location">' . _SKINFILES_CURRENT_LOCATION . sfDisplayPath($relative);
1383                         echo '<a href="' . Entity::hsc($delUrl) . '" title="' . _SKINFILES_DELETE . ' &laquo;' . $file . '&raquo;">';
1384                         echo '<img src="' . Entity::hsc(sfIcon($file)) . '" alt="" /> ' . $file . '</a></p>';
1385
1386                         echo '<div class="dialogbox">';
1387                         echo '<form method="post" action="' . Entity::hsc($pluginUrl) . '">';
1388                         $manager->addTicketHidden();
1389                         echo '<input type="hidden" name="action" value="delfile_process" />';
1390                         echo '<input type="hidden" name="file" value="' . Entity::hsc(sfRelativePath($directory . $file)) . '" />';
1391
1392                         echo '<h4>' . _SKINFILES_DELETE_FILE . ' &laquo;' . Entity::hsc($file) . '&raquo; ' . _SKINFILES_DELETE_FILE2 . '</h4><div>';
1393                         echo '<p class="buttons">';
1394                         echo '<input type="hidden" name="sure" value="yes" />';
1395                         echo '<input type="submit" value="' . _SKINFILES_DELETE . '" />';
1396                         echo '<input type="button" name="sure" value="' . _SKINFILES_CANCEL . '" onclick="history.back();" />';
1397                         echo '</p>';
1398                         echo '</div></form></div>';
1399                 }
1400                 else
1401                 {
1402                         echo "<p class='error'>"  . _SKINFILES_ERR_DELETE_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_FILE2;
1403                         echo _SKINFILES_ERR_DELETE_FILE3 . "</p>";
1404                 }
1405         }
1406
1407         function _skinfiles_delfile_process() {
1408
1409                 global $pluginUrl, $manager;
1410                 
1411                 $file      = basename(trim(requestVar('file')));
1412                 $directory = dirname(trim(requestVar('file')));
1413                 $directory = sfExpandDirectory ($directory);
1414                 
1415                 if (requestVar('sure') == 'yes')
1416                 {
1417                         if (sfValidPath($directory) && file_exists($directory . $file) && 
1418                                 is_file($directory . $file) && is_writable($directory . $file)) 
1419                         {
1420                                 if (!@unlink($directory . $file)) 
1421                                 {
1422                                         echo "<p class='error'>" . _SKINFILES_ERR_DELETE_FILE4 . "&laquo;" . Entity::hsc($file) . "&raquo;</p>";
1423                                         sfShowDirectory($directory);
1424                                         return;
1425                                 }
1426         
1427                                 echo "<p class='message'>" . _SKINFILES_ERR_DELETE_FILE5 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_FILE6 . "</p>";
1428                                 sfShowDirectory($directory);
1429                         }               
1430                         else
1431                         {
1432                                 echo "<p class='error'>" . _SKINFILES_ERR_DELETE_FILE1 . "&laquo;" . Entity::hsc($file) . "&raquo; " . _SKINFILES_ERR_DELETE_FILE2;
1433                                 echo _SKINFILES_ERR_DELETE_FILE3 . "</p>";
1434                         }
1435                 }
1436                 else
1437                 {
1438                         // User cancelled
1439                         sfShowDirectory($directory);
1440                 }
1441         }
1442
1443
1444
1445         /* Upload file *******************************************************************************************************************/
1446
1447         function _skinfiles_uploadfile() {
1448
1449                 global $pluginUrl, $manager, $CONF;
1450                 
1451                 $directory = trim(requestVar('dir'));
1452                 $directory = sfExpandDirectory($directory);
1453
1454                 if (sfValidPath($directory) && is_dir($directory) && is_writable($directory)) 
1455                 {
1456                         $file = postFileInfo('name');
1457
1458                         if ($file['size'] > $CONF['MaxUploadSize']) {
1459                                 echo "<p class='error'>" . _SKINFILES_ERR_UPLOAD_FILE1 . "&laquo;" . Entity::hsc($file['name']) . "&raquo; " . _SKINFILES_ERR_UPLOAD_FILE2 . _ERROR_FILE_TOO_BIG . "<br />";
1460                                 echo _SKINFILES_ERR_UPLOAD_FILE3 . $CONF['MaxUploadSize'] . " / ";
1461                                 echo $file['size'] . " bytes</p>";
1462                                 sfShowDirectory($directory);
1463                                 return;
1464                         }
1465
1466                         if (!is_uploaded_file($file['tmp_name'])) {
1467                                 echo "<p class='error'>" . _SKINFILES_ERR_UPLOAD_FILE1 . "&laquo;" . Entity::hsc($file['name']) . "&raquo; " . _SKINFILES_ERR_UPLOAD_FILE2 . _ERROR_BADREQUEST .  _SKINFILES_ERR_UPLOAD_FILE4 . "</p>";
1468                                 sfShowDirectory($directory);
1469                                 return;
1470                         }
1471                         
1472                         if (sfIllegalFilename($file['name'])) {
1473                                 echo "<p class='error'>" . _SKINFILES_ERR_UPLOAD_FILE5 . "&laquo;" . Entity::hsc($file['name']) . "&raquo; ";
1474                                 echo _SKINFILES_ERR_UPLOAD_FILE6 . "</p>";
1475                                 sfShowDirectory($directory);
1476                                 return;
1477                         }
1478                         
1479                         if (file_exists($directory . $file['name'])) {
1480                                 echo "<p class='error'>" . _SKINFILES_ERR_UPLOAD_FILE1 . "&laquo;" . Entity::hsc($file['name']) . "&raquo; " . _SKINFILES_ERR_UPLOAD_FILE2 . _ERROR_UPLOADDUPLICATE . "</p>";
1481                                 sfShowDirectory($directory);
1482                                 return;
1483                         }
1484
1485                         if (!@move_uploaded_file($file['tmp_name'], $directory . $file['name'])) {
1486                                 echo "<p class='error'>" . _SKINFILES_ERR_UPLOAD_FILE1 . "&laquo;" . Entity::hsc($file['name']) . "&raquo; " . _SKINFILES_ERR_UPLOAD_FILE2 . _ERROR_UPLOADMOVEP . _SKINFILES_ERR_UPLOAD_FILE4 . "</p>";
1487                                 sfShowDirectory($directory);
1488                         }
1489
1490                         $mask = @umask(0000);
1491                         @chmod($directory . $file['name'], 0755);
1492                         @umask($mask);
1493
1494                         echo "<p class='message'>" . _SKINFILES_ERR_UPLOAD_FILE7 . "&laquo;" . Entity::hsc($file['name']) . "&raquo; " . _SKINFILES_ERR_UPLOAD_FILE8 . "</p>";
1495                         sfShowDirectory($directory);
1496                 }
1497                 else
1498                 {
1499                         echo "<p class='error'>" . _SKINFILES_ERR_UPLOAD_FILE9 . "&laquo;" . Entity::hsc(basename($directory)) . "&raquo; " . _SKINFILES_ERR_UPLOAD_FILE10;
1500                         echo _SKINFILES_ERR_UPLOAD_FILE11 . "</p>";
1501                 }       
1502         }
1503
1504
1505
1506
1507         
1508 ?>