From 37487930f486ad6a8c48e1668c3d13f8b8a11b00 Mon Sep 17 00:00:00 2001 From: Nemcio Date: Sat, 28 Sep 2019 04:55:48 +0200 Subject: [PATCH] Wersja oryginalna. --- .htpasswd.autoindex | 2 + change_log.html | 161 +++ classes/Accounts.php | 233 +++++ classes/Admin.php | 990 ++++++++++++++++++ classes/ConfigData.php | 233 +++++ classes/DirItem.php | 167 +++ classes/DirectoryList.php | 256 +++++ classes/DirectoryListDetailed.php | 237 +++++ classes/Display.php | 90 ++ classes/ExceptionDisplay.php | 64 ++ classes/FileItem.php | 118 +++ classes/Ftp.php | 155 +++ classes/Htaccess.php | 508 +++++++++ classes/Icon.php | 148 +++ classes/Image.php | 133 +++ classes/Item.php | 218 ++++ classes/Language.php | 164 +++ classes/Logging.php | 132 +++ classes/MimeType.php | 200 ++++ classes/Search.php | 189 ++++ classes/Size.php | 112 ++ classes/Stats.php | 498 +++++++++ classes/Tar.php | 128 +++ classes/Template.php | 146 +++ classes/TemplateFiles.php | 244 +++++ classes/TemplateInfo.php | 205 ++++ classes/Upload.php | 153 +++ classes/Url.php | 232 ++++ classes/User.php | 152 +++ classes/UserLoggedIn.php | 114 ++ config.php | 539 ++++++++++ hidden_files | 7 + index.php | 643 ++++++++++++ index_icons/apache/back.png | Bin 0 -> 236 bytes index_icons/apache/binary.png | Bin 0 -> 230 bytes index_icons/apache/binhex.png | Bin 0 -> 238 bytes index_icons/apache/cd.png | Bin 0 -> 752 bytes index_icons/apache/comp.png | Bin 0 -> 244 bytes index_icons/apache/compressed.png | Bin 0 -> 239 bytes index_icons/apache/dir.png | Bin 0 -> 222 bytes index_icons/apache/dll.png | Bin 0 -> 230 bytes index_icons/apache/doc.png | Bin 0 -> 268 bytes index_icons/apache/generic.png | Bin 0 -> 203 bytes index_icons/apache/image.png | Bin 0 -> 233 bytes index_icons/apache/java.png | Bin 0 -> 1166 bytes index_icons/apache/js.png | Bin 0 -> 253 bytes index_icons/apache/key.png | Bin 0 -> 258 bytes index_icons/apache/login.png | Bin 0 -> 262 bytes index_icons/apache/mov.png | Bin 0 -> 218 bytes index_icons/apache/movie.png | Bin 0 -> 218 bytes index_icons/apache/new.png | Bin 0 -> 616 bytes index_icons/apache/pdf.png | Bin 0 -> 778 bytes index_icons/apache/php.png | Bin 0 -> 730 bytes index_icons/apache/ppt.png | Bin 0 -> 268 bytes index_icons/apache/ps.png | Bin 0 -> 263 bytes index_icons/apache/search.png | Bin 0 -> 570 bytes index_icons/apache/sound.png | Bin 0 -> 222 bytes index_icons/apache/tar.png | Bin 0 -> 229 bytes index_icons/apache/text.png | Bin 0 -> 222 bytes index_icons/apache/unknown.png | Bin 0 -> 230 bytes index_icons/apache/uu.png | Bin 0 -> 219 bytes index_icons/apache/web.png | Bin 0 -> 253 bytes index_icons/apache/xls.png | Bin 0 -> 268 bytes index_icons/kde/back.png | Bin 0 -> 656 bytes index_icons/kde/binary.png | Bin 0 -> 745 bytes index_icons/kde/binhex.png | Bin 0 -> 745 bytes index_icons/kde/cd.png | Bin 0 -> 546 bytes index_icons/kde/comp.png | Bin 0 -> 490 bytes index_icons/kde/compressed.png | Bin 0 -> 620 bytes index_icons/kde/dir.png | Bin 0 -> 620 bytes index_icons/kde/dll.png | Bin 0 -> 745 bytes index_icons/kde/doc.png | Bin 0 -> 571 bytes index_icons/kde/generic.png | Bin 0 -> 382 bytes index_icons/kde/image.png | Bin 0 -> 715 bytes index_icons/kde/java.png | Bin 0 -> 656 bytes index_icons/kde/js.png | Bin 0 -> 432 bytes index_icons/kde/key.png | Bin 0 -> 432 bytes index_icons/kde/login.png | Bin 0 -> 262 bytes index_icons/kde/mov.png | Bin 0 -> 374 bytes index_icons/kde/movie.png | Bin 0 -> 374 bytes index_icons/kde/new.png | Bin 0 -> 616 bytes index_icons/kde/pdf.png | Bin 0 -> 532 bytes index_icons/kde/php.png | Bin 0 -> 730 bytes index_icons/kde/ppt.png | Bin 0 -> 432 bytes index_icons/kde/ps.png | Bin 0 -> 571 bytes index_icons/kde/search.png | Bin 0 -> 570 bytes index_icons/kde/sound.png | Bin 0 -> 697 bytes index_icons/kde/tar.png | Bin 0 -> 724 bytes index_icons/kde/text.png | Bin 0 -> 571 bytes index_icons/kde/unknown.png | Bin 0 -> 382 bytes index_icons/kde/uu.png | Bin 0 -> 620 bytes index_icons/kde/web.png | Bin 0 -> 748 bytes index_icons/kde/xls.png | Bin 0 -> 655 bytes index_icons/osx/back.png | Bin 0 -> 198 bytes index_icons/osx/binary.png | Bin 0 -> 234 bytes index_icons/osx/binhex.png | Bin 0 -> 234 bytes index_icons/osx/cd.png | Bin 0 -> 382 bytes index_icons/osx/comp.png | Bin 0 -> 338 bytes index_icons/osx/compressed.png | Bin 0 -> 400 bytes index_icons/osx/dir.png | Bin 0 -> 717 bytes index_icons/osx/dll.png | Bin 0 -> 400 bytes index_icons/osx/doc.png | Bin 0 -> 519 bytes index_icons/osx/generic.png | Bin 0 -> 609 bytes index_icons/osx/image.png | Bin 0 -> 560 bytes index_icons/osx/java.png | Bin 0 -> 332 bytes index_icons/osx/js.png | Bin 0 -> 427 bytes index_icons/osx/key.png | Bin 0 -> 338 bytes index_icons/osx/login.png | Bin 0 -> 262 bytes index_icons/osx/mov.png | Bin 0 -> 542 bytes index_icons/osx/movie.png | Bin 0 -> 542 bytes index_icons/osx/new.png | Bin 0 -> 616 bytes index_icons/osx/pdf.png | Bin 0 -> 585 bytes index_icons/osx/php.png | Bin 0 -> 730 bytes index_icons/osx/ppt.png | Bin 0 -> 645 bytes index_icons/osx/ps.png | Bin 0 -> 519 bytes index_icons/osx/search.png | Bin 0 -> 570 bytes index_icons/osx/sound.png | Bin 0 -> 513 bytes index_icons/osx/tar.png | Bin 0 -> 408 bytes index_icons/osx/text.png | Bin 0 -> 338 bytes index_icons/osx/unknown.png | Bin 0 -> 609 bytes index_icons/osx/uu.png | Bin 0 -> 400 bytes index_icons/osx/web.png | Bin 0 -> 424 bytes index_icons/osx/xls.png | Bin 0 -> 416 bytes index_icons/winvista/back.png | Bin 0 -> 3364 bytes index_icons/winvista/binary.png | Bin 0 -> 3119 bytes index_icons/winvista/binhex.png | Bin 0 -> 3523 bytes index_icons/winvista/cd.png | Bin 0 -> 3385 bytes index_icons/winvista/comp.png | Bin 0 -> 3413 bytes index_icons/winvista/compressed.png | Bin 0 -> 3328 bytes index_icons/winvista/dir.png | Bin 0 -> 3286 bytes index_icons/winvista/dll.png | Bin 0 -> 3375 bytes index_icons/winvista/doc.png | Bin 0 -> 3513 bytes index_icons/winvista/generic.png | Bin 0 -> 3124 bytes index_icons/winvista/image.png | Bin 0 -> 3280 bytes index_icons/winvista/java.png | Bin 0 -> 3300 bytes index_icons/winvista/js.png | Bin 0 -> 3455 bytes index_icons/winvista/key.png | Bin 0 -> 3244 bytes index_icons/winvista/login.png | Bin 0 -> 3246 bytes index_icons/winvista/mov.png | Bin 0 -> 3424 bytes index_icons/winvista/movie.png | Bin 0 -> 3321 bytes index_icons/winvista/new.png | Bin 0 -> 3126 bytes index_icons/winvista/pdf.png | Bin 0 -> 3297 bytes index_icons/winvista/php.png | Bin 0 -> 3343 bytes index_icons/winvista/ppt.png | Bin 0 -> 3571 bytes index_icons/winvista/ps.png | Bin 0 -> 3411 bytes index_icons/winvista/search.png | Bin 0 -> 3292 bytes index_icons/winvista/sound.png | Bin 0 -> 3286 bytes index_icons/winvista/tar.png | Bin 0 -> 3315 bytes index_icons/winvista/text.png | Bin 0 -> 3194 bytes index_icons/winvista/unknown.png | Bin 0 -> 3124 bytes index_icons/winvista/uu.png | Bin 0 -> 3315 bytes index_icons/winvista/web.png | Bin 0 -> 3539 bytes index_icons/winvista/xls.png | Bin 0 -> 3568 bytes index_icons/winxp/back.png | Bin 0 -> 3329 bytes index_icons/winxp/binary.png | Bin 0 -> 3152 bytes index_icons/winxp/binhex.png | Bin 0 -> 3523 bytes index_icons/winxp/cd.png | Bin 0 -> 3522 bytes index_icons/winxp/comp.png | Bin 0 -> 3601 bytes index_icons/winxp/compressed.png | Bin 0 -> 632 bytes index_icons/winxp/dir.png | Bin 0 -> 3151 bytes index_icons/winxp/dll.png | Bin 0 -> 3405 bytes index_icons/winxp/doc.png | Bin 0 -> 3409 bytes index_icons/winxp/generic.png | Bin 0 -> 3224 bytes index_icons/winxp/image.png | Bin 0 -> 3391 bytes index_icons/winxp/java.png | Bin 0 -> 3355 bytes index_icons/winxp/js.png | Bin 0 -> 3323 bytes index_icons/winxp/key.png | Bin 0 -> 3433 bytes index_icons/winxp/login.png | Bin 0 -> 3318 bytes index_icons/winxp/mov.png | Bin 0 -> 3424 bytes index_icons/winxp/movie.png | Bin 0 -> 3603 bytes index_icons/winxp/new.png | Bin 0 -> 3179 bytes index_icons/winxp/pdf.png | Bin 0 -> 3297 bytes index_icons/winxp/php.png | Bin 0 -> 3425 bytes index_icons/winxp/ppt.png | Bin 0 -> 3479 bytes index_icons/winxp/ps.png | Bin 0 -> 3411 bytes index_icons/winxp/search.png | Bin 0 -> 3382 bytes index_icons/winxp/sound.png | Bin 0 -> 3302 bytes index_icons/winxp/tar.png | Bin 0 -> 3335 bytes index_icons/winxp/text.png | Bin 0 -> 3243 bytes index_icons/winxp/unknown.png | Bin 0 -> 3224 bytes index_icons/winxp/uu.png | Bin 0 -> 3335 bytes index_icons/winxp/web.png | Bin 0 -> 3437 bytes index_icons/winxp/xls.png | Bin 0 -> 3445 bytes languages/al.txt | 91 ++ languages/ar.txt | 91 ++ languages/bg.txt | 91 ++ languages/ca.txt | 91 ++ languages/cz.txt | 91 ++ languages/da.txt | 92 ++ languages/de.txt | 92 ++ languages/el.txt | 91 ++ languages/en.txt | 91 ++ languages/es.txt | 91 ++ languages/fr.txt | 91 ++ languages/hu.txt | 92 ++ languages/it.txt | 91 ++ languages/ja.txt | 92 ++ languages/ko.txt | 91 ++ languages/ms.txt | 91 ++ languages/nl.txt | 91 ++ languages/no.txt | 91 ++ languages/pl.txt | 91 ++ languages/pt_BR.txt | 92 ++ languages/ru.txt | 91 ++ languages/sk.txt | 91 ++ languages/sv.txt | 91 ++ languages/th.txt | 91 ++ languages/tr.txt | 91 ++ license.html | 418 ++++++++ readme.html | 75 ++ templates/default/alternate.css | 134 +++ templates/default/default.css | 127 +++ ...h_file (alternative with direct links).tpl | 30 + templates/default/each_file.tpl | 25 + templates/default/global_footer.tpl | 14 + templates/default/global_header.tpl | 10 + templates/default/table_footer.tpl | 68 ++ templates/default/table_header.tpl | 23 + templates/readme.html | 184 ++++ templates/simple_image_gallery/default.css | 128 +++ templates/simple_image_gallery/each_file.tpl | 7 + .../simple_image_gallery/global_footer.tpl | 14 + .../simple_image_gallery/global_header.tpl | 9 + .../simple_image_gallery/table_footer.tpl | 44 + .../simple_image_gallery/table_header.tpl | 1 + 225 files changed, 11162 insertions(+) create mode 100755 .htpasswd.autoindex create mode 100755 change_log.html create mode 100755 classes/Accounts.php create mode 100755 classes/Admin.php create mode 100755 classes/ConfigData.php create mode 100755 classes/DirItem.php create mode 100755 classes/DirectoryList.php create mode 100755 classes/DirectoryListDetailed.php create mode 100755 classes/Display.php create mode 100755 classes/ExceptionDisplay.php create mode 100755 classes/FileItem.php create mode 100755 classes/Ftp.php create mode 100755 classes/Htaccess.php create mode 100755 classes/Icon.php create mode 100755 classes/Image.php create mode 100755 classes/Item.php create mode 100755 classes/Language.php create mode 100755 classes/Logging.php create mode 100755 classes/MimeType.php create mode 100755 classes/Search.php create mode 100755 classes/Size.php create mode 100755 classes/Stats.php create mode 100755 classes/Tar.php create mode 100755 classes/Template.php create mode 100755 classes/TemplateFiles.php create mode 100755 classes/TemplateInfo.php create mode 100755 classes/Upload.php create mode 100755 classes/Url.php create mode 100755 classes/User.php create mode 100755 classes/UserLoggedIn.php create mode 100755 config.php create mode 100755 hidden_files create mode 100755 index.php create mode 100755 index_icons/apache/back.png create mode 100755 index_icons/apache/binary.png create mode 100755 index_icons/apache/binhex.png create mode 100755 index_icons/apache/cd.png create mode 100755 index_icons/apache/comp.png create mode 100755 index_icons/apache/compressed.png create mode 100755 index_icons/apache/dir.png create mode 100755 index_icons/apache/dll.png create mode 100755 index_icons/apache/doc.png create mode 100755 index_icons/apache/generic.png create mode 100755 index_icons/apache/image.png create mode 100755 index_icons/apache/java.png create mode 100755 index_icons/apache/js.png create mode 100755 index_icons/apache/key.png create mode 100755 index_icons/apache/login.png create mode 100755 index_icons/apache/mov.png create mode 100755 index_icons/apache/movie.png create mode 100755 index_icons/apache/new.png create mode 100755 index_icons/apache/pdf.png create mode 100755 index_icons/apache/php.png create mode 100755 index_icons/apache/ppt.png create mode 100755 index_icons/apache/ps.png create mode 100755 index_icons/apache/search.png create mode 100755 index_icons/apache/sound.png create mode 100755 index_icons/apache/tar.png create mode 100755 index_icons/apache/text.png create mode 100755 index_icons/apache/unknown.png create mode 100755 index_icons/apache/uu.png create mode 100755 index_icons/apache/web.png create mode 100755 index_icons/apache/xls.png create mode 100755 index_icons/kde/back.png create mode 100755 index_icons/kde/binary.png create mode 100755 index_icons/kde/binhex.png create mode 100755 index_icons/kde/cd.png create mode 100755 index_icons/kde/comp.png create mode 100755 index_icons/kde/compressed.png create mode 100755 index_icons/kde/dir.png create mode 100755 index_icons/kde/dll.png create mode 100755 index_icons/kde/doc.png create mode 100755 index_icons/kde/generic.png create mode 100755 index_icons/kde/image.png create mode 100755 index_icons/kde/java.png create mode 100755 index_icons/kde/js.png create mode 100755 index_icons/kde/key.png create mode 100755 index_icons/kde/login.png create mode 100755 index_icons/kde/mov.png create mode 100755 index_icons/kde/movie.png create mode 100755 index_icons/kde/new.png create mode 100755 index_icons/kde/pdf.png create mode 100755 index_icons/kde/php.png create mode 100755 index_icons/kde/ppt.png create mode 100755 index_icons/kde/ps.png create mode 100755 index_icons/kde/search.png create mode 100755 index_icons/kde/sound.png create mode 100755 index_icons/kde/tar.png create mode 100755 index_icons/kde/text.png create mode 100755 index_icons/kde/unknown.png create mode 100755 index_icons/kde/uu.png create mode 100755 index_icons/kde/web.png create mode 100755 index_icons/kde/xls.png create mode 100755 index_icons/osx/back.png create mode 100755 index_icons/osx/binary.png create mode 100755 index_icons/osx/binhex.png create mode 100755 index_icons/osx/cd.png create mode 100755 index_icons/osx/comp.png create mode 100755 index_icons/osx/compressed.png create mode 100755 index_icons/osx/dir.png create mode 100755 index_icons/osx/dll.png create mode 100755 index_icons/osx/doc.png create mode 100755 index_icons/osx/generic.png create mode 100755 index_icons/osx/image.png create mode 100755 index_icons/osx/java.png create mode 100755 index_icons/osx/js.png create mode 100755 index_icons/osx/key.png create mode 100755 index_icons/osx/login.png create mode 100755 index_icons/osx/mov.png create mode 100755 index_icons/osx/movie.png create mode 100755 index_icons/osx/new.png create mode 100755 index_icons/osx/pdf.png create mode 100755 index_icons/osx/php.png create mode 100755 index_icons/osx/ppt.png create mode 100755 index_icons/osx/ps.png create mode 100755 index_icons/osx/search.png create mode 100755 index_icons/osx/sound.png create mode 100755 index_icons/osx/tar.png create mode 100755 index_icons/osx/text.png create mode 100755 index_icons/osx/unknown.png create mode 100755 index_icons/osx/uu.png create mode 100755 index_icons/osx/web.png create mode 100755 index_icons/osx/xls.png create mode 100644 index_icons/winvista/back.png create mode 100644 index_icons/winvista/binary.png create mode 100644 index_icons/winvista/binhex.png create mode 100644 index_icons/winvista/cd.png create mode 100644 index_icons/winvista/comp.png create mode 100644 index_icons/winvista/compressed.png create mode 100644 index_icons/winvista/dir.png create mode 100644 index_icons/winvista/dll.png create mode 100644 index_icons/winvista/doc.png create mode 100644 index_icons/winvista/generic.png create mode 100644 index_icons/winvista/image.png create mode 100644 index_icons/winvista/java.png create mode 100644 index_icons/winvista/js.png create mode 100644 index_icons/winvista/key.png create mode 100644 index_icons/winvista/login.png create mode 100644 index_icons/winvista/mov.png create mode 100644 index_icons/winvista/movie.png create mode 100644 index_icons/winvista/new.png create mode 100644 index_icons/winvista/pdf.png create mode 100644 index_icons/winvista/php.png create mode 100644 index_icons/winvista/ppt.png create mode 100644 index_icons/winvista/ps.png create mode 100644 index_icons/winvista/search.png create mode 100644 index_icons/winvista/sound.png create mode 100644 index_icons/winvista/tar.png create mode 100644 index_icons/winvista/text.png create mode 100644 index_icons/winvista/unknown.png create mode 100644 index_icons/winvista/uu.png create mode 100644 index_icons/winvista/web.png create mode 100644 index_icons/winvista/xls.png create mode 100755 index_icons/winxp/back.png create mode 100755 index_icons/winxp/binary.png create mode 100755 index_icons/winxp/binhex.png create mode 100755 index_icons/winxp/cd.png create mode 100755 index_icons/winxp/comp.png create mode 100755 index_icons/winxp/compressed.png create mode 100755 index_icons/winxp/dir.png create mode 100755 index_icons/winxp/dll.png create mode 100755 index_icons/winxp/doc.png create mode 100755 index_icons/winxp/generic.png create mode 100755 index_icons/winxp/image.png create mode 100755 index_icons/winxp/java.png create mode 100755 index_icons/winxp/js.png create mode 100755 index_icons/winxp/key.png create mode 100755 index_icons/winxp/login.png create mode 100755 index_icons/winxp/mov.png create mode 100755 index_icons/winxp/movie.png create mode 100755 index_icons/winxp/new.png create mode 100755 index_icons/winxp/pdf.png create mode 100755 index_icons/winxp/php.png create mode 100755 index_icons/winxp/ppt.png create mode 100755 index_icons/winxp/ps.png create mode 100755 index_icons/winxp/search.png create mode 100755 index_icons/winxp/sound.png create mode 100755 index_icons/winxp/tar.png create mode 100755 index_icons/winxp/text.png create mode 100755 index_icons/winxp/unknown.png create mode 100755 index_icons/winxp/uu.png create mode 100755 index_icons/winxp/web.png create mode 100755 index_icons/winxp/xls.png create mode 100755 languages/al.txt create mode 100755 languages/ar.txt create mode 100755 languages/bg.txt create mode 100755 languages/ca.txt create mode 100755 languages/cz.txt create mode 100644 languages/da.txt create mode 100755 languages/de.txt create mode 100755 languages/el.txt create mode 100755 languages/en.txt create mode 100755 languages/es.txt create mode 100755 languages/fr.txt create mode 100755 languages/hu.txt create mode 100755 languages/it.txt create mode 100755 languages/ja.txt create mode 100755 languages/ko.txt create mode 100755 languages/ms.txt create mode 100755 languages/nl.txt create mode 100755 languages/no.txt create mode 100755 languages/pl.txt create mode 100755 languages/pt_BR.txt create mode 100755 languages/ru.txt create mode 100755 languages/sk.txt create mode 100755 languages/sv.txt create mode 100755 languages/th.txt create mode 100755 languages/tr.txt create mode 100755 license.html create mode 100755 readme.html create mode 100755 templates/default/alternate.css create mode 100755 templates/default/default.css create mode 100755 templates/default/each_file (alternative with direct links).tpl create mode 100755 templates/default/each_file.tpl create mode 100755 templates/default/global_footer.tpl create mode 100755 templates/default/global_header.tpl create mode 100755 templates/default/table_footer.tpl create mode 100755 templates/default/table_header.tpl create mode 100755 templates/readme.html create mode 100755 templates/simple_image_gallery/default.css create mode 100755 templates/simple_image_gallery/each_file.tpl create mode 100755 templates/simple_image_gallery/global_footer.tpl create mode 100755 templates/simple_image_gallery/global_header.tpl create mode 100755 templates/simple_image_gallery/table_footer.tpl create mode 100755 templates/simple_image_gallery/table_header.tpl diff --git a/.htpasswd.autoindex b/.htpasswd.autoindex new file mode 100755 index 0000000..1c6e293 --- /dev/null +++ b/.htpasswd.autoindex @@ -0,0 +1,2 @@ +admin d033e22ae348aeb5660fc2140aec35850c4da997 3 +user 12dea96fec20593566ab75692c9949596833adc9 1 diff --git a/change_log.html b/change_log.html new file mode 100755 index 0000000..856c46b --- /dev/null +++ b/change_log.html @@ -0,0 +1,161 @@ + + + + + AutoIndex PHP Script: Change Log + + + + + +

+ AutoIndex PHP Script, + by Justin Hagstrom +

+
+ Change Log +
+

+   +

+ +
+

+ Legend: +
(+) Added feature +
(!) Security bug fixed +
(-) Bug fixed +
(*) Improved/changed feature +
( ) Non-code change +

+

+   +

+

+ Version 2.2.4 (2007-Nov-09) +
(!) Fixed DOS bug +
( ) Added Vista icon set +

+

+ Version 2.2.3 (2007-Nov-05) +
(!) Fixed XSS bug +

+

+ Version 2.2.2 (2007-Jul-24) +
(!) Fixed XSS bug in search feature +

+

+ Version 2.2.1 (2007-Jan-06) +
(*) Improved handling of passwords with .htaccess +
(*) Improved default stylesheet +
( ) Added Danish translation +
( ) Updated Dutch translation +

+

+ Version 2.2.0 (2006-Jan-02) +
(+) Added a pagination feature +
(+) Language is selected based on the user's browser's default +
(+) Added support for PHP 5.1.x and higher +
( ) Added Greek and Japanese translations +

+

+ Version 2.1.2 (2005-Aug-11) +
(-) Fixed bug when editing descriptions of filenames that have special characters +
( ) Added Czech and Slovak translations +

+

+ Version 2.1.1 (2005-Jul-06) +
(!) Fixed bug with search box +
( ) Added Swedish translation +

+

+ Version 2.1.0 (2005-Feb-14) +
(+) Added a .htaccess parser +
(+) Added an FTP browser +
(+) Added moderator and banned account levels +
(+) Added a feature to let moderators/admins change their own password +

+

+ Version 2.0.7 (2005-Jan-14) +
(-) Fixed file_description feature +

+

+ Version 2.0.6 (2005-Jan-04) +
(+) Admins are able to copy files from other servers (similar to "wget") +
( ) Added Thai and Arabic translations +

+

+ Version 2.0.5 (2004-Sep-02) +
(+) When force_download is on, the MIME-type sent depends on the file extension +
(*) Using hidden_files to only show certain files no longer restricts directories +

+

+ Version 2.0.4 (2004-Aug-17) +
(*) When reconfiguring the script, the current settings are selected instead of the defaults +
( ) Added Polish translation +

+

+ Version 2.0.3 (2004-Jul-26) +
(*) Nested if-statements can be used in the template files +
(*) Folders do not have to be empty to be deleted +

+

+ Version 2.0.2 (2004-Jul-13) +
(*) All output is XHTML 1.1 compliant +
(*) The do_every template command now does not include the last file listed +

+

+ Version 2.0.1 (2004-Jul-05) +
(+) Added directory cache feature +
(*) Added include command to the template system +
(-) Fixed search page bug when download_count was on +

+

+ Version 2.0.0 (2004-Jun-24) +

+

+ Complete rewrite from version 1.0: +

+ +
+ + + \ No newline at end of file diff --git a/classes/Accounts.php b/classes/Accounts.php new file mode 100755 index 0000000..f2d5575 --- /dev/null +++ b/classes/Accounts.php @@ -0,0 +1,233 @@ + + * @version 1.0.2 (July 21, 2004) + * @package AutoIndex + */ +class Accounts implements Iterator +{ + /** + * @var array The list of valid accounts taken from the stored file + */ + private $userlist; + + /** + * @var int The size of the $userlist array + */ + private $list_count; + + //begin implementation of Iterator + /** + * @var int $i is used to keep track of the current pointer inside the array when implementing Iterator + */ + private $i; + + /** + * @return User The current element in the array + */ + public function current() + { + if ($this -> i < $this -> list_count) + { + return $this -> userlist[$this -> i]; + } + return false; + } + + /** + * Increments the internal array pointer, then returns the user at that + * new position. + * + * @return User The current position of the pointer in the array + */ + public function next() + { + $this -> i++; + return $this -> current(); + } + + /** + * Sets the internal array pointer to 0. + */ + public function rewind() + { + $this -> i = 0; + } + + /** + * @return bool True if $i is a valid array index + */ + public function valid() + { + return ($this -> i < $this -> list_count); + } + + /** + * @return int Returns $i, the key of the array + */ + public function key() + { + return $this -> i; + } + //end implementation of Iterator + + /** + * Reads the user_list file, and fills the $contents array with the + * valid users. + */ + public function __construct() + { + global $config; + $file = @file($config -> __get('user_list')); + if ($file === false) + { + throw new ExceptionDisplay('Cannot open user account file.'); + } + $this -> userlist = array(); + foreach ($file as $line_num => $line) + { + $line = rtrim($line, "\r\n"); + if (ConfigData::line_is_comment($line)) + { + continue; + } + $parts = explode("\t", $line); + if (count($parts) !== 4) + { + throw new ExceptionDisplay('Incorrect format for user accounts file on line ' + . ($line_num + 1)); + } + $this -> userlist[] = new User($parts[0], $parts[1], $parts[2], $parts[3]); + } + $this -> list_count = count($this -> userlist); + $this -> i = 0; + } + + /** + * @param string $name Username to find the level of + * @return int The level of the user + */ + public function get_level($name) + { + foreach ($this as $look) + { + if (strcasecmp($look -> username, $name) !== 0) + { + continue; + } + $lev = (int)$look -> level; + if ($lev < BANNED || $lev > ADMIN) + { + throw new ExceptionDisplay('Invalid level for user ' + . Url::html_output($name) . '.'); + } + return $lev; + } + throw new ExceptionDisplay('User ' . Url::html_output($name) + . ' does not exist.'); + } + + /** + * @param string $name Username to find the home directory for + * @return string The home directory of $name + */ + public function get_home_dir($name) + { + foreach ($this as $look) + { + if (strcasecmp($look -> username, $name) === 0) + { + return $look -> home_dir; + } + } + throw new ExceptionDisplay('User ' . Url::html_output($name) + . ' does not exist.'); + } + + /** + * Returns $name with the character case the same as it is in the accounts + * file. + * + * @param string $name Username to find the stored case of + * @return string + */ + public function get_stored_case($name) + { + foreach ($this as $look) + { + if (strcasecmp($look -> username, $name) === 0) + { + return $look -> username; + } + } + throw new ExceptionDisplay('User ' . Url::html_output($name) + . ' does not exist.'); + } + + /** + * @param User $user The user to determine if it is valid or not + * @return bool True if the username and password are correct + */ + public function is_valid_user(User $user) + { + foreach ($this as $look) + { + if ($look -> equals($user)) + { + return true; + } + } + return false; + } + + /** + * @param string $name Username to find if it exists or not + * @return bool True if a user exists with the username $name + */ + public function user_exists($name) + { + foreach ($this as $look) + { + if (strcasecmp($look -> username, $name) === 0) + { + return true; + } + } + return false; + } +} + +?> \ No newline at end of file diff --git a/classes/Admin.php b/classes/Admin.php new file mode 100755 index 0000000..3098577 --- /dev/null +++ b/classes/Admin.php @@ -0,0 +1,990 @@ + + * @version 1.1.1 (August 10, 2005) + * @package AutoIndex + */ +class Admin +{ + /** + * @var int The level of the logged in user + */ + private $level; + + /** + * @var string The name of the logged in user + */ + private $username; + + /** + * @param string $path The path of the directory to create + * @return bool True on success, false on failure + */ + public static function mkdir_recursive($path) + { + $path = Item::make_sure_slash($path); + if (@is_dir($path)) + { + return true; + } + if (!self::mkdir_recursive(dirname($path))) + { + return false; + } + return @mkdir($path, 0755); + } + + /** + * Deletes a directory and all its contents. + * + * @param string $path The path of the directory to delete + * @return bool True on success, false on failure + */ + private static function rmdir_recursive($path) + { + $path = Item::make_sure_slash($path); + $list = @scandir($path); + if ($list === false) + { + return false; + } + foreach ($list as $file) + { + if ($file == '' || $file == '.' || $file == '..') + { + continue; + } + $dir = "$path$file/"; + @is_dir($dir) ? self::rmdir_recursive($dir) : @unlink($dir); + } + return @rmdir($path); + } + + /** + * Copies a remote file to the local server. + * + * @param string $protocol Either ftp:// or http:// + * @param string $url The rest of the URL after the protocol + */ + private static function copy_remote_file($protocol, $url) + { + if ($protocol == '' || $url == '') + { + throw new ExceptionDisplay('Please go back and enter a file to copy.'); + } + global $dir; + $local_file = $dir . Item::get_basename($url); + if (@file_exists($local_file)) + { + throw new ExceptionDisplay('The file already exists in this directory.'); + } + $remote = $protocol . $url; + $r = @fopen($remote, 'rb'); + if ($r === false) + { + throw new ExceptionDisplay('Cannot open remote file for reading: ' + . Url::html_output($remote) . ''); + } + $l = @fopen($local_file, 'wb'); + if ($l === false) + { + throw new ExceptionDisplay('Cannot open local file for writing.'); + } + while (true) + { + $temp = fread($r, 8192); + if ($temp === '') + { + break; + } + fwrite($l, $temp); + } + fclose($l); + fclose($r); + } + + /** + * @param string $filename The path to the file that stores the info + * @param string $old_name The old name of the file or folder to update inside of $filename + * @param string $new_name The new name of the file or folder + */ + private static function update_file_info($filename, $old_name, $new_name) + { + if (!@is_file($filename)) + { + throw new ExceptionDisplay('The file ' + . Url::html_output($filename) . ' does not exist.'); + } + $text = @file_get_contents($filename); + if ($text === false) + { + throw new ExceptionDisplay('Cannot open file ' + . Url::html_output($filename) . ' for reading.'); + } + $h = @fopen($filename, 'wb'); + if ($h === false) + { + throw new ExceptionDisplay('Cannot open file ' + . Url::html_output($filename) . ' for writing.'); + } + fwrite($h, preg_replace('/^' . preg_quote($old_name, '/') + . '/m', $new_name, $text)); + fclose($h); + } + + /** + * Validates a potential new password. + * + * @param string $pass1 The new password + * @param string $pass2 The new password typed again + */ + private static function validate_new_password($pass1, $pass2) + { + if ($pass1 != $pass2) + { + throw new ExceptionDisplay('Passwords do not match.'); + } + if (strlen($pass1) < 6) + { + throw new ExceptionDisplay('Password must be at least 6 characters long.'); + } + } + + /** + * Changes a user's password. + * + * @param string $username The username + * @param string $old_pass The user's old password + * @param string $new_pass1 The new password + * @param string $new_pass2 The new password typed again + */ + private static function change_password($username, $old_pass, $new_pass1, $new_pass2) + { + self::validate_new_password($new_pass1, $new_pass2); + $accounts = new Accounts(); + if (!$accounts -> user_exists($username)) + { + throw new ExceptionDisplay('Cannot change password: username does not exist.'); + } + if (!$accounts -> is_valid_user(new User($username, sha1($old_pass)))) + { + throw new ExceptionDisplay('Incorrect old password.'); + } + global $config; + $h = @fopen($config -> __get('user_list'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay("Could not open file $user_list for writing." + . ' Make sure PHP has write permission to this file.'); + } + foreach ($accounts as $this_user) + { + if (strcasecmp($this_user -> username, $username) === 0) + { + $this_user = new User($username, sha1($new_pass1), $this_user -> level, $this_user -> home_dir); + } + fwrite($h, $this_user -> __toString()); + } + fclose($h); + $_SESSION['password'] = sha1($new_pass1); + throw new ExceptionDisplay('Password successfully changed.'); + } + + /** + * Changes a user's level. + * + * @param string $username The username + * @param int $new_level The user's new level + */ + private static function change_user_level($username, $new_level) + { + if ($new_level < BANNED || $new_level > ADMIN) + { + throw new ExceptionDisplay('Invalid user level.'); + } + $accounts = new Accounts(); + if (!$accounts -> user_exists($username)) + { + throw new ExceptionDisplay('Cannot change level: username does not exist.'); + } + global $config; + $h = @fopen($config -> __get('user_list'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay("Could not open file $user_list for writing." + . ' Make sure PHP has write permission to this file.'); + } + foreach ($accounts as $this_user) + { + if (strcasecmp($this_user -> username, $username) === 0) + { + $this_user = new User($username, $this_user -> sha1_pass, $new_level, $this_user -> home_dir); + } + fwrite($h, $this_user -> __toString()); + } + fclose($h); + throw new ExceptionDisplay('User level successfully changed.'); + } + + /** + * @param string $username The name of the new user to create + * @param string $pass1 The raw password + * @param string $pass2 The raw password repeated again for verification + * @param int $level The level of the user (use GUEST USER ADMIN constants) + * @param string $home_dir The home directory of the user, or blank for the default + */ + private static function add_user($username, $pass1, $pass2, $level, $home_dir = '') + { + self::validate_new_password($pass1, $pass2); + $username_reg_exp = '/^[A-Za-z0-9_-]+$/'; + if (!preg_match($username_reg_exp, $username)) + { + throw new ExceptionDisplay('The username must only contain alpha-numeric characters, underscores, or dashes.' + . '
It must match the regular expression: ' + . Url::html_output($username_reg_exp) . ''); + } + if ($home_dir != '') + { + $home_dir = Item::make_sure_slash($home_dir); + if (!@is_dir($home_dir)) + { + throw new ExceptionDisplay('The user\'s home directory is not valid directory.'); + } + } + $list = new Accounts(); + if ($list -> user_exists($username)) + { + throw new ExceptionDisplay('This username already exists.'); + } + global $config; + $h = @fopen($config -> __get('user_list'), 'ab'); + if ($h === false) + { + throw new ExceptionDisplay('User list file could not be opened for writing.'); + } + $new_user = new User($username, sha1($pass1), $level, $home_dir); + fwrite($h, $new_user -> __toString()); + fclose($h); + throw new ExceptionDisplay('User successfully added.'); + } + + /** + * @param string $username Deletes user with the name $username + */ + private static function del_user($username) + { + $accounts = new Accounts(); + if (!$accounts -> user_exists($username)) + { + throw new ExceptionDisplay('Cannot delete user: username does not exist.'); + } + global $config; + $h = @fopen($config -> __get('user_list'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay("Could not open file $user_list for writing." + . ' Make sure PHP has write permission to this file.'); + } + foreach ($accounts as $this_user) + { + if (strcasecmp($this_user -> username, $username) !== 0) + { + fwrite($h, $this_user -> __toString()); + } + } + fclose($h); + throw new ExceptionDisplay('User successfully removed.'); + } + + /** + * @param User $current_user This user is checked to make sure it really is an admin + */ + public function __construct(User $current_user) + { + if (!($current_user instanceof UserLoggedIn)) + { + throw new ExceptionDisplay('You must be logged in to access this section.'); + } + $this -> level = $current_user -> level; + $this -> username = $current_user -> username; + } + + /** + * @param string $action + */ + public function action($action) + { + //This is a list of the actions moderators can do (otherwise, the user must be an admin) + $mod_actions = array('edit_description', 'change_password', 'ftp'); + + if (in_array(strtolower($action), $mod_actions)) + { + if ($this -> level < MODERATOR) + { + throw new ExceptionDisplay('You must be a moderator to access this section.'); + } + } + else if ($this -> level < ADMIN) + { + throw new ExceptionDisplay('You must be an administrator to access this section.'); + } + switch (strtolower($action)) + { + case 'config': + { + /** Include the config generator file. */ + if (!@include_once(CONFIG_GENERATOR)) + { + throw new ExceptionDisplay('Error including file ' + . CONFIG_GENERATOR . ''); + } + die(); + } + case 'rename': + { + if (!isset($_GET['filename'])) + { + throw new ExceptionDisplay('No filenames specified.'); + } + global $dir; + $old = $dir . Url::clean_input($_GET['filename']); + if (!@file_exists($old)) + { + header('HTTP/1.0 404 Not Found'); + throw new ExceptionDisplay('Specified file could not be found.'); + } + if (isset($_GET['new_name'])) + { + $new = $dir . Url::clean_input($_GET['new_name']); + if ($old == $new) + { + throw new ExceptionDisplay('Filename unchanged.'); + } + if (@file_exists($new)) + { + throw new ExceptionDisplay('Cannot overwrite existing file.'); + } + if (@rename($old, $new)) + { + global $config; + if (DOWNLOAD_COUNT) + { + self::update_file_info($config -> __get('download_count'), $old, $new); + } + if (DESCRIPTION_FILE) + { + self::update_file_info($config -> __get('description_file'), $old, $new); + } + throw new ExceptionDisplay('File renamed successfully.'); + } + throw new ExceptionDisplay('Error renaming file.'); + } + global $words, $subdir; + throw new ExceptionDisplay('

' . $words -> __get('renaming') + . ' ' . Url::html_output($_GET['filename']) + . '

' . $words -> __get('new filename') + . ':
(' + . $words -> __get('you can also move the file by specifying a path') + . ')

' + . '' + . '' + . '

'); + } + case 'delete': + { + if (!isset($_GET['filename'])) + { + throw new ExceptionDisplay('No filename specified.'); + } + if (isset($_GET['sure'])) + { + global $dir; + $to_delete = $dir . Url::clean_input($_GET['filename']); + if (!@file_exists($to_delete)) + { + header('HTTP/1.0 404 Not Found'); + throw new ExceptionDisplay('Specified file could not be found.'); + } + if (@is_dir($to_delete)) + { + if (self::rmdir_recursive($to_delete)) + { + throw new ExceptionDisplay('Folder successfully deleted.'); + } + throw new ExceptionDisplay('Error deleting folder.'); + } + if (@unlink($to_delete)) + { + throw new ExceptionDisplay('File successfully deleted.'); + } + throw new ExceptionDisplay('Error deleting file.'); + } + global $words, $subdir; + throw new ExceptionDisplay('

' + . $words -> __get('are you sure you want to delete the file') + . ' ' . Url::html_output($_GET['filename']) . '?

' + . '

' + . '' + . '

'); + } + case 'add_user': + { + if (isset($_POST['username'], $_POST['pass1'], $_POST['pass2'], $_POST['level'], $_POST['home_dir'])) + { + self::add_user($_POST['username'], $_POST['pass1'], + $_POST['pass2'], (int)$_POST['level'], $_POST['home_dir']); + } + global $words; + throw new ExceptionDisplay($words -> __get('add user') + . ':

' + . $words -> __get('username') . ':
' + . $words -> __get('password') . ':
' + . $words -> __get('password') . ':
' + . $words -> __get('level') . ':

Home Directory: ' + . '
(leave blank to use the default base directory)

'); + } + case 'change_password': + { + if (isset($_POST['pass1'], $_POST['pass2'], $_POST['old_pass'])) + { + self::change_password($this -> username, $_POST['old_pass'], + $_POST['pass1'], $_POST['pass2']); + } + throw new ExceptionDisplay('
+

Old password: +
New password: +
New password:

+

'); + } + case 'change_user_level': + { + if (isset($_POST['username'], $_POST['level'])) + { + self::change_user_level($_POST['username'], (int)$_POST['level']); + } + $accounts = new Accounts(); + $out = '
+

Select user:

Select new level:

+

'); + } + case 'del_user': + { + if (isset($_POST['username'])) + { + if (isset($_POST['sure'])) + { + self::del_user($_POST['username']); + } + global $words; + throw new ExceptionDisplay('

' + . $words -> __get('are you sure you want to remove the user') + . ' '.$_POST['username'] . '?

' + . '
' + . '

'); + } + global $words; + $accounts = new Accounts(); + $out = '

' . $words -> __get('select user to remove') + . ':

'); + } + case 'edit_description': + { + if (isset($_GET['filename'])) + { + global $dir; + $filename = $dir . $_GET['filename']; + if (isset($_GET['description'])) + { + global $descriptions, $config; + if (DESCRIPTION_FILE && $descriptions -> is_set($filename)) + //if it's already set, update the old description + { + //update the new description on disk + $h = @fopen($config -> __get('description_file'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay('Could not open description file for writing.' + . ' Make sure PHP has write permission to this file.'); + } + foreach ($descriptions as $file => $info) + { + fwrite($h, "$file\t" . (($file == $filename) ? $_GET['description'] : $info) . "\n"); + } + fclose($h); + + //update the new description in memory + $descriptions -> set($filename, $_GET['description']); + } + else if ($_GET['description'] != '') + //if it's not set, add it to the end + { + $h = @fopen($config -> __get('description_file'), 'ab'); + if ($h === false) + { + throw new ExceptionDisplay('Could not open description file for writing.' + . ' Make sure PHP has write permission to this file.'); + } + fwrite($h, "$filename\t" . $_GET['description'] . "\n"); + fclose($h); + + //read the description file with the updated data + $descriptions = new ConfigData($config -> __get('description_file')); + } + } + else + { + global $words, $subdir, $descriptions; + $current_desc = (DESCRIPTION_FILE && $descriptions -> is_set($filename) ? $descriptions -> __get($filename) : ''); + throw new ExceptionDisplay('

' + . $words -> __get('enter the new description for the file') + . ' ' . Url::html_output($_GET['filename']) + . ':

' + . '

'); + } + } + else + { + throw new ExceptionDisplay('No filename specified.'); + } + break; + } + case 'edit_hidden': + { + if (!HIDDEN_FILES) + { + throw new ExceptionDisplay('The file hiding system is not in use. To enable it, reconfigure the script.'); + } + global $hidden_list; + if (isset($_GET['add']) && $_GET['add'] != '') + { + global $config; + $h = @fopen($config -> __get('hidden_files'), 'ab'); + if ($h === false) + { + throw new ExceptionDisplay('Unable to open hidden files list for writing.'); + } + fwrite($h, $_GET['add'] . "\n"); + fclose($h); + throw new ExceptionDisplay('Hidden file added.'); + } + if (isset($_GET['remove'])) + { + global $config; + $h = @fopen($config -> __get('hidden_files'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay('Unable to open hidden files list for writing.'); + } + foreach ($hidden_list as $hid) + { + if ($hid != $_GET['remove']) + { + fwrite($h, $hid . "\n"); + } + } + fclose($h); + throw new ExceptionDisplay('Hidden file removed.'); + } + global $words; + $str = '

' . $words -> __get('add a new hidden file') . ':

' + . '

You can also use wildcards (?, *, +) for each entry.
' + . 'If you want to do the opposite of "hidden files" - show only certain files - ' + . 'put a colon in front of those entries.

' + . '

'; + + $str .= '

' . $words -> __get('remove a hidden file') + . ':

'; + throw new ExceptionDisplay($str); + } + case 'edit_banned': + { + if (!BANNED_LIST) + { + throw new ExceptionDisplay('The banning system is not in use. To enable it, reconfigure the script.'); + } + if (isset($_GET['add']) && $_GET['add'] != '') + { + global $config; + $h = @fopen($config -> __get('banned_list'), 'ab'); + if ($h === false) + { + throw new ExceptionDisplay('Unable to open banned_list for writing.'); + } + fwrite($h, $_GET['add'] . "\n"); + fclose($h); + throw new ExceptionDisplay('Ban added.'); + } + if (isset($_GET['remove'])) + { + global $b_list, $config; + $h = @fopen($config -> __get('banned_list'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay('Unable to open banned_list for writing.'); + } + foreach ($b_list as $ban) + { + if ($ban != $_GET['remove']) + { + fwrite($h, $ban . "\n"); + } + } + fclose($h); + throw new ExceptionDisplay('Ban removed.'); + } + global $b_list, $words; + $str = '

' . $words -> __get('add a new ban') . ':

' + . '

'; + + $str .= '

' + . $words -> __get('remove a ban') . ':

'; + throw new ExceptionDisplay($str); + } + case 'stats': + { + if (!LOG_FILE) + { + throw new ExceptionDisplay('The logging system has not been enabled.'); + } + $stats = new Stats(); + $stats -> display(); + break; + } + case 'view_log': + { + if (!LOG_FILE) + { + throw new ExceptionDisplay('The logging system has not been enabled.'); + } + global $log; + if (isset($_GET['num'])) + { + $log -> display((int)$_GET['num']); + } + global $words; + throw new ExceptionDisplay($words -> __get('how many entries would you like to view') + . '?
' + . '
'); + } + case 'create_dir': + { + if (isset($_GET['name'])) + { + global $dir; + if (!self::mkdir_recursive($dir . $_GET['name'])) + { + throw new ExceptionDisplay('Error creating new folder.'); + } + } + else + { + global $words, $subdir; + throw new ExceptionDisplay('

' . $words -> __get('enter the new name') + . ':

' + . '

'); + } + break; + } + case 'copy_url': + { + if (isset($_GET['protocol'], $_GET['copy_file'])) + { + self::copy_remote_file(rawurldecode($_GET['protocol']), rawurldecode($_GET['copy_file'])); + throw new ExceptionDisplay('Copy was successful.'); + } + global $dir; + $text = ' + +
+

Enter the name of the remote file you would like to copy:

+
+

+ + http:// +
ftp:// +

+

+

'; + echo new Display($text); + die(); + } + case 'ftp': + { + if (isset($_POST['host'], $_POST['port'], $_POST['directory'], + $_POST['ftp_username'], $_POST['ftp_password'])) + { + if ($_POST['host'] == '') + { + throw new ExceptionDisplay('Please go back and enter a hostname.'); + } + if ($_POST['ftp_username'] == '' && $_POST['ftp_password'] == '') + //anonymous login + { + $_POST['ftp_username'] = 'anonymous'; + $_POST['ftp_password'] = 'autoindex@sourceforge.net'; + } + if ($_POST['directory'] == '') + { + $_POST['directory'] = './'; + } + if ($_POST['port'] == '') + { + $_POST['port'] = 21; + } + $_SESSION['ftp'] = array( + 'host' => $_POST['host'], + 'port' => (int)$_POST['port'], + 'directory' => Item::make_sure_slash($_POST['directory']), + 'username' => $_POST['ftp_username'], + 'password' => $_POST['ftp_password'], + 'passive' => isset($_POST['passive']) + ); + } + if (isset($_GET['set_dir'])) + { + $_SESSION['ftp']['directory'] = $_GET['set_dir']; + } + global $subdir; + if (isset($_GET['ftp_logout'])) + { + unset($_SESSION['ftp']); + $text = '

Logout successful. Go back.

'; + } + else if (isset($_SESSION['ftp'])) + { + try + { + $ftp = new Ftp($_SESSION['ftp']['host'], $_SESSION['ftp']['port'], + $_SESSION['ftp']['passive'], $_SESSION['ftp']['directory'], + $_SESSION['ftp']['username'], $_SESSION['ftp']['password']); + } + catch (ExceptionFatal $e) + { + unset($_SESSION['ftp']); + throw $e; + } + if (isset($_GET['filename']) && $_GET['filename'] != '') + //transfer local to FTP + { + global $dir; + $name = rawurldecode($_GET['filename']); + $ftp -> put_file($dir . $name, Item::get_basename($name)); + throw new ExceptionDisplay('File successfully transferred to FTP server.'); + } + if (isset($_GET['transfer']) && $_GET['transfer'] != '') + //transfer FTP to local + { + global $dir; + $name = rawurldecode($_GET['transfer']); + $ftp -> get_file($dir . Item::get_basename($name), $name); + throw new ExceptionDisplay('File successfully transferred from FTP server.'); + } + global $words; + $text = '

Logout of FTP server +
Back to index.

'; + } + else + { + $text = '
+
+

FTP server: + port +
Passive Mode

+

Username: +
Password: + (Leave these blank to login anonymously) +

Directory: +

+

Back to index.

'; + } + echo new Display($text); + die(); + } + default: + { + throw new ExceptionDisplay('Invalid admin action.'); + } + } + } + + /** + * @return string The HTML text that makes up the admin panel + */ + public function __toString() + { + global $words, $subdir; + $str = ''; + + //only ADMIN accounts + if ($this -> level >= ADMIN) $str = ' +

+ ' + . $words -> __get('reconfigure script') . ' +

+

+ ' + . $words -> __get('edit list of hidden files') . ' +
' + . $words -> __get('edit ban list') . ' +

+

+ ' . $words -> __get('create new directory in this folder') + . '
' . $words -> __get('copy url') . ' +

+

+ ' + . $words -> __get('view entries from log file') . ' +
' + . $words -> __get('view statistics from log file') . ' +

+

+ ' + . $words -> __get('add new user') . ' +
' + . $words -> __get('delete user') . ' +
+ Change a user\'s level +

'; + //MODERATOR and ADMIN accounts + if ($this -> level >= MODERATOR) $str .= ' +

+ + Change your password +

+

+ FTP browser +

'; + return $str; + } +} + +?> diff --git a/classes/ConfigData.php b/classes/ConfigData.php new file mode 100755 index 0000000..9cbd50b --- /dev/null +++ b/classes/ConfigData.php @@ -0,0 +1,233 @@ + + * @version 1.0.2 (January 13, 2005) + * @package AutoIndex + */ +class ConfigData implements Iterator +{ + /** + * @var array A list of all the settings + */ + private $config; + + /** + * @var string The name of the file to read the settings from + */ + private $filename; + + //begin implementation of Iterator + /** + * @var bool + */ + private $valid; + + /** + * @return string + */ + public function current() + { + return current($this -> config); + } + + /** + * Increments the internal array pointer, and returns the new value. + * + * @return string + */ + public function next() + { + $t = next($this -> config); + if ($t === false) + { + $this -> valid = false; + } + return $t; + } + + /** + * Sets the internal array pointer to the beginning. + */ + public function rewind() + { + reset($this -> config); + } + + /** + * @return bool + */ + public function valid() + { + return $this -> valid; + } + + /** + * @return string + */ + public function key() + { + return key($this -> config); + } + //end implementation of Iterator + + /** + * @param string $line The line to test + * @return bool True if $line starts with characters that mean it is a comment + */ + public static function line_is_comment($line) + { + $line = trim($line); + return (($line == '') || preg_match('@^(//|<\?|\?>|/\*|\*/|#)@', $line)); + } + + /** + * @param string $file The filename to read the data from + */ + public function __construct($file) + { + if ($file === false) + { + return; + } + $this -> valid = true; + $this -> filename = $file; + $contents = @file($file); + if ($contents === false) + { + throw new ExceptionFatal('Error reading file ' + . Url::html_output($file) . ''); + } + foreach ($contents as $i => $line) + { + $line = rtrim($line, "\r\n"); + if (self::line_is_comment($line)) + { + continue; + } + $parts = explode("\t", $line, 2); + if (count($parts) !== 2 || $parts[0] == '' || $parts[1] == '') + { + throw new ExceptionFatal('Incorrect format for file ' + . Url::html_output($file) . ' on line ' . ($i + 1) + . '.
Format is "variable name[tab]value"'); + } + if (isset($this -> config[$parts[0]])) + { + throw new ExceptionFatal('Error in ' + . Url::html_output($file) . ' on line ' . ($i + 1) + . '.
' . Url::html_output($parts[0]) + . ' is already defined.'); + } + $this -> config[$parts[0]] = $parts[1]; + } + } + + /** + * $config[$key] will be set to $info. + * + * @param string $key + * @param string $info + */ + public function set($key, $info) + { + $this -> config[$key] = $info; + } + + /** + * This will look for the key $item, and add one to the $info (assuming + * it is an integer). + * + * @param string $item The key to look for + */ + public function add_one($item) + { + if ($this -> is_set($item)) + { + $h = @fopen($this -> filename, 'wb'); + if ($h === false) + { + throw new ExceptionFatal('Could not open file ' + . Url::html_output($this -> filename) + . ' for writing. Make sure PHP has write permission to this file.'); + } + foreach ($this as $current_item => $count) + { + fwrite($h, "$current_item\t" + . (($current_item == $item) ? ((int)$count + 1) : $count) + . "\n"); + } + } + else + { + $h = @fopen($this -> filename, 'ab'); + if ($h === false) + { + throw new ExceptionFatal('Could not open file ' + . $this -> filename . ' for writing.' + . ' Make sure PHP has write permission to this file.'); + } + fwrite($h, "$item\t1\n"); + } + fclose($h); + } + + /** + * @param string $name The key to look for + * @return bool True if $name is set + */ + public function is_set($name) + { + return isset($this -> config[$name]); + } + + /** + * @param string $name The key to look for + * @return string The value $name points to + */ + public function __get($name) + { + if (isset($this -> config[$name])) + { + return $this -> config[$name]; + } + throw new ExceptionFatal('Setting ' . Url::html_output($name) + . ' is missing in file ' + . Url::html_output($this -> filename) . '.'); + } +} + +?> \ No newline at end of file diff --git a/classes/DirItem.php b/classes/DirItem.php new file mode 100755 index 0000000..7138ef7 --- /dev/null +++ b/classes/DirItem.php @@ -0,0 +1,167 @@ + + * @version 1.0.1 (June 30, 2004) + * @package AutoIndex + */ +class DirItem extends Item +{ + /** + * @var DirectoryList The list of this directory's contents + */ + private $temp_list; + + /** + * @return string Always returns 'dir', since this is a directory, not a file + */ + public function file_ext() + { + return 'dir'; + } + + /** + * @return int The total size in bytes of the folder (recursive) + */ + private function dir_size() + { + if (!isset($this -> temp_list)) + { + $this -> temp_list = new DirectoryList($this -> parent_dir . $this -> filename); + } + return $this -> temp_list -> size_recursive(); + } + + /** + * @return int The total number of files in the folder (recursive) + */ + public function num_subfiles() + { + if (!isset($this -> temp_list)) + { + $this -> temp_list = new DirectoryList($this -> parent_dir . $this -> filename); + } + return $this -> temp_list -> num_files(); + } + + /** + * @param string $path + * @return string The parent directory of $path + */ + public static function get_parent_dir($path) + { + $path = str_replace('\\', '/', $path); + while (preg_match('#/$#', $path)) + //remove all slashes from the end + { + $path = substr($path, 0, -1); + } + $pos = strrpos($path, '/'); + if ($pos === false) + { + return ''; + } + $path = substr($path, 0, $pos + 1); + return (($path === false) ? '' : $path); + } + + /** + * @param string $parent_dir + * @param string $filename + */ + public function __construct($parent_dir, $filename) + { + $filename = self::make_sure_slash($filename); + parent::__construct($parent_dir, $filename); + global $config, $subdir; + $this -> downloads = ' '; + if ($filename == '../') + //link to parent directory + { + if ($subdir != '') + { + global $words; + $this -> is_parent_dir = true; + $this -> filename = $words -> __get('parent directory'); + $this -> icon = (ICON_PATH ? $config -> __get('icon_path') + . 'back.png' : ''); + $this -> size = new Size(true); + $this -> link = Url::html_output($_SERVER['PHP_SELF']) . '?dir=' + . Url::translate_uri(self::get_parent_dir($subdir)); + $this -> parent_dir = $this -> new_icon = ''; + $this -> a_time = $this -> m_time = false; + } + else + { + $this -> is_parent_dir = $this -> filename = false; + } + } + else + //regular folder + { + if (!@is_dir($this -> parent_dir . $filename)) + { + throw new ExceptionDisplay('Directory ' + . Url::html_output($this -> parent_dir . $filename) + . ' does not exist.'); + } + $this -> filename = substr($filename, 0, -1); + $this -> icon = $config -> __get('icon_path') . 'dir.png'; + $this -> link = Url::html_output($_SERVER['PHP_SELF']) . '?dir=' + . Url::translate_uri(substr($this -> parent_dir, strlen($config -> __get('base_dir'))) . $filename); + } + } + + /** + * @param string $var The key to look for + * @return mixed The data stored at the key + */ + public function __get($var) + { + if (isset($this -> $var)) + { + return $this -> $var; + } + if ($var == 'size') + { + $this -> size = new Size(SHOW_DIR_SIZE ? $this -> dir_size() : false); + return $this -> size; + } + throw new ExceptionDisplay('Variable ' . Url::html_output($var) + . ' not set in DirItem class.'); + } +} + +?> \ No newline at end of file diff --git a/classes/DirectoryList.php b/classes/DirectoryList.php new file mode 100755 index 0000000..c20e782 --- /dev/null +++ b/classes/DirectoryList.php @@ -0,0 +1,256 @@ + + * @version 1.0.1 (June 30, 2004) + * @package AutoIndex + */ +class DirectoryList implements Iterator +{ + /** + * @var string The directory this object represents + */ + protected $dir_name; + + /** + * @var array The list of filesname in this directory (strings) + */ + protected $contents; + + /** + * @var int The size of the $contents array + */ + private $list_count; + + //begin implementation of Iterator + /** + * @var int $i is used to keep track of the current pointer inside the array when implementing Iterator + */ + private $i; + + /** + * @return string The element $i currently points to in the array + */ + public function current() + { + if ($this -> i < count($this -> contents)) + { + return $this -> contents[$this -> i]; + } + return false; + } + + /** + * Increments the internal array pointer, then returns the value + * at that new position. + * + * @return string The current position of the pointer in the array + */ + public function next() + { + $this -> i++; + return $this -> current(); + } + + /** + * Sets the internal array pointer to 0 + */ + public function rewind() + { + $this -> i = 0; + } + + /** + * @return bool True if $i is a valid array index + */ + public function valid() + { + return ($this -> i < count($this -> contents)); + } + + /** + * @return int Returns $i, the key of the array + */ + public function key() + { + return $this -> i; + } + //end implementation of Iterator + + /** + * @return int The total size in bytes of the folder (recursive) + */ + public function size_recursive() + { + $total_size = 0; + foreach ($this as $current) + { + $t = $this -> dir_name . $current; + if (@is_dir($t)) + { + if ($current != '..') + { + $temp = new DirectoryList($t); + $total_size += $temp -> size_recursive(); + } + } + else + { + $total_size += @filesize($t); + } + } + return $total_size; + } + + /** + * @return int The total number of files in this directory (recursive) + */ + public function num_files() + { + $count = 0; + foreach ($this as $current) + { + $t = $this -> dir_name . $current; + if (@is_dir($t)) + { + if ($current != '..') + { + $temp = new DirectoryList($t); + $count += $temp -> num_files(); + } + } + else + { + $count++; + } + } + return $count; + } + + /** + * @param string $string The string to search for + * @param array $array The array to search + * @return bool True if $string matches any elements in $array + */ + public static function match_in_array($string, &$array) + { + $string = Item::get_basename($string); + static $replace = array( + '\*' => '[^\/]*', + '\+' => '[^\/]+', + '\?' => '[^\/]?'); + foreach ($array as $m) + { + if (preg_match('/^' . strtr(preg_quote(Item::get_basename($m), '/'), $replace) . '$/i', $string)) + { + return true; + } + } + return false; + } + + /** + * @param string $t The file or folder name + * @param bool $is_file + * @return bool True if $t is listed as a hidden file + */ + public static function is_hidden($t, $is_file = true) + { + $t = Item::get_basename($t); + if ($t == '.' || $t == '') + { + return true; + } + global $you; + if ($you -> level >= ADMIN) + //allow admins to view hidden files + { + return false; + } + global $hidden_files, $show_only_these_files; + if ($is_file && count($show_only_these_files)) + { + return (!self::match_in_array($t, $show_only_these_files)); + } + return self::match_in_array($t, $hidden_files); + } + + /** + * @param string $var The key to look for + * @return mixed The data stored at the key + */ + public function __get($var) + { + if (isset($this -> $var)) + { + return $this -> $var; + } + throw new ExceptionDisplay('Variable ' . Url::html_output($var) + . ' not set in DirectoryList class.'); + } + + /** + * @param string $path + */ + public function __construct($path) + { + $path = Item::make_sure_slash($path); + if (!@is_dir($path)) + { + throw new ExceptionDisplay('Directory ' . Url::html_output($path) + . ' does not exist.'); + } + $temp_list = @scandir($path); + if ($temp_list === false) + { + throw new ExceptionDisplay('Error reading from directory ' + . Url::html_output($path) . '.'); + } + $this -> dir_name = $path; + $this -> contents = array(); + foreach ($temp_list as $t) + { + if (!self::is_hidden($t, !@is_dir($path . $t))) + { + $this -> contents[] = $t; + } + } + $this -> list_count = count($this -> contents); + $this -> i = 0; + } +} + +?> \ No newline at end of file diff --git a/classes/DirectoryListDetailed.php b/classes/DirectoryListDetailed.php new file mode 100755 index 0000000..7aa3165 --- /dev/null +++ b/classes/DirectoryListDetailed.php @@ -0,0 +1,237 @@ + + * @version 1.1.0 (January 01, 2006) + * @package AutoIndex + */ +class DirectoryListDetailed extends DirectoryList +{ + /** + * @var string The HTML text that makes up the path navigation links + */ + protected $path_nav; + + /** + * @var int Total number of files in this directory + */ + protected $total_files; + + /** + * @var int Total number of folders in this directory + */ + protected $total_folders; + + /** + * @var int Total number of folders in this directory (including parent) + */ + protected $raw_total_folders; + + /** + * @var int Total number of downloads of files in this directory + */ + protected $total_downloads; + + /** + * @var Size Total size of this directory (recursive) + */ + protected $total_size; + + /** + * @return string The HTML text that makes up the path navigation + */ + private function set_path_nav() + { + global $config, $subdir; + $exploded = explode('/', $subdir); + $c = count($exploded) - 1; + $temp = '' + . Url::html_output(substr(str_replace('/', ' / ', $config -> __get('base_dir')), 0, -2)) . '/ '; + for ($i = 0; $i < $c; $i++) + { + $temp .= '' . Url::html_output($exploded[$i]) . ' / '; + } + return $temp; + } + + /** + * Returns -1 if $a < $b or 1 if $a > $b + * + * @param Item $a + * @param Item $b + * @return int + */ + private static function callback_sort(Item $a, Item $b) + { + if ($a -> __get('is_parent_dir')) + { + return -1; + } + if ($b -> __get('is_parent_dir')) + { + return 1; + } + $sort = strtolower($_SESSION['sort']); + if ($sort === 'size') + { + $val = (($a -> __get('size') -> __get('bytes') < + $b -> __get('size') -> __get('bytes')) ? -1 : 1); + } + else + { + if (!$a -> is_set($sort)) + { + $_SESSION['sort'] = 'filename'; //so the "continue" link will work + throw new ExceptionDisplay('Invalid sort mode.'); + } + if (is_string($a -> __get($sort))) + { + $val = strnatcasecmp($a -> __get($sort), $b -> __get($sort)); + } + else + { + $val = (($a -> __get($sort) < $b -> __get($sort)) ? -1 : 1); + } + } + return ((strtolower($_SESSION['sort_mode']) === 'd') ? -$val : $val); + } + + /** + * @param array $list The array to be sorted with the callback_sort function + */ + protected static function sort_list(&$list) + { + usort($list, array('self', 'callback_sort')); + } + + /** + * @return int The total number of files and folders (including the parent folder) + */ + public function total_items() + { + return $this -> raw_total_folders + $this -> total_files; + } + + /** + * @param string $path The directory to read the files from + * @param int $page The number of files to skip (used for pagination) + */ + public function __construct($path, $page = 1) + { + $path = Item::make_sure_slash($path); + parent::__construct($path); + $subtract_parent = false; + $this -> total_downloads = $total_size = 0; + $dirs = $files = array(); + foreach ($this as $t) + { + if (@is_dir($path . $t)) + { + $temp = new DirItem($path, $t); + if ($temp -> __get('is_parent_dir')) + { + $dirs[] = $temp; + $subtract_parent = true; + } + else if ($temp -> __get('filename') !== false) + { + $dirs[] = $temp; + if ($temp -> __get('size') -> __get('bytes') !== false) + { + $total_size += $temp -> __get('size') -> __get('bytes'); + } + } + } + else if (@is_file($path . $t)) + { + $temp = new FileItem($path, $t); + if ($temp -> __get('filename') !== false) + { + $files[] = $temp; + $this -> total_downloads += $temp -> __get('downloads'); + $total_size += $temp -> __get('size') -> __get('bytes'); + } + } + } + self::sort_list($dirs); + self::sort_list($files); + $this -> contents = array_merge($dirs, $files); + $this -> total_size = new Size($total_size); + $this -> total_files = count($files); + $this -> raw_total_folders = $this -> total_folders = count($dirs); + if ($subtract_parent) + { + $this -> total_folders--; + } + $this -> path_nav = $this -> set_path_nav(); + + //Paginate the files + if (ENTRIES_PER_PAGE) + { + if ($page < 1) + { + throw new ExceptionDisplay('Invalid page number.'); + } + global $config; + $num_per_page = $config -> __get('entries_per_page'); + if (($page - 1) * $num_per_page >= $this -> total_items()) + { + throw new ExceptionDisplay('Invalid page number.'); + } + $this -> contents = array_slice($this -> contents, ($page - 1) * $num_per_page, $num_per_page); + } + } + + /** + * @return string The HTML text of the directory list, using the template system + */ + public function __toString() + { + $head = new TemplateInfo(TABLE_HEADER, $this); + $main = new TemplateFiles(EACH_FILE, $this); + $foot = new TemplateInfo(TABLE_FOOTER, $this); + return $head -> __toString() . $main -> __toString() . $foot -> __toString(); + } +} + +?> \ No newline at end of file diff --git a/classes/Display.php b/classes/Display.php new file mode 100755 index 0000000..5ed610b --- /dev/null +++ b/classes/Display.php @@ -0,0 +1,90 @@ + + * @version 1.0.2 (July 22, 2004) + * @package AutoIndex + */ +class Display +{ + /** + * @var string HTML text to output + */ + private $contents; + + /** + * @return string The HTML text of the list of function calls + * @see debug_backtrace() + */ + public static function get_trace() + { + $list = '

Debug trace:'; + foreach (debug_backtrace() as $arr) + { + $line = (isset($arr['line']) ? $arr['line'] : 'unknown'); + $file = (isset($arr['file']) ? Item::get_basename($arr['file']) : 'unknown'); + $type = (isset($arr['type']) ? $arr['type'] : ''); + $class = (isset($arr['class']) ? $arr['class'] : ''); + $function = (isset($arr['function']) ? $arr['function'] : 'unknown'); + $list .= "\n
$file line $line ($class$type$function)"; + } + return $list . '

'; + } + + /** + * @param string $contents Sets the HTML contents + */ + public function __construct(&$contents) + { + $this -> contents = $contents; + } + + /** + * @return string The HTML output, using the template system + */ + public function __toString() + { + $header = new Template(GLOBAL_HEADER); + $footer = new Template(GLOBAL_FOOTER); + $output = $header -> __toString() . $this -> contents; + if (DEBUG) + { + $output .= self::get_trace(); + } + return $output . $footer -> __toString(); + } +} + +?> \ No newline at end of file diff --git a/classes/ExceptionDisplay.php b/classes/ExceptionDisplay.php new file mode 100755 index 0000000..34c87e1 --- /dev/null +++ b/classes/ExceptionDisplay.php @@ -0,0 +1,64 @@ + + * @version 1.0.0 (August 01, 2004) + * @package AutoIndex + * @see Display + */ +class ExceptionDisplay extends ExceptionFatal +{ + /** + * @return string The HTML text to display + */ + public function __toString() + { + global $words; + $str = '
' + . $this -> message . '

' . (isset($words) ? $words -> __get('continue') : 'Continue') + . '.

'; + $temp = new Display($str); + return $temp -> __toString(); + } +} + +?> \ No newline at end of file diff --git a/classes/FileItem.php b/classes/FileItem.php new file mode 100755 index 0000000..7203349 --- /dev/null +++ b/classes/FileItem.php @@ -0,0 +1,118 @@ + + * @version 1.0.1 (July 10, 2004) + * @package AutoIndex + */ +class FileItem extends Item +{ + /** + * @param string $fn The filename + * @return string Everything after the list dot in the filename, not including the dot + */ + public static function ext($fn) + { + $fn = Item::get_basename($fn); + return (strpos($fn, '.') ? strtolower(substr(strrchr($fn, '.'), 1)) : ''); + } + + /** + * @return string Returns the extension of the filename + * @see FileItem::ext() + */ + public function file_ext() + { + return self::ext($this -> filename); + } + + /** + * @param string $parent_dir + * @param string $filename + */ + public function __construct($parent_dir, $filename) + { + parent::__construct($parent_dir, $filename); + if (!@is_file($this -> parent_dir . $filename)) + { + throw new ExceptionDisplay('File ' + . Url::html_output($this -> parent_dir . $filename) + . ' does not exist.'); + } + global $config, $words, $downloads; + $this -> filename = $filename; + $this -> size = new Size(filesize($this -> parent_dir . $filename)); + if (ICON_PATH) + { + $file_icon = new Icon($filename); + $this -> icon = $file_icon -> __toString(); + } + $this -> downloads = (DOWNLOAD_COUNT && $downloads -> is_set($parent_dir . $filename) ? (int)($downloads -> __get($parent_dir . $filename)) : 0); + $this -> link = Url::html_output($_SERVER['PHP_SELF']) . '?dir=' . Url::translate_uri(substr($this -> parent_dir, strlen($config -> __get('base_dir')))) + . '&file=' . Url::translate_uri($filename); + if (THUMBNAIL_HEIGHT && in_array(self::ext($filename), array('png', 'jpg', 'jpeg', 'gif'))) + { + $this -> thumb_link = ' ' . $words -> __get('thumbnail of') . ' ' . $filename
+			. ''; + } + $size = $this -> size -> __get('bytes'); + if (MD5_SHOW && $size > 0 && $size / 1048576 <= $config -> __get('md5_show')) + { + $this -> md5_link = '[' + . $words -> __get('calculate md5sum') . ']'; + } + } + + /** + * @param string $var The key to look for + * @return mixed The data stored at the key + */ + public function __get($var) + { + if (isset($this -> $var)) + { + return $this -> $var; + } + throw new ExceptionDisplay('Variable ' . Url::html_output($var) + . ' not set in FileItem class.'); + } +} + +?> \ No newline at end of file diff --git a/classes/Ftp.php b/classes/Ftp.php new file mode 100755 index 0000000..6482882 --- /dev/null +++ b/classes/Ftp.php @@ -0,0 +1,155 @@ + + * @version 1.0.0 (February 16, 2005) + * @package AutoIndex + */ +class Ftp extends DirectoryList +{ + /** + * @var resource The FTP connection handle + */ + private $handle; + + /** + * @var array Array of bools, for each entry + */ + private $is_directory; + + /** + * Returns if the $i'th entry is a directory or not. + * + * @param int $i The file/folder entry to check + * @return bool True if directory, false if file + */ + public function is_directory($i) + { + return $this -> is_directory[$i]; + } + + /** + * Reads the contents of the directory $path from the FTP server. + * + * @param string $path + */ + private function update_list($path) + { + $path = Item::make_sure_slash($path); + $is_dir = $this -> contents = array(); + $this -> dir_name = $path; + $raw_list = @ftp_rawlist($this -> handle, $path); + if ($raw_list === false) + { + throw new ExceptionDisplay('Unable to read directory contents of FTP server.'); + } + foreach ($raw_list as $file) + { + if ($file == '') + { + continue; + } + $name = strrchr($file, ' '); + if ($name === false) + { + continue; + } + $this -> is_directory[] = (strtolower($file{0}) === 'd'); + $this -> contents[] = $path . substr($name, 1); + } + $this -> list_count = count($this -> contents); + $this -> i = 0; + } + + /** + * @param string $local + * @param string $remote + */ + public function get_file($local, $remote) + { + if (!@ftp_get($this -> handle, $local, $remote, FTP_BINARY)) + { + throw new ExceptionDisplay('Unable to transfer file from FTP server.'); + } + } + + /** + * @param string $local + * @param string $remote + */ + public function put_file($local, $remote) + { + if (!@ftp_put($this -> handle, $remote, $local, FTP_BINARY)) + { + throw new ExceptionDisplay('Unable to transfer file to FTP server.'); + } + } + + /** + * @param string $host + * @param int $port + * @param bool $passive + * @param string $directory Directory to view + * @param string $username To login with + * @param string $password To login with + */ + public function __construct($host, $port, $passive, $directory, $username, $password) + { + $this -> handle = @ftp_connect(trim($host), (int)$port); + if ($this -> handle === false) + { + throw new ExceptionDisplay('Could not connect to FTP server.'); + } + if (!@ftp_login($this -> handle, $username, $password)) + { + throw new ExceptionDisplay('Incorrect login for FTP server.'); + } + if ($passive && !@ftp_pasv($this -> handle, true)) + { + throw new ExceptionDisplay('Could not set passive mode for FTP server.'); + } + $this -> update_list($directory); + } + + /** + * Closes the open FTP connection when the object is destroyed. + */ + public function __destruct() + { + ftp_close($this -> handle); + } +} + +?> \ No newline at end of file diff --git a/classes/Htaccess.php b/classes/Htaccess.php new file mode 100755 index 0000000..99ee6e9 --- /dev/null +++ b/classes/Htaccess.php @@ -0,0 +1,508 @@ + + * - + * - + * - AddDescription + * - IndexIgnore + * - Include + * - Order + * - Deny from + * - Allow from + * - AuthUserFile + * - AuthName + * - Require user + * + * These password formats are supported for .htpasswd file: + * - MD5 + * - SHA-1 + * - Crypt + * - Apache's Custom MD5 Crypt + * + * @author Justin Hagstrom + * @version 1.0.1 (January 6, 2007) + * @package AutoIndex + */ +class Htaccess +{ + /** + * @var string "AuthName" setting + */ + private $auth_name; + + /** + * @var string "AuthUserFile" setting + */ + private $auth_user_file; + + /** + * @var array "Require user" setting + */ + private $auth_required_users; + + /** + * @var string "Order" setting + */ + private $order; + + /** + * @var array "Allow from" setting + */ + private $allow_list; + + /** + * @var array "Deny from" setting + */ + private $deny_list; + + /** + * Converts hexadecimal to binary. + * + * @param string $hex + * @return string + */ + private static function hex2bin($hex) + { + $bin = ''; + $ln = strlen($hex); + for($i = 0; $i < $ln; $i += 2) + { + $bin .= chr(hexdec($hex{$i} . $hex{$i+1})); + } + return $bin; + } + + /** + * Return the number of count from the value using base conversion. + * + * @param int $value + * @param int $count + * @return int + */ + private static function to64($value, $count) + { + static $root = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + $result = ''; + while(--$count) + { + $result .= $root[$value & 0x3f]; + $value >>= 6; + } + return $result; + } + + /** + * Implementation of Apache's Custom MD5 Crypt. + * + * @param string $plain The plaintext password + * @param string $salt The salt + * @return string The hashed password + */ + private static function md5_crypt($plain, $salt) + { + $length = strlen($plain); + $context = $plain . '$apr1$' . $salt; + $binary = self::hex2bin(md5($plain . $salt . $plain)); + for ($i = $length; $i > 0; $i -= 16) + { + $context .= substr($binary, 0, min(16, $i)); + } + for ( $i = $length; $i > 0; $i >>= 1) + { + $context .= ($i & 1) ? chr(0) : $plain[0]; + } + $binary = self::hex2bin(md5($context)); + for ($i = 0; $i < 1000; $i++) + { + $new = ($i & 1) ? $plain : substr($binary, 0, 16); + if ($i % 3) + { + $new .= $salt; + } + if ($i % 7) + { + $new .= $plain; + } + $new .= (($i & 1) ? substr($binary, 0, 16) : $plain); + $binary = self::hex2bin(md5($new)); + } + $p = array(); + for ($i = 0; $i < 5; $i++) + { + $k = $i + 6; + $j = $i + 12; + if ($j == 16) + { + $j = 5; + } + $p[] = self::to64( + (ord($binary[$i]) << 16) | + (ord($binary[$k]) << 8) | + (ord($binary[$j])), 5 + ); + } + return '$apr1$' . $salt . '$' . implode($p) . self::to64(ord($binary[11]), 3); + } + + /** + * Tests if $test matches $target. + * + * @param string $test + * @param string $target + * @return bool True if $test matches $target + */ + private static function matches($test, $target) + { + static $replace = array( + '\*' => '.*', + '\+' => '.+', + '\?' => '.?'); + return (bool)preg_match('/^' . strtr(preg_quote($test, '/'), $replace) . '$/i', $target); + } + + /** + * Checks if AuthName and AuthUserFile are set, and then prompts for a + * username and password. + */ + private function check_auth() + { + if ($this -> auth_user_file == '') + { + return; + } + if ($this -> auth_name == '') + { + $this -> auth_name = '"Directory access restricted by AutoIndex"'; + } + $validated = false; + if (isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) + { + $file = @file($this -> auth_user_file); + if ($file === false) + { + $_GET['dir'] = ''; + throw new ExceptionDisplay('Cannot open .htpasswd file. +
' . htmlentities($this -> auth_user_file) . ''); + } + if ($this -> auth_required_users === array() || DirectoryList::match_in_array($_SERVER['PHP_AUTH_USER'], $this -> auth_required_users)) + { + foreach ($file as $account) + { + $parts = explode(':', trim($account)); + if (count($parts) < 2 || $_SERVER['PHP_AUTH_USER'] != $parts[0]) + { + continue; + } + if (isset($parts[2])) + //MD5 hash format with realm + { + $parts[1] = $parts[2]; + } + switch (strlen($parts[1])) + { + case 13: + //Crypt hash format + { + $validated = (crypt($_SERVER['PHP_AUTH_PW'], substr($parts[1], 0, 2)) == $parts[1]); + break 2; + } + case 32: + //MD5 hash format + { + $validated = (md5($_SERVER['PHP_AUTH_PW']) == $parts[1]); + break 2; + } + case 37: + //Apache's MD5 Crypt hash format + { + $salt = explode('$', $parts[1]); + $validated = (self::md5_crypt($_SERVER['PHP_AUTH_PW'], $salt[2]) == $parts[1]); + break 2; + } + case 40: + //SHA-1 hash format + { + $validated = (sha1($_SERVER['PHP_AUTH_PW']) == $parts[1]); + break 2; + } + } + } + } + sleep(1); + } + if (!$validated) + { + header('WWW-Authenticate: Basic realm=' . $this -> auth_name); + header('HTTP/1.0 401 Authorization Required'); + $_GET['dir'] = ''; + throw new ExceptionDisplay('A username and password are required to access this directory.'); + } + } + + /** + * Checks if the user's IP or hostname is either allowed or denied. + */ + private function check_deny() + { + global $ip, $host, $words; + if ($this -> order === 'allow,deny') + { + if (!DirectoryList::match_in_array($host, $this -> allow_list) + && !DirectoryList::match_in_array($ip, $this -> allow_list)) + { + $_GET['dir'] = ''; + throw new ExceptionDisplay($words -> __get('the administrator has blocked your ip address or hostname') . '.'); + } + } + else if (DirectoryList::match_in_array($ip, $this -> deny_list) + || DirectoryList::match_in_array($host, $this -> deny_list)) + { + $_GET['dir'] = ''; + throw new ExceptionDisplay($words -> __get('the administrator has blocked your ip address or hostname') . '.'); + } + } + + /** + * @param string $file The .htaccess file (name and path) to parse + */ + private function parse($file) + { + $data = @file($file); + if ($data === false) + { + return; + } + $conditional_directory = ''; + $other_conditional = false; + foreach ($data as $line) + { + $line = trim($line); + if ($line == '') + { + continue; + } + if ($line{0} == '<') + { + if (preg_match('#^#i', $line)) + { + $conditional_directory = ''; + } + else if (preg_match('#^<\s*directory\s+\"?(.+?)\"?\s*>#i', $line, $matches)) + { + $conditional_directory = $matches[1]; + } + else if (preg_match('#^#i', $line)) + { + //ignore tags + continue; + } + else if (preg_match('#^#i', $line)) + { + $conditional_defined = ''; + } + else if (preg_match('#^<\s*ifdefine\s+(.+?)\s*>#i', $line, $matches)) + { + $conditional_defined = $matches[1]; + } + else if (isset($line{1})) + { + $other_conditional = ($line{1} != '/'); + } + continue; + } + global $dir; + if ($other_conditional || $conditional_directory != '' && !self::matches($conditional_directory, $dir)) + //deal with or an unknown < > tag + { + continue; + } + if ($conditional_defined != '') + //deal with + { + $conditional_defined = strtoupper($conditional_defined); + if ($conditional_defined{0} === '!') + { + $conditional_defined = substr($conditional_defined, 1); + if (defined($conditional_defined) && constant($conditional_defined)) + { + continue; + } + } + else if (!defined($conditional_defined) || !constant($conditional_defined)) + { + continue; + } + } + $parts = preg_split('#\s#', $line, -1, PREG_SPLIT_NO_EMPTY); + switch (strtolower($parts[0])) + { + case 'indexignore': + { + global $hidden_files; + for ($i = 1; $i < count($parts); $i++) + { + $hidden_files[] = $parts[$i]; + } + break; + } + case 'include': + { + if (isset($parts[1]) && @is_file($parts[1]) && @is_readable($parts[1])) + { + self::parse($parts[1]); + } + break; + } + case 'allow': + { + if (isset($parts[1]) && strtolower($parts[1]) === 'from') + { + for ($i = 2; $i < count($parts); $i++) + { + foreach (explode(',', $parts[$i]) as $ip) + { + if (strtolower($ip) === 'all') + { + $this -> allow_list = array('*'); + } + else + { + $this -> allow_list[] = $ip; + } + } + } + } + break; + } + case 'deny': + { + if (isset($parts[1]) && strtolower($parts[1]) === 'from') + { + for ($i = 2; $i < count($parts); $i++) + { + foreach (explode(',', $parts[$i]) as $ip) + { + if (strtolower($ip) === 'all') + { + $this -> deny_list = array('*'); + } + else + { + $this -> deny_list[] = $ip; + } + } + } + } + break; + } + case 'adddescription': + { + global $descriptions; + if (!isset($descriptions)) + { + $descriptions = new ConfigData(false); + } + for ($i = 1; isset($parts[$i], $parts[$i+1]); $i += 2) + { + $descriptions -> set($parts[$i], $parts[$i+1]); + } + break; + } + case 'authuserfile': + { + if (isset($parts[1])) + { + $this -> auth_user_file = str_replace('"', '', implode(' ', array_slice($parts, 1))); + } + break; + } + case 'authname': + { + if (isset($parts[1])) + { + $this -> auth_name = implode(' ', array_slice($parts, 1)); + } + break; + } + case 'order': + { + if (isset($parts[1]) && (strtolower($parts[1]) === 'allow,deny' || strtolower($parts[1]) === 'mutual-failure')) + { + $this -> order = 'allow,deny'; + } + } + case 'require': + { + if (isset($parts[1]) && strtolower($parts[1]) === 'user') + { + for ($i = 2; $i < count($parts); $i++) + { + $this -> auth_required_users[] = $parts[$i]; + } + } + break; + } + } + } + } + + /** + * @param string $dir The deepest folder to parse for .htaccess files + * @param string $filename The name of the files to look for + */ + public function __construct($dir, $filename = '.htaccess') + { + $this -> auth_name = $this -> auth_user_file = ''; + $this -> auth_required_users = $this -> allow_list = $this -> deny_list = array(); + $this -> order = 'deny,allow'; + if (DirItem::get_parent_dir($dir) != '') + //recurse into parent directories + { + new Htaccess(DirItem::get_parent_dir($dir)); + } + $dir = Item::make_sure_slash($dir); + $file = $dir . $filename; + if (@is_file($file) && @is_readable($file)) + { + $this -> parse($dir . $filename); + $this -> check_deny(); + $this -> check_auth(); + } + } +} + +?> \ No newline at end of file diff --git a/classes/Icon.php b/classes/Icon.php new file mode 100755 index 0000000..d61ee7a --- /dev/null +++ b/classes/Icon.php @@ -0,0 +1,148 @@ + + * @version 1.0.2 (August 07, 2004) + * @package AutoIndex + */ +class Icon +{ + /** + * @var string Filename of the image file + */ + private $image_name; + + /** + * Given a file extension, this will come up with the filename of the + * icon to represent the filetype. + * + * @param string $ext The file extension to find the icon for + * @return string The appropriate icon depending on the extension + */ + private static function find_icon($ext) + { + if ($ext == '') + { + return 'generic'; + } + static $icon_types = array( + 'binary' => array('bat', 'bin', 'com', 'dmg', 'dms', 'exe', 'msi', + 'msp', 'pif', 'pyd', 'scr', 'so'), + 'binhex' => array('hqx'), + 'cd' => array('bwi', 'bws', 'bwt', 'ccd', 'cdi', 'cue', 'img', + 'iso', 'mdf', 'mds', 'nrg', 'nri', 'sub', 'vcd'), + 'comp' => array('cfg', 'conf', 'inf', 'ini', 'log', 'nfo', 'reg'), + 'compressed' => array('7z', 'a', 'ace', 'ain', 'alz', 'amg', 'arc', + 'ari', 'arj', 'bh', 'bz', 'bz2', 'cab', 'deb', 'dz', 'gz', + 'io', 'ish', 'lha', 'lzh', 'lzs', 'lzw', 'lzx', 'msx', 'pak', + 'rar', 'rpm', 'sar', 'sea', 'sit', 'taz', 'tbz', 'tbz2', + 'tgz', 'tz', 'tzb', 'uc2', 'xxe', 'yz', 'z', 'zip', 'zoo'), + 'dll' => array('386', 'db', 'dll', 'ocx', 'sdb', 'vxd'), + 'doc' => array('abw', 'ans', 'chm', 'cwk', 'dif', 'doc', 'dot', + 'mcw', 'msw', 'pdb', 'psw', 'rtf', 'rtx', 'sdw', 'stw', 'sxw', + 'vor', 'wk4', 'wkb', 'wpd', 'wps', 'wpw', 'wri', 'wsd'), + 'image' => array('adc', 'art', 'bmp', 'cgm', 'dib', 'gif', 'ico', + 'ief', 'jfif', 'jif', 'jp2', 'jpc', 'jpe', 'jpeg', 'jpg', 'jpx', + 'mng', 'pcx', 'png', 'psd', 'psp', 'swc', 'sxd', 'tga', + 'tif', 'tiff', 'wmf', 'wpg', 'xcf', 'xif', 'yuv'), + 'java' => array('class', 'jar', 'jav', 'java', 'jtk'), + 'js' => array('ebs', 'js', 'jse', 'vbe', 'vbs', 'wsc', 'wsf', + 'wsh'), + 'key' => array('aex', 'asc', 'gpg', 'key', 'pgp', 'ppk'), + 'mov' => array('amc', 'dv', 'm4v', 'mac', 'mov', 'mp4v', 'mpg4', + 'pct', 'pic', 'pict', 'pnt', 'pntg', 'qpx', 'qt', 'qti', + 'qtif', 'qtl', 'qtp', 'qts', 'qtx'), + 'movie' => array('asf', 'asx', 'avi', 'div', 'divx', 'dvi', 'm1v', + 'm2v', 'mkv', 'movie', 'mp2v', 'mpa', 'mpe', 'mpeg', 'mpg', + 'mps', 'mpv', 'mpv2', 'ogm', 'ram', 'rmvb', 'rnx', 'rp', 'rv', + 'vivo', 'vob', 'wmv', 'xvid'), + 'pdf' => array('edn', 'fdf', 'pdf', 'pdp', 'pdx'), + 'php' => array('inc', 'php', 'php3', 'php4', 'php5', 'phps', + 'phtml'), + 'ppt' => array('emf', 'pot', 'ppa', 'pps', 'ppt', 'sda', 'sdd', + 'shw', 'sti', 'sxi'), + 'ps' => array('ai', 'eps', 'ps'), + 'sound' => array('aac', 'ac3', 'aif', 'aifc', 'aiff', 'ape', 'apl', + 'au', 'ay', 'bonk', 'cda', 'cdda', 'cpc', 'fla', 'flac', + 'gbs', 'gym', 'hes', 'iff', 'it', 'itz', 'kar', 'kss', 'la', + 'lpac', 'lqt', 'm4a', 'm4p', 'mdz', 'mid', 'midi', 'mka', + 'mo3', 'mod', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpc', + 'mpga', 'mpm', 'mpp', 'nsf', 'oda', 'ofr', 'ogg', 'pac', 'pce', + 'pcm', 'psf', 'psf2', 'ra', 'rm', 'rmi', 'rmjb', 'rmm', 'sb', + 'shn', 'sid', 'snd', 'spc', 'spx', 'svx', 'tfm', 'tfmx', + 'voc', 'vox', 'vqf', 'wav', 'wave', 'wma', 'wv', 'wvx', 'xa', + 'xm', 'xmz'), + 'tar' => array('gtar', 'tar'), + 'text' => array('asm', 'c', 'cc', 'cp', 'cpp', 'cxx', 'diff', 'h', + 'hpp', 'hxx', 'm3u', 'md5', 'patch', 'pls', 'py', 'sfv', 'sh', + 'txt'), + 'uu' => array('uu', 'uud', 'uue'), + 'web' => array('asa', 'asp', 'aspx', 'cfm', 'cgi', 'css', 'dhtml', + 'dtd', 'grxml', 'htc', 'htm', 'html', 'htt', 'htx', 'jsp', 'lnk', + 'mathml', 'mht', 'mhtml', 'perl', 'pl', 'plg', 'rss', 'shtm', + 'shtml', 'stm', 'swf', 'tpl', 'wbxml', 'xht', 'xhtml', 'xml', + 'xsl', 'xslt', 'xul'), + 'xls' => array('csv', 'dbf', 'prn', 'pxl', 'sdc', 'slk', 'stc', 'sxc', + 'xla', 'xlb', 'xlc', 'xld', 'xlr', 'xls', 'xlt', 'xlw')); + foreach ($icon_types as $png_name => $exts) + { + if (in_array($ext, $exts)) + { + return $png_name; + } + } + return 'unknown'; + } + + /** + * @param string $filename The filename to find the icon for + */ + public function __construct($filename) + { + $this -> image_name = self::find_icon(FileItem::ext($filename)); + } + + /** + * @return string The full path to the icon file + */ + public function __toString() + { + global $config; + return $config -> __get('icon_path') + . $this -> image_name . '.png'; + } +} + +?> \ No newline at end of file diff --git a/classes/Image.php b/classes/Image.php new file mode 100755 index 0000000..30847c3 --- /dev/null +++ b/classes/Image.php @@ -0,0 +1,133 @@ + + * @version 1.0.0 (May 22, 2004) + * @package AutoIndex + */ +class Image +{ + /** + * @var string Name of the image file + */ + private $filename; + + /** + * @var int The height of the thumbnail to create (width is automatically determined) + */ + private $height; + + /** + * Outputs the jpeg image along with the correct headers so the + * browser will display it. The script is then exited. + */ + public function __toString() + { + $thumbnail_height = $this -> height; + $file = $this -> filename; + if (!@is_file($file)) + { + header('HTTP/1.0 404 Not Found'); + throw new ExceptionDisplay('Image file not found: ' + . Url::html_output($file) . ''); + } + switch (FileItem::ext($file)) + { + case 'gif': + { + $src = @imagecreatefromgif($file); + break; + } + case 'jpeg': + case 'jpg': + case 'jpe': + { + $src = @imagecreatefromjpeg($file); + break; + } + case 'png': + { + $src = @imagecreatefrompng($file); + break; + } + default: + { + throw new ExceptionDisplay('Unsupported file extension.'); + } + } + if ($src === false) + { + throw new ExceptionDisplay('Unsupported image type.'); + } + + header('Content-Type: image/jpeg'); + header('Cache-Control: public, max-age=3600, must-revalidate'); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 3600) + . ' GMT'); + $src_height = imagesy($src); + if ($src_height <= $thumbnail_height) + { + imagejpeg($src, '', 95); + } + else + { + $src_width = imagesx($src); + $thumb_width = $thumbnail_height * ($src_width / $src_height); + $thumb = imagecreatetruecolor($thumb_width, $thumbnail_height); + imagecopyresampled($thumb, $src, 0, 0, 0, 0, $thumb_width, + $thumbnail_height, $src_width, $src_height); + imagejpeg($thumb); + imagedestroy($thumb); + } + imagedestroy($src); + die(); + } + + /** + * @param string $file The image file + */ + public function __construct($file) + { + if (!THUMBNAIL_HEIGHT) + { + throw new ExceptionDisplay('Image thumbnailing is turned off.'); + } + global $config; + $this -> height = (int)$config -> __get('thumbnail_height'); + $this -> filename = $file; + } +} + +?> \ No newline at end of file diff --git a/classes/Item.php b/classes/Item.php new file mode 100755 index 0000000..32aee23 --- /dev/null +++ b/classes/Item.php @@ -0,0 +1,218 @@ + + * @version 1.0.1 (July 03, 2004) + * @package AutoIndex + * @see DirItem, FileItem + */ +abstract class Item +{ + /** + * @var string + */ + protected $filename; + + /** + * @var Size + */ + protected $size; + + /** + * @var int Last modified time + */ + protected $m_time; + + /** + * @var int Last accessed time + */ + protected $a_time; + + /** + * @var int + */ + protected $downloads; + + /** + * @var string + */ + protected $description; + + /** + * @var string The HTML text of the link to the type icon + */ + protected $icon; + + /** + * @var string The HTML text of the "[New]" icon + */ + protected $new_icon; + + /** + * @var string The HTML text of the link to this file or folder + */ + protected $link; + + /** + * @var string The HTML text of the link to the thumbnail picture + */ + protected $thumb_link; + + /** + * @var string The HTML text of the link to find the md5sum + */ + protected $md5_link; + + /** + * @var string The name and path of the parent directory + */ + protected $parent_dir; + + /** + * @var bool True if this is a link to '../' + */ + protected $is_parent_dir; + + /** + * @param int $timestamp Time in UNIX timestamp format + * @return string Formatted version of $timestamp + */ + private static function format_date($timestamp) + { + if ($timestamp === false) + { + return ' '; + } + return date(DATE_FORMAT, $timestamp); + } + + /** + * @return string Date modified (m_time) formatted as a string + * @see Item::format_date() + */ + public function format_m_time() + { + return self::format_date($this -> m_time); + } + + /** + * @return string Date last accessed (a_time) formatted as a string + * @see Item::format_date() + */ + public function format_a_time() + { + return self::format_date($this -> a_time); + } + + /** + * Returns everything after the slash, or the original string if there is + * no slash. A slash at the last character of the string is ignored. + * + * @param string $fn The file or folder name + * @return string The basename of $fn + * @see basename() + */ + public static function get_basename($fn) + { + return basename(str_replace('\\', '/', $fn)); + } + + /** + * @param string $path The directory name + * @return string If there is no slash at the end of $path, one will be added + */ + public static function make_sure_slash($path) + { + $path = str_replace('\\', '/', $path); + if (!preg_match('#/$#', $path)) + { + $path .= '/'; + } + return $path; + } + + /** + * @param string $parent_dir + * @param string $filename + */ + public function __construct($parent_dir, $filename) + { + $parent_dir = self::make_sure_slash($parent_dir); + $full_name = $parent_dir . $filename; + $this -> is_parent_dir = false; + $this -> m_time = filemtime($full_name); + $this -> a_time = fileatime($full_name); + $this -> icon = $this -> new_icon = $this -> md5_link = $this -> thumb_link = ''; + global $descriptions; + $this -> description = ((DESCRIPTION_FILE && $descriptions -> is_set($full_name)) ? $descriptions -> __get($full_name) : ' '); + $this -> parent_dir = $parent_dir; + if (DAYS_NEW) + { + global $config; + $days_new = $config -> __get('days_new'); + $age = (time() - $this -> m_time) / 86400; + $age_r = round($age, 1); + $s = (($age_r == 1) ? '' : 's'); + + $this -> new_icon = (($days_new > 0 && $age <= $days_new) ? + (ICON_PATH ? ' ' . ' : ' [New]') : ''); + } + } + + /** + * @param string $var The key to look for + * @return bool True if $var is set + */ + public function is_set($var) + { + return isset($this -> $var); + } + + /** + * @return string The file or folder name + */ + public function __toString() + { + return $this -> filename; + } + + /** + * @return string The file extension of the file or folder name + */ + abstract public function file_ext(); +} + +?> \ No newline at end of file diff --git a/classes/Language.php b/classes/Language.php new file mode 100755 index 0000000..b43e5e2 --- /dev/null +++ b/classes/Language.php @@ -0,0 +1,164 @@ + + * @version 1.0.0 (January 01, 2006) + * @package AutoIndex + */ +class Language +{ + /** + * @var ConfigData Contains the translation data from the language file + */ + private $translation_data; + + /** + * Returns a list of all files in $path that match the filename format + * of language files. + * + * There are two valid formats for the filename of a language file. The + * standard way is the language code then the .txt extension. You can + * also use the language code followed by an underscore then the + * country code. The second format would be used for dialects of + * languages. For example pt.txt would be Portuguese, and pt_BR.txt + * would be Brazilian Portuguese. The filenames are case insensitive. + * + * @param string $path The directory to read from + * @return array The list of valid language files (based on filename) + */ + public static function get_all_langs($path) + { + if (($hndl = @opendir($path)) === false) + { + return false; + } + $list = array(); + while (($file = readdir($hndl)) !== false) + { + if (@is_file($path . $file) && preg_match('/^[a-z]{2}(_[a-z]{2})?' + . preg_quote(LANGUAGE_FILE_EXT, '/') . '$/i', $file)) + { + $list[] = $file; + } + } + closedir($hndl); + for ($i = 0; $i < count($list); $i++) + { + //remove the file extention from each language code + $list[$i] = substr($list[$i], 0, -strlen(LANGUAGE_FILE_EXT)); + } + return $list; + } + + /** + * @return string The code for the language to load + * + * First tries to use the default of the user's browser, and then tries + * the default in the config file. + */ + private function get_current_lang() + { + //try to detect the default language of the user's browser + if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) + //e.g. "en-us,en;q=0.5" + { + $available_langs = self::get_all_langs(PATH_TO_LANGUAGES); + if ($available_langs !== false) + { + $pref = array(); //user's preferred languages + foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) + { + $lang_array = explode(';q=', trim($lang)); + $q = (isset($lang_array[1]) ? trim($lang_array[1]) : 1); //preference value + $pref[trim($lang_array[0])] = (float)$q; + } + arsort($pref); + //find the first match that is available: + foreach ($pref as $lang => $q) + { + if (in_array($lang, $available_langs)) + { + return $lang; + } + } + } + } + //the browser has no preferences set, so use the config's default + global $config; + return $config -> __get('language'); + } + + /** + * Creates a new language object. First tries to use the default of + * the user's browser, and then tries the default in the config file. + */ + public function __construct() + { + $lang_file = PATH_TO_LANGUAGES . $this -> get_current_lang() + . LANGUAGE_FILE_EXT; + if (!@is_readable($lang_file)) + { + throw new ExceptionFatal('Cannot read from language file: ' + . Url::html_output($lang_file) . ''); + } + //load the file as a tab-separated object + $this -> translation_data = new ConfigData($lang_file); + } + + /** + * @param string $name The word to look for + * @return bool True if $name is set in the translation file + */ + public function is_set($name) + { + return $translation_data -> is_set($name); + } + + /** + * @param string $var The key to look for (the keyword) + * @return string The value $name points to (its translation) + */ + public function __get($var) + { + if ($this -> translation_data -> is_set($var)) + { + return $this -> translation_data -> __get($var); + } + throw new ExceptionDisplay('Variable ' . Url::html_output($var) + . ' not set in Language file.'); + } +} + +?> \ No newline at end of file diff --git a/classes/Logging.php b/classes/Logging.php new file mode 100755 index 0000000..709980f --- /dev/null +++ b/classes/Logging.php @@ -0,0 +1,132 @@ + + * @version 1.0.1 (July 21, 2004) + * @package AutoIndex + */ +class Logging +{ + /** + * @var string Filename of the log to write to + */ + private $filename; + + /** + * @param string $filename The name of the log file + */ + public function __construct($filename) + { + $this -> filename = $filename; + } + + /** + * Writes data to the log file. + * + * @param string $extra Any additional data to add in the last column of the entry + */ + public function add_entry($extra = '') + { + if (LOG_FILE) + { + $h = @fopen($this -> filename, 'ab'); + if ($h === false) + { + throw new ExceptionDisplay('Could not open log file for writing.' + . ' Make sure PHP has write permission to this file.'); + } + global $dir, $ip, $host; + $referrer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'N/A'); + fwrite($h, date(DATE_FORMAT) . "\t" . date('H:i:s') + . "\t$ip\t$host\t$referrer\t$dir\t$extra\n"); + fclose($h); + } + } + + /** + * @param int $max_num_to_display + */ + public function display($max_num_to_display) + { + if (!@is_file($this -> filename)) + { + throw new ExceptionDisplay('There are no entries in the log file.'); + } + $file_array = @file($this -> filename); + if ($file_array === false) + { + throw new ExceptionDisplay('Could not open log file for reading.'); + } + $count_log = count($file_array); + $num = (($max_num_to_display == 0) ? $count_log : min($max_num_to_display, $count_log)); + $out = "

Viewing $num (of $count_log) entries.

\n" + . '' + . '' + . '' + . '' + . ''; + for ($i = 0; $i < $num; $i++) + { + $class = (($i % 2) ? 'dark_row' : 'light_row'); + $out .= ''; + $parts = explode("\t", rtrim($file_array[$count_log-$i-1], "\r\n"), 7); + if (count($parts) !== 7) + { + throw new ExceptionDisplay('Incorrect format for log file on line ' + . ($i + 1)); + } + for ($j = 0; $j < 7; $j++) + { + $cell = Url::html_output($parts[$j]); + if ($j === 4 && $cell != 'N/A') + { + $cell = "$cell"; + } + $out .= '' : "$cell"); + } + $out .= "\n"; + } + global $words; + $out .= '
#DateTimeIP addressHostnameReferrerDirectoryFile downloaded or other info
' . ($i + 1) . '' . (($cell == '') ? ' 

' . $words -> __get('continue') + . '.

'; + echo new Display($out); + die(); + } +} + +?> \ No newline at end of file diff --git a/classes/MimeType.php b/classes/MimeType.php new file mode 100755 index 0000000..95cde31 --- /dev/null +++ b/classes/MimeType.php @@ -0,0 +1,200 @@ + + * @version 1.0.1 (February 09, 2005) + * @package AutoIndex + */ +class MimeType +{ + /** + * @var string The filename's MIME-type + */ + private $mime; + + /** + * @var string The default MIME-type to return + */ + private $default_type; + + /** + * Given a file extension, this will come up with the file's appropriate + * MIME-type. + * + * @param string $ext The file extension to find the MIME-type for + * @return string The appropriate MIME-type depending on the extension + */ + private function find_mime_type($ext) + { + static $mime_types = array( + 'application/andrew-inset' => array('ez'), + 'application/mac-binhex40' => array('hqx'), + 'application/mac-compactpro' => array('cpt'), + 'application/mathml+xml' => array('mathml'), + 'application/msword' => array('doc'), + 'application/octet-stream' => array('bin', 'dms', 'lha', + 'lzh', 'exe', 'class', 'so', 'dll', 'dmg'), + 'application/oda' => array('oda'), + 'application/ogg' => array('ogg'), + 'application/pdf' => array('pdf'), + 'application/postscript' => array('ai', 'eps', 'ps'), + 'application/rdf+xml' => array('rdf'), + 'application/smil' => array('smi', 'smil'), + 'application/srgs' => array('gram'), + 'application/srgs+xml' => array('grxml'), + 'application/vnd.mif' => array('mif'), + 'application/vnd.mozilla.xul+xml' => array('xul'), + 'application/vnd.ms-excel' => array('xls'), + 'application/vnd.ms-powerpoint' => array('ppt'), + 'application/vnd.wap.wbxml' => array('wbxml'), + 'application/vnd.wap.wmlc' => array('wmlc'), + 'application/vnd.wap.wmlscriptc' => array('wmlsc'), + 'application/voicexml+xml' => array('vxml'), + 'application/x-bcpio' => array('bcpio'), + 'application/x-cdlink' => array('vcd'), + 'application/x-chess-pgn' => array('pgn'), + 'application/x-cpio' => array('cpio'), + 'application/x-csh' => array('csh'), + 'application/x-director' => array('dcr', 'dir', 'dxr'), + 'application/x-dvi' => array('dvi'), + 'application/x-futuresplash' => array('spl'), + 'application/x-gtar' => array('gtar'), + 'application/x-hdf' => array('hdf'), + 'application/x-javascript' => array('js'), + 'application/x-koan' => array('skp', 'skd', 'skt', 'skm'), + 'application/x-latex' => array('latex'), + 'application/x-netcdf' => array('nc', 'cdf'), + 'application/x-sh' => array('sh'), + 'application/x-shar' => array('shar'), + 'application/x-shockwave-flash' => array('swf'), + 'application/x-stuffit' => array('sit'), + 'application/x-sv4cpio' => array('sv4cpio'), + 'application/x-sv4crc' => array('sv4crc'), + 'application/x-tar' => array('tar'), + 'application/x-tcl' => array('tcl'), + 'application/x-tex' => array('tex'), + 'application/x-texinfo' => array('texinfo', 'texi'), + 'application/x-troff' => array('t', 'tr', 'roff'), + 'application/x-troff-man' => array('man'), + 'application/x-troff-me' => array('me'), + 'application/x-troff-ms' => array('ms'), + 'application/x-ustar' => array('ustar'), + 'application/x-wais-source' => array('src'), + 'application/xhtml+xml' => array('xhtml', 'xht'), + 'application/xslt+xml' => array('xslt'), + 'application/xml' => array('xml', 'xsl'), + 'application/xml-dtd' => array('dtd'), + 'application/zip' => array('zip'), + 'audio/basic' => array('au', 'snd'), + 'audio/midi' => array('mid', 'midi', 'kar'), + 'audio/mpeg' => array('mpga', 'mp2', 'mp3'), + 'audio/x-aiff' => array('aif', 'aiff', 'aifc'), + 'audio/x-mpegurl' => array('m3u'), + 'audio/x-pn-realaudio' => array('ram', 'ra'), + 'application/vnd.rn-realmedia' => array('rm'), + 'audio/x-wav' => array('wav'), + 'chemical/x-pdb' => array('pdb'), + 'chemical/x-xyz' => array('xyz'), + 'image/bmp' => array('bmp'), + 'image/cgm' => array('cgm'), + 'image/gif' => array('gif'), + 'image/ief' => array('ief'), + 'image/jpeg' => array('jpeg', 'jpg', 'jpe'), + 'image/png' => array('png'), + 'image/svg+xml' => array('svg'), + 'image/tiff' => array('tiff', 'tif'), + 'image/vnd.djvu' => array('djvu', 'djv'), + 'image/vnd.wap.wbmp' => array('wbmp'), + 'image/x-cmu-raster' => array('ras'), + 'image/x-icon' => array('ico'), + 'image/x-portable-anymap' => array('pnm'), + 'image/x-portable-bitmap' => array('pbm'), + 'image/x-portable-graymap' => array('pgm'), + 'image/x-portable-pixmap' => array('ppm'), + 'image/x-rgb' => array('rgb'), + 'image/x-xbitmap' => array('xbm'), + 'image/x-xpixmap' => array('xpm'), + 'image/x-xwindowdump' => array('xwd'), + 'model/iges' => array('igs', 'iges'), + 'model/mesh' => array('msh', 'mesh', 'silo'), + 'model/vrml' => array('wrl', 'vrml'), + 'text/calendar' => array('ics', 'ifb'), + 'text/css' => array('css'), + 'text/html' => array('html', 'htm'), + 'text/plain' => array('asc', 'txt'), + 'text/richtext' => array('rtx'), + 'text/rtf' => array('rtf'), + 'text/sgml' => array('sgml', 'sgm'), + 'text/tab-separated-values' => array('tsv'), + 'text/vnd.wap.wml' => array('wml'), + 'text/vnd.wap.wmlscript' => array('wmls'), + 'text/x-setext' => array('etx'), + 'video/mpeg' => array('mpeg', 'mpg', 'mpe'), + 'video/quicktime' => array('qt', 'mov'), + 'video/vnd.mpegurl' => array('mxu', 'm4u'), + 'video/x-msvideo' => array('avi'), + 'video/x-sgi-movie' => array('movie'), + 'x-conference/x-cooltalk' => array('ice') + ); + foreach ($mime_types as $mime_type => $exts) + { + if (in_array($ext, $exts)) + { + return $mime_type; + } + } + return $this -> default_type; + } + + /** + * @param string $filename The filename to find the MIME-type for + * @param string $default_type The default MIME-type to return + */ + public function __construct($filename, $default_type = 'text/plain') + { + $this -> default_type = $default_type; + $this -> mime = $this -> find_mime_type(FileItem::ext($filename)); + } + + /** + * @return string + */ + public function __toString() + { + return $this -> mime; + } +} + +?> \ No newline at end of file diff --git a/classes/Search.php b/classes/Search.php new file mode 100755 index 0000000..d13f854 --- /dev/null +++ b/classes/Search.php @@ -0,0 +1,189 @@ + + * @version 1.0.3 (July 06, 2005) + * @package AutoIndex + */ +class Search extends DirectoryListDetailed +{ + /** + * @var array List of matched filenames + */ + private $matches; + + /** + * @return string The HTML text that makes up the search box + */ + public static function search_box() + { + global $words, $subdir; + $search = (isset($_GET['search']) ? Url::html_output($_GET['search']) : ''); + $mode = (isset($_GET['search_mode']) ? self::clean_mode($_GET['search_mode']) : 'f'); + $modes = array('files' => 'f', 'folders' => 'd', 'both' => 'fd'); + $out = '
' + . '

' + . '

'; + return $out; + } + + /** + * @param string $filename + * @param string $string + * @return bool True if string matches filename + */ + private static function match(&$filename, &$string) + { + if (preg_match_all('/(?<=")[^"]+(?=")|[^ "]+/', $string, $matches)) + { + foreach ($matches[0] as $w) + { + if (stripos($filename, $w) !== false) + { + return true; + } + } + } + return false; + } + + /** + * Merges $obj into $this. + * + * @param Search $obj + */ + private function merge(Search $obj) + { + $this -> total_folders += $obj -> __get('total_folders'); + $this -> total_files += $obj -> __get('total_files'); + $this -> total_downloads += $obj -> __get('total_downloads'); + $this -> total_size -> add_size($obj -> __get('total_size')); + $this -> matches = array_merge($this -> matches, $obj -> __get('contents')); + } + + /** + * Returns a string with all characters except 'd' and 'f' stripped. + * Either 'd' 'f' 'df' will be returned, defaults to 'f' + * + * @param string $mode + * @return string + */ + private static function clean_mode($mode) + { + $str = ''; + if (stripos($mode, 'f') !== false) + { + $str .= 'f'; + } + if (stripos($mode, 'd') !== false) + { + $str .= 'd'; + } + else if ($str == '') + { + $str = 'f'; + } + return $str; + } + + /** + * @param string $query String to search for + * @param string $dir The folder to search (recursive) + * @param string $mode Should be f (files), d (directories), or fd (both) + */ + public function __construct($query, $dir, $mode) + { + if (strlen($query) < 2 || strlen($query) > 20) + { + throw new ExceptionDisplay('Search query is either too long or too short.'); + } + $mode = self::clean_mode($mode); + $dir = Item::make_sure_slash($dir); + DirectoryList::__construct($dir); + $this -> matches = array(); + $this -> total_size = new Size(0); + $this -> total_downloads = $this -> total_folders = $this -> total_files = 0; + foreach ($this as $item) + { + if ($item == '..') + { + continue; + } + if (@is_dir($dir . $item)) + { + if (stripos($mode, 'd') !== false && self::match($item, $query)) + { + $temp = new DirItem($dir, $item); + $this -> matches[] = $temp; + if ($temp -> __get('size') -> __get('bytes') !== false) + { + $this -> total_size -> add_size($temp -> __get('size')); + } + $this -> total_folders++; + } + $sub_search = new Search($query, $dir . $item, $mode); + $this -> merge($sub_search); + } + else if (stripos($mode, 'f') !== false && self::match($item, $query)) + { + $temp = new FileItem($dir, $item); + $this -> matches[] = $temp; + $this -> total_size -> add_size($temp -> __get('size')); + $this -> total_downloads += $temp -> __get('downloads'); + $this -> total_files++; + } + } + global $words, $config, $subdir; + $link = ' ' + . Url::html_output($dir) . ' '; + $this -> path_nav = $words -> __get('search results for') + . $link . $words -> __get('and its subdirectories'); + $this -> contents = $this -> matches; + unset($this -> matches); + } +} + +?> \ No newline at end of file diff --git a/classes/Size.php b/classes/Size.php new file mode 100755 index 0000000..4b7c21a --- /dev/null +++ b/classes/Size.php @@ -0,0 +1,112 @@ + + * @version 1.0.1 (July 15, 2004) + * @package AutoIndex + */ +class Size +{ + /** + * @var int Size in bytes + */ + private $bytes; + + /** + * @return string Returns $bytes formatted as a string + */ + public function formatted() + { + $size = $this -> bytes; + if ($size === true) + //used for the parent directory + { + return ' '; + } + if ($size === false) + //used for regular directories (if SHOW_DIR_SIZE is false) + { + return '[dir]'; + } + static $u = array(' B', 'KB', 'MB', 'GB'); + for ($i = 0; $size >= 1024 && $i < 4; $i++) + { + $size /= 1024; + } + return number_format($size, 1) . ' ' . $u[$i]; + } + + /** + * Adds the size of $s into $this + * + * @param Size $s + */ + public function add_size(Size $s) + { + $temp = $s -> __get('bytes'); + if (is_int($temp)) + { + $this -> bytes += $temp; + } + } + + /** + * True if parent directory, + * False if directory, + * Integer for an actual size. + * + * @param mixed $bytes + */ + public function __construct($bytes) + { + $this -> bytes = ((is_bool($bytes)) ? $bytes : max((int)$bytes, 0)); + } + + /** + * @param string $var The key to look for + * @return string The value $name points to + */ + public function __get($var) + { + if (isset($this -> $var)) + { + return $this -> $var; + } + throw new ExceptionDisplay('Variable ' . Url::html_output($var) + . ' not set in Size class.'); + } +} + +?> \ No newline at end of file diff --git a/classes/Stats.php b/classes/Stats.php new file mode 100755 index 0000000..f535aac --- /dev/null +++ b/classes/Stats.php @@ -0,0 +1,498 @@ + + * @version 1.0.1 (July 12, 2004) + * @package AutoIndex + */ +class Stats +{ + /** + * @var array Stores number of downloads per file extension + */ + private $extensions; + + /** + * @var array Hits per day + */ + private $dates; + + /** + * @var array Unique hits per day + */ + private $unique_hits; + + /** + * @var array Keys are the country codes and values are the number of visits + */ + private $countries; + + /** + * @var int Total views of the base_dir + */ + private $total_hits; + + /** + * @var int The number of days that there is a log entry for + */ + private $num_days; + + /** + * @var int Average hits per day ($total_hits / $num_days) + */ + private $avg; + + /** + * Returns $num formatted with a color (green for positive numbers, red + * for negative numbers, and black for 0). + * + * @param int $num + * @return string + */ + private static function get_change_color($num) + { + if ($num > 0) + { + return '+'; + } + if ($num < 0) + { + return ''; + } + return ''; + } + + /** + * If $array[$num] is set, it will be incremented by 1, otherwise it will + * be set to 1. + * + * @param int $num + * @param array $array + */ + private static function add_num_to_array($num, &$array) + { + isset($array[$num]) ? $array[$num]++ : $array[$num] = 1; + } + + /** + * Reads the log file, and sets the member variables after doing + * calculations. + */ + public function __construct() + { + $extensions = $dates = $unique_hits = $countries = array(); + $total_hits = 0; + global $config; + $log_file = $config -> __get('log_file'); + $base_dir = $config -> __get('base_dir'); + $h = @fopen($log_file, 'rb'); + if ($h === false) + { + throw new ExceptionDisplay("Cannot open log file: $log_file"); + } + while (!feof($h)) + { + $entries = explode("\t", rtrim(fgets($h, 1024), "\r\n")); + if (count($entries) === 7) + { + //find the number of unique visits + if ($entries[5] == $base_dir) + { + $total_hits++; + if (!in_array($entries[3], $unique_hits)) + { + $unique_hits[] = Url::html_output($entries[3]); + } + + //find country codes by hostnames + $cc = FileItem::ext($entries[3]); + if (preg_match('/^[a-z]+$/i', $cc)) + { + self::add_num_to_array($cc, $countries); + } + + //find the dates of the visits + self::add_num_to_array($entries[0], $dates); + } + + //find file extensions + $ext = FileItem::ext($entries[6]); + if (preg_match('/^[\w-]+$/', $ext)) + { + self::add_num_to_array($ext, $extensions); + } + } + } + fclose($h); + $this -> num_days = count($dates); + $this -> avg = round($total_hits / $this -> num_days); + $this -> extensions = $extensions; + $this -> dates = $dates; + $this -> unique_hits = $unique_hits; + $this -> countries = $countries; + $this -> total_hits = $total_hits; + } + + /** + * Uses the display class to output results. + */ + public function display() + { + static $country_codes = array( + 'af' => 'Afghanistan', + 'al' => 'Albania', + 'dz' => 'Algeria', + 'as' => 'American Samoa', + 'ad' => 'Andorra', + 'ao' => 'Angola', + 'ai' => 'Anguilla', + 'aq' => 'Antarctica', + 'ag' => 'Antigua and Barbuda', + 'ar' => 'Argentina', + 'am' => 'Armenia', + 'aw' => 'Aruba', + 'au' => 'Australia', + 'at' => 'Austria', + 'ax' => 'Ålang Islands', + 'az' => 'Azerbaidjan', + 'bs' => 'Bahamas', + 'bh' => 'Bahrain', + 'bd' => 'Banglades', + 'bb' => 'Barbados', + 'by' => 'Belarus', + 'be' => 'Belgium', + 'bz' => 'Belize', + 'bj' => 'Benin', + 'bm' => 'Bermuda', + 'bo' => 'Bolivia', + 'ba' => 'Bosnia-Herzegovina', + 'bw' => 'Botswana', + 'bv' => 'Bouvet Island', + 'br' => 'Brazil', + 'io' => 'British Indian O. Terr.', + 'bn' => 'Brunei Darussalam', + 'bg' => 'Bulgaria', + 'bf' => 'Burkina Faso', + 'bi' => 'Burundi', + 'bt' => 'Buthan', + 'kh' => 'Cambodia', + 'cm' => 'Cameroon', + 'ca' => 'Canada', + 'cv' => 'Cape Verde', + 'ky' => 'Cayman Islands', + 'cf' => 'Central African Rep.', + 'td' => 'Chad', + 'cl' => 'Chile', + 'cn' => 'China', + 'cx' => 'Christmas Island', + 'cc' => 'Cocos (Keeling) Isl.', + 'co' => 'Colombia', + 'km' => 'Comoros', + 'cg' => 'Congo', + 'ck' => 'Cook Islands', + 'cr' => 'Costa Rica', + 'hr' => 'Croatia', + 'cu' => 'Cuba', + 'cy' => 'Cyprus', + 'cz' => 'Czech Republic', + 'cs' => 'Czechoslovakia', + 'dk' => 'Denmark', + 'dj' => 'Djibouti', + 'dm' => 'Dominica', + 'do' => 'Dominican Republic', + 'tp' => 'East Timor', + 'ec' => 'Ecuador', + 'eg' => 'Egypt', + 'sv' => 'El Salvador', + 'gq' => 'Equatorial Guinea', + 'ee' => 'Estonia', + 'et' => 'Ethiopia', + 'fk' => 'Falkland Isl. (UK)', + 'fo' => 'Faroe Islands', + 'fj' => 'Fiji', + 'fi' => 'Finland', + 'fr' => 'France', + 'fx' => 'France (European Terr.)', + 'tf' => 'French Southern Terr.', + 'ga' => 'Gabon', + 'gm' => 'Gambia', + 'ge' => 'Georgia', + 'de' => 'Germany', + 'gh' => 'Ghana', + 'gi' => 'Gibraltar', + 'gb' => 'Great Britain (UK)', + 'gr' => 'Greece', + 'gl' => 'Greenland', + 'gd' => 'Grenada', + 'gp' => 'Guadeloupe (Fr)', + 'gu' => 'Guam (US)', + 'gt' => 'Guatemala', + 'gn' => 'Guinea', + 'gw' => 'Guinea Bissau', + 'gy' => 'Guyana', + 'gf' => 'Guyana (Fr)', + 'ht' => 'Haiti', + 'hm' => 'Heard & McDonald Isl.', + 'hn' => 'Honduras', + 'hk' => 'Hong Kong', + 'hu' => 'Hungary', + 'is' => 'Iceland', + 'in' => 'India', + 'id' => 'Indonesia', + 'ir' => 'Iran', + 'iq' => 'Iraq', + 'ie' => 'Ireland', + 'il' => 'Israel', + 'it' => 'Italy', + 'ci' => 'Ivory Coast', + 'jm' => 'Jamaica', + 'jp' => 'Japan', + 'jo' => 'Jordan', + 'kz' => 'Kazachstan', + 'ke' => 'Kenya', + 'kg' => 'Kirgistan', + 'ki' => 'Kiribati', + 'kp' => 'North Korea', + 'kr' => 'South Korea', + 'kw' => 'Kuwait', + 'la' => 'Laos', + 'lv' => 'Latvia', + 'lb' => 'Lebanon', + 'ls' => 'Lesotho', + 'lr' => 'Liberia', + 'ly' => 'Libya', + 'li' => 'Liechtenstein', + 'lt' => 'Lithuania', + 'lu' => 'Luxembourg', + 'mo' => 'Macau', + 'mg' => 'Madagascar', + 'mw' => 'Malawi', + 'my' => 'Malaysia', + 'mv' => 'Maldives', + 'ml' => 'Mali', + 'mt' => 'Malta', + 'mh' => 'Marshall Islands', + 'mk' => 'Macedonia', + 'mq' => 'Martinique (Fr.)', + 'mr' => 'Mauritania', + 'mu' => 'Mauritius', + 'mx' => 'Mexico', + 'fm' => 'Micronesia', + 'md' => 'Moldavia', + 'mc' => 'Monaco', + 'mn' => 'Mongolia', + 'ms' => 'Montserrat', + 'ma' => 'Morocco', + 'mz' => 'Mozambique', + 'mm' => 'Myanmar', + 'na' => 'Namibia', + 'nr' => 'Nauru', + 'np' => 'Nepal', + 'an' => 'Netherland Antilles', + 'nl' => 'Netherlands', + 'nt' => 'Neutral Zone', + 'nc' => 'New Caledonia (Fr.)', + 'nz' => 'New Zealand', + 'ni' => 'Nicaragua', + 'ne' => 'Niger', + 'ng' => 'Nigeria', + 'nu' => 'Niue', + 'nf' => 'Norfolk Island', + 'mp' => 'Northern Mariana Isl.', + 'no' => 'Norway', + 'om' => 'Oman', + 'pk' => 'Pakistan', + 'pw' => 'Palau', + 'pa' => 'Panama', + 'pg' => 'Papua New Guinea', + 'py' => 'Paraguay', + 'pe' => 'Peru', + 'ph' => 'Philippines', + 'pn' => 'Pitcairn', + 'pl' => 'Poland', + 'pf' => 'Polynesia (Fr.)', + 'pt' => 'Portugal', + 'pr' => 'Puerto Rico (US)', + 'qa' => 'Qatar', + 're' => 'Réunion (Fr.)', + 'ro' => 'Romania', + 'ru' => 'Russian Federation', + 'rw' => 'Rwanda', + 'lc' => 'Saint Lucia', + 'ws' => 'Samoa', + 'sm' => 'San Marino', + 'sa' => 'Saudi Arabia', + 'sn' => 'Senegal', + 'sc' => 'Seychelles', + 'sl' => 'Sierra Leone', + 'sg' => 'Singapore', + 'sk' => 'Slovak Republic', + 'si' => 'Slovenia', + 'sb' => 'Solomon Islands', + 'so' => 'Somalia', + 'za' => 'South Africa', + 'su' => 'Soviet Union', + 'es' => 'Spain', + 'lk' => 'Sri Lanka', + 'sh' => 'St. Helena', + 'pm' => 'St. Pierre & Miquelon', + 'st' => 'St. Tome and Principe', + 'kn' => 'St. Kitts Nevis Anguilla', + 'vc' => 'St. Vincent & Grenadines', + 'sd' => 'Sudan', + 'sr' => 'Suriname', + 'sj' => 'Svalbard & Jan Mayen Isl.', + 'sz' => 'Swaziland', + 'se' => 'Sweden', + 'ch' => 'Switzerland', + 'sy' => 'Syria', + 'tj' => 'Tadjikistan', + 'tw' => 'Taiwan', + 'tz' => 'Tanzania', + 'th' => 'Thailand', + 'tg' => 'Togo', + 'tk' => 'Tokelau', + 'to' => 'Tonga', + 'tt' => 'Trinidad & Tobago', + 'tn' => 'Tunisia', + 'tr' => 'Turkey', + 'tm' => 'Turkmenistan', + 'tc' => 'Turks & Caicos Islands', + 'tv' => 'Tuvalu', + 'ug' => 'Uganda', + 'ua' => 'Ukraine', + 'ae' => 'United Arab Emirates', + 'uk' => 'United Kingdom', + 'us' => 'United States', + 'uy' => 'Uruguay', + 'um' => 'US Minor outlying Isl.', + 'uz' => 'Uzbekistan', + 'vu' => 'Vanuatu', + 'va' => 'Vatican City State', + 've' => 'Venezuela', + 'vn' => 'Vietnam', + 'vg' => 'Virgin Islands (British)', + 'vi' => 'Virgin Islands (US)', + 'wf' => 'Wallis & Futuna Islands', + 'wlk' => 'Wales', + 'eh' => 'Western Sahara', + 'ye' => 'Yemen', + 'yu' => 'Yugoslavia', + 'zr' => 'Zaire', + 'zm' => 'Zambia', + 'zw' => 'Zimbabwe', + 'mil' => 'United States Military', + 'gov' => 'United States Government', + 'com' => 'Commercial', + 'net' => 'Network', + 'org' => 'Non-Profit Organization', + 'edu' => 'Educational', + 'int' => 'International', + 'aero' => 'Air Transport Industry', + 'biz' => 'Businesses', + 'coop' => 'Non-profit cooperatives', + 'arpa' => 'Arpanet', + 'info' => 'Info', + 'name' => 'Name', + 'nato' => 'Nato', + 'museum' => 'Museum', + 'pro' => 'Pro' + ); + + $str = ' + ' + . " + +
 TotalDaily
Hits{$this -> total_hits}{$this -> avg}" + . '
Unique Hits' . count($this -> unique_hits) + . '' + . round(count($this -> unique_hits) / $this -> num_days) + . '

Percent Unique: ' + . number_format(count($this -> unique_hits) / $this -> total_hits * 100, 1) . '

'; + + arsort($this -> extensions); + arsort($this -> countries); + + $date_nums = array_values($this -> dates); + $str .= ' + + '; + $i = 0; + foreach ($this -> dates as $day => $num) + { + $diff = $num - $this -> avg; + $change = (($i > 0) ? ($num - $date_nums[$i-1]) : 0); + $change_color = self::get_change_color($change); + $diff_color = self::get_change_color($diff); + $class = (($i++ % 2) ? 'dark_row' : 'light_row'); + $str .= " + + + "; + } + + $str .= '
DateHits That DayChange From Previous DayDifference From Average (' . $this -> avg + . ')
$day$num$change_color$change$diff_color$diff

+ + '; + $i = 0; + foreach ($this -> extensions as $ext => $num) + { + $class = (($i++ % 2) ? 'dark_row' : 'light_row'); + $str .= " + "; + } + + $str .= '
Downloads based on file extensionsTotalDaily
$ext$num" + . number_format($num / $this -> num_days, 1) . "

+ + '; + $i = 0; + foreach ($this -> countries as $c => $num) + { + $c_code = (isset($country_codes[strtolower($c)]) ? ' (' + . $country_codes[strtolower($c)] . ')' : ''); + $class = (($i++ % 2) ? 'dark_row' : 'light_row'); + $str .= "\n"; + } + $str .= '
Hostname ISP extensionTotalDaily
$c{$c_code}$num" + . number_format($num / $this -> num_days, 1) . "

Continue.

'; + echo new Display($str); + die(); + } +} + +?> \ No newline at end of file diff --git a/classes/Tar.php b/classes/Tar.php new file mode 100755 index 0000000..3f41bcc --- /dev/null +++ b/classes/Tar.php @@ -0,0 +1,128 @@ + + * @version 1.0.1 (July 03, 2004) + * @package AutoIndex + */ +class Tar +{ + /** + * @var int Length of directory path to cut off from start + */ + private $base_dir_length; + + /** + * @var string Added in the filepath inside the tar archive + */ + private $prepend_path; + + /** + * @param string $data + * @return int The checksum of $data + */ + private static function checksum(&$data) + { + $unsigned_chksum = 0; + for ($i = 0; $i < 512; $i++) + { + $unsigned_chksum += ord($data{$i}); + } + for ($i = 148; $i < 156; $i++) + { + $unsigned_chksum -= ord($data{$i}); + } + return $unsigned_chksum + 256; + } + + /** + * @param string $name The file or folder name + * @param int $size The size of the file (0 for directories) + * @param bool $is_dir True if folder, false if file + */ + private function create_header($name, $size = 0, $is_dir = true) + { + $header = str_pad($this -> prepend_path . substr($name, $this -> base_dir_length), 100, "\0") //filename + . str_pad('755', 7, '0', STR_PAD_LEFT) . "\0" //permissions + . '0000000' . "\0" //uid + . '0000000' . "\0" //gid + . str_pad(decoct($size), 11, '0', STR_PAD_LEFT) . "\0" //size + . str_pad(decoct(filemtime($name)), 11, '0', STR_PAD_LEFT) . "\0" //time + . ' ' //checksum (8 spaces) + . ($is_dir ? '5' : '0') //typeflag + . str_repeat("\0", 100) //linkname + . 'ustar ' //magic + /* + * version (1) + username (32) + groupname (32) + devmajor (8) + + * devminor (8) + prefix (155) + end (12) = 248 + */ + . str_repeat("\0", 248); + + $checksum = str_pad(decoct(self::checksum($header)), 6, '0', STR_PAD_LEFT) . "\0 "; + return substr_replace($header, $checksum, 148, strlen($checksum)); + } + + /** + * @param DirectoryList $filenames List of files to add to the archive + * @param string $prepend_path Added in the filepath inside the tar archive + * @param int $base_dir_length Length of directory path to cut off from start + */ + public function __construct(DirectoryList $filenames, $prepend_path = '', $base_dir_length = 0) + { + $this -> base_dir_length = (int)$base_dir_length; + $this -> prepend_path = Item::make_sure_slash($prepend_path); + foreach ($filenames as $base) + { + $name = $filenames -> __get('dir_name') . $base; + if (@is_dir($name)) + { + if ($base != '.' && $base != '..') + { + echo $this -> create_header($name); + $list = new DirectoryList($name); + new Tar($list, $this -> prepend_path, $this -> base_dir_length); + } + } + else if (@is_file($name) && @is_readable($name) && ($size = @filesize($name))) + { + echo $this -> create_header($name, $size, false); + Url::force_download($name, false); + echo str_repeat("\0", (ceil($size / 512) * 512) - $size); + } + } + } +} + +?> \ No newline at end of file diff --git a/classes/Template.php b/classes/Template.php new file mode 100755 index 0000000..56f69e4 --- /dev/null +++ b/classes/Template.php @@ -0,0 +1,146 @@ + + * @version 1.0.3 (February 02, 2005) + * @package AutoIndex + */ +class Template +{ + /** + * @var string The final output + */ + protected $out; + + /** + * @param array $m The array given by preg_replace_callback() + * @return string Looks up $m[1] in word list and returns match + */ + private static function callback_words($m) + { + global $words; + return $words -> __get(strtolower($m[1])); + } + + /** + * @param array $m The array given by preg_replace_callback() + * @return string The parsed template of filename $m[1] + */ + private static function callback_include($m) + { + $temp = new Template($m[1]); + return $temp -> __toString(); + } + + /** + * @param array $m The array given by preg_replace_callback() + * @return string The setting for the config value $m[1] + */ + private static function callback_config($m) + { + global $config; + return $config -> __get(strtolower($m[1])); + } + + /** + * Parses the text in $filename and sets the result to $out. We cannot + * use ExceptionDisplay here if there is an error, since it uses the + * template system. + * + * Steps to parse the template: + * - remove comments + * - replace {info} variables + * - replace {words} strings + * - replace {config} variables + * - include other files when we see the {include} statement + * + * @param string $filename The name of the file to parse + */ + public function __construct($filename) + { + global $config, $dir, $subdir; + $full_filename = $config -> __get('template') . $filename; + if (!@is_file($full_filename)) + { + throw new ExceptionFatal('Template file ' + . Url::html_output($full_filename) . ' cannot be found.'); + } + + //read raw file contents + $contents = @file_get_contents($full_filename); + if ($contents === false) + { + throw new ExceptionFatal('Template file ' + . Url::html_output($full_filename) . ' could not be opened for reading.'); + } + + //remove comments + $contents = preg_replace('#/\*.*?\*/#s', '', $contents); + + //replace info variables and word strings from language file + $tr = array( + '{info:dir}' => (isset($dir) ? Url::html_output($dir) : ''), + '{info:subdir}' => (isset($subdir) ? Url::html_output($subdir) : ''), + '{info:version}' => VERSION, + '{info:page_time}' => round((microtime(true) - START_TIME) * 1000, 1)); + $contents = preg_replace_callback('/\{\s*words?\s*:\s*(.+)\s*\}/Ui', + array('self', 'callback_words'), strtr($contents, $tr)); + + //replace {config} variables + $contents = preg_replace_callback('/\{\s*config\s*:\s*(.+)\s*\}/Ui', + array('self', 'callback_config'), $contents); + + //parse includes + $this -> out = preg_replace_callback('/\{\s*include\s*:\s*(.+)\s*\}/Ui', + array('self', 'callback_include'), $contents); + } + + /** + * @return string The HTML text of the parsed template + */ + public function __toString() + { + return $this -> out; + } +} + +?> diff --git a/classes/TemplateFiles.php b/classes/TemplateFiles.php new file mode 100755 index 0000000..f93fb42 --- /dev/null +++ b/classes/TemplateFiles.php @@ -0,0 +1,244 @@ + + * @version 1.0.1 (July 09, 2004) + * @package AutoIndex + */ +class TemplateFiles extends TemplateInfo +{ + /** + * @var Item The file or folder we're currently processing + */ + private $temp_item; + + /** + * @var bool Is the current user an admin + */ + private $is_admin; + + /** + * @var bool Is the current user a moderator + */ + private $is_mod; + + /** + * @var int The number of the file we're currently processing + */ + private $i; + + /** + * @var int The total number of files to process + */ + private $length; + + /** + * @param array $m The array given by preg_replace_callback() + * @return string Property is gotten from temp_item + */ + private function callback_file($m) + { + global $words, $subdir; + switch (strtolower($m[1])) + { + case 'tr_class': + { + return (($this -> i % 2) ? 'dark_row' : 'light_row'); + } + case 'filename': + { + return Url::html_output($this -> temp_item -> __get('filename')); + } + case 'file_ext': + { + return $this -> temp_item -> file_ext(); + } + case 'size': + { + return $this -> temp_item -> __get('size') -> formatted(); + } + case 'bytes': + { + return $this -> temp_item -> __get('size') -> __get('bytes'); + } + case 'date': + case 'time': + case 'm_time': + { + return $this -> temp_item -> format_m_time(); + } + case 'a_time': + { + return $this -> temp_item -> format_a_time(); + } + case 'thumbnail': + { + return $this -> temp_item -> __get('thumb_link'); + } + case 'num_subfiles': + { + return (($this -> temp_item instanceof DirItem + && !$this -> temp_item -> __get('is_parent_dir')) ? $this -> temp_item -> num_subfiles() : ''); + } + case 'delete_link': + { + return (($this -> is_admin && !$this -> temp_item -> __get('is_parent_dir')) ? + ' [' . $words -> __get('delete') . ']' : ''); + } + case 'rename_link': + { + return (($this -> is_admin && !$this -> temp_item -> __get('is_parent_dir')) ? + ' [' . $words -> __get('rename') . ']' : ''); + } + case 'edit_description_link': + { + $slash = (($this -> temp_item instanceof DirItem) ? '/' : ''); + return (($this -> is_mod && DESCRIPTION_FILE && !$this -> temp_item -> __get('is_parent_dir')) ? + ' [' + . $words -> __get('edit description') . ']' : ''); + } + case 'ftp_upload_link': + { + if (!$this -> is_mod || !$this -> temp_item instanceof FileItem || !isset($_SESSION['ftp'])) + { + return ''; + } + return ' [' . $words->__get('upload to ftp') . ']'; + } + default: + { + return $this -> temp_item -> __get($m[1]); + } + } + } + + /** + * Either the HTML text is returned, or an empty string is returned, + * depending on if the if-statement passed. + * + * @param array $m The array given by preg_replace_callback() + * @return string The result to insert into the HTML + */ + private function callback_type($m) + { + switch (strtolower($m[1])) + { + case 'is_file': //file + { + return (($this -> temp_item instanceof FileItem) ? $m[2] : ''); + } + case 'is_dir': //folder or link to parent directory + { + return (($this -> temp_item instanceof DirItem) ? $m[2] : ''); + } + case 'is_real_dir': //folder + { + return (($this -> temp_item instanceof DirItem + && !$this -> temp_item -> __get('is_parent_dir')) ? $m[2] : ''); + } + case 'is_parent_dir': //link to parent directory + { + return (($this -> temp_item instanceof DirItem + && $this -> temp_item -> __get('is_parent_dir')) ? $m[2] : ''); + } + default: + { + throw new ExceptionDisplay('Invalid file:if statement in ' + . Url::html_output(EACH_FILE) . ''); + } + } + } + + /** + * Either the HTML text is returned or an empty string is returned, + * depending on if temp_item is the ith file parsed. + * + * @param array $m The array given by preg_replace_callback() + * @return string The result to insert into the HTML output + */ + private function callback_do_every($m) + { + $num = $this -> i + 1; + return (($num % (int)$m[1] === 0 && $this -> length !== $num) ? $m[2] : ''); + } + + + /** + * Parses info for each file in the directory. Order of elements to + * replace is: + * - file:if + * - do_every + * - file + * + * @param string $filename The name of the file to parse + * @param DirectoryListDetailed $list + */ + public function __construct($filename, DirectoryListDetailed $list) + { + parent::__construct($filename, $list); + global $you; + $this -> is_admin = ($you -> level >= ADMIN); + $this -> is_mod = ($you -> level >= MODERATOR); + $final_file_line = ''; + $this -> length = (int)$list -> __get('list_count'); + foreach ($list as $i => $item) + { + $this -> i = (int)$i; + $this -> temp_item = $item; + $temp_line = preg_replace_callback('/\{\s*file\s*:\s*if\s*:\s*(\w+)\s*\}(.*)\{\s*end\s*if\s*\}/Uis', + array($this, 'callback_type'), $this -> out); + $temp_line = preg_replace_callback('/\{\s*do_every\s*:\s*(\d+)\s*\}(.*)\{\s*end\s*do_every\s*\}/Uis', + array($this, 'callback_do_every'), $temp_line); + $final_file_line .= preg_replace_callback('/\{\s*file\s*:\s*(\w+)\s*\}/Ui', + array($this, 'callback_file'), $temp_line); + } + $this -> out = $final_file_line; + } +} + +?> \ No newline at end of file diff --git a/classes/TemplateInfo.php b/classes/TemplateInfo.php new file mode 100755 index 0000000..67492d7 --- /dev/null +++ b/classes/TemplateInfo.php @@ -0,0 +1,205 @@ + + * @version 1.1.0 (January 01, 2006) + * @package AutoIndex + */ +class TemplateInfo extends Template +{ + /** + * @var DirectoryListDetailed + */ + private $dir_list; + + /** + * @param array $m The array given by preg_replace_callback() + * @return string Link to change the sort mode + */ + private static function callback_sort($m) + { + global $subdir; + $m = Url::html_output(strtolower($m[1])); + $temp = Url::html_output($_SERVER['PHP_SELF']) . '?dir=' . $subdir + . '&sort=' . $m . '&sort_mode=' + . (($_SESSION['sort'] == $m && $_SESSION['sort_mode'] == 'a') ? 'd' : 'a'); + + if (isset($_GET['search'], $_GET['search_mode']) + && $_GET['search'] != '' && $_GET['search_mode'] != '') + { + $temp .= '&search=' . Url::html_output($_GET['search']) + . '&search_mode=' . Url::html_output($_GET['search_mode']); + } + return $temp; + } + + /** + * @param array $m The array given by preg_replace_callback() + * @return string Property is gotten from dir_list + */ + private function callback_info($m) + { + switch (strtolower($m[1])) + { + case 'archive_link': + { + global $config; + return Url::html_output($_SERVER['PHP_SELF']) . '?archive=true&dir=' + . substr($this -> dir_list -> __get('dir_name'), strlen($config -> __get('base_dir'))); + } + case 'total_size': + { + return $this -> dir_list -> __get('total_size') -> formatted(); + } + case 'search_box': + { + return Search::search_box(); + } + case 'login_box': + { + global $you; + return $you -> login_box(); + } + case 'current_page_number': + { + if (!ENTRIES_PER_PAGE) + { + return 1; + } + global $page; + return $page; + } + case 'last_page_number': + { + if (!ENTRIES_PER_PAGE) + { + return 1; + } + global $max_page; + return $max_page; + } + case 'previous_page_link': + { + if (!ENTRIES_PER_PAGE) + { + return ''; + } + global $config, $page; + if ($page <= 1) + { + return '<<'; + } + return '<<'; + } + case 'next_page_link': + { + if (!ENTRIES_PER_PAGE) + { + return ''; + } + global $config, $page, $max_page; + if ($page >= $max_page) + { + return '>>'; + } + return '>>'; + } + default: + { + return $this -> dir_list -> __get($m[1]); + } + } + } + + /** + * Either the HTML text is returned, or an empty string is returned, + * depending on if the if-statement passed. + * + * @param array $m The array given by preg_replace_callback() + * @return string The result to insert into the HTML + */ + private static function callback_if($m) + { + $var = strtoupper($m[1]); + if (!defined($var)) + { + throw new ExceptionDisplay('$' . Url::html_output($m[1]) + . ' is not a valid variable (check if-statement in template file).'); + } + return (constant($var) ? $m[2] : ''); + } + + /** + * @param string $filename The name of the file to parse + * @param DirectoryListDetailed $dir_list + */ + public function __construct($filename, DirectoryListDetailed $dir_list) + { + parent::__construct($filename); + $this -> dir_list = $dir_list; + + //parse if-statements + $last_text = ''; + $regex = '/\{\s*if\s*:\s*(\w+)\s*\}(.*)\{\s*end\s*if\s*:\s*\1\s*\}/Uis'; //match {if:foo} ... {end if:foo} + while ($last_text != ($this -> out = preg_replace_callback($regex, array('self', 'callback_if'), $this -> out))) + { + $last_text = $this -> out; + } + $this -> out = $last_text; + + //parse sort modes + $this -> out = preg_replace_callback('/\{\s*sort\s*:\s*(\w+)\s*\}/Ui', + array('self', 'callback_sort'), $this -> out); + + //replace {info} variables + $this -> out = preg_replace_callback('/\{\s*info\s*:\s*(\w+)\s*\}/Ui', + array($this, 'callback_info'), $this -> out); + } +} + +?> \ No newline at end of file diff --git a/classes/Upload.php b/classes/Upload.php new file mode 100755 index 0000000..f95b3a0 --- /dev/null +++ b/classes/Upload.php @@ -0,0 +1,153 @@ + + * @version 1.0.1 (June 30, 2004) + * @package AutoIndex + */ +class Upload +{ + /** + * Uploads all files in the $_FILES array, then echos the results. + */ + public function do_upload() + { + $uploaded_files = $errors = ''; + global $words, $log, $dir; + foreach ($_FILES as $file_upload) + { + $filename = Item::get_basename($file_upload['name']); + if ($filename == '') + { + continue; + } + if (DirectoryList::is_hidden($filename)) + { + $errors .= "
  • $filename [" + . $words -> __get('filename is listed as a hidden file') + . ']
  • '; + continue; + } + $filename = Url::clean_input($filename); + $fullpathname = realpath($dir) . '/' . $filename; + if (@file_exists($fullpathname)) + { + $errors .= "
  • $filename [" + . $words -> __get('file already exists') . ']
  • '; + } + else if (@move_uploaded_file($file_upload['tmp_name'], $fullpathname)) + { + @chmod($fullpathname, 0644); + $uploaded_files .= "
  • $filename
  • "; + $log -> add_entry("Uploaded file: $filename"); + } + else + { + $errors .= "
  • $filename
  • "; + } + } + if ($errors == '') + { + $errors = '
    [' . $words -> __get('none') . ']'; + } + if ($uploaded_files == '') + { + $uploaded_files = '
    [' . $words -> __get('none') . ']'; + } + $str = '
    ' + . '' . $words -> __get('uploaded files') + . ": $uploaded_files

    " + . $words -> __get('failed files') . ": $errors" + . '

    ' . $words -> __get('continue') . '.

    '; + echo new Display($str); + die(); + } + + /** + * @param User $current_user Makes sure the user has permission to upload files + */ + public function __construct(User $current_user) + { + if ($current_user -> level < LEVEL_TO_UPLOAD) + { + throw new ExceptionDisplay('Your user account does not have permission to upload files.'); + } + } + + /** + * @return string The HTML that makes up the upload form + */ + public function __toString() + { + global $words, $subdir; + if (isset($_GET['num_uploads']) && (int)$_GET['num_uploads'] > 0) + { + $str = '

    '; + $num = min((int)$_GET['num_uploads'], 100); + for ($i = 0; $i < $num; $i++) + { + $str .= "\n\t" . $words -> __get('file') + . ' '. ($i + 1) . ' :
    '; + } + $str .= '

    '; + $str = '
    ' + . $str . '

    ' . $words -> __get('continue') . '.

    '; + echo new Display($str); + die(); + } + return '

    ' + . $words -> __get('upload') . ' ' + . $words -> __get('files to this folder') . '

    '; + } +} + +?> \ No newline at end of file diff --git a/classes/Url.php b/classes/Url.php new file mode 100755 index 0000000..925c16e --- /dev/null +++ b/classes/Url.php @@ -0,0 +1,232 @@ + + * @version 1.0.4 (November 9, 2007) + * @package AutoIndex + */ +class Url +{ + /** + * @var string + */ + private $url; + + /** + * Rawurlencodes $uri, but not slashes. + * + * @param string $uri + * @return string + */ + public static function translate_uri($uri) + { + $uri = rawurlencode(str_replace('\\', '/', $uri)); + return str_replace(rawurlencode('/'), '/', $uri); + } + + /** + * Returns the string with correct HTML entities so it can be displayed. + * + * @param string $str + * @return string + */ + public static function html_output($str) + { + return htmlentities($str, ENT_QUOTES, 'UTF-8'); + } + + /** + * Checks input for hidden files/folders, and deals with ".." + * + * @param string $d The URL to check + * @return string Safe version of $d + */ + private static function eval_dir($d) + { + $d = str_replace('\\', '/', $d); + if ($d == '' || $d == '/') + { + return ''; + } + $dirs = explode('/', $d); + for ($i = 0; $i < count($dirs); $i++) + { + if (DirectoryList::is_hidden($dirs[$i], false)) + { + array_splice($dirs, $i, 1); + $i--; + } + else if (preg_match('/^\.\./', $dirs[$i])) //if it starts with two dots + { + array_splice($dirs, $i-1, 2); + $i = -1; + } + } + $new_dir = implode('/', $dirs); + if ($new_dir == '' || $new_dir == '/') + { + return ''; + } + if ($d{0} == '/' && $new_dir{0} != '/') + { + $new_dir = '/' . $new_dir; + } + if (preg_match('#/$#', $d) && !preg_match('#/$#', $new_dir)) + { + $new_dir .= '/'; + } + else if (DirectoryList::is_hidden(Item::get_basename($new_dir))) + //it's a file, so make sure the file itself is not hidden + { + return DirItem::get_parent_dir($new_dir); + } + return $new_dir; + } + + /** + * @param string $url The URL path to check and clean + * @return string Resolves $url's special chars and runs eval_dir on it + */ + public static function clean_input($url) + { + $url = rawurldecode( $url ); + $newURL = ''; + for ( $i = 0; $i < strlen( $url ); $i++ ) //loop to remove all null chars + { + if ( ord($url[$i]) != 0 ) + { + $newURL .= $url[$i]; + } + } + return self::eval_dir( $newURL ); + } + + /** + * Sends the browser a header to redirect it to this URL. + */ + public function redirect() + { + $site = $this -> url; + header("Location: $site"); + die(simple_display('Redirection header could not be sent.
    ' + . "Continue here: $site")); + } + + /** + * @param string $file_dl + * @param bool $headers + */ + public static function force_download($file_dl, $headers = true) + { + if (!@is_file($file_dl)) + { + header('HTTP/1.0 404 Not Found'); + throw new ExceptionDisplay('The file ' + . self::html_output($file_dl) + . ' could not be found on this server.'); + } + if (!($fn = @fopen($file_dl, 'rb'))) + { + throw new ExceptionDisplay('

    Error 401: permission denied

    you cannot access ' + . Url::html_output($file_dl) . ' on this server.'); + } + if ($headers) + { + $outname = Item::get_basename($file_dl); + $size = @filesize($file_dl); + if ($size !== false) + { + header('Content-Length: ' . $size); + } + $mime = new MimeType($outname); + header('Content-Type: ' . $mime -> __toString() . '; name="' . $outname . '"'); + header('Content-Disposition: attachment; filename="' . $outname . '"'); + } + global $speed; + while (true) + { + $temp = @fread($fn, (int)($speed * 1024)); + if ($temp === '') + { + break; + } + echo $temp; + flush(); + if (BANDWIDTH_LIMIT) + { + sleep(1); + } + } + fclose($fn); + } + + /** + * Downloads the URL on the user's browser, using either the redirect() + * or force_download() functions. + */ + public function download() + { + if (FORCE_DOWNLOAD) + { + @set_time_limit(0); + self::force_download(self::clean_input($this -> url)); + die(); + } + $this -> redirect(); + } + + /** + * @param string $text_url The URL to create an object from + * @param bool $special_chars If true, translate_uri will be run on the url + */ + public function __construct($text_url, $special_chars = false) + { + if ($special_chars) + { + $text_url = self::translate_uri($text_url); + } + $this -> url = $text_url; + } + + /** + * @return string Returns the URL as a string + */ + public function __toString() + { + return $this -> url; + } +} + +?> \ No newline at end of file diff --git a/classes/User.php b/classes/User.php new file mode 100755 index 0000000..57afdc6 --- /dev/null +++ b/classes/User.php @@ -0,0 +1,152 @@ + + * @version 1.0.1 (July 21, 2004) + * @package AutoIndex + */ +class User +{ + /** + * @var string Username + */ + public $username; + + /** + * @var string The password, stored as a sha-1 hash of the actual password + */ + public $sha1_pass; + + /** + * @var int The user's level (use the GUEST USER ADMIN constants) + */ + public $level; + + /** + * @var string The user's home directory, or an empty string to use the default base_dir + */ + public $home_dir; + + /** + * @param User $user The user to compare to $this + * @return bool True if this user is equal to $user, based on username and password + */ + public function equals(User $user) + { + return ((strcasecmp($this -> username, $user -> username) === 0) + && (strcasecmp($this -> sha1_pass, $user -> sha1_pass) === 0)); + } + + /** + * Since this is not an instance of UserLoggedIn, we know he is not + * logged in. + */ + public function logout() + { + throw new ExceptionDisplay('You are not logged in.'); + } + + /** + * Here we display a login box rather than account options, since this is + * not an instance of UserLoggedIn. + * + * @return string The HTML text of the login box + */ + public function login_box() + { + $str = ''; + if (USE_LOGIN_SYSTEM) + { + global $words, $subdir; + $str .= '
    ' + . $words -> __get('username') . ':' + . '
    ' . $words -> __get('password') + . ':
    ' + . '

    '; + } + if (LEVEL_TO_UPLOAD === GUEST) + { + global $you; + $upload_panel = new Upload($you); + $str .= $upload_panel -> __toString(); + } + return $str; + } + + /** + * @param string $username Username + * @param string $sha1_pass Password as a sha-1 hash + * @param int $level User's level (use the GUEST, USER, MODERATOR, ADMIN constants) + * @param string $home_dir The home directory of the user, or blank for the default + */ + public function __construct($username = '', $sha1_pass = '', $level = GUEST, $home_dir = '') + { + $level = (int)$level; + if ($level < BANNED || $level > ADMIN) + { + throw new ExceptionDisplay('Error in user accounts file: + Invalid user level (for username "' + . Url::html_output($username) . '").'); + } + if ($sha1_pass != '' && strlen($sha1_pass) !== 40) + { + throw new ExceptionDisplay('Error in user accounts file: + Invalid password hash (for username "' + . Url::html_output($username) . '").'); + } + $this -> sha1_pass = $sha1_pass; + $this -> username = $username; + $this -> level = $level; + $this -> home_dir = $home_dir; + } + + /** + * @return string This string format is how it is stored in the user_list file + */ + public function __toString() + { + return $this -> username . "\t" . $this -> sha1_pass . "\t" + . $this -> level . "\t" . $this -> home_dir . "\n"; + } +} + +?> \ No newline at end of file diff --git a/classes/UserLoggedIn.php b/classes/UserLoggedIn.php new file mode 100755 index 0000000..aada290 --- /dev/null +++ b/classes/UserLoggedIn.php @@ -0,0 +1,114 @@ + + * @version 1.0.1 (July 02, 2004) + * @package AutoIndex + */ +class UserLoggedIn extends User +{ + /** + * Since the user is already logged in, the account options will be + * displayed rather than a login box. + * + * @return string The HTML text that makes up the account options box + */ + public function login_box() + { + global $words, $you, $subdir; + $txt = '

    ' . $words -> __get('logout') + . ' [ ' . Url::html_output($this -> username) . ' ]

    '; + if ($you -> level >= MODERATOR) + //show admin options if they are a moderator or higher + { + $admin_panel = new Admin($you); + $txt = $admin_panel -> __toString() . $txt; + } + if ($you -> level >= LEVEL_TO_UPLOAD) + //show upload options if they are a logged in user or higher + { + $upload_panel = new Upload($you); + $txt .= $upload_panel -> __toString(); + } + return $txt; + } + + /** + * Logs out the user by destroying the session data and refreshing the + * page. + */ + public function logout() + { + global $subdir; + $this -> level = GUEST; + $this -> sha1_pass = $this -> username = ''; + session_unset(); + session_destroy(); + $home = new Url(Url::html_output($_SERVER['PHP_SELF']), true); + $home -> redirect(); + } + + /** + * Validates username and password using the accounts stored in the + * user_list file. + * + * @param string $username The username to login + * @param string $sha1_pass The sha-1 hash of the password + */ + public function __construct($username, $sha1_pass) + { + parent::__construct($username, $sha1_pass); + $accounts = new Accounts(); + if (!($accounts -> is_valid_user($this))) + { + global $log; + $log -> add_entry("Invalid login (Username: $username)"); + session_unset(); + sleep(1); + throw new ExceptionDisplay('Invalid username or password.'); + } + $this -> level = $accounts -> get_level($username); + if ($this -> level <= BANNED) + { + throw new ExceptionDisplay('Your account has been disabled by the site admin.'); + } + $this -> username = $accounts -> get_stored_case($username); + $this -> home_dir = $accounts -> get_home_dir($username); + } +} + +?> \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..7f78554 --- /dev/null +++ b/config.php @@ -0,0 +1,539 @@ + + * @version 1.2.0 (January 01, 2006) + * + * @copyright Copyright (C) 2002-2006 Justin Hagstrom + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL) + * + * @link http://autoindex.sourceforge.net + */ + +/* + AutoIndex PHP Script is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + AutoIndex PHP Script is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (!defined('IN_AUTOINDEX') || !IN_AUTOINDEX) +{ + die(); +} + +$strings = array('base_dir', 'icon_path', 'language', 'template', 'log_file', + 'description_file', 'user_list', 'download_count', 'hidden_files', + 'banned_list'); +$checkboxes = array('show_dir_size', 'use_login_system', 'force_download', + 'search_enabled', 'anti_leech', 'must_login_to_download', 'archive', + 'parse_htaccess'); +$numbers = array('days_new', 'thumbnail_height', 'bandwidth_limit', 'md5_show', + 'entries_per_page'); + +if (count($_POST) >= count($strings) + count($numbers)) +{ + $directories = array('base_dir', 'icon_path', 'template'); + $output = "' + . htmlentities($setting) . ' not set.')); + } + if ($_POST[$setting] == '') + { + $output .= "$setting\tfalse\n"; + continue; + } + $_POST[$setting] = str_replace('\\', '/', $_POST[$setting]); + if (in_array($setting, $directories) && !preg_match('#/$#', $_POST[$setting])) + //make sure there is a slash at the end of directories + { + $_POST[$setting] .= '/'; + } + $output .= "$setting\t{$_POST[$setting]}\n"; + } + foreach ($checkboxes as $setting) + { + $output .= "$setting\t" . (isset($_POST[$setting]) ? 'true' : 'false') + . "\n"; + } + foreach ($numbers as $setting) + { + if (!isset($_POST[$setting])) + { + die(simple_display('Required setting ' + . htmlentities($setting) . ' not set.')); + } + if ($_POST[$setting] == '') + { + $output .= "$setting\t0\n"; + continue; + } + if ($_POST[$setting] < 0) + { + die(simple_display('The setting ' + . htmlentities($setting) . ' should not be a negitive number.')); + } + $_POST[$setting] = (string)((float)$_POST[$setting]); + $output .= "$setting\t{$_POST[$setting]}\n"; + } + $output .= "\n*/\n\n?>"; + + if (!isset($_POST['force_download'])) + { + if (preg_match('#^(/|[a-z]\:)#i', $_POST['base_dir'])) + { + die(simple_display('It seems you are using an absolute path for the Base Directory.' + . '
    This means you must check the "Pipe downloaded files though the PHP script" box.')); + } + if ((int)$_POST['bandwidth_limit'] !== 0) + { + die(simple_display('For the Bandwidth Limit feature to work, the "force download" feature needs to be on.' + . '
    This means you must check the "Pipe downloaded files though the PHP script" box.')); + } + } + if (isset($_POST['must_login_to_download']) && !isset($_POST['use_login_system'])) + { + die(simple_display('To enable must_login_to_download, the ' + . 'use_login_system option must also be turned on.')); + } + foreach (array('base_dir', 'template') as $valid) + { + if (!@is_dir($_POST[$valid])) + { + die(simple_display(htmlentities($valid) + . ' setting is not a valid directory.')); + } + } + + if (@is_file(CONFIG_STORED)) + //if the file already exists, back it up + { + $temp_name = CONFIG_STORED . '.bak'; + for ($i = 1; @file_exists($temp_name); $i++) + { + $temp_name = CONFIG_STORED . '.bak' . (string)$i; + } + @copy(CONFIG_STORED, $temp_name); + } + + $h = @fopen(CONFIG_STORED, 'wb'); + if ($h === false) + //the file could not be written to, so now it must be downloaded through the browser + { + header('Content-Type: text/plain; name="' . CONFIG_STORED . '"'); + header('Content-Disposition: attachment; filename="' . CONFIG_STORED . '"'); + die($output); + } + else + //the file was opened successfully, so write to it + { + fwrite($h, $output); + fclose($h); + + //begin display of "configuration complete" page + echo ''; + ?> + + + + + AutoIndex Configuration: Complete! + + + + +
    +

    Write successful!
    AutoIndex configuration is finished.

    +

    Continue.

    +
    + + './', + 'icon_path' => 'index_icons/winxp/', + 'language' => 'en', + 'template' => './templates/default/', + 'log_file' => 'false', + 'description_file' => 'false', + 'user_list' => '.htpasswd.autoindex', + 'download_count' => 'false', + 'hidden_files' => 'hidden_files', + 'banned_list' => 'false', + 'show_dir_size' => 'true', + 'use_login_system' => 'false', + 'force_download' => 'false', + 'search_enabled' => 'true', + 'anti_leech' => 'false', + 'must_login_to_download' => 'false', + 'archive' => 'false', + 'days_new' => '0', + 'entries_per_page' => '0', + 'thumbnail_height' => '0', + 'bandwidth_limit' => '0', + 'md5_show' => '0', + 'parse_htaccess' => 'true' +); + +global $config; +if (isset($config)) +//if we're reconfiguring the script, use the current settings +{ + foreach ($settings as $key => $data) + { + $settings[$key] = $config -> __get($key); + } +} + +//begin display of main configuration page: +echo ''; +?> + + + + +AutoIndex Configuration Generator + + + +
    + +

    + AutoIndex PHP Script +
    Configuration +

    +

    + The default options are currently selected, so just press the configure button at the bottom to use them. +

    + +
    + +

    +
    +Base Directory: +

    + This is the folder that will be the root of the directory listing. +
    This will be the starting point for the script. Nothing above this directory can be viewed, but its subfolders can. +
    Make sure to use a path relative to this index.php file if you can. +

    +
    + +

    +
    +Icon Path: +

    + This is the path to the icon image files (the path web browsers will access them from). +
    The included icon sets are apache, kde, osx, and winxp. +
    You can leave it blank to not show icons. +

    +
    + +

    +
    + /> Show Directory Size +

    + If this box is checked, the total size of directories will be shown under size (all the folder's contents will be added up). +
    Otherwise, it will display "[dir]" under size. +
    NOTE: If you are trying to index many files (meaning a few thousand), you will notice a speed improvement with this turned off. +

    +
    + +

    +
    + /> Enable Searching +

    + If this box is checked, people will be able to search for a file or folder by its filename. +
    It will search the folder you are currently in, and all subfolders. +
    Searching is not case sensitive. +

    +
    + +

    +
    +Template Directory: +

    + This is the path where the *.tpl template files are located (relative to this index.php file). +

    +
    + +

    +
    + /> Enable Login System +
    /> Users must login to view/download +
    User List: +

    + User List contains the path to the text file where the usernames and encrypted passwords are stored. +
    Make sure the file is chmod'ed so PHP can read and write to it. +
    (User List is only needed if the login system is enabled.) +
    +
    The default accounts are: +
    username: admin +
    password: admin +
    +
    username: user +
    password: user +
    +
    Be sure to create new accounts, then delete these default ones if you enable the login system! +

    +
    + +

    +
    +Age for "New" Icon: days +

    + This contains the number of days old a file can be and still have [New] written next to it. +
    If it is set to 0, this feature will be disabled. +

    +
    + +

    +
    +Number of file entires per page: +

    + This contains the number of files or folders to display on a single page. + If there are more files or folders, the display will be separated into different + pages with Previous and Next buttons. +
    If it is set to 0, everything will be displayed on one page. +

    +
    + +

    +
    +Image Thumbnail Height: pixels +

    + This is a feature that will show thumbnails next to images. (NOTE: GDlib 2.0.1 or higher is required) +
    Setting it to 0 will disable this feature, and setting it to any other number will set the size of the thumbnail. +
    (100 is a good setting to start with.) +

    +
    + +

    +
    + /> Pipe downloaded files though the PHP script +

    Bandwidth Limit: KB/s

    +

    + This contains the max download speed for files. The above checkbox needs to be checked for this to work. +
    If it is set to 0, the script will not limit download speed. +

    +
    + +

    +
    +

    /> Anti-Leech

    +

    + When downloading a file, this will check to make sure the referrer the browser sends matches the website's URL. +
    Since some people turn off referrer sending in their browser, this option is not recommended. +

    +
    + +

    +
    + +

    + The following items contain the path and filename to the file where the data for that feature will be stored. +
    Leave it blank to turn off that feature. +

    + +

    Hidden Files List: +
    + Any file or folder matched to an item in this list will be kept hidden. +
    The contents of the list are editable when you login as an admin. +

    + +

    Access Log File: +
    + The file to write the access log. +
    If this is enabled, you will be able to view the contents of the logfile +
    and generate statistics when you login as an admin. +

    + +

    File/Folder Description File: +
    + The file to write the file descriptions to. +
    File/Folder descriptions are editable when you login as an admin. +

    + +

    Download Count File: +
    + The file to write the file download counts to. +
    The count is automatically increased when a file is downloaded. +

    + +

    Banned User List: +
    + The file to write IP addresses and hostnames that are blocked from accessing this script. +
    The contents of the list are editable when you login as an admin. +

    +
    + +

    +
    + /> Allow folder archive downloading +

    + If this box is checked, users will be able to download the folder's contents as a tar archive file. +

    +
    + +

    +
    + /> Parse .htaccess files +

    + If this box is checked, .htaccess files will be parsed and used by AutoIndex. +

    +
    + +

    +
    +

    MD5 calculation max size: MB

    +

    + Setting this to 0 will disable this feature, and setting it to any other number will set the maximum size of a file to allow users to find the md5sum of (in megabytes). +
    (10 is a good setting to start with.) +

    +
    + +

    +
    +Default Language: +

    + The user's browser's default language is used, unless that language is + not available in AutoIndex. In that case, the language selected here is + used. +

    +
    + +


    + +

    + +

    +

    + When you press Configure, the script will attempt to write the config data to the file. +
    If it cannot (for example if it does not have write permission in the directory) the config file will be downloaded, and you will have to upload it to your server. +
    (It should be named and put in the same folder as index.php) +

    + +
    + + + + \ No newline at end of file diff --git a/hidden_files b/hidden_files new file mode 100755 index 0000000..3453da3 --- /dev/null +++ b/hidden_files @@ -0,0 +1,7 @@ +hidden_files +.ht* +*.php +classes +index_icons +languages +templates diff --git a/index.php b/index.php new file mode 100755 index 0000000..423ba01 --- /dev/null +++ b/index.php @@ -0,0 +1,643 @@ + + * @version 1.2.1 (January 06, 2007) + * + * @copyright Copyright (C) 2002-2007 Justin Hagstrom + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL) + * + * @link http://autoindex.sourceforge.net + */ + +/* + AutoIndex PHP Script is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + AutoIndex PHP Script is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/** + * OPTIONAL SETTINGS: + */ + +//filenames and paths for configuration related files +define('CONFIG_STORED', 'AutoIndex.conf.php'); +define('CONFIG_GENERATOR', 'config.php'); + +//paths for files that will be included +define('PATH_TO_CLASSES', './classes/'); +define('PATH_TO_LANGUAGES', './languages/'); +define('LANGUAGE_FILE_EXT', '.txt'); + +//filenames of template files +define('GLOBAL_HEADER', 'global_header.tpl'); +define('GLOBAL_FOOTER', 'global_footer.tpl'); +define('TABLE_HEADER', 'table_header.tpl'); +define('TABLE_FOOTER', 'table_footer.tpl'); +define('EACH_FILE', 'each_file.tpl'); + +/** + * When ENABLE_CACHE is true, the indexes of directories will be stored in + * files in the folder CACHE_STORAGE_DIR. You will notice a speed improvement + * when viewing folders that contain a few thousand files. However, the contents + * of the indexed folders will not be updated until you delete the cache file. + */ +define('ENABLE_CACHE', false); + +/** + * This is the folder cache data will be stored in. PHP needs write permission + * in this directory. You can use an absolute path or a relative path, just + * make sure there is a slash at the end. + */ +define('CACHE_STORAGE_DIR', './cache/'); + +/** + * Format to display dates in. + * @see date() + */ +define('DATE_FORMAT', 'Y-M-d'); + +/** + * Sets debug mode. Off (false) by default. + */ +define('DEBUG', false); + +/* END OPTIONAL SETTINGS */ + + +/** The time this script began to execute. */ +define('START_TIME', microtime(true)); + +/** Level for disabled/banned accounts. */ +define('BANNED', -1); + +/** Level for Guest users (users who are not logged in). */ +define('GUEST', 0); + +/** Level for regular user accounts. */ +define('USER', 1); + +/** Level for moderator ("super user") accounts. */ +define('MODERATOR', 2); + +/** Level for Admin users. */ +define('ADMIN', 3); + +/** + * Minimum user level allowed to upload files. + * Use the ADMIN, MODERATOR, USER, GUEST constants. + * GUEST will allow non-logged-in users to upload. + */ +define('LEVEL_TO_UPLOAD', USER); + +/** The version of AutoIndex PHP Script (the whole release, not based on individual files). */ +define('VERSION', '2.2.4'); + +/** + * This must be set to true for other included files to run. Setting it to + * false could be used to temporarily disable the script. + */ +define('IN_AUTOINDEX', true); + +if (@get_magic_quotes_gpc()) +//remove any slashes added by the "magic quotes" setting +{ + $_GET = array_map('stripslashes', $_GET); + $_POST = array_map('stripslashes', $_POST); +} +@set_magic_quotes_runtime(0); + +$_GET = array_change_key_case($_GET, CASE_LOWER); +$_POST = array_change_key_case($_POST, CASE_LOWER); + +if (@ini_get('zlib.output_compression') == '1') +//compensate for compressed output set in php.ini +{ + header('Content-Encoding: gzip'); +} + +/* + * Uncomment the following code to turn on strict XHTML 1.1 compliance in + * users' browsers. If you do this, make sure any changes you make to the + * template do not break XHTML 1.1 compliance. + */ +/*if (isset($_SERVER['HTTP_ACCEPT']) && preg_match('#application/(xhtml\+xml|\*)#i', $_SERVER['HTTP_ACCEPT'])) +{ + header('Content-Type: application/xhtml+xml'); +}*/ + +session_name('AutoIndex2'); +session_start(); + +/** + * Formats $text within valid XHTML 1.1 tags and doctype. + * + * @param string $text + * @param string $title + * @return string + */ +function simple_display($text, $title = 'Error on Page') +{ + return ' + + + + ' . $title . ' + + + +

    ' . $text . '

    + + +'; +} + +/** + * This function is automatically called by PHP when an undefined class is + * called. + * + * A file with the classname followed by .php is included to load the class. + * The class should start with an upper-case letter with each new word also in + * upper-case. The filename must match the class name (including case). + * + * @param string $class The name of the undefined class + */ +function __autoload($class) +{ + if ($class != 'self') + { + $file = PATH_TO_CLASSES . $class . '.php'; + /** Try to load the class file. */ + if (!@include_once($file)) + { + die(simple_display('Error including file ' + . htmlentities($file) . ' - cannot load class.')); + } + } +} + +/** + * This is used to report a fatal error that we cannot display with the Display + * class. All Exceptions used in AutoIndex should inherit from this class. + * + * @package AutoIndex + */ +class ExceptionFatal extends Exception {} + +try +{ + //now we need to include either the stored settings, or the config generator: + if (@is_file(CONFIG_STORED)) + { + if (!@is_readable(CONFIG_STORED)) + { + throw new ExceptionFatal('Make sure PHP has permission to read the file ' + . Url::html_output(CONFIG_STORED) . ''); + } + $config = new ConfigData(CONFIG_STORED); + } + else if (@is_file(CONFIG_GENERATOR)) + { + /** Include the config generator so a new config file can be created. */ + if (!@include_once(CONFIG_GENERATOR)) + { + throw new ExceptionFatal('Error including file ' + . Url::html_output(CONFIG_GENERATOR) . ''); + } + die(); + } + else + { + throw new ExceptionFatal('Neither ' + . Url::html_output(CONFIG_GENERATOR) . ' nor ' + . Url::html_output(CONFIG_STORED) . ' could be found.'); + } + + + //find and store the user's IP address and hostname: + $ip = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'N/A'); + if (isset($_SESSION['host'])) + { + $host = $_SESSION['host']; + } + else + { + $_SESSION['host'] = $host = @gethostbyaddr($ip); + } + + + //Create a language object: + $words = new Language(); + + + //Create a logging object: + $log = new Logging($config -> __get('log_file')); + + + foreach ($config as $key => $item) + /* Go through each config setting, and set a constant with each setting's + * name to either true or false depending on if the config setting is + * enabled. + */ + { + $key = strtoupper($key); + if (defined($key)) + { + throw new ExceptionFatal(Url::html_output($key) + . ' is already defined in ' . basename(Url::html_output($_SERVER['PHP_SELF'])) + . ', and should not be in the config file.'); + } + define($key, ($item != 'false' && $item != '0')); + } + + + //make sure all required settings are set in the config file + foreach (array('base_dir', 'icon_path', 'language', 'template', + 'log_file', 'description_file', 'user_list', 'download_count', + 'hidden_files', 'banned_list', 'show_dir_size', 'use_login_system', + 'force_download', 'search_enabled', 'anti_leech', 'entries_per_page', + 'must_login_to_download', 'archive', 'days_new', 'thumbnail_height', + 'bandwidth_limit', 'md5_show', 'parse_htaccess') as $set) + { + if (!defined(strtoupper($set))) + { + throw new ExceptionFatal('Required setting ' . $set + . ' is not set in ' . Url::html_output(CONFIG_STORED) + . ''); + } + } + + + /* From this point on, we can throw ExceptionDisplay rather than + * Exception since all the configuration is done. + */ + + $b_list = $only_these_ips = $banned_ips = array(); + if (BANNED_LIST && @is_file($config -> __get('banned_list'))) + //make sure the user is not banned + { + $b_list = @file($config -> __get('banned_list')); + if ($b_list === false) + { + throw new ExceptionDisplay('Error reading from banned_list file.'); + } + for ($i = 0; $i < count($b_list); $i++) + { + $b_list[$i] = rtrim($b_list[$i], "\r\n"); + if (ConfigData::line_is_comment($b_list[$i])) + { + continue; + } + if ($b_list[$i]{0} === ':') + { + $only_these_ips[] = substr($b_list[$i], 1); + } + else + { + $banned_ips[] = $b_list[$i]; + } + } + if (count($only_these_ips) > 0) + { + if (!(DirectoryList::match_in_array($ip, $only_these_ips) || + DirectoryList::match_in_array($host, $only_these_ips))) + { + throw new ExceptionDisplay($words -> __get('the administrator has blocked your ip address or hostname') . '.'); + } + } + else if (DirectoryList::match_in_array($ip, $banned_ips) || + DirectoryList::match_in_array($host, $banned_ips)) + { + throw new ExceptionDisplay($words -> __get('the administrator has blocked your ip address or hostname') . '.'); + } + } + + $show_only_these_files = $hidden_files = array(); + if (HIDDEN_FILES && @is_file($config -> __get('hidden_files'))) + //store the hidden file list in $hidden_list + { + $hidden_list = @file($config -> __get('hidden_files')); + if ($hidden_list === false) + { + throw new ExceptionDisplay('Error reading from "hidden_files" file.'); + } + for ($i = 0; $i < count($hidden_list); $i++) + { + $hidden_list[$i] = rtrim($hidden_list[$i], "\r\n"); + if (ConfigData::line_is_comment($hidden_list[$i])) + { + continue; + } + if ($hidden_list[$i]{0} === ':') + { + $show_only_these_files[] = substr($hidden_list[$i], 1); + } + else + { + $hidden_files[] = $hidden_list[$i]; + } + } + } + + + //size of the "chunks" that are read at a time from the file (when $force_download is on) + $speed = (BANDWIDTH_LIMIT ? $config -> __get('bandwidth_limit') : 8); + + + if (DOWNLOAD_COUNT) + { + if (!@is_file($config -> __get('download_count'))) + { + $h = @fopen($config -> __get('download_count'), 'wb'); + if ($h === false) + { + throw new ExceptionDisplay('Could not open download count file for writing.' + . ' Make sure PHP has write permission to this file.'); + } + fclose($h); + } + $downloads = new ConfigData($config -> __get('download_count')); + } + + + //create a user object: + $log_login = false; + if (USE_LOGIN_SYSTEM && isset($_POST['username'], $_POST['password']) + && $_POST['username'] != '' && $_POST['password'] != '') + { + $you = new UserLoggedIn($_POST['username'], sha1($_POST['password'])); + $log_login = true; + $_SESSION['password'] = sha1($_POST['password']); + unset($_POST['password']); + $_SESSION['username'] = $_POST['username']; + } + else if (USE_LOGIN_SYSTEM && isset($_SESSION['username'], $_SESSION['password'])) + { + $you = new UserLoggedIn($_SESSION['username'], $_SESSION['password']); + } + else + { + $you = new User(); + if (MUST_LOGIN_TO_DOWNLOAD && USE_LOGIN_SYSTEM) + { + $str = '

    You must login to view and download files.

    ' + . '' + . '
    ' + . $you -> login_box() . '
    '; + echo new Display($str); + die(); + } + } + + + //set the logged in user's home directory: + $dir = Item::make_sure_slash((($you -> home_dir == '') ? $config -> __get('base_dir') : $you -> home_dir)); + $config -> set('base_dir', $dir); + $subdir = ''; + + if (isset($_GET['dir'])) + { + $dir .= Url::clean_input($_GET['dir']); + $dir = Item::make_sure_slash($dir); + if (!@is_dir($dir)) + { + header('HTTP/1.0 404 Not Found'); + $_GET['dir'] = ''; //so the "continue" link will work + throw new ExceptionDisplay('The directory ' + . Url::html_output($dir) . ' does not exist.'); + } + $subdir = substr($dir, strlen($config -> __get('base_dir'))); + if (isset($_GET['file']) && ($file = $_GET['file'])) + { + while (preg_match('#\\\\|/$#', $file)) + //remove all slashes from the end of the name + { + $file = substr($file, 0, -1); + } + $file = Url::clean_input($file); + if (!@is_file($dir . $file)) + { + header('HTTP/1.0 404 Not Found'); + throw new ExceptionDisplay('The file ' + . Url::html_output($file) . ' does not exist.'); + } + if (ANTI_LEECH && !isset($_SESSION['ref']) && (!isset($_SERVER['HTTP_REFERER']) + || stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) === false)) + { + $log -> add_entry('Leech Attempt'); + $self = $_SERVER['SERVER_NAME'] . Url::html_output($_SERVER['PHP_SELF']) + . '?dir=' . Url::translate_uri($subdir); + throw new ExceptionDisplay('

    This PHP Script has an Anti-Leech feature turned on.

    ' + . '

    Make sure you are accessing this file directly from http://' . $self . '

    '); + } + $log -> add_entry($file); + if (DOWNLOAD_COUNT) + { + $downloads -> add_one($dir . $file); + } + $url = new Url($dir . $file, true); + $url -> download(); + } + } + + if ($log_login) + { + $log -> add_entry('Successful login (Username: ' + . $_SESSION['username'] . ')'); + } + + if (DESCRIPTION_FILE) + { + $descriptions = new ConfigData((@is_file($config -> __get('description_file'))) + ? $config -> __get('description_file') : false); + } + + if (PARSE_HTACCESS) + { + //parse .htaccess file(s) + new Htaccess($dir, '.htaccess'); + } + + if (MD5_SHOW && isset($_GET['md5']) && $_GET['md5'] != '') + { + $file = $dir . Url::clean_input($_GET['md5']); + if (!@is_file($file)) + { + header('HTTP/1.0 404 Not Found'); + throw new ExceptionDisplay('Cannot calculate md5sum: the file ' + . Url::html_output($file) . ' does not exist.'); + } + $size = (int)@filesize($file); + if ($size <= 0 || $size / 1048576 > $config -> __get('md5_show')) + { + throw new ExceptionDisplay('Empty file, or file too big to calculate the' + . 'md5sum of (according to the $md5_show variable).'); + } + die(simple_display(md5_file($file), 'md5sum of ' + . Url::html_output($file))); + } + + if (THUMBNAIL_HEIGHT && isset($_GET['thumbnail'])) + { + $fn = Url::clean_input($_GET['thumbnail']); + if ($fn == '') + { + die(); + } + echo new Image($fn); + } + + if (ARCHIVE && isset($_GET['archive'])) + { + $log -> add_entry('Directory archived'); + $outfile = Item::get_basename($subdir); + if ($outfile == '' || $outfile == '.') + { + $outfile = 'base_dir'; + } + $mime = new MimeType('.tar'); + header('Content-Type: ' . $mime -> __toString()); + header('Content-Disposition: attachment; filename="' + . $outfile . '.tar"'); + @set_time_limit(0); + $list = new DirectoryList($dir); + $tar = new Tar($list, $outfile, strlen($dir)); + die(); + } + + //set the sorting mode: + if (isset($_GET['sort']) && $_GET['sort'] != '') + { + $_SESSION['sort'] = $_GET['sort']; + } + else if (!isset($_SESSION['sort'])) + { + $_SESSION['sort'] = 'filename'; //default sort mode + } + + //set the sorting order: + if (isset($_GET['sort_mode']) && ($_GET['sort_mode'] == 'a' || $_GET['sort_mode'] == 'd')) + { + $_SESSION['sort_mode'] = $_GET['sort_mode']; + } + else if (!isset($_SESSION['sort_mode'])) + { + $_SESSION['sort_mode'] = 'a'; //default sort order + } + + if (count($_FILES) > 0) + //deal with any request to upload files: + { + $upload = new Upload($you); //the constructor checks if you have permission to upload + $upload -> do_upload(); + } + + if (USE_LOGIN_SYSTEM) + { + if (isset($_GET['logout']) && $_GET['logout'] == 'true') + { + $you -> logout(); + } + else if (isset($_GET['action']) && $_GET['action'] != '') + { + $admin = new Admin($you); //the constructor checks if you really are an admin + $admin -> action($_GET['action']); + } + } + + if (ANTI_LEECH && !isset($_SESSION['ref'])) + { + $_SESSION['ref'] = true; + } + + $search_log = ''; + if (SEARCH_ENABLED && isset($_GET['search'], $_GET['search_mode']) + && $_GET['search'] != '' && $_GET['search_mode'] != '') + { + $s = Url::clean_input($_GET['search']); + $dir_list = new Search($s, $dir, $_GET['search_mode']); + $search_log = "Search: $s"; + } + else if (ENABLE_CACHE) + { + $cache = CACHE_STORAGE_DIR . strtr($dir, '\/:', '---'); //path to cache file + if (@is_file($cache)) + { + $contents = @file_get_contents($cache); + if ($contents === false) + { + throw new ExceptionDisplay('Cannot open cache file for reading. Make sure PHP has read permission for these files.'); + } + $dir_list = unserialize($contents); + } + else + { + $dir_list = new DirectoryListDetailed($dir); + if (!@is_dir(CACHE_STORAGE_DIR)) + { + if (!Admin::mkdir_recursive(CACHE_STORAGE_DIR)) + //Attempt to create the directory. If it fails, tell the user to manually make the folder. + { + throw new ExceptionDisplay('Please create the directory ' + . Url::html_output(CACHE_STORAGE_DIR) + . ' so cache files can be written.'); + } + } + $h = @fopen($cache, 'wb'); + if ($h === false) + { + throw new ExceptionDisplay('Cannot write to cache file. Make sure PHP has write permission in the cache directory.'); + } + fwrite($h, serialize($dir_list)); + fclose($h); + } + } + else + { + $page = ((ENTRIES_PER_PAGE && isset($_GET['page'])) ? (int)$_GET['page'] : 1); + $dir_list = new DirectoryListDetailed($dir, $page); + $max_page = (ENTRIES_PER_PAGE ? (ceil($dir_list -> total_items() / $config -> __get('entries_per_page'))) : 1); + } + $log -> add_entry($search_log); + $str = $dir_list -> __toString(); + echo new Display($str); +} +catch (ExceptionDisplay $e) +{ + echo $e; +} +catch (Exception $e) +{ + echo simple_display($e -> getMessage()); +} + +?> \ No newline at end of file diff --git a/index_icons/apache/back.png b/index_icons/apache/back.png new file mode 100755 index 0000000000000000000000000000000000000000..183a1145357ee045226fd2d695e537f02d79f635 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZJ#gTFp`l?^R8&h#OHWUa zqM{;DX1PjrF_2;`3GxeOaCmkj4a76z%6EirBu2dW73ba4!+xRspX&=8<;c9s}JV$0H{O_^#6&WvY@yuA|-q(~S` zG)Q>r9P{Gi;pxfD^l55x`0A6H+1Avg;F_7~B;XbiHDLiq$ZUlh9t)I|J3RID9L_Sx XH3-Pwo3+IcXaj?%tDnm{r-UW|GJ;1- literal 0 HcmV?d00001 diff --git a/index_icons/apache/binary.png b/index_icons/apache/binary.png new file mode 100755 index 0000000000000000000000000000000000000000..cbdc5f92aa2300da2bd932ebb48f4967c468102e GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gTFrKM$dc6Lus&;S4b z&z(E>{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@%~a$OcXSkJ z)(pMc$ay5dxTwgJ$uMNfoR~QdJd0UaIha?l9b#BncxWA4hQf@4Ygkyicz76;g@liW Tu)aDBG?>BD)z4*}Q$iB}_K--O literal 0 HcmV?d00001 diff --git a/index_icons/apache/binhex.png b/index_icons/apache/binhex.png new file mode 100755 index 0000000000000000000000000000000000000000..d41320d2052bb658a0ba8bc0c8375613463d716f GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gTFrKM$dc6Lus&;S4b z&z(E>{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@gTe~DWM4fR>Ms{ literal 0 HcmV?d00001 diff --git a/index_icons/apache/cd.png b/index_icons/apache/cd.png new file mode 100755 index 0000000000000000000000000000000000000000..86bbb8b092871aaa8a12a1fadd1802cef945abcb GIT binary patch literal 752 zcmV|J~jH&(HtO&HvKU|J2m~_4W1V=l|K+|K8sJ;^P0bw6x^p zB_X6^0miHV7RetxmB#)pT8=;;5@(9p-n^?ZDM{Nn%3&Gp8{#_a6> z#KgpGY;5!M|JK&||K9)G)c?%P(vp&*=idMI(*J5|YRby&=iC3lz`(b+>iO{eprEAg z?*EUElwV(8^z{F*u;X`kchAqy#l`d0)zze=r)+F)yu7^g(f^8yk7;RYVq$5zx!lCW z=ilG&-r4`c!tdqSdOZ+5hGfqHs+`1t>9Y;elT%9xm$>g4~Oot>kgv#F`GzrVw9aCH3I|G>cJ=ivX$ z%*=RrgZKCU=jZqQ^#A|%|MThp@$CP-z2?`~*ZTVZjEtVAr>AaiZsq0WzP`SUjFipI z^ITk9iHVGvnauzH|5Q{|!QB`i00001bW%=J06^y0W&i*H0b)x>M1DWGL302A02Xvb zSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0002*NklxGeR=9)fP8*FMG-@gfGAI0T>yyB%^}B>3Dlob2LuHM9^4$9T;9>; z3@m|eIdyp&x(XSbT&(QQf(#`=mPS>Kk+Dg+tgP$;%n}SGp`JGC`B}owUivDsCc zEI{)@82$D9jDu=xYop8=;z8!?q&X@C*SWjax~MWZNCEBR)Qm^~S*BGl!N9<*$N@56 zpt!D%N4{Q=fx%Wp4#bzSsN+c#mJ|XywSp-e$TwB9mKQEl0sAJ-Dz!4%%)Y)}QU&T? iAwg-eYB6a+ka_?WY%f|Kj@t(S0000N7)z?lSZ z?goQHmsq$KX0EaktaVt5&fx%7VY|a{nWC=$}wqr~JZ3`0wLb@C| zUAPUTrL`MP+888#)+w}Y-nfx-#>1qXH%w_3lG3XiBo7@swno8C$z!9$5t(GQ4%wzA cCkG*h!mnKW10&XN0ouUe>FVdQ&MBb@0Lhq2(*OVf literal 0 HcmV?d00001 diff --git a/index_icons/apache/dir.png b/index_icons/apache/dir.png new file mode 100755 index 0000000000000000000000000000000000000000..de3e591048a98afad54b7fd4a40cf41ddebae215 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZJ#gT_|2ymc-&?z5L2bCV zwYI7(P$v7ROxSQ6wH%;50sMjD8d$@u`gF9%>i%cku4jXZqcrz%eDR zv_VEpqUJw Lu6{1-oD!M{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@%~a$OcXSkJ z)(pMc$ay5dxTwgJ$uMNfoR~QdJd0UaIha?l9b#BncxWA4hQf@4Ygkyicz76;g@liW Tu)aDBG?>BD)z4*}Q$iB}_K--O literal 0 HcmV?d00001 diff --git a/index_icons/apache/doc.png b/index_icons/apache/doc.png new file mode 100755 index 0000000000000000000000000000000000000000..bad6e4e6a65d2197d69d3d8db88c1b4754fabfd5 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=5z5mf6|aJv}|=&YgSy z{Q3X?|AB(WicPbD6k|z{UoeBivm0qZj#!CnL`iUdT1k0gQ7S`vW|~n!Ub=#jo{65> z660oZpb9mR3g`UX+|;}hhNMab-^8Ml%sf5sqQunP)FKDpgTe~DWM4f DX%ANx literal 0 HcmV?d00001 diff --git a/index_icons/apache/generic.png b/index_icons/apache/generic.png new file mode 100755 index 0000000000000000000000000000000000000000..42af82ec44f2e428c3909bc8244b582442e1b96f GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gTFrKM$dc6Lus&;S4b z&z(E>{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@%~a$OcXZS^ q+{k&Vz_ZD4&WSVwZN^3=W@d&)3(-^ojgE&v-3*?telF{r5}E*?dOq*~ literal 0 HcmV?d00001 diff --git a/index_icons/apache/image.png b/index_icons/apache/image.png new file mode 100755 index 0000000000000000000000000000000000000000..a4edb6924f52a346055be3be281edbe2801731c7 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gT_e;^17VyISRsNUMs zGbJb}3Me^$Q|l)n#aI&L7tG-B>_!@hljQC0!Y-EB@fyexD{+k|3C>R|DNig)Wk}CV zGb+eSS1{5u(KB0O+$;`M5#Z_K7*cU7Il+OAQK2a?AfQ3?m;g_M;SC2K)zX8TN;I4u zc+PnEi?SG>lDN!#kSDG1v5SH88HrN@8fN8;#w<637VtQVOE?RxnQO|+A|b)BA%n;M TP-5S9pxF$bu6{1-oD!Mz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<08mU+MF0Q*IXO9NYio>*jLy!^=jZ4D|Nj6000;;O z2?+@b3JMDg3k(bl4Gj$r4h|0w4-gO#5fKp*5)u;=6BHB_6%`d078Vy57Z?~A85tQG z8X6lL8yp-Q9UUDW9v&YbA0QwgAt50mA|fLrBP1jwB_$;$CMG8*CnzW=DJdx`Dk>{0 zD=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8xIyyT$J3Kr* zJv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#hOH52mO-)Ts zPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~c zUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCCZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Yv$V9dwY9aj zwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI#l^+O#>U6T z$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3*4Ee8*Vx$D z+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<;=jiC@>FMd} z>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku`T63M>3;+QH`anH>OBb?uT|w-b#B07pB6q^bc4 z2#^sWBAGb{j%`{=0|dYrF~%^n8^_EtGc#wAiOh8OLaUgaU6KF*q_U_;zDfc_^`*Y_ ztfQTvsw7l}M0s%c=J@7eaf0TgpsFAH3y>xvBuF{Wv+ntDLlrZe>tM8$UWAJ_JAJxK zQdN=>UR@DHM1=1_-BMb$jxpK`yb1NID#r#-=>PQu-b2^xzw;sX00000NkvXXu0mjf DNa1K? literal 0 HcmV?d00001 diff --git a/index_icons/apache/key.png b/index_icons/apache/key.png new file mode 100755 index 0000000000000000000000000000000000000000..d4899cc97d9588e30e87db490e9858edb6f2fe06 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=5z5mf6|aJv}|=&YgSy z{Q3X?|AB(WicPbD6k|z{UoeBivm0qZj#!CnL`iUdT1k0gQ7S`vW|~n!Ub=#jo{65> z660oZpb9mR3g`UX+|;}hhNMab-^8Ml%sf5sqQunP)FKDpguXW9P==3Fp8Ps*rTx2z|m2_S=U#$k@J)Xcazsr)ke|j rOBWh<-MAoGu+oI1Ig*n@L{fqwald3&!}`2Hpm_|Qu6{1-oD!MMGF_4IB}x6x!KXt5vcNL;j=&>#aI&L7tG-B>_!@p zBUa)XQ4*Y=R#Ki=l**8vnPyawm#$!>XQF4e#JE`;s3OVJ#WAGfR&v6Fy6^88n3)gX zHBNtLWbol$<&y2?%*^){+1jr2OU!7P(#LdoneYGq+1bW5kz2E_KB{PopKNV)sNu?& znZ{=urWm%Q8x=n@nJ~xQJ=*T@^G{noZK-Jc`@ivlK7+i3?!L00GhPF2WAJqKb6Mw< G&;$U17ikUv literal 0 HcmV?d00001 diff --git a/index_icons/apache/mov.png b/index_icons/apache/mov.png new file mode 100755 index 0000000000000000000000000000000000000000..ec7a0d56f855d429feecbc4d55f7fcbbef1853b4 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZJ#gSac6N48PmiUg<+*d` zoc64Q3n0y$zOt`Q}{`DrEPiAAXl>6vLp z1$pTTMtUZCW=o8l#ephZJY5_^DsCkgFfy{Uv9UP{2rwD3^z`=jPHE(ER#s(AOPc64Q3n0y$zOt`Q}{`DrEPiAAXl>6vLp z1$pTTMtUZCW=o8l#ephZJY5_^DsCkgFfy{Uv9UP{2rwD3^z`=jPHE(ER#s(AOP&!4}3{`~pl$B*ydzXQ2nzI^%o`7@C5@#9CZT84M;-UAtL-@bkG=FRKZZ-DGq zuU@@)@$&ie=TDzLee&eVeXvk zuU@@;`SPVpKy>N+`3q;yo;`i~^obKEjvqg9^ysl8M~)siaA5y_Alkoo@4j8TcJ15= zL_2rv*s*Qf_Kh1iZQQtV-MV#a)~s2*8i-b}T)Ar5vgL~xFJ7=i&+p#`gV4-6KQlIt2ZB7zOm7XoZ7}fNX<%?+67S?T zkG4csH!cOsl^YD683?4YF&PN^SgdMRasAS8D8X}vMF&Sw7<2SWj%f_9TO=4JeKBW` zKE)cwX)eff$jPSU;Jb(Iw1c4$AX)Q{9p~n7HgBt{=1RrJx&;Ls zj2oSqZFNN*CvmwgGs{a%JQ#OPEo=>=-8((G#Ke7NY+3^Bp5CXkW?EWGXmy-^9X%ss s^~)KSH?q2n6&kjz;u7+A<#b_UC@=AtFTSR0A<(M~p00i_>zopr0D*EN82|tP literal 0 HcmV?d00001 diff --git a/index_icons/apache/pdf.png b/index_icons/apache/pdf.png new file mode 100755 index 0000000000000000000000000000000000000000..741b78cacbbb8f509a9dcb779dc6fafca331a5e1 GIT binary patch literal 778 zcmV+l1NHogP)mYP`{3Z<+uPgP+S=06(&y*r?Ck97>gv?g)ZgFV*x1@$uZ; z+}+*X=H}+~^z`%d^XaOp)6>(ft*y||(B9tO|2{zGkC5uTzWXmT?d|Qw#l`1IO7G(3 z;^N}!eSGOmP3!CH$jHcZb9LnH@XXB2-8?()0R-rpo&Q2b!^6wxNJ#%OHQ!H8zP`rX z+uQE$?#|B6y1KyIgoYj-9{>OUb#-{-TU+%31gioCzP`TgQ&Xy{s_WC%|7&fsvbb_` zbgQeY{}UMHjgPmtx7QjSuCA{3_V)Mp_wVrX`T+#!=;+zm*~Z4k+ZrCdy}k1C^2f)= zfq{kT?eVX#um313{|5`=USRLq+|A9+(`9M9ySvj;Q|SQ(|5R81NlpI^68{Vk=-b=n zadEu7yr`(Gwzjswz`)Vb(TIqRzrVl!eSrTK8vi&u*tWUqs;i8Qj(>lF+W`cMijDsT z3E^;Y@c;k+H#*hT)yvDv|6*k0;^XP*>Abwc|8;lu_4R=T2f@L?B_$<`0Ryb8tl{C| zXm_SH00001bW%=J06^y0W&i*H0b)x>L_0YS^lShC02XvbSaefwW^{L9a%BK#X=XBT zZf77eE;KGSq%(sT0002xNklgtN>W`F<(1CwS8*X(?59~L05 z&?O~RU#8edJ|u#P+X*PrQp;PE7Q<_oZ12Xz#NEZn&=Ae*kzN&`ThUo*qgh_Y#^Buv z1#KeriisLoAVb@^w56nzOqqGu!h>?a0?c*7qQ;FJj4bBe{9pkAR*noEJyA18F7__4 z0DE_iVj&(zUs}(%$aE{Qv*{*yQuM;Q!_H|L*be(A(Y$yR)9e4l;`GDi|FOK?)!OFQ<@Lwt|EjgrnW)#Swbl0Z|JUsQjjii9m*zL8`ThO< zQ(a`*>+&crGRWxv-r?x$_WI4~|IO|Ha&~sGxY}xMaK_~Rl$MsT!O6PA$Fa)RyTanW z$Kk!k<*(lV%IEjY;Pv_a|E#mr`~Cg;|Nr;@|KIWdR$y(()#$Lg+or6=*5mZs?EAgr z|LXbw!PfEI?EL@#|Fzx!n81gR00001bW%=J06^y0W&i*H0b)x>M1DWGL302A02Xvb zSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0002lNklp3# z0E5apAkYSaT+JA;fI}SwXxD^=`hWz)p#pWnA&LPY0beLz)>0{m6C_Xp;)M&!<`ouk zNI?YjP3lZj3bfSJAp+uD@(Pmjyh*AO0?A;HJ-^ry}QJloM@d1r{i+F1GLxGGt}ttFLDQ32=)A zvkN8LS=Af!@IVCQJmUPks&wm>d9p=80-4g@(q)O9f&MZwqU8(>0BguKf z660oZpb9mR3g`UX+|;}hhNMab-^8Ml%sf5sqQunP)FKDpgTe~DWM4f DX%ANx literal 0 HcmV?d00001 diff --git a/index_icons/apache/ps.png b/index_icons/apache/ps.png new file mode 100755 index 0000000000000000000000000000000000000000..2cbfdd791652965348788e5e368575b6910b9c23 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=5z5mf6|aJv}|=&YgSy z{Q3X?|AB(WicPbD6k|z{UoeBivm0qZj#!CnL`iUdT1k0gQ7S`vW|~n!Ub=#jo{65> z660oZpb9mR3g`UX+|;}hhNMab-^8Ml%sf5sqQunP)FKDpguXW9P==3Fp8O>*kj`8C~$a>jcz075f49qZ*C^zuFIDu xEyz;fF`nU3Xf-8qUe7wVV+mnQOs;Hf44-~Vm)b-%A_P)Hw%F~1o67(I0G_AG z!}kBJsin}1SDUZa{0FzSpU;(4e;2n5WEwnaaP| z?SYxf`qGz&oy*Pt{{R30ftkt4^ZLl~|Lp(&m$27?n90BL|IzjOx#9ncsMeFF(2bwU zrmxVGg@^zE0Kf77$9hWsv{0(D&z-B#!tMG10054w*Oa2l0002N^#84;#Z!p8;{X5v z0d!JMQvg8b*k%9#02XvbSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0001yNklK-bz|l#5*iCLm>{B5rBR>8uRl>)Gfe*%=D5i?~4fY-*}b zp6-fr5iq_yqb$OW49prVD147t7REFNWPunId7w8UQRFcJ05Pc+1wIzWH2?qr07*qo IM6N<$f^ZBmSO5S3 literal 0 HcmV?d00001 diff --git a/index_icons/apache/sound.png b/index_icons/apache/sound.png new file mode 100755 index 0000000000000000000000000000000000000000..5d7c4ccd6c798d93b7b7466fe8f65b1cfbcf365c GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWJ#gSac6N48PmiUg<+*d` zfWm(jxUK;y#*!evUY)*tyVj{`YkC9V-A!TD(=<%vb94C$F^Mg@84 z3PyS+dS*+Eo5g`DyggkULn>~W_MH|z;K0FT+RyZ9rNV8;X>61J&F<bP0l+XkKA45rL literal 0 HcmV?d00001 diff --git a/index_icons/apache/tar.png b/index_icons/apache/tar.png new file mode 100755 index 0000000000000000000000000000000000000000..82e7ae509e824342bdcb93b5ff833ec6f6e7371a GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gTFrKM$dc6Lus&;S4b z&z(E>{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@&2;2(bQE-S z6j0XHJ=(~r^=J}{pr?0XQwIl^m80t=j?Ntnj2#Epu&{LT@Gxlp5k5cfwa9;{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@%~a$OcXSju zY{P}aBWS7{*ML>$NB*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@%~a$OcXSju zyywo*M$RJ|j9jXYt}$~KWGV3M@ZfCYh~e!yxQ2zLi-(6{cZ*o;19h)YK+_mJUHx3v IIVCg!00d=4)Bpeg literal 0 HcmV?d00001 diff --git a/index_icons/apache/web.png b/index_icons/apache/web.png new file mode 100755 index 0000000000000000000000000000000000000000..525d43033e78ece596185df4883740960202999c GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ#gTFqM~9{R8&t-&;S4b zEuAc<-1`ocyrH@OB#>e(3GxeOaCmkj4a76z%6EirBu2dYT%ba4!+xRspXz{aM~boA)aM$Tgeh7E=@6nLgzD$qFG zD0-woPp6=e)llTJMC6bP0l+XkKv)xl} literal 0 HcmV?d00001 diff --git a/index_icons/apache/xls.png b/index_icons/apache/xls.png new file mode 100755 index 0000000000000000000000000000000000000000..bad6e4e6a65d2197d69d3d8db88c1b4754fabfd5 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=5z5mf6|aJv}|=&YgSy z{Q3X?|AB(WicPbD6k|z{UoeBivm0qZj#!CnL`iUdT1k0gQ7S`vW|~n!Ub=#jo{65> z660oZpb9mR3g`UX+|;}hhNMab-^8Ml%sf5sqQunP)FKDpgTe~DWM4f DX%ANx literal 0 HcmV?d00001 diff --git a/index_icons/kde/back.png b/index_icons/kde/back.png new file mode 100755 index 0000000000000000000000000000000000000000..a09643db63455c04b68f5443933a27a9e1e1a26a GIT binary patch literal 656 zcmWkqZAepL6uuILnac%XVOT;5u2fJ{5GqtQzY4X@fy^J;zzzFh=0>wtKkTYdQIX7W zaYsp$V9u56Hc)r{VQk1?lWtv=n_P3*t%kkGs`rOtr&l;1Jcn~Q&-2`CYN%19Wu;LR zrKqb_Ye`q`X6hbN^9nL_6qSX#}+^KN>J|yZwzTYQ0YWMTxKFrGz>-$u6JSW z7}%%59m7f&SUfUIenl`7#&$pAL@>?)J&P@2KnY|CV1tKnkd32~V-f6Qk|PY13kVHR%bZhOc($<2T|yrr8(-_xmCe0k>Ek8C zT!nJL{Pt&mzoc*8;B1#CPcF}VHmyQ-diB5Ya*~aJM|9u@vvjBTLcrabIb1NpuD{~)x4TXFuTxzI0Z Zb>{$eJzsU+uiYVXsX9%A+E>+n_dlfNh0g#0 literal 0 HcmV?d00001 diff --git a/index_icons/kde/binary.png b/index_icons/kde/binary.png new file mode 100755 index 0000000000000000000000000000000000000000..f933085077308db5cd5952150e80e7b7d8594004 GIT binary patch literal 745 zcmWkrZ%7ky06qIh7}7t?D6pbh5vZUQ6$U$*IOkgP%;{DuGo3h6n^UrWS*q-E zC$>5x>!Olll^r7nxBPd5#8VJ1$`6M~yG-hWJ{(aW*8K3^JbVsunU1} zoXP0*dN}Cgu^%gn27Mf81?+PX_-N>3r8z~2s+1M+;baEz5lLCpR7J!6yckndH35Cl z+dz9g$lbu;00ylrJ1j|aDp@-xCof59p)6&DUis`=G1VnShFiuDo_Nx1YbmU3DQj}I zT)o&_OVri7a<4Sj?as|UoPCtZgBi)hQn7(N(>8ypidenbcK@zv!@6TVN*NVT$9;F2 z(+lEGd#<_dc2FF>5&v_exY2&9FcvxS>sU`m)}xp2-}a?#9q4B7W%TTta2$A86TIx) zzjr3fmNBz?3w1Wu^!R&Y(;YG;BROaX= zpDj~kRS(Axe$3oi>3H22+OxD>99?*HsI+3Buj0bFr@N+e)^hvEPB<~^%R5x@ghr() zU%M}7Ph7X8U(D3Gj-NmIrlj=?TEjiSt2*)Cp_?Adr5ac7=^Fj2BR|+KtB&~h?Et7N RZ+w^BOcWPd455Om&i_Ejd*q-E zC$>5x>!Olll^r7nxBPd5#8VJ1$`6M~yG-hWJ{(aW*8K3^JbVsunU1} zoXP0*dN}Cgu^%gn27Mf81?+PX_-N>3r8z~2s+1M+;baEz5lLCpR7J!6yckndH35Cl z+dz9g$lbu;00ylrJ1j|aDp@-xCof59p)6&DUis`=G1VnShFiuDo_Nx1YbmU3DQj}I zT)o&_OVri7a<4Sj?as|UoPCtZgBi)hQn7(N(>8ypidenbcK@zv!@6TVN*NVT$9;F2 z(+lEGd#<_dc2FF>5&v_exY2&9FcvxS>sU`m)}xp2-}a?#9q4B7W%TTta2$A86TIx) zzjr3fmNBz?3w1Wu^!R&Y(;YG;BROaX= zpDj~kRS(Axe$3oi>3H22+OxD>99?*HsI+3Buj0bFr@N+e)^hvEPB<~^%R5x@ghr() zU%M}7Ph7X8U(D3Gj-NmIrlj=?TEjiSt2*)Cp_?Adr5ac7=^Fj2BR|+KtB&~h?Et7N RZ+w^BOcWPd455Om&i_Ejdi_@t|K8r_i-n8D%I>tf=FQIT&C>S8#^&bc?(XLHtg`0j;`YVT z|IOO})z;?T-tNW9|FpK=q^jP<&i}Ns-qp_L_WJ*Q|Mu?oz0&`*vb3bK=FQgs z)zaRyvc0sr?#05*l%37q=KrLw-o3uX#lpp`w(hjHy|l*vy}tI<+W*bo|K8sA#meT* z%HEWj&775_&C>szrPZ{)_MDldoSnVy^8e=M_U`Wg_V)jrowV-i_SMqn|N8%=oxT76 z|L*Sg9@1u*00001bW%=J06^y0W&i*H0b)x>L`E07`RxDz02XvbSaefwW^{L9a%BK# zX=XBTZf77eE;KGSq%(sT0002VNklZ#^5)<=AL`zd_#y%*`y*(N<;)-@_%9gf~Cs5A=4T>SVdLTBxo}Ogp!NhQSZMu z-%0j~Xxr}LLK`6$TwpRlU%4As8(lyOz{hdgx%`q9aUH!<>hzY9bw+R`!Q|b0y9@7~ z>s+##xv}jz-ulD#=C@L|(A;?BAOwo2oFnl#P_d!nF44-v9RQ_TtUOvYhtv=Dn_* z|N8%niG%<4|L)?|dwFWTs+8{D#hjUo?&98ib#r@hN@{Itdv#)aaY4Pdv~z89y`_Un zL`ub~lzVw|&Cbnpb#wOW=5uvgdwF~2;^r|hF$Fcq7B-xGNl$DZs6obw&T1N&7hDQU5c(XZEhnC(jFp3#@`ctlC>mk z>@P-8H7yC_+@&knm=?zU(89ar@Fqf>u0PImcn%NeIp^uGudB++RAn*@ zlVzyZ8Red{S=+bDSWuMRz%Xgb`ZJAs0N}kr;wumL)ewmiLh~GIN&w<^h?xM8W=aD| z4&r7ItXQOU4JZXH5{w977f?vV5eR087$IVX5DTImqya!Y5(pNfP9G0s5@w7g#-*Sjs(mYQwYgxO%SVr8IyC6kH!#AMqy(T zq<7d?4r}9pd9*o^&$L6*4iVNWne7q>AK63_YeGjraKah|(P@>qJckCblfeuGjAVi( z1P~&@K9=~)dGDm!p&9oE6LBmDLj3HhUw_l&q|$80x(22K&s#Q$xwcBzWcxIzmC0_K z{-Uj+!(!{adg~g~)@~`ed818TQmid59Y5++%8Ks>9ou+UD4J`#5IU^rUYbAIUOQZL zV6j5cSpTTUwbEK0*G2*Ig;!+@=nv1^Wy9yT%4bj928F((Yss_Au`|Q{AhPe$KjjWs z+;Y$V^jrU)Ue@f^yl#K2awy!fY_Yppq5t7UqorNd+sXpm{gh|+@<`79k;0ifE&lY> zLdm%=?>)^wzphTq_Wr)&IgwcJIX|>=+7&j=@yqMS3v)-iH$0prvq||@o$I}=K6DT- z9LxHUBaFRyX-H_7^FI&ub*5S$PM1xeRi!WOUCk)KFI3lu<^LFizD_q$+0yeL%oA5m literal 0 HcmV?d00001 diff --git a/index_icons/kde/dir.png b/index_icons/kde/dir.png new file mode 100755 index 0000000000000000000000000000000000000000..efbfff885af660240388055b43f47cda9f67ad5d GIT binary patch literal 620 zcmWlVQAkr^6vwYAG#8R!uFN2ViUws|r{XHY$u)J^v?-ATNoR9tSkBEd*PvW#G9*_E zH1xsR1ZD1FU4o=5Azd-?E?C`RK763b_aO0ABff_roURY&9DZ;Pod0j6-c*&PKB{II zCab2JGb=NDuT<$uKXdM21H+^l>T4S-0U#IyX$K$$G68P{ix}Kd;#;Kd2ge?TSl?ogIR}Qe1Zg|*g)1P?DY%AUeULx#H30p zOhAewtxZ(ai3ko|KAERDO>>z|4NN&+Z{Gv!)he#zb!@Qjky}m(Ac-p*77Mc%DwS_*iANF>VH(dZzf!rN$%I1`e*!Q z_Obba{-ONw^Zr?Bb4~O5S8o1KwPxktO0j*@x;+xb^02D=_7Lls-BG9VF7$Xa#=Y;h z$1BWF=g+2>WIW#e-d9I!OLN<1yKTQ!W9kyk^;6fb+{nAN|HOggO=B9dj5U2(tHn(I zOYYf4KKMhY(|vQj$R@>qzVgqxzY`NVrn+?I?eMYE_0yId*q-E zC$>5x>!Olll^r7nxBPd5#8VJ1$`6M~yG-hWJ{(aW*8K3^JbVsunU1} zoXP0*dN}Cgu^%gn27Mf81?+PX_-N>3r8z~2s+1M+;baEz5lLCpR7J!6yckndH35Cl z+dz9g$lbu;00ylrJ1j|aDp@-xCof59p)6&DUis`=G1VnShFiuDo_Nx1YbmU3DQj}I zT)o&_OVri7a<4Sj?as|UoPCtZgBi)hQn7(N(>8ypidenbcK@zv!@6TVN*NVT$9;F2 z(+lEGd#<_dc2FF>5&v_exY2&9FcvxS>sU`m)}xp2-}a?#9q4B7W%TTta2$A86TIx) zzjr3fmNBz?3w1Wu^!R&Y(;YG;BROaX= zpDj~kRS(Axe$3oi>3H22+OxD>99?*HsI+3Buj0bFr@N+e)^hvEPB<~^%R5x@ghr() zU%M}7Ph7X8U(D3Gj-NmIrlj=?TEjiSt2*)Cp_?Adr5ac7=^Fj2BR|+KtB&~h?Et7N RZ+w^BOcWPd455Om&i_Ejdb*p%tRRyXl&@RmfUS5i(*Dj4AFEevo+GLRw5IH zYan=|k84zZWHN^iHbI=waF-a|RjXcN#fvCis2`W;&(qxl=Nt~4^XKr4w%8gA3rY$Q zLWR~QGovb<1GP`(ijzflgfs_R&N(aqK(aC+$_yXng7Z=uL)wM0oD{K?COAzb5#x-^ zO@-uL1wUf}Q*zh^DHit{r6CuNh2qm=@-!n8MOvOGH_rk##)Dp%ErWkR0wywGgfIi5 zO9%?ENJU3k*fNl;0x=q60wfL*lhRHBkCF*24EZ6=K$Zi-K^Q@z0Y)g;U||D6%plFq zKtx9}1Tud3qp|=IglD}2%M=`kfDW<@$O;5$zq0|tCJ;@qNGC;t zGek<^89pTNQ7J`oBVf5{ZuOG7j>gB>?5Li6^5o3b=0@|yK*8ry)fD?Itv-8?$JgK1 z*N!?mJykclJIbmmt1D}SQ><1^ytSGe9Je#)$DK#mdOA4IPn7^{BH3ZR3jtu-uABQ+2>aoIwR}|8kbDr1{Jpt((S|Oh6o+B>>ow_KUn>lQC#bR=lAfy^WphD5obqRP1WWq zf*@+zk6T?OUHhLaD@xbUw5F3F%Fa6-T{d0U@gmmp5Pii6VyGb{qvAzf%|Qr}ra`Kg zQF9tBKslo-vx=OSgh_!3G9U(&tk%;@W2{qY2=l5u!s6!wHw&aGiO+CS1h}R&#Y>@4 z)|Wvb1JxPP;-1aX}t#&X9Kn}4tSbh{pGZH_}t9cc>Nq&MClcE}6$npJhGbtoR zG}PnEBIvZJc}Rw(9ye{d;Q|rRbBaa?%Q=YhD%$QfD9 zDi~vFfZ|*1WWdGeft;7+Fe|@Sxjcde9F0VoA%=3(nuhe>x;77C0V%T@7ZX8DP%>I# z-J0vA>B|OP9i2oAoa_5@5UhW&b)_c`UoV(CxzH;f@HnZuV z=`eqQtt%x8?N&>dfBx*5681FgE&E_zZZI@7I{G{&)2%3YSXXOK)_n$1@ap897q`FE zKDZw%x9vDuvj9H*YT|=;r<;@ZP4(sx@mo@UY|foLL>7x7qj2$0XYA)H@1b0)%{~`0 z?s_kb{4F0UNN*P_{Qi(p3`)DVJla4Fhg0#f=8$py$Bp%G`j=7RR%`Xx-H@?z<3wZN zUeSB{=5%${SjhO!)#Z0D9jgq}>Zxdp(Xlg8nRx$w>kr3psyk}mZt{Ad=R>2(Ks+Os n!iji1JdsKfPs$fo)O!e`$dH#-zbrm2eM_|4I;_uI&kX+qOJ;M4 literal 0 HcmV?d00001 diff --git a/index_icons/kde/java.png b/index_icons/kde/java.png new file mode 100755 index 0000000000000000000000000000000000000000..0769e963a3d4b7894cd5e08cb1795c12e9c260b6 GIT binary patch literal 656 zcmV;B0&o3^P)^7fRGl*Piu#lp?Bw!NI0q?Aw)b3hnkWqan@-h+jd zoRzG5acU3<2vST+q@kpgm9&e2d*0gKw63(((%zJPV&2l#-rnwWaf6gl7@UQ3q?L=s zzQtlpIkdLL#lqE;k*u_`#l^nO-rnZs;_jrSy{xXioRy@#y1k^KtT`YE&BoQFp|q@} zz3%S+?&j`dI0#~4gL7Fq)z;>Fb&Hgdq?~y}r$Jb&I5(q$wB( zN-PMhuB@bOIqvT6#lF3)s#MTEfu{DNsI zX%LZQus|?lk_=BgSb)cti$67$lao!36{>>K!pbH!fssv?4Xi@n+(p2eF@c@gz#$2! zLR(jyMTW&*gguFgSu_!-BE~;T&rDrH+A=ALNdRPqw~@Spvl@3?teZ%ZP-;8_tFdQ5 zL^yYll(>hVuo%dUL?sg~RX#@zLotpdp#-2AlF%q@~5x(&p~w_N1=GtgglO_V%2iz4r3| zthUYG+UEcI|FpWz=Hl*@m8`|a)y>M@oRzfy|Nr*#_Rj#}rvLx|0d!JMQvg8b*k%9# z00Cl4M?@{n+Ce=4000(rMObuGZ)S9NVRB^vXK7|KaBgQHGA=YOHl#Cy7XSbNqDe$S zRCwA=&u0&VAP|6IK$fG9T1WRpPC)+u&ufg3mdky)Jb4okLbkAnbsY-NEK?#x1}0wY zk{cs6SnGbmdkV9g-Jf8P4)rdGB=PU6Iu>;hQ*Ii`$mM0{O-xTL#HfzfAqd<^sr&MA zZ$l%&p3*c`Y9AZs#5DQzrHT!~=?!4aqQFcutqCc+(7%q@~5x(&p~w_N1=GtgglO_V%2iz4r3| zthUYG+UEcI|FpWz=Hl*@m8`|a)y>M@oRzfy|Nr*#_Rj#}rvLx|0d!JMQvg8b*k%9# z00Cl4M?@{n+Ce=4000(rMObuGZ)S9NVRB^vXK7|KaBgQHGA=YOHl#Cy7XSbNqDe$S zRCwA=&u0&VAP|6IK$fG9T1WRpPC)+u&ufg3mdky)Jb4okLbkAnbsY-NEK?#x1}0wY zk{cs6SnGbmdkV9g-Jf8P4)rdGB=PU6Iu>;hQ*Ii`$mM0{O-xTL#HfzfAqd<^sr&MA zZ$l%&p3*c`Y9AZs#5DQzrHT!~=?!4aqQFcutqCc+(7MGF_4IB}x6x!KXt5vcNL;j=&>#aI&L7tG-B>_!@p zBUa)XQ4*Y=R#Ki=l**8vnPyawm#$!>XQF4e#JE`;s3OVJ#WAGfR&v6Fy6^88n3)gX zHBNtLWbol$<&y2?%*^){+1jr2OU!7P(#LdoneYGq+1bW5kz2E_KB{PopKNV)sNu?& znZ{=urWm%Q8x=n@nJ~xQJ=*T@^G{noZK-Jc`@ivlK7+i3?!L00GhPF2WAJqKb6Mw< G&;$U17ikUv literal 0 HcmV?d00001 diff --git a/index_icons/kde/mov.png b/index_icons/kde/mov.png new file mode 100755 index 0000000000000000000000000000000000000000..308da7ab2eb3ec90fc29ec08514bb55f16dcc83b GIT binary patch literal 374 zcmV-+0g3*JP)L=cs-4J-fv02XvbSaefwW^{L9a%BK#X=XBT zZf77eE;KGSq%(sT0001qNklV4OclwrMxRKZnaU<0zNH{LCRD;O#B)j-q zj8~6+Ul%bw3?uf{ATbXQR3$1bZH!iYW-v3#=04-b+ UK+Bi#FaQ7m07*qoM6N<$f&vS@*Z=?k literal 0 HcmV?d00001 diff --git a/index_icons/kde/movie.png b/index_icons/kde/movie.png new file mode 100755 index 0000000000000000000000000000000000000000..308da7ab2eb3ec90fc29ec08514bb55f16dcc83b GIT binary patch literal 374 zcmV-+0g3*JP)L=cs-4J-fv02XvbSaefwW^{L9a%BK#X=XBT zZf77eE;KGSq%(sT0001qNklV4OclwrMxRKZnaU<0zNH{LCRD;O#B)j-q zj8~6+Ul%bw3?uf{ATbXQR3$1bZH!iYW-v3#=04-b+ UK+Bi#FaQ7m07*qoM6N<$f&vS@*Z=?k literal 0 HcmV?d00001 diff --git a/index_icons/kde/new.png b/index_icons/kde/new.png new file mode 100755 index 0000000000000000000000000000000000000000..c7987dc766b3b58118516aca753cc2d4c107caa3 GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^GC<77!3-q1&-R!xFfg(P_=LCuxj^t22*8X#fBydl zf&W0>&!4}3{`~pl$B*ydzXQ2nzI^%o`7@C5@#9CZT84M;-UAtL-@bkG=FRKZZ-DGq zuU@@)@$&ie=TDzLee&eVeXvk zuU@@;`SPVpKy>N+`3q;yo;`i~^obKEjvqg9^ysl8M~)siaA5y_Alkoo@4j8TcJ15= zL_2rv*s*Qf_Kh1iZQQtV-MV#a)~s2*8i-b}T)Ar5vgL~xFJ7=i&+p#`gV4-6KQlIt2ZB7zOm7XoZ7}fNX<%?+67S?T zkG4csH!cOsl^YD683?4YF&PN^SgdMRasAS8D8X}vMF&Sw7<2SWj%f_9TO=4JeKBW` zKE)cwX)eff$jPSU;Jb(Iw1c4$AX)Q{9p~n7HgBt{=1RrJx&;Ls zj2oSqZFNN*CvmwgGs{a%JQ#OPEo=>=-8((G#Ke7NY+3^Bp5CXkW?EWGXmy-^9X%ss s^~)KSH?q2n6&kjz;u7+A<#b_UC@=AtFTSR0A<(M~p00i_>zopr0D*EN82|tP literal 0 HcmV?d00001 diff --git a/index_icons/kde/pdf.png b/index_icons/kde/pdf.png new file mode 100755 index 0000000000000000000000000000000000000000..d719762854d57b81813085bd2bd3abc76e5d663f GIT binary patch literal 532 zcmV+v0_**WP)(1F=Hl-ENGaah?%v++_Oh(r+UE95 zG5^}t?(YB1p{(w4V)l)L_Ba^cot*z|TGh_x_P(^u&ffnx82?N$|AA`eg>&wX1?!v|YnT!8KDems}oSnVq=JxjT|D2t)?&|iWoxRo4 z=Kufy_VV_nAI>xY0004WQchCc@4fd~@U~~oodEzj9`6m}anBP8$nyU($7U!J2H~r?EU_)a#dy76s_#-G5Fu*FtC|nixeiVj&(zUs}(%$aE{Qv*{*yQuM;Q!_H|L*be(A(Y$yR)9e4l;`GDi|FOK?)!OFQ<@Lwt|EjgrnW)#Swbl0Z|JUsQjjii9m*zL8`ThO< zQ(a`*>+&crGRWxv-r?x$_WI4~|IO|Ha&~sGxY}xMaK_~Rl$MsT!O6PA$Fa)RyTanW z$Kk!k<*(lV%IEjY;Pv_a|E#mr`~Cg;|Nr;@|KIWdR$y(()#$Lg+or6=*5mZs?EAgr z|LXbw!PfEI?EL@#|Fzx!n81gR00001bW%=J06^y0W&i*H0b)x>M1DWGL302A02Xvb zSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0002lNklp3# z0E5apAkYSaT+JA;fI}SwXxD^=`hWz)p#pWnA&LPY0beLz)>0{m6C_Xp;)M&!<`ouk zNI?YjP3lZj3bfSJAp+uD@(Pmjyh*AO0?A;HJ-^ry}QJloM@d1r{i+F1GLxGGt}ttFLDQ32=)A zvkN8LS=Af!@IVCQJmUPks&wm>d9p=80-4g@(q)O9f&MZwqU8(>0BguKf%q@~5x(&p~w_N1=GtgglO_V%2iz4r3| zthUYG+UEcI|FpWz=Hl*@m8`|a)y>M@oRzfy|Nr*#_Rj#}rvLx|0d!JMQvg8b*k%9# z00Cl4M?@{n+Ce=4000(rMObuGZ)S9NVRB^vXK7|KaBgQHGA=YOHl#Cy7XSbNqDe$S zRCwA=&u0&VAP|6IK$fG9T1WRpPC)+u&ufg3mdky)Jb4okLbkAnbsY-NEK?#x1}0wY zk{cs6SnGbmdkV9g-Jf8P4)rdGB=PU6Iu>;hQ*Ii`$mM0{O-xTL#HfzfAqd<^sr&MA zZ$l%&p3*c`Y9AZs#5DQzrHT!~=?!4aqQFcutqCc+(7b*p%tRRyXl&@RmfUS5i(*Dj4AFEevo+GLRw5IH zYan=|k84zZWHN^iHbI=waF-a|RjXcN#fvCis2`W;&(qxl=Nt~4^XKr4w%8gA3rY$Q zLWR~QGovb<1GP`(ijzflgfs_R&N(aqK(aC+$_yXng7Z=uL)wM0oD{K?COAzb5#x-^ zO@-uL1wUf}Q*zh^DHit{r6CuNh2qm=@-!n8MOvOGH_rk##)Dp%ErWkR0wywGgfIi5 zO9%?ENJU3k*fNl;0x=q60wfL*lhRHBkCF*24EZ6=K$Zi-K^Q@z0Y)g;U||D6%plFq zKtx9}1Tud3qp|=IglD}2%M=`kfDW<@$O;5$zq0|tCJ;@qNGC;t zGek<^89pTNQ7J`oBVf5{ZuOG7j>gB>?5Li6^5o3b=0@|yK*8ry)fD?Itv-8?$JgK1 z*N!?mJykclJIbmmt1D}SQ><1^ytSGe9Je#)$DK#mdOA%A_P)Hw%F~1o67(I0G_AG z!}kBJsin}1SDUZa{0FzSpU;(4e;2n5WEwnaaP| z?SYxf`qGz&oy*Pt{{R30ftkt4^ZLl~|Lp(&m$27?n90BL|IzjOx#9ncsMeFF(2bwU zrmxVGg@^zE0Kf77$9hWsv{0(D&z-B#!tMG10054w*Oa2l0002N^#84;#Z!p8;{X5v z0d!JMQvg8b*k%9#02XvbSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0001yNklK-bz|l#5*iCLm>{B5rBR>8uRl>)Gfe*%=D5i?~4fY-*}b zp6-fr5iq_yqb$OW49prVD147t7REFNWPunId7w8UQRFcJ05Pc+1wIzWH2?qr07*qo IM6N<$f^ZBmSO5S3 literal 0 HcmV?d00001 diff --git a/index_icons/kde/sound.png b/index_icons/kde/sound.png new file mode 100755 index 0000000000000000000000000000000000000000..21f29085ef83b414f568e578eca70ae552350a8a GIT binary patch literal 697 zcmV;q0!ICbP)I2CYMhmv5Uvmi z@(7Evi$TUg2>J-_=I(oWdohJE0GSBQ-o>24q|M6BO4323(xh{~a|n?LdwqM0nS)YL zQW&}z7T)_aS}i*w?0-rn9pL_xH+wC3L4 z2-XMyvH$>u0JPq$0F3}@ZF2zD06920=HljaacV(8K|wr0y~ecO*45R@%~F+8TAfAQwu%^Wd??Hu(*1mQlLgqu)c@^M4h}|CKnqBsyXL@1+-IrIr+UkrG3H` ztib}V+)TxcCETo>VeE1szI|~Ca|tsOk5>RM2RleWtC*QlRZ`57otHyOG7Tue%2>j} z0@TH7ED<7M2o%U+E@n)M*G&!;5=`I+8=5F;#lynL#3{%jAO&%Vn7CW9i-3?$KEe+y f;-V$7ieM%H<`p15e8jG400000NkvXXu0mjfOB*wv literal 0 HcmV?d00001 diff --git a/index_icons/kde/tar.png b/index_icons/kde/tar.png new file mode 100755 index 0000000000000000000000000000000000000000..3c2cc56fa12303aae194466ab9f2f431e91f6811 GIT binary patch literal 724 zcmWlWZ%9*N6vnTpG)9&vX;~lkLCjfNQwx?*Tg-pcM5cjS!gc9v11;S|Z7G@<+5I5? ziv)!%Ez)(9IV6QEI=E(w*V1@rt$2eW?}v$(Qh1T|;q7|hoQDS<4*bsPD=o>7Q6?!F zhKVUGFqmYGJ#0m!JX6z;moZF4S7~v1E|n`x#(b1pBI0if){zv%P@)WFJOPR%YV3yE zcEl|b(}1L@L#|CZ1MNKF#(}ts;X3N!G3PZ`jZ5~hQ`-SFHNZ9@X&YQ3roaa^4IU>C zPgV;sNSy<~IBv8}6Z^Cr0Cpb3079Dx1SNGf(6=DLFR6U$F&{x;>RH9MJv$^++afyM zgjRtUXlxP@7J*D5Z*T+7 zOC(B%r+|7??U@%eyvE)u3hP*1CkhB_JFun&sI1WLro&!a&%8uJ#Ap>1UWL8`RxO#d zRwy72hbcl31hBdZ$cK0GIP6w_mR}O#FqM=sI{e*oXv{_VhR$mr^mf@KIC3i-W%n$O z)|%!zrrv7Fyx&-_%FM{lxICHFlPD*?6&m#AZGk&1%f{C0qB{rKw4&5RZ!1>R{E2(} zj8!XdME|{+UKI0kCv+wR-yLMXcu=u(`+R8kxw6e&x$u$qgy9{M|=45*0HuGy8sS#?gNv>gTJv u-O9v@m1QrrU2#`WnT=KTeCz+Xz?5cuZk#iGjb)KKc)YDvUY+ literal 0 HcmV?d00001 diff --git a/index_icons/kde/text.png b/index_icons/kde/text.png new file mode 100755 index 0000000000000000000000000000000000000000..13d56b5e97f1f4f6b4ecb9972d20ad98a5980972 GIT binary patch literal 571 zcmWksZAepL7=1@*H%q+r!wn-8S>b*p%tRRyXl&@RmfUS5i(*Dj4AFEevo+GLRw5IH zYan=|k84zZWHN^iHbI=waF-a|RjXcN#fvCis2`W;&(qxl=Nt~4^XKr4w%8gA3rY$Q zLWR~QGovb<1GP`(ijzflgfs_R&N(aqK(aC+$_yXng7Z=uL)wM0oD{K?COAzb5#x-^ zO@-uL1wUf}Q*zh^DHit{r6CuNh2qm=@-!n8MOvOGH_rk##)Dp%ErWkR0wywGgfIi5 zO9%?ENJU3k*fNl;0x=q60wfL*lhRHBkCF*24EZ6=K$Zi-K^Q@z0Y)g;U||D6%plFq zKtx9}1Tud3qp|=IglD}2%M=`kfDW<@$O;5$zq0|tCJ;@qNGC;t zGek<^89pTNQ7J`oBVf5{ZuOG7j>gB>?5Li6^5o3b=0@|yK*8ry)fD?Itv-8?$JgK1 z*N!?mJykclJIbmmt1D}SQ><1^ytSGe9Je#)$DK#mdOA4IPn7^{BH3ZR3jtu-uABQ+2r@Fqf>u0PImcn%NeIp^uGudB++RAn*@ zlVzyZ8Red{S=+bDSWuMRz%Xgb`ZJAs0N}kr;wumL)ewmiLh~GIN&w<^h?xM8W=aD| z4&r7ItXQOU4JZXH5{w977f?vV5eR087$IVX5DTImqya!Y5(pNfP9G0s5@w7g#-*Sjs(mYQwYgxO%SVr8IyC6kH!#AMqy(T zq<7d?4r}9pd9*o^&$L6*4iVNWne7q>AK63_YeGjraKah|(P@>qJckCblfeuGjAVi( z1P~&@K9=~)dGDm!p&9oE6LBmDLj3HhUw_l&q|$80x(22K&s#Q$xwcBzWcxIzmC0_K z{-Uj+!(!{adg~g~)@~`ed818TQmid59Y5++%8Ks>9ou+UD4J`#5IU^rUYbAIUOQZL zV6j5cSpTTUwbEK0*G2*Ig;!+@=nv1^Wy9yT%4bj928F((Yss_Au`|Q{AhPe$KjjWs z+;Y$V^jrU)Ue@f^yl#K2awy!fY_Yppq5t7UqorNd+sXpm{gh|+@<`79k;0ifE&lY> zLdm%=?>)^wzphTq_Wr)&IgwcJIX|>=+7&j=@yqMS3v)-iH$0prvq||@o$I}=K6DT- z9LxHUBaFRyX-H_7^FI&ub*5S$PM1xeRi!WOUCk)KFI3lu<^LFizD_q$+0yeL%oA5m literal 0 HcmV?d00001 diff --git a/index_icons/kde/web.png b/index_icons/kde/web.png new file mode 100755 index 0000000000000000000000000000000000000000..594ff8d2f9bca0502cb78486f98d75f5e3c8d938 GIT binary patch literal 748 zcmWlWUr1AN6vwYc5Q=nzEU|){NX-Y$*&i55d1J#|A!~D~%hXM#xtc2#%4DIA9%5YB zN-JZN)Cp;~5jG+Q3ze=q_0Ev4gb%+5wI8DJd+_1+Al2y#=bZ2P9zHMUoad&Bvdr|H zbcSIv%dhFpsLLz zDcUuv7zMzHh)e6TBB2y^^#G zObO-%qU}+1EeLi&UMBuHuy(5Ll$axmD=4uwB3i|A3iDnt3o=tAhr$VrDcPc-a76Nd1yK0Vh7^*ugo~DjR_BJQe+|pG1 zptYGRE<9g&F>=m#OeMC<^?c>y)y4*j#9*^HADc!nK3TvadG%v0>U({d`6mp9p1b$Z&iUb_(ROfO1j z^5)OpZONOlSu9hg$jGQ?Q(9^awC2>**VitvBjShThDPJL!@3re3%92NwXL3!g4f3! zw*$Gil1cMIfEx^UN`&u@X1qk^~t$?Z3CYBuM97qe7aX* z&1!TWm>VPJf5l_DPfnaLWpPUnGcvj+tX6ArueGTA594DRaxafpO`a-M*JjEM75eDa GhTi`QSCuCK literal 0 HcmV?d00001 diff --git a/index_icons/kde/xls.png b/index_icons/kde/xls.png new file mode 100755 index 0000000000000000000000000000000000000000..6f451412c47988615cd3ee9f7e4fb606706d8059 GIT binary patch literal 655 zcmWkqZAep57{1H0X^576VTIBkOLLS(-(bmxie)ynq(7<9rjZ}yN^6?v&1j8~;*P%V zu+f#!#wxq{Rd>kf+)6mZhG*u8qbxkh!joBD@=tdC@jfpPywCf*&uc3z$cc+hie(rk zE-zPaRC~fwX`@u!mJwgXFq-X!$BGS$i;MPlI}TxmD!hZI5e3Q!jv&D)5KM50pa8-_ z?Dj~ULlk=@p-beQyyOK^9{^rxx7mRYKtELG6-p?O0hCo4m4+ljC<+o3LW-i0Fricd zJ_x*+?O{;>lX(KXfP@w3N63$Hkh*&$8llJ!fsAm70v}@ASwyhl&*W_b^9?P56_M~Ol)Q6dTrQ+qEb_DO%F7 zyPtzHfoleNPG>hClbV?hyfgnTwF zk&65reMS1eZSdHSQpjUhwF z_$gmuf+00VlbwCjrqu>sJ}z@t;Pw=~c?X=F`i<)W|@==JFyUG9_NYPP) z_mf-tZ>%Wp>%KIZn39!ttG6X1-<7n`J$8IFvFZJE=jMrqUEjf)xpz_NO}a@(Df#OV63PGi!OlNvej;Yu`nnE|V_;r`cV*-~vR kK^NAUx8{(we>eU65x??LrY`jpe^m|4*@37Cr+F=f8qSR#ah}xWsD_3e!&b5&u*lFI7!~_E*x$5rd9ztVkNE-CBgY= zCFO}lsSN3vX+{Nk=?X@ACVFN|jGM)QDzrRZ978H@B_}8d6>vCYqy@4XoK*{AOca?G p?yywnl<0yk-2@&scD73l401`#x8k^eO9OQ=c)I$ztaD0e0sw3xLHPgx literal 0 HcmV?d00001 diff --git a/index_icons/osx/binary.png b/index_icons/osx/binary.png new file mode 100755 index 0000000000000000000000000000000000000000..12fb3874e06657c0f7e44696d0efb410d10c53a2 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ{r~^}n>VljUReD1(kd2K z*3X|m|2egod&9)JKn08?L4Lsu4$p3+fjCLt?k;SJX*+6x9I+DDh?3y^w370~qEv?T z%rv8dymSR4Jrg~%CC1I-KoudLE{-7;w~`ZpAhCfdoSoyWkQ9?BhiGX7M~hQSOe4<( zfrta9ENhf5SgKxOR1un#^o(grF>hg6p&_F-m!WZ3Awza?A){xbZ(5VljUReD1(kd2K z*3X|m|2egod&9)JKn08?L4Lsu4$p3+fjCLt?k;SJX*+6x9I+DDh?3y^w370~qEv?T z%rv8dymSR4Jrg~%CC1I-KoudLE{-7;w~`ZpAhCfdoSoyWkQ9?BhiGX7M~hQSOe4<( zfrta9ENhf5SgKxOR1un#^o(grF>hg6p&_F-m!WZ3Awza?A){xbZ(5Wo&eJ zeTIjQ+}`BC!pP0f*L8Mw?dImj$%+l&(Fum$k*1^ySlpU?CZk8!SnO; z|NsBFyTN)+di4MR00DGTPE!Ct=GbNc0004EOGiW`vyR<`YA^biR(S!=^XZ{2S0gFMweQ cKnPBVADN33au8{{-~a#s07*qoM6N<$f+DN4rT_o{ literal 0 HcmV?d00001 diff --git a/index_icons/osx/comp.png b/index_icons/osx/comp.png new file mode 100755 index 0000000000000000000000000000000000000000..e5118f16dbff6c0290785a8d09ec9f9c05a4a0a5 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eSlAh>;M1%*Q{AHZQ9iNbLW|v znfLbf1&0J{>*yRmapL;5YljXV+`M_q-Fx?T@7neG^XGHt&p&5^q7tkoik|4ie28U-i(mT6PyIg9~L2`a-mvbMdr8x!h z-j+!&&zri6``-tT@{gSF`p&$uRrtjqj#YvaNS%(YAT;YSV(L8>dH=9c|(GP#h7OTzceo;O5+ew-0UtA;keg1v#HvjJl+)lgN=iyAEG$4kK&-5+ARr+&HaD}gv~PyP6ciMHetx5}+Gl^h&d<+gfWU2S zY?hXl(%J2stJgqKd1Pf}*Vfj%y1HCkT*AS@pPinEg@uidj^*d)1O)}`?CbOM^T)`@ z|Ns9A3JOyPY+C>T00DGTPE!Ct=GbNc0004EOGiW`v-U1j z?3}{pva`C2$LgKj^Q_P9n%MB8+Vz!{oU*{dyW;or`T3Q=GqtSq>YY_((d?ihoS83>!rrpZI!N*ouhKP=j7zy*4W;*(*4DS<^VinTi^uG#xxkFT-tG&D4^tIRV`ThOC!pMTa=Zm}K!MVD1m$a0-;-l5` zoXF|C;_`yJaWbrmAl@S z&hLeemW;x%0004WQchCi_@%7IZ~ebW?9;ba!ELWdLVsW-@SYXCN{zG%hxzGlLfZ008Yt zL_t(|+D(sDZ^SSV2G&y@{mCVZozHKI z#y%}~GB0;MzN2PVXIe)&Lirb4c;PXl&t6 z-uqZH7+F>wtM~nNz|`R;C>qX=P!fzwAGGK8YpI)!jU7%Uam5ko@>%L&^q)FYE3K}o un++|gF?Cj><-rm;U<%O!qywK4oq{8FW-|EBH?ZnsV?B(9u-|M^A?D_NU$-%(1%H`7Q_uSs(uEx}?*74ru<;&OU zskFcI?B!LT*UR1M{`&cJuHHqM)4RH~AcDcX&*Ay~{h6h=VW!)LowlvX<+8fKoWkZv znbTRP+k>jlewViG=H|4|>gC_xz18F7=Iqno@7~td`SkNSkj}f_^v=)ErKY8OpUA?& z!R6=YySlpn|Nrdl>sX80xc~qF0d!JMQvg8b*k%9#00Cl4M?^`71>}4H000(rMObuG zZ)S9NVRB^vXK7|KaBgQHGA=YOHl#Cy7XSbNrAb6VRCwA&%2g7CFc3x2gy8OsySuwv z2>V~qFa=~@fAy&g09e)pLD;^hAlq*8sPt!>dn23zKu`3p@(S^AOFk(eFOVfGhOAH) zN>MH|h!&>XG*wq*C`gxsABmPiL5Gk)2zwOh5&#Z|e}}OXKVM^S9Pjn$`cwb_002ov JPDHLkV1mWf9q<4E literal 0 HcmV?d00001 diff --git a/index_icons/osx/generic.png b/index_icons/osx/generic.png new file mode 100755 index 0000000000000000000000000000000000000000..847ce7ecf653a1fd1c4fdc1a7a14eb57813aad88 GIT binary patch literal 609 zcmV-n0-pVeP)s z)!5~hmX!!ydJle>lcdyHY;=u_ufl@P(ra~S^ob|!Di=8 z_sr=ExDL>$4D!Vwxafe9h zwjQFdjoD@g-#ud6s@-jOy~nxU&7pA)@O`51-%Jx|X~2|iT#UT*37}CxY&KF+vMNgg|~O!*ssId7dul?gsr1|Yf(#5WrL=|xwH*Qa*?OK$houB+2zmB&)wbKmX?*Xv$XT` z^ZEMv<>%+u*4D_#$h*3_!ok7+|NpG4tgI2iSpWb40d!JMQvg8b*k%9#00Cl4M?_74 zXdq<(000(rMObuGZ)S9NVRB^vXK7|KaBgQHGA=YOHl#Cy7XSbN!bwCyRCwA=&ev7~ zK@0}qrHiOoQ0$6bupw4Jg(=CV?7siwaM+m(b8_{aB!7~`i1$9vB~4-}ku`?JPz15| zifZpaDVYeXjoH)f{%1ckHbB}LH81ZzHnv#fN_}tbb-UX>)x1<3t-Yz yKoBb4RUSPd+mHebhDimrnBcN2yJb7K{B!|~@+#o+@1X(!0000>;M1%|DN`~bo1@xC090Y z-ZE#^wVz7^elGRso_qe(#g~7NdQV<@W!BQmX)T9lufEG@r2~$S;_|;n|He5GTpo-9_?E-qsEv zN36s(q9iy!t)x7$D3u{SGtH?!J*pj$H7(YPwmk z)wYM4f9v8xj>ieF?6ZCLr$+v}mM zxvj(Cnx(OxjfFL+(rK{GdeP^XjD^nZ@`rV7!nw4bmX6of&o`pbjMMU_oQ|=(&7*;o zF{U+?CbOM^ZEMv|NsBO!NH?TKaKzZ00DGT zPE!Ct=GbNc0004EOGiX7uG}r;0000MbVXQnQ*UN;cVTj60B31tGH`BZATlmAE;ghy zgBJh*0F+5YK~#9!P0v>n!!QU0P+2bNy;rA45<=knUoMV~CfUz7%K%C#4UhpCqm{&S z2xy%*E&?Lj8Zr>6LL)w{q~qx;sPnvU1TX~etkb%MiUU#aHt!;WH0ZS)EbikorqZC( zvmACFJ4)pax?a|s(X99Zz9-xL(Qy(-I25acB>~S&Qzqg+h)Lq5F)g_I`6e0ETRwa_ V8Yq>t87}|;002ovPDHLkV1nlk%X|O; literal 0 HcmV?d00001 diff --git a/index_icons/osx/key.png b/index_icons/osx/key.png new file mode 100755 index 0000000000000000000000000000000000000000..e5118f16dbff6c0290785a8d09ec9f9c05a4a0a5 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eSlAh>;M1%*Q{AHZQ9iNbLW|v znfLbf1&0J{>*yRmapL;5YljXV+`M_q-Fx?T@7neG^XGHt&p&5^q7tkoik|4ie28U-i(mT6PyIg9~L2`a-mvbMdr8x!h z-j+!&&zri6``-tT@{gSF`p&$uRrtjqj#YvaNS%(YAT;YSV(L8>dH=9c|(GP#h7OTzceo;O5+ew-0UtA;keg1v#HvjJl+)MGF_4IB}x6x!KXt5vcNL;j=&>#aI&L7tG-B>_!@p zBUa)XQ4*Y=R#Ki=l**8vnPyawm#$!>XQF4e#JE`;s3OVJ#WAGfR&v6Fy6^88n3)gX zHBNtLWbol$<&y2?%*^){+1jr2OU!7P(#LdoneYGq+1bW5kz2E_KB{PopKNV)sNu?& znZ{=urWm%Q8x=n@nJ~xQJ=*T@^G{noZK-Jc`@ivlK7+i3?!L00GhPF2WAJqKb6Mw< G&;$U17ikUv literal 0 HcmV?d00001 diff --git a/index_icons/osx/mov.png b/index_icons/osx/mov.png new file mode 100755 index 0000000000000000000000000000000000000000..80b751b7f0ccc85cb203c364befaaf2d94238610 GIT binary patch literal 542 zcmV+(0^$9MP)B+J}XO9hJ!+jlKB#{0^7Z`TF`2qSlR$mKle=+~(_*xzV-O z=cLZ%jK$sS^YT5G#W|bHgSp)RgT+&_-d(HNP@~KUkIsjku?vsT3XjkakIlBo+!vI} zjh2?Z&fFW8&jN_ZsJg`hgvbhw!%LL8AgbV%#^2W7<$A#40(`vQ<>l1n@tw}*7M9Q3 z>+(gS&H4TP38UH0*4M+`@0`HjXR_PQ&(Ffa!R6=Y-QM22y1K{6$c>JUv$M38mX+-6 z>(|!S|NsA`rln$Q05<>t00DGTPE!Ct=GbNc0004EOGiXV@B-B80000MbVXQnQ*UN; zcVTj60B31tGH`BZATlmAE;ghygBJh*0KZ8@K~#9!J4+FRjWPP{GlpgQr!K#za5@I z0EP71AG{1_%Z!Htlh4{kas4p|T@^%)ERS;vU}GQ=vm>OW0wTp?&5784MRM&@LE)$a gFlIXj0JdNM2N|Cytq7SS+W-In07*qoM6N<$g1Rafu>b%7 literal 0 HcmV?d00001 diff --git a/index_icons/osx/movie.png b/index_icons/osx/movie.png new file mode 100755 index 0000000000000000000000000000000000000000..80b751b7f0ccc85cb203c364befaaf2d94238610 GIT binary patch literal 542 zcmV+(0^$9MP)B+J}XO9hJ!+jlKB#{0^7Z`TF`2qSlR$mKle=+~(_*xzV-O z=cLZ%jK$sS^YT5G#W|bHgSp)RgT+&_-d(HNP@~KUkIsjku?vsT3XjkakIlBo+!vI} zjh2?Z&fFW8&jN_ZsJg`hgvbhw!%LL8AgbV%#^2W7<$A#40(`vQ<>l1n@tw}*7M9Q3 z>+(gS&H4TP38UH0*4M+`@0`HjXR_PQ&(Ffa!R6=Y-QM22y1K{6$c>JUv$M38mX+-6 z>(|!S|NsA`rln$Q05<>t00DGTPE!Ct=GbNc0004EOGiXV@B-B80000MbVXQnQ*UN; zcVTj60B31tGH`BZATlmAE;ghygBJh*0KZ8@K~#9!J4+FRjWPP{GlpgQr!K#za5@I z0EP71AG{1_%Z!Htlh4{kas4p|T@^%)ERS;vU}GQ=vm>OW0wTp?&5784MRM&@LE)$a gFlIXj0JdNM2N|Cytq7SS+W-In07*qoM6N<$g1Rafu>b%7 literal 0 HcmV?d00001 diff --git a/index_icons/osx/new.png b/index_icons/osx/new.png new file mode 100755 index 0000000000000000000000000000000000000000..c7987dc766b3b58118516aca753cc2d4c107caa3 GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^GC<77!3-q1&-R!xFfg(P_=LCuxj^t22*8X#fBydl zf&W0>&!4}3{`~pl$B*ydzXQ2nzI^%o`7@C5@#9CZT84M;-UAtL-@bkG=FRKZZ-DGq zuU@@)@$&ie=TDzLee&eVeXvk zuU@@;`SPVpKy>N+`3q;yo;`i~^obKEjvqg9^ysl8M~)siaA5y_Alkoo@4j8TcJ15= zL_2rv*s*Qf_Kh1iZQQtV-MV#a)~s2*8i-b}T)Ar5vgL~xFJ7=i&+p#`gV4-6KQlIt2ZB7zOm7XoZ7}fNX<%?+67S?T zkG4csH!cOsl^YD683?4YF&PN^SgdMRasAS8D8X}vMF&Sw7<2SWj%f_9TO=4JeKBW` zKE)cwX)eff$jPSU;Jb(Iw1c4$AX)Q{9p~n7HgBt{=1RrJx&;Ls zj2oSqZFNN*CvmwgGs{a%JQ#OPEo=>=-8((G#Ke7NY+3^Bp5CXkW?EWGXmy-^9X%ss s^~)KSH?q2n6&kjz;u7+A<#b_UC@=AtFTSR0A<(M~p00i_>zopr0D*EN82|tP literal 0 HcmV?d00001 diff --git a/index_icons/osx/pdf.png b/index_icons/osx/pdf.png new file mode 100755 index 0000000000000000000000000000000000000000..a1294e1b6cd59106f82d48618c61f1d1c61c54ea GIT binary patch literal 585 zcmV-P0=E5$P)Ng{wou2FS^5<(|njjy>$5E zKI*Kg@mfprVN&U&q4bG@^Lujhe0l1+xAXh_>&eIJw6X9`K$Vr8@@Qk!V`7$;m5q*$ z;8aMnv$WqlEAT=lARr<0=j-aUx95n2@KZtWMlI-_n&)L%^KE0^!N80g8nUyx*?W8S zkdg07F7)5s;c;n)g@xvTd+gud@?l!ymy@+8BYl5`@KZ|XkAuz6*V#HNhKG*ld2*T| zAJ^8_^Yin&y1K%_!TI|7-QM2L&(G}a>*eR?|NsBT$jEfaSOEY400DGTPE!Ct=GbNc z0004EOGiXd<8Dm60000MbVXQnQ*UN;cVTj60B31tGH`BZATlmAE;ghygBJh*0MbcB zK~#9!HIC_40x=AQ>#&1>B8UQtE2!XtAOfzqOgl}QOyB=ysO|Bd{K-Av&5aO3VB(|` ztw{u#uWB`)pY~a^+nx>|PF`D|+7Jh`j#210wo68X}_=xKfm8(Gxax1rBh3U?A#I6m2<0S9QAq Xgy1hjKLK(h00000NkvXXu0mjfe3TxQ literal 0 HcmV?d00001 diff --git a/index_icons/osx/php.png b/index_icons/osx/php.png new file mode 100755 index 0000000000000000000000000000000000000000..5628101fbb93f8467258498bd9952a9d5a769561 GIT binary patch literal 730 zcmV<00ww*4P)iVj&(zUs}(%$aE{Qv*{*yQuM;Q!_H|L*be(A(Y$yR)9e4l;`GDi|FOK?)!OFQ<@Lwt|EjgrnW)#Swbl0Z|JUsQjjii9m*zL8`ThO< zQ(a`*>+&crGRWxv-r?x$_WI4~|IO|Ha&~sGxY}xMaK_~Rl$MsT!O6PA$Fa)RyTanW z$Kk!k<*(lV%IEjY;Pv_a|E#mr`~Cg;|Nr;@|KIWdR$y(()#$Lg+or6=*5mZs?EAgr z|LXbw!PfEI?EL@#|Fzx!n81gR00001bW%=J06^y0W&i*H0b)x>M1DWGL302A02Xvb zSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0002lNklp3# z0E5apAkYSaT+JA;fI}SwXxD^=`hWz)p#pWnA&LPY0beLz)>0{m6C_Xp;)M&!<`ouk zNI?YjP3lZj3bfSJAp+uD@(Pmjyh*AO0?A;HJ-^ry}QJloM@d1r{i+F1GLxGGt}ttFLDQ32=)A zvkN8LS=Af!@IVCQJmUPks&wm>d9p=80-4g@(q)O9f&MZwqU8(>0BguKfUFF~3&Cl1p+v4=qz`MG-%aK*q-sS4^`pwtg+U)k9xy$y6Bf`JB^X%-x!NK)^ zB>D97*Vfj()!oL=*52jiw$0V;=H~puhqmMO)aCK~xp$3@j@H=T+U)rEkR;cbWv$NP z(YU1g`1HKu^2D*7$-uPi)WH7j%ALQ{-rUyqtZkgX*`>zXwa@4O`19NA^1ja2*O*<` zuZ+;IjlIa#w&U^R?f25<^Zw}8%jxs$=j_JM+~nln?Cj>9!sL|K@XO=x!-7HTgCnNM z<(-F1WCY+AflzK&%J~lE5T+|NjdlZwYs1ap&v? zp~HODYp2y8oz7x;ywKp|>MiMdKT%cH_2icD9lPE5d>ff1whPF2OeT!+AI6tw?ywgj z1GlvjZAWJ0u$6yPW-r=ue`WogE#5a)z!;bXltK@2PZWB?0RT}1OvcUb-R#9Vbpj<@ z0Yq;NzkbfI&kNw^8n7FE#27R#f*zs)r<55&eY-Uc5&~T2KSv0qq6CmaWf+|gF?Cj><-rm;U<%O!qywK4oq{8FW-|EBH?ZnsV?B(9u-|M^A?D_NU$-%(1%H`7Q_uSs(uEx}?*74ru<;&OU zskFcI?B!LT*UR1M{`&cJuHHqM)4RH~AcDcX&*Ay~{h6h=VW!)LowlvX<+8fKoWkZv znbTRP+k>jlewViG=H|4|>gC_xz18F7=Iqno@7~td`SkNSkj}f_^v=)ErKY8OpUA?& z!R6=YySlpn|Nrdl>sX80xc~qF0d!JMQvg8b*k%9#00Cl4M?^`71>}4H000(rMObuG zZ)S9NVRB^vXK7|KaBgQHGA=YOHl#Cy7XSbNrAb6VRCwA&%2g7CFc3x2gy8OsySuwv z2>V~qFa=~@fAy&g09e)pLD;^hAlq*8sPt!>dn23zKu`3p@(S^AOFk(eFOVfGhOAH) zN>MH|h!&>XG*wq*C`gxsABmPiL5Gk)2zwOh5&#Z|e}}OXKVM^S9Pjn$`cwb_002ov JPDHLkV1mWf9q<4E literal 0 HcmV?d00001 diff --git a/index_icons/osx/search.png b/index_icons/osx/search.png new file mode 100755 index 0000000000000000000000000000000000000000..db6910c4b62c47dbb58c00dac0e84e198b003137 GIT binary patch literal 570 zcmV-A0>%A_P)Hw%F~1o67(I0G_AG z!}kBJsin}1SDUZa{0FzSpU;(4e;2n5WEwnaaP| z?SYxf`qGz&oy*Pt{{R30ftkt4^ZLl~|Lp(&m$27?n90BL|IzjOx#9ncsMeFF(2bwU zrmxVGg@^zE0Kf77$9hWsv{0(D&z-B#!tMG10054w*Oa2l0002N^#84;#Z!p8;{X5v z0d!JMQvg8b*k%9#02XvbSaefwW^{L9a%BK#X=XBTZf77eE;KGSq%(sT0001yNklK-bz|l#5*iCLm>{B5rBR>8uRl>)Gfe*%=D5i?~4fY-*}b zp6-fr5iq_yqb$OW49prVD147t7REFNWPunId7w8UQRFcJ05Pc+1wIzWH2?qr07*qo IM6N<$f^ZBmSO5S3 literal 0 HcmV?d00001 diff --git a/index_icons/osx/sound.png b/index_icons/osx/sound.png new file mode 100755 index 0000000000000000000000000000000000000000..8e9cb789aaf29a15ea033eaa05a2416f3ffc8469 GIT binary patch literal 513 zcmV+c0{;DpP)rRv z%eBtj+w1ZIgvf`Tu~V|%oyg^%v&Fs6+?~hXOO&~Tx!n$z)z;qS-sR=2)#eM2(A4Ge z^tJUl|o6C&H%*x!uNpy z0004WQchCuN9dgJ<{x2BimdvKb7r>H$!?XY)1QCQp%Z<(taBL&Fa*ha000000NkvXXu0mjf DrWpoi literal 0 HcmV?d00001 diff --git a/index_icons/osx/tar.png b/index_icons/osx/tar.png new file mode 100755 index 0000000000000000000000000000000000000000..7f4b3e61fd0addc1ff2dba74a87134faba849430 GIT binary patch literal 408 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 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/cd.png b/index_icons/winvista/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..76786ffba4c6f9c346a2880693aee51c04a62423 GIT binary patch literal 3385 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 P00000NkvXXu0mjfCxmm` literal 0 HcmV?d00001 diff --git a/index_icons/winvista/comp.png b/index_icons/winvista/comp.png new file mode 100644 index 0000000000000000000000000000000000000000..1717b1a275ce08bf6b6f721b68f8a7d640b06f31 GIT binary patch literal 3413 zcmV-b4XW~qP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0&+=2K~#9!l#3fln93_8Xso3Y)X+kTJTiUE0%>QaE%Q1qhK>;H z!f$g=Zf<_(eBXBkPHSalg#ggo8^HQ{6xDPr_Sp&q0#AHCUl;&L0%rlHVQ^$*WHgc3 zre&F~HcjU~8jUg%iC72H;lsZG%gf6&44r%Xhm@o&Ez5MZZCl*iKjhll8jHmuBaz5S zDwP@{2~P!J+crp|&EJBS<_3^N`_(IGZEXYqbhP`SX&P2nS7F{*-fFwYo z5=sCd03ifOLI{Ci@Gi2MEOcGR_RbE@0p`E#qO+?DQ?nls8tlj9>G`j+ZTk;EJ}Piw zV;2`MHK4aIfKNa3X!f@wr~7cHvknjf0s;_DA^=DxlMY}wJk5oTT?BhNG5%uKb+{eq zLwqZRH*ddHO=4M=BWB*mo8+Schr`oURh62ivRo>1d}f}*;c1pjWg7Yk4MV4C8njG< zmSu8oZjL13-TWGpYigZkBXmD_>MqWuSXx?g+I>89kFoDt-u(l~bqWpk*sQ@>B~2s)|BQRan$imNbo}Vv*%i ri6`X}$HvB-Eu4isotVJ?*6#rT#&&wm(MPxv00000NkvXXu0mjfgBxd9 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/compressed.png b/index_icons/winvista/compressed.png new file mode 100644 index 0000000000000000000000000000000000000000..7832eae1c76571c2b5fbf9e68d6c984294f51bb8 GIT binary patch literal 3328 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 KMNUMnLSTZc+C?M) literal 0 HcmV?d00001 diff --git a/index_icons/winvista/dir.png b/index_icons/winvista/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..a80d00a14e328611523c6f402dd28c2adf23f3ea GIT binary patch literal 3286 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 UY;h`$Hvj+t07*qoM6N<$f?Rq=Y5)KL literal 0 HcmV?d00001 diff --git a/index_icons/winvista/dll.png b/index_icons/winvista/dll.png new file mode 100644 index 0000000000000000000000000000000000000000..294ce0783701fae69fad5e86459604159c9b9418 GIT binary patch literal 3375 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 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/generic.png b/index_icons/winvista/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..d113a1f42a088fcac7f721a1946a51e3978fa710 GIT binary patch literal 3124 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 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/key.png b/index_icons/winvista/key.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe36a615359e5e78e705125a25d049e40410d06 GIT binary patch literal 3244 zcmV;d3{&%oP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0m(^3K~#9!V*LOAKLavgWMpJGHpNHc@6SJ3KmPr8{m;N) z^7rrG2QS|-E*IkYJC z!>y}t=Zf)sZHeu<@BpTsg#iux{_?YmUz8u`|tHH1_n#1pA5`QPh^qRV;J!F_n)T>zkkd5>ON;+HFscO`1gn5>xp9w z-1-&_Pp%(jU}pS#4_Q4Ex&c3#m~+k_yUXy8nTg@|l_LzlPw!*kP!eN!b$B;J>(sXl zqRh8rP+|>RG%hI83sV))TorVgh8a4&KH z#4AtGfGhjoGkpEUR7JJ{+6L?lLR^2_$Tr~G`R@$xzA=;U0xew%T=41s$GoPdR}42_ evnS(H0~i3al*fSe$*0x;0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0n155K~#9!oRYt56JZ#~Kkr>~4RKIf+iNb+NkTzzb`n9V zwc_9+_y-8>m{E$Oh?8TwJBVEcDT+`^@ek-?DK)kYP1Bl7bAdLO-h1!kpgD3@H1s>Y zKc45q_xYhj1f>*xEms!jgQIG>+l@=HiLsPo#F4F0Z~FD)g%?ZxI1vFr4FZ-ci}S7e zX64@9NwT>dy>7@!tA^vRvAT1IQEz&o59tFk45(G#EI*j@s2{<8!$O-YWOR!gQ`fl7 zXI6J8151NBDFC)zvQ?LjjUG>*ze(zP_i9#dUI%t_CH|0=y2Zb0K0WEBo)3Q*!ceev zjei3!pcFvFfCwTg6{M741W?X7fD#ejKC=WM$UaOyE=TW^bJKc6*4BilJ>2X^0G_-w zDrw@(>>L33OF5#mh&a~7@qNbKDR!%0@ta!-Z0zbSzO1jMr*L@C0Kgc7h@iE`7(*ur z__n=G%WozLZcyOd7~R4o0FE<46rClY3AacllfiHL0}jS$9PIzyK^TUJ2*wzUi3!?m zzE`WmJFqN^D2fmfM1+Fp;W*Cl4mzD6>4hby}jWbjJp$Pt$*)=P$(A3=kxz} g@M-14g*Wl%0EQUy#0vdk#sB~S07*qoM6N<$f+brlfdBvi literal 0 HcmV?d00001 diff --git a/index_icons/winvista/mov.png b/index_icons/winvista/mov.png new file mode 100644 index 0000000000000000000000000000000000000000..199dfb79fffd98dd17edd35395db83847952baee GIT binary patch literal 3424 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 Z0RZ?MULAV$ko5on002ovPDHLkV1lZmUf2Kt literal 0 HcmV?d00001 diff --git a/index_icons/winvista/ppt.png b/index_icons/winvista/ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb85586a6f0b3643cf75335c7eaa177c43ba756 GIT binary patch literal 3571 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 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/ps.png b/index_icons/winvista/ps.png new file mode 100644 index 0000000000000000000000000000000000000000..74f934cdf868719e288c80b3b279523fb60408a2 GIT binary patch literal 3411 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 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/search.png b/index_icons/winvista/search.png new file mode 100644 index 0000000000000000000000000000000000000000..6362f3e55c8a511dbb40c681fd782774acee07db GIT binary patch literal 3292 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 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/sound.png b/index_icons/winvista/sound.png new file mode 100644 index 0000000000000000000000000000000000000000..408f5e07257e8667e4381a2d2a304c83ad92e9ea GIT binary patch literal 3286 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 Ur5!VBs{jB107*qoM6N<$g0m$#+5i9m literal 0 HcmV?d00001 diff --git a/index_icons/winvista/tar.png b/index_icons/winvista/tar.png new file mode 100644 index 0000000000000000000000000000000000000000..35a73fa195761b45e7a7d14d39bca6623dbc4a4c GIT binary patch literal 3315 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 N002ovPDHLkV1h&twxIw3 literal 0 HcmV?d00001 diff --git a/index_icons/winvista/xls.png b/index_icons/winvista/xls.png new file mode 100644 index 0000000000000000000000000000000000000000..848fd115a9bebe22189ea05b574f5cde6353d63e GIT binary patch literal 3568 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 LNkvXXu0mjf7zj=X literal 0 HcmV?d00001 diff --git a/index_icons/winxp/binary.png b/index_icons/winxp/binary.png new file mode 100755 index 0000000000000000000000000000000000000000..689f4eb55c240311974946fdf63a4c4adede111a GIT binary patch literal 3152 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 literal 0 HcmV?d00001 diff --git a/index_icons/winxp/cd.png b/index_icons/winxp/cd.png new file mode 100755 index 0000000000000000000000000000000000000000..85aa3c19cecdda248c8bcc4a4fdd543c68240708 GIT binary patch literal 3522 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 X9`tpq%6qi)00000NkvXXu0mjfu+8Vy literal 0 HcmV?d00001 diff --git a/index_icons/winxp/compressed.png b/index_icons/winxp/compressed.png new file mode 100755 index 0000000000000000000000000000000000000000..131c5dfe95b709a6e805668442b101a128ee20ce GIT binary patch literal 632 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 literal 0 HcmV?d00001 diff --git a/index_icons/winxp/dll.png b/index_icons/winxp/dll.png new file mode 100755 index 0000000000000000000000000000000000000000..2977612b1778f178337a95b5218061f9575ff1bf GIT binary patch literal 3405 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 KMNUMnLSTZXMIh?{ literal 0 HcmV?d00001 diff --git a/index_icons/winxp/image.png b/index_icons/winxp/image.png new file mode 100755 index 0000000000000000000000000000000000000000..53540889db2ce91591851f5c7b9fffc564b11b58 GIT binary patch literal 3391 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 literal 0 HcmV?d00001 diff --git a/index_icons/winxp/js.png b/index_icons/winxp/js.png new file mode 100755 index 0000000000000000000000000000000000000000..5329793a4945c2474a666e799bcf421220be7702 GIT binary patch literal 3323 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 FV1j`YNCE%= literal 0 HcmV?d00001 diff --git a/index_icons/winxp/key.png b/index_icons/winxp/key.png new file mode 100755 index 0000000000000000000000000000000000000000..38a550580bdaccb9da30c2f401dcb8102b3e1ece GIT binary patch literal 3433 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 LNkvXXu0mjf$907M literal 0 HcmV?d00001 diff --git a/index_icons/winxp/login.png b/index_icons/winxp/login.png new file mode 100755 index 0000000000000000000000000000000000000000..d4e2670ad0c1950e1bd1edd256f2e93c0668519a GIT binary patch literal 3318 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 A+5i9m literal 0 HcmV?d00001 diff --git a/index_icons/winxp/mov.png b/index_icons/winxp/mov.png new file mode 100755 index 0000000000000000000000000000000000000000..199dfb79fffd98dd17edd35395db83847952baee GIT binary patch literal 3424 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 Z0|1)Gh(aIhA#nfz002ovPDHLkV1m(R=1Bkm literal 0 HcmV?d00001 diff --git a/index_icons/winxp/new.png b/index_icons/winxp/new.png new file mode 100755 index 0000000000000000000000000000000000000000..9db7a57acc23c433317eebf1935af529d8656d63 GIT binary patch literal 3179 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 D2)~0r literal 0 HcmV?d00001 diff --git a/index_icons/winxp/ppt.png b/index_icons/winxp/ppt.png new file mode 100755 index 0000000000000000000000000000000000000000..92d196bd6cba6e35759564357f66a50cbf272cdf GIT binary patch literal 3479 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 FV1n>#pydDn literal 0 HcmV?d00001 diff --git a/index_icons/winxp/ps.png b/index_icons/winxp/ps.png new file mode 100755 index 0000000000000000000000000000000000000000..74f934cdf868719e288c80b3b279523fb60408a2 GIT binary patch literal 3411 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 literal 0 HcmV?d00001 diff --git a/index_icons/winxp/search.png b/index_icons/winxp/search.png new file mode 100755 index 0000000000000000000000000000000000000000..d5266194d059885538e28905f72d1afbb639a9e9 GIT binary patch literal 3382 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 M07*qoM6N<$f}OBsU;qFB literal 0 HcmV?d00001 diff --git a/index_icons/winxp/sound.png b/index_icons/winxp/sound.png new file mode 100755 index 0000000000000000000000000000000000000000..6ed136953f223bbb0c6edd69d91092690900767a GIT binary patch literal 3302 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 literal 0 HcmV?d00001 diff --git a/index_icons/winxp/tar.png b/index_icons/winxp/tar.png new file mode 100755 index 0000000000000000000000000000000000000000..dfe4e5a1f32332698b3f9077a03307b910e64588 GIT binary patch literal 3335 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 RjjR9w002ovPDHLkV1l}LW)A=W literal 0 HcmV?d00001 diff --git a/index_icons/winxp/text.png b/index_icons/winxp/text.png new file mode 100755 index 0000000000000000000000000000000000000000..6e8bc0a75dcfebc9c55d7d267ebab606154ace99 GIT binary patch literal 3243 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 literal 0 HcmV?d00001 diff --git a/index_icons/winxp/unknown.png b/index_icons/winxp/unknown.png new file mode 100755 index 0000000000000000000000000000000000000000..5cfa3c84acd6337c08569e7610fb1342298d8a98 GIT binary patch literal 3224 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 KMNUMnLSTZXMIh?{ literal 0 HcmV?d00001 diff --git a/index_icons/winxp/uu.png b/index_icons/winxp/uu.png new file mode 100755 index 0000000000000000000000000000000000000000..dfe4e5a1f32332698b3f9077a03307b910e64588 GIT binary patch literal 3335 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 RjjR9w002ovPDHLkV1l}LW)A=W literal 0 HcmV?d00001 diff --git a/index_icons/winxp/web.png b/index_icons/winxp/web.png new file mode 100755 index 0000000000000000000000000000000000000000..80363b1ee685f55a5bd20c71e3b47cd5540dcdea GIT binary patch literal 3437 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 XFY#jp?k$zN00000NkvXXu0mjf`;v_8 literal 0 HcmV?d00001 diff --git a/languages/al.txt b/languages/al.txt new file mode 100755 index 0000000..4570b99 --- /dev/null +++ b/languages/al.txt @@ -0,0 +1,91 @@ +// Albanian language file by Laurent Dhima + +index of Treguesi i +parent directory Directory Prind +thumbnail of Minjatura e +continue Vazhdo + +file File +files Files +folder Kartelë +folders Kartela +size Madhësia +total size Madhësia gjithsej +total downloads Gjithsej shkarkime +total Gjithsej +date Ndryshuar +description Përshkrimi +downloads Shkarkime +type Lloji +sort by Renditur sipas + +search Kërko +both Të dy llojet +search results for kërko rezultate për +and its subdirectories dhe nën-directories e tij + +account Llogaria e Përdoruesit +login Identifikohu +logout Shkëputu +username Emri i përdoruesit +password Fjalëkalimi +select user to remove Zgjidh përdoruesin që duhet hequr +are you sure you want to remove the user Jeni i sigurt që dëshironi të hiqni përdoruesin +delete this user Hiqe këtë përdorues +add user Shto përdorues + +guest Vizitues +user Përdorues +mod Moderator +admin Admin +level Niveli i përdoruesit + +rename riemërto/lëviz +renaming Duke riemërtuar +new filename Emër i Ri File +you can also move the file by specifying a path mund të lëvizni gjithashtu një file duke përcaktuar një pozicion +delete elemino +are you sure you want to delete the file Jeni i sigurt që dëshironi të eleminoni këtë file +edit description ndrysho përshkrimin +yes, delete Po, eleminoje + +upload Ngarko +files to this folder file(s) tek kjo kartelë +uploaded files Ngarko files +failed files Files e dështuar +none Asnjë +file already exists file ekziston +filename is listed as a hidden file emri i file rezulton si file i padukshëm + +reconfigure script Rikonfiguro skriptin +create new directory in this folder Krijo një directory të re në këtë kartelë +edit list of hidden files Ndrysho listën e files së padukshëm +add new user Shto përdorues të ri +delete user Hiq përdoruesin +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Shto përshkrimin e ri për file +change Ndrysho +enter the new name Shkruaj emrin e ri +create Krijo + +add Shto +remove Hiq +remove a hidden file Hiq një file të padukshëm +add a new hidden file Shto një file të ri të padukshëm + +edit ban list Shkruaj listën e IPve të bllokuara dhe emrat e host +remove a ban Hiq një bllokim +add a new ban Shto një bllokim të ri (adresa IP ose emri i host, mund të përdorësh wildcards) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Shiko regjistrimet nga file i log +view statistics from log file Shiko statistikat nga file i log +how many entries would you like to view Sa regjistrime dëshironi të shikoni +view Shiko +page Page +of of + +calculate md5sum llogarit md5sum +download directory as tar.gz archive Shkarko directory si arkiv tar.gz diff --git a/languages/ar.txt b/languages/ar.txt new file mode 100755 index 0000000..4b1753b --- /dev/null +++ b/languages/ar.txt @@ -0,0 +1,91 @@ +// Arabic langauge file + +index of +parent directory +thumbnail of +continue + +file +files +folder +folders +size +total size +total downloads +total +date +description +downloads +type +sort by + +search +both +search results for +and its subdirectories + +account User Account +login +logout +username +password +select user to remove +are you sure you want to remove the user +delete this user +add user + +guest +user +mod Moderator +admin +level + +rename / +renaming +new filename +you can also move the file by specifying a path you can also move the file by specifying a path +delete +are you sure you want to delete the file ݿ +edit description +yes, delete + +upload +files to this folder +uploaded files +failed files +none +file already exists +filename is listed as a hidden file + +reconfigure script +create new directory in this folder +edit list of hidden files +add new user +delete user +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file +change +enter the new name +create + +add +remove +remove a hidden file +add a new hidden file + +edit ban list +remove a ban +add a new ban (IP address or hostname, you can use wildcards) +the administrator has blocked your ip address or hostname + +view entries from log file +view statistics from log file +how many entries would you like to view +view +page Page +of of + +calculate md5sum +download directory as tar.gz archive tar.gz diff --git a/languages/bg.txt b/languages/bg.txt new file mode 100755 index 0000000..fbc78f9 --- /dev/null +++ b/languages/bg.txt @@ -0,0 +1,91 @@ +// Bulgarian language file by error_404@abv.bg + +index of Индек? на +parent directory Главна директори? +thumbnail of Миниатюра на +continue Продължи + +file Файл +files Файлове +folder Папка +folders Папки +size Големина +total size В?ичко големина +total downloads В?ичко теглени? +total В?ичко +date Дата +description Опи?ание +downloads Теглени? +type Вид +sort by Сортирай по + +search Тър?и +both В?ички +search results for намерени резултати за +and its subdirectories и техните подпапки + +account Потребител?ки профил +login Вход +logout Изход +username Потребител?ко име +password Парола +select user to remove Изберете потребител за премахване +are you sure you want to remove the user Сигурен ли ?те, че желаете да премахнете потребител +delete this user Изтрийте този потребител +add user Добавете потребител + +guest Го?т +user Потребител +mod Moderator +admin ?дмини?тратор +level Потребител?ко ниво + +rename преименувай/преме?ти +renaming Преименува +new filename ?ов файл +you can also move the file by specifying a path вие може да преме?тите файл като отбележите път? +delete изтрий +are you sure you want to delete the file Сигурен ли ?те, че желаете да изтриете файла +edit description пром?на на опи?ание +yes, delete Да, изтрий го + +upload Качи +files to this folder файл(ове) за тази папка +uploaded files Качени файлове +failed files ?еу?пешни файлове +none ?ищо +file already exists файлът вече ?ъще?твува +filename is listed as a hidden file файлът е ?ъ? ?крити атрибути + +reconfigure script Реконфигурирай ?крипта +create new directory in this folder Създай нова директори? в тази папка +edit list of hidden files Промени ?пи?ъка на ?критите файлове +add new user Добави нов потребител +delete user Изтрий потребител +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Добави ново опи?ание за този файл +change Промени +enter the new name Добави ново име +create Създай + +add Добави +remove Премахни +remove a hidden file Премахни ?крити? файл +add a new hidden file Добави нов ?крит файл + +edit ban list Промени ли?та на баннатите IP-та или хо?тове +remove a ban Премахни бан +add a new ban Добави нов бан (IP адре? или хо?т, може да използвате ?пи?ък по подразбиране) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Прегледайте добавките в лог файла +view statistics from log file Прегкледайте ?тати?тиките от лог файла +how many entries would you like to view Колко добавки желаете да прегледате +view Виж +page Page +of of + +calculate md5sum Калкулирай md5 ?умата +download directory as tar.gz archive Свали директори?та като tar.gz архив diff --git a/languages/ca.txt b/languages/ca.txt new file mode 100755 index 0000000..9ab8420 --- /dev/null +++ b/languages/ca.txt @@ -0,0 +1,91 @@ +// Catalan language file (David Gimeno i Ayuso info@sima-pc.com) + +index of Índex de +parent directory Directori anterior +thumbnail of Miniatura de +continue Continuar + +file Fitxer +files Fitxers +folder Carpeta +folders Carpetes +size Tamany +total size Tamany total +total downloads Total descàrregues +total Total +date Modificat +description Descripció +downloads Descàrregues +type Tipus +sort by Ordenar per + +search Cercar +both Ambdós +search results for Resultats cerca de +and its subdirectories i els seus subdirectoris + +account Compte d'usuari +login Entrar +logout Sortir +username Nom d'usuari +password Contrasenya +select user to remove Seleccioneu l'usuari a suprimir +are you sure you want to remove the user Segur que voleu suprimir aquest usuari +delete this user Suprimir aquest usuari +add user Afegir usuari + +guest Visitant +user Usuari +mod Moderator +admin Administrador +level Nivell d'usuari + +rename redenominar/moure +renaming Redenominant +new filename Nom nou del fitxer +you can also move the file by specifying a path també podeu moure el fitxer si n'especifiqueu un camí +delete suprimir +are you sure you want to delete the file Segur que voleu suprimir aquest fitxer +edit description editar la descripció +yes, delete Sí, suprimir-lo + +upload Carregar +files to this folder fitxers a aquesta carpeta +uploaded files Fitxers carregats +failed files Fitxers fallits +none Cap +file already exists ja existeix aquest fitxer +filename is listed as a hidden file aquest fitxer consta com a ocult + +reconfigure script Reconfigurar seqüència +create new directory in this folder Crear un nou directori a aquesta carpeta +edit list of hidden files Editar la llista de fitxers ocults +add new user Afegir un usuari nou +delete user Suprimir un usuari +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Introduïu la descripció nova del fitxer +change Canviar +enter the new name Introduïu el nom nou +create Crear + +add Afegir +remove Suprimir +remove a hidden file Suprimir un fitxer ocult +add a new hidden file Afegir un fitxer ocult nou + +edit ban list Editar llista d'IP i noms d'ordinador prohibits +remove a ban Suprimir una prohibició +add a new ban Afegir una prohibició nova (adreça IP o nom d'ordinador, podeu usar-hi comodins) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Veure entrades del fitxer de registre +view statistics from log file Veure estadístiques del fitxer de registre +how many entries would you like to view Quantes entrades voleu veure +view Veure +page Page +of of + +calculate md5sum calcular md5sum +download directory as tar.gz archive Descarregar directori com arxiu tar.gz diff --git a/languages/cz.txt b/languages/cz.txt new file mode 100755 index 0000000..4d745ee --- /dev/null +++ b/languages/cz.txt @@ -0,0 +1,91 @@ +// Český překlad, vytvořil the_pest + +index of Výpis z +parent directory Nadřazený adresář +thumbnail of Miniatura of +continue Pokra?ovat + +file Soubor +files Soubory +folder Složka +folders Složky +size Velikost +total size Celková velikost +total downloads Celkem staženo +total Total +date Upraveno +description Popis +downloads Staženo +type Typ +sort by Třídit podle + +search Vyhledat +both Vše +search results for výsledky vyhledávání pro +and its subdirectories a jeho podsložky + +account Uživatelský ú?et +login Přihlásit +logout Odhlásit +username Uživatelské jméno +password Heslo +select user to remove vyberte uživatele pro smazání +are you sure you want to remove the user Jste si jist, že chcete smazat uživatele +delete this user Smazat uživatele +add user Přidat uživatele + +guest Host +user Uživatel +mod Moderátor +admin Administrátor +level Uživatelská úrověň + +rename přejmenovat/přesunout +renaming Přejmenování +new filename Nové jméno souboru +you can also move the file by specifying a path můžete také přesunout soubor ur?ením cesty +delete smazat +are you sure you want to delete the file Jste si jist, že chcete smazat soubor +edit description upravit popis +yes, delete Ano, smazat + +upload Nahrát +files to this folder soubor(ů) do této složky +uploaded files Nahraté soubory +failed files Nahrávaní selhalo +none Žádné +file already exists soubor již existuje +filename is listed as a hidden file jméno souboru je v seznamu skrytých souborů + +reconfigure script Překonfigurovat skript +create new directory in this folder Vytvořit nový adresář (v této složce) +edit list of hidden files Upravit seznam skrytých souborů +add new user Přidat nového uživatele +delete user Smazat uživatele +copy url Kopírovat vzdálený soubor (do této složky) +upload to ftp nahrát soubor na FTP server + +enter the new description for the file Vložit nový popis k souboru +change Změnit +enter the new name Vložit nové jméno +create Vytvořit + +add Přidat +remove Odebrat +remove a hidden file Odebrat skrytý soubor +add a new hidden file Přidat skrytý soubor + +edit ban list Upravit seznam zakázaných IP adres a hostnames +remove a ban Odebrat zákaz +add a new ban Přidat nový zákaz (IP addresa nebo hostname, můžete použít zna?ek např *.host.cz) +the administrator has blocked your ip address or hostname Promiňte, ale správce zablokoval vaši IP adresu nebo hostname + +view entries from log file Zobrazit návštěvy z logu +view statistics from log file Zobrazit statistiky z logu +how many entries would you like to view Kolik položek chcete zobrazit +view Zobrazit +page Page +of of + +calculate md5sum spo?ítat md5sum +download directory as tar.gz archive Stáhnout složku jako tar.gz archiv diff --git a/languages/da.txt b/languages/da.txt new file mode 100644 index 0000000..f7cd4cf --- /dev/null +++ b/languages/da.txt @@ -0,0 +1,92 @@ +// Danish langauge file +// Translated by Morten Gregersen (Mobleman.dk), Denmark + +index of Index af +parent directory Ovenstende mappe +thumbnail of Thumbnail af +continue Fortst + +file Fil +files Filer +folder Mappe +folders Mapper +size Strrelse +total size Total strrelse +total downloads Total downloads +total Total +date ndret +description Beskrivelse +downloads Downloads +type Type +sort by Sorter efter + +search Sg +both Begge +search results for sgeresultater for +and its subdirectories og dens undermapper + +account Brugerkonto +login Log ind +logout Log ud +username Brugernavn +password Kodeord +select user to remove Vlg bruger der skal fjernes +are you sure you want to remove the user Er du sikker p at du vil fjerne brugeren +delete this user Slet denne bruger +add user Tilfj bruger + +guest Gst +user Almindelig bruger +mod Moderator +admin Administrator +level Brugerlevel + +rename omdb/flyt +renaming Omdber +new filename Nyt filnavn +you can also move the file by specifying a path du kan ogs flytte filen ved at specificere en sti +delete slet +are you sure you want to delete the file Er du sikker p at du vil slette filen +edit description redigr beskrivelse +yes, delete Ja, slet den + +upload Upload +files to this folder fil(er) til denne mappe +uploaded files Uploadede filer +failed files Filer der fejlede +none Ingen +file already exists filnavnet eksisterer allerede +filename is listed as a hidden file filenavnet er listet som en skjult fil + +reconfigure script Genkonfigurer script +create new directory in this folder Opret en ny mappe (i denne mappe) +edit list of hidden files Redigr listen med skjulte filer +add new user Tilfj ny bruger +delete user Slet bruger +copy url Kopier en online fil (til denne mappe) +upload to ftp upload fil til FTP server + +enter the new description for the file Indtast den nye beskrivelse til filen +change Skift +enter the new name Indtast the nye navn +create Opret + +add Tilfj +remove Fjern +remove a hidden file Fjern en skjult fil +add a new hidden file Tilfj en skjult fil + +edit ban list Redigr listen med bannede IP'er og hostnavne +remove a ban Fjern et ban +add a new ban Tilfj et nyt ban (IP-adresse eller hostnavn, du kan bruge wildcards) +the administrator has blocked your ip address or hostname Desvrre, administratoren har blokeret din IP-adresse eller hostnavn + +view entries from log file Vis indlg fra log-fil +view statistics from log file Vis statestikker fra log-fil +how many entries would you like to view Hvor mange indlg vil du have vist +view Vis +page Side +of af + +calculate md5sum udregnet md5sum +download directory as tar.gz archive Download mappe som tar.gz arkiv \ No newline at end of file diff --git a/languages/de.txt b/languages/de.txt new file mode 100755 index 0000000..6173062 --- /dev/null +++ b/languages/de.txt @@ -0,0 +1,92 @@ +// German langauge file by thefake +// Updated by tagdancer + +index of Index von +parent directory Uebergeordnetes Verzeichnis +thumbnail of Thumbnail von +continue Weiter + +file Datei +files Dateien +folder Ordner +folders Ordner +size Größe +total size Gesamt Größe +total downloads Gesamte Downloads +total Gesamt +date Modifiziert +description Beschreibung +downloads Downloads +type Typ +sort by Sortiert nach + +search Suche +both Beide +search results for Suchergebnisse für +and its subdirectories und seinen Subverzeichnissen + +account User Account +login Login +logout Log out +username Username +password Passwort +select user to remove Wähle User zum entfernen +are you sure you want to remove the user Sind Sie sicher dass sie diesen User entfernen wollen +delete this user Diesen User löschen +add user User hinzufügen + +guest Gast +user User +mod Moderator +admin Admin +level User's Level + +rename Umbenennen/Verschieben +renaming Umbenennen +new filename Neuer Dateiname +you can also move the file by specifying a path Sie koennen die Datei auch verschieben indem Sie den neuen Pfad angeben +delete Löschen +are you sure you want to delete the file Sind Sie sicher dass Sie diese Datei löschen wollen +edit description beschreibung editieren +yes, delete Ja, löschen + +upload Upload +files to this folder Datei(en) in diesem Verzeichnis +uploaded files Hochgeladene Dateien +failed files Fehlgeschlagene Dateien +none Keine +file already exists Datei existiert bereits +filename is listed as a hidden file Dateiname ist als versteckte Datei aufgelistet + +reconfigure script Rekonfiguriere Script +create new directory in this folder Neues Verzeichnis in diesem Ordner erzeugen +edit list of hidden files Liste der versteckten Dateien editieren +add new user Neuen User hinzufügen +delete user User löschen +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Geben Sie die neue Beschreibung für die Datei ein +change Ändern +enter the new name Geben Sie den neuen Namen ein +create Anlegen + +add Hinzufügen +remove Entfernen +remove a hidden file Eine versteckte Datei entfernen +add a new hidden file Eine versteckte Datei hinzufügen + +edit ban list Editiere Liste von gebannten IPs und Hostnamen +remove a ban Entferne einen Bann +add a new ban Füge einen neuen Bann hinzu (IP Addresse oder Hostname, Sie koennen Wildcards benutzen) +the administrator has blocked your ip address or hostname Der Administrator hat Ihre IP Adresse oder Hostnamen gesperrt + +view entries from log file Einträge aus der Log Datei ansehen +view statistics from log file Statistik aus der Log Datei ansehen +how many entries would you like to view Wieviele Eintraege wollen Sie sehen +view Ansicht +page Page +of of + +calculate md5sum kalkuliere md5sum +download directory as tar.gz archive Lade das gesamte Verzeichnis als tar.gz Archiv herunter diff --git a/languages/el.txt b/languages/el.txt new file mode 100755 index 0000000..54f6de6 --- /dev/null +++ b/languages/el.txt @@ -0,0 +1,91 @@ +// Greek language file for AutoIndex version 2.1.2, no independent copyright claims by NSK, Translated from English by NSK, The English original is under the GPL therefore this Greek translation is also under the GPL, http://nsk.wikinerds.org/ + +index of Λίστα +parent directory Πάνω κατάλογος +thumbnail of Σμίνκ?υνση του +continue Συνέχεια + +file Α?χείο +files Α?χεία +folder Κατάλογος +folders Κατάλογοι +size Μέγεθος +total size Συνολικό μέγεθος +total downloads Συνολικές μεταφο?ές +total Σ?νολο +date Αλλαγή +description Πε?ιγ?αφή +downloads Μεταφο?ές +type Τ?πος +sort by Ταξινόμιση ανά + +search Ε??εση +both Και τα δυο +search results for Αποτελέσματα ε??εσης για +and its subdirectories και τους υποκαταλόγους του + +account Λογα?ιασμός χ?ήστη +login Αναγνώ?ιση +logout Απεγνώ?ιση +username Όνομα χ?ήστη +password Συνθηματικό +select user to remove Επέλεξε χ?ήστη για να αφαι?έσεις +are you sure you want to remove the user Είσαι σίγου?ος ότι θέλεις να αφαι?έσεις το χ?ήστη +delete this user Διαγ?αφή αυτο? του χ?ήστη +add user Π?οσθήκη χ?ήστη + +guest Καλεσμένος +user Κανονικός χ?ήστης +mod Κατευναστής +admin Διαχει?ηστής +level Επίπεδο χ?ήστη + +rename αλλαγή ονόματος/μετακίνηση +renaming Αλλαγή ονόματος +new filename ?έο όνομα α?χείου +you can also move the file by specifying a path μπο?είς επίσης να μετακινήσεις ένα α?χείο με το να γ?άψεις μία διαδ?ομή +delete διαγ?αφή +are you sure you want to delete the file Είσαι σίγου?ος ότι θέλεις να σβήσεις το α?χείο +edit description διό?θωση πε?ιγ?αφής +yes, delete ?αι, σβήσε το + +upload Μετακίνηση π?ος διακομιστή +files to this folder α?χεία σε αυτό το κατάλογο +uploaded files Α?χεία που έχουν μετακινηθεί στον διακομιστή +failed files Αποτυχημένα α?χεία +none Κανένα +file already exists το α?χείο ήδη υπάχ?ει +filename is listed as a hidden file το όνομα α?χείου είναι κ?υφό + +reconfigure script Αλλαγή πα?αμέτ?ων +create new directory in this folder Δημιου?γία νέου καταλόγου (σε αυτό τον κατάλογο) +edit list of hidden files Επεξε?γασία λίστας κ?υφών α?χείων +add new user Π?οσθήκη νέου χ?ήστη +delete user Διαγ?αφή χ?ήστη +copy url Αντιγ?αφή ενός απομακ?υσμένου α?χείου (σε αυτό το κατάλογο) +upload to ftp Μετακίνηση του α?χείου σε διακομιστή FTP + +enter the new description for the file Εισήγαγε νέα πε?ιγ?αφή για το α?χείο +change Αλλαγή +enter the new name Εισηγαγε το νέο όνομα +create Δημιου?γία + +add Π?οσθήκη +remove Αφαί?εση +remove a hidden file Αφαί?εση κ?υφο? α?χείου +add a new hidden file Π?οσθήκη κ?υφο? α?χείου + +edit ban list Επεξε?γασία λίστας απαγο?ευμένων διευθ?νσεων δικτ?ου IP και ονομάτων hostname +remove a ban Αφαί?εση απαγό?ευσης +add a new ban Π?οσθήκη απαγό?ευσης (διε?θυνση δικτίου IP ή όνομα hostname, μπο?εις να χ?ησιμοποιήσεις χα?ακτή?ες μπαλαντέ?) +the administrator has blocked your ip address or hostname Συγνώμη, ο διαχει?ιστής έχει απαγο?έψει την διε?θυνση δικτ?ου IP σας ή το όνομα hostname σας + +view entries from log file Δες εγγ?αφές από το α?χείο κατεγ?αφών +view statistics from log file Δες στατιστικά απο το α?χείο κατεγ?αφών +how many entries would you like to view Πόσες πολλές εγγ?αφές θα ήθελες να δεις +view Δες +page Page +of of + +calculate md5sum υπολόγησε md5sum +download directory as tar.gz archive Μετακίνηση του καταλόγου στον υπολογιστή μου ως συμπιεσμένο tar.gz α?χείο \ No newline at end of file diff --git a/languages/en.txt b/languages/en.txt new file mode 100755 index 0000000..c37e1c7 --- /dev/null +++ b/languages/en.txt @@ -0,0 +1,91 @@ +// English langauge file + +index of Index of +parent directory Parent Directory +thumbnail of Thumbnail of +continue Continue + +file File +files Files +folder Folder +folders Folders +size Size +total size Total size +total downloads Total downloads +total Total +date Modified +description Description +downloads Downloads +type Type +sort by Sort by + +search Search +both Both +search results for search results for +and its subdirectories and its subdirectories + +account User Account +login Login +logout Log out +username Username +password Password +select user to remove Select user to remove +are you sure you want to remove the user Are you sure you want to remove the user +delete this user Delete this user +add user Add User + +guest Guest +user Regular User +mod Moderator +admin Administrator +level User's level + +rename rename/move +renaming Renaming +new filename New Filename +you can also move the file by specifying a path you can also move the file by specifying a path +delete delete +are you sure you want to delete the file Are you sure you want to delete the file +edit description edit description +yes, delete Yes, delete it + +upload Upload +files to this folder file(s) to this folder +uploaded files Uploaded files +failed files Failed files +none None +file already exists file already exists +filename is listed as a hidden file filename is listed as a hidden file + +reconfigure script Reconfigure script +create new directory in this folder Create new directory (in this folder) +edit list of hidden files Edit list of hidden files +add new user Add new user +delete user Delete user +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Enter the new description for the file +change Change +enter the new name Enter the new name +create Create + +add Add +remove Remove +remove a hidden file Remove a hidden file +add a new hidden file Add a new hidden file + +edit ban list Edit list of banned IPs and hostnames +remove a ban Remove a ban +add a new ban Add a new ban (IP address or hostname, you can use wildcards) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file View entries from log file +view statistics from log file View statistics from log file +how many entries would you like to view How many entries would you like to view +view View +page Page +of of + +calculate md5sum calculate md5sum +download directory as tar.gz archive Download directory as tar.gz archive diff --git a/languages/es.txt b/languages/es.txt new file mode 100755 index 0000000..5e18676 --- /dev/null +++ b/languages/es.txt @@ -0,0 +1,91 @@ +// Spanish langauge file by Jess Espino + +index of Índice de +parent directory Directorio Padre +thumbnail of Miniatura de +continue Continuar + +file Archivo +files Archivos +folder Carpeta +folders Carpetas +size Tamaño +total size Tamaño total +total downloads Total de descargas +total Total +date Modificado +description Descripción +downloads Descargas +type Tipo +sort by Ordenar por + +search Buscar +both Ambos +search results for buscar resultados de +and its subdirectories y estos son subdirectorios + +account Cuenta de usuario +login Usuario +logout Desconectarse +username Usuario +password Contraseña +select user to remove Seleccione el usuario a eliminar +are you sure you want to remove the user ¿Está seguro de que desea eliminar al usuario +delete this user Eliminar este usuario +add user Añadir usuario + +guest Invitado +user Usuario +mod Moderator +admin Administrador +level Nivel del usuario + +rename renombrar/mover +renaming Renombrando +new filename Nuevo nombre de archivo +you can also move the file by specifying a path Usted también puede mover el archivo especificando un destino +delete eliminar +are you sure you want to delete the file ¿Está seguro que desea eliminar el archivo +edit description editar descripcion +yes, delete Sĩ, borrarlo + +upload Enviar +files to this folder archivo(s) a esta carpeta +uploaded files Archivos enviados +failed files Archivos no enviados +none Ninguno +file already exists el archivo ya existe +filename is listed as a hidden file el nombre del archivo es listado como un archivo oculto + +reconfigure script Reconfigurar el script +create new directory in this folder Crear nuevo directorio en esta carpeta +edit list of hidden files Editar lista de ficheros ocultos +add new user Añadir nuevo usuario +delete user Eliminar usuario +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Introduzca la nueva descripción para este archivo +change Cambiar +enter the new name Introduzca el nuevo nombre +create Crear + +add Añadir +remove Eliminar +remove a hidden file Eliminar un archivo oculto +add a new hidden file Añadir un nuevo archivo oculto + +edit ban list Editar la lista de IPs y hosts baneados +remove a ban Eliminar un ban +add a new ban Añadir nuevo ban (dirección IP o nombre del host, pude usar metacaracteres) +the administrator has blocked your ip address or hostname el administrador ha bloqueado su IP o nombre de máquina + +view entries from log file Ver las entradas del archivo log +view statistics from log file Ver las estadísticas del archivo log +how many entries would you like to view ¿Cuántas entradas desearía usted ver +view Ver +page Página +of de + +calculate md5sum calcular md5sum +download directory as tar.gz archive Descargar directorio como un archivo tar.gz diff --git a/languages/fr.txt b/languages/fr.txt new file mode 100755 index 0000000..b790807 --- /dev/null +++ b/languages/fr.txt @@ -0,0 +1,91 @@ +// French language file by NSV + +index of Index de +parent directory Dossier parent +thumbnail of Vignette de +continue Continuer + +file Fichier +files Fichiers +folder Dossier +folders Dossiers +size Taille +total size Taille total +total downloads Téléchargements totaux +total Total +date Modifié +description Description +downloads Téléchargements +type Type +sort by Classé par + +search Recherche +both Ensemble +search results for Résultat de recherche pour +and its subdirectories et ses sous-dossiers + +account Compte utilisateur +login Connexion +logout Déconnexion +username Nom d'utilisateur +password Mot de passe +select user to remove Selectionner un utilisateur à supprimer +are you sure you want to remove the user Etes vous sûr de vouloir supprimer cet utilisateur +delete this user Supprimer cet utilisateur +add user Ajouter un utilisateur + +guest Invité +user Utilisateur +mod Moderator +admin Administrateur +level Niveau d'utilisateur + +rename renommer/déplacer +renaming Renommage +new filename Nouveau nom de fichier +you can also move the file by specifying a path Vous pouvez déplacer le fichier en spécifiant la direction +delete supprimer +are you sure you want to delete the file Etes vous sûr de vouloir supprimer ce fichier +edit description editer la description +yes, delete Oui, je le supprime + +upload Envoie +files to this folder fichier(s) vers ce dossier +uploaded files Fichiers envoyés +failed files Fichiers ratés +none Aucun +file already exists fichier déjà existant +filename is listed as a hidden file le fichier est listé comme un fichier caché + +reconfigure script Reconfigurer le script +create new directory in this folder Créer un nouveau sous-dossier dans ce dossier +edit list of hidden files Editer la liste des fichiers cachés +add new user Ajouter un nouvel utilisateur +delete user Supprimer un utilisateur +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Entrer une nouvelle description pour ce fichier +change Changer +enter the new name Entrer un nouveau nom +create Créer + +add Ajouter +remove Supprimer +remove a hidden file Supprimer un fichier caché +add a new hidden file Ajouter un fichier caché + +edit ban list Editer la liste des IPs et des noms de hôte bannis +remove a ban Supprimer un bannissement +add a new ban Ajouter un nouveau bannissement (adresse IP ou noms de hôte, vous pouvez utiliser des wildcards) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Voir les entrées du fichier log +view statistics from log file Voir les statistiques du fichier log +how many entries would you like to view Combien d'entrées voulez vous voir +view Voir +page Page +of of + +calculate md5sum calculer le md5sum +download directory as tar.gz archive Télécharger le dossier en tant qu'archive tar.gz diff --git a/languages/hu.txt b/languages/hu.txt new file mode 100755 index 0000000..37d2721 --- /dev/null +++ b/languages/hu.txt @@ -0,0 +1,92 @@ +// Hungarian (Magyar) translation by crash +// last update: 2005.02.14. 14:15 + +index of Könyvtár +parent directory Feljebb +thumbnail of Thumbnail of +continue Tovább + +file Fájl +files Fájl +folder Könyvtár +folders Könyvtár +size Méret +total size Összes méret +total downloads Összes letöltés +total Összes +date Dátum +description Leírás +downloads Letöltés +type Típus +sort by Rendezés + +search Keresés +both Mind +search results for keresés eredménye +and its subdirectories és az alkönyvtárai + +account Felhasználói Menü +login Belépés +logout Kilépés +username Felhasználó név +password Jelszó +select user to remove Válaszd ki a törlendő felhasználót +are you sure you want to remove the user Biztos törölni akarod a felhasználót +delete this user Felhasználó törlése +add user Új felhasználó + +guest Vendég +user Felhasználó +mod Moderátor +admin Adminisztrátor +level Felhasználó szintje + +rename átnevez +renaming Étnevezés +new filename Új fájlnév +you can also move the file by specifying a path a fájl mozgatásához adj meg könyvtárat +delete töröl +are you sure you want to delete the file Biztos törölni akarod a fájlt +edit description leírás szerkesztése +yes, delete Igen, törölni akarom + +upload Feltöltés +files to this folder fájl(ok) ebbe a könyvtárba +uploaded files Feltöltött fájlok +failed files Sikertelen feltöltés +none Nincs +file already exists a fájl már létezik +filename is listed as a hidden file a fájl neve rejtettnek van beálíltva + +reconfigure script Script Újrakonfigurálása +create new directory in this folder Új könyvtár ebbe a könyvtárba +edit list of hidden files Rejtett fájlok listájának szerkesztése +add new user Új felhasználó +delete user Felhasználó törlése +copy url távoli fájl másolása (ebbe a könyvtárba) +upload to ftp fájl feltöltése az FTP szerverre + +enter the new description for the file Add meg a fájl új leírását +change Változtat +enter the new name Add meg az új nevét +create Létrehoz + +add Hozzáad +remove Töröl +remove a hidden file Rejtett fájl törlése +add a new hidden file Rejtett fájl létrehozása + +edit ban list Kitiltott IP-k és hostok listájának szerkesztése +remove a ban Kitiltás törlése +add a new ban Új kitiltás (IP cím vagy hostnév, wildcards használható) +the administrator has blocked your ip address or hostname Az adminisztrátor kitiltotta az IP címed vagy a hostneved + +view entries from log file Logfájl megtekintése +view statistics from log file Statisztika a logfájlból +how many entries would you like to view Hány darabot szeretnél látni +view Megnéz +page Page +of of + +calculate md5sum md5 számolás +download directory as tar.gz archive Könyvtár letöltése tar.gz formátumban diff --git a/languages/it.txt b/languages/it.txt new file mode 100755 index 0000000..26de319 --- /dev/null +++ b/languages/it.txt @@ -0,0 +1,91 @@ +// Italian language file by Dalilha + +index of Indice del +parent directory Directory padre +thumbnail of Thumbnail di +continue Continua + +file File +files Files +folder Cartella +folders Cartelle +size Dimensione +total size Dimensione totale +total downloads Downloads totali +total Totale +date Modificato +description Descrizione +downloads Downloads +type Tipo +sort by Ordina per + +search Ricerca +both Entrambi +search results for risultati della ricerca per +and its subdirectories e le sue subdirectories + +account Account utente +login Autenticazione +logout Logout +username Nome utente +password Password +select user to remove Seleziona l'utente da rimuovere +are you sure you want to remove the user Sei sicuro che vuoi rimuovere l'utente +delete this user Cancella questo utente +add user Aggiungi Utente + +guest Ospite +user Utente +mod Moderator +admin Admin +level Livello utente + +rename rinomina/sposta +renaming Sto Rinominando +new filename Nuovo nome del file +you can also move the file by specifying a path puoi anche spostare il file specificando un percorso +delete cancella +are you sure you want to delete the file Sicuro di voler cancellare il file +edit description Modifica la descrizione +yes, delete Si, cancella + +upload Caricamento +files to this folder file(s) da questa cartella +uploaded files File caricati +failed files Files falliti +none Niente +file already exists file già esistente +filename is listed as a hidden file Il nome di file è in lista come file nascosto + +reconfigure script Riconfigura lo script +create new directory in this folder Crea una nuova directory in questa cartella +edit list of hidden files Modfica la lista dei file nascosti +add new user Aggiungi un nuovo utente +delete user Cancella utente +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Inserisci la nuova descrizione per il file +change Cambia +enter the new name Inserisci il nuovo nome +create Crea + +add Aggiungi +remove Rimuovi +remove a hidden file Rimuovi un file nascosto +add a new hidden file Aggiungi un nuovo file nascosto + +edit ban list Modifica la lista degli IP e degli hostname bloccati +remove a ban Rimuovi un blocco +add a new ban Aggiungi un nuovo blocco (indirizzo IP o l'hostname, puoi usare anche i wildcards) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Guarda le entries dal fiel di log +view statistics from log file Guarda le statistiche dal file di log +how many entries would you like to view Quante entries vuoi vedere +view Guarda +page Page +of of + +calculate md5sum calcola md5sum +download directory as tar.gz archive Scarica la directory come un archivio tar.gz diff --git a/languages/ja.txt b/languages/ja.txt new file mode 100755 index 0000000..65c85d6 --- /dev/null +++ b/languages/ja.txt @@ -0,0 +1,92 @@ +// Japanese langauge file +// Tadashi Jokagi + +index of 次?一覧: +parent directory 親ディレクトリ +thumbnail of 次?サム?イル: +continue 続?る + +file ファイル +files ファイル +folder フォルダー +folders フォルダー +size 容? +total size ?容? +total downloads ?ダウンロード数 +total ?計 +date 修正日時 +description 説明 +downloads ダウンロード数 +type 種類 +sort by ソート基準 + +search 検索 +both Both +search results for 次?検索?果: +and its subdirectories ?????サブディレクトリ + +account ユーザーアカウント +login ログイン +logout ログアウト +username ユーザー?? +password パスワード +select user to remove ?択ユーザーを削除?る +are you sure you want to remove the user 本当?ユーザーを削除????? +delete this user ??ユーザーを削除?る +add user 新?ユーザーを追加?る + +guest ゲスト +user 一般ユーザー +mod モデレータ +admin 管?者 +level ユーザー?レベル + +rename ??称変更/移動 +renaming Renaming +new filename 新?ファイル?? +you can also move the file by specifying a path ?様??パス?指定?よりファイルを移動??る???????? +delete 削除?る +are you sure you want to delete the file 本当?ファイルを削除????? +edit description 説明を編集?る +yes, delete ?????れを削除??? + +upload アップロード?る +files to this folder ファイルを??フォルダー? +uploaded files ファイルをアップロード????。 +failed files ファイルを失敗????。 +none ?? +file already exists ファイル?既?存在???。 +filename is listed as a hidden file ファイル?隠?ファイル???一覧表示?れ?? + +reconfigure script スクリプトを?設定?る +create new directory in this folder ??フォルダー?新?ディレクトリを作??る +edit list of hidden files 隠?ファイル?一覧を編集?る +add new user 新?ユーザーを追加?る +delete user ユーザーを削除?る +copy url リモートファイルを??フォルダー?コピー?る +upload to ftp FTP サー?ー?ファイルをアップロード?る + +enter the new description for the file ファイル?新??説明を入力???????。 +change 変更?る +enter the new name 新?????を入力???????。 +create 作??る + +add 追加?る +remove 削除?る +remove a hidden file 隠?ファイルを削除?る +add a new hidden file 隠?ファイルを追加?る + +edit ban list ?止?れ? IP アドレス?ホスト???一覧を編集?る +remove a ban ?止情報を削除?る +add a new ban ?止情報を追加?る (IP アドレス化ホスト???ワイルドカード?使用?????) +the administrator has blocked your ip address or hostname ????ん。???? IP アドレス?も????ホスト???管?者?よりブロック?れ????。 + +view entries from log file ログファイル?らエントリを閲覧?る +view statistics from log file ログファイル?ら統計を閲覧?る +how many entries would you like to view ?れ??ら??エントリを閲覧??????? +view 閲覧?る +page Page +of of + +calculate md5sum md5sum を計算?る +download directory as tar.gz archive ディレクトリを tar.gz アーカイブ???ダウンロード?る diff --git a/languages/ko.txt b/languages/ko.txt new file mode 100755 index 0000000..6f2b7b3 --- /dev/null +++ b/languages/ko.txt @@ -0,0 +1,91 @@ +// 한국어 (Korean) Translation by pandix + +index of Index of +parent directory 상위 디렉토리 +thumbnail of 미리보기 +continue 계속 + +file 파일 +files 파일 +folder 폴더 +folders 폴더 +size 크기 +total size 전체 크기 +total downloads 전체 다운로드수 +total 전체 +date 수정 +description 설명 +downloads 다운로드 +type 형식 +sort by 정렬방식 + +search 검색 +both 모두 +search results for 다음에 대한 검색결과 +and its subdirectories 하위디렉토리 포함 + +account 사용자 계정 +login 로그인 +logout 로그아웃 +username 사용자 +password 비밀번호 +select user to remove 삭제할 사용자를 선택학세요 +are you sure you want to remove the user 사용자를 정말로 삭제하시겠습니까 +delete this user 이 사용자 삭제 +add user 사용자 추가 + +guest 손님 +user 사용자 +mod Moderator +admin 관리자 +level 사용자 레벨 + +rename 이름변경/이동 +renaming 이름변경중 +new filename 새 파일이름 +you can also move the file by specifying a path 특정 경로로 파일을 이동할 수 있습니다 +delete 삭제 +are you sure you want to delete the file 이 파일을 정말로 삭제하시겠습니까 +edit description 설명 편집 +yes, delete 네, 삭제합니다 + +upload 업로드 +files to this folder 개의 파일을 이 폴더에 +uploaded files 업로드한 파일 +failed files 실패한 파일 +none 없음 +file already exists 파일이 이미 있습니다 +filename is listed as a hidden file 숨겨진 파일에 같은 이름이 있습니다 + +reconfigure script 스크립트 재설정 +create new directory in this folder 이 폴더내에 새로운 디렉토리를 만듦니다 +edit list of hidden files 숨김 파일의 목록을 설정합니다 +add new user 새로운 사용자 추가 +delete user 사용자 지우기 +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file 파일의 새로운 설명을 입력하세요 +change 바꾸기 +enter the new name 새 이름을 입력하세요 +create 만들기 + +add 추가 +remove 삭제 +remove a hidden file 숨김파일 삭제 +add a new hidden file 새로운 숨김파일 추가 + +edit ban list 거부 목록의 IP 주소와 호스트네임 편집 +remove a ban 거부 목록에서 제외하기 +add a new ban 거부 목록 추가하기 (IP 주소나 호스트네임, 와일드 카드 사용가능) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file 로그 파일 내용 보기 +view statistics from log file 로그 파일 통계 보기 +how many entries would you like to view 얼마나 많은 내용을 표시할까요 +view 보기 +page Page +of of + +calculate md5sum md5sum 계산 +download directory as tar.gz archive 디렉토리를 tar.gz 압축으로 다운받기 diff --git a/languages/ms.txt b/languages/ms.txt new file mode 100755 index 0000000..ee2e5ba --- /dev/null +++ b/languages/ms.txt @@ -0,0 +1,91 @@ +// Fail Bahasa Melayu oleh Ir.Haji Keropok + +index of Indeks tentang +parent directory Direktori Utama +thumbnail of Thumbnail of +continue Bersambung + +file Fail +files Fail-fail +folder Direktori +folders Direktori +size Saiz +total size Jumlah saiz +total downloads Jumlah muatturun +total Jumlah +date Modifait +description Huraian +downloads Muatturun +type Jenis +sort by Asingkan mengikut + +search Cari +both Kedua-duanya +search results for keputusan carian untuk +and its subdirectories dan di bawah direktori + +account Akaun Pengguna +login Log masuk +logout Log keluar +username Namaahli +password Katalaluan +select user to remove Pilih pengguna untuk dibuang +are you sure you want to remove the user Adakah anda pasti untuk membuang pengguna tersebut +delete this user Buang pengguna ini +add user Tambah pengguna + +guest Tetamu +user Pengguna +mod Moderator +admin Pentadbir +level Tahap Pengguna + +rename menamakan/pindah +renaming Menamakankembali +new filename Nama Failbaru +you can also move the file by specifying a path anda boleh pindahkan fail dengan mengkhususkan path +delete buang +are you sure you want to delete the file Adakah anda pasti untuk membuang fail tersebut +edit description ubah huraian +yes, delete Ya, buangkannya + +upload Muatnaik +files to this folder fail ke direktori ini +uploaded files Muatnaik fail +failed files Fail gagal +none Tiada +file already exists fail sudah ada +filename is listed as a hidden file Nama fail sudah tersenarai sebagai fail sembunyi + +reconfigure script Skrip konfigurasi semula +create new directory in this folder Buat direktori baru di dalam folder ini +edit list of hidden files Ubah senarai fail sembunyi +add new user Tambah pengguna baru +delete user Buang pengguna +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Masukkan huraian baru untuk fail tersebut +change Tukar +enter the new name Masukkan nama baru +create Buat + +add Tambah +remove Buang +remove a hidden file Buang fail sembunyi +add a new hidden file Tambah fail sembunyi baru + +edit ban list Ubah senarai halangan IP dan hostname +remove a ban Buang halangan +add a new ban Tambah halangan baru (Alamat IP atau hostname, anda boleh juga menggunakan wildcard) +the administrator has blocked your ip address or hostname Maaf, pentadbir telah menghalang alamat IP atau hostname anda + +view entries from log file Lihat masukkan dari catatan fail +view statistics from log file Lihat statistik dari catatan fail +how many entries would you like to view Berapa banyakkah masukkan hendak anda lihat +view Lihat +page Page +of of + +calculate md5sum kira md5sum +download directory as tar.gz archive Muatturun direktori sebagai arkib tar.gz diff --git a/languages/nl.txt b/languages/nl.txt new file mode 100755 index 0000000..96ee896 --- /dev/null +++ b/languages/nl.txt @@ -0,0 +1,91 @@ +// Dutch langauge file by Raymond + +index of Index van +parent directory Bovenliggende map +thumbnail of Thumbnail van +continue Doorgaan + +file Bestand +files Bestanden +folder Map +folders Mappen +size Grootte +total size Totale Grootte +total downloads Totaal aantal downloads +total Totaal +date Datum +description Beschrijving +downloads Downloads +type Type +sort by Gesorteerd op + +search Zoeken +both Beide +search results for Zoek resultaten van +and its subdirectories en de onderliggende mappen + +account Gebruikers Account +login Login +logout Log out +username Gebruikersnaam +password Wachtwoord +select user to remove Selecteer gebruir om te verwijderen +are you sure you want to remove the user Weet u zeker dat u de gebruiker wil verwijderen +delete this user Verwijder deze gebruiker +add user Voeg gebruiker toe + +guest Gast +user Gebruiker +mod Moderator +admin Admin +level Gebruiker's niveau + +rename hernoem/verplaats +renaming Hernoemen +new filename Nieuwe Bestandsnaam +you can also move the file by specifying a path U kan ook de map verplaatsen door een specifieke pad te specificeren +delete verwijder +are you sure you want to delete the file Weet u zeker dat u dit bestand wilt verwijderen +edit description bewerk beschrijving +yes, delete Ja, verwijderen + +upload Upload +files to this folder Bestand(en) naar deze map +uploaded files Geuploade bestanden +failed files Mislukte bestanden +none Geen +file already exists Bestand bestaat al +filename is listed as a hidden file Bestandsnaam is opgeslagen als verborgen bestand + +reconfigure script Herconfigureer script +create new directory in this folder Maak een nieuwe map in deze map +edit list of hidden files Bewerk lijst van verborgen bestanden +add new user Voeg een nieuwe gebruiker toe +delete user Verwijder gebruiker +copy url Kopieer een bestand van een URL +upload to ftp Upload een bestand naar een FTP server + +enter the new description for the file Geef een nieuwe beschrijving voor het bestand +change Verander +enter the new name Geef een nieuwe naam +create Maak + +add Toevoegen +remove Verwijder +remove a hidden file Verwijder verborgen bestand +add a new hidden file Nieuw verborgen Bestand toevoegen + +edit ban list Bewerk lijst van gebande IP's en hostnames +remove a ban Verwijder een ban +add a new ban Nieuwe ban toevoegen (IP adres of hostname, u kunt wildcards gebruiken) +the administrator has blocked your ip address or hostname Sorry, uw IP-adres of hostname is geblokkeerd door de administrator + +view entries from log file Bekijk notities in het log bestand +view statistics from log file Bekijk de statistieken in het log bestand +how many entries would you like to view Hoeveel notities wilt u bekijken +view Bekijken +page Pagina +of van de + +calculate md5sum Bereken md5sum +download directory as tar.gz archive Download map als tar.gz archief diff --git a/languages/no.txt b/languages/no.txt new file mode 100755 index 0000000..44f278d --- /dev/null +++ b/languages/no.txt @@ -0,0 +1,91 @@ +// Norwegian langauge file by tg90nor + +index of Indeks for +parent directory Modermappe +thumbnail of Forhåndsvisning av +continue Fortsett + +file Fil +files Filer +folder Mappe +folders Mapper +size Størrelse +total size Total størrelse +total downloads Nedlastninger totalt +total Total +date Modifisert +description Beskrivelse +downloads Nedlastninger +type Type +sort by Sorter etter + +search Søk +both Begge +search results for søkeresultater for +and its subdirectories og undermappene + +account Brukerkonto +login Logg inn +logout Logg ut +username Brukernavn +password Passord +select user to remove Velg bruker for fjerning +are you sure you want to remove the user Er du sikker på at du vil fjerne brukeren +delete this user Slett denne brukeren +add user Legg til bruker + +guest Gjest +user Bruker +mod Moderator +admin Admin +level brukerens level + +rename gi nytt navn/flytt +renaming Gir nytt navn +new filename Nytt filnavn +you can also move the file by specifying a path du kan også flytte filen ved å spesifisere en sti +delete slett +are you sure you want to delete the file Er du sikker på at du vil slette filen +edit description endre beskrivelse +yes, delete Ja, slett den + +upload Opplast +files to this folder fil(er) til denne mappen +uploaded files Opplastede filer +failed files Mislykkede filer +none Ingen +file already exists filen eksisterer allerede +filename is listed as a hidden file filnavnet er oppført som en skjult fil + +reconfigure script Rekonfigurer skript +create new directory in this folder Opprett en ny mappe i denne mappen +edit list of hidden files Rediger liste over skjulte filer +add new user Legg til ny bruker +delete user Slett bruker +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Skriv inn den nye beskrivelsen for filen +change Endre +enter the new name Skriv inn det nye navnet +create Opprett + +add Legg til +remove Fjern +remove a hidden file Fjern en skjult fil +add a new hidden file Legg til en ny skjult fil + +edit ban list Rediger liste over blokkerte IP-er og vertsnavn +remove a ban Fjern en blokkering +add a new ban Legg til en ny blokkering (IP-adresse eller vertsnavn, du kan bruke wildcards) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Vis oppføringer fra logfil +view statistics from log file Vis statistikk fra logfil +how many entries would you like to view Hvor mange oppføringer vil du vise +view Vis +page Page +of of + +calculate md5sum kalkuler md5sum +download directory as tar.gz archive Last ned mappe som tar.gz-arkiv diff --git a/languages/pl.txt b/languages/pl.txt new file mode 100755 index 0000000..7feff88 --- /dev/null +++ b/languages/pl.txt @@ -0,0 +1,91 @@ +// Polish langauge file by Krzysztof Kopeć + +index of Index of +parent directory Katalog macierzysty +thumbnail of Thumbnail z +continue Kontynuuj + +file Plik +files Pliki +folder Folder +folders Foldery +size Rozmiar +total size Całkowity rozmiar +total downloads Suma pobrań +total Całkowity +date Zmodyfikowany +description Opis +downloads Pobierz +type Typ +sort by Sortuj po + +search Wyszukaj +both Obaj +search results for Rezultat wyszukiwania +and its subdirectories i jego podkatalogi + +account Konto użytkownika +login Zaloguj +logout Wyloguj +username Nazwa użytkownika +password Hasło +select user to remove Wybierz uzytkownika do przeniesienia +are you sure you want to remove the user Czy jesteś pewien że chcesz przenieść użytkownika +delete this user Skasuj tego użytkownika +add user Dodaj użytkownika + +guest Gość +user Użytkownik +mod Moderator +admin Administrator +level Poziom użytkownika + +rename zmień nazwę / przenieś +renaming Zmieniając nazwę +new filename Nowa nazwa filmu +you can also move the file by specifying a path możesz też przenieść plik przez wyszczególnianie ścieżki dostępu +delete Skasuj +are you sure you want to delete the file Czy jesteś pewien że chcesz usunąć plik +edit description Edytuj opis +yes, delete Yes, delete it + +upload Załaduj +files to this folder Plik(i) do tego folderu +uploaded files Załadowane pliki +failed files Nie zdołane pliki +none Żaden +file already exists Plik już istnieje +filename is listed as a hidden file nazwa zbioru jest opisana jako zbiór ukryty + +reconfigure script Rekonfiguracja skryptu +create new directory in this folder Utwórz nowy katalog w tym folderze +edit list of hidden files Edytuj listę plików/folderów ukrytych +add new user Dodaj nowego użytkownika +delete user Usuń użytkownika +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Wprowadź nowy opis do pliku +change Zmień +enter the new name Wprowadź nową nazwę +create Utwórz + +add Dodaj +remove Przenieś +remove a hidden file Przenieś zbiór ukryty +add a new hidden file Dodaj nowy zbiór ukryty + +edit ban list Edytuj listę zakazanych IPs i hostnames +remove a ban Usuń zakaz +add a new ban Dodaj nowy zakaz (adres IP albo hostname, możesz użyć znaków uniwersalnych) +the administrator has blocked your ip address or hostname Przepraszam, administrator zablokował twój adres IP albo hostname + +view entries from log file Zapis widoku z pliku rejestru +view statistics from log file Statystyki widoku z pliku rejestru +how many entries would you like to view Jak wiele zapisów chciałbyś oglądnąć +view Widok +page Page +of of + +calculate md5sum oblicza md5sum +download directory as tar.gz archive Pobierz katalog jak plik archiwum tar.gz diff --git a/languages/pt_BR.txt b/languages/pt_BR.txt new file mode 100755 index 0000000..e210ef0 --- /dev/null +++ b/languages/pt_BR.txt @@ -0,0 +1,92 @@ +// Brazilian style Portuguese translation +// by Marcelo Pelagio Pontes Morais at pontesmorais@yahoo.com + +index of Índice de +parent directory Diretório Pai +thumbnail of Miniatura de +continue Continuar + +file Arquivo +files Arquivos +folder Diretório +folders Diretórios +size Tamanho +total size Tamanho total +total downloads Total de downloads +total Total +date Modificado +description Descrição +downloads Downloads +type Tipo +sort by Ordenar por + +search Procurar +both Ambos +search results for Resultados da busca para +and its subdirectories e seus subdiretórios + +account Conta do Usuário +login Conectar +logout Desconectar +username Nome de Usuário +password Senha +select user to remove Selecione qual usuário remover +are you sure you want to remove the user Tem certeza que deseja remover este usuário +delete this user Remover este usuário +add user Adicionar Usuário + +guest Convidado +user Usuário +mod Moderator +admin Administrador +level Nível do usuário + +rename renomear/mover +renaming Renomeando +new filename Novo nome de arquivo +you can also move the file by specifying a path Você também pode mover o arquivo especificando um caminho +delete apagar +are you sure you want to delete the file Têm certeza que deseja apagar o arquivo +edit description editar descrição +yes, delete Sim, apagar + +upload Enviar +files to this folder arquivos para este diretório +uploaded files Arquivos enviados +failed files Arquivos não enviados +none Nenhum +file already exists Arquivo já existe +filename is listed as a hidden file o nome do arquivo é listado como um arquivo oculto + +reconfigure script Reconfigurar script +create new directory in this folder Criar um novo subdiretório neste diretório +edit list of hidden files Editar lista dos arquivos ocultos +add new user Adicionar novo usuário +delete user Remover usuário +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Entre a nova descrição para o arquivo +change Modificar +enter the new name Entre o novo nome +create Criar + +add Adicionar +remove Remover +remove a hidden file Remover um arquivo escondido +add a new hidden file Adicionar um novo arquivo escondido + +edit ban list Editar a lista de IPs e hosts com banners +remove a ban Remover um banner +add a new ban Adicionar um novo banner (endereço IP ou hostname. Você pode usar caracteres curinga) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Ver entradas no arquivo de Log +view statistics from log file Ver estatísticas do arquivo de Log +how many entries would you like to view Quantas entradas você deseja ver +view Ver +page Page +of of + +calculate md5sum calcular md5sum +download directory as tar.gz archive Fazer Download do diretório como um arquivo 'tar.gz' diff --git a/languages/ru.txt b/languages/ru.txt new file mode 100755 index 0000000..b0fbbf4 --- /dev/null +++ b/languages/ru.txt @@ -0,0 +1,91 @@ +// Russian langauge file by Andrey Olischuk + +index of Индекс +parent directory Родительская директория +thumbnail of Пиктограмма +continue Продолжить + +file Файл +files Файлы +folder Папка +folders Папки +size Размер +total size Общий размер +total downloads Всего скачано +total Всего +date Изменено +description Описание +downloads Загрузка +type Тип +sort by Сортировать по + +search Поиск +both Оба +search results for Результаты поиска для +and its subdirectories и подкаталоги + +account Аккаунт +login Вход в систему +logout Выход из системы +username Имя пользователя +password Пароль +select user to remove Выберите пользователя для удаления +are you sure you want to remove the user Вы уверены, что хотите удалить этого пользователя +delete this user Удалить этого пользователя +add user Добавить пользователя + +guest Гость +user Пользователь +mod Moderator +admin Администратор +level Уровень + +rename Переименовать +renaming Переименование +new filename Новое имя файла +you can also move the file by specifying a path Вы так же можете переместить файл, указав путь +delete Удалить +are you sure you want to delete the file Вы уверены, что хотите удалить этот файл +edit description Редактировать описание +yes, delete Да, удалить + +upload Закачать +files to this folder Файлы в данную папку +uploaded files Закачаные файлы +failed files Не закачанные файлы +none Нет +file already exists Файл уже существует +filename is listed as a hidden Файл помечен как скрытый + +reconfigure script Переконфигурировать скрипт +create new directory in this folder Создать новую директорию в данной +edit list of hidden files Редактировать список скрытых файлов +add new user Добавить нового пользователя +delete user Удалить пользователя +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Введите новое описание файла +change Изменить +enter the new name Введите новое имя +create Создать + +add Добавить +remove Удалить +remove a hidden file Удалить скрытый файл +add a new hidden file Добавить новый скрытый файл + +edit ban list Редактировать список забаненых +remove a ban Снять бан +add a new ban Добавить в список забаненых +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Просмотреть лог-файл +view statistics from log file Просмотреть статистику из лог-файла +how many entries would you like to view Сколько записей вы хотите просмотреть +view Просмотреть +page Page +of of + +calculate md5sum Рассчитать md5sum +download directory as tar.gz archive Скачать директорию в виде tar.gz архива diff --git a/languages/sk.txt b/languages/sk.txt new file mode 100755 index 0000000..c7f6225 --- /dev/null +++ b/languages/sk.txt @@ -0,0 +1,91 @@ +// Slovenský preklad, vytvoril keeper7 + +index of Výpis z +parent directory Nadradený adresár +thumbnail of Miniatúra +continue Pokračovať + +file Súbor +files Súbory +folder Zložka +folders Zložky +size Veľkost +total size Celková veľkost +total downloads Celkom stiahnuté +total Celkovov +date Upravené +description Popis +downloads Stiahnuté +type Typ +sort by Triediť podľa + +search Vyhľedať +both Všetko +search results for výsledky vyhľadávania pre +and its subdirectories a jeho podzložky + +account Užívatelský účet +login Prihlásiť +logout Odhlásiť +username Užívateľské meno +password Heslo +select user to remove vyberte uživateľa na zmazanie +are you sure you want to remove the user Ste si istý, že chcete zmazat užívateľa +delete this user Zmazať užívateľa +add user Pridať užívateľa + +guest Hosť +user Užívateľ +mod Moderátor +admin Administrátor +level Užívateľská úroveň + +rename premenovať/presunúť +renaming Premenovanie +new filename Nové meno súboru +you can also move the file by specifying a path môžete tiež presunúť súbor určením cesty +delete zmazať +are you sure you want to delete the file Ste si istý, že chcete zmazať súbor +edit description upraviť popis +yes, delete Áno, zmazať + +upload Nahrať +files to this folder súbor(y) do tejto zložky +uploaded files Nahraté súbory +failed files Nahrávanie zlyhalo +none Žiadne +file already exists súbor už existuje +filename is listed as a hidden file meno súboru je v zozname skrytých súborov + +reconfigure script Prekonfigurovať skript +create new directory in this folder Vytvoriť nový adresár (v tejto zložke) +edit list of hidden files Upraviť zoznam skrytých súborov +add new user Pridať nového užívateľa +delete user Zmazať užívateľa +copy url Kopírovať vzdialený súbor (do tejto zložky) +upload to ftp nahrať súbor na FTP server + +enter the new description for the file Vložiť nový popis k súboru +change Zmeniť +enter the new name Vložiť nové meno +create Vytvoriť + +add Pridať +remove Odobrať +remove a hidden file Odobrar skrytý súbor +add a new hidden file Pridať skrytý súbor + +edit ban list Upravit zoznam zakázaných IP adries a hostnames +remove a ban Odobrať zákaz +add a new ban Pridať nový zákaz (IP addresa alebo hostname, môžete použiť značky napr *.host.sk) +the administrator has blocked your ip address or hostname Prepáčte, ale správca zablokoval vašu IP adresu alebo hostname + +view entries from log file Zobraziť návštevy z logu +view statistics from log file Zobraziť štatistiky z logu +how many entries would you like to view Koľko položiek chcete zobraziť +view Zobraziť +page Page +of of + +calculate md5sum spočítať md5sum +download directory as tar.gz archive Stiahnúť zložku ako tar.gz archív diff --git a/languages/sv.txt b/languages/sv.txt new file mode 100755 index 0000000..ad35c9e --- /dev/null +++ b/languages/sv.txt @@ -0,0 +1,91 @@ +// Swedish langauge file by -=FrItZ=- + +index of Indexering av +parent directory Upp en niv +thumbnail of Miniatyrbild av +continue Fortstt + +file Fil +files Filer +folder Mapp +folders Mappar +size Storlek +total size Total storlek +total downloads Totalt nedladdat +total Totalt +date ndrad +description Frklaring +downloads Nedladdningar +type Typ +sort by Sorta efter + +search Sk +both Bde +search results for sk resultat av +and its subdirectories och dess undermappar + +account Anvndarkonto +login Logga in +logout Logga ut +username Anvndarnamn +password Lsenord +select user to remove Vlj anvndare att ta bort +are you sure you want to remove the user r du sker p att du vill ta bort anvndaren +delete this user Radera denna anvndare +add user Skapa anvndare + +guest Gst +user Vanlig anvndare +mod Moderator +admin Administratr +level Anvndarniv + +rename Dp om/flytta +renaming Dper om +new filename Nytt filnamn +you can also move the file by specifying a path Du kan flytta en fil genom att ange en skvg +delete Radera +are you sure you want to delete the file r du sker p att du vill radera filen +edit description ndra frklaring +yes, delete Ja, radera den + +upload Ladda upp +files to this folder fil(er) till denna mapp +uploaded files Uppladdade filer +failed files Misslyckade filer +none Inga +file already exists filen existerar redan +filename is listed as a hidden file filnamnet finns som dold fil + +reconfigure script Konfigurera om scriptet +create new directory in this folder Skapa ny mapp (i denna mapp) +edit list of hidden files ndra listan av dolda filer +add new user Lgg till anvndare +delete user Radera anvndare +copy url Kopiera en remote fil (till denna mapp) +upload to ftp Ladda upp fil till FTP server + +enter the new description for the file Skriv ny frklaring till filen +change ndra +enter the new name Skriv nytt namn +create Skapa + +add Lgg till +remove Ta bort +remove a hidden file Ta bort en dold fil +add a new hidden file Lgg till en dold fil + +edit ban list ndra listan med bannade IPs och vrdnamn +remove a ban Ta bort en ban +add a new ban Lgg till en ban (IP adress eller vrdnamn, du kan anvnda wildcards) +the administrator has blocked your ip address or hostname Fuck U, Administratren har blockerat dig + +view entries from log file Se anslutningar frn loggfil +view statistics from log file Se statistik frn loggfil +how many entries would you like to view Hur mnga anslutningar vill du se +view Se +page Page +of of + +calculate md5sum Kalkylera md5sum +download directory as tar.gz archive Ladda ner mapp som tar.gz arkiv diff --git a/languages/th.txt b/languages/th.txt new file mode 100755 index 0000000..1ac6cac --- /dev/null +++ b/languages/th.txt @@ -0,0 +1,91 @@ +//Thai langauge file by maxzerker@hotmail.com + +index of Ѫբͧ +parent directory ͹˹ +thumbnail of ͺٻͧ +continue + +file +files +folder +folders +size Ҵ +total size Ҵ +total downloads ǹŴ +total +date +description ´ +downloads ǹŴ +type Դ +sort by § + +search +both 駤 +search results šäѺ +and its subdirectories 駫Ѻ + +account ѭռ +login к +logout ͡ҡк +username ͼ +password ʼҹ +select user to remove ͡ͼź͡ +are you sure you want to remove the user سҵͧźͼ +delete this user źͼ +add user ͼ + +guest ᢡ +user +mod Moderator +admin к +level дѺͧ + +rename ¹/͹ +renaming ѧ¹ +new filename +you can also move the file by specifying a path سö͹¡кط +delete ź +are you sure you want to delete the file سͷź +edit description ´ +yes, delete źѹ() + +upload Ŵ +files to this folder +uploaded files Ŵ +failed files +none +file already exists +filename is listed as a hidden file ١Ѵ١͹ + +reconfigure script 觤ʤԻ +create new directory in this folder ҧ +edit list of hidden files ¡âͧ١͹ +add new user +delete user ź +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file к´ͧ +change ¹ +enter the new name кت +create ҧ + +add +remove ͡ +remove a hidden file ١͹͡ +add a new hidden file ŷ١͹ + +edit ban list ¡ẹ;Ъʷ +remove a ban ẹ͡ +add a new ban ¡ẹ (к ; ʷ,سöŴ) +the administrator has blocked your ip address or hostname ¼кӡú͡ ; ʷ ͧس + +view entries from log file ʴ¡èҡ͡ +view statistics from log file ʴʶԵԨҡ͡ +how many entries would you like to view ӹǹͧ¡÷سͧ÷ʴ +view ʴ +page Page +of of + +calculate md5sum ӹdz MD5 +download directory as tar.gz archive ǹŴ tar.gz diff --git a/languages/tr.txt b/languages/tr.txt new file mode 100755 index 0000000..2f4c6d4 --- /dev/null +++ b/languages/tr.txt @@ -0,0 +1,91 @@ +// Turkish language file by Sinan Keskn + +index of indekiler +parent directory Ana Dizin +thumbnail of Kk Resmi +continue Devam + +file Dosya +files Dosyalar +folder Klasr +folders Klasrler +size Boyut +total size Toplam boyut +total downloads Toplam indirilme +total Toplam +date Deitirilme +description Tanmlama +downloads ndirilmeler +type Tip +sort by Sralama + +search Arama +both Her kiside +search results for Arama sonular +and its subdirectories ve altdizinleri + +account Kullanc Hesab +login Giri +logout k +username Kullanc Ad +password ifre +select user to remove Silinecek kullancy sein +are you sure you want to remove the user Kullanc silmek istediinizden emin misiniz +delete this user Bu kullancy sil +add user Kullanc Ekle + +guest Misafir +user Kullanc +mod Moderator +admin Ynetici +level Kullanc Seviyeleri + +rename Yeniden adlandr/Ta +renaming Yeniden adlandrma +new filename Yeni Dosya smi +you can also move the file by specifying a path belirtilen yol ile bu dosyay tayabilirsiniz +delete sil +are you sure you want to delete the file Bu dosyay silmek istediinizden emin misiniz +edit description tanmlama dzenle +yes, delete Evet, sil + +upload Karya gnder +files to this folder dosyalar bu klasre +uploaded files Karya gnderilmi dosyalar +failed files Baarsz dosyalar +none Yok +file already exists dosya zaten var +filename is listed as a hidden file dosya ismi gizli dosya olarak listeleniyor + +reconfigure script Scripti yeniden konfigre et +create new directory in this folder Bu klasrde yeni bir dizin olutur +edit list of hidden files Gizli dosyalarn listesini dzenle +add new user Yeni kullanc ekle +delete user Kullanc sil +copy url Copy a remote file (to this folder) +upload to ftp upload file to FTP server + +enter the new description for the file Dosya iin yeni bir tanmlama girin +change Deitir +enter the new name Yeni isim girin +create Olutur + +add Ekle +remove Sil +remove a hidden file Gizli bir dosya sil +add a new hidden file Gizli bir dosya ekle + +edit ban list Banl IP ve adreslerin listesini dzenle +remove a ban Ban sil +add a new ban Yeni ban ekle (Ip ya da adres) +the administrator has blocked your ip address or hostname Sorry, the administrator has blocked your IP address or hostname + +view entries from log file Logtan girdileri gster +view statistics from log file Logtan istatistikleri gster +how many entries would you like to view Ka girdi grmek istiyorsunuz +view Gster +page Page +of of + +calculate md5sum md5sum hesapla +download directory as tar.gz archive Dizini tar.gz ariv olarak indir diff --git a/license.html b/license.html new file mode 100755 index 0000000..7dc90a4 --- /dev/null +++ b/license.html @@ -0,0 +1,418 @@ + + + + + + GNU General Public License + + + + + +

    GNU General Public License

    + +

    Version 2, June 1991

    +
    +Copyright (C) 1989, 1991 Free Software Foundation, Inc.
    +59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
    +
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + +

    Preamble

    + +

    The licenses for most software are designed to take away +your freedom to share and change it. By contrast, the GNU +General Public License is intended to guarantee your freedom +to share and change free software--to make sure the software +is free for all its users. This General Public License +applies to most of the Free Software Foundation's +software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) +You can apply it to your programs, too.

    + +

    When we speak of free software, we are referring to +freedom, not price. Our General Public Licenses are designed +to make sure that you have the freedom to distribute copies +of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new +free programs; and that you know you can do these things.

    + +

    To protect your rights, we need to make restrictions that +forbid anyone to deny you these rights or to ask you to +surrender the rights. These restrictions translate to certain +responsibilities for you if you distribute copies of the +software, or if you modify it.

    + +

    For example, if you distribute copies of such a program, +whether gratis or for a fee, you must give the recipients all +the rights that you have. You must make sure that they, too, +receive or can get the source code. And you must show them +these terms so they know their rights.

    + +

    We protect your rights with two steps: (1) copyright the +software, and (2) offer you this license which gives you +legal permission to copy, distribute and/or modify the +software.

    + +

    Also, for each author's protection and ours, we want +to make certain that everyone understands that there is no +warranty for this free software. If the software is modified +by someone else and passed on, we want its recipients to know +that what they have is not the original, so that any problems +introduced by others will not reflect on the original +authors' reputations.

    + +

    Finally, any free program is threatened constantly by +software patents. We wish to avoid the danger that +redistributors of a free program will individually obtain +patent licenses, in effect making the program proprietary. To +prevent this, we have made it clear that any patent must be +licensed for everyone's free use or not licensed at +all.

    + +

    The precise terms and conditions for copying, distribution +and modification follow.

    + +

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION

    + +

    0. This License applies to any program or +other work which contains a notice placed by the copyright +holder saying it may be distributed under the terms of this +General Public License. The "Program", below, +refers to any such program or work, and a "work based on +the Program" means either the Program or any derivative +work under copyright law: that is to say, a work containing +the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. +(Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is +addressed as "you".

    + +

    Activities other than copying, distribution and +modification are not covered by this License; they are +outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only +if its contents constitute a work based on the Program +(independent of having been made by running the Program). +Whether that is true depends on what the Program does.

    + +

    1. You may copy and distribute verbatim +copies of the Program's source code as you receive it, in +any medium, provided that you conspicuously and appropriately +publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that +refer to this License and to the absence of any warranty; and +give any other recipients of the Program a copy of this +License along with the Program.

    + +

    You may charge a fee for the physical act of transferring +a copy, and you may at your option offer warranty protection +in exchange for a fee.

    + +

    2. You may modify your copy or copies of +the Program or any portion of it, thus forming a work based +on the Program, and copy and distribute such modifications or +work under the terms of Section 1 above, provided that you +also meet all of these conditions:

    + +
      +
    • a) You must cause the modified files +to carry prominent notices stating that you changed the +files and the date of any change.
    • + +
    • b) You must cause any work that you +distribute or publish, that in whole or in part contains or +is derived from the Program or any part thereof, to be +licensed as a whole at no charge to all third parties under +the terms of this License.
    • + +
    • c) If the modified program normally +reads commands interactively when run, you must cause it, +when started running for such interactive use in the most +ordinary way, to print or display an announcement including +an appropriate copyright notice and a notice that there is +no warranty (or else, saying that you provide a warranty) +and that users may redistribute the program under these +conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive +but does not normally print such an announcement, your work +based on the Program is not required to print an +announcement.)
    • +
    + +

    These requirements apply to the modified work as a whole. +If identifiable sections of that work are not derived from +the Program, and can be reasonably considered independent and +separate works in themselves, then this License, and its +terms, do not apply to those sections when you distribute +them as separate works. But when you distribute the same +sections as part of a whole which is a work based on the +Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend +to the entire whole, and thus to each and every part +regardless of who wrote it.

    + +

    Thus, it is not the intent of this section to claim rights +or contest your rights to work written entirely by you; +rather, the intent is to exercise the right to control the +distribution of derivative or collective works based on the +Program.

    + +

    In addition, mere aggregation of another work not based on +the Program with the Program (or with a work based on the +Program) on a volume of a storage or distribution medium does +not bring the other work under the scope of this License.

    + +

    3. You may copy and distribute the +Program (or a work based on it, under Section 2) in object +code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: +

    + +
      +
    • a) Accompany it with the complete +corresponding machine-readable source code, which must be +distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange; or,
    • + +
    • b) Accompany it with a written offer, +valid for at least three years, to give any third party, +for a charge no more than your cost of physically +performing source distribution, a complete machine-readable +copy of the corresponding source code, to be distributed +under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or,
    • + +
    • c) Accompany it with the information +you received as to the offer to distribute corresponding +source code. (This alternative is allowed only for +noncommercial distribution and only if you received the +program in object code or executable form with such an +offer, in accord with Subsection b above.)
    • +
    + +

    The source code for a work means the preferred form of the +work for making modifications to it. For an executable work, +complete source code means all the source code for all +modules it contains, plus any associated interface definition +files, plus the scripts used to control compilation and +installation of the executable. However, as a special +exception, the source code distributed need not include +anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and +so on) of the operating system on which the executable runs, +unless that component itself accompanies the executable.

    + +

    If distribution of executable or object code is made by +offering access to copy from a designated place, then +offering equivalent access to copy the source code from the +same place counts as distribution of the source code, even +though third parties are not compelled to copy the source +along with the object code.

    + +

    4. You may not copy, modify, sublicense, +or distribute the Program except as expressly provided under +this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will +automatically terminate your rights under this License. +However, parties who have received copies, or rights, from +you under this License will not have their licenses +terminated so long as such parties remain in full +compliance.

    + +

    5. You are not required to accept this +License, since you have not signed it. However, nothing else +grants you permission to modify or distribute the Program or +its derivative works. These actions are prohibited by law if +you do not accept this License. Therefore, by modifying or +distributing the Program (or any work based on the Program), +you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or +modifying the Program or works based on it.

    + +

    6. Each time you redistribute the Program +(or any work based on the Program), the recipient +automatically receives a license from the original licensor +to copy, distribute or modify the Program subject to these +terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights +granted herein. You are not responsible for enforcing +compliance by third parties to this License.

    + +

    7. If, as a consequence of a court +judgment or allegation of patent infringement or for any +other reason (not limited to patent issues), conditions are +imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, +they do not excuse you from the conditions of this License. +If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the +Program at all. For example, if a patent license would not +permit royalty-free redistribution of the Program by all +those who receive copies directly or indirectly through you, +then the only way you could satisfy both it and this License +would be to refrain entirely from distribution of the +Program.

    + +

    If any portion of this section is held invalid or +unenforceable under any particular circumstance, the balance +of the section is intended to apply and the section as a +whole is intended to apply in other circumstances.

    + +

    It is not the purpose of this section to induce you to +infringe any patents or other property right claims or to +contest validity of any such claims; this section has the +sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license +practices. Many people have made generous contributions to +the wide range of software distributed through that system in +reliance on consistent application of that system; it is up +to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee +cannot impose that choice.

    + +

    This section is intended to make thoroughly clear what is +believed to be a consequence of the rest of this License.

    + +

    8. If the distribution and/or use of the +Program is restricted in certain countries either by patents +or by copyrighted interfaces, the original copyright holder +who places the Program under this License may add an explicit +geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License +incorporates the limitation as if written in the body of this +License.

    + +

    9. The Free Software Foundation may +publish revised and/or new versions of the General Public +License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to +address new problems or concerns.

    + +

    Each version is given a distinguishing version number. If +the Program specifies a version number of this License which +applies to it and "any later version", you have the +option of following the terms and conditions either of that +version or of any later version published by the Free +Software Foundation. If the Program does not specify a +version number of this License, you may choose any version +ever published by the Free Software Foundation.

    + +

    10. If you wish to incorporate parts of +the Program into other free programs whose distribution +conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; +we sometimes make exceptions for this. Our decision will be +guided by the two goals of preserving the free status of all +derivatives of our free software and of promoting the sharing +and reuse of software generally.

    + +

    NO WARRANTY

    + +

    11. BECAUSE THE PROGRAM IS LICENSED FREE +OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE +EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM +PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY +SERVICING, REPAIR OR CORRECTION.

    + +

    12. IN NO EVENT UNLESS REQUIRED BY +APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT +HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL +DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    + +

    END OF TERMS AND CONDITIONS

    + +

    How to Apply These Terms to Your New Programs

    + +

    If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms.

    + +

    To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found.

    + +
    +    <one line to give the program's name and a brief idea of what it does.>
    +    Copyright (C) <year>  <name of author>
    +
    +    This program is free software; you can redistribute it and/or modify
    +    it under the terms of the GNU General Public License as published by
    +    the Free Software Foundation; either version 2 of the License, or
    +    (at your option) any later version.
    +
    +    This program is distributed in the hope that it will be useful,
    +    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +    GNU General Public License for more details.
    +
    +    You should have received a copy of the GNU General Public License
    +    along with this program; if not, write to the Free Software
    +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    +
    + + +

    Also add information on how to contact you by electronic and paper mail.

    + +

    If the program is interactive, make it output a short notice like this +when it starts in an interactive mode:

    +
    +    Gnomovision version 69, Copyright (C) year name of author
    +    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    +    This is free software, and you are welcome to redistribute it
    +    under certain conditions; type `show c' for details.
    +
    + +

    The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program.

    + +

    You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names:

    +
    +  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
    +  `Gnomovision' (which makes passes at compilers) written by James Hacker.
    +
    +  <signature of Ty Coon>, 1 April 1989
    +  Ty Coon, President of Vice
    +
    + +

    This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License.

    + + + \ No newline at end of file diff --git a/readme.html b/readme.html new file mode 100755 index 0000000..6cec7c4 --- /dev/null +++ b/readme.html @@ -0,0 +1,75 @@ + + + + + AutoIndex PHP Script: Readme + + + + + +
    +

    + AutoIndex PHP Script (version 2.x) - Readme File + +
    by Justin Hagstrom
    <JustinHagstrom [at] yahoo [dot] com> + +
    AutoIndex is provided under the terms of + the
    GNU General Public License (GPL). +

    +

    + http://autoindex.sourceforge.net/ + +
    Please post any questions or comments in the + forum. +

    +

    + To install and run the script, simply upload the contents of this + directory to a server with PHP support (PHP 5.0 + or higher is required). + +
    Then, point your browser to the index.php file in that folder. + The first time you do this, it will take you to a configuration page. + +
    To use all the default values, just click the button at the + bottom, or customize it however you want. +

    +
    + + + \ No newline at end of file diff --git a/templates/default/alternate.css b/templates/default/alternate.css new file mode 100755 index 0000000..20c39b3 --- /dev/null +++ b/templates/default/alternate.css @@ -0,0 +1,134 @@ +/** + * An alternate stylesheet. + * + * @package AutoIndex + * @author Justin Hagstrom + * @version 1.0.0 (February 03, 2005) + * + * @copyright Copyright (C) 2002-2005 Justin Hagstrom + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL) + * + * @link http://autoindex.sourceforge.net + */ + +/* Body */ +.autoindex_body, html +{ + font-family: verdana, lucidia, sans-serif; + font-size: 13px; + background-color: #FCFCFC; +} + +/* Images */ +.autoindex_body img +{ + border: none; +} + +/* Tables */ +.autoindex_table +{ + width: 100%; + border: none; + border-spacing: 2px; +} +.light_row +{ + background-color: #FEFEFE; + font-size: 12px; +} +.dark_row +{ + background-color: #EEEEEE; + font-size: 12px; +} +.light_row:hover, .dark_row:hover +{ + background-color: #FFF2BF; +} +.autoindex_td +{ + border: 1px solid #FAFAFA; + font-size: 12px; + padding: 1px; + text-align: left; + white-space: nowrap; +} +.autoindex_td_right +{ + border: 1px solid #FAFAFA; + font-size: 12px; + padding: 1px; + text-align: right; + white-space: nowrap; +} +.autoindex_td:hover, .autoindex_td_right:hover +{ + font-size: 12px; + padding: 1px; + border: 1px solid #FFCC00; +} +.autoindex_th +{ + background-color: #FFCC00; + border: 1px solid #AA9339; + font-size: 12px; + padding: 2px; +} + +/* Links */ +.plain_link +{ + color: #000000; + text-decoration: none; +} +.autoindex_a:visited, .autoindex_a:active +{ + color: #00008F; + text-decoration: none; +} +.autoindex_a:link +{ + color: #0000FF; + text-decoration: none; +} +.autoindex_a:hover +{ + color: #392266; + text-decoration: none; +} + +/* Buttons */ +.button +{ + color: #707070; + background-color: #F2F6FC; + font-family: arial, sans-serif; + font-size: 11px; + text-align: left; + vertical-align: middle; + font-weight: bold; + cursor: pointer; + border: 0px outset #CBCBCB; + padding: 3px 10px 3px 10px; +} + +/* Misc. */ +.paragraph +{ + background: #F2F6FC; + color: #000020; + font-size: 13px; +} +.autoindex_hr +{ + color: #000020; + background-color: #000020; + border: none; + width: 75%; + height: 1px; +} +.autoindex_small +{ + font-size: 10px; +} \ No newline at end of file diff --git a/templates/default/default.css b/templates/default/default.css new file mode 100755 index 0000000..b25aac4 --- /dev/null +++ b/templates/default/default.css @@ -0,0 +1,127 @@ +/** + * The default CSS stylesheet used for all templates. + * + * @package AutoIndex + * @author Justin Hagstrom + * @version 1.0.2 (February 05, 2004) + * + * @copyright Copyright (C) 2002-2004 Justin Hagstrom + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL) + * + * @link http://autoindex.sourceforge.net + */ + +/* Body */ +.autoindex_body, html +{ + font-family: verdana, lucidia, sans-serif; + font-size: 13px; + background-color: #F0F0F0; +} + +/* Images */ +.autoindex_body img +{ + border: none; +} + +/* Tables */ +.autoindex_table +{ + width: 100%; + border: none; + border-spacing: 2px; +} +.light_row +{ + background-color: #F2F6FC; + font-size: 13px; +} +.dark_row +{ + background-color: #DADEEE; + font-size: 13px; +} +.autoindex_td +{ + font-size: 13px; + font-family: verdana, lucidia, sans-serif; + vertical-align: top; + border: 1px solid #7F8FA9; + padding: 0px; + text-align: left; + white-space: nowrap; +} +.autoindex_td_right +{ + font-size: 13px; + font-family: verdana, lucidia, sans-serif; + vertical-align: top; + border: 1px solid #7F8FA9; + padding: 0px; + text-align: right; + white-space: nowrap; +} +.autoindex_th +{ + font-size: 13px; + background-color: #7F8FAD; + border: 1px solid #000010; + padding: 0px; +} + +/* Links */ +.plain_link +{ + color: #000000; + text-decoration: none; +} +.autoindex_a:link +{ + color: #0000FF; + text-decoration: none; +} +.autoindex_a:visited, .autoindex_a:active, .autoindex_a:hover +{ + color: #00008F; + text-decoration: none; +} +.light_row:hover, .dark_row:hover +{ + background-color: #FFFFA8; +} + +/* Buttons */ +.button +{ + color: #707070; + background-color: #F2F6FC; + font-family: sans-serif; + font-size: 11px; + text-align: left; + vertical-align: middle; + font-weight: bold; + cursor: pointer; + border: none; + padding: 3px 10px 3px 10px; +} + +/* Misc. */ +.paragraph +{ + background: #F2F6FC; + font-size: 13px; + color: #000020; +} +.autoindex_hr +{ + color: #000020; + background-color: #000020; + border: none; + width: 75%; + height: 1px; +} +.autoindex_small +{ + font-size: 10px; +} \ No newline at end of file diff --git a/templates/default/each_file (alternative with direct links).tpl b/templates/default/each_file (alternative with direct links).tpl new file mode 100755 index 0000000..92252fb --- /dev/null +++ b/templates/default/each_file (alternative with direct links).tpl @@ -0,0 +1,30 @@ + + + + {file:if:is_file} /* if it is a file, make a direct link */ + + {end if} + {file:if:is_dir} /* otherwise, for directories, display the folder with autoindex */ + + {end if} + {if:icon_path}[{file:file_ext}]{end if:icon_path} + {file:filename} {file:thumbnail} + {file:new_icon}{file:md5_link}{file:delete_link}{file:rename_link}{file:edit_description_link}{file:ftp_upload_link} + + {if:download_count} + + {file:downloads} + + {end if:download_count} + + {file:size} + + + {file:date} + + {if:description_file} + + {file:description} + + {end if:description_file} + \ No newline at end of file diff --git a/templates/default/each_file.tpl b/templates/default/each_file.tpl new file mode 100755 index 0000000..afb4332 --- /dev/null +++ b/templates/default/each_file.tpl @@ -0,0 +1,25 @@ + + + + + {if:icon_path}[{file:file_ext}]{end if:icon_path} + {file:filename} {file:thumbnail} + {file:new_icon}{file:md5_link}{file:delete_link}{file:rename_link}{file:edit_description_link}{file:ftp_upload_link} + + {if:download_count} + + {file:downloads} + + {end if:download_count} + + {file:size} + + + {file:date} + + {if:description_file} + + {file:description} + + {end if:description_file} + \ No newline at end of file diff --git a/templates/default/global_footer.tpl b/templates/default/global_footer.tpl new file mode 100755 index 0000000..8dd2bf0 --- /dev/null +++ b/templates/default/global_footer.tpl @@ -0,0 +1,14 @@ + +/* We request that you do not remove the following copyright notice. */ + + + + \ No newline at end of file diff --git a/templates/default/global_header.tpl b/templates/default/global_header.tpl new file mode 100755 index 0000000..59c17f2 --- /dev/null +++ b/templates/default/global_header.tpl @@ -0,0 +1,10 @@ + + + + + {words:index of} {info:dir} + + + + + diff --git a/templates/default/table_footer.tpl b/templates/default/table_footer.tpl new file mode 100755 index 0000000..be44376 --- /dev/null +++ b/templates/default/table_footer.tpl @@ -0,0 +1,68 @@ + + + + {info:total_files} {words:files} - {info:total_folders} {words:folders} + + {if:download_count} + + {words:total downloads}: {info:total_downloads} + + {end if:download_count} + + {words:total size}: {info:total_size} + + +   + + {if:description_file} + +   + + {end if:description_file} + + + + /* We request that you do not remove the link to the AutoIndex website. + This not only gives respect to the large amount of time given freely by the + developer, but also helps build interest, traffic, and use of AutoIndex. */ + + +{if:entries_per_page} +

    + {words:page} + {info:previous_page_link} + {info:current_page_number} + {info:next_page_link} + {words:of} {info:last_page_number} +

    +{end if:entries_per_page} + + +{if:archive} + +{end if:archive} + + +

    + + + {if:search_enabled} + + {end if:search_enabled} + {if:use_login_system} + + {end if:use_login_system} + +
    +
    + {if:icon_path}{words:search} {end if:icon_path}{words:search}: + {info:search_box} +
    +
    +
    + {if:icon_path}{words:login} {end if:icon_path}{words:account}: + {info:login_box} +
    +
    diff --git a/templates/default/table_header.tpl b/templates/default/table_header.tpl new file mode 100755 index 0000000..9710e9f --- /dev/null +++ b/templates/default/table_header.tpl @@ -0,0 +1,23 @@ +

    {words:index of} {info:path_nav}
    + + + + {if:download_count} + + {end if:download_count} + + + {if:description_file} + + {end if:description_file} + diff --git a/templates/readme.html b/templates/readme.html new file mode 100755 index 0000000..f434fa7 --- /dev/null +++ b/templates/readme.html @@ -0,0 +1,184 @@ + + + + + AutoIndex PHP Script: Template Readme + + + + + +

    + AutoIndex PHP Script +

    +
    + Template Readme +
    +

    +   +

    + +
    +

    + This is a list of all the variables that can be used in the template files. +

    +

    +   +

    +
    + global_header.tpl / global_footer.tpl +
    +

    + Info about the current directory: +

    +
    +	{info:dir}	the path of the current directory, including the base dir
    +	{info:subdir}	the path of the current directory, not including the base dir
    +	{info:version}	the version of AutoIndex
    +	{info:page_time}	the time (in milliseconds) it took to generate the page
    +
    +

    + All words from the language file: +

    +
    +	{words:foo}
    +	... see language file for all options
    +
    +

    + All settings from the config file: +

    +
    +	{config:foo}
    +	... see AutoIndex.conf.php for all options
    +
    +

    + You can include another specific file using the {include} command: +

    +
    +	{include:filename}
    +
    +

    + Anything between /* */ will not be displayed in the HTML output. +

    +

    +   +

    +
    + table_header.tpl / table_footer.tpl +
    +

    + All previously mentioned variables, plus: +

    +

    + Info about current directory: +

    +
    +	{info:path_nav}
    +	{info:total_files}
    +	{info:total_folders}
    +	{info:total_size}
    +	{info:total_downloads}
    +	{info:search_box}
    +	{info:login_box}
    +	{info:archive_link}
    +	{info:previous_page_link}
    +	{info:next_page_link}
    +	{info:current_page_number}
    +	{info:last_page_number}
    +
    +

    + If-statements: +

    +
    +	{if:show_dir_size}
    +	{if:search_enabled}
    +	{if:use_login_system}
    +	{if:must_login_to_download}
    +	{if:days_new}
    +	{if:thumbnail_height}
    +	{if:log_file}
    +	{if:description_file}
    +	{if:download_count}
    +	{if:entries_per_page}
    +
    +

    + To end an if-statement, use {end if:varibale} +
    For example, {if:days_new} ... {end if:days_new} +

    +

    + Sort modes: +

    +
    +	{sort:filename}
    +	{sort:size}
    +	{sort:m_time}
    +	{sort:description}
    +	{sort:downloads}
    +
    +

    +   +

    +
    + each_file.tpl +
    +

    + All previously mentioned variables, plus: +

    +

    + Properties for individual files: +

    +
    +	{file:filename}		the name of the file or folder
    +	{file:link}		the link to the file (using the ?dir and ?file parameters in the URL)
    +	{file:file_ext}		the file extension ("dir" for a directory)
    +	{file:size}		the size (formatted as a string)
    +	{file:bytes}		the size (in bytes)
    +	{file:date}		the date modified (formatted as a string)
    +	{file:a_time}		date and time accessed
    +	{file:m_time}		date and time modified
    +	{file:num_subfiles}	for a directory, the number of files it contains
    +		use {file:if:is_real_dir}{file:num_subfiles}{end if}
    +	{file:thumbnail}	for images, it will display a thumbnail
    +	{file:md5_link}		a link to get the md5sum of the file
    +	{file:downloads}	the number of times this file has been downloaded
    +	{file:description}	the description of the current file
    +	{file:icon}		the icon image for the filetype
    +	{file:parent_dir}	the name of the file's parent directory
    +	{file:tr_class}		this returns "light_row" or "dark_row" for every other file
    +	{file:if:is_file} ... {end if}		true if it is a file
    +	{file:if:is_dir} ... {end if}		true if it is a folder or link to parent directory
    +	{file:if:is_real_dir} ... {end if}	true if it is a folder
    +	{file:if:is_parent_dir} ... {end if}	true if it is a link to parent directory
    +	{do_every:x} ... {end do_every} where x is a number.
    +		The code in between will be displayed every x files.
    +
    +
    + + + \ No newline at end of file diff --git a/templates/simple_image_gallery/default.css b/templates/simple_image_gallery/default.css new file mode 100755 index 0000000..c5d7350 --- /dev/null +++ b/templates/simple_image_gallery/default.css @@ -0,0 +1,128 @@ +/** + * The default CSS stylesheet used for all templates. + * + * @package AutoIndex + * @author Justin Hagstrom + * @version 1.0.2 (February 05, 2004) + * + * @copyright Copyright (C) 2002-2004 Justin Hagstrom + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL) + * + * @link http://autoindex.sourceforge.net + */ + +/* Body */ +.autoindex_body, html +{ + font-family: verdana, lucidia, sans-serif; + font-size: 13px; + background-color: #F0F0F0; +} + +/* Images */ +.autoindex_body img +{ + border: none; +} + +/* Tables */ +.autoindex_table +{ + width: 100%; + border: none; + border-spacing: 2px; +} +.light_row +{ + background-color: #F2F6FC; + font-size: 13px; +} +.dark_row +{ + background-color: #DADEEE; + font-size: 13px; +} +.autoindex_td +{ + font-size: 13px; + font-family: verdana, lucidia, sans-serif; + vertical-align: top; + border: 1px solid #7F8FA9; + padding: 0px; + text-align: left; + white-space: nowrap; +} +.autoindex_td_right +{ + font-size: 13px; + font-family: verdana, lucidia, sans-serif; + vertical-align: top; + border: 1px solid #7F8FA9; + padding: 0px; + text-align: right; + white-space: nowrap; +} +.autoindex_th +{ + font-size: 13px; + background-color: #7F8FAD; + border: 1px solid #000010; + padding: 0px; +} + +/* Links */ +.plain_link +{ + color: #000000; + text-decoration: none; +} +.autoindex_a:visited, .autoindex_a:active +{ + color: #00008F; + text-decoration: none; +} +.autoindex_a:link +{ + color: #0000FF; + text-decoration: none; +} +.autoindex_a:hover +{ + color: #0000FF; + text-decoration: overline underline; +} + +/* Buttons */ +.button +{ + color: #707070; + background-color: #F2F6FC; + font-family: sans-serif; + font-size: 11px; + text-align: left; + vertical-align: middle; + font-weight: bold; + cursor: pointer; + border: none; + padding: 3px 10px 3px 10px; +} + +/* Misc. */ +.paragraph +{ + background: #F2F6FC; + font-size: 13px; + color: #000020; +} +.autoindex_hr +{ + color: #000020; + background-color: #000020; + border: none; + width: 75%; + height: 1px; +} +.autoindex_small +{ + font-size: 10px; +} \ No newline at end of file diff --git a/templates/simple_image_gallery/each_file.tpl b/templates/simple_image_gallery/each_file.tpl new file mode 100755 index 0000000..d8d2bc3 --- /dev/null +++ b/templates/simple_image_gallery/each_file.tpl @@ -0,0 +1,7 @@ + +{do_every:4}{end do_every} \ No newline at end of file diff --git a/templates/simple_image_gallery/global_footer.tpl b/templates/simple_image_gallery/global_footer.tpl new file mode 100755 index 0000000..8dd2bf0 --- /dev/null +++ b/templates/simple_image_gallery/global_footer.tpl @@ -0,0 +1,14 @@ + +/* We request that you do not remove the following copyright notice. */ + + + + \ No newline at end of file diff --git a/templates/simple_image_gallery/global_header.tpl b/templates/simple_image_gallery/global_header.tpl new file mode 100755 index 0000000..55cd592 --- /dev/null +++ b/templates/simple_image_gallery/global_header.tpl @@ -0,0 +1,9 @@ + + + + + {words:index of} {info:dir} + + + + diff --git a/templates/simple_image_gallery/table_footer.tpl b/templates/simple_image_gallery/table_footer.tpl new file mode 100755 index 0000000..807d6fc --- /dev/null +++ b/templates/simple_image_gallery/table_footer.tpl @@ -0,0 +1,44 @@ +
    + {words:file} + + {words:downloads} + + {words:size} + + {words:date} + + {words:description} +
    + + {file:if:is_dir}{if:icon_path}{words:thumbnail of} {file:filename}{end if:icon_path}{end if} {file:thumbnail} +
    {file:filename}
    {file:new_icon}{file:md5_link}{file:delete_link}{file:rename_link}{file:edit_description_link}{file:ftp_upload_link} + {if:description_file}
    {file:description}{end if:description_file} +
    + + /* We request that you do not remove the link to the AutoIndex website. + This not only gives respect to the large amount of time given freely by the + developer, but also helps build interest, traffic, and use of AutoIndex. */ + + +{if:entries_per_page} +

    + {words:page} + {info:previous_page_link} + {info:current_page_number} + {info:next_page_link} + {words:of} {info:last_page_number} +

    +{end if:entries_per_page} + + +{if:archive} + +{end if:archive} + + +

    + + + {if:search_enabled} + + {end if:search_enabled} + {if:use_login_system} + + {end if:use_login_system} + +
    +
    + {if:icon_path}{words:search} {end if:icon_path}{words:search}: + {info:search_box} +
    +
    +
    + {if:icon_path}{words:login} {end if:icon_path}{words:account}: + {info:login_box} +
    +
    \ No newline at end of file diff --git a/templates/simple_image_gallery/table_header.tpl b/templates/simple_image_gallery/table_header.tpl new file mode 100755 index 0000000..02d4b26 --- /dev/null +++ b/templates/simple_image_gallery/table_header.tpl @@ -0,0 +1 @@ + \ No newline at end of file