From e54349c2cebf5bdf4f1e4724ed3af11ca3c63f5a Mon Sep 17 00:00:00 2001 From: glix08 Date: Mon, 27 Jun 2011 21:23:51 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B1=D0=B0=D0=B7?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://torrentpier2.googlecode.com/svn/trunk@22 a8ac35ab-4ca4-ca47-4c2d-a49a94f06293 --- install/sphinx/sphinx.conf | 58 + install/sql/mysql.sql | 1763 +++++++ install/xbt/linux/Tracker/CMakeLists.txt | 31 + install/xbt/linux/Tracker/XBT Tracker.cpp | 135 + install/xbt/linux/Tracker/XBT Tracker.nsi | 46 + install/xbt/linux/Tracker/XBT Tracker.rc | 3 + install/xbt/linux/Tracker/XBT Tracker.sln | 20 + install/xbt/linux/Tracker/XBT Tracker.vcproj | 709 +++ install/xbt/linux/Tracker/XBT Tracker.vcxproj | 265 + install/xbt/linux/Tracker/client.h | 27 + install/xbt/linux/Tracker/config.cpp | 146 + install/xbt/linux/Tracker/config.h | 75 + install/xbt/linux/Tracker/connection.cpp | 339 ++ install/xbt/linux/Tracker/connection.h | 33 + install/xbt/linux/Tracker/epoll.cpp | 45 + install/xbt/linux/Tracker/epoll.h | 39 + .../Tracker/make.bsd.google_perftools.sh | 1 + install/xbt/linux/Tracker/make.bsd.sh | 1 + install/xbt/linux/Tracker/make.sh | 20 + install/xbt/linux/Tracker/md5.cpp | 362 ++ install/xbt/linux/Tracker/md5.h | 93 + install/xbt/linux/Tracker/res/Thumbs.db | Bin 0 -> 5120 bytes install/xbt/linux/Tracker/res/XBT Tracker.ico | Bin 0 -> 7406 bytes install/xbt/linux/Tracker/resource.h | 16 + install/xbt/linux/Tracker/server.cpp | 1539 ++++++ install/xbt/linux/Tracker/server.h | 274 ++ install/xbt/linux/Tracker/stats.h | 50 + install/xbt/linux/Tracker/stdafx.cpp | 1 + install/xbt/linux/Tracker/stdafx.h | 36 + .../xbt/linux/Tracker/tcp_listen_socket.cpp | 20 + install/xbt/linux/Tracker/tcp_listen_socket.h | 14 + install/xbt/linux/Tracker/tracker_input.cpp | 347 ++ install/xbt/linux/Tracker/tracker_input.h | 50 + install/xbt/linux/Tracker/transaction.cpp | 164 + install/xbt/linux/Tracker/transaction.h | 20 + .../xbt/linux/Tracker/udp_listen_socket.cpp | 21 + install/xbt/linux/Tracker/udp_listen_socket.h | 14 + install/xbt/linux/Tracker/xbt_tracker | Bin 0 -> 365032 bytes install/xbt/linux/Tracker/xbt_tracker.pid | 1 + install/xbt/linux/Tracker/xbtt.sh | 30 + install/xbt/linux/misc/alerts.cpp | 17 + install/xbt/linux/misc/alerts.h | 75 + install/xbt/linux/misc/bt_misc.cpp | 354 ++ install/xbt/linux/misc/bt_misc.h | 96 + install/xbt/linux/misc/bt_strings.h | 115 + install/xbt/linux/misc/bt_torrent.cpp | 77 + install/xbt/linux/misc/bt_torrent.h | 75 + install/xbt/linux/misc/bt_tracker_account.cpp | 68 + install/xbt/linux/misc/bt_tracker_account.h | 39 + install/xbt/linux/misc/bt_tracker_url.cpp | 82 + install/xbt/linux/misc/bt_tracker_url.h | 25 + install/xbt/linux/misc/bvalue.cpp | 370 ++ install/xbt/linux/misc/bvalue.h | 58 + install/xbt/linux/misc/config_base.h | 108 + install/xbt/linux/misc/const_memory_range.h | 252 + install/xbt/linux/misc/find_ptr.h | 15 + install/xbt/linux/misc/sha1.cpp | 419 ++ install/xbt/linux/misc/sha1.h | 94 + install/xbt/linux/misc/socket.cpp | 223 + install/xbt/linux/misc/socket.h | 135 + install/xbt/linux/misc/sql/database.cpp | 71 + install/xbt/linux/misc/sql/database.h | 33 + install/xbt/linux/misc/sql/sql_query.cpp | 77 + install/xbt/linux/misc/sql/sql_query.h | 24 + install/xbt/linux/misc/sql/sql_result.cpp | 15 + install/xbt/linux/misc/sql/sql_result.h | 142 + install/xbt/linux/misc/stream_int.h | 83 + install/xbt/linux/misc/stream_reader.cpp | 3 + install/xbt/linux/misc/stream_reader.h | 59 + install/xbt/linux/misc/stream_writer.cpp | 2 + install/xbt/linux/misc/stream_writer.h | 41 + install/xbt/linux/misc/tf_misc.cpp | 170 + install/xbt/linux/misc/tf_misc.h | 8 + install/xbt/linux/misc/virtual_binary.cpp | 75 + install/xbt/linux/misc/windows/ETSLayout.cpp | 3058 ++++++++++++ install/xbt/linux/misc/windows/ETSLayout.h | 964 ++++ .../misc/windows/browse_for_directory.cpp | 33 + .../linux/misc/windows/browse_for_directory.h | 3 + install/xbt/linux/misc/windows/nt_service.cpp | 67 + install/xbt/linux/misc/windows/nt_service.h | 4 + install/xbt/linux/misc/xbt/virtual_binary.h | 129 + install/xbt/linux/misc/xcc_z.cpp | 70 + install/xbt/linux/misc/xcc_z.h | 10 + install/xbt/linux/misc/xif_key.cpp | 196 + install/xbt/linux/misc/xif_key.h | 252 + install/xbt/linux/misc/xif_key_r.cpp | 86 + install/xbt/linux/misc/xif_key_r.h | 97 + install/xbt/linux/misc/xif_value.cpp | 151 + install/xbt/linux/misc/xif_value.h | 113 + install/xbt/sql/update_mysql.sql | 81 + install/xbt/windows/XBT Tracker.exe | Bin 0 -> 379904 bytes install/xbt/windows/htdocs/xbt.css | 5 + install/xbt/windows/htdocs/xbt_config.php | 6 + install/xbt/windows/htdocs/xbt_files.php | 59 + install/xbt/windows/libmysql.dll | Bin 0 -> 2510848 bytes install/xbt/windows/xbt_tracker.conf | 47 + install/xbt/windows/zlibwapi.dll | Bin 0 -> 139264 bytes install/xbt/windows/Установка.txt | 2 + install/xbt/xbt_tracker.conf | 47 + upload/.htaccess | 15 + upload/admin/.htaccess | 8 + upload/admin/admin_attach_cp.php | 592 +++ upload/admin/admin_attachments.php | 997 ++++ upload/admin/admin_board.php | 178 + upload/admin/admin_bt_forum_cfg.php | 157 + upload/admin/admin_bt_tracker_cfg.php | 65 + upload/admin/admin_cron.php | 361 ++ upload/admin/admin_disallow.php | 107 + upload/admin/admin_extensions.php | 819 +++ upload/admin/admin_forum_prune.php | 72 + upload/admin/admin_forumauth.php | 266 + upload/admin/admin_forumauth_list.php | 396 ++ upload/admin/admin_forums.php | 1259 +++++ upload/admin/admin_groups.php | 184 + upload/admin/admin_log.php | 435 ++ upload/admin/admin_mass_email.php | 162 + upload/admin/admin_phpinfo.php | 12 + upload/admin/admin_ranks.php | 273 + upload/admin/admin_rebuild_search.php | 635 +++ upload/admin/admin_reports.php | 612 +++ upload/admin/admin_smilies.php | 474 ++ upload/admin/admin_topic_templates.php | 89 + upload/admin/admin_ug_auth.php | 476 ++ upload/admin/admin_user_ban.php | 403 ++ upload/admin/admin_user_search.php | 1344 +++++ upload/admin/admin_users.php | 970 ++++ upload/admin/admin_words.php | 175 + upload/admin/admin_xs.php | 15 + upload/admin/index.php | 431 ++ upload/admin/pagestart.php | 26 + upload/admin/xs_cache.php | 263 + upload/admin/xs_config.php | 138 + upload/admin/xs_frameset.php | 95 + upload/admin/xs_include.php | 331 ++ upload/admin/xs_index.php | 61 + upload/ajax.php | 310 ++ upload/ajax/change_tor_status.php | 77 + upload/ajax/change_torrent.php | 87 + upload/ajax/edit_user_profile.php | 76 + upload/ajax/html/jumpbox_guest.html | 9 + upload/ajax/html/jumpbox_user.html | 9 + upload/ajax/mod_action.php | 54 + upload/ajax/user_register.php | 58 + upload/ajax/view_post.php | 54 + upload/ajax/view_torrent.php | 170 + upload/attach_mod/.htaccess | 2 + upload/attach_mod/attachment_mod.php | 115 + upload/attach_mod/displaying.php | 490 ++ upload/attach_mod/displaying_torrent.php | 640 +++ upload/attach_mod/includes/.htaccess | 2 + .../attach_mod/includes/functions_admin.php | 415 ++ .../attach_mod/includes/functions_attach.php | 892 ++++ .../attach_mod/includes/functions_delete.php | 309 ++ .../includes/functions_filetypes.php | 410 ++ .../includes/functions_includes.php | 472 ++ .../attach_mod/includes/functions_selects.php | 266 + .../attach_mod/includes/functions_thumbs.php | 247 + upload/attach_mod/posting_attachments.php | 1460 ++++++ upload/bt/announce.php | 194 + upload/bt/includes/.htaccess | 3 + upload/bt/includes/init_tr.php | 559 +++ upload/bt/includes/tr_announcer.php | 248 + upload/bt/includes/tr_ratio.php | 76 + upload/bt/includes/tr_scraper.php | 25 + upload/bt/index.php | 3 + upload/bt/robots.txt | 5 + upload/bt/scrape.php | 41 + upload/callseed.php | 182 + upload/common.php | 1277 +++++ upload/config.php | 547 +++ upload/config/.htaccess | 2 + upload/config/cron_cfg.php | 12 + upload/config_mods.php | 32 + upload/cron.php | 5 + upload/develop/benchmark/timer.php | 357 ++ upload/develop/dbg_config.php | 7 + upload/develop/dbg_header.php | 81 + upload/develop/error_handler.php | 107 + upload/develop/error_report.php | 234 + upload/develop/functions_debug.php | 102 + upload/develop/init_debug.php | 41 + upload/develop/memcached_stub.php | 154 + upload/develop/open_editor.php | 16 + upload/develop/profiler/example.txt | 9 + upload/develop/profiler/profiler.css | 119 + upload/develop/profiler/profiler.php | 35 + upload/develop/profiler/profiler_dbg.php | 377 ++ upload/develop/show_source.php | 19 + upload/develop/source/Date_DeltaRussian.rar | Bin 0 -> 1250 bytes upload/develop/source/Globals.zip | Bin 0 -> 3175 bytes upload/develop/source/benchmark.rar | Bin 0 -> 4841 bytes .../javascript_browser_detection_basic.rar | Bin 0 -> 1882 bytes upload/develop/source/js-sprintf.rar | Bin 0 -> 4248 bytes upload/develop/source/profiler.zip | Bin 0 -> 3658 bytes upload/dl_list.php | 210 + upload/download.php | 377 ++ upload/faq.php | 110 + upload/favicon.ico | Bin 0 -> 7718 bytes upload/files/.htaccess | 3 + upload/files/thumbs/.htaccess | 3 + upload/gallery.php | 216 + upload/groupcp.php | 719 +++ upload/images/Thumbs.db | Bin 0 -> 22528 bytes upload/images/avatars/bot.gif | Bin 0 -> 3108 bytes upload/images/avatars/gallery/noavatar.png | Bin 0 -> 14362 bytes upload/images/icon_clip.gif | Bin 0 -> 71 bytes upload/images/icon_disk.gif | Bin 0 -> 906 bytes upload/images/icon_disk_gray.gif | Bin 0 -> 313 bytes upload/images/icon_dn.gif | Bin 0 -> 811 bytes upload/images/logo/Thumbs.db | Bin 0 -> 5632 bytes upload/images/logo/logo.gif | Bin 0 -> 8259 bytes upload/images/logo/logo.png | Bin 0 -> 43705 bytes upload/images/magnet.png | Bin 0 -> 2210 bytes upload/images/menu_open_1.gif | Bin 0 -> 99 bytes upload/images/pic_loading.gif | Bin 0 -> 847 bytes upload/images/smiles/aa.gif | Bin 0 -> 7746 bytes upload/images/smiles/ab.gif | Bin 0 -> 2180 bytes upload/images/smiles/ac.gif | Bin 0 -> 2152 bytes upload/images/smiles/ad.gif | Bin 0 -> 2113 bytes upload/images/smiles/ae.gif | Bin 0 -> 495 bytes upload/images/smiles/af.gif | Bin 0 -> 7094 bytes upload/images/smiles/ag.gif | Bin 0 -> 1339 bytes upload/images/smiles/ah.gif | Bin 0 -> 6786 bytes upload/images/smiles/ai.gif | Bin 0 -> 3478 bytes upload/images/smiles/aj.gif | Bin 0 -> 7829 bytes upload/images/smiles/ak.gif | Bin 0 -> 7358 bytes upload/images/smiles/al.gif | Bin 0 -> 3730 bytes upload/images/smiles/am.gif | Bin 0 -> 16001 bytes upload/images/smiles/an.gif | Bin 0 -> 10038 bytes upload/images/smiles/ao.gif | Bin 0 -> 2571 bytes upload/images/smiles/ap.gif | Bin 0 -> 6135 bytes upload/images/smiles/aq.gif | Bin 0 -> 24889 bytes upload/images/smiles/ar.gif | Bin 0 -> 7840 bytes upload/images/smiles/as.gif | Bin 0 -> 3519 bytes upload/images/smiles/at.gif | Bin 0 -> 10653 bytes upload/images/smiles/au.gif | Bin 0 -> 13693 bytes upload/images/smiles/av.gif | Bin 0 -> 7883 bytes upload/images/smiles/aw.gif | Bin 0 -> 9079 bytes upload/images/smiles/ax.gif | Bin 0 -> 6835 bytes upload/images/smiles/ay.gif | Bin 0 -> 4164 bytes upload/images/smiles/az.gif | Bin 0 -> 24043 bytes upload/images/smiles/ba.gif | Bin 0 -> 1408 bytes upload/images/smiles/bb.gif | Bin 0 -> 868 bytes upload/images/smiles/bc.gif | Bin 0 -> 12550 bytes upload/images/smiles/bd.gif | Bin 0 -> 7949 bytes upload/images/smiles/be.gif | Bin 0 -> 981 bytes upload/images/smiles/bf.gif | Bin 0 -> 4976 bytes upload/images/smiles/bg.gif | Bin 0 -> 6510 bytes upload/images/smiles/bh.gif | Bin 0 -> 16159 bytes upload/images/smiles/bi.gif | Bin 0 -> 5460 bytes upload/images/smiles/bj.gif | Bin 0 -> 28109 bytes upload/images/smiles/bk.gif | Bin 0 -> 2824 bytes upload/images/smiles/bl.gif | Bin 0 -> 3591 bytes upload/images/smiles/bm.gif | Bin 0 -> 6513 bytes upload/images/smiles/bn.gif | Bin 0 -> 3628 bytes upload/images/smiles/bo.gif | Bin 0 -> 6267 bytes upload/images/smiles/bp.gif | Bin 0 -> 7576 bytes upload/images/smiles/bq.gif | Bin 0 -> 3939 bytes upload/images/smiles/br.gif | Bin 0 -> 4644 bytes upload/images/smiles/bs.gif | Bin 0 -> 2993 bytes upload/images/smiles/bt.gif | Bin 0 -> 7287 bytes upload/images/smiles/bu.gif | Bin 0 -> 17671 bytes upload/images/smiles/bv.gif | Bin 0 -> 18507 bytes upload/images/smiles/bw.gif | Bin 0 -> 4198 bytes upload/images/smiles/smileys.pak | 49 + upload/images/spacer.gif | Bin 0 -> 43 bytes upload/images/tor_gold.gif | Bin 0 -> 1053 bytes upload/images/tor_silver.gif | Bin 0 -> 721 bytes upload/images/user_offline.gif | Bin 0 -> 347 bytes upload/images/user_online.gif | Bin 0 -> 711 bytes upload/includes/.htaccess | 2 + upload/includes/FastJSON.class.php | 372 ++ upload/includes/bbcode.php | 1014 ++++ upload/includes/captcha/captcha.php | 394 ++ .../includes/captcha/kcaptcha/fonts/Thumbs.db | Bin 0 -> 31744 bytes .../captcha/kcaptcha/fonts/antiqua.png | Bin 0 -> 6469 bytes .../captcha/kcaptcha/fonts/baskerville.png | Bin 0 -> 6439 bytes .../captcha/kcaptcha/fonts/batang.png | Bin 0 -> 7235 bytes .../captcha/kcaptcha/fonts/bookman.png | Bin 0 -> 6815 bytes .../captcha/kcaptcha/fonts/calisto.png | Bin 0 -> 8140 bytes .../captcha/kcaptcha/fonts/cambria.png | Bin 0 -> 6492 bytes .../captcha/kcaptcha/fonts/centaur.png | Bin 0 -> 7441 bytes .../captcha/kcaptcha/fonts/century.png | Bin 0 -> 6964 bytes .../captcha/kcaptcha/fonts/chaparral.png | Bin 0 -> 7598 bytes .../captcha/kcaptcha/fonts/constantia.png | Bin 0 -> 6265 bytes .../captcha/kcaptcha/fonts/footlight.png | Bin 0 -> 6862 bytes .../captcha/kcaptcha/fonts/garamond.png | Bin 0 -> 7085 bytes .../captcha/kcaptcha/fonts/georgia.png | Bin 0 -> 7187 bytes .../captcha/kcaptcha/fonts/goudy_old.png | Bin 0 -> 7077 bytes .../captcha/kcaptcha/fonts/kozuka.png | Bin 0 -> 7253 bytes .../captcha/kcaptcha/fonts/lucida.png | Bin 0 -> 6406 bytes .../captcha/kcaptcha/fonts/minion.png | Bin 0 -> 6996 bytes .../captcha/kcaptcha/fonts/palatino.png | Bin 0 -> 7136 bytes .../captcha/kcaptcha/fonts/perpetua.png | Bin 0 -> 6836 bytes .../captcha/kcaptcha/fonts/rockwell.png | Bin 0 -> 5822 bytes .../includes/captcha/kcaptcha/fonts/times.png | Bin 0 -> 6848 bytes .../captcha/kcaptcha/fonts/warnock.png | Bin 0 -> 7655 bytes upload/includes/cron/.htaccess | 2 + upload/includes/cron/cron_check.php | 38 + upload/includes/cron/cron_init.php | 62 + upload/includes/cron/cron_run.php | 124 + upload/includes/cron/jobs/.htaccess | 2 + upload/includes/cron/jobs/avatars_cleanup.php | 117 + upload/includes/cron/jobs/bb_maintenance.php | 261 + .../cron/jobs/bb_manage_untrusted.php | 3 + upload/includes/cron/jobs/cache_gc.php | 24 + upload/includes/cron/jobs/captcha_gen_gc.php | 60 + upload/includes/cron/jobs/clean_dlstat.php | 100 + upload/includes/cron/jobs/clean_log.php | 10 + .../cron/jobs/clean_search_results.php | 10 + upload/includes/cron/jobs/db_backup.php | 37 + .../cron/jobs/ds_update_cat_forums.php | 5 + upload/includes/cron/jobs/ds_update_stats.php | 5 + .../includes/cron/jobs/flash_topic_view.php | 26 + upload/includes/cron/jobs/prune_forums.php | 15 + .../cron/jobs/prune_inactive_users.php | 66 + .../includes/cron/jobs/prune_topic_moved.php | 14 + .../includes/cron/jobs/sessions_cleanup.php | 47 + upload/includes/cron/jobs/site_backup.php | 33 + .../cron/jobs/tr_cleanup_and_dlstat.php | 183 + .../includes/cron/jobs/tr_complete_count.php | 30 + upload/includes/cron/jobs/tr_maintenance.php | 64 + .../includes/cron/jobs/tr_make_snapshot.php | 169 + .../cron/jobs/tr_update_seeder_last_seen.php | 15 + upload/includes/datastore/.htaccess | 2 + .../datastore/build_attach_extensions.php | 17 + .../includes/datastore/build_cat_forums.php | 174 + .../includes/datastore/build_moderators.php | 107 + upload/includes/datastore/build_ranks.php | 14 + upload/includes/datastore/build_smilies.php | 18 + upload/includes/datastore/build_stats.php | 32 + upload/includes/db/.htaccess | 2 + upload/includes/db/mysql.php | 987 ++++ upload/includes/emailer.class.php | 345 ++ upload/includes/functions.php | 2978 +++++++++++ upload/includes/functions_admin.php | 938 ++++ upload/includes/functions_admin_cron.php | 160 + upload/includes/functions_admin_torrent.php | 117 + upload/includes/functions_dev.php | 55 + upload/includes/functions_group.php | 229 + upload/includes/functions_post.php | 786 +++ upload/includes/functions_report.php | 1404 ++++++ upload/includes/functions_report_admin.php | 571 +++ upload/includes/functions_selects.php | 82 + upload/includes/functions_torrent.php | 907 ++++ upload/includes/functions_validate.php | 145 + upload/includes/init_bb.php | 663 +++ upload/includes/online_userlist.php | 167 + upload/includes/page_footer.php | 108 + upload/includes/page_footer_dev.php | 176 + upload/includes/page_header.php | 360 ++ upload/includes/report_hack/.htaccess | 2 + .../includes/report_hack/report_general.php | 17 + upload/includes/report_hack/report_post.php | 276 ++ .../includes/report_hack/report_privmsg.php | 257 + upload/includes/report_hack/report_topic.php | 256 + upload/includes/report_hack/report_user.php | 47 + upload/includes/report_module.php | 191 + upload/includes/sessions.php | 966 ++++ upload/includes/smtp.php | 186 + upload/includes/sphinxapi.php | 1691 +++++++ upload/includes/sql_parse.php | 192 + upload/includes/template.php | 1344 +++++ upload/includes/topic_templates.php | 129 + upload/includes/topic_templates/.htaccess | 2 + .../includes/topic_templates/audiobooks.php | 66 + upload/includes/topic_templates/books.php | 67 + upload/includes/topic_templates/games.php | 64 + upload/includes/topic_templates/music.php | 51 + upload/includes/topic_templates/progs.php | 52 + upload/includes/topic_templates/sport.php | 74 + .../includes/topic_templates/tpl_selects.php | 137 + upload/includes/topic_templates/video.php | 98 + .../includes/topic_templates/video_guide.php | 21 + upload/includes/torrent_announce_urls.php | 15 + upload/includes/torrent_show_dl_list.php | 141 + upload/includes/ucp/.htaccess | 2 + upload/includes/ucp/fonts/.htaccess | 2 + upload/includes/ucp/fonts/antiqua.png | Bin 0 -> 6469 bytes upload/includes/ucp/fonts/baskerville.png | Bin 0 -> 6439 bytes upload/includes/ucp/fonts/batang.png | Bin 0 -> 7235 bytes upload/includes/ucp/fonts/bookman.png | Bin 0 -> 6815 bytes upload/includes/ucp/fonts/calisto.png | Bin 0 -> 8140 bytes upload/includes/ucp/fonts/cambria.png | Bin 0 -> 6492 bytes upload/includes/ucp/fonts/centaur.png | Bin 0 -> 7441 bytes upload/includes/ucp/fonts/century.png | Bin 0 -> 6964 bytes upload/includes/ucp/fonts/chaparral.png | Bin 0 -> 7598 bytes upload/includes/ucp/fonts/constantia.png | Bin 0 -> 6265 bytes upload/includes/ucp/fonts/footlight.png | Bin 0 -> 6862 bytes upload/includes/ucp/fonts/garamond.png | Bin 0 -> 7085 bytes upload/includes/ucp/fonts/georgia.png | Bin 0 -> 7187 bytes upload/includes/ucp/fonts/goudy_old.png | Bin 0 -> 7077 bytes upload/includes/ucp/fonts/kozuka.png | Bin 0 -> 7253 bytes upload/includes/ucp/fonts/lucida.png | Bin 0 -> 6406 bytes upload/includes/ucp/fonts/minion.png | Bin 0 -> 6996 bytes upload/includes/ucp/fonts/palatino.png | Bin 0 -> 7136 bytes upload/includes/ucp/fonts/perpetua.png | Bin 0 -> 6836 bytes upload/includes/ucp/fonts/rockwell.png | Bin 0 -> 5822 bytes upload/includes/ucp/fonts/times.png | Bin 0 -> 6848 bytes upload/includes/ucp/fonts/warnock.png | Bin 0 -> 7655 bytes upload/includes/ucp/torrent_userprofile.php | 200 + upload/includes/ucp/usercp_activate.php | 89 + upload/includes/ucp/usercp_attachcp.php | 332 ++ upload/includes/ucp/usercp_avatar.php | 411 ++ upload/includes/ucp/usercp_email.php | 141 + upload/includes/ucp/usercp_register.php | 598 +++ upload/includes/ucp/usercp_sendpasswd.php | 99 + upload/includes/ucp/usercp_viewprofile.php | 213 + upload/index.php | 354 ++ upload/language/.htaccess | 2 + upload/language/lang_english/.htaccess | 2 + upload/language/lang_english/email/.htaccess | 2 + .../lang_english/email/admin_activate.tpl | 10 + .../lang_english/email/admin_send_email.tpl | 12 + .../email/admin_welcome_activated.tpl | 8 + .../email/admin_welcome_inactive.tpl | 19 + upload/language/lang_english/email/blank.tpl | 1 + .../lang_english/email/group_added.tpl | 12 + .../lang_english/email/group_approved.tpl | 11 + .../lang_english/email/group_request.tpl | 11 + .../lang_english/email/privmsg_notify.tpl | 12 + .../lang_english/email/profile_send_email.tpl | 14 + .../lang_english/email/topic_notify.tpl | 14 + .../lang_english/email/user_activate.tpl | 10 + .../email/user_activate_passwd.tpl | 18 + .../lang_english/email/user_welcome.tpl | 17 + .../email/user_welcome_inactive.tpl | 21 + upload/language/lang_english/lang_admin.php | 677 +++ .../lang_english/lang_admin_attach.php | 226 + .../language/lang_english/lang_admin_bt.php | 141 + .../language/lang_english/lang_admin_cron.php | 61 + .../lang_admin_rebuild_search.php | 132 + upload/language/lang_english/lang_bbcode.php | 73 + upload/language/lang_english/lang_bot.php | 5 + .../language/lang_english/lang_callseed.php | 16 + .../language/lang_english/lang_countries.php | 250 + upload/language/lang_english/lang_faq.php | 104 + .../language/lang_english/lang_faq_attach.php | 31 + upload/language/lang_english/lang_gallery.php | 29 + .../language/lang_english/lang_log_action.php | 28 + upload/language/lang_english/lang_main.php | 1530 ++++++ .../lang_english/lang_topic_templates.php | 153 + .../lang_english/lang_user_search.php | 109 + upload/language/lang_english/lang_xs.php | 140 + .../lang_english/report_hack/.htaccess | 2 + .../report_hack/lang_report_general.php | 19 + .../report_hack/lang_report_post.php | 25 + .../report_hack/lang_report_privmsg.php | 29 + .../report_hack/lang_report_topic.php | 25 + .../report_hack/lang_report_user.php | 23 + .../lang_english/search_stopwords.txt | 617 +++ .../language/lang_english/search_synonyms.txt | 149 + .../language/lang_english/translit_table.php | 5 + upload/language/lang_russian/.htaccess | 2 + upload/language/lang_russian/email/.htaccess | 2 + .../lang_russian/email/admin_activate.tpl | 10 + .../lang_russian/email/admin_send_email.tpl | 12 + .../email/admin_welcome_activated.tpl | 8 + .../email/admin_welcome_inactive.tpl | 19 + upload/language/lang_russian/email/blank.tpl | 1 + .../lang_russian/email/group_added.tpl | 12 + .../lang_russian/email/group_approved.tpl | 11 + .../lang_russian/email/group_request.tpl | 11 + .../lang_russian/email/privmsg_notify.tpl | 14 + .../lang_russian/email/profile_send_email.tpl | 14 + .../lang_russian/email/topic_notify.tpl | 14 + .../lang_russian/email/user_activate.tpl | 10 + .../email/user_activate_passwd.tpl | 18 + .../lang_russian/email/user_welcome.tpl | 17 + .../email/user_welcome_inactive.tpl | 21 + upload/language/lang_russian/lang_admin.php | 676 +++ .../lang_russian/lang_admin_attach.php | 234 + .../language/lang_russian/lang_admin_bt.php | 142 + .../language/lang_russian/lang_admin_cron.php | 61 + .../lang_admin_rebuild_search.php | 130 + upload/language/lang_russian/lang_bbcode.php | 56 + upload/language/lang_russian/lang_bot.php | 5 + .../language/lang_russian/lang_callseed.php | 16 + .../language/lang_russian/lang_countries.php | 249 + upload/language/lang_russian/lang_faq.php | 94 + .../language/lang_russian/lang_faq_attach.php | 33 + upload/language/lang_russian/lang_gallery.php | 29 + .../language/lang_russian/lang_log_action.php | 28 + upload/language/lang_russian/lang_main.php | 1537 ++++++ .../lang_russian/lang_topic_templates.php | 167 + .../lang_russian/lang_user_search.php | 109 + upload/language/lang_russian/lang_xs.php | 140 + .../lang_russian/report_hack/.htaccess | 2 + .../report_hack/lang_report_general.php | 19 + .../report_hack/lang_report_post.php | 25 + .../report_hack/lang_report_privmsg.php | 29 + .../report_hack/lang_report_topic.php | 25 + .../report_hack/lang_report_user.php | 23 + .../lang_russian/search_stopwords.txt | 469 ++ .../language/lang_russian/search_synonyms.txt | 75 + .../language/lang_russian/translit_table.php | 37 + upload/log/.htaccess | 2 + upload/login.php | 126 + upload/memberlist.php | 286 ++ upload/misc.php | 176 + upload/misc/.htaccess | 3 + upload/misc/html/advert.html | 31 + upload/misc/html/agreement.html | 3 + upload/misc/html/copyright_holders.html | 53 + upload/misc/html/move_topic_bookmarks.html | 19 + upload/misc/html/not_found.html | 24 + upload/misc/html/sidebar1.html | 26 + upload/misc/html/sidebar2.html | 2 + upload/misc/html/user_agreement.html | 105 + upload/misc/js/bbcode.js | 452 ++ upload/misc/js/develop.js | 2 + upload/misc/js/firebug/errorIcon.png | Bin 0 -> 457 bytes upload/misc/js/firebug/firebug.css | 209 + upload/misc/js/firebug/firebug.html | 23 + upload/misc/js/firebug/firebug.js | 672 +++ upload/misc/js/firebug/firebugx.js | 10 + upload/misc/js/firebug/infoIcon.png | Bin 0 -> 524 bytes upload/misc/js/firebug/warningIcon.png | Bin 0 -> 516 bytes upload/misc/js/jquery.pack.js | 183 + upload/misc/js/main.js | 515 ++ upload/misc/js/source/jquery.js | 4376 +++++++++++++++++ .../js/source/jquery_plugins/dimensions.js | 119 + .../js/source/jquery_plugins/jquery.media.js | 424 ++ upload/misc/js/source/jquery_plugins/json.js | 156 + .../misc/js/source/jquery_plugins/metadata.js | 121 + upload/misc/js/source/sprintf.js | 182 + upload/modcp.php | 777 +++ upload/opensearch_desc.xml | 8 + upload/opensearch_desc_bt.xml | 8 + upload/pictures/.htaccess | 3 + upload/posting.php | 1019 ++++ upload/privmsg.php | 1901 +++++++ upload/profile.php | 51 + upload/report.php | 819 +++ upload/search.php | 919 ++++ upload/stats/tr_stats.php | 35 + upload/stats/tracker.php | 141 + upload/templates/admin/admin_attach_cp.tpl | 254 + upload/templates/admin/admin_attachments.tpl | 345 ++ upload/templates/admin/admin_board.tpl | 211 + upload/templates/admin/admin_bt_forum_cfg.tpl | 190 + .../templates/admin/admin_bt_tracker_cfg.tpl | 125 + upload/templates/admin/admin_cron.tpl | 241 + upload/templates/admin/admin_disallow.tpl | 31 + upload/templates/admin/admin_extensions.tpl | 220 + upload/templates/admin/admin_forum_prune.tpl | 51 + upload/templates/admin/admin_forumauth.tpl | 68 + .../templates/admin/admin_forumauth_list.tpl | 94 + upload/templates/admin/admin_forums.tpl | 234 + upload/templates/admin/admin_groups.tpl | 103 + upload/templates/admin/admin_log.tpl | 216 + upload/templates/admin/admin_mass_email.tpl | 30 + upload/templates/admin/admin_ranks.tpl | 83 + .../templates/admin/admin_rebuild_search.tpl | 259 + upload/templates/admin/admin_smilies.tpl | 118 + .../templates/admin/admin_topic_templates.tpl | 28 + upload/templates/admin/admin_ug_auth.tpl | 332 ++ upload/templates/admin/admin_user_ban.tpl | 59 + upload/templates/admin/admin_user_search.tpl | 204 + upload/templates/admin/admin_users.tpl | 369 ++ upload/templates/admin/admin_words.tpl | 63 + upload/templates/admin/index.tpl | 178 + upload/templates/board_disabled_exit.php | 49 + upload/templates/default/agreement.tpl | 27 + upload/templates/default/attach_rules.tpl | 24 + upload/templates/default/bbcode.tpl | 87 + upload/templates/default/common.tpl | 50 + upload/templates/default/confirm_body.tpl | 10 + upload/templates/default/css/admin.css | 8 + upload/templates/default/css/backup/admin.css | 8 + upload/templates/default/css/backup/dbg.css | 31 + .../templates/default/css/backup/index.html | 0 upload/templates/default/css/backup/main.css | 875 ++++ .../default/css/backup/theme_default.css | 130 + upload/templates/default/css/dbg.css | 31 + upload/templates/default/css/main.css | 1159 +++++ upload/templates/default/donate.tpl | 54 + upload/templates/default/faq.tpl | 43 + upload/templates/default/gallery.tpl | 112 + upload/templates/default/groupcp.tpl | 229 + upload/templates/default/images/arrow1.gif | Bin 0 -> 59 bytes upload/templates/default/images/button.gif | Bin 0 -> 264 bytes upload/templates/default/images/cellpic.gif | Bin 0 -> 722 bytes upload/templates/default/images/cellpic1.gif | Bin 0 -> 246 bytes upload/templates/default/images/cellpic2.jpg | Bin 0 -> 480 bytes upload/templates/default/images/cellpic3.gif | Bin 0 -> 268 bytes upload/templates/default/images/folder.gif | Bin 0 -> 344 bytes .../default/images/folder_announce.gif | Bin 0 -> 307 bytes .../default/images/folder_announce_new.gif | Bin 0 -> 289 bytes .../templates/default/images/folder_big.gif | Bin 0 -> 677 bytes upload/templates/default/images/folder_dl.gif | Bin 0 -> 344 bytes .../default/images/folder_dl_hot.gif | Bin 0 -> 1958 bytes .../default/images/folder_dl_hot_new.gif | Bin 0 -> 1760 bytes .../default/images/folder_dl_new.gif | Bin 0 -> 341 bytes .../templates/default/images/folder_hot.gif | Bin 0 -> 1178 bytes .../templates/default/images/folder_lock.gif | Bin 0 -> 333 bytes .../default/images/folder_lock_new.gif | Bin 0 -> 459 bytes .../default/images/folder_locked_big.gif | Bin 0 -> 673 bytes .../templates/default/images/folder_new.gif | Bin 0 -> 336 bytes .../default/images/folder_new_big.gif | Bin 0 -> 663 bytes .../default/images/folder_new_hot.gif | Bin 0 -> 1159 bytes .../default/images/folder_sticky.gif | Bin 0 -> 344 bytes .../default/images/folder_sticky_new.gif | Bin 0 -> 325 bytes .../default/images/hr200_ltr_gradient.jpg | Bin 0 -> 761 bytes .../default/images/hr400_ltr_gradient.jpg | Bin 0 -> 815 bytes .../templates/default/images/icon_delete.gif | Bin 0 -> 279 bytes .../default/images/icon_latest_reply.gif | Bin 0 -> 135 bytes .../default/images/icon_mini_faq.gif | Bin 0 -> 219 bytes .../default/images/icon_mini_groups.gif | Bin 0 -> 222 bytes .../default/images/icon_mini_login.gif | Bin 0 -> 233 bytes .../default/images/icon_mini_members.gif | Bin 0 -> 223 bytes .../default/images/icon_mini_message.gif | Bin 0 -> 232 bytes .../default/images/icon_mini_profile.gif | Bin 0 -> 236 bytes .../default/images/icon_mini_register.gif | Bin 0 -> 224 bytes .../default/images/icon_mini_search.gif | Bin 0 -> 237 bytes .../default/images/icon_mini_tracker.gif | Bin 0 -> 166 bytes .../default/images/icon_minipost.gif | Bin 0 -> 122 bytes .../default/images/icon_minipost_new.gif | Bin 0 -> 122 bytes .../templates/default/images/icon_minus_1.gif | Bin 0 -> 187 bytes .../templates/default/images/icon_minus_2.gif | Bin 0 -> 86 bytes upload/templates/default/images/icon_mod.gif | Bin 0 -> 429 bytes .../default/images/icon_newest_reply.gif | Bin 0 -> 133 bytes .../templates/default/images/icon_plus_1.gif | Bin 0 -> 191 bytes .../templates/default/images/icon_plus_2.gif | Bin 0 -> 89 bytes .../templates/default/images/icon_report.gif | Bin 0 -> 595 bytes .../default/images/icon_reported.gif | Bin 0 -> 595 bytes upload/templates/default/images/index.html | 0 .../default/images/lang_english/icon_edit.gif | Bin 0 -> 798 bytes .../images/lang_english/icon_email.gif | Bin 0 -> 820 bytes .../images/lang_english/icon_icq_add.gif | Bin 0 -> 724 bytes .../default/images/lang_english/icon_ip.gif | Bin 0 -> 275 bytes .../default/images/lang_english/icon_pm.gif | Bin 0 -> 833 bytes .../images/lang_english/icon_profile.gif | Bin 0 -> 801 bytes .../images/lang_english/icon_quote.gif | Bin 0 -> 794 bytes .../images/lang_english/icon_search.gif | Bin 0 -> 758 bytes .../default/images/lang_english/icon_www.gif | Bin 0 -> 733 bytes .../default/images/lang_english/index.html | 0 .../images/lang_english/msg_newpost.gif | Bin 0 -> 1588 bytes .../default/images/lang_english/post.gif | Bin 0 -> 1627 bytes .../images/lang_english/reply-locked.gif | Bin 0 -> 1515 bytes .../default/images/lang_english/reply.gif | Bin 0 -> 1693 bytes .../default/images/lang_russian/icon_edit.gif | Bin 0 -> 840 bytes .../images/lang_russian/icon_email.gif | Bin 0 -> 755 bytes .../images/lang_russian/icon_icq_add.gif | Bin 0 -> 690 bytes .../default/images/lang_russian/icon_ip.gif | Bin 0 -> 274 bytes .../default/images/lang_russian/icon_pm.gif | Bin 0 -> 765 bytes .../images/lang_russian/icon_profile.gif | Bin 0 -> 849 bytes .../images/lang_russian/icon_quote.gif | Bin 0 -> 761 bytes .../images/lang_russian/icon_search.gif | Bin 0 -> 694 bytes .../default/images/lang_russian/icon_www.gif | Bin 0 -> 715 bytes .../default/images/lang_russian/index.html | 0 .../images/lang_russian/msg_newpost.gif | Bin 0 -> 1908 bytes .../default/images/lang_russian/post.gif | Bin 0 -> 1632 bytes .../images/lang_russian/reply-locked.gif | Bin 0 -> 1698 bytes .../default/images/lang_russian/reply.gif | Bin 0 -> 1554 bytes upload/templates/default/images/loading.gif | Bin 0 -> 771 bytes upload/templates/default/images/loading_1.gif | Bin 0 -> 1877 bytes upload/templates/default/images/menu_open.gif | Bin 0 -> 279 bytes .../templates/default/images/menu_open_1.gif | Bin 0 -> 99 bytes upload/templates/default/images/msg_inbox.gif | Bin 0 -> 684 bytes .../templates/default/images/msg_outbox.gif | Bin 0 -> 715 bytes .../templates/default/images/msg_savebox.gif | Bin 0 -> 623 bytes .../templates/default/images/msg_sentbox.gif | Bin 0 -> 609 bytes .../templates/default/images/progress_bar.gif | Bin 0 -> 12892 bytes .../default/images/progress_bar_full.gif | Bin 0 -> 1541 bytes upload/templates/default/images/spacer.gif | Bin 0 -> 43 bytes .../templates/default/images/tbl_sort_asc.gif | Bin 0 -> 54 bytes .../templates/default/images/tbl_sort_bg.gif | Bin 0 -> 64 bytes .../default/images/tbl_sort_desc.gif | Bin 0 -> 54 bytes .../templates/default/images/topic_delete.gif | Bin 0 -> 311 bytes upload/templates/default/images/topic_dl.gif | Bin 0 -> 344 bytes .../templates/default/images/topic_lock.gif | Bin 0 -> 316 bytes .../templates/default/images/topic_move.gif | Bin 0 -> 316 bytes .../templates/default/images/topic_normal.gif | Bin 0 -> 344 bytes .../templates/default/images/topic_report.gif | Bin 0 -> 706 bytes .../default/images/topic_reported.gif | Bin 0 -> 707 bytes .../templates/default/images/topic_split.gif | Bin 0 -> 348 bytes .../templates/default/images/topic_unlock.gif | Bin 0 -> 317 bytes .../images/treeview/treeview-default-line.gif | Bin 0 -> 1993 bytes .../images/treeview/treeview-default.gif | Bin 0 -> 1222 bytes upload/templates/default/images/vote_lcap.gif | Bin 0 -> 113 bytes upload/templates/default/images/vote_rcap.gif | Bin 0 -> 113 bytes .../templates/default/images/voting_bar.gif | Bin 0 -> 92 bytes .../templates/default/images/whosonline.gif | Bin 0 -> 929 bytes upload/templates/default/index.tpl | 230 + upload/templates/default/kb.tpl | 136 + upload/templates/default/login.tpl | 61 + upload/templates/default/memberlist.tpl | 83 + upload/templates/default/modcp.tpl | 133 + upload/templates/default/modcp_split.tpl | 95 + upload/templates/default/page_footer.tpl | 74 + upload/templates/default/page_header.tpl | 540 ++ upload/templates/default/posting.tpl | 218 + upload/templates/default/posting_attach.tpl | 71 + upload/templates/default/posting_editor.tpl | 215 + upload/templates/default/posting_poll.tpl | 40 + upload/templates/default/posting_smilies.tpl | 44 + upload/templates/default/privmsgs.tpl | 150 + upload/templates/default/privmsgs_read.tpl | 94 + .../templates/default/report_change_body.tpl | 29 + .../templates/default/report_config_body.tpl | 92 + upload/templates/default/report_form_body.tpl | 72 + .../templates/default/report_index_body.tpl | 81 + upload/templates/default/report_list_body.tpl | 115 + .../default/report_module_edit_body.tpl | 96 + .../default/report_module_reasons_body.tpl | 30 + .../templates/default/report_modules_body.tpl | 65 + upload/templates/default/report_open_body.tpl | 90 + .../default/report_reason_edit_body.tpl | 36 + upload/templates/default/report_view_body.tpl | 114 + upload/templates/default/rss_body.tpl | 41 + upload/templates/default/search.tpl | 171 + upload/templates/default/search_results.tpl | 162 + .../default/topic_templates/audiobooks.tpl | 160 + .../default/topic_templates/books.tpl | 148 + .../default/topic_templates/games.tpl | 151 + .../default/topic_templates/games_ps.tpl | 157 + .../default/topic_templates/games_psp.tpl | 146 + .../default/topic_templates/games_xbox.tpl | 153 + .../default/topic_templates/music.tpl | 154 + .../default/topic_templates/progs.tpl | 150 + .../default/topic_templates/progs_mac.tpl | 151 + .../default/topic_templates/sport.tpl | 154 + .../default/topic_templates/video.tpl | 171 + .../default/topic_templates/video_home.tpl | 159 + .../default/topic_templates/video_lesson.tpl | 136 + .../default/topic_templates/video_simple.tpl | 151 + upload/templates/default/torhelp.tpl | 28 + upload/templates/default/tpl_config.php | 191 + upload/templates/default/tracker.tpl | 439 ++ upload/templates/default/usercp_attachcp.tpl | 113 + .../default/usercp_avatar_gallery.tpl | 35 + upload/templates/default/usercp_email.tpl | 73 + upload/templates/default/usercp_register.tpl | 200 + .../templates/default/usercp_sendpasswd.tpl | 33 + .../templates/default/usercp_viewprofile.tpl | 371 ++ upload/templates/default/viewforum.tpl | 650 +++ upload/templates/default/viewonline.tpl | 41 + upload/templates/default/viewtopic.tpl | 448 ++ upload/templates/default/viewtopic_attach.tpl | 443 ++ .../default/viewtopic_attach_guest.tpl | 13 + upload/templates/default/viewtopic_poll.tpl | 51 + .../templates/default/viewtopic_torrent.tpl | 266 + upload/templates/limit_load_exit.php | 70 + .../templates/topic_tpl_overall_header.html | 51 + upload/templates/topic_tpl_rules_video.html | 99 + upload/templates/xs_mod/tpl/cache.tpl | 43 + upload/templates/xs_mod/tpl/config.tpl | 171 + upload/templates/xs_mod/tpl/frameset.tpl | 22 + upload/templates/xs_mod/tpl/index.tpl | 34 + upload/templates/xs_mod/tpl/message.tpl | 41 + upload/templates/xs_mod/tpl/xs_footer.tpl | 36 + upload/templates/xs_mod/tpl/xs_header.tpl | 40 + upload/tracker.php | 914 ++++ upload/triggers/$on | 0 upload/triggers/.htaccess | 2 + upload/triggers/cron_allowed | 0 upload/viewforum.php | 618 +++ upload/viewonline.php | 201 + upload/viewtopic.php | 1085 ++++ 760 files changed, 108251 insertions(+) create mode 100644 install/sphinx/sphinx.conf create mode 100644 install/sql/mysql.sql create mode 100644 install/xbt/linux/Tracker/CMakeLists.txt create mode 100644 install/xbt/linux/Tracker/XBT Tracker.cpp create mode 100644 install/xbt/linux/Tracker/XBT Tracker.nsi create mode 100644 install/xbt/linux/Tracker/XBT Tracker.rc create mode 100644 install/xbt/linux/Tracker/XBT Tracker.sln create mode 100644 install/xbt/linux/Tracker/XBT Tracker.vcproj create mode 100644 install/xbt/linux/Tracker/XBT Tracker.vcxproj create mode 100644 install/xbt/linux/Tracker/client.h create mode 100644 install/xbt/linux/Tracker/config.cpp create mode 100644 install/xbt/linux/Tracker/config.h create mode 100644 install/xbt/linux/Tracker/connection.cpp create mode 100644 install/xbt/linux/Tracker/connection.h create mode 100644 install/xbt/linux/Tracker/epoll.cpp create mode 100644 install/xbt/linux/Tracker/epoll.h create mode 100644 install/xbt/linux/Tracker/make.bsd.google_perftools.sh create mode 100644 install/xbt/linux/Tracker/make.bsd.sh create mode 100644 install/xbt/linux/Tracker/make.sh create mode 100644 install/xbt/linux/Tracker/md5.cpp create mode 100644 install/xbt/linux/Tracker/md5.h create mode 100644 install/xbt/linux/Tracker/res/Thumbs.db create mode 100644 install/xbt/linux/Tracker/res/XBT Tracker.ico create mode 100644 install/xbt/linux/Tracker/resource.h create mode 100644 install/xbt/linux/Tracker/server.cpp create mode 100644 install/xbt/linux/Tracker/server.h create mode 100644 install/xbt/linux/Tracker/stats.h create mode 100644 install/xbt/linux/Tracker/stdafx.cpp create mode 100644 install/xbt/linux/Tracker/stdafx.h create mode 100644 install/xbt/linux/Tracker/tcp_listen_socket.cpp create mode 100644 install/xbt/linux/Tracker/tcp_listen_socket.h create mode 100644 install/xbt/linux/Tracker/tracker_input.cpp create mode 100644 install/xbt/linux/Tracker/tracker_input.h create mode 100644 install/xbt/linux/Tracker/transaction.cpp create mode 100644 install/xbt/linux/Tracker/transaction.h create mode 100644 install/xbt/linux/Tracker/udp_listen_socket.cpp create mode 100644 install/xbt/linux/Tracker/udp_listen_socket.h create mode 100644 install/xbt/linux/Tracker/xbt_tracker create mode 100644 install/xbt/linux/Tracker/xbt_tracker.pid create mode 100644 install/xbt/linux/Tracker/xbtt.sh create mode 100644 install/xbt/linux/misc/alerts.cpp create mode 100644 install/xbt/linux/misc/alerts.h create mode 100644 install/xbt/linux/misc/bt_misc.cpp create mode 100644 install/xbt/linux/misc/bt_misc.h create mode 100644 install/xbt/linux/misc/bt_strings.h create mode 100644 install/xbt/linux/misc/bt_torrent.cpp create mode 100644 install/xbt/linux/misc/bt_torrent.h create mode 100644 install/xbt/linux/misc/bt_tracker_account.cpp create mode 100644 install/xbt/linux/misc/bt_tracker_account.h create mode 100644 install/xbt/linux/misc/bt_tracker_url.cpp create mode 100644 install/xbt/linux/misc/bt_tracker_url.h create mode 100644 install/xbt/linux/misc/bvalue.cpp create mode 100644 install/xbt/linux/misc/bvalue.h create mode 100644 install/xbt/linux/misc/config_base.h create mode 100644 install/xbt/linux/misc/const_memory_range.h create mode 100644 install/xbt/linux/misc/find_ptr.h create mode 100644 install/xbt/linux/misc/sha1.cpp create mode 100644 install/xbt/linux/misc/sha1.h create mode 100644 install/xbt/linux/misc/socket.cpp create mode 100644 install/xbt/linux/misc/socket.h create mode 100644 install/xbt/linux/misc/sql/database.cpp create mode 100644 install/xbt/linux/misc/sql/database.h create mode 100644 install/xbt/linux/misc/sql/sql_query.cpp create mode 100644 install/xbt/linux/misc/sql/sql_query.h create mode 100644 install/xbt/linux/misc/sql/sql_result.cpp create mode 100644 install/xbt/linux/misc/sql/sql_result.h create mode 100644 install/xbt/linux/misc/stream_int.h create mode 100644 install/xbt/linux/misc/stream_reader.cpp create mode 100644 install/xbt/linux/misc/stream_reader.h create mode 100644 install/xbt/linux/misc/stream_writer.cpp create mode 100644 install/xbt/linux/misc/stream_writer.h create mode 100644 install/xbt/linux/misc/tf_misc.cpp create mode 100644 install/xbt/linux/misc/tf_misc.h create mode 100644 install/xbt/linux/misc/virtual_binary.cpp create mode 100644 install/xbt/linux/misc/windows/ETSLayout.cpp create mode 100644 install/xbt/linux/misc/windows/ETSLayout.h create mode 100644 install/xbt/linux/misc/windows/browse_for_directory.cpp create mode 100644 install/xbt/linux/misc/windows/browse_for_directory.h create mode 100644 install/xbt/linux/misc/windows/nt_service.cpp create mode 100644 install/xbt/linux/misc/windows/nt_service.h create mode 100644 install/xbt/linux/misc/xbt/virtual_binary.h create mode 100644 install/xbt/linux/misc/xcc_z.cpp create mode 100644 install/xbt/linux/misc/xcc_z.h create mode 100644 install/xbt/linux/misc/xif_key.cpp create mode 100644 install/xbt/linux/misc/xif_key.h create mode 100644 install/xbt/linux/misc/xif_key_r.cpp create mode 100644 install/xbt/linux/misc/xif_key_r.h create mode 100644 install/xbt/linux/misc/xif_value.cpp create mode 100644 install/xbt/linux/misc/xif_value.h create mode 100644 install/xbt/sql/update_mysql.sql create mode 100644 install/xbt/windows/XBT Tracker.exe create mode 100644 install/xbt/windows/htdocs/xbt.css create mode 100644 install/xbt/windows/htdocs/xbt_config.php create mode 100644 install/xbt/windows/htdocs/xbt_files.php create mode 100644 install/xbt/windows/libmysql.dll create mode 100644 install/xbt/windows/xbt_tracker.conf create mode 100644 install/xbt/windows/zlibwapi.dll create mode 100644 install/xbt/windows/Установка.txt create mode 100644 install/xbt/xbt_tracker.conf create mode 100644 upload/.htaccess create mode 100644 upload/admin/.htaccess create mode 100644 upload/admin/admin_attach_cp.php create mode 100644 upload/admin/admin_attachments.php create mode 100644 upload/admin/admin_board.php create mode 100644 upload/admin/admin_bt_forum_cfg.php create mode 100644 upload/admin/admin_bt_tracker_cfg.php create mode 100644 upload/admin/admin_cron.php create mode 100644 upload/admin/admin_disallow.php create mode 100644 upload/admin/admin_extensions.php create mode 100644 upload/admin/admin_forum_prune.php create mode 100644 upload/admin/admin_forumauth.php create mode 100644 upload/admin/admin_forumauth_list.php create mode 100644 upload/admin/admin_forums.php create mode 100644 upload/admin/admin_groups.php create mode 100644 upload/admin/admin_log.php create mode 100644 upload/admin/admin_mass_email.php create mode 100644 upload/admin/admin_phpinfo.php create mode 100644 upload/admin/admin_ranks.php create mode 100644 upload/admin/admin_rebuild_search.php create mode 100644 upload/admin/admin_reports.php create mode 100644 upload/admin/admin_smilies.php create mode 100644 upload/admin/admin_topic_templates.php create mode 100644 upload/admin/admin_ug_auth.php create mode 100644 upload/admin/admin_user_ban.php create mode 100644 upload/admin/admin_user_search.php create mode 100644 upload/admin/admin_users.php create mode 100644 upload/admin/admin_words.php create mode 100644 upload/admin/admin_xs.php create mode 100644 upload/admin/index.php create mode 100644 upload/admin/pagestart.php create mode 100644 upload/admin/xs_cache.php create mode 100644 upload/admin/xs_config.php create mode 100644 upload/admin/xs_frameset.php create mode 100644 upload/admin/xs_include.php create mode 100644 upload/admin/xs_index.php create mode 100644 upload/ajax.php create mode 100644 upload/ajax/change_tor_status.php create mode 100644 upload/ajax/change_torrent.php create mode 100644 upload/ajax/edit_user_profile.php create mode 100644 upload/ajax/html/jumpbox_guest.html create mode 100644 upload/ajax/html/jumpbox_user.html create mode 100644 upload/ajax/mod_action.php create mode 100644 upload/ajax/user_register.php create mode 100644 upload/ajax/view_post.php create mode 100644 upload/ajax/view_torrent.php create mode 100644 upload/attach_mod/.htaccess create mode 100644 upload/attach_mod/attachment_mod.php create mode 100644 upload/attach_mod/displaying.php create mode 100644 upload/attach_mod/displaying_torrent.php create mode 100644 upload/attach_mod/includes/.htaccess create mode 100644 upload/attach_mod/includes/functions_admin.php create mode 100644 upload/attach_mod/includes/functions_attach.php create mode 100644 upload/attach_mod/includes/functions_delete.php create mode 100644 upload/attach_mod/includes/functions_filetypes.php create mode 100644 upload/attach_mod/includes/functions_includes.php create mode 100644 upload/attach_mod/includes/functions_selects.php create mode 100644 upload/attach_mod/includes/functions_thumbs.php create mode 100644 upload/attach_mod/posting_attachments.php create mode 100644 upload/bt/announce.php create mode 100644 upload/bt/includes/.htaccess create mode 100644 upload/bt/includes/init_tr.php create mode 100644 upload/bt/includes/tr_announcer.php create mode 100644 upload/bt/includes/tr_ratio.php create mode 100644 upload/bt/includes/tr_scraper.php create mode 100644 upload/bt/index.php create mode 100644 upload/bt/robots.txt create mode 100644 upload/bt/scrape.php create mode 100644 upload/callseed.php create mode 100644 upload/common.php create mode 100644 upload/config.php create mode 100644 upload/config/.htaccess create mode 100644 upload/config/cron_cfg.php create mode 100644 upload/config_mods.php create mode 100644 upload/cron.php create mode 100644 upload/develop/benchmark/timer.php create mode 100644 upload/develop/dbg_config.php create mode 100644 upload/develop/dbg_header.php create mode 100644 upload/develop/error_handler.php create mode 100644 upload/develop/error_report.php create mode 100644 upload/develop/functions_debug.php create mode 100644 upload/develop/init_debug.php create mode 100644 upload/develop/memcached_stub.php create mode 100644 upload/develop/open_editor.php create mode 100644 upload/develop/profiler/example.txt create mode 100644 upload/develop/profiler/profiler.css create mode 100644 upload/develop/profiler/profiler.php create mode 100644 upload/develop/profiler/profiler_dbg.php create mode 100644 upload/develop/show_source.php create mode 100644 upload/develop/source/Date_DeltaRussian.rar create mode 100644 upload/develop/source/Globals.zip create mode 100644 upload/develop/source/benchmark.rar create mode 100644 upload/develop/source/javascript_browser_detection_basic.rar create mode 100644 upload/develop/source/js-sprintf.rar create mode 100644 upload/develop/source/profiler.zip create mode 100644 upload/dl_list.php create mode 100644 upload/download.php create mode 100644 upload/faq.php create mode 100644 upload/favicon.ico create mode 100644 upload/files/.htaccess create mode 100644 upload/files/thumbs/.htaccess create mode 100644 upload/gallery.php create mode 100644 upload/groupcp.php create mode 100644 upload/images/Thumbs.db create mode 100644 upload/images/avatars/bot.gif create mode 100644 upload/images/avatars/gallery/noavatar.png create mode 100644 upload/images/icon_clip.gif create mode 100644 upload/images/icon_disk.gif create mode 100644 upload/images/icon_disk_gray.gif create mode 100644 upload/images/icon_dn.gif create mode 100644 upload/images/logo/Thumbs.db create mode 100644 upload/images/logo/logo.gif create mode 100644 upload/images/logo/logo.png create mode 100644 upload/images/magnet.png create mode 100644 upload/images/menu_open_1.gif create mode 100644 upload/images/pic_loading.gif create mode 100644 upload/images/smiles/aa.gif create mode 100644 upload/images/smiles/ab.gif create mode 100644 upload/images/smiles/ac.gif create mode 100644 upload/images/smiles/ad.gif create mode 100644 upload/images/smiles/ae.gif create mode 100644 upload/images/smiles/af.gif create mode 100644 upload/images/smiles/ag.gif create mode 100644 upload/images/smiles/ah.gif create mode 100644 upload/images/smiles/ai.gif create mode 100644 upload/images/smiles/aj.gif create mode 100644 upload/images/smiles/ak.gif create mode 100644 upload/images/smiles/al.gif create mode 100644 upload/images/smiles/am.gif create mode 100644 upload/images/smiles/an.gif create mode 100644 upload/images/smiles/ao.gif create mode 100644 upload/images/smiles/ap.gif create mode 100644 upload/images/smiles/aq.gif create mode 100644 upload/images/smiles/ar.gif create mode 100644 upload/images/smiles/as.gif create mode 100644 upload/images/smiles/at.gif create mode 100644 upload/images/smiles/au.gif create mode 100644 upload/images/smiles/av.gif create mode 100644 upload/images/smiles/aw.gif create mode 100644 upload/images/smiles/ax.gif create mode 100644 upload/images/smiles/ay.gif create mode 100644 upload/images/smiles/az.gif create mode 100644 upload/images/smiles/ba.gif create mode 100644 upload/images/smiles/bb.gif create mode 100644 upload/images/smiles/bc.gif create mode 100644 upload/images/smiles/bd.gif create mode 100644 upload/images/smiles/be.gif create mode 100644 upload/images/smiles/bf.gif create mode 100644 upload/images/smiles/bg.gif create mode 100644 upload/images/smiles/bh.gif create mode 100644 upload/images/smiles/bi.gif create mode 100644 upload/images/smiles/bj.gif create mode 100644 upload/images/smiles/bk.gif create mode 100644 upload/images/smiles/bl.gif create mode 100644 upload/images/smiles/bm.gif create mode 100644 upload/images/smiles/bn.gif create mode 100644 upload/images/smiles/bo.gif create mode 100644 upload/images/smiles/bp.gif create mode 100644 upload/images/smiles/bq.gif create mode 100644 upload/images/smiles/br.gif create mode 100644 upload/images/smiles/bs.gif create mode 100644 upload/images/smiles/bt.gif create mode 100644 upload/images/smiles/bu.gif create mode 100644 upload/images/smiles/bv.gif create mode 100644 upload/images/smiles/bw.gif create mode 100644 upload/images/smiles/smileys.pak create mode 100644 upload/images/spacer.gif create mode 100644 upload/images/tor_gold.gif create mode 100644 upload/images/tor_silver.gif create mode 100644 upload/images/user_offline.gif create mode 100644 upload/images/user_online.gif create mode 100644 upload/includes/.htaccess create mode 100644 upload/includes/FastJSON.class.php create mode 100644 upload/includes/bbcode.php create mode 100644 upload/includes/captcha/captcha.php create mode 100644 upload/includes/captcha/kcaptcha/fonts/Thumbs.db create mode 100644 upload/includes/captcha/kcaptcha/fonts/antiqua.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/baskerville.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/batang.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/bookman.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/calisto.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/cambria.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/centaur.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/century.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/chaparral.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/constantia.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/footlight.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/garamond.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/georgia.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/goudy_old.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/kozuka.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/lucida.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/minion.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/palatino.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/perpetua.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/rockwell.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/times.png create mode 100644 upload/includes/captcha/kcaptcha/fonts/warnock.png create mode 100644 upload/includes/cron/.htaccess create mode 100644 upload/includes/cron/cron_check.php create mode 100644 upload/includes/cron/cron_init.php create mode 100644 upload/includes/cron/cron_run.php create mode 100644 upload/includes/cron/jobs/.htaccess create mode 100644 upload/includes/cron/jobs/avatars_cleanup.php create mode 100644 upload/includes/cron/jobs/bb_maintenance.php create mode 100644 upload/includes/cron/jobs/bb_manage_untrusted.php create mode 100644 upload/includes/cron/jobs/cache_gc.php create mode 100644 upload/includes/cron/jobs/captcha_gen_gc.php create mode 100644 upload/includes/cron/jobs/clean_dlstat.php create mode 100644 upload/includes/cron/jobs/clean_log.php create mode 100644 upload/includes/cron/jobs/clean_search_results.php create mode 100644 upload/includes/cron/jobs/db_backup.php create mode 100644 upload/includes/cron/jobs/ds_update_cat_forums.php create mode 100644 upload/includes/cron/jobs/ds_update_stats.php create mode 100644 upload/includes/cron/jobs/flash_topic_view.php create mode 100644 upload/includes/cron/jobs/prune_forums.php create mode 100644 upload/includes/cron/jobs/prune_inactive_users.php create mode 100644 upload/includes/cron/jobs/prune_topic_moved.php create mode 100644 upload/includes/cron/jobs/sessions_cleanup.php create mode 100644 upload/includes/cron/jobs/site_backup.php create mode 100644 upload/includes/cron/jobs/tr_cleanup_and_dlstat.php create mode 100644 upload/includes/cron/jobs/tr_complete_count.php create mode 100644 upload/includes/cron/jobs/tr_maintenance.php create mode 100644 upload/includes/cron/jobs/tr_make_snapshot.php create mode 100644 upload/includes/cron/jobs/tr_update_seeder_last_seen.php create mode 100644 upload/includes/datastore/.htaccess create mode 100644 upload/includes/datastore/build_attach_extensions.php create mode 100644 upload/includes/datastore/build_cat_forums.php create mode 100644 upload/includes/datastore/build_moderators.php create mode 100644 upload/includes/datastore/build_ranks.php create mode 100644 upload/includes/datastore/build_smilies.php create mode 100644 upload/includes/datastore/build_stats.php create mode 100644 upload/includes/db/.htaccess create mode 100644 upload/includes/db/mysql.php create mode 100644 upload/includes/emailer.class.php create mode 100644 upload/includes/functions.php create mode 100644 upload/includes/functions_admin.php create mode 100644 upload/includes/functions_admin_cron.php create mode 100644 upload/includes/functions_admin_torrent.php create mode 100644 upload/includes/functions_dev.php create mode 100644 upload/includes/functions_group.php create mode 100644 upload/includes/functions_post.php create mode 100644 upload/includes/functions_report.php create mode 100644 upload/includes/functions_report_admin.php create mode 100644 upload/includes/functions_selects.php create mode 100644 upload/includes/functions_torrent.php create mode 100644 upload/includes/functions_validate.php create mode 100644 upload/includes/init_bb.php create mode 100644 upload/includes/online_userlist.php create mode 100644 upload/includes/page_footer.php create mode 100644 upload/includes/page_footer_dev.php create mode 100644 upload/includes/page_header.php create mode 100644 upload/includes/report_hack/.htaccess create mode 100644 upload/includes/report_hack/report_general.php create mode 100644 upload/includes/report_hack/report_post.php create mode 100644 upload/includes/report_hack/report_privmsg.php create mode 100644 upload/includes/report_hack/report_topic.php create mode 100644 upload/includes/report_hack/report_user.php create mode 100644 upload/includes/report_module.php create mode 100644 upload/includes/sessions.php create mode 100644 upload/includes/smtp.php create mode 100644 upload/includes/sphinxapi.php create mode 100644 upload/includes/sql_parse.php create mode 100644 upload/includes/template.php create mode 100644 upload/includes/topic_templates.php create mode 100644 upload/includes/topic_templates/.htaccess create mode 100644 upload/includes/topic_templates/audiobooks.php create mode 100644 upload/includes/topic_templates/books.php create mode 100644 upload/includes/topic_templates/games.php create mode 100644 upload/includes/topic_templates/music.php create mode 100644 upload/includes/topic_templates/progs.php create mode 100644 upload/includes/topic_templates/sport.php create mode 100644 upload/includes/topic_templates/tpl_selects.php create mode 100644 upload/includes/topic_templates/video.php create mode 100644 upload/includes/topic_templates/video_guide.php create mode 100644 upload/includes/torrent_announce_urls.php create mode 100644 upload/includes/torrent_show_dl_list.php create mode 100644 upload/includes/ucp/.htaccess create mode 100644 upload/includes/ucp/fonts/.htaccess create mode 100644 upload/includes/ucp/fonts/antiqua.png create mode 100644 upload/includes/ucp/fonts/baskerville.png create mode 100644 upload/includes/ucp/fonts/batang.png create mode 100644 upload/includes/ucp/fonts/bookman.png create mode 100644 upload/includes/ucp/fonts/calisto.png create mode 100644 upload/includes/ucp/fonts/cambria.png create mode 100644 upload/includes/ucp/fonts/centaur.png create mode 100644 upload/includes/ucp/fonts/century.png create mode 100644 upload/includes/ucp/fonts/chaparral.png create mode 100644 upload/includes/ucp/fonts/constantia.png create mode 100644 upload/includes/ucp/fonts/footlight.png create mode 100644 upload/includes/ucp/fonts/garamond.png create mode 100644 upload/includes/ucp/fonts/georgia.png create mode 100644 upload/includes/ucp/fonts/goudy_old.png create mode 100644 upload/includes/ucp/fonts/kozuka.png create mode 100644 upload/includes/ucp/fonts/lucida.png create mode 100644 upload/includes/ucp/fonts/minion.png create mode 100644 upload/includes/ucp/fonts/palatino.png create mode 100644 upload/includes/ucp/fonts/perpetua.png create mode 100644 upload/includes/ucp/fonts/rockwell.png create mode 100644 upload/includes/ucp/fonts/times.png create mode 100644 upload/includes/ucp/fonts/warnock.png create mode 100644 upload/includes/ucp/torrent_userprofile.php create mode 100644 upload/includes/ucp/usercp_activate.php create mode 100644 upload/includes/ucp/usercp_attachcp.php create mode 100644 upload/includes/ucp/usercp_avatar.php create mode 100644 upload/includes/ucp/usercp_email.php create mode 100644 upload/includes/ucp/usercp_register.php create mode 100644 upload/includes/ucp/usercp_sendpasswd.php create mode 100644 upload/includes/ucp/usercp_viewprofile.php create mode 100644 upload/index.php create mode 100644 upload/language/.htaccess create mode 100644 upload/language/lang_english/.htaccess create mode 100644 upload/language/lang_english/email/.htaccess create mode 100644 upload/language/lang_english/email/admin_activate.tpl create mode 100644 upload/language/lang_english/email/admin_send_email.tpl create mode 100644 upload/language/lang_english/email/admin_welcome_activated.tpl create mode 100644 upload/language/lang_english/email/admin_welcome_inactive.tpl create mode 100644 upload/language/lang_english/email/blank.tpl create mode 100644 upload/language/lang_english/email/group_added.tpl create mode 100644 upload/language/lang_english/email/group_approved.tpl create mode 100644 upload/language/lang_english/email/group_request.tpl create mode 100644 upload/language/lang_english/email/privmsg_notify.tpl create mode 100644 upload/language/lang_english/email/profile_send_email.tpl create mode 100644 upload/language/lang_english/email/topic_notify.tpl create mode 100644 upload/language/lang_english/email/user_activate.tpl create mode 100644 upload/language/lang_english/email/user_activate_passwd.tpl create mode 100644 upload/language/lang_english/email/user_welcome.tpl create mode 100644 upload/language/lang_english/email/user_welcome_inactive.tpl create mode 100644 upload/language/lang_english/lang_admin.php create mode 100644 upload/language/lang_english/lang_admin_attach.php create mode 100644 upload/language/lang_english/lang_admin_bt.php create mode 100644 upload/language/lang_english/lang_admin_cron.php create mode 100644 upload/language/lang_english/lang_admin_rebuild_search.php create mode 100644 upload/language/lang_english/lang_bbcode.php create mode 100644 upload/language/lang_english/lang_bot.php create mode 100644 upload/language/lang_english/lang_callseed.php create mode 100644 upload/language/lang_english/lang_countries.php create mode 100644 upload/language/lang_english/lang_faq.php create mode 100644 upload/language/lang_english/lang_faq_attach.php create mode 100644 upload/language/lang_english/lang_gallery.php create mode 100644 upload/language/lang_english/lang_log_action.php create mode 100644 upload/language/lang_english/lang_main.php create mode 100644 upload/language/lang_english/lang_topic_templates.php create mode 100644 upload/language/lang_english/lang_user_search.php create mode 100644 upload/language/lang_english/lang_xs.php create mode 100644 upload/language/lang_english/report_hack/.htaccess create mode 100644 upload/language/lang_english/report_hack/lang_report_general.php create mode 100644 upload/language/lang_english/report_hack/lang_report_post.php create mode 100644 upload/language/lang_english/report_hack/lang_report_privmsg.php create mode 100644 upload/language/lang_english/report_hack/lang_report_topic.php create mode 100644 upload/language/lang_english/report_hack/lang_report_user.php create mode 100644 upload/language/lang_english/search_stopwords.txt create mode 100644 upload/language/lang_english/search_synonyms.txt create mode 100644 upload/language/lang_english/translit_table.php create mode 100644 upload/language/lang_russian/.htaccess create mode 100644 upload/language/lang_russian/email/.htaccess create mode 100644 upload/language/lang_russian/email/admin_activate.tpl create mode 100644 upload/language/lang_russian/email/admin_send_email.tpl create mode 100644 upload/language/lang_russian/email/admin_welcome_activated.tpl create mode 100644 upload/language/lang_russian/email/admin_welcome_inactive.tpl create mode 100644 upload/language/lang_russian/email/blank.tpl create mode 100644 upload/language/lang_russian/email/group_added.tpl create mode 100644 upload/language/lang_russian/email/group_approved.tpl create mode 100644 upload/language/lang_russian/email/group_request.tpl create mode 100644 upload/language/lang_russian/email/privmsg_notify.tpl create mode 100644 upload/language/lang_russian/email/profile_send_email.tpl create mode 100644 upload/language/lang_russian/email/topic_notify.tpl create mode 100644 upload/language/lang_russian/email/user_activate.tpl create mode 100644 upload/language/lang_russian/email/user_activate_passwd.tpl create mode 100644 upload/language/lang_russian/email/user_welcome.tpl create mode 100644 upload/language/lang_russian/email/user_welcome_inactive.tpl create mode 100644 upload/language/lang_russian/lang_admin.php create mode 100644 upload/language/lang_russian/lang_admin_attach.php create mode 100644 upload/language/lang_russian/lang_admin_bt.php create mode 100644 upload/language/lang_russian/lang_admin_cron.php create mode 100644 upload/language/lang_russian/lang_admin_rebuild_search.php create mode 100644 upload/language/lang_russian/lang_bbcode.php create mode 100644 upload/language/lang_russian/lang_bot.php create mode 100644 upload/language/lang_russian/lang_callseed.php create mode 100644 upload/language/lang_russian/lang_countries.php create mode 100644 upload/language/lang_russian/lang_faq.php create mode 100644 upload/language/lang_russian/lang_faq_attach.php create mode 100644 upload/language/lang_russian/lang_gallery.php create mode 100644 upload/language/lang_russian/lang_log_action.php create mode 100644 upload/language/lang_russian/lang_main.php create mode 100644 upload/language/lang_russian/lang_topic_templates.php create mode 100644 upload/language/lang_russian/lang_user_search.php create mode 100644 upload/language/lang_russian/lang_xs.php create mode 100644 upload/language/lang_russian/report_hack/.htaccess create mode 100644 upload/language/lang_russian/report_hack/lang_report_general.php create mode 100644 upload/language/lang_russian/report_hack/lang_report_post.php create mode 100644 upload/language/lang_russian/report_hack/lang_report_privmsg.php create mode 100644 upload/language/lang_russian/report_hack/lang_report_topic.php create mode 100644 upload/language/lang_russian/report_hack/lang_report_user.php create mode 100644 upload/language/lang_russian/search_stopwords.txt create mode 100644 upload/language/lang_russian/search_synonyms.txt create mode 100644 upload/language/lang_russian/translit_table.php create mode 100644 upload/log/.htaccess create mode 100644 upload/login.php create mode 100644 upload/memberlist.php create mode 100644 upload/misc.php create mode 100644 upload/misc/.htaccess create mode 100644 upload/misc/html/advert.html create mode 100644 upload/misc/html/agreement.html create mode 100644 upload/misc/html/copyright_holders.html create mode 100644 upload/misc/html/move_topic_bookmarks.html create mode 100644 upload/misc/html/not_found.html create mode 100644 upload/misc/html/sidebar1.html create mode 100644 upload/misc/html/sidebar2.html create mode 100644 upload/misc/html/user_agreement.html create mode 100644 upload/misc/js/bbcode.js create mode 100644 upload/misc/js/develop.js create mode 100644 upload/misc/js/firebug/errorIcon.png create mode 100644 upload/misc/js/firebug/firebug.css create mode 100644 upload/misc/js/firebug/firebug.html create mode 100644 upload/misc/js/firebug/firebug.js create mode 100644 upload/misc/js/firebug/firebugx.js create mode 100644 upload/misc/js/firebug/infoIcon.png create mode 100644 upload/misc/js/firebug/warningIcon.png create mode 100644 upload/misc/js/jquery.pack.js create mode 100644 upload/misc/js/main.js create mode 100644 upload/misc/js/source/jquery.js create mode 100644 upload/misc/js/source/jquery_plugins/dimensions.js create mode 100644 upload/misc/js/source/jquery_plugins/jquery.media.js create mode 100644 upload/misc/js/source/jquery_plugins/json.js create mode 100644 upload/misc/js/source/jquery_plugins/metadata.js create mode 100644 upload/misc/js/source/sprintf.js create mode 100644 upload/modcp.php create mode 100644 upload/opensearch_desc.xml create mode 100644 upload/opensearch_desc_bt.xml create mode 100644 upload/pictures/.htaccess create mode 100644 upload/posting.php create mode 100644 upload/privmsg.php create mode 100644 upload/profile.php create mode 100644 upload/report.php create mode 100644 upload/search.php create mode 100644 upload/stats/tr_stats.php create mode 100644 upload/stats/tracker.php create mode 100644 upload/templates/admin/admin_attach_cp.tpl create mode 100644 upload/templates/admin/admin_attachments.tpl create mode 100644 upload/templates/admin/admin_board.tpl create mode 100644 upload/templates/admin/admin_bt_forum_cfg.tpl create mode 100644 upload/templates/admin/admin_bt_tracker_cfg.tpl create mode 100644 upload/templates/admin/admin_cron.tpl create mode 100644 upload/templates/admin/admin_disallow.tpl create mode 100644 upload/templates/admin/admin_extensions.tpl create mode 100644 upload/templates/admin/admin_forum_prune.tpl create mode 100644 upload/templates/admin/admin_forumauth.tpl create mode 100644 upload/templates/admin/admin_forumauth_list.tpl create mode 100644 upload/templates/admin/admin_forums.tpl create mode 100644 upload/templates/admin/admin_groups.tpl create mode 100644 upload/templates/admin/admin_log.tpl create mode 100644 upload/templates/admin/admin_mass_email.tpl create mode 100644 upload/templates/admin/admin_ranks.tpl create mode 100644 upload/templates/admin/admin_rebuild_search.tpl create mode 100644 upload/templates/admin/admin_smilies.tpl create mode 100644 upload/templates/admin/admin_topic_templates.tpl create mode 100644 upload/templates/admin/admin_ug_auth.tpl create mode 100644 upload/templates/admin/admin_user_ban.tpl create mode 100644 upload/templates/admin/admin_user_search.tpl create mode 100644 upload/templates/admin/admin_users.tpl create mode 100644 upload/templates/admin/admin_words.tpl create mode 100644 upload/templates/admin/index.tpl create mode 100644 upload/templates/board_disabled_exit.php create mode 100644 upload/templates/default/agreement.tpl create mode 100644 upload/templates/default/attach_rules.tpl create mode 100644 upload/templates/default/bbcode.tpl create mode 100644 upload/templates/default/common.tpl create mode 100644 upload/templates/default/confirm_body.tpl create mode 100644 upload/templates/default/css/admin.css create mode 100644 upload/templates/default/css/backup/admin.css create mode 100644 upload/templates/default/css/backup/dbg.css create mode 100644 upload/templates/default/css/backup/index.html create mode 100644 upload/templates/default/css/backup/main.css create mode 100644 upload/templates/default/css/backup/theme_default.css create mode 100644 upload/templates/default/css/dbg.css create mode 100644 upload/templates/default/css/main.css create mode 100644 upload/templates/default/donate.tpl create mode 100644 upload/templates/default/faq.tpl create mode 100644 upload/templates/default/gallery.tpl create mode 100644 upload/templates/default/groupcp.tpl create mode 100644 upload/templates/default/images/arrow1.gif create mode 100644 upload/templates/default/images/button.gif create mode 100644 upload/templates/default/images/cellpic.gif create mode 100644 upload/templates/default/images/cellpic1.gif create mode 100644 upload/templates/default/images/cellpic2.jpg create mode 100644 upload/templates/default/images/cellpic3.gif create mode 100644 upload/templates/default/images/folder.gif create mode 100644 upload/templates/default/images/folder_announce.gif create mode 100644 upload/templates/default/images/folder_announce_new.gif create mode 100644 upload/templates/default/images/folder_big.gif create mode 100644 upload/templates/default/images/folder_dl.gif create mode 100644 upload/templates/default/images/folder_dl_hot.gif create mode 100644 upload/templates/default/images/folder_dl_hot_new.gif create mode 100644 upload/templates/default/images/folder_dl_new.gif create mode 100644 upload/templates/default/images/folder_hot.gif create mode 100644 upload/templates/default/images/folder_lock.gif create mode 100644 upload/templates/default/images/folder_lock_new.gif create mode 100644 upload/templates/default/images/folder_locked_big.gif create mode 100644 upload/templates/default/images/folder_new.gif create mode 100644 upload/templates/default/images/folder_new_big.gif create mode 100644 upload/templates/default/images/folder_new_hot.gif create mode 100644 upload/templates/default/images/folder_sticky.gif create mode 100644 upload/templates/default/images/folder_sticky_new.gif create mode 100644 upload/templates/default/images/hr200_ltr_gradient.jpg create mode 100644 upload/templates/default/images/hr400_ltr_gradient.jpg create mode 100644 upload/templates/default/images/icon_delete.gif create mode 100644 upload/templates/default/images/icon_latest_reply.gif create mode 100644 upload/templates/default/images/icon_mini_faq.gif create mode 100644 upload/templates/default/images/icon_mini_groups.gif create mode 100644 upload/templates/default/images/icon_mini_login.gif create mode 100644 upload/templates/default/images/icon_mini_members.gif create mode 100644 upload/templates/default/images/icon_mini_message.gif create mode 100644 upload/templates/default/images/icon_mini_profile.gif create mode 100644 upload/templates/default/images/icon_mini_register.gif create mode 100644 upload/templates/default/images/icon_mini_search.gif create mode 100644 upload/templates/default/images/icon_mini_tracker.gif create mode 100644 upload/templates/default/images/icon_minipost.gif create mode 100644 upload/templates/default/images/icon_minipost_new.gif create mode 100644 upload/templates/default/images/icon_minus_1.gif create mode 100644 upload/templates/default/images/icon_minus_2.gif create mode 100644 upload/templates/default/images/icon_mod.gif create mode 100644 upload/templates/default/images/icon_newest_reply.gif create mode 100644 upload/templates/default/images/icon_plus_1.gif create mode 100644 upload/templates/default/images/icon_plus_2.gif create mode 100644 upload/templates/default/images/icon_report.gif create mode 100644 upload/templates/default/images/icon_reported.gif create mode 100644 upload/templates/default/images/index.html create mode 100644 upload/templates/default/images/lang_english/icon_edit.gif create mode 100644 upload/templates/default/images/lang_english/icon_email.gif create mode 100644 upload/templates/default/images/lang_english/icon_icq_add.gif create mode 100644 upload/templates/default/images/lang_english/icon_ip.gif create mode 100644 upload/templates/default/images/lang_english/icon_pm.gif create mode 100644 upload/templates/default/images/lang_english/icon_profile.gif create mode 100644 upload/templates/default/images/lang_english/icon_quote.gif create mode 100644 upload/templates/default/images/lang_english/icon_search.gif create mode 100644 upload/templates/default/images/lang_english/icon_www.gif create mode 100644 upload/templates/default/images/lang_english/index.html create mode 100644 upload/templates/default/images/lang_english/msg_newpost.gif create mode 100644 upload/templates/default/images/lang_english/post.gif create mode 100644 upload/templates/default/images/lang_english/reply-locked.gif create mode 100644 upload/templates/default/images/lang_english/reply.gif create mode 100644 upload/templates/default/images/lang_russian/icon_edit.gif create mode 100644 upload/templates/default/images/lang_russian/icon_email.gif create mode 100644 upload/templates/default/images/lang_russian/icon_icq_add.gif create mode 100644 upload/templates/default/images/lang_russian/icon_ip.gif create mode 100644 upload/templates/default/images/lang_russian/icon_pm.gif create mode 100644 upload/templates/default/images/lang_russian/icon_profile.gif create mode 100644 upload/templates/default/images/lang_russian/icon_quote.gif create mode 100644 upload/templates/default/images/lang_russian/icon_search.gif create mode 100644 upload/templates/default/images/lang_russian/icon_www.gif create mode 100644 upload/templates/default/images/lang_russian/index.html create mode 100644 upload/templates/default/images/lang_russian/msg_newpost.gif create mode 100644 upload/templates/default/images/lang_russian/post.gif create mode 100644 upload/templates/default/images/lang_russian/reply-locked.gif create mode 100644 upload/templates/default/images/lang_russian/reply.gif create mode 100644 upload/templates/default/images/loading.gif create mode 100644 upload/templates/default/images/loading_1.gif create mode 100644 upload/templates/default/images/menu_open.gif create mode 100644 upload/templates/default/images/menu_open_1.gif create mode 100644 upload/templates/default/images/msg_inbox.gif create mode 100644 upload/templates/default/images/msg_outbox.gif create mode 100644 upload/templates/default/images/msg_savebox.gif create mode 100644 upload/templates/default/images/msg_sentbox.gif create mode 100644 upload/templates/default/images/progress_bar.gif create mode 100644 upload/templates/default/images/progress_bar_full.gif create mode 100644 upload/templates/default/images/spacer.gif create mode 100644 upload/templates/default/images/tbl_sort_asc.gif create mode 100644 upload/templates/default/images/tbl_sort_bg.gif create mode 100644 upload/templates/default/images/tbl_sort_desc.gif create mode 100644 upload/templates/default/images/topic_delete.gif create mode 100644 upload/templates/default/images/topic_dl.gif create mode 100644 upload/templates/default/images/topic_lock.gif create mode 100644 upload/templates/default/images/topic_move.gif create mode 100644 upload/templates/default/images/topic_normal.gif create mode 100644 upload/templates/default/images/topic_report.gif create mode 100644 upload/templates/default/images/topic_reported.gif create mode 100644 upload/templates/default/images/topic_split.gif create mode 100644 upload/templates/default/images/topic_unlock.gif create mode 100644 upload/templates/default/images/treeview/treeview-default-line.gif create mode 100644 upload/templates/default/images/treeview/treeview-default.gif create mode 100644 upload/templates/default/images/vote_lcap.gif create mode 100644 upload/templates/default/images/vote_rcap.gif create mode 100644 upload/templates/default/images/voting_bar.gif create mode 100644 upload/templates/default/images/whosonline.gif create mode 100644 upload/templates/default/index.tpl create mode 100644 upload/templates/default/kb.tpl create mode 100644 upload/templates/default/login.tpl create mode 100644 upload/templates/default/memberlist.tpl create mode 100644 upload/templates/default/modcp.tpl create mode 100644 upload/templates/default/modcp_split.tpl create mode 100644 upload/templates/default/page_footer.tpl create mode 100644 upload/templates/default/page_header.tpl create mode 100644 upload/templates/default/posting.tpl create mode 100644 upload/templates/default/posting_attach.tpl create mode 100644 upload/templates/default/posting_editor.tpl create mode 100644 upload/templates/default/posting_poll.tpl create mode 100644 upload/templates/default/posting_smilies.tpl create mode 100644 upload/templates/default/privmsgs.tpl create mode 100644 upload/templates/default/privmsgs_read.tpl create mode 100644 upload/templates/default/report_change_body.tpl create mode 100644 upload/templates/default/report_config_body.tpl create mode 100644 upload/templates/default/report_form_body.tpl create mode 100644 upload/templates/default/report_index_body.tpl create mode 100644 upload/templates/default/report_list_body.tpl create mode 100644 upload/templates/default/report_module_edit_body.tpl create mode 100644 upload/templates/default/report_module_reasons_body.tpl create mode 100644 upload/templates/default/report_modules_body.tpl create mode 100644 upload/templates/default/report_open_body.tpl create mode 100644 upload/templates/default/report_reason_edit_body.tpl create mode 100644 upload/templates/default/report_view_body.tpl create mode 100644 upload/templates/default/rss_body.tpl create mode 100644 upload/templates/default/search.tpl create mode 100644 upload/templates/default/search_results.tpl create mode 100644 upload/templates/default/topic_templates/audiobooks.tpl create mode 100644 upload/templates/default/topic_templates/books.tpl create mode 100644 upload/templates/default/topic_templates/games.tpl create mode 100644 upload/templates/default/topic_templates/games_ps.tpl create mode 100644 upload/templates/default/topic_templates/games_psp.tpl create mode 100644 upload/templates/default/topic_templates/games_xbox.tpl create mode 100644 upload/templates/default/topic_templates/music.tpl create mode 100644 upload/templates/default/topic_templates/progs.tpl create mode 100644 upload/templates/default/topic_templates/progs_mac.tpl create mode 100644 upload/templates/default/topic_templates/sport.tpl create mode 100644 upload/templates/default/topic_templates/video.tpl create mode 100644 upload/templates/default/topic_templates/video_home.tpl create mode 100644 upload/templates/default/topic_templates/video_lesson.tpl create mode 100644 upload/templates/default/topic_templates/video_simple.tpl create mode 100644 upload/templates/default/torhelp.tpl create mode 100644 upload/templates/default/tpl_config.php create mode 100644 upload/templates/default/tracker.tpl create mode 100644 upload/templates/default/usercp_attachcp.tpl create mode 100644 upload/templates/default/usercp_avatar_gallery.tpl create mode 100644 upload/templates/default/usercp_email.tpl create mode 100644 upload/templates/default/usercp_register.tpl create mode 100644 upload/templates/default/usercp_sendpasswd.tpl create mode 100644 upload/templates/default/usercp_viewprofile.tpl create mode 100644 upload/templates/default/viewforum.tpl create mode 100644 upload/templates/default/viewonline.tpl create mode 100644 upload/templates/default/viewtopic.tpl create mode 100644 upload/templates/default/viewtopic_attach.tpl create mode 100644 upload/templates/default/viewtopic_attach_guest.tpl create mode 100644 upload/templates/default/viewtopic_poll.tpl create mode 100644 upload/templates/default/viewtopic_torrent.tpl create mode 100644 upload/templates/limit_load_exit.php create mode 100644 upload/templates/topic_tpl_overall_header.html create mode 100644 upload/templates/topic_tpl_rules_video.html create mode 100644 upload/templates/xs_mod/tpl/cache.tpl create mode 100644 upload/templates/xs_mod/tpl/config.tpl create mode 100644 upload/templates/xs_mod/tpl/frameset.tpl create mode 100644 upload/templates/xs_mod/tpl/index.tpl create mode 100644 upload/templates/xs_mod/tpl/message.tpl create mode 100644 upload/templates/xs_mod/tpl/xs_footer.tpl create mode 100644 upload/templates/xs_mod/tpl/xs_header.tpl create mode 100644 upload/tracker.php create mode 100644 upload/triggers/$on create mode 100644 upload/triggers/.htaccess create mode 100644 upload/triggers/cron_allowed create mode 100644 upload/viewforum.php create mode 100644 upload/viewonline.php create mode 100644 upload/viewtopic.php diff --git a/install/sphinx/sphinx.conf b/install/sphinx/sphinx.conf new file mode 100644 index 000000000..0f23247f9 --- /dev/null +++ b/install/sphinx/sphinx.conf @@ -0,0 +1,58 @@ +source torrentpier +{ + type = mysql + sql_host = localhost + sql_user = user + sql_pass = user + sql_db = forum + sql_query_pre = SET NAMES utf8 + sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 + sql_query_pre = SET CHARACTER_SET_CLIENT=utf8 + sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 +} + +source topics: torrentpier +{ + sql_query = \ + SELECT topic_id, forum_id, topic_title \ + FROM bb_topics \ + WHERE topic_id BETWEEN $start AND $end + + sql_query_range = SELECT MIN(topic_id), MAX(topic_id) FROM bb_topics + sql_range_step = 100000 + + sql_attr_uint = forum_id + sql_ranged_throttle = 50 + sql_query_info = SELECT * FROM bb_topics WHERE topic_id = $id +} + +index topics +{ + docinfo = extern + morphology = stem_enru + charset_type = utf-8 + charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42C->U+430..U+44C, U+42E..U+42F->U+44E..U+44F, U+430..U+44C, U+44E..U+44F, U+0401->U+0435, U+0451->U+0435, U+042D->U+0435, U+044D->U+0435 + min_prefix_len = 2 + min_infix_len = 0 + min_word_len = 1 + enable_star = 1 + html_strip = 1 + path = ./sphinx/data/topics + source = topics +} + +indexer +{ + mem_limit = 256M +} + +searchd +{ + listen = 127.0.0.1:3312 + log = ./sphinx/log/searchd.log + query_log = ./sphinx/log/query.log + read_timeout = 5 + max_children = 15 + max_matches = 5000 + pid_file = ./sphinx/searchd.pid +} \ No newline at end of file diff --git a/install/sql/mysql.sql b/install/sql/mysql.sql new file mode 100644 index 000000000..a93de11bb --- /dev/null +++ b/install/sql/mysql.sql @@ -0,0 +1,1763 @@ +-- phpMyAdmin SQL Dump +-- version 2.10.3 +-- http://www.phpmyadmin.net +-- +-- Хост: localhost +-- Время создания: Июн 17 2008 г., 13:37 +-- Версия сервера: 5.0.51 +-- Версия PHP: 5.2.6 + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + +-- +-- Удаление старых таблиц +-- + +DROP TABLE IF EXISTS `bb_ads`; +DROP TABLE IF EXISTS `bb_attach_quota`; +DROP TABLE IF EXISTS `bb_attachments`; +DROP TABLE IF EXISTS `bb_attachments_config`; +DROP TABLE IF EXISTS `bb_attachments_desc`; +DROP TABLE IF EXISTS `bb_auth_access`; +DROP TABLE IF EXISTS `bb_auth_access_snap`; +DROP TABLE IF EXISTS `bb_banlist`; +DROP TABLE IF EXISTS `bb_bt_dlstatus_main`; +DROP TABLE IF EXISTS `bb_bt_dlstatus_mrg`; +DROP TABLE IF EXISTS `bb_bt_dlstatus_new`; +DROP TABLE IF EXISTS `bb_bt_dlstatus_snap`; +DROP TABLE IF EXISTS `bb_bt_last_torstat`; +DROP TABLE IF EXISTS `bb_bt_last_userstat`; +DROP TABLE IF EXISTS `bb_bt_torhelp`; +DROP TABLE IF EXISTS `bb_bt_torrents`; +DROP TABLE IF EXISTS `bb_bt_torstat`; +DROP TABLE IF EXISTS `bb_bt_tracker`; +DROP TABLE IF EXISTS `bb_bt_tracker_snap`; +DROP TABLE IF EXISTS `bb_bt_user_settings`; +DROP TABLE IF EXISTS `bb_bt_users`; +DROP TABLE IF EXISTS `bb_captcha`; +DROP TABLE IF EXISTS `bb_categories`; +DROP TABLE IF EXISTS `bb_config`; +DROP TABLE IF EXISTS `bb_countries`; +DROP TABLE IF EXISTS `bb_cron`; +DROP TABLE IF EXISTS `bb_datastore`; +DROP TABLE IF EXISTS `bb_disallow`; +DROP TABLE IF EXISTS `bb_extension_groups`; +DROP TABLE IF EXISTS `bb_extensions`; +DROP TABLE IF EXISTS `bb_forums`; +DROP TABLE IF EXISTS `bb_groups`; +DROP TABLE IF EXISTS `bb_log`; +DROP TABLE IF EXISTS `bb_posts`; +DROP TABLE IF EXISTS `bb_posts_html`; +DROP TABLE IF EXISTS `bb_posts_search`; +DROP TABLE IF EXISTS `bb_posts_text`; +DROP TABLE IF EXISTS `bb_privmsgs`; +DROP TABLE IF EXISTS `bb_privmsgs_text`; +DROP TABLE IF EXISTS `bb_quota_limits`; +DROP TABLE IF EXISTS `bb_ranks`; +DROP TABLE IF EXISTS `bb_reports`; +DROP TABLE IF EXISTS `bb_reports_changes`; +DROP TABLE IF EXISTS `bb_reports_modules`; +DROP TABLE IF EXISTS `bb_reports_reasons`; +DROP TABLE IF EXISTS `bb_search_rebuild`; +DROP TABLE IF EXISTS `bb_search_results`; +DROP TABLE IF EXISTS `bb_sessions`; +DROP TABLE IF EXISTS `bb_smilies`; +DROP TABLE IF EXISTS `bb_topic_templates`; +DROP TABLE IF EXISTS `bb_topics`; +DROP TABLE IF EXISTS `bb_topics_watch`; +DROP TABLE IF EXISTS `bb_user_group`; +DROP TABLE IF EXISTS `bb_users`; +DROP TABLE IF EXISTS `bb_vote_desc`; +DROP TABLE IF EXISTS `bb_vote_results`; +DROP TABLE IF EXISTS `bb_vote_voters`; +DROP TABLE IF EXISTS `bb_words`; +DROP TABLE IF EXISTS `buf_last_seeder`; +DROP TABLE IF EXISTS `buf_topic_view`; +-- +-- Структура таблицы `bb_ads` +-- + +CREATE TABLE `bb_ads` ( + `ad_id` mediumint(8) unsigned NOT NULL auto_increment, + `ad_block_ids` varchar(255) NOT NULL default '', + `ad_start_time` datetime NOT NULL default '0000-00-00 00:00:00', + `ad_active_days` smallint(6) NOT NULL default '0', + `ad_status` tinyint(4) NOT NULL default '1', + `ad_desc` varchar(255) NOT NULL default '', + `ad_html` text NOT NULL, + PRIMARY KEY (`ad_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_attachments` +-- + +CREATE TABLE `bb_attachments` ( + `attach_id` mediumint(8) unsigned NOT NULL default '0', + `post_id` mediumint(8) unsigned NOT NULL default '0', + `user_id_1` mediumint(8) NOT NULL default '0', + PRIMARY KEY (`attach_id`, `post_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_attachments_config` +-- + +CREATE TABLE `bb_attachments_config` ( + `config_name` varchar(255) NOT NULL default '', + `config_value` varchar(255) NOT NULL default '', + PRIMARY KEY (`config_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Дамп данных таблицы `bb_attachments_config` +-- + +INSERT INTO `bb_attachments_config` VALUES ('upload_dir', 'files'); +INSERT INTO `bb_attachments_config` VALUES ('upload_img', 'images/icon_clip.gif'); +INSERT INTO `bb_attachments_config` VALUES ('topic_icon', 'images/icon_clip.gif'); +INSERT INTO `bb_attachments_config` VALUES ('display_order', '0'); +INSERT INTO `bb_attachments_config` VALUES ('max_filesize', '262144'); +INSERT INTO `bb_attachments_config` VALUES ('attachment_quota', '52428800'); +INSERT INTO `bb_attachments_config` VALUES ('max_filesize_pm', '262144'); +INSERT INTO `bb_attachments_config` VALUES ('max_attachments', '1'); +INSERT INTO `bb_attachments_config` VALUES ('max_attachments_pm', '1'); +INSERT INTO `bb_attachments_config` VALUES ('disable_mod', '0'); +INSERT INTO `bb_attachments_config` VALUES ('allow_pm_attach', '1'); +INSERT INTO `bb_attachments_config` VALUES ('allow_ftp_upload', '0'); +INSERT INTO `bb_attachments_config` VALUES ('attach_version', '2.3.14'); +INSERT INTO `bb_attachments_config` VALUES ('default_upload_quota', '0'); +INSERT INTO `bb_attachments_config` VALUES ('default_pm_quota', '0'); +INSERT INTO `bb_attachments_config` VALUES ('ftp_server', ''); +INSERT INTO `bb_attachments_config` VALUES ('ftp_path', ''); +INSERT INTO `bb_attachments_config` VALUES ('download_path', ''); +INSERT INTO `bb_attachments_config` VALUES ('ftp_user', ''); +INSERT INTO `bb_attachments_config` VALUES ('ftp_pass', ''); +INSERT INTO `bb_attachments_config` VALUES ('ftp_pasv_mode', '1'); +INSERT INTO `bb_attachments_config` VALUES ('img_display_inlined', '1'); +INSERT INTO `bb_attachments_config` VALUES ('img_max_width', '200'); +INSERT INTO `bb_attachments_config` VALUES ('img_max_height', '200'); +INSERT INTO `bb_attachments_config` VALUES ('img_link_width', '0'); +INSERT INTO `bb_attachments_config` VALUES ('img_link_height', '0'); +INSERT INTO `bb_attachments_config` VALUES ('img_create_thumbnail', '0'); +INSERT INTO `bb_attachments_config` VALUES ('img_min_thumb_filesize', '12000'); +INSERT INTO `bb_attachments_config` VALUES ('img_imagick', '/usr/bin/convert'); +INSERT INTO `bb_attachments_config` VALUES ('use_gd2', '1'); +INSERT INTO `bb_attachments_config` VALUES ('wma_autoplay', '0'); +INSERT INTO `bb_attachments_config` VALUES ('flash_autoplay', '0'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_attachments_desc` +-- + +CREATE TABLE `bb_attachments_desc` ( + `attach_id` mediumint(8) unsigned NOT NULL auto_increment, + `physical_filename` varchar(255) NOT NULL default '', + `real_filename` varchar(255) NOT NULL default '', + `download_count` mediumint(8) unsigned NOT NULL default '0', + `comment` varchar(255) NOT NULL default '', + `extension` varchar(100) NOT NULL default '', + `mimetype` varchar(100) NOT NULL default '', + `filesize` int(20) NOT NULL default '0', + `filetime` int(11) NOT NULL default '0', + `thumbnail` tinyint(1) NOT NULL default '0', + `tracker_status` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`attach_id`), + KEY `filetime` (`filetime`), + KEY `filesize` (`filesize`), + KEY `physical_filename` (`physical_filename`(10)) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_attach_quota` +-- + +CREATE TABLE `bb_attach_quota` ( + `user_id` mediumint(8) unsigned NOT NULL default '0', + `group_id` mediumint(8) unsigned NOT NULL default '0', + `quota_type` smallint(2) NOT NULL default '0', + `quota_limit_id` mediumint(8) unsigned NOT NULL default '0', + KEY `quota_type` (`quota_type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_auth_access` +-- + +CREATE TABLE `bb_auth_access` ( + `group_id` mediumint(8) NOT NULL default '0', + `forum_id` smallint(5) unsigned NOT NULL default '0', + `forum_perm` int(11) NOT NULL default '0', + PRIMARY KEY (`group_id`,`forum_id`), + KEY `forum_id` (`forum_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_auth_access_snap` +-- + +CREATE TABLE `bb_auth_access_snap` ( + `user_id` mediumint(9) NOT NULL default '0', + `forum_id` smallint(6) NOT NULL default '0', + `forum_perm` int(11) NOT NULL default '0', + PRIMARY KEY (`user_id`,`forum_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_banlist` +-- + +CREATE TABLE `bb_banlist` ( + `ban_id` mediumint(8) unsigned NOT NULL auto_increment, + `ban_userid` mediumint(8) NOT NULL default '0', + `ban_ip` varchar(32) NOT NULL default '', + `ban_email` varchar(255) NOT NULL default '', + PRIMARY KEY (`ban_id`), + KEY `ban_ip_user_id` (`ban_ip`,`ban_userid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_dlstatus_main` +-- + +CREATE TABLE `bb_bt_dlstatus_main` ( + `user_id` mediumint(9) NOT NULL default '0', + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_status` tinyint(1) NOT NULL default '0', + `last_modified_dlstatus` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + PRIMARY KEY (`user_id`,`topic_id`), + KEY `topic_id` (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_dlstatus_new` +-- + +CREATE TABLE `bb_bt_dlstatus_new` ( + `user_id` mediumint(9) NOT NULL default '0', + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_status` tinyint(1) NOT NULL default '0', + `last_modified_dlstatus` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + PRIMARY KEY (`user_id`,`topic_id`), + KEY `topic_id` (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_dlstatus_mrg` +-- + +CREATE TABLE `bb_bt_dlstatus_mrg` ( + `user_id` mediumint(9) NOT NULL default '0', + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_status` tinyint(1) NOT NULL default '0', + `last_modified_dlstatus` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + KEY `user_topic` (`user_id`,`topic_id`), + KEY `topic_id` (`topic_id`) +) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(`bb_bt_dlstatus_main`,`bb_bt_dlstatus_new`); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_dlstatus_snap` +-- + +CREATE TABLE `bb_bt_dlstatus_snap` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `dl_status` tinyint(4) NOT NULL default '0', + `users_count` smallint(5) unsigned NOT NULL default '0', + KEY `topic_id` (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_last_torstat` +-- + +CREATE TABLE `bb_bt_last_torstat` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_id` mediumint(9) NOT NULL default '0', + `dl_status` tinyint(1) NOT NULL default '0', + `up_add` bigint(20) unsigned NOT NULL default '0', + `down_add` bigint(20) unsigned NOT NULL default '0', + `release_add` bigint(20) unsigned NOT NULL default '0', + `bonus_add` bigint(20) unsigned NOT NULL default '0', + `speed_up` bigint(20) unsigned NOT NULL default '0', + `speed_down` bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY USING BTREE (`topic_id`,`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_last_userstat` +-- + +CREATE TABLE `bb_bt_last_userstat` ( + `user_id` mediumint(9) NOT NULL default '0', + `up_add` bigint(20) unsigned NOT NULL default '0', + `down_add` bigint(20) unsigned NOT NULL default '0', + `release_add` bigint(20) unsigned NOT NULL default '0', + `bonus_add` bigint(20) unsigned NOT NULL default '0', + `speed_up` bigint(20) unsigned NOT NULL default '0', + `speed_down` bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_torhelp` +-- + +CREATE TABLE `bb_bt_torhelp` ( + `user_id` mediumint(9) NOT NULL default '0', + `topic_id_csv` text NOT NULL, + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_torrents` +-- + +CREATE TABLE `bb_bt_torrents` ( + `info_hash` varbinary(20) NOT NULL, + `post_id` mediumint(8) unsigned NOT NULL default '0', + `poster_id` mediumint(9) NOT NULL default '0', + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `forum_id` smallint(5) unsigned NOT NULL default '0', + `attach_id` mediumint(8) unsigned NOT NULL default '0', + `size` bigint(20) unsigned NOT NULL default '0', + `reg_time` int(11) NOT NULL default '0', + `call_seed_time` int(11) NOT NULL default '0', + `complete_count` mediumint(8) unsigned NOT NULL default '0', + `seeder_last_seen` int(11) NOT NULL default '0', + `tor_status` tinyint(4) NOT NULL default '0', + `checked_user_id` mediumint(8) NOT NULL default '0', + `checked_time` int(11) NOT NULL default '0', + `tor_type` TINYINT(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`info_hash`), + UNIQUE KEY `post_id` (`post_id`), + UNIQUE KEY `topic_id` (`topic_id`), + UNIQUE KEY `attach_id` (`attach_id`), + KEY `reg_time` (`reg_time`), + KEY `forum_id` (`forum_id`), + KEY `poster_id` (`poster_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_torstat` +-- + +CREATE TABLE `bb_bt_torstat` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_id` mediumint(9) NOT NULL default '0', + `last_modified_torstat` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + `completed` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`topic_id`,`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_tracker` +-- + +CREATE TABLE `bb_bt_tracker` ( + `peer_hash` varchar(32) character set utf8 collate utf8_bin NOT NULL default '', + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_id` mediumint(9) NOT NULL default '0', + `ip` char(8) character set utf8 collate utf8_bin NOT NULL default '0', + `ipv6` varchar(32) DEFAULT NULL, + `port` smallint(5) unsigned NOT NULL default '0', + `seeder` tinyint(1) NOT NULL default '0', + `releaser` tinyint(1) NOT NULL default '0', + `tor_type` TINYINT(1) NOT NULL DEFAULT '0', + `uploaded` bigint(20) unsigned NOT NULL default '0', + `downloaded` bigint(20) unsigned NOT NULL default '0', + `remain` bigint(20) unsigned NOT NULL default '0', + `speed_up` mediumint(8) unsigned NOT NULL default '0', + `speed_down` mediumint(8) unsigned NOT NULL default '0', + `up_add` bigint(20) unsigned NOT NULL default '0', + `down_add` bigint(20) unsigned NOT NULL default '0', + `update_time` int(11) NOT NULL default '0', + `xbt_error` varchar(200) DEFAULT NULL, + `ul_gdc` bigint(20) unsigned NOT NULL DEFAULT '0', + `ul_gdc_c` mediumint(9) unsigned NOT NULL DEFAULT '0', + `ul_16k_c` mediumint(9) unsigned NOT NULL DEFAULT '0', + `ul_eq_dl` mediumint(9) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`peer_hash`), + KEY `topic_id` (`topic_id`), + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_tracker_snap` +-- + +CREATE TABLE `bb_bt_tracker_snap` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `seeders` mediumint(8) unsigned NOT NULL default '0', + `leechers` mediumint(8) unsigned NOT NULL default '0', + `speed_up` int(10) unsigned NOT NULL default '0', + `speed_down` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_users` +-- + +CREATE TABLE `bb_bt_users` ( + `user_id` mediumint(9) NOT NULL default '0', + `auth_key` char(10) character set utf8 collate utf8_bin NOT NULL default '', + `u_up_total` bigint(20) unsigned NOT NULL default '0', + `u_down_total` bigint(20) unsigned NOT NULL default '0', + `u_up_release` bigint(20) unsigned NOT NULL default '0', + `u_up_bonus` bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (`user_id`), + UNIQUE KEY `auth_key` (`auth_key`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_bt_user_settings` +-- + +CREATE TABLE `bb_bt_user_settings` ( + `user_id` mediumint(9) NOT NULL default '0', + `tor_search_set` text NOT NULL, + `last_modified` int(11) NOT NULL default '0', + PRIMARY KEY (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_captcha` +-- + +CREATE TABLE `bb_captcha` ( + `cap_id` int(10) NOT NULL, + `cap_code` char(6) NOT NULL, + `cap_expire` int(11) NOT NULL default '0', + PRIMARY KEY (`cap_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_categories` +-- + +CREATE TABLE `bb_categories` ( + `cat_id` smallint(5) unsigned NOT NULL auto_increment, + `cat_title` varchar(100) NOT NULL default '', + `cat_order` smallint(5) unsigned NOT NULL default '0', + PRIMARY KEY (`cat_id`), + KEY `cat_order` (`cat_order`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `bb_categories` +-- + +INSERT INTO `bb_categories` VALUES (1, 'Test category 1', 10); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_config` +-- + +CREATE TABLE `bb_config` ( + `config_name` varchar(255) NOT NULL default '', + `config_value` text NOT NULL, + PRIMARY KEY (`config_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Дамп данных таблицы `bb_config` +-- + +INSERT INTO `bb_config` VALUES ('allow_autologin', '1'); +INSERT INTO `bb_config` VALUES ('allow_avatar_local', '0'); +INSERT INTO `bb_config` VALUES ('allow_avatar_remote', '0'); +INSERT INTO `bb_config` VALUES ('allow_avatar_upload', '1'); +INSERT INTO `bb_config` VALUES ('allow_bbcode', '1'); +INSERT INTO `bb_config` VALUES ('allow_namechange', '0'); +INSERT INTO `bb_config` VALUES ('allow_sig', '1'); +INSERT INTO `bb_config` VALUES ('allow_smilies', '1'); +INSERT INTO `bb_config` VALUES ('avatar_filesize', '10000'); +INSERT INTO `bb_config` VALUES ('avatar_gallery_path', 'images/avatars/gallery'); +INSERT INTO `bb_config` VALUES ('avatar_max_height', '100'); +INSERT INTO `bb_config` VALUES ('avatar_max_width', '100'); +INSERT INTO `bb_config` VALUES ('avatar_path', 'images/avatars'); +INSERT INTO `bb_config` VALUES ('board_disable', '0'); +INSERT INTO `bb_config` VALUES ('board_email', 'board_email@yourdomain.com'); +INSERT INTO `bb_config` VALUES ('board_email_form', '0'); +INSERT INTO `bb_config` VALUES ('board_email_sig', 'Thanks, The Management'); +INSERT INTO `bb_config` VALUES ('board_startdate', '1211477514'); +INSERT INTO `bb_config` VALUES ('board_timezone', '0'); +INSERT INTO `bb_config` VALUES ('bt_add_auth_key', '1'); +INSERT INTO `bb_config` VALUES ('bt_add_comment', ''); +INSERT INTO `bb_config` VALUES ('bt_add_publisher', 'YourSiteName'); +INSERT INTO `bb_config` VALUES ('bt_allow_spmode_change', '1'); +INSERT INTO `bb_config` VALUES ('bt_announce_url', 'http://yourdomain.com/bt/announce.php'); +INSERT INTO `bb_config` VALUES ('bt_disable_dht', '1'); +INSERT INTO `bb_config` VALUES ('bt_check_announce_url', '0'); +INSERT INTO `bb_config` VALUES ('bt_del_addit_ann_urls', '1'); +INSERT INTO `bb_config` VALUES ('bt_dl_list_only_1st_page', '1'); +INSERT INTO `bb_config` VALUES ('bt_dl_list_only_count', '1'); +INSERT INTO `bb_config` VALUES ('bt_gen_passkey_on_reg', '1'); +INSERT INTO `bb_config` VALUES ('bt_newtopic_auto_reg', '1'); +INSERT INTO `bb_config` VALUES ('bt_replace_ann_url', '1'); +INSERT INTO `bb_config` VALUES ('bt_search_bool_mode', '1'); +INSERT INTO `bb_config` VALUES ('bt_set_dltype_on_tor_reg', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_but_cancel', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_but_compl', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_but_down', '0'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_but_will', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_list', '0'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_list_buttons', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_dl_stat_on_index', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_ip_only_moder', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_peers', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_peers_mode', '1'); +INSERT INTO `bb_config` VALUES ('bt_show_port_only_moder', '1'); +INSERT INTO `bb_config` VALUES ('bt_tor_browse_only_reg', '0'); +INSERT INTO `bb_config` VALUES ('bt_unset_dltype_on_tor_unreg', '0'); +INSERT INTO `bb_config` VALUES ('config_id', '1'); +INSERT INTO `bb_config` VALUES ('cron_last_check', '1211477514'); +INSERT INTO `bb_config` VALUES ('default_dateformat', 'Y-m-d H:i'); +INSERT INTO `bb_config` VALUES ('default_lang', 'russian'); +INSERT INTO `bb_config` VALUES ('enable_confirm', '1'); +INSERT INTO `bb_config` VALUES ('flood_interval', '15'); +INSERT INTO `bb_config` VALUES ('hot_threshold', '300'); +INSERT INTO `bb_config` VALUES ('login_reset_time', '30'); +INSERT INTO `bb_config` VALUES ('max_autologin_time', '10'); +INSERT INTO `bb_config` VALUES ('max_inbox_privmsgs', '200'); +INSERT INTO `bb_config` VALUES ('max_login_attempts', '5'); +INSERT INTO `bb_config` VALUES ('max_poll_options', '6'); +INSERT INTO `bb_config` VALUES ('max_savebox_privmsgs', '50'); +INSERT INTO `bb_config` VALUES ('max_sentbox_privmsgs', '25'); +INSERT INTO `bb_config` VALUES ('max_sig_chars', '255'); +INSERT INTO `bb_config` VALUES ('posts_per_page', '15'); +INSERT INTO `bb_config` VALUES ('privmsg_disable', '0'); +INSERT INTO `bb_config` VALUES ('prune_enable', '1'); +INSERT INTO `bb_config` VALUES ('record_online_date', '1211477508'); +INSERT INTO `bb_config` VALUES ('record_online_users', '2'); +INSERT INTO `bb_config` VALUES ('require_activation', '0'); +INSERT INTO `bb_config` VALUES ('sendmail_fix', '0'); +INSERT INTO `bb_config` VALUES ('site_desc', 'A _little_ text to describe your forum'); +INSERT INTO `bb_config` VALUES ('sitename', 'yourdomain.com'); +INSERT INTO `bb_config` VALUES ('smilies_path', 'images/smiles'); +INSERT INTO `bb_config` VALUES ('smtp_delivery', '0'); +INSERT INTO `bb_config` VALUES ('smtp_host', ''); +INSERT INTO `bb_config` VALUES ('smtp_password', ''); +INSERT INTO `bb_config` VALUES ('smtp_username', ''); +INSERT INTO `bb_config` VALUES ('topics_per_page', '50'); +INSERT INTO `bb_config` VALUES ('version', '.0.22'); +INSERT INTO `bb_config` VALUES ('xs_add_comments', '0'); +INSERT INTO `bb_config` VALUES ('xs_auto_compile', '1'); +INSERT INTO `bb_config` VALUES ('xs_auto_recompile', '1'); +INSERT INTO `bb_config` VALUES ('xs_php', 'php'); +INSERT INTO `bb_config` VALUES ('xs_shownav', '17'); +INSERT INTO `bb_config` VALUES ('xs_template_time', '0'); +INSERT INTO `bb_config` VALUES ('xs_use_cache', '1'); +INSERT INTO `bb_config` VALUES ('xs_version', '8'); +INSERT INTO `bb_config` VALUES ('active_ads', 'a:0:{}'); +INSERT INTO `bb_config` VALUES ('report_subject_auth', '1'); +INSERT INTO `bb_config` VALUES ('report_modules_cache', '1'); +INSERT INTO `bb_config` VALUES ('report_hack_count', '0'); +INSERT INTO `bb_config` VALUES ('report_notify', '0'); +INSERT INTO `bb_config` VALUES ('report_list_admin', '0'); +INSERT INTO `bb_config` VALUES ('report_new_window', '0'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_countries` +-- + +CREATE TABLE `bb_countries` ( + `country_id` mediumint(3) NOT NULL auto_increment, + `country_code` varchar(3) NOT NULL default '0', + `country_code2` varchar(2) NOT NULL, + `country_code3` varchar(3) NOT NULL, + PRIMARY KEY (`country_id`), + KEY `country_code2` (`country_code2`), + KEY `country_code3` (`country_code3`), + KEY `country_code` (`country_code`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=245 ; + +-- +-- Дамп данных таблицы `bb_countries` +-- + +INSERT INTO `bb_countries` (`country_id`, `country_code`, `country_code2`, `country_code3`) VALUES +(1, '036', 'AU', 'AUS'), +(2, '040', 'AT', 'AUT'), +(3, '031', 'AZ', 'AZE'), +(4, '248', 'AX', 'ALA'), +(5, '008', 'AL', 'ALB'), +(6, '012', 'DZ', 'DZA'), +(7, '581', 'UM', 'UMI'), +(8, '850', 'VI', 'VIR'), +(9, '016', 'AS', 'ASM'), +(10, '660', 'AI', 'AIA'), +(11, '024', 'AO', 'AGO'), +(12, '020', 'AD', 'AND'), +(13, '010', 'AQ', 'ATA'), +(14, '028', 'AG', 'ATG'), +(15, '032', 'AR', 'ARG'), +(16, '051', 'AM', 'ARM'), +(17, '533', 'AW', 'ABW'), +(18, '004', 'AF', 'AFG'), +(19, '044', 'BS', 'BHS'), +(20, '050', 'BD', 'BGD'), +(21, '052', 'BB', 'BRB'), +(22, '048', 'BH', 'BHR'), +(23, '084', 'BZ', 'BLZ'), +(24, '112', 'BY', 'BLR'), +(25, '056', 'BE', 'BEL'), +(26, '204', 'BJ', 'BEN'), +(27, '060', 'BM', 'BMU'), +(28, '100', 'BG', 'BGR'), +(29, '068', 'BO', 'BOL'), +(30, '070', 'BA', 'BIH'), +(31, '072', 'BW', 'BWA'), +(32, '076', 'BR', 'BRA'), +(33, '086', 'IO', 'IOT'), +(34, '092', 'VG', 'VGB'), +(35, '096', 'BN', 'BRN'), +(36, '854', 'BF', 'BFA'), +(37, '108', 'BI', 'BDI'), +(38, '064', 'BT', 'BTN'), +(39, '548', 'VU', 'VUT'), +(40, '336', 'VA', 'VAT'), +(41, '826', 'GB', 'GBR'), +(42, '348', 'HU', 'HUN'), +(43, '862', 'VE', 'VEN'), +(44, '626', 'TL', 'TLS'), +(45, '704', 'VN', 'VNM'), +(46, '266', 'GA', 'GAB'), +(47, '332', 'HT', 'HTI'), +(48, '328', 'GY', 'GUY'), +(49, '270', 'GM', 'GMB'), +(50, '288', 'GH', 'GHA'), +(51, '312', 'GP', 'GLP'), +(52, '320', 'GT', 'GTM'), +(53, '324', 'GN', 'GIN'), +(54, '624', 'GW', 'GNB'), +(55, '276', 'DE', 'DEU'), +(56, '292', 'GI', 'GIB'), +(57, '340', 'HN', 'HND'), +(58, '344', 'HK', 'HKG'), +(59, '308', 'GD', 'GRD'), +(60, '304', 'GL', 'GRL'), +(61, '300', 'GR', 'GRC'), +(62, '268', 'GE', 'GEO'), +(63, '316', 'GU', 'GUM'), +(64, '208', 'DK', 'DNK'), +(65, '180', 'CD', 'COD'), +(66, '262', 'DJ', 'DJI'), +(67, '212', 'DM', 'DMA'), +(68, '214', 'DO', 'DOM'), +(69, 'EU', 'EU', ''), +(70, '818', 'EG', 'EGY'), +(71, '894', 'ZM', 'ZMB'), +(72, '732', 'EH', 'ESH'), +(73, '716', 'ZW', 'ZWE'), +(74, '376', 'IL', 'ISR'), +(75, '356', 'IN', 'IND'), +(76, '360', 'ID', 'IDN'), +(77, '400', 'JO', 'JOR'), +(78, '368', 'IQ', 'IRQ'), +(79, '364', 'IR', 'IRN'), +(80, '372', 'IE', 'IRL'), +(81, '352', 'IS', 'ISL'), +(82, '724', 'ES', 'ESP'), +(83, '380', 'IT', 'ITA'), +(84, '887', 'YE', 'YEM'), +(85, '408', 'KP', 'PRK'), +(86, '132', 'CV', 'CPV'), +(87, '398', 'KZ', 'KAZ'), +(88, '136', 'KY', 'CYM'), +(89, '116', 'KH', 'KHM'), +(90, '120', 'CM', 'CMR'), +(91, '124', 'CA', 'CAN'), +(92, '634', 'QA', 'QAT'), +(93, '404', 'KE', 'KEN'), +(94, '196', 'CY', 'CYP'), +(95, '417', 'KG', 'KGZ'), +(96, '296', 'KI', 'KIR'), +(97, '156', 'CN', 'CHN'), +(98, '166', 'CC', 'CCK'), +(99, '170', 'CO', 'COL'), +(100, '174', 'KM', 'COM'), +(101, '188', 'CR', 'CRI'), +(102, '384', 'CI', 'CIV'), +(103, '192', 'CU', 'CUB'), +(104, '414', 'KW', 'KWT'), +(105, '418', 'LA', 'LAO'), +(106, '428', 'LV', 'LVA'), +(107, '426', 'LS', 'LSO'), +(108, '430', 'LR', 'LBR'), +(109, '422', 'LB', 'LBN'), +(110, '434', 'LY', 'LBY'), +(111, '440', 'LT', 'LTU'), +(112, '438', 'LI', 'LIE'), +(113, '442', 'LU', 'LUX'), +(114, '480', 'MU', 'MUS'), +(115, '478', 'MR', 'MRT'), +(116, '450', 'MG', 'MDG'), +(117, '175', 'YT', 'MYT'), +(118, '446', 'MO', 'MAC'), +(119, '807', 'MK', 'MKD'), +(120, '454', 'MW', 'MWI'), +(121, '458', 'MY', 'MYS'), +(122, '466', 'ML', 'MLI'), +(123, '462', 'MV', 'MDV'), +(124, '470', 'MT', 'MLT'), +(125, '504', 'MA', 'MAR'), +(126, '474', 'MQ', 'MTQ'), +(127, '584', 'MH', 'MHL'), +(128, '484', 'MX', 'MEX'), +(129, '508', 'MZ', 'MOZ'), +(130, '498', 'MD', 'MDA'), +(131, '492', 'MC', 'MCO'), +(132, '496', 'MN', 'MNG'), +(133, '500', 'MS', 'MSR'), +(134, '104', 'MM', 'MMR'), +(135, '516', 'NA', 'NAM'), +(136, '520', 'NR', 'NRU'), +(137, '524', 'NP', 'NPL'), +(138, '562', 'NE', 'NER'), +(139, '566', 'NG', 'NGA'), +(140, '530', 'AN', 'ANT'), +(141, '528', 'NL', 'NLD'), +(142, '558', 'NI', 'NIC'), +(143, '570', 'NU', 'NIU'), +(144, '540', 'NC', 'NCL'), +(145, '554', 'NZ', 'NZL'), +(146, '578', 'NO', 'NOR'), +(147, '784', 'AE', 'ARE'), +(148, '512', 'OM', 'OMN'), +(149, '162', 'CX', 'CXR'), +(150, '184', 'CK', 'COK'), +(151, '334', 'HM', 'HMD'), +(152, '586', 'PK', 'PAK'), +(153, '585', 'PW', 'PLW'), +(154, '275', 'PS', 'PSE'), +(155, '591', 'PA', 'PAN'), +(156, '598', 'PG', 'PNG'), +(157, '600', 'PY', 'PRY'), +(158, '604', 'PE', 'PER'), +(159, '612', 'PN', 'PCN'), +(160, '616', 'PL', 'POL'), +(161, '620', 'PT', 'PRT'), +(162, '630', 'PR', 'PRI'), +(163, '178', 'CG', 'COG'), +(164, '638', 'RE', 'REU'), +(165, '643', 'RU', 'RUS'), +(166, '646', 'RW', 'RWA'), +(167, '642', 'RO', 'ROU'), +(168, '840', 'US', 'USA'), +(169, '222', 'SV', 'SLV'), +(170, '882', 'WS', 'WSM'), +(171, '674', 'SM', 'SMR'), +(172, '678', 'ST', 'STP'), +(173, '682', 'SA', 'SAU'), +(174, '748', 'SZ', 'SWZ'), +(175, '744', 'SJ', 'SJM'), +(176, '580', 'MP', 'MNP'), +(177, '690', 'SC', 'SYC'), +(178, '686', 'SN', 'SEN'), +(179, '670', 'VC', 'VCT'), +(180, '659', 'KN', 'KNA'), +(181, '662', 'LC', 'LCA'), +(182, '666', 'PM', 'SPM'), +(183, '688', 'RS', 'SRB'), +(184, '891', 'CS', 'SCG'), +(185, '702', 'SG', 'SGP'), +(186, '760', 'SY', 'SYR'), +(187, '703', 'SK', 'SVK'), +(188, '705', 'SI', 'SVN'), +(189, '090', 'SB', 'SLB'), +(190, '706', 'SO', 'SOM'), +(191, '736', 'SD', 'SDN'), +(192, '740', 'SR', 'SUR'), +(193, '694', 'SL', 'SLE'), +(194, '810', 'SU', 'SUN'), +(195, '762', 'TJ', 'TJK'), +(196, '764', 'TH', 'THA'), +(197, '158', 'TW', 'TWN'), +(198, '834', 'TZ', 'TZA'), +(199, '768', 'TG', 'TGO'), +(200, '772', 'TK', 'TKL'), +(201, '776', 'TO', 'TON'), +(202, '780', 'TT', 'TTO'), +(203, '798', 'TV', 'TUV'), +(204, '788', 'TN', 'TUN'), +(205, '795', 'TM', 'TKM'), +(206, '792', 'TR', 'TUR'), +(207, '800', 'UG', 'UGA'), +(208, '860', 'UZ', 'UZB'), +(209, '804', 'UA', 'UKR'), +(210, '858', 'UY', 'URY'), +(211, '234', 'FO', 'FRO'), +(212, '583', 'FM', 'FSM'), +(213, '242', 'FJ', 'FJI'), +(214, '608', 'PH', 'PHL'), +(215, '246', 'FI', 'FIN'), +(216, '238', 'FK', 'FLK'), +(217, '250', 'FR', 'FRA'), +(218, '254', 'GF', 'GUF'), +(219, '258', 'PF', 'PYF'), +(220, '260', 'TF', 'ATF'), +(221, '191', 'HR', 'HRV'), +(222, '140', 'CF', 'CAF'), +(223, '148', 'TD', 'TCD'), +(224, '499', 'ME', 'MNE'), +(225, '203', 'CZ', 'CZE'), +(226, '152', 'CL', 'CHL'), +(227, '756', 'CH', 'CHE'), +(228, '752', 'SE', 'SWE'), +(229, '144', 'LK', 'LKA'), +(230, '218', 'EC', 'ECU'), +(231, '226', 'GQ', 'GNQ'), +(232, '232', 'ER', 'ERI'), +(233, '233', 'EE', 'EST'), +(234, '231', 'ET', 'ETH'), +(235, '710', 'ZA', 'ZAF'), +(236, '410', 'KR', 'KOR'), +(237, '239', 'GS', 'SGS'), +(238, '388', 'JM', 'JAM'), +(239, '392', 'JP', 'JPN'), +(240, '074', 'BV', 'BVT'), +(241, '574', 'NF', 'NFK'), +(242, '654', 'SH', 'SHN'), +(243, '796', 'TC', 'TCA'), +(244, '876', 'WF', 'WLF'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_cron` +-- + +CREATE TABLE `bb_cron` ( + `cron_id` smallint(5) unsigned NOT NULL auto_increment, + `cron_active` tinyint(4) NOT NULL default '1', + `cron_title` char(120) NOT NULL default '', + `cron_script` char(120) NOT NULL default '', + `schedule` enum('hourly','daily','weekly','monthly','interval') NOT NULL default 'daily', + `run_day` enum('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28') default NULL, + `run_time` time default '04:00:00', + `run_order` tinyint(4) unsigned NOT NULL, + `last_run` datetime NOT NULL default '0000-00-00 00:00:00', + `next_run` datetime NOT NULL default '0000-00-00 00:00:00', + `run_interval` time default NULL, + `log_enabled` tinyint(1) NOT NULL default '0', + `log_file` char(120) NOT NULL default '', + `log_sql_queries` tinyint(4) NOT NULL default '0', + `disable_board` tinyint(1) NOT NULL default '0', + `run_counter` bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (`cron_id`), + UNIQUE KEY `title` (`cron_title`), + UNIQUE KEY `script` (`cron_script`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ; + +-- +-- Дамп данных таблицы `bb_cron` +-- + +INSERT INTO `bb_cron` VALUES (1, 0, 'Site backup', 'site_backup.php', 'daily', '1', '05:00:00', 10, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, 1, '', 0, 1, 0); +INSERT INTO `bb_cron` VALUES (2, 0, 'DB backup', 'db_backup.php', 'daily', '1', '05:00:00', 20, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, 1, '', 0, 1, 0); +INSERT INTO `bb_cron` VALUES (3, 1, 'Avatars cleanup', 'avatars_cleanup.php', 'weekly', '1', '05:00:00', 30, '2008-05-22 19:11:10', '2008-05-26 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (4, 1, 'Board maintenance', 'bb_maintenance.php', 'daily', NULL, '05:00:00', 40, '2008-05-22 19:11:14', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (5, 1, 'Prune forums', 'prune_forums.php', 'daily', NULL, '05:00:00', 50, '2008-05-22 19:11:17', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (6, 1, 'Prune topic moved stubs', 'prune_topic_moved.php', 'daily', NULL, '05:00:00', 60, '2008-05-22 19:11:20', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (7, 1, 'Logs cleanup', 'clean_log.php', 'daily', NULL, '05:00:00', 70, '2008-05-22 19:11:23', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (8, 1, 'Tracker maintenance', 'tr_maintenance.php', 'daily', NULL, '05:00:00', 90, '2008-05-22 19:11:26', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (9, 1, 'Clean dlstat', 'clean_dlstat.php', 'daily', NULL, '05:00:00', 100, '2008-05-22 19:11:29', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (10, 1, 'Prune inactive users', 'prune_inactive_users.php', 'daily', NULL, '05:00:00', 110, '2008-05-22 19:11:32', '2008-05-23 05:00:00', NULL, 1, '', 0, 1, 2); +INSERT INTO `bb_cron` VALUES (11, 1, 'Sessions cleanup', 'sessions_cleanup.php', 'interval', NULL, NULL, 255, '2008-05-22 19:18:07', '2008-05-22 19:21:07', '00:03:00', 0, '', 0, 0, 31); +INSERT INTO `bb_cron` VALUES (12, 1, 'DS update ''cat_forums''', 'ds_update_cat_forums.php', 'interval', NULL, NULL, 255, '2008-05-22 19:18:10', '2008-05-22 19:23:10', '00:05:00', 0, '', 0, 0, 24); +INSERT INTO `bb_cron` VALUES (13, 1, 'DS update ''stats''', 'ds_update_stats.php', 'interval', NULL, NULL, 255, '2008-05-22 19:11:46', '2008-05-22 19:21:46', '00:10:00', 0, '', 0, 0, 15); +INSERT INTO `bb_cron` VALUES (14, 1, 'Flash topic view', 'flash_topic_view.php', 'interval', NULL, NULL, 255, '2008-05-22 19:11:49', '2008-05-22 19:21:49', '00:10:00', 0, '', 0, 0, 15); +INSERT INTO `bb_cron` VALUES (15, 1, 'Clean search results', 'clean_search_results.php', 'interval', NULL, NULL, 255, '2008-05-22 19:11:52', '2008-05-22 19:21:52', '00:10:00', 0, '', 0, 0, 15); +INSERT INTO `bb_cron` VALUES (16, 1, 'Tracker cleanup and dlstat', 'tr_cleanup_and_dlstat.php', 'interval', NULL, NULL, 20, '2008-05-22 20:31:41', '2008-05-22 20:46:41', '00:15:00', 0, '', 0, 0, 14); +INSERT INTO `bb_cron` VALUES (17, 1, 'Make tracker snapshot', 'tr_make_snapshot.php', 'interval', NULL, NULL, 10, '2008-05-22 20:31:38', '2008-05-22 20:41:38', '00:10:00', 0, '', 0, 0, 16); +INSERT INTO `bb_cron` VALUES (18, 1, 'Seeder last seen', 'tr_update_seeder_last_seen.php', 'interval', NULL, NULL, 255, '2008-05-22 19:11:55', '2008-05-22 20:11:55', '01:00:00', 0, '', 0, 0, 5); +INSERT INTO `bb_cron` VALUES (19, 1, 'Clean torrents search options', 'clean_tor_search_options.php', 'interval', NULL, NULL, 255, '2008-05-22 19:11:58', '2008-05-23 01:11:58', '06:00:00', 0, '', 0, 0, 3); +INSERT INTO `bb_cron` VALUES (20, 1, 'Tracker dl-complete count', 'tr_complete_count.php', 'interval', NULL, NULL, 255, '2008-05-22 19:12:01', '2008-05-23 01:12:01', '06:00:00', 0, '', 0, 0, 3); +INSERT INTO `bb_cron` VALUES (21, 1, 'Cache garbage collector', 'cache_gc.php', 'interval', NULL, NULL, 255, '2008-05-22 19:18:13', '2008-05-22 19:23:13', '00:05:00', 0, '', 0, 0, 24); +INSERT INTO `bb_cron` VALUES (22, 1, 'Manage Antibroot', 'bb_manage_untrusted.php', 'interval', NULL, NULL, 255, '2008-05-22 19:18:13', '2008-05-22 19:23:13', '00:10:00', 0, '', 0, 0, 24); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_datastore` +-- + +CREATE TABLE `bb_datastore` ( + `ds_title` varchar(255) NOT NULL default '', + `ds_data` longtext NOT NULL, + PRIMARY KEY (`ds_title`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Дамп данных таблицы `bb_datastore` +-- + +INSERT INTO `bb_datastore` VALUES ('cat_forums', 'a:6:{s:15:"not_auth_forums";a:4:{s:10:"guest_view";s:0:"";s:10:"guest_read";s:0:"";s:9:"user_view";s:0:"";s:9:"user_read";s:0:"";}s:14:"tracker_forums";s:0:"";s:14:"cat_title_html";a:1:{i:1;s:15:"Test category 1";}s:15:"forum_name_html";a:1:{i:1;s:12:"Test Forum 1";}s:1:"c";a:1:{i:1;a:4:{s:6:"cat_id";s:1:"1";s:9:"cat_title";s:15:"Test category 1";s:9:"cat_order";s:2:"10";s:6:"forums";a:1:{i:0;s:1:"1";}}}s:1:"f";a:1:{i:1;a:20:{s:8:"forum_id";s:1:"1";s:6:"cat_id";s:1:"1";s:10:"forum_name";s:12:"Test Forum 1";s:10:"forum_desc";s:26:"This is just a test forum.";s:12:"forum_status";s:1:"0";s:11:"forum_posts";s:1:"1";s:12:"forum_topics";s:1:"1";s:9:"auth_view";s:1:"0";s:9:"auth_read";s:1:"0";s:9:"auth_post";s:1:"1";s:10:"auth_reply";s:1:"1";s:9:"auth_edit";s:1:"1";s:11:"auth_delete";s:1:"1";s:11:"auth_sticky";s:1:"3";s:13:"auth_announce";s:1:"3";s:9:"auth_vote";s:1:"1";s:15:"auth_pollcreate";s:1:"1";s:16:"auth_attachments";s:1:"1";s:13:"auth_download";s:1:"1";s:12:"forum_parent";s:1:"0";}}}'); +INSERT INTO `bb_datastore` VALUES ('jumpbox', 'a:2:{s:5:"guest";s:241:"\n\n";s:4:"user";s:241:"\n\n";}'); +INSERT INTO `bb_datastore` VALUES ('viewtopic_forum_select', 'a:1:{s:22:"viewtopic_forum_select";s:187:"\n\n";}'); +INSERT INTO `bb_datastore` VALUES ('latest_news', 'a:1:{i:0;a:3:{s:8:"topic_id";s:1:"1";s:10:"topic_time";s:9:"972086460";s:11:"topic_title";s:18:"Welcome to TorrentPier";}}'); +INSERT INTO `bb_datastore` VALUES ('ads', 'a:0:{}'); +INSERT INTO `bb_datastore` VALUES ('stats', 'a:4:{s:9:"usercount";s:1:"3";s:10:"newestuser";a:2:{s:7:"user_id";s:1:"2";s:8:"username";s:5:"admin";}s:9:"postcount";s:1:"1";s:10:"topiccount";s:1:"1";}'); +INSERT INTO `bb_datastore` VALUES ('moderators', 'a:6:{s:10:"name_users";a:0:{}s:11:"name_groups";a:0:{}s:9:"mod_users";a:0:{}s:10:"mod_groups";a:0:{}s:10:"moderators";a:0:{}s:6:"admins";a:1:{i:2;s:5:"admin";}}'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_disallow` +-- + +CREATE TABLE `bb_disallow` ( + `disallow_id` mediumint(8) unsigned NOT NULL auto_increment, + `disallow_username` varchar(25) NOT NULL default '', + PRIMARY KEY (`disallow_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_extensions` +-- + +CREATE TABLE `bb_extensions` ( + `ext_id` mediumint(8) unsigned NOT NULL auto_increment, + `group_id` mediumint(8) unsigned NOT NULL default '0', + `extension` varchar(100) NOT NULL default '', + `comment` varchar(100) NOT NULL default '', + PRIMARY KEY (`ext_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ; + +-- +-- Дамп данных таблицы `bb_extensions` +-- + +INSERT INTO `bb_extensions` VALUES (1, 1, 'gif', ''); +INSERT INTO `bb_extensions` VALUES (2, 1, 'png', ''); +INSERT INTO `bb_extensions` VALUES (3, 1, 'jpeg', ''); +INSERT INTO `bb_extensions` VALUES (4, 1, 'jpg', ''); +INSERT INTO `bb_extensions` VALUES (5, 1, 'tif', ''); +INSERT INTO `bb_extensions` VALUES (6, 1, 'tga', ''); +INSERT INTO `bb_extensions` VALUES (7, 2, 'gtar', ''); +INSERT INTO `bb_extensions` VALUES (8, 2, 'gz', ''); +INSERT INTO `bb_extensions` VALUES (9, 2, 'tar', ''); +INSERT INTO `bb_extensions` VALUES (10, 2, 'zip', ''); +INSERT INTO `bb_extensions` VALUES (11, 2, 'rar', ''); +INSERT INTO `bb_extensions` VALUES (12, 2, 'ace', ''); +INSERT INTO `bb_extensions` VALUES (13, 3, 'txt', ''); +INSERT INTO `bb_extensions` VALUES (14, 3, 'c', ''); +INSERT INTO `bb_extensions` VALUES (15, 3, 'h', ''); +INSERT INTO `bb_extensions` VALUES (16, 3, 'cpp', ''); +INSERT INTO `bb_extensions` VALUES (17, 3, 'hpp', ''); +INSERT INTO `bb_extensions` VALUES (18, 3, 'diz', ''); +INSERT INTO `bb_extensions` VALUES (19, 4, 'xls', ''); +INSERT INTO `bb_extensions` VALUES (20, 4, 'doc', ''); +INSERT INTO `bb_extensions` VALUES (21, 4, 'dot', ''); +INSERT INTO `bb_extensions` VALUES (22, 4, 'pdf', ''); +INSERT INTO `bb_extensions` VALUES (23, 4, 'ai', ''); +INSERT INTO `bb_extensions` VALUES (24, 4, 'ps', ''); +INSERT INTO `bb_extensions` VALUES (25, 4, 'ppt', ''); +INSERT INTO `bb_extensions` VALUES (26, 5, 'rm', ''); +INSERT INTO `bb_extensions` VALUES (27, 6, 'wma', ''); +INSERT INTO `bb_extensions` VALUES (28, 7, 'swf', ''); +INSERT INTO `bb_extensions` VALUES (29, 8, 'torrent', ''); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_extension_groups` +-- + +CREATE TABLE `bb_extension_groups` ( + `group_id` mediumint(8) NOT NULL auto_increment, + `group_name` varchar(20) NOT NULL default '', + `cat_id` tinyint(2) NOT NULL default '0', + `allow_group` tinyint(1) NOT NULL default '0', + `download_mode` tinyint(1) unsigned NOT NULL default '1', + `upload_icon` varchar(100) NOT NULL default '', + `max_filesize` int(20) NOT NULL default '0', + `forum_permissions` text NOT NULL, + PRIMARY KEY (`group_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; + +-- +-- Дамп данных таблицы `bb_extension_groups` +-- + +INSERT INTO `bb_extension_groups` VALUES (1, 'Images', 1, 1, 1, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (2, 'Archives', 0, 1, 1, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (3, 'Plain Text', 0, 0, 1, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (4, 'Documents', 0, 0, 1, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (5, 'Real Media', 0, 0, 2, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (6, 'Streams', 2, 0, 1, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (7, 'Flash Files', 3, 0, 1, '', 262144, ''); +INSERT INTO `bb_extension_groups` VALUES (8, 'Torrent', 0, 1, 1, '', 122880, ''); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_forums` +-- + +CREATE TABLE `bb_forums` ( + `forum_id` smallint(5) unsigned NOT NULL auto_increment, + `cat_id` smallint(5) unsigned NOT NULL default '0', + `forum_name` varchar(150) NOT NULL default '', + `forum_desc` text NOT NULL, + `forum_status` tinyint(4) NOT NULL default '0', + `forum_order` smallint(5) unsigned NOT NULL default '1', + `forum_posts` mediumint(8) unsigned NOT NULL default '0', + `forum_topics` mediumint(8) unsigned NOT NULL default '0', + `forum_last_post_id` mediumint(8) unsigned NOT NULL default '0', + `prune_days` smallint(5) unsigned NOT NULL default '0', + `auth_view` tinyint(2) NOT NULL default '0', + `auth_read` tinyint(2) NOT NULL default '0', + `auth_post` tinyint(2) NOT NULL default '0', + `auth_reply` tinyint(2) NOT NULL default '0', + `auth_edit` tinyint(2) NOT NULL default '0', + `auth_delete` tinyint(2) NOT NULL default '0', + `auth_sticky` tinyint(2) NOT NULL default '0', + `auth_announce` tinyint(2) NOT NULL default '0', + `auth_vote` tinyint(2) NOT NULL default '0', + `auth_pollcreate` tinyint(2) NOT NULL default '0', + `auth_attachments` tinyint(2) NOT NULL default '0', + `auth_download` tinyint(2) NOT NULL default '0', + `allow_reg_tracker` tinyint(1) NOT NULL default '0', + `allow_dl_topic` tinyint(1) NOT NULL default '0', + `self_moderated` tinyint(1) NOT NULL default '0', + `forum_parent` smallint(5) unsigned NOT NULL default '0', + `show_on_index` tinyint(1) NOT NULL default '1', + `forum_display_sort` tinyint(1) NOT NULL default '0', + `forum_display_order` tinyint(1) NOT NULL default '0', + `topic_tpl_id` smallint(6) NOT NULL default '0', + PRIMARY KEY (`forum_id`), + KEY `forums_order` (`forum_order`), + KEY `cat_id` (`cat_id`), + KEY `forum_last_post_id` (`forum_last_post_id`), + KEY `forum_parent` (`forum_parent`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `bb_forums` +-- + +INSERT INTO `bb_forums` VALUES (1, 1, 'Test Forum 1', 'This is just a test forum.', 0, 10, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_groups` +-- + +CREATE TABLE `bb_groups` ( + `group_id` mediumint(8) NOT NULL auto_increment, + `group_type` tinyint(4) NOT NULL default '1', + `group_name` varchar(40) NOT NULL default '', + `group_description` varchar(255) NOT NULL default '', + `group_moderator` mediumint(8) NOT NULL default '0', + `group_single_user` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`group_id`), + KEY `group_single_user` (`group_single_user`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_log` +-- + +CREATE TABLE `bb_log` ( + `log_type_id` mediumint(8) unsigned NOT NULL default '0', + `log_user_id` mediumint(9) NOT NULL default '0', + `log_username` varchar(25) NOT NULL default '', + `log_user_ip` varchar(32) character set utf8 collate utf8_bin NOT NULL default '', + `log_forum_id` smallint(5) unsigned NOT NULL default '0', + `log_forum_id_new` smallint(5) unsigned NOT NULL default '0', + `log_topic_id` mediumint(8) unsigned NOT NULL default '0', + `log_topic_id_new` mediumint(8) unsigned NOT NULL default '0', + `log_topic_title` varchar(250) NOT NULL default '', + `log_topic_title_new` varchar(250) NOT NULL default '', + `log_time` int(11) NOT NULL default '0', + `log_msg` text NOT NULL, + KEY `log_time` (`log_time`), + FULLTEXT KEY `log_topic_title` (`log_topic_title`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_posts` +-- + +CREATE TABLE `bb_posts` ( + `post_id` mediumint(8) unsigned NOT NULL auto_increment, + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `forum_id` smallint(5) unsigned NOT NULL default '0', + `poster_id` mediumint(8) NOT NULL default '0', + `post_time` int(11) NOT NULL default '0', + `poster_ip` char(32) character set utf8 collate utf8_bin NOT NULL default '', + `post_username` varchar(25) NOT NULL default '', + `enable_bbcode` tinyint(1) NOT NULL default '1', + `enable_smilies` tinyint(1) NOT NULL default '1', + `enable_sig` tinyint(1) NOT NULL default '1', + `post_edit_time` int(11) NOT NULL default '0', + `post_edit_count` smallint(5) unsigned NOT NULL default '0', + `post_attachment` tinyint(1) NOT NULL default '0', + `post_reported` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`post_id`), + KEY `topic_id` (`topic_id`), + KEY `poster_id` (`poster_id`), + KEY `post_time` (`post_time`), + KEY `forum_id_post_time` (`forum_id`,`post_time`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `bb_posts` +-- + +INSERT INTO `bb_posts` VALUES (1, 1, 1, 2, 972086460, '', '', 1, 1, 1, 0, 0, 0, 0); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_posts_html` +-- + +CREATE TABLE `bb_posts_html` ( + `post_id` mediumint(9) NOT NULL default '0', + `post_html_time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + `post_html` mediumtext NOT NULL, + PRIMARY KEY (`post_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_posts_search` +-- + +CREATE TABLE `bb_posts_search` ( + `post_id` mediumint(8) unsigned NOT NULL default '0', + `search_words` text NOT NULL, + PRIMARY KEY (`post_id`), + FULLTEXT KEY `search_words` (`search_words`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_posts_text` +-- + +CREATE TABLE `bb_posts_text` ( + `post_id` mediumint(8) unsigned NOT NULL default '0', + `bbcode_uid` varchar(10) NOT NULL default '', + `post_subject` enum('','kFpILr5') NOT NULL default '', + `post_text` text NOT NULL, + PRIMARY KEY (`post_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Дамп данных таблицы `bb_posts_text` +-- + +INSERT INTO `bb_posts_text` VALUES (1, '', '', 'This is an example post in your TorrentPier installation. You may delete this post, this topic and even this forum if you like since everything seems to be working!'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_privmsgs` +-- + +CREATE TABLE `bb_privmsgs` ( + `privmsgs_id` mediumint(8) unsigned NOT NULL auto_increment, + `privmsgs_type` tinyint(4) NOT NULL default '0', + `privmsgs_subject` varchar(255) NOT NULL default '0', + `privmsgs_from_userid` mediumint(8) NOT NULL default '0', + `privmsgs_to_userid` mediumint(8) NOT NULL default '0', + `privmsgs_date` int(11) NOT NULL default '0', + `privmsgs_ip` varchar(32) character set utf8 collate utf8_bin NOT NULL default '', + `privmsgs_enable_bbcode` tinyint(1) NOT NULL default '1', + `privmsgs_enable_smilies` tinyint(1) NOT NULL default '1', + `privmsgs_reported` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`privmsgs_id`), + KEY `privmsgs_from_userid` (`privmsgs_from_userid`), + KEY `privmsgs_to_userid` (`privmsgs_to_userid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_privmsgs_text` +-- + +CREATE TABLE `bb_privmsgs_text` ( + `privmsgs_text_id` mediumint(8) unsigned NOT NULL default '0', + `privmsgs_bbcode_uid` varchar(10) NOT NULL default '0', + `privmsgs_text` text NOT NULL, + PRIMARY KEY (`privmsgs_text_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_quota_limits` +-- + +CREATE TABLE `bb_quota_limits` ( + `quota_limit_id` mediumint(8) unsigned NOT NULL auto_increment, + `quota_desc` varchar(20) NOT NULL default '', + `quota_limit` bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (`quota_limit_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; + +-- +-- Дамп данных таблицы `bb_quota_limits` +-- + +INSERT INTO `bb_quota_limits` VALUES (1, 'Low', 262144); +INSERT INTO `bb_quota_limits` VALUES (2, 'Medium', 10485760); +INSERT INTO `bb_quota_limits` VALUES (3, 'High', 15728640); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_ranks` +-- + +CREATE TABLE `bb_ranks` ( + `rank_id` smallint(5) unsigned NOT NULL auto_increment, + `rank_title` varchar(50) NOT NULL default '', + `rank_min` mediumint(8) NOT NULL default '0', + `rank_special` tinyint(1) NOT NULL default '1', + `rank_image` varchar(255) NOT NULL default '', + PRIMARY KEY (`rank_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `bb_ranks` +-- + +INSERT INTO `bb_ranks` VALUES (1, 'Site Admin', -1, 1, ''); + +-- -------------------------------------------------------- +-- +-- Структура таблицы `bb_reports` +-- + +CREATE TABLE `bb_reports` ( + `report_id` mediumint(8) unsigned NOT NULL auto_increment, + `user_id` mediumint(8) NOT NULL, + `report_time` int(11) NOT NULL, + `report_last_change` mediumint(8) unsigned default NULL, + `report_module_id` mediumint(8) unsigned NOT NULL, + `report_status` tinyint(1) NOT NULL, + `report_reason_id` mediumint(8) unsigned NOT NULL, + `report_subject` int(11) NOT NULL, + `report_subject_data` mediumtext, + `report_title` varchar(255) NOT NULL, + `report_desc` text NOT NULL, + PRIMARY KEY (`report_id`), + KEY `user_id` (`user_id`), + KEY `report_time` (`report_time`), + KEY `report_type_id` (`report_module_id`), + KEY `report_status` (`report_status`), + KEY `report_reason_id` (`report_reason_id`), + KEY `report_subject` (`report_subject`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_reports_changes` +-- + +CREATE TABLE `bb_reports_changes` ( + `report_change_id` mediumint(8) unsigned NOT NULL auto_increment, + `report_id` mediumint(8) unsigned NOT NULL, + `user_id` mediumint(8) NOT NULL, + `report_change_time` int(11) NOT NULL, + `report_status` tinyint(1) NOT NULL, + `report_change_comment` text NOT NULL, + PRIMARY KEY (`report_change_id`), + KEY `report_id` (`report_id`), + KEY `user_id` (`user_id`), + KEY `report_change_time` (`report_change_time`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_reports_modules` +-- + +CREATE TABLE `bb_reports_modules` ( + `report_module_id` mediumint(8) unsigned NOT NULL auto_increment, + `report_module_order` mediumint(8) unsigned NOT NULL, + `report_module_notify` tinyint(1) NOT NULL, + `report_module_prune` smallint(6) NOT NULL, + `report_module_last_prune` int(11) default NULL, + `report_module_name` varchar(50) NOT NULL, + `auth_write` tinyint(1) NOT NULL, + `auth_view` tinyint(1) NOT NULL, + `auth_notify` tinyint(1) NOT NULL, + `auth_delete` tinyint(1) NOT NULL, + PRIMARY KEY (`report_module_id`), + KEY `report_module_order` (`report_module_order`), + KEY `auth_view` (`auth_view`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; + +-- +-- Дамп данных таблицы `bb_reports_modules` +-- + +INSERT INTO `bb_reports_modules` (`report_module_id`, `report_module_order`, `report_module_notify`, `report_module_prune`, `report_module_last_prune`, `report_module_name`, `auth_write`, `auth_view`, `auth_notify`, `auth_delete`) VALUES +(1, 1, 0, 0, NULL, 'report_general', 0, 1, 1, 1), +(2, 2, 0, 0, NULL, 'report_post', 0, 1, 1, 1), +(3, 3, 0, 0, NULL, 'report_topic', 0, 1, 1, 1), +(4, 4, 0, 0, NULL, 'report_user', 0, 1, 1, 1), +(5, 5, 0, 0, NULL, 'report_privmsg', 0, 1, 1, 1); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_reports_reasons` +-- + +CREATE TABLE `bb_reports_reasons` ( + `report_reason_id` mediumint(8) unsigned NOT NULL auto_increment, + `report_module_id` mediumint(8) unsigned NOT NULL, + `report_reason_order` mediumint(8) unsigned NOT NULL, + `report_reason_desc` varchar(255) NOT NULL, + PRIMARY KEY (`report_reason_id`), + KEY `report_type_id` (`report_module_id`), + KEY `report_reason_order` (`report_reason_order`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Структура таблицы `bb_search_rebuild` +-- + +CREATE TABLE `bb_search_rebuild` ( + `rebuild_session_id` mediumint(8) unsigned NOT NULL auto_increment, + `start_post_id` mediumint(8) unsigned NOT NULL default '0', + `end_post_id` mediumint(8) unsigned NOT NULL default '0', + `start_time` int(11) NOT NULL default '0', + `end_time` int(11) NOT NULL default '0', + `last_cycle_time` int(11) NOT NULL default '0', + `session_time` int(11) NOT NULL default '0', + `session_posts` mediumint(8) unsigned NOT NULL default '0', + `session_cycles` mediumint(8) unsigned NOT NULL default '0', + `search_size` int(10) unsigned NOT NULL default '0', + `rebuild_session_status` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`rebuild_session_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_search_results` +-- + +CREATE TABLE `bb_search_results` ( + `session_id` char(20) character set utf8 collate utf8_bin NOT NULL default '', + `search_type` tinyint(4) NOT NULL default '0', + `search_id` varchar(12) character set utf8 collate utf8_bin NOT NULL default '', + `search_time` int(11) NOT NULL default '0', + `search_settings` text NOT NULL, + `search_array` text NOT NULL, + PRIMARY KEY (`session_id`,`search_type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_sessions` +-- + +CREATE TABLE `bb_sessions` ( + `session_id` char(20) character set utf8 collate utf8_bin NOT NULL default '', + `session_user_id` mediumint(8) NOT NULL default '0', + `session_start` int(11) NOT NULL default '0', + `session_time` int(11) NOT NULL default '0', + `session_ip` char(32) character set utf8 collate utf8_bin NOT NULL default '', + `session_logged_in` tinyint(1) NOT NULL default '0', + `session_admin` tinyint(2) NOT NULL default '0', + PRIMARY KEY (`session_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_smilies` +-- + +CREATE TABLE `bb_smilies` ( + `smilies_id` smallint(5) unsigned NOT NULL auto_increment, + `code` varchar(50) NOT NULL default '', + `smile_url` varchar(100) NOT NULL default '', + `emoticon` varchar(75) NOT NULL default '', + PRIMARY KEY (`smilies_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=50 ; + +-- +-- Дамп данных таблицы `bb_smilies` +-- + +INSERT INTO `bb_smilies` VALUES (1, ':aa:', 'aa.gif', 'aa'); +INSERT INTO `bb_smilies` VALUES (2, ':ab:', 'ab.gif', 'ab'); +INSERT INTO `bb_smilies` VALUES (3, ':ac:', 'ac.gif', 'ac'); +INSERT INTO `bb_smilies` VALUES (4, ':ad:', 'ad.gif', 'ad'); +INSERT INTO `bb_smilies` VALUES (5, ':ae:', 'ae.gif', 'ae'); +INSERT INTO `bb_smilies` VALUES (6, ':af:', 'af.gif', 'af'); +INSERT INTO `bb_smilies` VALUES (7, ':ag:', 'ag.gif', 'ag'); +INSERT INTO `bb_smilies` VALUES (8, ':ah:', 'ah.gif', 'ah'); +INSERT INTO `bb_smilies` VALUES (9, ':ai:', 'ai.gif', 'ai'); +INSERT INTO `bb_smilies` VALUES (10, ':aj:', 'aj.gif', 'aj'); +INSERT INTO `bb_smilies` VALUES (11, ':ak:', 'ak.gif', 'ak'); +INSERT INTO `bb_smilies` VALUES (12, ':al:', 'al.gif', 'al'); +INSERT INTO `bb_smilies` VALUES (13, ':am:', 'am.gif', 'am'); +INSERT INTO `bb_smilies` VALUES (14, ':an:', 'an.gif', 'an'); +INSERT INTO `bb_smilies` VALUES (15, ':ao:', 'ao.gif', 'ao'); +INSERT INTO `bb_smilies` VALUES (16, ':ap:', 'ap.gif', 'ap'); +INSERT INTO `bb_smilies` VALUES (17, ':aq:', 'aq.gif', 'aq'); +INSERT INTO `bb_smilies` VALUES (18, ':ar:', 'ar.gif', 'ar'); +INSERT INTO `bb_smilies` VALUES (19, ':as:', 'as.gif', 'as'); +INSERT INTO `bb_smilies` VALUES (20, ':at:', 'at.gif', 'at'); +INSERT INTO `bb_smilies` VALUES (21, ':au:', 'au.gif', 'au'); +INSERT INTO `bb_smilies` VALUES (22, ':av:', 'av.gif', 'av'); +INSERT INTO `bb_smilies` VALUES (23, ':aw:', 'aw.gif', 'aw'); +INSERT INTO `bb_smilies` VALUES (24, ':ax:', 'ax.gif', 'ax'); +INSERT INTO `bb_smilies` VALUES (25, ':ay:', 'ay.gif', 'ay'); +INSERT INTO `bb_smilies` VALUES (26, ':az:', 'az.gif', 'az'); +INSERT INTO `bb_smilies` VALUES (27, ':ba:', 'ba.gif', 'ba'); +INSERT INTO `bb_smilies` VALUES (28, ':bb:', 'bb.gif', 'bb'); +INSERT INTO `bb_smilies` VALUES (29, ':bc:', 'bc.gif', 'bc'); +INSERT INTO `bb_smilies` VALUES (30, ':bd:', 'bd.gif', 'bd'); +INSERT INTO `bb_smilies` VALUES (31, ':be:', 'be.gif', 'be'); +INSERT INTO `bb_smilies` VALUES (32, ':bf:', 'bf.gif', 'bf'); +INSERT INTO `bb_smilies` VALUES (33, ':bg:', 'bg.gif', 'bg'); +INSERT INTO `bb_smilies` VALUES (34, ':bh:', 'bh.gif', 'bh'); +INSERT INTO `bb_smilies` VALUES (35, ':bi:', 'bi.gif', 'bi'); +INSERT INTO `bb_smilies` VALUES (36, ':bj:', 'bj.gif', 'bj'); +INSERT INTO `bb_smilies` VALUES (37, ':bk:', 'bk.gif', 'bk'); +INSERT INTO `bb_smilies` VALUES (38, ':bl:', 'bl.gif', 'bl'); +INSERT INTO `bb_smilies` VALUES (39, ':bm:', 'bm.gif', 'bm'); +INSERT INTO `bb_smilies` VALUES (40, ':bn:', 'bn.gif', 'bn'); +INSERT INTO `bb_smilies` VALUES (41, ':bo:', 'bo.gif', 'bo'); +INSERT INTO `bb_smilies` VALUES (42, ':bp:', 'bp.gif', 'bp'); +INSERT INTO `bb_smilies` VALUES (43, ':bq:', 'bq.gif', 'bq'); +INSERT INTO `bb_smilies` VALUES (44, ':br:', 'br.gif', 'br'); +INSERT INTO `bb_smilies` VALUES (45, ':bs:', 'bs.gif', 'bs'); +INSERT INTO `bb_smilies` VALUES (46, ':bt:', 'bt.gif', 'bt'); +INSERT INTO `bb_smilies` VALUES (47, ':bu:', 'bu.gif', 'bu'); +INSERT INTO `bb_smilies` VALUES (48, ':bv:', 'bv.gif', 'bv'); +INSERT INTO `bb_smilies` VALUES (49, ':bw:', 'bw.gif', 'bw'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_topics` +-- + +CREATE TABLE `bb_topics` ( + `topic_id` mediumint(8) unsigned NOT NULL auto_increment, + `forum_id` smallint(8) unsigned NOT NULL default '0', + `topic_title` varchar(250) NOT NULL default '', + `topic_poster` mediumint(8) NOT NULL default '0', + `topic_time` int(11) NOT NULL default '0', + `topic_views` mediumint(8) unsigned NOT NULL default '0', + `topic_replies` mediumint(8) unsigned NOT NULL default '0', + `topic_status` tinyint(3) NOT NULL default '0', + `topic_vote` tinyint(1) NOT NULL default '0', + `topic_type` tinyint(3) NOT NULL default '0', + `topic_first_post_id` mediumint(8) unsigned NOT NULL default '0', + `topic_last_post_id` mediumint(8) unsigned NOT NULL default '0', + `topic_moved_id` mediumint(8) unsigned NOT NULL default '0', + `topic_attachment` tinyint(1) NOT NULL default '0', + `topic_reported` tinyint(1) NOT NULL default '0', + `topic_dl_type` tinyint(1) NOT NULL default '0', + `topic_last_post_time` int(11) NOT NULL default '0', + PRIMARY KEY (`topic_id`), + KEY `forum_id` (`forum_id`), + KEY `topic_last_post_id` (`topic_last_post_id`), + KEY `topic_last_post_time` (`topic_last_post_time`), + FULLTEXT KEY `topic_title` (`topic_title`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Дамп данных таблицы `bb_topics` +-- + +INSERT INTO `bb_topics` VALUES (1, 1, 'Welcome to TorrentPier', 2, 972086460, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 972086460); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_topics_watch` +-- + +CREATE TABLE `bb_topics_watch` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_id` mediumint(8) NOT NULL default '0', + `notify_status` tinyint(1) NOT NULL default '0', + KEY `topic_id` (`topic_id`), + KEY `user_id` (`user_id`), + KEY `notify_status` (`notify_status`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_topic_templates` +-- + +CREATE TABLE `bb_topic_templates` ( + `tpl_id` smallint(6) NOT NULL auto_increment, + `tpl_name` varchar(20) NOT NULL default '', + `tpl_script` varchar(30) NOT NULL default '', + `tpl_template` varchar(30) NOT NULL default '', + `tpl_desc` varchar(255) NOT NULL default '', + PRIMARY KEY (`tpl_id`), + UNIQUE KEY `tpl_name` (`tpl_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; + +-- +-- Дамп данных таблицы `bb_topic_templates` +-- + +INSERT INTO `bb_topic_templates` VALUES (1, 'video', 'video', 'video', 'Video (basic)'); +INSERT INTO `bb_topic_templates` VALUES (2, 'video_home', 'video', 'video_home', 'Video (home)'); +INSERT INTO `bb_topic_templates` VALUES (3, 'video_simple', 'video', 'video_simple', 'Video (simple)'); +INSERT INTO `bb_topic_templates` VALUES (4, 'video_lesson', 'video', 'video_lesson', 'Video (lesson)'); +INSERT INTO `bb_topic_templates` VALUES (5, 'games', 'games', 'games', 'Games'); +INSERT INTO `bb_topic_templates` VALUES (6, 'games_ps', 'games', 'games_ps', 'Games PS/PS2'); +INSERT INTO `bb_topic_templates` VALUES (7, 'games_psp', 'games', 'games_psp', 'Games PSP'); +INSERT INTO `bb_topic_templates` VALUES (8, 'games_xbox', 'games', 'games_xbox', 'Games XBOX'); +INSERT INTO `bb_topic_templates` VALUES (9, 'progs', 'progs', 'progs', 'Programs'); +INSERT INTO `bb_topic_templates` VALUES (10, 'progs_mac', 'progs', 'progs_mac', 'Programs Mac OS'); +INSERT INTO `bb_topic_templates` VALUES (11, 'music', 'music', 'music', 'Music'); +INSERT INTO `bb_topic_templates` VALUES (12, 'books', 'books', 'books', 'Books'); +INSERT INTO `bb_topic_templates` VALUES (13, 'audiobooks', 'audiobooks', 'audiobooks', 'Audiobooks'); +INSERT INTO `bb_topic_templates` VALUES (14, 'sport', 'sport', 'sport', 'Sport'); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_users` +-- + +CREATE TABLE `bb_users` ( + `user_id` mediumint(8) NOT NULL auto_increment, + `user_active` tinyint(1) NOT NULL default '1', + `username` varchar(25) NOT NULL default '', + `user_password` varchar(32) character set utf8 collate utf8_bin NOT NULL default '', + `user_session_time` int(11) NOT NULL default '0', + `user_lastvisit` int(11) NOT NULL default '0', + `user_last_ip` CHAR(32) NOT NULL default '', + `user_regdate` int(11) NOT NULL default '0', + `user_reg_ip` CHAR(32) NOT NULL default '', + `user_level` tinyint(4) NOT NULL default '0', + `user_posts` mediumint(8) unsigned NOT NULL default '0', + `user_timezone` decimal(5,2) NOT NULL default '0.00', + `user_lang` varchar(255) NOT NULL default '', + `user_dateformat` varchar(14) NOT NULL default '', + `user_new_privmsg` smallint(5) unsigned NOT NULL default '0', + `user_unread_privmsg` smallint(5) unsigned NOT NULL default '0', + `user_last_privmsg` int(11) NOT NULL default '0', + `user_opt` int(11) NOT NULL default '0', + `user_allowavatar` tinyint(1) NOT NULL default '1', + `user_allow_pm` tinyint(1) NOT NULL default '1', + `user_allow_viewonline` tinyint(1) NOT NULL default '1', + `user_notify` tinyint(1) NOT NULL default '1', + `user_notify_pm` tinyint(1) NOT NULL default '0', + `user_rank` int(11) NOT NULL default '0', + `user_avatar` varchar(100) NOT NULL default '', + `user_avatar_type` tinyint(4) NOT NULL default '0', + `user_email` varchar(255) NOT NULL default '', + `user_icq` varchar(15) NOT NULL default '', + `user_website` varchar(100) NOT NULL default '', + `user_from` varchar(100) NOT NULL default '', + `user_sig` text NOT NULL, + `user_sig_bbcode_uid` varchar(10) NOT NULL default '', + `user_occ` varchar(100) NOT NULL default '', + `user_interests` varchar(255) NOT NULL default '', + `user_actkey` varchar(32) NOT NULL default '', + `user_newpasswd` varchar(32) NOT NULL default '', + `user_allow_passkey` tinyint(1) NOT NULL default '1', + `user_from_flag` varchar(3) NOT NULL default '', + `ignore_srv_load` tinyint(1) NOT NULL default '0', + `autologin_id` varchar(12) character set utf8 collate utf8_bin NOT NULL default '', + `user_newest_pm_id` mediumint(8) NOT NULL default '0', + PRIMARY KEY (`user_id`), + KEY `username` (`username`(10)), + KEY `user_email` (`user_email`(10)), + KEY `user_level` (`user_level`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Дамп данных таблицы `bb_users` +-- + +INSERT INTO `bb_users` VALUES (-1, 0, 'Anonymous', '', 0, 0, 0, 1117103663, 0, 0, 0, 0.00, '', '', 0, 0, 0, 220, 1, 0, 1, 0, 1, 0, '', 0, '', '', '', '', '', '', '', '', '', '', 1, '', 0, '', 0); +INSERT INTO `bb_users` VALUES (2, 1, 'admin', 0x3231323332663239376135376135613734333839346130653461383031666333, 1211472784, 1210263184, 0, 1117103663, 0, 1, 1, 0.00, '', '', 0, 0, 1211472803, 159, 1, 1, 1, 0, 1, 1, '', 0, 'admin@admin.com', '', '', '', '', '', '', '', '', '', 1, '', 0, 0x4f5750316d724533314b7335, 0); +INSERT INTO `bb_users` VALUES (-746, 0, 'bot', '', 1117115716, 1117115634, 0, 1117114766, 0, 0, 0, 0.00, '', '', 0, 0, 0, 148, 1, 1, 1, 0, 0, 0, 'bot.gif', 1, 'bot@bot.bot', '', '', '', '', '', '', '', '', '', 1, '', 0, '', 0); + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_user_group` +-- + +CREATE TABLE `bb_user_group` ( + `group_id` mediumint(8) NOT NULL default '0', + `user_id` mediumint(8) NOT NULL default '0', + `user_pending` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`group_id`,`user_id`), + KEY `user_id` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_vote_desc` +-- + +CREATE TABLE `bb_vote_desc` ( + `vote_id` mediumint(8) unsigned NOT NULL auto_increment, + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `vote_text` text NOT NULL, + `vote_start` int(11) NOT NULL default '0', + `vote_length` int(11) NOT NULL default '0', + PRIMARY KEY (`vote_id`), + KEY `topic_id` (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_vote_results` +-- + +CREATE TABLE `bb_vote_results` ( + `vote_id` mediumint(8) unsigned NOT NULL default '0', + `vote_option_id` tinyint(4) unsigned NOT NULL default '0', + `vote_option_text` varchar(255) NOT NULL default '', + `vote_result` int(11) NOT NULL default '0', + KEY `vote_option_id` (`vote_option_id`), + KEY `vote_id` (`vote_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_vote_voters` +-- + +CREATE TABLE `bb_vote_voters` ( + `vote_id` mediumint(8) unsigned NOT NULL default '0', + `vote_user_id` mediumint(8) NOT NULL default '0', + `vote_user_ip` char(32) NOT NULL default '', + KEY `vote_id` (`vote_id`), + KEY `vote_user_id` (`vote_user_id`), + KEY `vote_user_ip` (`vote_user_ip`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `bb_words` +-- + +CREATE TABLE `bb_words` ( + `word_id` mediumint(8) unsigned NOT NULL auto_increment, + `word` char(100) NOT NULL default '', + `replacement` char(100) NOT NULL default '', + PRIMARY KEY (`word_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `buf_last_seeder` +-- + +CREATE TABLE `buf_last_seeder` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `seeder_last_seen` int(11) NOT NULL default '0', + PRIMARY KEY (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `buf_topic_view` +-- + +CREATE TABLE `buf_topic_view` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `topic_views` mediumint(8) unsigned NOT NULL default '0', + PRIMARY KEY (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Структура таблицы `sph_counter` +-- + +CREATE TABLE IF NOT EXISTS `sph_counter` ( + `counter_id` int(11) NOT NULL, + `max_doc_id` int(11) NOT NULL, + PRIMARY KEY (`counter_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- diff --git a/install/xbt/linux/Tracker/CMakeLists.txt b/install/xbt/linux/Tracker/CMakeLists.txt new file mode 100644 index 000000000..93d1f9eec --- /dev/null +++ b/install/xbt/linux/Tracker/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 2.4) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) +set(CMAKE_BUILD_TYPE release) +include_directories(. ../misc) +include(CheckIncludeFileCXX) +check_include_file_cxx(sys/epoll.h HAVE_SYS_EPOLL) +if(HAVE_SYS_EPOLL) + add_definitions(-DEPOLL) +endif() +add_executable( + xbt_tracker + ../misc/sql/database.cpp + ../misc/sql/sql_query.cpp + ../misc/sql/sql_result.cpp + ../misc/bt_misc.cpp + ../misc/bvalue.cpp + ../misc/sha1.cpp + ../misc/socket.cpp + ../misc/virtual_binary.cpp + ../misc/xcc_z.cpp + config.cpp + connection.cpp + epoll.cpp + server.cpp + tcp_listen_socket.cpp + tracker_input.cpp + transaction.cpp + udp_listen_socket.cpp + "XBT Tracker.cpp" +) +target_link_libraries(xbt_tracker mysqlclient) diff --git a/install/xbt/linux/Tracker/XBT Tracker.cpp b/install/xbt/linux/Tracker/XBT Tracker.cpp new file mode 100644 index 000000000..9c4587ffe --- /dev/null +++ b/install/xbt/linux/Tracker/XBT Tracker.cpp @@ -0,0 +1,135 @@ +#include "stdafx.h" +#include +#include +#include "config.h" +#include "server.h" + +std::string g_conf_file = "xbt_tracker.conf"; +const char* g_service_name = "XBT Tracker"; + +int main1() +{ + srand(static_cast(time(NULL))); + Cconfig config; + if (config.load(g_conf_file)) +#ifdef WIN32 + { + char b[MAX_PATH]; + *b = 0; + GetModuleFileName(NULL, b, MAX_PATH); + if (*b) + strrchr(b, '\\')[1] = 0; + strcat(b, "xbt_tracker.conf"); + if (config.load(b)) + std::cerr << "Unable to read " << g_conf_file << std::endl; + else + g_conf_file = b; + } +#else + std::cerr << "Unable to read " << g_conf_file << std::endl; +#endif + Cdatabase database; + try + { + if (config.m_mysql_host != "-") + database.open(config.m_mysql_host, config.m_mysql_user, config.m_mysql_password, config.m_mysql_database, true); + } + catch (Cdatabase::exception& e) + { + std::cerr << e.what() << std::endl; + return 1; + } + database.set_query_log(config.m_query_log); + return Cserver(database, config.m_mysql_table_prefix, config.m_mysql_host != "-", g_conf_file).run(); +} + +#ifdef WIN32 +static SERVICE_STATUS g_service_status; +static SERVICE_STATUS_HANDLE gh_service_status; + +void WINAPI nt_service_handler(DWORD op) +{ + switch (op) + { + case SERVICE_CONTROL_STOP: + g_service_status.dwCurrentState = SERVICE_STOP_PENDING; + SetServiceStatus(gh_service_status, &g_service_status); + Cserver::term(); + break; + } + SetServiceStatus(gh_service_status, &g_service_status); +} + +void WINAPI nt_service_main(DWORD argc, LPTSTR* argv) +{ + g_service_status.dwCheckPoint = 0; + g_service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + g_service_status.dwCurrentState = SERVICE_START_PENDING; + g_service_status.dwServiceSpecificExitCode = 0; + g_service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + g_service_status.dwWaitHint = 0; + g_service_status.dwWin32ExitCode = NO_ERROR; + if (!(gh_service_status = RegisterServiceCtrlHandler(g_service_name, nt_service_handler))) + return; + SetServiceStatus(gh_service_status, &g_service_status); + g_service_status.dwCurrentState = SERVICE_RUNNING; + SetServiceStatus(gh_service_status, &g_service_status); + main1(); + g_service_status.dwCurrentState = SERVICE_STOPPED; + SetServiceStatus(gh_service_status, &g_service_status); +} +#endif + +int main(int argc, char* argv[]) +{ +#ifdef WIN32 + if (argc >= 2) + { + if (!strcmp(argv[1], "--install")) + { + if (nt_service_install(g_service_name)) + { + std::cerr << "Failed to install service " << g_service_name << "." << std::endl; + return 1; + } + std::cout << "Service " << g_service_name << " has been installed." << std::endl; + return 0; + } + else if (!strcmp(argv[1], "--uninstall")) + { + if (nt_service_uninstall(g_service_name)) + { + std::cerr << "Failed to uninstall service " << g_service_name << "." << std::endl; + return 1; + } + std::cout << "Service " << g_service_name << " has been uninstalled." << std::endl; + return 0; + } + else if (!strcmp(argv[1], "--conf_file") && argc >= 3) + g_conf_file = argv[2]; + else + return 1; + } +#ifdef NDEBUG + SERVICE_TABLE_ENTRY st[] = + { + { "", nt_service_main }, + { NULL, NULL } + }; + if (StartServiceCtrlDispatcher(st)) + return 0; + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED + && GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) + return 1; +#endif +#else + if (argc >= 2) + { + if (!strcmp(argv[1], "--conf_file") && argc >= 3) + g_conf_file = argv[2]; + else + return 1; + } +#endif + return main1(); +} diff --git a/install/xbt/linux/Tracker/XBT Tracker.nsi b/install/xbt/linux/Tracker/XBT Tracker.nsi new file mode 100644 index 000000000..19b998665 --- /dev/null +++ b/install/xbt/linux/Tracker/XBT Tracker.nsi @@ -0,0 +1,46 @@ +!define VERSION "0.3.0" + +Name "XBT Tracker ${VERSION}" +Outfile "XBT_Tracker-${VERSION}.exe" +InstallDir "$PROGRAMFILES\XBT\Tracker" +InstallDirRegKey HKLM "Software\XBT\Tracker" "InstallDir" +XPStyle on +Page directory +Page instfiles +UninstPage uninstConfirm +UninstPage instfiles + +Section "Install" + SetShellVarContext all + SetOutPath "$INSTDIR" + + Delete "$INSTDIR\XBT Tracker.exe" + Delete "$INSTDIR\XBT Tracker Old.exe" + Rename "$INSTDIR\XBT Tracker.exe" "$INSTDIR\XBT Tracker Old.exe" + File "release\XBT Tracker.exe" + File xbt_tracker.conf.default + File xbt_tracker.sql + SetOverwrite off + File /oname=xbt_tracker.conf xbt_tracker.conf.default + SetOutPath "$INSTDIR\htdocs" + File htdocs\* + Exec "$INSTDIR\XBT Tracker.exe --install" + WriteUninstaller "$INSTDIR\Uninstall.exe" + CreateShortCut "$SMPROGRAMS\XBT Tracker.lnk" "$INSTDIR\XBT Tracker.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\XBT Tracker" "DisplayName" "XBT Tracker ${VERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\XBT Tracker" "UninstallString" '"$INSTDIR\Uninstall.exe"' + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\XBT Tracker" "NoModify" 1 + WriteRegStr HKLM "Software\XBT\Tracker" "InstallDir" "$INSTDIR" +SectionEnd + +Section "Uninstall" + SetShellVarContext all + ExecWait 'net stop "XBT Tracker"' + ExecWait "$INSTDIR\XBT Tracker.exe --uninstall" + Delete "$SMPROGRAMS\XBT Tracker.lnk" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\XBT Tracker" + DeleteRegKey HKLM "Software\XBT\Tracker" + DeleteRegKey /ifempty HKLM "Software\XBT" + RMDir /r "$PROGRAMFILES\XBT\Tracker" + RMDir "$PROGRAMFILES\XBT" +SectionEnd diff --git a/install/xbt/linux/Tracker/XBT Tracker.rc b/install/xbt/linux/Tracker/XBT Tracker.rc new file mode 100644 index 000000000..c7dafe654 --- /dev/null +++ b/install/xbt/linux/Tracker/XBT Tracker.rc @@ -0,0 +1,3 @@ +#include "resource.h" + +IDR_MAINFRAME ICON "res\\XBT Tracker.ico" diff --git a/install/xbt/linux/Tracker/XBT Tracker.sln b/install/xbt/linux/Tracker/XBT Tracker.sln new file mode 100644 index 000000000..59cf16a96 --- /dev/null +++ b/install/xbt/linux/Tracker/XBT Tracker.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XBT Tracker", "XBT Tracker.vcproj", "{73C570AC-E7C3-451D-A5C6-7A2532F0121B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {73C570AC-E7C3-451D-A5C6-7A2532F0121B}.Debug|Win32.ActiveCfg = Debug|Win32 + {73C570AC-E7C3-451D-A5C6-7A2532F0121B}.Debug|Win32.Build.0 = Debug|Win32 + {73C570AC-E7C3-451D-A5C6-7A2532F0121B}.Release|Win32.ActiveCfg = Release|Win32 + {73C570AC-E7C3-451D-A5C6-7A2532F0121B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/install/xbt/linux/Tracker/XBT Tracker.vcproj b/install/xbt/linux/Tracker/XBT Tracker.vcproj new file mode 100644 index 000000000..9e4b290e2 --- /dev/null +++ b/install/xbt/linux/Tracker/XBT Tracker.vcproj @@ -0,0 +1,709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/install/xbt/linux/Tracker/XBT Tracker.vcxproj b/install/xbt/linux/Tracker/XBT Tracker.vcxproj new file mode 100644 index 000000000..5e56f4abd --- /dev/null +++ b/install/xbt/linux/Tracker/XBT Tracker.vcxproj @@ -0,0 +1,265 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {73C570AC-E7C3-451D-A5C6-7A2532F0121B} + XBT Tracker + + + + Application + false + MultiByte + + + Application + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\misc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreaded + true + Use + stdafx.h + Level3 + + + NDEBUG;%(PreprocessorDefinitions) + 0x0413 + + + zlib.lib;%(AdditionalDependencies) + Console + UseLinkTimeCodeGeneration + false + + + MachineX86 + + + + + + + + + Disabled + ..\misc;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Use + stdafx.h + Level1 + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0413 + + + zlib.lib;%(AdditionalDependencies) + libcmt;%(IgnoreSpecificDefaultLibraries) + true + Console + false + + + MachineX86 + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + Create + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + Create + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/install/xbt/linux/Tracker/client.h b/install/xbt/linux/Tracker/client.h new file mode 100644 index 000000000..3f6f9eadf --- /dev/null +++ b/install/xbt/linux/Tracker/client.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +class Cserver; + +class Cclient +{ +public: + virtual void process_events(int) = 0; + virtual ~Cclient() + { + } +protected: + const Csocket& s() const + { + return m_s; + } + + void s(const Csocket& s) + { + m_s = s; + } + + Csocket m_s; + Cserver* m_server; +}; diff --git a/install/xbt/linux/Tracker/config.cpp b/install/xbt/linux/Tracker/config.cpp new file mode 100644 index 000000000..0f19cf731 --- /dev/null +++ b/install/xbt/linux/Tracker/config.cpp @@ -0,0 +1,146 @@ +#include "stdafx.h" +#include "config.h" + +#include +#include + +Cconfig::Cconfig() +{ + fill_maps(NULL); +} + +Cconfig::Cconfig(const Cconfig& v) +{ + fill_maps(&v); +} + +const Cconfig& Cconfig::operator=(const Cconfig& v) +{ + fill_maps(&v); + return *this; +} + +void Cconfig::fill_maps(const Cconfig* v) +{ + { + t_attribute attributes[] = + { + "auto_register", &m_auto_register, false, + "anonymous_connect", &m_anonymous_connect, true, + "anonymous_announce", &m_anonymous_announce, true, + "anonymous_scrape", &m_anonymous_scrape, true, + "daemon", &m_daemon, true, + "debug", &m_debug, false, + "full_scrape", &m_full_scrape, false, + "gzip_debug", &m_gzip_debug, true, + "gzip_scrape", &m_gzip_scrape, true, + "log_access", &m_log_access, false, + "log_announce", &m_log_announce, false, + "log_scrape", &m_log_scrape, false, + + // TorrentPier begin + "gdc", &m_gdc, true, + "free_leech", &m_free_leech, false, + "trust_ipv6", &m_trust_ipv6, false, + // TorrentPier end + + NULL + }; + fill_map(attributes, v ? &v->m_attributes_bool : NULL, m_attributes_bool); + } + { + t_attribute attributes[] = + { + "announce_interval", &m_announce_interval, 1800, + "clean_up_interval", &m_clean_up_interval, 60, + "read_config_interval", &m_read_config_interval, 60, + "read_db_interval", &m_read_db_interval, 60, + "scrape_interval", &m_scrape_interval, 0, + "write_db_interval", &m_write_db_interval, 15, + + // TorrentPier begin + "cheat_upload", &m_cheat_upload, 18, + "read_files_interval", &m_read_files_interval, 60, + // TorrentPier end + + NULL + }; + fill_map(attributes, v ? &v->m_attributes_int : NULL, m_attributes_int); + } + { + t_attribute attributes[] = + { + "column_files_completed", &m_column_files_completed, "completed", + "column_files_fid", &m_column_files_fid, "fid", + "column_files_leechers", &m_column_files_leechers, "leechers", + "column_files_seeders", &m_column_files_seeders, "seeders", + "column_users_uid", &m_column_users_uid, "uid", + "mysql_database", &m_mysql_database, "xbt", + "mysql_host", &m_mysql_host, "localhost", + "mysql_password", &m_mysql_password, "", + "mysql_table_prefix", &m_mysql_table_prefix, "xbt_", + "mysql_user", &m_mysql_user, "", + "offline_message", &m_offline_message, "", + "pid_file", &m_pid_file, "", + "query_log", &m_query_log, "", + "redirect_url", &m_redirect_url, "", + "table_announce_log", &m_table_announce_log, "", + "table_deny_from_hosts", &m_table_deny_from_hosts, "", + "table_files", &m_table_files, "", + "table_files_users", &m_table_files_users, "", + "table_scrape_log", &m_table_scrape_log, "", + "table_users", &m_table_users, "", + "torrent_pass_private_key", &m_torrent_pass_private_key, "", + + // TorrentPier begin + "column_files_dl_percent", &m_column_files_dl_percent, "", + "column_users_can_leech", &m_column_users_can_leech, "", + "column_users_torrents_limit", &m_column_users_torrents_limit, "", + // TorrentPier end + + NULL, NULL, "" + }; + fill_map(attributes, v ? &v->m_attributes_string : NULL, m_attributes_string); + } + if (v) + { + m_listen_ipas = v->m_listen_ipas; + m_listen_ports = v->m_listen_ports; + } +} + +int Cconfig::set(const std::string& name, const std::string& value) +{ + if (t_attribute* i = find_ptr(m_attributes_string, name)) + *i->value = value; + else if (name == "listen_ipa") + + // TorrentPier begin + m_listen_ipas.insert(value); + else if (name == "listen_port") + m_listen_ports.insert(value); + // TorrentPier end + + else + return set(name, atoi(value.c_str())); + return 0; +} + +int Cconfig::set(const std::string& name, int value) +{ + if (t_attribute* i = find_ptr(m_attributes_int, name)) + *i->value = value; + // TorrentPier // listen_port + else + return set(name, static_cast(value)); + return 0; +} + +int Cconfig::set(const std::string& name, bool value) +{ + if (t_attribute* i = find_ptr(m_attributes_bool, name)) + *i->value = value; + else + return 1; + return 0; +} diff --git a/install/xbt/linux/Tracker/config.h b/install/xbt/linux/Tracker/config.h new file mode 100644 index 000000000..0a309c305 --- /dev/null +++ b/install/xbt/linux/Tracker/config.h @@ -0,0 +1,75 @@ +#pragma once + +#include + +class Cconfig: public Cconfig_base +{ +public: + // TorrentPier begin + typedef std::set t_listen_ipas; + typedef std::set t_listen_ports; + // TorrentPier end + + int set(const std::string& name, const std::string& value); + int set(const std::string& name, int value); + int set(const std::string& name, bool value); + Cconfig(); + Cconfig(const Cconfig&); + const Cconfig& operator=(const Cconfig&); + + bool m_anonymous_announce; + bool m_anonymous_connect; + bool m_anonymous_scrape; + bool m_auto_register; + bool m_daemon; + bool m_debug; + bool m_full_scrape; + bool m_gzip_debug; + bool m_gzip_scrape; + bool m_log_access; + bool m_log_announce; + bool m_log_scrape; + int m_announce_interval; + int m_clean_up_interval; + int m_read_config_interval; + int m_read_db_interval; + int m_scrape_interval; + int m_write_db_interval; + std::string m_column_files_completed; + std::string m_column_files_fid; + std::string m_column_files_leechers; + std::string m_column_files_seeders; + std::string m_column_users_uid; + std::string m_mysql_database; + std::string m_mysql_host; + std::string m_mysql_password; + std::string m_mysql_table_prefix; + std::string m_mysql_user; + std::string m_offline_message; + std::string m_query_log; + std::string m_pid_file; + std::string m_redirect_url; + std::string m_table_announce_log; + std::string m_table_deny_from_hosts; + std::string m_table_files; + std::string m_table_files_users; + std::string m_table_scrape_log; + std::string m_table_users; + std::string m_torrent_pass_private_key; + t_listen_ipas m_listen_ipas; + t_listen_ports m_listen_ports; + + // TorrentPier begin + bool m_gdc; + bool m_free_leech; + std::string m_column_files_dl_percent; + std::string m_column_users_can_leech; + std::string m_column_users_torrents_limit; + int m_read_files_interval; + bool m_trust_ipv6; + int m_cheat_upload; + // TorrentPier end + +private: + void fill_maps(const Cconfig*); +}; diff --git a/install/xbt/linux/Tracker/connection.cpp b/install/xbt/linux/Tracker/connection.cpp new file mode 100644 index 000000000..ced4adf70 --- /dev/null +++ b/install/xbt/linux/Tracker/connection.cpp @@ -0,0 +1,339 @@ +#include "stdafx.h" +#include "connection.h" + +#include +#include +#include +#include +#include +#include "server.h" + +// TorrentPier begin + +#ifdef WIN32 +#include +#endif + +#define PASS_SIZE1 10 +#define PASS_SIZE2 32 + +Cconnection::Cconnection(Cserver* server, const Csocket& s, const sockaddr_storage& a) +// TorrentPier end +{ + m_server = server; + m_s = s; + m_a = a; + m_ctime = server->time(); + + m_state = 0; + m_r.clear(); + m_w = m_read_b; +} + +int Cconnection::pre_select(fd_set* fd_read_set, fd_set* fd_write_set) +{ + FD_SET(m_s, fd_read_set); + if (!m_r.empty()) + FD_SET(m_s, fd_write_set); + return m_s; +} + +int Cconnection::post_select(fd_set* fd_read_set, fd_set* fd_write_set) +{ + return FD_ISSET(m_s, fd_read_set) && recv() + || FD_ISSET(m_s, fd_write_set) && send() + || m_server->time() - m_ctime > 10 + || m_state == 5 && m_r.empty(); +} + +int Cconnection::recv() +{ + int r = m_s.recv(m_w); + if (!r) + { + m_state = 5; + return 0; + } + if (r == SOCKET_ERROR) + { + int e = WSAGetLastError(); + switch (e) + { + case WSAECONNABORTED: + case WSAECONNRESET: + return 1; + case WSAEWOULDBLOCK: + return 0; + } + std::cerr << "recv failed: " << Csocket::error2a(e) << std::endl; + return 1; + } + if (m_state == 5) + return 0; + const unsigned char* a = m_w; + m_w += r; + int state; + do + { + state = m_state; + while (a < m_w && *a != '\n' && *a != '\r') + { + a++; + if (m_state) + m_state = 1; + } + if (a < m_w) + { + switch (m_state) + { + case 0: + read(std::string(&m_read_b.front(), reinterpret_cast(a) - &m_read_b.front())); + m_state = 1; + case 1: + case 3: + m_state += *a == '\n' ? 2 : 1; + break; + case 2: + case 4: + m_state++; + break; + } + a++; + } + } + while (state != m_state); + return 0; +} + +int Cconnection::send() +{ + if (m_r.empty()) + return 0; + int r = m_s.send(m_r); + if (r == SOCKET_ERROR) + { + int e = WSAGetLastError(); + switch (e) + { + case WSAECONNABORTED: + case WSAECONNRESET: + return 1; + case WSAEWOULDBLOCK: + return 0; + } + std::cerr << "send failed: " << Csocket::error2a(e) << std::endl; + return 1; + } + m_r += r; + if (m_r.empty()) + m_write_b.clear(); + return 0; +} + +void Cconnection::read(const std::string& v) +{ +#ifndef NDEBUG + std::cout << v << std::endl; +#endif + if (m_server->config().m_log_access) + { + // TorrentPier begin + char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; + if (!getnameinfo(reinterpret_cast(&m_a), sizeof(m_a), hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) { + static std::ofstream f("xbt_tracker_raw.log"); + f << m_server->time() << '\t' << hbuf << '\t' << sbuf << '\t' << v << std::endl; + } + } + Ctracker_input ti(m_a.ss_family); + // TorrentPier end + + size_t e = v.find('?'); + if (e == std::string::npos) + e = v.size(); + else + { + size_t a = e + 1; + size_t b = v.find(' ', a); + if (b == std::string::npos) + return; + while (a < b) + { + // TorrentPier begin + if( v[a] == '&' || v[a] == '?' ) { a++; continue; } // "&&?" hack + // TorrentPier end + + size_t c = v.find('=', a); + if (c++ == std::string::npos) + break; + size_t d = v.find_first_of(" &", c); + if (d == std::string::npos) + break; + ti.set(v.substr(a, c - a - 1), uri_decode(v.substr(c, d - c))); + a = d + 1; + } + } + + // TorrentPier begin + if (m_a.ss_family == AF_INET) { + sockaddr_in *b = reinterpret_cast(&m_a); + if (!ti.m_ipa || !is_private_ipa(b->sin_addr.s_addr)) + ti.m_ipa = b->sin_addr.s_addr; + } else if (m_a.ss_family == AF_INET6) { + sockaddr_in6 *b = reinterpret_cast(&m_a); + ti.m_ipv6set = true; + memcpy(ti.m_ipv6bin, &(b->sin6_addr), 16); + } + + std::string torrent_pass0 = ti.m_passkey; + // TorrentPier end + + size_t a = 4; + if (a < e && v[a] == '/') + { + do { a++; + } while (a < e && v[a] == '/'); + if (a + 1 < e && v[a + 1] == '/') + a += 2; + + // TorrentPier begin + if (a + 2 < e && v[a + 2] == '/') // Skip "/bt/" + a += 3; + + if (a + PASS_SIZE1 < e && v[a + PASS_SIZE1] == '/') + { + torrent_pass0 = v.substr(a, PASS_SIZE1); + a += PASS_SIZE1+1; + } + + if (a + PASS_SIZE2 < e && v[a + PASS_SIZE2] == '/') + { + torrent_pass0 = v.substr(a, PASS_SIZE2); + a += PASS_SIZE2+1; + } + // TorrentPier end + } + std::string h = "HTTP/1.0 200 OK\r\n"; + Cvirtual_binary s; + bool gzip = true; + switch (a < v.size() ? v[a] : 0) + { + case 'a': + if (!ti.valid()) + break; + gzip = false; + if (ti.banned()) + s = Cbvalue().d(bts_failure_reason, bts_banned_client).read(); + else if (0) + s = Cbvalue().d(bts_failure_reason, bts_banned_client).read(); + else + { + std::string error = m_server->insert_peer(ti, false, m_server->find_user_by_torrent_pass(torrent_pass0, ti.m_info_hash)); + s = error.empty() ? m_server->select_peers(ti) : Cbvalue().d(bts_failure_reason, error).read(); + } + break; + case 'd': + if (m_server->config().m_debug) + { + gzip = m_server->config().m_gzip_debug; + h += "Content-Type: text/html; charset=us-ascii\r\n"; + s = Cvirtual_binary(m_server->debug(ti)); + } + break; + case 's': + if (v.size() >= 7 && v[6] == 't') + { + gzip = m_server->config().m_gzip_debug; + h += "Content-Type: text/html; charset=us-ascii\r\n"; + s = Cvirtual_binary(m_server->statistics()); + } + else if (m_server->config().m_full_scrape || ti.m_compact || !ti.m_info_hash.empty()) + { + gzip = m_server->config().m_gzip_scrape && !ti.m_compact && ti.m_info_hash.empty(); + s = m_server->scrape(ti); + } + break; + } + if (s.empty()) + { + if (!ti.m_peer_id.empty() || m_server->config().m_redirect_url.empty()) + h = "HTTP/1.0 404 Not Found\r\n"; + else + { + h = "HTTP/1.0 302 Found\r\n" + "Location: " + m_server->config().m_redirect_url + (ti.m_info_hash.empty() ? "" : "?info_hash=" + uri_encode(ti.m_info_hash)) + "\r\n"; + } + } + else if (gzip) + { + Cvirtual_binary s2 = xcc_z::gzip(s); +#ifndef NDEBUG + static std::ofstream f("xbt_tracker_gzip.log"); + f << m_server->time() << '\t' << v[5] << '\t' << s.size() << '\t' << s2.size() << std::endl; +#endif + if (s2.size() + 24 < s.size()) + { + h += "Content-Encoding: gzip\r\n"; + s = s2; + } + } + h += "\r\n"; +#ifdef WIN32 + m_write_b.resize(h.size() + s.size()); + memcpy(m_write_b.data_edit(), h.data(), h.size()); + s.read(m_write_b.data_edit() + h.size()); + int r = m_s.send(m_write_b); +#else + boost::array d; + d[0].iov_base = const_cast(h.data()); + d[0].iov_len = h.size(); + d[1].iov_base = const_cast(s.data()); + d[1].iov_len = s.size(); + msghdr m; + m.msg_name = NULL; + m.msg_namelen = 0; + m.msg_iov = const_cast(d.data()); + m.msg_iovlen = d.size(); + m.msg_control = NULL; + m.msg_controllen = 0; + m.msg_flags = 0; + int r = sendmsg(m_s, &m, MSG_NOSIGNAL); +#endif + if (r == SOCKET_ERROR) + { + if (WSAGetLastError() != WSAECONNRESET) + std::cerr << "send failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + } + else if (r != h.size() + s.size()) + { +#ifndef WIN32 + if (r < h.size()) + { + m_write_b.resize(h.size() + s.size()); + memcpy(m_write_b.data_edit(), h.data(), h.size()); + s.read(m_write_b.data_edit() + h.size()); + } + else + { + m_write_b = s; + r -= h.size(); + } +#endif + m_r = m_write_b; + m_r += r; + } + if (m_r.empty()) + m_write_b.clear(); +} + +void Cconnection::process_events(int events) +{ + if (events & (EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP) && recv() + || events & EPOLLOUT && send() + || m_state == 5 && m_write_b.empty()) + m_s.close(); +} + +int Cconnection::run() +{ + return s() == INVALID_SOCKET || m_server->time() - m_ctime > 10; +} diff --git a/install/xbt/linux/Tracker/connection.h b/install/xbt/linux/Tracker/connection.h new file mode 100644 index 000000000..9bdba027a --- /dev/null +++ b/install/xbt/linux/Tracker/connection.h @@ -0,0 +1,33 @@ +#pragma once + +#include "client.h" +#include +#include + +class Cserver; + +class Cconnection: public Cclient, boost::noncopyable +{ +public: + Cclient::s; + int run(); + void read(const std::string&); + int recv(); + int send(); + virtual void process_events(int); + int pre_select(fd_set* fd_read_set, fd_set* fd_write_set); + int post_select(fd_set* fd_read_set, fd_set* fd_write_set); + + // TorrentPier begin + Cconnection(Cserver*, const Csocket&, const sockaddr_storage&); +private: + sockaddr_storage m_a; + // TorrentPier end + + time_t m_ctime; + int m_state; + boost::array m_read_b; + Cvirtual_binary m_write_b; + const_memory_range m_r; + memory_range m_w; +}; diff --git a/install/xbt/linux/Tracker/epoll.cpp b/install/xbt/linux/Tracker/epoll.cpp new file mode 100644 index 000000000..cce7bed39 --- /dev/null +++ b/install/xbt/linux/Tracker/epoll.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "epoll.h" + +Cepoll::Cepoll() +{ + m_fd = -1; +} + +Cepoll::~Cepoll() +{ +#ifdef EPOLL + if (m_fd != -1) + close(m_fd); +#endif +} + +int Cepoll::create(int size) +{ +#ifdef EPOLL + return m_fd = epoll_create(size); +#else + return 0; +#endif +} + +int Cepoll::ctl(int op, int fd, int events, void* p) +{ +#ifdef EPOLL + epoll_event e; + e.data.ptr = p; + e.events = events; + return epoll_ctl(m_fd, op, fd, &e); +#else + return 0; +#endif +} + +int Cepoll::wait(epoll_event* events, int maxevents, int timeout) +{ +#ifdef EPOLL + return epoll_wait(m_fd, events, maxevents, timeout); +#else + return 0; +#endif +} diff --git a/install/xbt/linux/Tracker/epoll.h b/install/xbt/linux/Tracker/epoll.h new file mode 100644 index 000000000..6aa9b7198 --- /dev/null +++ b/install/xbt/linux/Tracker/epoll.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +#ifdef EPOLL +#include +#else +enum +{ + EPOLLIN = 1, + EPOLLOUT = 2, + EPOLLPRI = 4, + EPOLLERR = 8, + EPOLLHUP = 0x10, + EPOLLET = 0x20, + EPOLLONESHOT = 0x40, +}; + +enum +{ + EPOLL_CTL_ADD = 1, + EPOLL_CTL_MOD = 2, + EPOLL_CTL_DEL = 4, +}; + +typedef void epoll_event; +#endif + +class Cepoll: boost::noncopyable +{ +public: + int create(int size); + int ctl(int op, int fd, int events, void* p); + int wait(epoll_event* events, int maxevents, int timeout); + Cepoll(); + ~Cepoll(); +private: + int m_fd; +}; diff --git a/install/xbt/linux/Tracker/make.bsd.google_perftools.sh b/install/xbt/linux/Tracker/make.bsd.google_perftools.sh new file mode 100644 index 000000000..f69d1bdce --- /dev/null +++ b/install/xbt/linux/Tracker/make.bsd.google_perftools.sh @@ -0,0 +1 @@ +g++ $@ -DNDEBUG -DPEERS_KEY -ltcmalloc -I /usr/local/include -I ../misc -I . -O3 -o xbt_tracker *.cpp ../misc/*.cpp ../misc/sql/*.cpp `mysql_config --libs` && strip xbt_tracker diff --git a/install/xbt/linux/Tracker/make.bsd.sh b/install/xbt/linux/Tracker/make.bsd.sh new file mode 100644 index 000000000..581aa1b9c --- /dev/null +++ b/install/xbt/linux/Tracker/make.bsd.sh @@ -0,0 +1 @@ +g++ $@ -DNDEBUG -DPEERS_KEY -I /usr/local/include -I ../misc -I . -O3 -o xbt_tracker *.cpp ../misc/*.cpp ../misc/sql/*.cpp `mysql_config --libs` && strip xbt_tracker diff --git a/install/xbt/linux/Tracker/make.sh b/install/xbt/linux/Tracker/make.sh new file mode 100644 index 000000000..f536e4552 --- /dev/null +++ b/install/xbt/linux/Tracker/make.sh @@ -0,0 +1,20 @@ +g++ $@ -DNDEBUG -I ../misc -I . -O3 -o xbt_tracker \ + ../misc/sql/database.cpp \ + ../misc/sql/sql_query.cpp \ + ../misc/sql/sql_result.cpp \ + ../misc/bt_misc.cpp \ + ../misc/bvalue.cpp \ + ../misc/sha1.cpp \ + ../misc/socket.cpp \ + ../misc/virtual_binary.cpp \ + ../misc/xcc_z.cpp \ + config.cpp \ + connection.cpp \ + epoll.cpp \ + server.cpp \ + tcp_listen_socket.cpp \ + tracker_input.cpp \ + transaction.cpp \ + udp_listen_socket.cpp \ + "XBT Tracker.cpp" \ + `mysql_config --libs` && strip xbt_tracker diff --git a/install/xbt/linux/Tracker/md5.cpp b/install/xbt/linux/Tracker/md5.cpp new file mode 100644 index 000000000..7c215789c --- /dev/null +++ b/install/xbt/linux/Tracker/md5.cpp @@ -0,0 +1,362 @@ +/* MD5 + converted to C++ class by Frank Thilo (thilo@unix-ag.org) + for bzflag (http://www.bzflag.org) + + based on: + + md5.h and md5.c + reference implemantion of RFC 1321 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + +*/ + +/* interface header */ +#include "md5.h" + +/* system implementation headers */ +#include +#include + +// Constants for MD5Transform routine. +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +/////////////////////////////////////////////// + +// F, G, H and I are basic MD5 functions. +inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) { + return x&y | ~x&z; +} + +inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) { + return x&z | y&~z; +} + +inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) { + return x^y^z; +} + +inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) { + return y ^ (x | ~z); +} + +// rotate_left rotates x left n bits. +inline MD5::uint4 MD5::rotate_left(uint4 x, int n) { + return (x << n) | (x >> (32-n)); +} + +// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +// Rotation is separate from addition to prevent recomputation. +inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a+ F(b,c,d) + x + ac, s) + b; +} + +inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + G(b,c,d) + x + ac, s) + b; +} + +inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + H(b,c,d) + x + ac, s) + b; +} + +inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + I(b,c,d) + x + ac, s) + b; +} + +////////////////////////////////////////////// + +// default ctor, just initailize +MD5::MD5() +{ + init(); +} + +////////////////////////////////////////////// + +// nifty shortcut ctor, compute MD5 for string and finalize it right away +MD5::MD5(const std::string &text) +{ + init(); + update(text.c_str(), text.length()); + finalize(); +} + +////////////////////////////// + +void MD5::init() +{ + finalized=false; + + count[0] = 0; + count[1] = 0; + + // load magic initialization constants. + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; +} + +////////////////////////////// + +// decodes input (unsigned char) into output (uint4). Assumes len is a multiple of 4. +void MD5::decode(uint4 output[], const uint1 input[], size_type len) +{ + for (unsigned int i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) | + (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24); +} + +////////////////////////////// + +// encodes input (uint4) into output (unsigned char). Assumes len is +// a multiple of 4. +void MD5::encode(uint1 output[], const uint4 input[], size_type len) +{ + for (size_type i = 0, j = 0; j < len; i++, j += 4) { + output[j] = input[i] & 0xff; + output[j+1] = (input[i] >> 8) & 0xff; + output[j+2] = (input[i] >> 16) & 0xff; + output[j+3] = (input[i] >> 24) & 0xff; + } +} + +////////////////////////////// + +// apply MD5 algo on a block +void MD5::transform(const uint1 block[blocksize]) +{ + uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + decode (x, block, blocksize); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + // Zeroize sensitive information. + memset(x, 0, sizeof x); +} + +////////////////////////////// + +// MD5 block update operation. Continues an MD5 message-digest +// operation, processing another message block +void MD5::update(const unsigned char input[], size_type length) +{ + // compute number of bytes mod 64 + size_type index = count[0] / 8 % blocksize; + + // Update number of bits + if ((count[0] += (length << 3)) < (length << 3)) + count[1]++; + count[1] += (length >> 29); + + // number of bytes we need to fill in buffer + size_type firstpart = 64 - index; + + size_type i; + + // transform as many times as possible. + if (length >= firstpart) + { + // fill buffer first, transform + memcpy(&buffer[index], input, firstpart); + transform(buffer); + + // transform chunks of blocksize (64 bytes) + for (i = firstpart; i + blocksize <= length; i += blocksize) + transform(&input[i]); + + index = 0; + } + else + i = 0; + + // buffer remaining input + memcpy(&buffer[index], &input[i], length-i); +} + +////////////////////////////// + +// for convenience provide a verson with signed char +void MD5::update(const char input[], size_type length) +{ + update((const unsigned char*)input, length); +} + +////////////////////////////// + +// MD5 finalization. Ends an MD5 message-digest operation, writing the +// the message digest and zeroizing the context. +MD5& MD5::finalize() +{ + static unsigned char padding[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + if (!finalized) { + // Save number of bits + unsigned char bits[8]; + encode(bits, count, 8); + + // pad out to 56 mod 64. + size_type index = count[0] / 8 % 64; + size_type padLen = (index < 56) ? (56 - index) : (120 - index); + update(padding, padLen); + + // Append length (before padding) + update(bits, 8); + + // Store state in digest + encode(digest, state, 16); + + // Zeroize sensitive information. + memset(buffer, 0, sizeof buffer); + memset(count, 0, sizeof count); + + finalized=true; + } + + return *this; +} + +////////////////////////////// + +// return hex representation of digest as string +std::string MD5::hexdigest() const +{ + if (!finalized) + return ""; + + char buf[33]; + for (int i=0; i<16; i++) + sprintf(buf+i*2, "%02x", digest[i]); + buf[32]=0; + + return std::string(buf); +} + +////////////////////////////// + +std::ostream& operator<<(std::ostream& out, MD5 md5) +{ + return out << md5.hexdigest(); +} + +////////////////////////////// + +std::string md5(const std::string str) +{ + MD5 md5 = MD5(str); + + return md5.hexdigest(); +} diff --git a/install/xbt/linux/Tracker/md5.h b/install/xbt/linux/Tracker/md5.h new file mode 100644 index 000000000..4f6a8cebd --- /dev/null +++ b/install/xbt/linux/Tracker/md5.h @@ -0,0 +1,93 @@ +/* MD5 + converted to C++ class by Frank Thilo (thilo@unix-ag.org) + for bzflag (http://www.bzflag.org) + + based on: + + md5.h and md5.c + reference implementation of RFC 1321 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + +*/ + +#ifndef BZF_MD5_H +#define BZF_MD5_H + +#include +#include + + +// a small class for calculating MD5 hashes of strings or byte arrays +// it is not meant to be fast or secure +// +// usage: 1) feed it blocks of uchars with update() +// 2) finalize() +// 3) get hexdigest() string +// or +// MD5(std::string).hexdigest() +// +// assumes that char is 8 bit and int is 32 bit +class MD5 +{ +public: + typedef unsigned int size_type; // must be 32bit + + MD5(); + MD5(const std::string& text); + void update(const unsigned char *buf, size_type length); + void update(const char *buf, size_type length); + MD5& finalize(); + std::string hexdigest() const; + friend std::ostream& operator<<(std::ostream&, MD5 md5); + +private: + void init(); + typedef unsigned char uint1; // 8bit + typedef unsigned int uint4; // 32bit + enum {blocksize = 64}; // VC6 won't eat a const static int here + + void transform(const uint1 block[blocksize]); + static void decode(uint4 output[], const uint1 input[], size_type len); + static void encode(uint1 output[], const uint4 input[], size_type len); + + bool finalized; + uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk + uint4 count[2]; // 64bit counter for number of bits (lo, hi) + uint4 state[4]; // digest so far + uint1 digest[16]; // the result + + // low level logic operations + static inline uint4 F(uint4 x, uint4 y, uint4 z); + static inline uint4 G(uint4 x, uint4 y, uint4 z); + static inline uint4 H(uint4 x, uint4 y, uint4 z); + static inline uint4 I(uint4 x, uint4 y, uint4 z); + static inline uint4 rotate_left(uint4 x, int n); + static inline void FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); +}; + +std::string md5(const std::string str); + +#endif diff --git a/install/xbt/linux/Tracker/res/Thumbs.db b/install/xbt/linux/Tracker/res/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..1b7e063e71c8bc9fdd8d9d0c06de6e18ed08186f GIT binary patch literal 5120 zcmeI02{e@JAIIM@GlsDhgl6tD_tyP)?)i64_n!Yb|MUN!e((D^&u^Y(p6C1fz3(&cJ1^P< zhSTp!j6i>}-4GmNFgYRiFX~~yXYsr7Ll7HqSf3e8Ci9O<2mMDYkJzs78`wgGxW|e<;G%IJU*s*f*@9uw2P|pe#7l0eU1KK*Z0zw#JVPS4QQ85vWm>@7Iva5QLij~;1SK*y zF8*3V;`JLz8JStPvU76tZr?91DJ?61P*M4qTHnyv^yKNYj+dRUx@g@!y(6Pzuj%6x zzrLBAn_qapxU{_TVU?u|2EqT3^{2AG=n??B*boRf0>#n=WAg{V1rW&1>gdm0QNU!}uR?$M)d&jZx&fhg+or0v=u6Zednc>h)k> zQ?$Z`N3O$tefZ;2Bxk+d%LN9>OSI;*M0L14R^8msB<8v-tis!@tci18ypeE&e#bm_ zr1On|S^yLJnKIb?VtM-ydh&`}JM){hJDSq%0&%kz`Cj&^YAc0v1ar!aLrK|#>btM> zG(0`GbQIX@_4=kn^1p3Yol3AL&&2ny<+je5P*X*#I}7y`=d?%1J%jt=kZKz!Ye4Ryn!J{5^V|=&^wy3f;WD7Cg)|^k>bum4~6P^ z=d`yo_nXldC2bDpzBamI?OmG^OPpHAW=!p@)}3oi^CjjS%CL4%N=~S32%j=7$Jx4x ziXIT#D;Vjw6rN&QjN|r$)CbyFP5Lb7HVCV6&Dvmc@T2YhXxJPyw*0aDAe1bKV}mb z)1=%)EQ;MXO4Pj6beA-~pL+5^Y3fO*yW`I89#DGsp^JXrE2% zN%hw+Z|hk&H8_wHab{YrA>d%(pmpJ|*TW zC4VWgVNmYL)S-)I6{9!>n0qj)e+l4ny1w*xPrwol2>Vw zzA~+j84Wr+T1>|AQIwlrX8kSmhvZGv9Ty(jk4+{ut*fSSJ@vfVh9of|sy{{9#&qP4 zCeeWX@LiPC+;$xcs*wsYncui*yn7^5&&)@uL{3U5uiWJLs-?{t(~pX+jcKnkkLW(b z#w;=j7c*;STmzt$Pwiqf0RBbe!5yD&^4_|!|tT+I{%xEIvp9Ui}Cv5 zRUO>Yr8WulQ58cY`JKD0t{fS%w7MHCL>d~2A?pnlXXlMJD~I}&`(Imv$>&EuBD64C z=L4dvJ($o@x2CW(lZbrR zvphXS|B&0~f68=Bytm?4<=4TI!FAe!;v%1|Z*Pd2h)-t9o6!ekhl4%op6t9a3(RbqBxi7xoO@=2K!FkR1X%7+J+*?qq z53-<9Ei17Rfog^Q-R{Nil>z;2Ig|GpjGYyf{rkfX6p4!+yM!Kt3zyC&n!U)F9VCxR zRvn)nlU(aX0MmlP_Au6i29-)SpA1!%qw@ z>BI;Qko@f`N-EM0hkCs2uPPl#&FETqyg&X#>`#-;*IZDjE5=3UAJ4BV5=OBx8+B=_ zrG>|BVyHIGAsq#a8*unF{MkEbZEMkQPkf!^tHakA6N(+aX~#F`+^I{B zS?3z5;X7$yq89$%*D**@2`!obYtK&x{u^fTGm@h?)vV~GovX{WHJs}Lvo+H-vlmyi zsSLq2zqV2)j~a`vSh@}$$Er<7R^7uK)U$gb?+@ldh; z=VIN~?fZ|dGK`o#pP!rlQOOVfDPTQ$*?(dOD1UzvtE=YX1@C%R;7!L2+63?hZ&{9z UJLC*JRmc_io}lk{`|n2JHz&LR82|tP literal 0 HcmV?d00001 diff --git a/install/xbt/linux/Tracker/res/XBT Tracker.ico b/install/xbt/linux/Tracker/res/XBT Tracker.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e2f5d148e1288a9e7e1618ef3a2bee724b74553 GIT binary patch literal 7406 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 lzlVC71b18ee$y}Bm#*(2?Hwl;D2 +#include +#include +#include +#include +#include +#include +#include +#include +#include "transaction.h" + +// TorrentPier begin +#include "md5.cpp" +#ifdef WIN32 +#include +#endif + +long long gcd(long long a, long long b) { + long long c = 0; + while (b) { + c = a % b; + a = b; + b = c; + } + return a; +} +// TorrentPier end + +static volatile bool g_sig_term = false; + +Cserver::Cserver(Cdatabase& database, const std::string& table_prefix, bool use_sql, const std::string& conf_file): + m_database(database) +{ + m_fid_end = 0; + + for (int i = 0; i < 8; i++) + m_secret = m_secret << 8 ^ rand(); + m_conf_file = conf_file; + m_table_prefix = table_prefix; + m_time = ::time(NULL); + m_use_sql = use_sql; +} + +int Cserver::run() +{ + read_config(); + if (test_sql()) + return 1; + if (m_epoll.create(1 << 10) == -1) + { + std::cerr << "epoll_create failed" << std::endl; + return 1; + } + t_tcp_sockets lt; + t_udp_sockets lu; + + // TorrentPier begin + struct addrinfo hints, *res, *res0; + char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; + memset(&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + Csocket::start_up(); + + BOOST_FOREACH(Cconfig::t_listen_ipas::const_reference j, m_config.m_listen_ipas) + { + BOOST_FOREACH(Cconfig::t_listen_ports::const_reference i, m_config.m_listen_ports) + { + if (getaddrinfo(j == "*" ? NULL : j.c_str(), i.c_str(), &hints, &res0)) { + std::cerr << "getaddrinfo failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + return 1; + } + for (res = res0; res; res = res->ai_next) { + int s = ::socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (s < 0) { + std::cerr << "socket failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + return 1; + } + Csocket l(s); +#ifdef IPV6_V6ONLY + if (res->ai_family == AF_INET6 && + l.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, true)) { + std::cerr << "IPV6_V6ONLY failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + } +#endif + if (l.blocking(false)) + std::cerr << "blocking failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else if (l.setsockopt(SOL_SOCKET, SO_REUSEADDR, true), + ::bind(s, res->ai_addr, res->ai_addrlen)) + std::cerr << "bind failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else if (::listen(s, INT_MAX)) + std::cerr << "listen failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else + { + if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) + std::cerr << "getnameinfo failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else + std::cerr << "Listen to " << hbuf << " " << sbuf << std::endl; +#ifdef SO_ACCEPTFILTER + accept_filter_arg afa; + bzero(&afa, sizeof(afa)); + strcpy(afa.af_name, "httpready"); + if (l.setsockopt(SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa))) + std::cerr << "setsockopt failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; +#elif TCP_DEFER_ACCEPT + if (l.setsockopt(IPPROTO_TCP, TCP_DEFER_ACCEPT, true)) + std::cerr << "setsockopt failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; +#endif + lt.push_back(Ctcp_listen_socket(this, l)); + if (!m_epoll.ctl(EPOLL_CTL_ADD, l, EPOLLIN | EPOLLOUT | EPOLLPRI | EPOLLERR | EPOLLHUP, <.back())) + continue; + } + return 1; + } + } + + /* + BOOST_FOREACH(Cconfig::t_listen_ports::const_reference i, m_config.m_listen_ports) + { + Csocket l; + if (l.open(SOCK_DGRAM) == INVALID_SOCKET) + std::cerr << "socket failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else if (l.setsockopt(SOL_SOCKET, SO_REUSEADDR, true), + l.bind(j, htons(i))) + std::cerr << "bind failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else + { + lu.push_back(Cudp_listen_socket(this, l)); + if (!m_epoll.ctl(EPOLL_CTL_ADD, l, EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP, &lu.back())) + continue; + } + return 1; + } + */ + } + // TorrentPier end + + clean_up(); + read_db_deny_from_hosts(); + read_db_files(); + read_db_users(); + write_db_files(); + write_db_users(); +#ifndef WIN32 + if (m_config.m_daemon) + { + if (daemon(true, false)) + std::cerr << "daemon failed" << std::endl; + std::ofstream(m_config.m_pid_file.c_str()) << getpid() << std::endl; + struct sigaction act; + act.sa_handler = sig_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + if (sigaction(SIGTERM, &act, NULL)) + std::cerr << "sigaction failed" << std::endl; + act.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &act, NULL)) + std::cerr << "sigaction failed" << std::endl; + } +#endif +#ifdef EPOLL + boost::array events; +#else + fd_set fd_read_set; + fd_set fd_write_set; + fd_set fd_except_set; +#endif + while (!g_sig_term) + { +#ifdef EPOLL + int r = m_epoll.wait(events.data(), events.size(), 5000); + if (r == -1) + std::cerr << "epoll_wait failed: " << errno << std::endl; + else + { + int prev_time = m_time; + m_time = ::time(NULL); + for (int i = 0; i < r; i++) + reinterpret_cast(events[i].data.ptr)->process_events(events[i].events); + if (m_time == prev_time) + continue; + for (t_connections::iterator i = m_connections.begin(); i != m_connections.end(); ) + { + if (i->run()) + i = m_connections.erase(i); + else + i++; + } + } +#else + FD_ZERO(&fd_read_set); + FD_ZERO(&fd_write_set); + FD_ZERO(&fd_except_set); + int n = 0; + BOOST_FOREACH(t_connections::reference i, m_connections) + { + int z = i.pre_select(&fd_read_set, &fd_write_set); + n = std::max(n, z); + } + BOOST_FOREACH(t_tcp_sockets::reference i, lt) + { + FD_SET(i.s(), &fd_read_set); + n = std::max(n, i.s()); + } + BOOST_FOREACH(t_udp_sockets::reference i, lu) + { + FD_SET(i.s(), &fd_read_set); + n = std::max(n, i.s()); + } + timeval tv; + tv.tv_sec = 5; + tv.tv_usec = 0; + if (select(n + 1, &fd_read_set, &fd_write_set, &fd_except_set, &tv) == SOCKET_ERROR) + std::cerr << "select failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + else + { + m_time = ::time(NULL); + BOOST_FOREACH(t_tcp_sockets::reference i, lt) + { + if (FD_ISSET(i.s(), &fd_read_set)) + accept(i.s()); + } + BOOST_FOREACH(t_udp_sockets::reference i, lu) + { + if (FD_ISSET(i.s(), &fd_read_set)) + Ctransaction(*this, i.s()).recv(); + } + for (t_connections::iterator i = m_connections.begin(); i != m_connections.end(); ) + { + if (i->post_select(&fd_read_set, &fd_write_set)) + i = m_connections.erase(i); + else + i++; + } + } +#endif + if (time() - m_read_config_time > m_config.m_read_config_interval) + read_config(); + else if (time() - m_clean_up_time > m_config.m_clean_up_interval) + clean_up(); + else if (time() - m_read_db_deny_from_hosts_time > m_config.m_read_db_interval) + read_db_deny_from_hosts(); + + // TorrentPier begin + else if (time() - m_read_db_files_time > m_config.m_read_files_interval) + // TorrentPier end + + read_db_files(); + else if (time() - m_read_db_users_time > m_config.m_read_db_interval) + read_db_users(); + else if (m_config.m_write_db_interval && time() - m_write_db_files_time > m_config.m_write_db_interval) + write_db_files(); + else if (m_config.m_write_db_interval && time() - m_write_db_users_time > m_config.m_write_db_interval) + write_db_users(); + } + write_db_files(); + write_db_users(); + unlink(m_config.m_pid_file.c_str()); + return 0; +} + +void Cserver::accept(const Csocket& l) +{ + // TorrentPier begin + sockaddr_storage a; + while (1) + { + socklen_t cb_a = sizeof(sockaddr_storage); + // TorrentPier end + + Csocket s = ::accept(l, reinterpret_cast(&a), &cb_a); + if (s == SOCKET_ERROR) + { + if (WSAGetLastError() == WSAECONNABORTED) + continue; + if (WSAGetLastError() != WSAEWOULDBLOCK) + std::cerr << "accept failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + break; + } + + // TorrentPier begin + if (a.ss_family == AF_INET) { + sockaddr_in *b = reinterpret_cast(&a); + + t_deny_from_hosts::const_iterator i = m_deny_from_hosts.lower_bound(ntohl(b->sin_addr.s_addr)); + if (i != m_deny_from_hosts.end() && ntohl(b->sin_addr.s_addr) >= i->second.begin) + { + m_stats.rejected_tcp++; + continue; + } + m_stats.accepted_tcp4++; + } else if (a.ss_family == AF_INET6) m_stats.accepted_tcp6++; + // TorrentPier end + + m_stats.accepted_tcp++; + if (s.blocking(false)) + std::cerr << "ioctlsocket failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + std::auto_ptr connection(new Cconnection(this, s, a)); + connection->process_events(EPOLLIN); + if (connection->s() != INVALID_SOCKET) + { + m_connections.push_back(connection.release()); + m_epoll.ctl(EPOLL_CTL_ADD, m_connections.back().s(), EPOLLIN | EPOLLOUT | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLET, &m_connections.back()); + } + } +} + +std::string Cserver::insert_peer(const Ctracker_input& v, bool udp, t_user* user) +{ + if (m_use_sql && m_config.m_log_announce) + { + m_announce_log_buffer += Csql_query(m_database, "(?,?,?,?,?,?,?,?,?,?),") + .p(ntohl(v.m_ipa)).p(ntohs(v.m_port)).p(v.m_event).p(v.m_info_hash).p(v.m_peer_id).p(v.m_downloaded).p(v.m_left).p(v.m_uploaded).p(user ? user->uid : 0).p(time()).read(); + } + if (!m_config.m_offline_message.empty()) + return m_config.m_offline_message; + + // TorrentPier begin + if (!m_config.m_auto_register && !file(v.m_info_hash)) + return bts_unregistered_torrent; + + t_file& file = m_files[v.m_info_hash]; + + if (!m_config.m_anonymous_announce && !user && file.dl_percent >= 0) + return bts_unregistered_torrent_pass; + + std::string xbt_error = ""; + if (v.m_left && v.m_event != Ctracker_input::e_paused && user && !user->can_leech && !m_config.m_free_leech) + /*if (xbt_error.empty())*/ xbt_error = bts_can_not_leech; + if (v.m_left && user && user->user_park) //park + xbt_error = bts_park; + if (user && user->user_active == 0) //unactive + xbt_error = bts_disabled; + if (!file.ctime) + file.ctime = time(); + if (v.m_left && v.m_event != Ctracker_input::e_paused && + user && user->wait_time && file.ctime + user->wait_time > time() && !m_config.m_free_leech) + /*return*/ if (xbt_error.empty()) xbt_error = bts_wait_time; + + t_peers::key_type peer_key = v.m_peer_id; + t_peer* i = find_ptr(file.peers, peer_key); + if (i) + { + if (i->xbt_error_empty) + { + (i->left != e_seeder ? file.leechers : file.seeders)--; + if (t_user* old_user = find_user_by_uid(i->uid)) + (i->left == e_downloader ? old_user->incompletes : old_user->completes)--; + } + + file.speed_ul -= i->speed_ul, file.speed_dl -= i->speed_dl; + } + + if (i && i->xbt_error_empty) { } + else if (v.m_left && v.m_event != Ctracker_input::e_paused && + user && user->torrents_limit && user->incompletes >= user->torrents_limit && !m_config.m_free_leech) + { + /*return*/ if (xbt_error.empty()) xbt_error = bts_torrents_limit_reached; + } + else if (v.m_left && v.m_event != Ctracker_input::e_paused && + user && user->peers_limit && !m_config.m_free_leech) + { + int c = 0, a = 0; + BOOST_FOREACH(t_peers::reference j, file.peers) { + c += j.second.left == e_downloader && j.second.uid == user->uid && j.second.xbt_error_empty; + a += j.second.uid == user->uid && j.second.xbt_error_empty; + } + if (c >= user->peers_limit || a >= user->peers_limit * 3) + /*return*/ if (xbt_error.empty()) xbt_error = bts_peers_limit_reached; + } + + long long downloaded = 0, downloaded_db = 0, downspeed = 0; + long long uploaded = 0, upspeed = 0; + long long bonus = 0; + long long rel = 0; + long long ul_gdc = 0, ul_gdc_16k = 0; + int ul_gdc_count = 0, ul_16k_count = 0, ul_eq_dl_count = 0; + int end_vip = 0; + + bool ipv6set = v.m_ipv6set && (v.m_family == AF_INET6 || m_config.m_trust_ipv6); + + if (m_use_sql && user && file.fid) + { + + long long timespent = 0; + if (i + // && boost::equals(i->peer_id, v.m_peer_id) + && v.m_downloaded >= i->downloaded + && v.m_uploaded >= i->uploaded) + { + downloaded = v.m_downloaded - i->downloaded; + uploaded = v.m_uploaded - i->uploaded; + + if( downloaded > 100000000000ll || uploaded > 100000000000ll ) { + downloaded = uploaded = 0; // anti-hack + if (xbt_error.empty()) xbt_error = bts_banned_client; + } + timespent = time() - i->mtime; + if ((timespent << 1) > m_config.m_announce_interval) + { + upspeed = uploaded / timespent; + downspeed = downloaded / timespent; + } + ul_gdc_count = i->ul_gdc_count; + ul_16k_count = i->ul_16k_count; + ul_gdc_16k = i->ul_gdc_16k; + ul_eq_dl_count = i->ul_eq_dl_count; + if( uploaded && m_config.m_gdc ) + { + ul_gdc_count++; + if (uploaded == downloaded) ul_eq_dl_count++; + long long block = 16384; + if( (uploaded % block) == 0ll ) + { + ul_16k_count++; + if( ul_16k_count > 1 ) + ul_gdc_16k = gcd(uploaded, ul_gdc_16k); + else + ul_gdc_16k = uploaded; + } + if( ul_gdc_count == ul_16k_count ) + ul_gdc = ul_gdc_16k; + else + { + if( ul_gdc_count > 1 ) + ul_gdc = gcd(uploaded, i->ul_gdc); + else + ul_gdc = uploaded; + } + } + else + { + ul_gdc = i->ul_gdc; + } + + downloaded_db = (m_config.m_free_leech || file.dl_percent<0) ? 0 : (downloaded * file.dl_percent /100); + if (user->user_vip == 2 && user->user_vip_exp < time()) end_vip = 1; //vip + if (user->user_vip > 0 && end_vip == 0) downloaded_db = 0; //vip + + if (user->uid == file.tor_poster_id) rel = uploaded; + else if (!v.m_left && file.seeders == 1) bonus = 1; + + // TorrentPier: bb_bt_users_dl_status + int new_status = v.m_left ? 0 : 1; + if (user->uid == file.tor_poster_id) new_status = -1; + if (new_status != i->dl_status && file.tor_topic_id) { + Csql_query q(m_database, "(?,?,?),"); // topic_id,user_id,user_status,update_time + q.p(file.tor_topic_id); // topic_id + q.p(user->uid); // user_id + q.p(new_status); + m_users_dl_status_buffer += q.read(); + i->dl_status = new_status; + } + + // TorrentPier: bb_bt_torrent_activity + int user_status = new_status; + if (new_status == -1) new_status = 2; + Csql_query q(m_database, "(?,?,?,?,?,?,?,?,?,?,?,?),"); + q.p(user->uid); // user_id + q.p(file.tor_topic_id); // torrent_id + q.p(uploaded); + q.p(downloaded_db); + q.p(upspeed); // speed_up mediumint(8) unsigned NOT NULL default '0', + q.p(downspeed); // speed_down mediumint(8) unsigned NOT NULL default '0', + q.p(new_status); + q.p(bonus ? uploaded/bonus : 0); + q.p(user_status); + q.p(downloaded); + q.p(time()); + q.p(m_config.m_announce_interval); //torrent_time + m_tor_dl_stat_buffer += q.read(); + + // TorrentPier: bb_cheat_log + long long cheat = (long long) m_config.m_cheat_upload * 1024 * 1024 * 1024; + if (uploaded > cheat) { + Csql_query q(m_database, "(?,?,?,?),"); // torrent_id,user_id,attach_id,t_up_total,t_down_total + q.p(user->uid); // user_id + q.p(uploaded); + q.p(hex_encode(8, ntohl(v.m_ipa))); + q.p(time()); + m_cheat_buffer += q.read(); + } + + //vip + if (end_vip) { + Csql_query q(m_database, "(?),"); // user_id + q.p(user->uid); // user_id + m_vip_buffer += q.read(); + } + } + Csql_query q(m_database, "(?,?,?,?,?,?,?,?,?,?, ?,?,?,?, ?,?,?,?,?,?),"); + + int cleanup_interval = static_cast(2.5 * m_config.m_announce_interval); + int min_cleanup = 3900; // 65 min + if( cleanup_interval < min_cleanup ) cleanup_interval = min_cleanup; + + // TorrentPier + std::string port_st, ip_st, peer_hash; + port_st = ntohs(v.m_port); + ip_st = hex_encode(8, ntohl(v.m_ipa)); + peer_hash = md5(v.m_info_hash+v.m_passkey+port_st+ip_st); + + q.p(file.fid); // torrent_id mediumint(8) unsigned NOT NULL default '0', + q.p(v.m_peer_id); + q.p(peer_hash); + q.p(user->uid); // user_id mediumint(9) NOT NULL default '0', + q.p(hex_encode(8, ntohl(v.m_ipa))); // ip char(8) binary NOT NULL default '0', + q.p(const_memory_range(v.m_ipv6bin, ipv6set ? 16 : 0)); // ipv6 varchar(32) + q.p(ntohs(v.m_port)); // port smallint(5) unsigned NOT NULL default '0', + q.p(uploaded); // uploaded bigint(20) unsigned NOT NULL default '0', + q.p(downloaded_db); // downloaded bigint(20) unsigned NOT NULL default '0', + q.p(v.m_left && v.m_event != Ctracker_input::e_paused ? 0 : 1); // seeder tinyint(1) NOT NULL default '0', + q.p(user->uid==file.tor_poster_id),// releaser + q.p(v.m_left ? (v.m_left>=file.tor_size ? 0 : ((file.tor_size-v.m_left)*100/file.tor_size)) : v.m_uploaded); // complete_percent bigint(20) unsigned NOT NULL default '0', + q.p(upspeed); // speed_up mediumint(8) unsigned NOT NULL default '0', + q.p(downspeed); // speed_down mediumint(8) unsigned NOT NULL default '0', + q.p(time()); // update_time int(11) NOT NULL default '0', + q.p(xbt_error); + q.p( ul_16k_count*3 > ul_gdc_count*2 ? ul_gdc_16k : ul_gdc ); + q.p(ul_gdc_count); + q.p(ul_16k_count); + q.p(ul_eq_dl_count); + + m_files_users_updates_buffer += q.read(); + + if (downloaded || uploaded) + { + Csql_query q(m_database, "(?,?,?,?,?,?,?),"); + q.p(downloaded_db); + q.p(uploaded); + q.p(user->uid); + q.p(rel); + q.p(bonus ? uploaded/bonus : 0); + q.p(upspeed); + q.p(downspeed); + m_users_updates_buffer += q.read(); + } + + // Double tracker fix + if (v.m_event == Ctracker_input::e_completed && downloaded) + file.completed++, file.completed_inc++; + } + else + { + if (v.m_event == Ctracker_input::e_completed) + file.completed++, file.completed_inc++; + } + + if (v.m_event == Ctracker_input::e_stopped) + file.peers.erase(peer_key); + else + { + t_peer& peer = file.peers[peer_key]; + peer.downloaded = i && v.m_downloaded < i->downloaded ? i->downloaded : v.m_downloaded; + peer.left = v.m_left == 0 ? e_seeder : v.m_event == Ctracker_input::e_paused ? e_incomplete : e_downloader; + // std::copy(v.m_peer_id.begin(), v.m_peer_id.end(), peer.peer_id.begin()); + peer.port = v.m_port; + peer.uid = user ? user->uid : 0; + peer.uploaded = i && v.m_uploaded < i->uploaded ? i->uploaded : v.m_uploaded; + + file.speed_ul += ( peer.speed_ul = upspeed ); + file.speed_dl += ( peer.speed_dl = downspeed ); + + if (xbt_error.empty()) + { + (peer.left != e_seeder ? file.leechers : file.seeders)++; + if (user) + (peer.left == e_downloader ? user->incompletes : user->completes)++; + } + + peer.xbt_error_empty = xbt_error.empty(); + peer.ul_gdc = ul_gdc; + peer.ul_gdc_16k = ul_gdc_16k; + peer.ul_gdc_count = ul_gdc_count; + peer.ul_16k_count = ul_16k_count; + peer.ul_eq_dl_count = ul_eq_dl_count; + + if (ipv6set && v.m_protocol != 4) { + peer.ipv6set = true; + memcpy(peer.ipv6, v.m_ipv6bin, 16); + m_stats.announced_with_ipv6++; + } + + if ((v.m_family == AF_INET || (m_config.m_trust_ipv6 && v.m_ipa != 0)) && v.m_protocol != 6) peer.host_ = v.m_ipa; + + peer.mtime = time(); + } + + // TorrentPier: Fill seeder_last_seen & last_seeder_uid fields + if (user && !v.m_left) + { + file.tor_last_seeder_uid = user->uid; + file.tor_seeder_last_seen = time(); + } + + (udp ? m_stats.announced_udp : m_stats.announced_http)++; + file.dirty = true; + return xbt_error; + // TorrentPier end +} + +std::string Cserver::t_file::select_peers(const Ctracker_input& ti) const +{ + if (ti.m_event == Ctracker_input::e_stopped) + return ""; + + typedef std::vector > t_candidates; + + t_candidates candidates; + BOOST_FOREACH(t_peers::const_reference i, peers) + { + // TorrentPier begin + if (((!ti.m_left || ti.m_event == Ctracker_input::e_paused) && i.second.left != e_downloader) + || !i.second.xbt_error_empty || !i.second.host_ + || boost::equals(i.first, ti.m_peer_id)) + continue; + boost::array v; + memcpy(&v.front(), &i.second.host_, 4); + // TorrentPier end + + memcpy(&v.front() + 4, &i.second.port, 2); + candidates.push_back(v); + } + size_t c = ti.m_num_want < 0 ? 50 : std::min(ti.m_num_want, 50); + std::string d; + d.reserve(300); + if (candidates.size() > c) + { + while (c--) + { + int i = rand() % candidates.size(); + d.append(candidates[i].begin(), candidates[i].end()); + candidates[i] = candidates.back(); + candidates.pop_back(); + } + } + else + { + BOOST_FOREACH(t_candidates::reference i, candidates) + d.append(i.begin(), i.end()); + } + return d; +} + +// TorrentPier begin +std::string Cserver::t_file::select_peers6(const Ctracker_input& ti) const +{ + if (ti.m_event == Ctracker_input::e_stopped) + return ""; + + typedef std::vector > t_candidates; + + t_candidates candidates; + BOOST_FOREACH(t_peers::const_reference i, peers) + { + if (((!ti.m_left || ti.m_event == Ctracker_input::e_paused) && i.second.left != e_downloader) + || !i.second.xbt_error_empty ||!i.second.ipv6set + || boost::equals(i.first, ti.m_peer_id)) + continue; + + boost::array v; + memcpy(&v.front(), i.second.ipv6, 16); + memcpy(&v.front() + 16, &i.second.port, 2); + candidates.push_back(v); + } + size_t c = ti.m_num_want < 0 ? 50 : std::min(ti.m_num_want, 50); + std::string d; + d.reserve(900); + if (candidates.size() > c) + { + while (c--) + { + int i = rand() % candidates.size(); + d.append(candidates[i].begin(), candidates[i].end()); + candidates[i] = candidates.back(); + candidates.pop_back(); + } + } + else + { + BOOST_FOREACH(t_candidates::reference i, candidates) + d.append(i.begin(), i.end()); + } + return d; +} +// TorrentPier end + +Cvirtual_binary Cserver::select_peers(const Ctracker_input& ti) const +{ + const t_file* f = file(ti.m_info_hash); + if (!f) + return Cvirtual_binary(); + // TorrentPier begin + static int rnd = 0; + + long interval = config().m_announce_interval; + if (ti.m_left) { + interval >>= 1; + } else { + int peers = f->seeders + f->leechers + 1; + interval = interval * (peers + f->seeders) / (peers + peers); + } + interval += (++rnd & 63) + (f->fid & 63) - 64; + + if (ti.m_protocol == 6) { // ti.m_family == AF_INET6 && !m_config.m_trust_ipv6) { + std::string peers6 = f->select_peers6(ti); + return Cvirtual_binary((boost::format("d8:completei%de10:incompletei%de8:intervali%de6:peers6%d:%se") + % f->seeders % f->leechers % interval % peers6.size() % peers6).str()); + } else if (ti.m_protocol == 4) { // ti.m_family == AF_INET && !m_config.m_trust_ipv6) { + std::string peers = f->select_peers(ti); + return Cvirtual_binary((boost::format("d8:completei%de10:incompletei%de8:intervali%de5:peers%d:%se") + % f->seeders % f->leechers % interval % peers.size() % peers).str()); + } else { + std::string peers = f->select_peers(ti); + std::string peers6 = f->select_peers6(ti); + return Cvirtual_binary((boost::format("d8:completei%de10:incompletei%de8:intervali%de5:peers%d:%s6:peers6%d:%se") + % f->seeders % f->leechers % interval % peers.size() % peers % peers6.size() % peers6).str()); + } + // TorrentPier end +} + +void Cserver::t_file::clean_up(time_t t, Cserver& server) +{ + for (t_peers::iterator i = peers.begin(); i != peers.end(); ) + { + if (i->second.mtime < t) + { + // TorrentPier begin + if (i->second.xbt_error_empty) + { + (i->second.left != e_seeder ? leechers : seeders)--; + if (t_user* user = server.find_user_by_uid(i->second.uid)) + (i->second.left == e_downloader ? user->incompletes : user->completes)--; + } + /* + if (i->second.uid) + server.m_files_users_updates_buffer += Csql_query(server.m_database, "(0,0,0,0,-1,0,-1,?,?),").p(fid).p(i->second.uid).read(); + */ + speed_ul -= i->second.speed_ul, speed_dl -= i->second.speed_dl; + // TorrentPier end + + peers.erase(i++); + dirty = true; + } + else + i++; + } +} + +void Cserver::clean_up() +{ + // TorrentPier begin + int cleanup_interval = static_cast(2.5 * m_config.m_announce_interval); + if( cleanup_interval < 1800 ) cleanup_interval = 1800; + BOOST_FOREACH(t_files::reference i, m_files) + i.second.clean_up(time() - cleanup_interval, *this); + // TorrentPier end + + m_clean_up_time = time(); +} + +static byte* write_compact_int(byte* w, unsigned int v) +{ + if (v >= 0x200000) + { + *w++ = 0xe0 | (v >> 24); + *w++ = v >> 16; + *w++ = v >> 8; + } + else if (v >= 0x4000) + { + *w++ = 0xc0 | (v >> 16); + *w++ = v >> 8; + } + else if (v >= 0x80) + *w++ = 0x80 | (v >> 8); + *w++ = v; + return w; +} + +Cvirtual_binary Cserver::scrape(const Ctracker_input& ti) +{ + if (m_use_sql && m_config.m_log_scrape) + { + Csql_query q(m_database, "(?,?,?),"); + q.p(ntohl(ti.m_ipa)); + if (ti.m_info_hash.empty()) + q.p_raw(const_memory_range("null")); + else + q.p(ti.m_info_hash); + q.p(time()); + m_scrape_log_buffer += q.read(); + } + std::string d; + d += "d5:filesd"; + if (ti.m_info_hashes.empty()) + { + m_stats.scraped_full++; + if (ti.m_compact) + { + Cvirtual_binary d; + byte* w = d.write_start(32 * m_files.size() + 1); + *w++ = 'x'; + BOOST_FOREACH(t_files::reference i, m_files) + { + if (!i.second.leechers && !i.second.seeders) + continue; + memcpy(w, i.first.data(), i.first.size()); + w += i.first.size(); + w = write_compact_int(w, i.second.seeders); + w = write_compact_int(w, i.second.leechers); + w = write_compact_int(w, std::min(i.second.completed, 1)); + } + d.resize(w - d); + return d; + } + d.reserve(90 * m_files.size()); + BOOST_FOREACH(t_files::reference i, m_files) + { + if (i.second.leechers || i.second.seeders) + d += (boost::format("20:%sd8:completei%de10:incompletei%dee") % i.first % i.second.seeders % i.second.leechers).str(); + } + } + else + { + m_stats.scraped_http++; + BOOST_FOREACH(Ctracker_input::t_info_hashes::const_reference j, ti.m_info_hashes) + { + if (t_file* i = find_ptr(m_files, j)) + d += (boost::format("20:%sd8:completei%de10:incompletei%dee") % j % i->seeders % i->leechers).str(); + } + } + d += "e"; + if (m_config.m_scrape_interval) + d += (boost::format("5:flagsd20:min_request_intervali%dee") % m_config.m_scrape_interval).str(); + d += "e"; + return Cvirtual_binary(d); +} + +void Cserver::read_db_deny_from_hosts() +{ + m_read_db_deny_from_hosts_time = time(); + if (!m_use_sql) + return; + try + { + Csql_result result = Csql_query(m_database, "select begin, end from ?").p_name(table_name(table_deny_from_hosts)).execute(); + BOOST_FOREACH(t_deny_from_hosts::reference i, m_deny_from_hosts) + i.second.marked = true; + for (Csql_row row; row = result.fetch_row(); ) + { + t_deny_from_host& deny_from_host = m_deny_from_hosts[row[1].i()]; + deny_from_host.marked = false; + deny_from_host.begin = row[0].i(); + } + for (t_deny_from_hosts::iterator i = m_deny_from_hosts.begin(); i != m_deny_from_hosts.end(); ) + { + if (i->second.marked) + m_deny_from_hosts.erase(i++); + else + i++; + } + } + catch (Cdatabase::exception&) + { + } +} + +void Cserver::read_db_files() +{ + m_read_db_files_time = time(); + if (m_use_sql) + read_db_files_sql(); + else if (!m_config.m_auto_register) + { + std::set new_files; + std::ifstream is("xbt_files.txt"); + std::string s; + while (getline(is, s)) + { + s = hex_decode(s); + if (s.size() != 20) + continue; + m_files[s]; + new_files.insert(s); + } + for (t_files::iterator i = m_files.begin(); i != m_files.end(); ) + { + if (!new_files.count(i->first)) + m_files.erase(i++); + else + i++; + } + } +} + +// TorrentPier begin +void Cserver::read_db_files_sql() +{ + try + { + Csql_query q(m_database); + if (!m_config.m_auto_register) + { + // XBT read only new torrents, so we need to mark deleted in "_del" table + q = "select rpad(info_hash,20,' '), ?, is_del, dl_percent from "+table_name(table_files)+"_del"; + q.p_name(column_name(column_files_fid)); + Csql_result result = q.execute(); + for (Csql_row row; row = result.fetch_row(); ) + { + // if (row[0].size() != 20) continue; + // fix + t_files::iterator i = m_files.find(row[0].s()); + if (i != m_files.end()) + { + if (row[2].i()) + { + for (t_peers::iterator j = i->second.peers.begin(); j != i->second.peers.end(); j++) + { + t_user* user = j->second.uid ? find_user_by_uid(j->second.uid) : NULL; + if (user && j->second.xbt_error_empty) + (j->second.left == e_downloader ? user->incompletes : user->completes)--; + } + m_files.erase(i); + } else { + i->second.dl_percent = row[3].i(); + } + } + // fix + q = "delete from "+table_name(table_files)+"_del where ? = ?"; + q.p_name(column_name(column_files_fid)); + q.p(row[1].i()); + q.execute(); + } + } + if (m_files.empty()) + m_database.query("update bb_bt_tracker_snap set " + + column_name(column_files_leechers) + " = 0, " + + column_name(column_files_seeders) + " = 0, speed_up=0, speed_down=0"); + else if (m_config.m_auto_register) + return; + q = "select rpad(bt.info_hash,20,' '), bt.?, bt.?, bt.reg_time, bt.size, bt.attach_id, bt.topic_id, bt.poster_id, " + + column_name(column_files_dl_percent) + " from ? bt where reg_time >= ?"; + q.p_name(column_name(column_files_completed)); + q.p_name(column_name(column_files_fid)); + q.p_name(table_name(table_files)); + q.p(m_fid_end); + Csql_result result = q.execute(); + for (Csql_row row; row = result.fetch_row(); ) + { + m_fid_end = std::max(m_fid_end, static_cast(row[3].i()) + 1); + if (row[0].size() != 20 || m_files.find(row[0].s()) != m_files.end()) + continue; + t_file& file = m_files[row[0].s()]; + if (file.fid) + continue; + file.completed = row[1].i(); + file.dirty = false; + file.fid = row[2].i(); + file.ctime = row[3].i(); + file.tor_size = row[4].i(); + file.tor_attach_id = row[5].i(); + file.tor_topic_id = row[6].i(); + file.tor_poster_id = row[7].i(); + file.dl_percent = row[8].i(); + } + } + catch (Cdatabase::exception&) + { + } +} +// TorrentPier end + +void Cserver::read_db_users() +{ + m_read_db_users_time = time(); + if (!m_use_sql) + return; + try + { + // TorrentPier begin + Csql_query q(m_database, "select bt.?, auth_key, " + column_name(column_users_can_leech) + ", " + + column_name(column_users_torrents_limit) + ", user_vip, user_vip_exp, user_park, u.user_active from ? bt LEFT JOIN bb_users u ON (u.user_id=bt.user_id)"); + // TorrentPier end + + q.p_name(column_name(column_users_uid)); + q.p_name(table_name(table_users)); + Csql_result result = q.execute(); + BOOST_FOREACH(t_users::reference i, m_users) + i.second.marked = true; + m_users_torrent_passes.clear(); + for (Csql_row row; row = result.fetch_row(); ) + { + t_user& user = m_users[row[0].i()]; + user.marked = false; + + // TorrentPier begin + user.uid = row[0].i(); + user.wait_time = 0; + user.torrents_limit = row[3].i(); + user.peers_limit = 2; // # of IP addresses user can leech from + user.can_leech = row[2].i(); + user.user_vip = row[4].i(); + user.user_vip_exp = row[5].i(); + user.user_park = row[6].i(); + user.user_active = row[7].i(); + if (row[1].size()) { + user.passkey = row[1].s(); + m_users_torrent_passes[user.passkey] = &user; + } + // TorrentPier end + } + for (t_users::iterator i = m_users.begin(); i != m_users.end(); ) + { + if (i->second.marked) + m_users.erase(i++); + else + i++; + } + } + catch (Cdatabase::exception&) + { + } +} + +void Cserver::write_db_files() +{ + m_write_db_files_time = time(); + if (!m_use_sql) + return; + try + { + std::string buffer; + BOOST_FOREACH(t_files::reference i, m_files) + { + t_file& file = i.second; + if (!file.dirty) + continue; + if (!file.fid) + { + // TorrentPier begin + Csql_query(m_database, "insert into ? (info_hash, reg_time) values (?, unix_timestamp())").p_name(table_name(table_files)).p(i.first).execute(); + // TorrentPier end + + file.fid = m_database.insert_id(); + } + + // TorrentPier begin + Csql_query q(m_database, "(?,?,?,?,?),"); + q.p(file.completed_inc); file.completed_inc = 0; + q.p(file.fid); + q.p(file.tor_seeder_last_seen); file.tor_seeder_last_seen = 0; + q.p(file.speed_ul); + q.p(file.speed_dl); + buffer += q.read(); + // TorrentPier end + + file.dirty = false; + } + if (!buffer.empty()) + { + buffer.erase(buffer.size() - 1); + + // TorrentPier begin + m_database.query("insert into " + table_name(table_files) + " (" + + column_name(column_files_completed) + ", " + + column_name(column_files_fid) + + ", seeder_last_seen, speed_up, speed_down) values " + + buffer + + " on duplicate key update speed_up=values(speed_up), speed_down=values(speed_down)," + + " " + column_name(column_files_completed) + " = " + column_name(column_files_completed) + " + values(" + column_name(column_files_completed) + ")," + + " seeder_last_seen = values(seeder_last_seen)" + ); + // TorrentPier end + } + } + catch (Cdatabase::exception&) + { + } + if (!m_announce_log_buffer.empty()) + { + try + { + m_announce_log_buffer.erase(m_announce_log_buffer.size() - 1); + m_database.query("insert delayed into " + table_name(table_announce_log) + " (ipa, port, event, info_hash, peer_id, downloaded, left0, uploaded, uid, mtime) values " + m_announce_log_buffer); + } + catch (Cdatabase::exception&) + { + } + m_announce_log_buffer.erase(); + } + if (!m_scrape_log_buffer.empty()) + { + try + { + m_scrape_log_buffer.erase(m_scrape_log_buffer.size() - 1); + m_database.query("insert delayed into " + table_name(table_scrape_log) + " (ipa, info_hash, mtime) values " + m_scrape_log_buffer); + } + catch (Cdatabase::exception&) + { + } + m_scrape_log_buffer.erase(); + } +} + +// TorrentPier begin +void Cserver::write_db_users() +{ + m_write_db_users_time = time(); + if (!m_use_sql) + return; + if (!m_files_users_updates_buffer.empty()) + { + m_files_users_updates_buffer.erase(m_files_users_updates_buffer.size() - 1); + try + { + m_database.query("insert into " + table_name(table_files_users) + + " (topic_id, peer_id, peer_hash, user_id, ip, ipv6, port, uploaded, downloaded, seeder, releaser, complete_percent, speed_up, speed_down, update_time, xbt_error, ul_gdc, ul_gdc_c, ul_16k_c, ul_eq_dl) values " + + m_files_users_updates_buffer + + " on duplicate key update" + + " topic_id = values(topic_id)," + + " peer_id = values(peer_id)," + + " peer_hash = values(peer_hash)," + + " user_id = values(user_id)," + + " ip = values(ip), ipv6 = values(ipv6)," + + " port = values(port)," + + " uploaded = uploaded + values(uploaded)," + + " downloaded = downloaded + values(downloaded)," + + " complete_percent = values(complete_percent)," + + " seeder = values(seeder)," + + " releaser = values(releaser)," + + " speed_up = values(speed_up)," + + " speed_down = values(speed_down)," + + " up_add = up_add + values(uploaded)," + + " down_add = down_add + values(downloaded)," + + " update_time = values(update_time)," + + " xbt_error=values(xbt_error), ul_gdc=values(ul_gdc), ul_gdc_c=values(ul_gdc_c), ul_16k_c=values(ul_16k_c), ul_eq_dl=values(ul_eq_dl)"); + } + catch (Cdatabase::exception&) + { + } + m_files_users_updates_buffer.erase(); + } + if (!m_users_updates_buffer.empty()) + { + m_users_updates_buffer.erase(m_users_updates_buffer.size() - 1); + try + { + m_database.query("insert into " + table_name(table_users) + " (u_down_total, u_up_total, " + column_name(column_users_uid) + ", u_up_release, u_up_bonus, max_up_speed, max_down_speed) values " + + m_users_updates_buffer + + " on duplicate key update" + + " u_down_total = u_down_total + values(u_down_total)," + + " u_up_total = u_up_total + values(u_up_total)," + + " u_up_release = u_up_release + values(u_up_release)," + + " u_up_bonus = u_up_bonus + values(u_up_bonus)," + + " max_up_speed = GREATEST(max_up_speed, values(max_up_speed))," + + " max_down_speed = GREATEST(max_down_speed, values(max_down_speed))," + + " u_down_today = u_down_today + values(u_down_total)," + + " u_up_today = u_up_today + values(u_up_total)," + + " u_release_today = u_release_today + values(u_up_release)," + + " u_bonus_today = u_bonus_today + values(u_up_bonus)," + + " u_up_speed_today = GREATEST(u_up_speed_today, values(max_up_speed))," + + " u_down_speed_today = GREATEST(u_down_speed_today, values(max_down_speed))"); + } + catch (Cdatabase::exception&) + { + } + m_users_updates_buffer.erase(); + } + if (!m_users_dl_status_buffer.empty()) + { + m_users_dl_status_buffer.erase(m_users_dl_status_buffer.size() - 1); + try + { + m_database.query("insert into bb_bt_dlstatus_main (topic_id,user_id,user_status) values" + + m_users_dl_status_buffer + + " on duplicate key update" + + " user_status = values(user_status)"); + } + catch (Cdatabase::exception&) + { + } + m_users_dl_status_buffer.erase(); + } + if (!m_tor_dl_stat_buffer.empty()) + { + m_tor_dl_stat_buffer.erase(m_tor_dl_stat_buffer.size() - 1); + try + { + m_database.query("insert into bb_bt_torrent_activity(user_id,topic_id,torrent_upload,torrent_download,torrent_speed_up,torrent_speed_down,torrent_dl_status, torrent_bonus, torrent_status, torrent_all_download, torrent_time_st, torrent_time) values" + + m_tor_dl_stat_buffer + + " on duplicate key update" + + " torrent_upload = torrent_upload + values(torrent_upload)," + + " torrent_speed_up = GREATEST(torrent_speed_up, values(torrent_speed_up))," + + " torrent_speed_down = GREATEST(torrent_speed_down, values(torrent_speed_down))," + + " torrent_download = torrent_download + values(torrent_download)," + + " torrent_all_download = torrent_all_download + values(torrent_all_download)," + + " torrent_time = torrent_time + values(torrent_time)," + + " torrent_status = GREATEST(torrent_status, values(torrent_status))," + + " torrent_bonus = torrent_bonus + values(torrent_bonus)"); + } + catch (Cdatabase::exception&) + { + } + m_tor_dl_stat_buffer.erase(); + } + //cheat + if (!m_cheat_buffer.empty()) + { + m_cheat_buffer.erase(m_cheat_buffer.size() - 1); + try + { + m_database.query("insert into bb_bt_cheat_log(cheat_user_id, cheat_uploaded, cheat_ip, cheat_log_time) values" + + m_cheat_buffer); + } + catch (Cdatabase::exception&) + { + } + m_cheat_buffer.erase(); + } + //vip + if (!m_vip_buffer.empty()) + { + m_vip_buffer.erase(m_vip_buffer.size() - 1); + try + { + m_database.query("UPDATE bb_bt_users SET user_vip = 0 WHERE user_id IN" + + m_vip_buffer ); + m_database.query("UPDATE bb_users SET user_rank = 0 WHERE user_rank = 20 AND user_id IN" + + m_vip_buffer ); + } + catch (Cdatabase::exception&) + { + } + m_vip_buffer.erase(); + } +} +// TorrentPier end + +void Cserver::read_config() +{ + if (m_use_sql) + { + try + { + Csql_result result = m_database.query("select name, value from " + table_name(table_config) + " where value is not null"); + Cconfig config; + for (Csql_row row; row = result.fetch_row(); ) + { + if (config.set(row[0].s(), row[1].s())) + std::cerr << "unknown config name: " << row[0].s() << std::endl; + } + config.load(m_conf_file); + if (config.m_torrent_pass_private_key.empty()) + { + config.m_torrent_pass_private_key = generate_random_string(27); + Csql_query(m_database, "insert into xbt_config (name, value) values ('torrent_pass_private_key', ?)").p(config.m_torrent_pass_private_key).execute(); + } + m_config = config; + } + catch (Cdatabase::exception&) + { + } + } + else + { + Cconfig config; + if (!config.load(m_conf_file)) + m_config = config; + } + + // TorrentPier begin + if (m_config.m_listen_ipas.empty()) + m_config.m_listen_ipas.insert("*"); + if (m_config.m_listen_ports.empty()) + m_config.m_listen_ports.insert("2710"); + // TorrentPier end + + m_read_config_time = time(); +} + +void Cserver::t_file::debug(std::ostream& os) const +{ + BOOST_FOREACH(t_peers::const_reference i, peers) + { + // TorrentPier begin + os << "" + Csocket::inet_ntoa(i.second.host_) + << "" << (i.second.ipv6set ? hex_encode(const_memory_range(i.second.ipv6,16)) : "") + // TorrentPier end + + << "" << ntohs(i.second.port) + << "" << i.second.uid + << "" << i.second.left + << "" << ::time(NULL) - i.second.mtime + + // TorrentPier begin + << "" << hex_encode(const_memory_range(i.first.c_str(), 20)); + // TorrentPier end + } +} + +std::string Cserver::debug(const Ctracker_input& ti) const +{ + std::ostringstream os; + os << "XBT Tracker"; + int leechers = 0; + int seeders = 0; + int torrents = 0; + os << ""; + if (ti.m_info_hash.empty()) + { + BOOST_FOREACH(t_files::const_reference i, m_files) + { + if (!i.second.leechers && !i.second.seeders) + continue; + leechers += i.second.leechers; + seeders += i.second.seeders; + torrents++; + os << "
" << i.second.fid + << "" << hex_encode(i.first) << "" + << "" << (i.second.dirty ? '*' : ' ') + << "" << i.second.leechers + << "" << i.second.seeders; + } + } + else + { + if (const t_file* i = find_ptr(m_files, ti.m_info_hash)) + i->debug(os); + } + os << "
"; + return os.str(); +} + +std::string Cserver::statistics() const +{ + std::ostringstream os; + os << "XBT Tracker"; + int leechers = 0; + int seeders = 0; + int torrents = 0; + BOOST_FOREACH(t_files::const_reference i, m_files) + { + leechers += i.second.leechers; + seeders += i.second.seeders; + torrents += i.second.leechers || i.second.seeders; + } + time_t t = time(); + os << "
leechers" << leechers + << "
seeders" << seeders + << "
peers" << leechers + seeders + << "
torrents" << torrents + << "
" + << "
accepted tcp" << m_stats.accepted_tcp + + // TorrentPier begin + << "
accepted tcp4" << m_stats.accepted_tcp4 << "" << m_stats.accepted_tcp4 * 100 / m_stats.accepted_tcp << " %" + << "
accepted tcp6" << m_stats.accepted_tcp6 << "" << m_stats.accepted_tcp6 * 100 / m_stats.accepted_tcp << " %" + // TorrentPier end + + << "
rejected tcp" << m_stats.rejected_tcp + << "
announced" << m_stats.announced(); + if (m_stats.announced()) + { + os << "
announced http " << m_stats.announced_http << "" << m_stats.announced_http * 100 / m_stats.announced() << " %" + << "
announced udp" << m_stats.announced_udp << "" << m_stats.announced_udp * 100 / m_stats.announced() << " %" + + // TorrentPier begin + << "
with &ipv6=" << m_stats.announced_with_ipv6 << "" << m_stats.announced_with_ipv6 * 100 / m_stats.announced() << " %"; + // TorrentPier end + } + os << "
scraped full" << m_stats.scraped_full + << "
scraped" << m_stats.scraped(); + if (m_stats.scraped()) + { + os << "
scraped http" << m_stats.scraped_http << "" << m_stats.scraped_http * 100 / m_stats.scraped() << " %" + << "
scraped udp" << m_stats.scraped_udp << "" << m_stats.scraped_udp * 100 / m_stats.scraped() << " %"; + } + os << "
" + << "
up time" << duration2a(time() - m_stats.start_time) + << "
" + << "
anonymous connect" << m_config.m_anonymous_connect + << "
anonymous announce" << m_config.m_anonymous_announce + << "
anonymous scrape" << m_config.m_anonymous_scrape + << "
auto register" << m_config.m_auto_register + << "
full scrape" << m_config.m_full_scrape + + // TorrentPier begin + << "
free leech" << m_config.m_free_leech + << "
announce interval" << m_config.m_announce_interval + // TorrentPier end + + << "
read config time" << t - m_read_config_time << " / " << m_config.m_read_config_interval + << "
clean up time" << t - m_clean_up_time << " / " << m_config.m_clean_up_interval + + // TorrentPier begin + << "
read db files time" << t - m_read_db_files_time << " / " << m_config.m_read_files_interval; + // TorrentPier end + + if (m_use_sql) + { + os << "
read db users time" << t - m_read_db_users_time << " / " << m_config.m_read_db_interval + << "
write db files time" << t - m_write_db_files_time << " / " << m_config.m_write_db_interval + << "
write db users time" << t - m_write_db_users_time << " / " << m_config.m_write_db_interval; + } + os << "
"; + return os.str(); +} + +Cserver::t_user* Cserver::find_user_by_torrent_pass(const std::string& v, const std::string& info_hash) +{ + // TorrentPier begin + if (v.size() == 32) if (t_user* user = find_user_by_uid(read_int(4, hex_decode(v.substr(0, 8))))) + { + if (Csha1((boost::format("%s %s %d %s") % m_config.m_torrent_pass_private_key % user->passkey % user->uid % info_hash).str()).read().substr(0, 12) == hex_decode(v.substr(8))) + return user; + } + // TorrentPier end + + t_user** i = find_ptr(m_users_torrent_passes, v); + return i ? *i : NULL; +} + +Cserver::t_user* Cserver::find_user_by_uid(int v) +{ + return find_ptr(m_users, v); +} + +void Cserver::sig_handler(int v) +{ + switch (v) + { + case SIGTERM: + g_sig_term = true; + break; + } +} + +void Cserver::term() +{ + g_sig_term = true; +} + +std::string Cserver::column_name(int v) const +{ + switch (v) + { + case column_files_completed: + return m_config.m_column_files_completed; + case column_files_leechers: + return m_config.m_column_files_leechers; + case column_files_seeders: + return m_config.m_column_files_seeders; + case column_files_fid: + return m_config.m_column_files_fid; + case column_users_uid: + return m_config.m_column_users_uid; + + // TorrentPier begin + case column_files_dl_percent: + return m_config.m_column_files_dl_percent; + case column_users_can_leech: + return m_config.m_column_users_can_leech; + case column_users_torrents_limit: + return m_config.m_column_users_torrents_limit; + // TorrentPier end + + } + assert(false); + return ""; +} + +std::string Cserver::table_name(int v) const +{ + switch (v) + { + case table_announce_log: + return m_config.m_table_announce_log.empty() ? m_table_prefix + "announce_log" : m_config.m_table_announce_log; + case table_config: + return m_table_prefix + "config"; + case table_deny_from_hosts: + return m_config.m_table_deny_from_hosts.empty() ? m_table_prefix + "deny_from_hosts" : m_config.m_table_deny_from_hosts; + case table_files: + return m_config.m_table_files.empty() ? m_table_prefix + "files" : m_config.m_table_files; + case table_files_users: + return m_config.m_table_files_users.empty() ? m_table_prefix + "files_users" : m_config.m_table_files_users; + case table_scrape_log: + return m_config.m_table_scrape_log.empty() ? m_table_prefix + "scrape_log" : m_config.m_table_scrape_log; + case table_users: + return m_config.m_table_users.empty() ? m_table_prefix + "users" : m_config.m_table_users; + } + assert(false); + return ""; +} + +int Cserver::test_sql() +{ + if (!m_use_sql) + return 0; + try + { + /*mysql_get_server_version(m_database.handle()); + //xbtt + m_database.query("select id, ipa, port, event, info_hash, peer_id, downloaded, left0, uploaded, uid, mtime from " + table_name(table_announce_log) + " where 0"); + m_database.query("select name, value from " + table_name(table_config) + " where 0"); + \m_database.query("select begin, end from " + table_name(table_deny_from_hosts) + " where 0"); + m_database.query("select id, ipa, info_hash, uid, mtime from " + table_name(table_scrape_log) + " where 0"); + + // TorrentPier begin + m_database.query("select peer_hash, user_id, ip, ipv6, port, uploaded, downloaded, seeder, speed_up, speed_down, update_time, ul_gdc, ul_gdc_c, ul_16k_c, ul_eq_dl from " + table_name(table_files_users) + " where 0"); // Note: `port_open` is not used any more + m_database.query("select " + column_name(column_users_uid) + ", auth_key, " + + column_name(column_users_can_leech) + " as u_cl, " + column_name(column_users_torrents_limit) + + " as u_tl, u_down_total, u_up_total, u_up_release, u_down_today, u_up_today, u_up_bonus, max_up_speed, max_down_speed from " + table_name(table_users) + " where 0"); + + m_database.query("select bbt.info_hash, bt.seeder, bbt.reg_time, bbt.size, bbt.attach_id, bbt.topic_id, bbt.seeder_last_seen, bt.speed_up, bt.speed_down, bbt.poster_id, " + + column_name(column_files_dl_percent) + " from " + table_name(table_files) + " bbt LEFT JOIN bb_bt_tracker bt ON (bt.topic_id = bbt.topic_id) where 0"); + // TorrentPier: Files deletion table = table_name(table_files) + "_del" suffix + \m_database.query("select rpad(info_hash,20,' '), " + column_name(column_files_fid) + \+ ", is_del, dl_percent from " + table_name(table_files) + " where 0"); + m_database.query("select topic_id,user_id,user_status,last_modified_dlstatus from bb_bt_dlstatus_main where 0"); + m_database.query("select torrent_id,user_id,attach_id,t_up_total,t_down_total,t_bonus_total from bb_bt_tor_dl_stat where 0"); + // TorrentPier end + + m_read_users_can_leech = m_database.query("show columns from " + table_name(table_users) + " like 'can_leech'"); + m_read_users_peers_limit = m_database.query("show columns from " + table_name(table_users) + " like 'peers_limit'"); + m_read_users_torrent_pass = m_database.query("show columns from " + table_name(table_users) + " like 'torrent_pass'"); + m_read_users_torrents_limit = m_database.query("show columns from " + table_name(table_users) + " like 'torrents_limit'"); + m_read_users_wait_time = m_database.query("show columns from " + table_name(table_users) + " like 'wait_time'"); + */ + return 0; + } + catch (Cdatabase::exception&) + { + } + return 1; +} diff --git a/install/xbt/linux/Tracker/server.h b/install/xbt/linux/Tracker/server.h new file mode 100644 index 000000000..9a5b88409 --- /dev/null +++ b/install/xbt/linux/Tracker/server.h @@ -0,0 +1,274 @@ +#pragma once + +#include "config.h" +#include "connection.h" +#include "epoll.h" +#include "stats.h" +#include "tcp_listen_socket.h" +#include "tracker_input.h" +#include "udp_listen_socket.h" +#include +#include +#include +#include +#include +#include + +class Cserver +{ +public: + // TorrentPier begin + typedef std::string peer_key_c; + // TorrentPier end + + enum t_complete_status + { + e_seeder, + e_incomplete, + e_downloader, + }; + + struct t_peer + { + t_peer() + { + mtime = 0; + + // TorrentPier begin + dl_status = 0; // TorrentPier: 1 = downloading, 2 = complete + ipv6set = false; + host_ = 0; + // TorrentPier end + } + + long long downloaded; + long long uploaded; + time_t mtime; + int uid; + short port; + t_complete_status left; + + // TorrentPier begin + // boost::array peer_id; + + long long speed_dl; + long long speed_ul; + int dl_status; + bool xbt_error_empty; + // Upload Greatest Common Divisor + long long ul_gdc, ul_gdc_16k; + int ul_gdc_count, ul_16k_count, ul_eq_dl_count, end_vip; + + bool ipv6set; + // boost::array ipv6; + char ipv6[16]; + int host_; + // TorrentPier end + }; + + typedef std::map t_peers; + + struct t_deny_from_host + { + unsigned int begin; + bool marked; + }; + + struct t_file + { + void clean_up(time_t t, Cserver&); + void debug(std::ostream&) const; + std::string select_peers(const Ctracker_input&) const; + + // TorrentPier begin + std::string select_peers6(const Ctracker_input&) const; + // TorrentPier end + + t_file() + { + completed = 0; + dirty = true; + fid = 0; + leechers = 0; + seeders = 0; + + // TorrentPier begin + completed_inc = 0; + tor_size = 0; + tor_attach_id = tor_topic_id = 0; + tor_seeder_last_seen = 0; + tor_last_seeder_uid = tor_poster_id = 0; + speed_dl = speed_ul = 0; + dl_percent = 100; + // TorrentPier end + } + + t_peers peers; + time_t ctime; + int completed; + int fid; + int leechers; + int seeders; + bool dirty; + + // TorrentPier begin + int completed_inc; + long long tor_size; + int tor_attach_id, tor_topic_id; + time_t tor_seeder_last_seen; + int tor_last_seeder_uid, tor_poster_id; + long long speed_dl, speed_ul; + int dl_percent; + // TorrentPier end + }; + + struct t_user + { + t_user() + { + can_leech = true; + completes = 0; + incompletes = 0; + peers_limit = 0; + torrents_limit = 0; + wait_time = 0; + user_vip = 0; + user_vip_exp = 0; + user_park = 0; + user_active = 1; + } + + bool can_leech; + bool marked; + int uid; + int completes; + int incompletes; + int peers_limit; + std::string passkey; + int torrents_limit; + int wait_time; + int user_vip; + int user_vip_exp; + int user_park; + int user_active; + }; + + int test_sql(); + void accept(const Csocket&); + t_user* find_user_by_torrent_pass(const std::string&, const std::string& info_hash); + t_user* find_user_by_uid(int); + void read_config(); + void write_db_files(); + void write_db_users(); + void read_db_deny_from_hosts(); + void read_db_files(); + void read_db_files_sql(); + void read_db_users(); + void clean_up(); + std::string insert_peer(const Ctracker_input&, bool udp, t_user*); + std::string debug(const Ctracker_input&) const; + std::string statistics() const; + Cvirtual_binary select_peers(const Ctracker_input&) const; + Cvirtual_binary scrape(const Ctracker_input&); + int run(); + static void term(); + Cserver(Cdatabase&, const std::string& table_prefix, bool use_sql, const std::string& conf_file); + + const t_file* file(const std::string& id) const + { + return find_ptr(m_files, id); + } + + const Cconfig& config() const + { + return m_config; + } + + long long secret() const + { + return m_secret; + } + + Cstats& stats() + { + return m_stats; + } + + time_t time() const + { + return m_time; + } +private: + enum + { + column_files_completed, + column_files_fid, + column_files_leechers, + column_files_seeders, + column_users_uid, + table_announce_log, + table_config, + table_deny_from_hosts, + table_files, + table_files_users, + table_scrape_log, + table_users, + + // TorrentPier begin + column_files_dl_percent, + column_users_can_leech, + column_users_torrents_limit, + // TorrentPier end + }; + + typedef boost::ptr_list t_connections; + typedef std::list t_tcp_sockets; + typedef std::list t_udp_sockets; + typedef std::map t_files; + typedef std::map t_deny_from_hosts; + typedef std::map t_users; + typedef std::map t_users_torrent_passes; + + static void sig_handler(int v); + std::string column_name(int v) const; + std::string table_name(int) const; + + Cconfig m_config; + Cstats m_stats; + bool m_read_users_can_leech; + bool m_read_users_peers_limit; + bool m_read_users_torrent_pass; + bool m_read_users_torrents_limit; + bool m_read_users_wait_time; + bool m_use_sql; + time_t m_clean_up_time; + time_t m_read_config_time; + time_t m_read_db_deny_from_hosts_time; + time_t m_read_db_files_time; + time_t m_read_db_users_time; + time_t m_time; + time_t m_write_db_files_time; + time_t m_write_db_users_time; + int m_fid_end; + long long m_secret; + t_connections m_connections; + Cdatabase& m_database; + Cepoll m_epoll; + t_deny_from_hosts m_deny_from_hosts; + t_files m_files; + t_users m_users; + t_users_torrent_passes m_users_torrent_passes; + std::string m_announce_log_buffer; + std::string m_conf_file; + std::string m_files_users_updates_buffer; + std::string m_scrape_log_buffer; + std::string m_table_prefix; + std::string m_users_updates_buffer; + + // TorrentPier begin + std::string m_users_dl_status_buffer; + std::string m_tor_dl_stat_buffer; + std::string m_cheat_buffer; + std::string m_vip_buffer; + // TorrentPier end +}; diff --git a/install/xbt/linux/Tracker/stats.h b/install/xbt/linux/Tracker/stats.h new file mode 100644 index 000000000..7570bdc7c --- /dev/null +++ b/install/xbt/linux/Tracker/stats.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +class Cstats +{ +public: + Cstats() + { + accepted_tcp = 0; + announced_http = 0; + announced_udp = 0; + rejected_tcp = 0; + scraped_full = 0; + scraped_http = 0; + scraped_udp = 0; + start_time = time(NULL); + + // TorrentPier begin + announced_with_ipv6 = 0; + accepted_tcp4 = 0; + accepted_tcp6 = 0; + // TorrentPier end + } + + long long announced() const + { + return announced_http + announced_udp; + } + + long long scraped() const + { + return scraped_http + scraped_udp; + } + + long long accepted_tcp; + long long announced_http; + long long announced_udp; + long long rejected_tcp; + long long scraped_full; + long long scraped_http; + long long scraped_udp; + time_t start_time; + + // TorrentPier begin + long long announced_with_ipv6; + long long accepted_tcp4; + long long accepted_tcp6; + // TorrentPier end +}; diff --git a/install/xbt/linux/Tracker/stdafx.cpp b/install/xbt/linux/Tracker/stdafx.cpp new file mode 100644 index 000000000..a27b824da --- /dev/null +++ b/install/xbt/linux/Tracker/stdafx.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/install/xbt/linux/Tracker/stdafx.h b/install/xbt/linux/Tracker/stdafx.h new file mode 100644 index 000000000..80f2eb108 --- /dev/null +++ b/install/xbt/linux/Tracker/stdafx.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#define FD_SETSIZE 1024 +#define NOMINMAX + +#define atoll _atoi64 +#else +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// TorrentPier begin +#include +// TorrentPier end + +#endif + +typedef unsigned char byte; diff --git a/install/xbt/linux/Tracker/tcp_listen_socket.cpp b/install/xbt/linux/Tracker/tcp_listen_socket.cpp new file mode 100644 index 000000000..ac378b1d0 --- /dev/null +++ b/install/xbt/linux/Tracker/tcp_listen_socket.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "tcp_listen_socket.h" + +#include "server.h" + +Ctcp_listen_socket::Ctcp_listen_socket() +{ + m_server = NULL; +} + +Ctcp_listen_socket::Ctcp_listen_socket(Cserver* server, const Csocket& s) +{ + m_server = server; + m_s = s; +} + +void Ctcp_listen_socket::process_events(int events) +{ + m_server->accept(m_s); +} diff --git a/install/xbt/linux/Tracker/tcp_listen_socket.h b/install/xbt/linux/Tracker/tcp_listen_socket.h new file mode 100644 index 000000000..94316ff38 --- /dev/null +++ b/install/xbt/linux/Tracker/tcp_listen_socket.h @@ -0,0 +1,14 @@ +#pragma once + +#include "client.h" + +class Cserver; + +class Ctcp_listen_socket: public Cclient +{ +public: + virtual void process_events(int); + Cclient::s; + Ctcp_listen_socket(); + Ctcp_listen_socket(Cserver*, const Csocket&); +}; diff --git a/install/xbt/linux/Tracker/tracker_input.cpp b/install/xbt/linux/Tracker/tracker_input.cpp new file mode 100644 index 000000000..ab7d61705 --- /dev/null +++ b/install/xbt/linux/Tracker/tracker_input.cpp @@ -0,0 +1,347 @@ +#include "stdafx.h" +#include "tracker_input.h" + +#include +#include +#include + +// TorrentPier begin +#ifdef WIN32 + +#define IN6ADDRSZ 16 +#define INADDRSZ 4 +#define INT16SZ 2 + +/* int + * inet_pton4(src, dst) + * like inet_aton() but without all the hexadecimal and shorthand. + * return: + * 1 if `src' is a valid dotted quad, else 0. + * notice: + * does not touch `dst' unless it's returning 1. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton4(const char *src, unsigned char *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + unsigned int newval = (unsigned int) (*tp * 10 + (pch - digits)); + + if (newval > 255) + return (0); + *tp = newval; + if (! saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + + memcpy(dst, tmp, INADDRSZ); + return (1); +} + +/* int + * inet_pton6(src, dst) + * convert presentation level address to network order binary form. + * return: + * 1 if `src' is a valid [RFC1884 2.2] address, else 0. + * notice: + * (1) does not touch `dst' unless it's returning 1. + * (2) :: in a full address is silently ignored. + * credit: + * inspired by Mark Andrews. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton6(const char *src, unsigned char *dst) +{ + static const char xdigits_l[] = "0123456789abcdef", + xdigits_u[] = "0123456789ABCDEF"; + unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp; + const char *xdigits, *curtok; + int ch, saw_xdigit; + unsigned int val; + + memset((tp = tmp), '\0', IN6ADDRSZ); + endp = tp + IN6ADDRSZ; + colonp = NULL; + /* Leading :: requires some special handling. */ + if (*src == ':') + if (*++src != ':') + return (0); + curtok = src; + saw_xdigit = 0; + val = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) + pch = strchr((xdigits = xdigits_u), ch); + if (pch != NULL) { + val <<= 4; + val |= (pch - xdigits); + if (val > 0xffff) + return (0); + saw_xdigit = 1; + continue; + } + if (ch == ':') { + curtok = src; + if (!saw_xdigit) { + if (colonp) + return (0); + colonp = tp; + continue; + } + if (tp + INT16SZ > endp) + return (0); + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + if (ch == '.' && ((tp + INADDRSZ) <= endp) && + inet_pton4(curtok, tp) > 0) { + tp += INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + return (0); + } + if (saw_xdigit) { + if (tp + INT16SZ > endp) + return (0); + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + } + if (colonp != NULL) { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + int i; + + for (i = 1; i <= n; i++) { + endp[- i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return (0); + memcpy(dst, tmp, IN6ADDRSZ); + return (1); +} + +int my_inet_pton(int af, const char *src, void *dst) +{ + return (inet_pton6(src, (unsigned char *) dst)); +} + +#define inet_pton my_inet_pton + +#endif + +Ctracker_input::Ctracker_input(int family) +// TorrentPier end +{ + m_compact = false; + m_downloaded = 0; + m_event = e_none; + m_ipa = 0; + m_left = 0; + m_port = 0; + m_uploaded = 0; + m_num_want = -1; + + // TorrentPier begin + m_ipv6set = false; + m_family = family; + m_protocol = 0; + // TorrentPier end +} + +void Ctracker_input::set(const std::string& name, const std::string& value) +{ + if (name.empty()) + return; + switch (name[0]) + { + case 'c': + if (name == "compact") + m_compact = atoi(value.c_str()); + break; + case 'd': + if (name == "downloaded") + m_downloaded = atoll(value.c_str()); + break; + case 'e': + if (name == "event") + { + if (value == "completed") + m_event = e_completed; + else if (value == "started") + m_event = e_started; + else if (value == "stopped") + m_event = e_stopped; + else if (value == "paused") + m_event = e_paused; + else + m_event = e_none; + } + break; + case 'i': + if (name == "info_hash" && value.size() == 20) + { + m_info_hash = value; + m_info_hashes.push_back(value); + } + + // TorrentPier begin + else if (name == "ip" || name == "ipv4") + m_ipa = inet_addr(value.c_str()); + else if (name == "ipv6") { + m_ipv6set = inet_pton(AF_INET6, value.c_str(), m_ipv6bin); + if (m_ipv6bin[0] == '\xFE' && m_ipv6bin[1] == '\x80') m_ipv6set = false; + } + // TorrentPier end + + break; + case 'l': + if (name == "left") + m_left = atoll(value.c_str()); + break; + case 'n': + if (name == "numwant") + m_num_want = atoi(value.c_str()); + break; + case 'p': + if (name == "peer_id" && value.size() == 20) + m_peer_id = value; + else if (name == "port") + m_port = htons(atoi(value.c_str())); + + // TorrentPier begin + else if (name == "p") + m_protocol = atoi(value.c_str()); + // TorrentPier end + + break; + case 'u': + if (name == "uploaded") + m_uploaded = atoll(value.c_str()); + // TorrentPier begin + else if (name == "uk") + m_passkey = value; + // TorrentPier end + break; + } +} + +bool Ctracker_input::valid() const +{ + return m_downloaded >= 0 + && (m_event != e_completed || !m_left) + && m_info_hash.size() == 20 + && m_left >= -1 + && m_peer_id.size() == 20 + && m_port >= 0 + && m_uploaded >= 0; +} +bool Ctracker_input::banned() const +{ + if (m_peer_id[7] == '-') + // standard id + switch (m_peer_id[0]) + { + case '-': + switch (m_peer_id[1]) + { + case 'A': // -AZ* > Azureus + return boost::istarts_with(m_peer_id, "-AZ2304") + || boost::istarts_with(m_peer_id, "-AZ2302") + || boost::istarts_with(m_peer_id, "-AZ2300") + || boost::istarts_with(m_peer_id, "-AZ2206") + || boost::istarts_with(m_peer_id, "-AZ2205") + || boost::istarts_with(m_peer_id, "-AZ2204") + || boost::istarts_with(m_peer_id, "-AZ2203") + || boost::istarts_with(m_peer_id, "-AZ2202") + || boost::istarts_with(m_peer_id, "-AZ2201"); + case 'B': // -BC* > BitComet, -BB* > ? + return boost::istarts_with(m_peer_id, "-BB") + || boost::istarts_with(m_peer_id, "-BC0060"); + case 'F': // -FG* > FlashGet + return boost::istarts_with(m_peer_id, "-FG"); + case 'U': // -UT* > uTorrent + return boost::istarts_with(m_peer_id, "-UT11") + || boost::istarts_with(m_peer_id, "-UT11"); + case 'T': // -TS* > TorrentStorm + return boost::istarts_with(m_peer_id, "-TS"); + default: + return false; + } + //case 'A': // A* > ABC + //case 'M': // M* > Mainline + //case 'S': // S* > Shadow + //case 'T': // T* > BitTornado + //case 'X': // XBT* > XBT + //case 'O': // O* > Opera + default: + return false; + } + else + switch (m_peer_id[0]) + { + case '-': + switch (m_peer_id[1]) + { + //case 'G': // -G3* > G3 + case 'S': // -SZ* > ? + return boost::istarts_with(m_peer_id, "-SZ"); + default: + return false; + } + case 'e': // exbc* > BitComet/BitLord + return boost::istarts_with(m_peer_id, "exbc0L") + || boost::istarts_with(m_peer_id, "exbcL") + || boost::istarts_with(m_peer_id, "exbcLORD") + || boost::istarts_with(m_peer_id, "exbc\08") + || boost::istarts_with(m_peer_id, "exbc\09") + || boost::istarts_with(m_peer_id, "exbc\0:"); + //case 'S': // S57* > Shadow 57 + case 'O': // O* > Opera + return boost::istarts_with(m_peer_id, "O"); + case 'F': // FG* > FlashGet + return boost::istarts_with(m_peer_id, "FG"); + default: + return boost::istarts_with(m_peer_id, "BS") + || boost::istarts_with(m_peer_id, "FUTB") + || boost::istarts_with(m_peer_id, "TO038") + || boost::istarts_with(m_peer_id, "turbo"); + } + return false; +} diff --git a/install/xbt/linux/Tracker/tracker_input.h b/install/xbt/linux/Tracker/tracker_input.h new file mode 100644 index 000000000..dd29b1b52 --- /dev/null +++ b/install/xbt/linux/Tracker/tracker_input.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +// TorrentPier begin +#include +// TorrentPier end + +class Ctracker_input +{ +public: + void set(const std::string& name, const std::string& value); + bool valid() const; + + // TorrentPier begin + bool banned() const; + Ctracker_input(int family = AF_INET); + // TorrentPier end + + enum t_event + { + e_none, + e_completed, + e_started, + e_stopped, + e_paused, + }; + + typedef std::vector t_info_hashes; + + t_event m_event; + std::string m_info_hash; + t_info_hashes m_info_hashes; + int m_ipa; + std::string m_peer_id; + long long m_downloaded; + long long m_left; + int m_port; + long long m_uploaded; + int m_num_want; + bool m_compact; + + // TorrentPier begin + std::string m_passkey; + bool m_ipv6set; + char m_ipv6bin[16]; + int m_family; + int m_protocol; // 4 for IPv4-only, 6 for IPv6-only + // TorrentPier end +}; diff --git a/install/xbt/linux/Tracker/transaction.cpp b/install/xbt/linux/Tracker/transaction.cpp new file mode 100644 index 000000000..783fb05fb --- /dev/null +++ b/install/xbt/linux/Tracker/transaction.cpp @@ -0,0 +1,164 @@ +#include "stdafx.h" +#include "transaction.h" + +#include +#include +#include +#include +#include + +Ctransaction::Ctransaction(Cserver& server, const Csocket& s): + m_server(server) +{ + m_s = s; +} + +long long Ctransaction::connection_id() const +{ + const int cb_s = 12; + char s[cb_s]; + write_int(8, s, m_server.secret()); + write_int(4, s + 8, m_a.sin_addr.s_addr); + char d[20]; + (Csha1(const_memory_range(s, cb_s))).read(d); + return read_int(8, d); +} + +void Ctransaction::recv() +{ + const int cb_b = 2 << 10; + char b[cb_b]; + while (1) + { + socklen_t cb_a = sizeof(sockaddr_in); + int r = m_s.recvfrom(memory_range(b, cb_b), reinterpret_cast(&m_a), &cb_a); + if (r == SOCKET_ERROR) + { + if (WSAGetLastError() != WSAEWOULDBLOCK) + std::cerr << "recv failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; + return; + } + if (r < uti_size) + return; + switch (read_int(4, b + uti_action, b + r)) + { + case uta_connect: + if (r >= utic_size) + send_connect(const_memory_range(b, r)); + break; + case uta_announce: + if (r >= utia_size) + send_announce(const_memory_range(b, r)); + break; + case uta_scrape: + if (r >= utis_size) + send_scrape(const_memory_range(b, r)); + break; + } + } +} + +void Ctransaction::send_connect(const_memory_range r) +{ + if (!m_server.config().m_anonymous_connect) + return; + if (read_int(8, r + uti_connection_id, r.end) != 0x41727101980ll) + return; + const int cb_d = 2 << 10; + char d[cb_d]; + write_int(4, d + uto_action, uta_connect); + write_int(4, d + uto_transaction_id, read_int(4, r + uti_transaction_id, r.end)); + write_int(8, d + utoc_connection_id, connection_id()); + send(const_memory_range(d, utoc_size)); +} + +void Ctransaction::send_announce(const_memory_range r) +{ + if (read_int(8, r + uti_connection_id, r.end) != connection_id()) + return; + if (!m_server.config().m_anonymous_announce) + { + send_error(r, "access denied"); + return; + } + Ctracker_input ti; + ti.m_downloaded = read_int(8, r + utia_downloaded, r.end); + ti.m_event = static_cast(read_int(4, r + utia_event, r.end)); + ti.m_info_hash.assign(reinterpret_cast(r + utia_info_hash), 20); + ti.m_ipa = read_int(4, r + utia_ipa, r.end) && is_private_ipa(m_a.sin_addr.s_addr) + ? htonl(read_int(4, r + utia_ipa, r.end)) + : m_a.sin_addr.s_addr; + ti.m_left = read_int(8, r + utia_left, r.end); + ti.m_num_want = read_int(4, r + utia_num_want, r.end); + ti.m_peer_id.assign(reinterpret_cast(r + utia_peer_id), 20); + ti.m_port = htons(read_int(2, r + utia_port, r.end)); + ti.m_uploaded = read_int(8, r + utia_uploaded, r.end); + std::string error = m_server.insert_peer(ti, true, NULL); + if (!error.empty()) + { + send_error(r, error); + return; + } + const Cserver::t_file* file = m_server.file(ti.m_info_hash); + if (!file) + return; + const int cb_d = 2 << 10; + char d[cb_d]; + write_int(4, d + uto_action, uta_announce); + write_int(4, d + uto_transaction_id, read_int(4, r + uti_transaction_id, r.end)); + write_int(4, d + utoa_interval, m_server.config().m_announce_interval); + write_int(4, d + utoa_leechers, file->leechers); + write_int(4, d + utoa_seeders, file->seeders); + std::string peers = file->select_peers(ti); + memcpy(d + utoa_size, peers.data(), peers.size()); + send(const_memory_range(d, d + utoa_size + peers.size())); +} + +void Ctransaction::send_scrape(const_memory_range r) +{ + if (read_int(8, r + uti_connection_id, r.end) != connection_id()) + return; + if (!m_server.config().m_anonymous_scrape) + { + send_error(r, "access denied"); + return; + } + const int cb_d = 2 << 10; + char d[cb_d]; + write_int(4, d + uto_action, uta_scrape); + write_int(4, d + uto_transaction_id, read_int(4, r + uti_transaction_id, r.end)); + char* w = d + utos_size; + for (r += utis_size; r + 20 <= r.end && w + 12 <= d + cb_d; r += 20) + { + if (const Cserver::t_file* file = m_server.file(r.sub_range(0, 20).string())) + { + w = write_int(4, w, file->seeders); + w = write_int(4, w, file->completed); + w = write_int(4, w, file->leechers); + } + else + { + w = write_int(4, w, 0); + w = write_int(4, w, 0); + w = write_int(4, w, 0); + } + } + m_server.stats().scraped_udp++; + send(const_memory_range(d, w)); +} + +void Ctransaction::send_error(const_memory_range r, const std::string& msg) +{ + const int cb_d = 2 << 10; + char d[cb_d]; + write_int(4, d + uto_action, uta_error); + write_int(4, d + uto_transaction_id, read_int(4, r + uti_transaction_id, r.end)); + memcpy(d + utoe_size, msg.data(), msg.size()); + send(const_memory_range(d, utoe_size + msg.size())); +} + +void Ctransaction::send(const_memory_range b) +{ + if (m_s.sendto(b, reinterpret_cast(&m_a), sizeof(sockaddr_in)) != b.size()) + std::cerr << "send failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; +} diff --git a/install/xbt/linux/Tracker/transaction.h b/install/xbt/linux/Tracker/transaction.h new file mode 100644 index 000000000..1a0f2faa1 --- /dev/null +++ b/install/xbt/linux/Tracker/transaction.h @@ -0,0 +1,20 @@ +#pragma once + +#include "server.h" + +class Ctransaction +{ +public: + long long connection_id() const; + void recv(); + void send(const_memory_range); + void send_announce(const_memory_range); + void send_connect(const_memory_range); + void send_scrape(const_memory_range); + void send_error(const_memory_range, const std::string& msg); + Ctransaction(Cserver&, const Csocket&); +private: + Cserver& m_server; + Csocket m_s; + sockaddr_in m_a; +}; diff --git a/install/xbt/linux/Tracker/udp_listen_socket.cpp b/install/xbt/linux/Tracker/udp_listen_socket.cpp new file mode 100644 index 000000000..13bceea8e --- /dev/null +++ b/install/xbt/linux/Tracker/udp_listen_socket.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include "udp_listen_socket.h" + +#include "transaction.h" + +Cudp_listen_socket::Cudp_listen_socket() +{ + m_server = NULL; +} + +Cudp_listen_socket::Cudp_listen_socket(Cserver* server, const Csocket& s) +{ + m_server = server; + m_s = s; +} + +void Cudp_listen_socket::process_events(int events) +{ + if (events & EPOLLIN) + Ctransaction(*m_server, m_s).recv(); +} diff --git a/install/xbt/linux/Tracker/udp_listen_socket.h b/install/xbt/linux/Tracker/udp_listen_socket.h new file mode 100644 index 000000000..7e215e097 --- /dev/null +++ b/install/xbt/linux/Tracker/udp_listen_socket.h @@ -0,0 +1,14 @@ +#pragma once + +#include "client.h" + +class Cserver; + +class Cudp_listen_socket: public Cclient +{ +public: + virtual void process_events(int); + Cclient::s; + Cudp_listen_socket(); + Cudp_listen_socket(Cserver*, const Csocket&); +}; diff --git a/install/xbt/linux/Tracker/xbt_tracker b/install/xbt/linux/Tracker/xbt_tracker new file mode 100644 index 0000000000000000000000000000000000000000..bb16e79da6906a0858af528dd7a8d2dd8f7b6536 GIT binary patch literal 365032 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 z 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 R{eDsBf0I#12IYdh{|A3eNLK&= literal 0 HcmV?d00001 diff --git a/install/xbt/linux/Tracker/xbt_tracker.pid b/install/xbt/linux/Tracker/xbt_tracker.pid new file mode 100644 index 000000000..65cbcc0f4 --- /dev/null +++ b/install/xbt/linux/Tracker/xbt_tracker.pid @@ -0,0 +1 @@ +43033 diff --git a/install/xbt/linux/Tracker/xbtt.sh b/install/xbt/linux/Tracker/xbtt.sh new file mode 100644 index 000000000..8c2ef8898 --- /dev/null +++ b/install/xbt/linux/Tracker/xbtt.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# + +# PROVIDE: xbtt +# REQUIRE: NETWORKING mysql + +# Add the following line to /etc/rc.conf to enable XBTT: +# xbtt_enable (bool): Set to "NO" by default. +# Set it to "YES" to enable XBTT. +# xbtt_path (str): Path to dir with xbt_tracker.conf + +. /etc/rc.subr + +name="xbtt" +rcvar=`set_rcvar` +start_precmd="${name}_prestart" + +command="/db/www/xbtt/Tracker/xbt_tracker" + +: ${xbtt_path="/db/www/xbtt/Tracker"} + +xbtt_prestart() +{ + cd ${xbtt_path} +} + +load_rc_config $name +run_rc_command "$1" + + diff --git a/install/xbt/linux/misc/alerts.cpp b/install/xbt/linux/misc/alerts.cpp new file mode 100644 index 000000000..4a33ed481 --- /dev/null +++ b/install/xbt/linux/misc/alerts.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "alerts.h" + +#include "bt_misc.h" + +int Calert::pre_dump() const +{ + return m_message.size() + m_source.size() + 16; +} + +void Calert::dump(Cstream_writer& w) const +{ + w.write_int(4, m_time); + w.write_int(4, m_level); + w.write_data(m_message); + w.write_data(m_source); +} diff --git a/install/xbt/linux/misc/alerts.h b/install/xbt/linux/misc/alerts.h new file mode 100644 index 000000000..3c81e8336 --- /dev/null +++ b/install/xbt/linux/misc/alerts.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include +#include "stream_writer.h" + +class Calert +{ +public: + enum t_level + { + emerg, + alert, + crit, + error, + warn, + notice, + info, + debug, + }; + + time_t time() const + { + return m_time; + } + + t_level level() const + { + return m_level; + } + + const std::string& message() const + { + return m_message; + } + + void message(const std::string& v) + { + m_message = v; + } + + Calert(t_level level, const std::string& message) + { + m_time = ::time(NULL); + m_level = level; + m_message = message; + } + + Calert(t_level level, const std::string& source, const std::string& message) + { + m_time = ::time(NULL); + m_level = level; + m_message = message; + m_source = source; + } + + int pre_dump() const; + void dump(Cstream_writer&) const; +private: + time_t m_time; + t_level m_level; + std::string m_message; + std::string m_source; +}; + +class Calerts: public std::list +{ +public: + void push_back(const value_type& v) + { + std::list::push_back(v); + while (size() > 250) + erase(begin()); + } +}; diff --git a/install/xbt/linux/misc/bt_misc.cpp b/install/xbt/linux/misc/bt_misc.cpp new file mode 100644 index 000000000..4c5166fda --- /dev/null +++ b/install/xbt/linux/misc/bt_misc.cpp @@ -0,0 +1,354 @@ +#include "stdafx.h" +#include "bt_misc.h" + +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#pragma comment(lib, "ws2_32") +#endif + +std::string escape_string(const std::string& v) +{ + std::string w; + w.reserve(v.length()); + BOOST_FOREACH(char i, v) + { + if (isgraph(i & 0xff)) + w += i; + else + { + switch (i) + { + case '\0': + w += "\\0"; + break; + default: + w += "\\x" + hex_encode(2, i); + } + } + } + return w; +} + +std::string generate_random_string(int l) +{ + std::string v; + while (l--) + v += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 62]; + return v; +} + +std::string get_env(const std::string& v) +{ + const char* p = getenv(v.c_str()); + return p ? p : ""; +} + +static int hex_decode(char v) +{ + if (v >= '0' && v <= '9') + return v - '0'; + if (v >= 'A' && v <= 'F') + return v - 'A' + 10; + if (v >= 'a' && v <= 'f') + return v - 'a' + 10; + return -1; +}; + +std::string hex_decode(const std::string& v) +{ + std::string r; + r.resize(v.length() >> 1); + for (size_t i = 0; i + 2 <= v.length(); i += 2) + { + int a = hex_decode(v[i]); + r[i >> 1] = a << 4 | hex_decode(v[i + 1]); + } + return r; +} + +std::string hex_encode(int l, int v) +{ + std::string r; + r.resize(l); + while (l--) + { + r[l] = "0123456789abcdef"[v & 0xf]; + v >>= 4; + } + return r; +}; + +std::string n(long long v) +{ + char b[21]; +#ifdef WIN32 + sprintf(b, "%I64d", v); +#else + sprintf(b, "%lld", v); +#endif + return b; +} + +std::string hex_encode(const_memory_range v) +{ + std::string r; + r.reserve(v.size() << 1); + for (size_t i = 0; i < v.size(); i++) + r += hex_encode(2, v[i]); + return r; +} + +std::string js_encode(const std::string& v) +{ + std::string r; + BOOST_FOREACH(int i, v) + { + switch (i) + { + case '\"': + case '\'': + case '\\': + r += '\\'; + default: + r += i; + } + } + return r; +} + +std::string uri_decode(const std::string& v) +{ + std::string r; + r.reserve(v.length()); + for (size_t i = 0; i < v.length(); i++) + { + char c = v[i]; + switch (c) + { + case '%': + { + if (i + 1 > v.length()) + return ""; + int l = v[++i]; + r += hex_decode(l) << 4 | hex_decode(v[++i]); + break; + } + case '+': + r += ' '; + break; + default: + r += c; + } + } + return r; +}; + +std::string uri_encode(const std::string& v) +{ + std::string r; + r.reserve(v.length()); + BOOST_FOREACH(char c, v) + { + if (isalpha(c & 0xff) || isdigit(c & 0xff)) + r += c; + else + { + switch (c) + { + case ' ': + r += '+'; + break; + case '-': + case ',': + case '.': + case '@': + case '_': + r += c; + break; + default: + r += "%" + hex_encode(2, c); + } + } + } + return r; +}; + +bool is_private_ipa(int a) +{ + return (ntohl(a) & 0xff000000) == 0x0a000000 + || (ntohl(a) & 0xff000000) == 0x7f000000 + || (ntohl(a) & 0xfff00000) == 0xac100000 + || (ntohl(a) & 0xffff0000) == 0xc0a80000; +} + +std::string b2a(long long v, const char* postfix) +{ + int l; + for (l = 0; v < -9999 || v > 999999; l++) + v >>= 10; + char d[32]; + char* w = d; + if (v > 999) + { + l++; + int b = static_cast((v & 0x3ff) * 100 >> 10); + v >>= 10; + w += sprintf(w, "%d", static_cast(v)); + if (v < 10 && b % 10) + w += sprintf(w, ".%02d", b); + else if (v < 100 && b > 9) + w += sprintf(w, ".%d", b / 10); + } + else + w += sprintf(w, "%d", static_cast(v)); + const char* a[] = {"", " k", " m", " g", " t", " p", " e", " z", " y"}; + w += sprintf(w, "%s", a[l]); + if (postfix) + w += sprintf(w, "%s%s", l ? "" : " ", postfix); + return d; +} + +static std::string peer_id2a(const std::string& name, const std::string& peer_id, int i) +{ + for (size_t j = i; j < peer_id.size(); j++) + { + if (!isalnum(peer_id[j])) + return name + peer_id.substr(i, j - i); + } + return name + peer_id.substr(i); +} + +std::string peer_id2a(const std::string& v) +{ + if (v.length() != 20) + return ""; + if (v[7] == '-') + { + switch (v[0]) + { + case '-': + if (v[1] == 'A' && v[2] == 'Z') + return peer_id2a("Azureus ", v, 3); + if (v[1] == 'B' && v[2] == 'C') + return peer_id2a("BitComet ", v, 3); + if (v[1] == 'U' && v[2] == 'T') + return peer_id2a("uTorrent ", v, 3); + if (v[1] == 'T' && v[2] == 'S') + return peer_id2a("TorrentStorm ", v, 3); + break; + case 'A': + return peer_id2a("ABC ", v, 1); + case 'M': + return peer_id2a("Mainline ", v, 1); + case 'S': + return peer_id2a("Shadow ", v, 1); + case 'T': + return peer_id2a("BitTornado ", v, 1); + case 'X': + if (v[1] == 'B' && v[2] == 'T') + return peer_id2a("XBT Client ", v, 3) + (v.find_first_not_of("0123456789ABCDEFGHIJKLMNOPQRSTUVWYXZabcdefghijklmnopqrstuvwyxz", 8) == std::string::npos ? "" : " (fake)"); + break; + } + } + switch (v[0]) + { + case '-': + if (v[1] == 'G' && v[2] == '3') + return "G3"; + break; + case 'S': + if (v[1] == 5 && v[2] == 7 && v[3] >= 0 && v[3] < 10) + return "Shadow 57" + n(v[3]); + break; + case 'e': + if (v[1] == 'x' && v[2] == 'b' && v[3] == 'c' && v[4] >= 0 && v[4] < 10 && v[5] >= 0 && v[5] < 100) + return "BitComet " + n(v[4]) + '.' + n(v[5] / 10) + n(v[5] % 10); + } + return "Unknown"; +} + +std::string duration2a(float v) +{ + char d[32]; + if (v > 31557600) + sprintf(d, "%.1f years", v / 31557600); + else if (v > 2629800) + sprintf(d, "%.1f months", v / 2629800); + else if (v > 604800) + sprintf(d, "%.1f weeks", v / 604800); + else if (v > 86400) + sprintf(d, "%.1f days", v / 86400); + else if (v > 3600) + sprintf(d, "%.1f hours", v / 3600); + else if (v > 60) + sprintf(d, "%.1f minutes", v / 60); + else + sprintf(d, "%.1f seconds", v); + return d; +} + +std::string time2a(time_t v) +{ + const tm* date = localtime(&v); + if (!date) + return ""; + char b[20]; + sprintf(b, "%04d-%02d-%02d %02d:%02d:%02d", date->tm_year + 1900, date->tm_mon + 1, date->tm_mday, date->tm_hour, date->tm_min, date->tm_sec); + return b; +} + +int merkle_tree_size(int v) +{ + int r = 0; + while (v > 1) + { + r += v++; + v >>= 1; + } + if (v == 1) + r++; + return r; +} + +std::string backward_slashes(std::string v) +{ + std::replace(v.begin(), v.end(), '/', '\\'); + return v; +} + +std::string forward_slashes(std::string v) +{ + std::replace(v.begin(), v.end(), '\\', '/'); + return v; +} + +std::string native_slashes(const std::string& v) +{ +#ifdef WIN32 + return backward_slashes(v); +#else + return forward_slashes(v); +#endif +} + +int hms2i(int h, int m, int s) +{ + return 60 * (h + 60 * m) + s; +} + +int xbt_atoi(const std::string& a) +{ + int i = atoi(a.c_str()); + return n(i) == a ? i : 0; +} + +std::string xbt_version2a(int v) +{ + return n(v / 100) + "." + n(v / 10 % 10) + "." + n(v % 10); +} diff --git a/install/xbt/linux/misc/bt_misc.h b/install/xbt/linux/misc/bt_misc.h new file mode 100644 index 000000000..79907adda --- /dev/null +++ b/install/xbt/linux/misc/bt_misc.h @@ -0,0 +1,96 @@ +#pragma once + +#include +#include + +std::string b2a(long long v, const char* postfix = NULL); +std::string backward_slashes(std::string); +std::string duration2a(float); +std::string escape_string(const std::string&); +std::string forward_slashes(std::string); +std::string generate_random_string(int); +std::string get_env(const std::string&); +int hms2i(int h, int m, int s); +bool is_private_ipa(int a); +int merkle_tree_size(int v); +std::string n(long long); +std::string native_slashes(const std::string&); +std::string hex_decode(const std::string&); +std::string hex_encode(int l, int v); +std::string hex_encode(const_memory_range); +std::string js_encode(const std::string&); +std::string peer_id2a(const std::string&); +std::string time2a(time_t); +std::string uri_decode(const std::string&); +std::string uri_encode(const std::string&); +int xbt_atoi(const std::string&); +std::string xbt_version2a(int); + +inline long long htonll(long long v) +{ + const unsigned char* a = reinterpret_cast(&v); + long long b = a[0] << 24 | a[1] << 16 | a[2] << 8 | a[3]; + return b << 32 | static_cast(a[4]) << 24 | a[5] << 16 | a[6] << 8 | a[7]; +} + +inline long long ntohll(long long v) +{ + return htonll(v); +} + +enum +{ + hs_name_size = 0, + hs_name = 1, + hs_reserved = 20, + hs_info_hash = 28, + hs_size = 48, +}; + +enum +{ + uta_connect, + uta_announce, + uta_scrape, + uta_error, +}; + +enum +{ + uti_connection_id = 0, + uti_action = 8, + uti_transaction_id = 12, + uti_size = 16, + + utic_size = 16, + + utia_info_hash = 16, + utia_peer_id = 36, + utia_downloaded = 56, + utia_left = 64, + utia_uploaded = 72, + utia_event = 80, + utia_ipa = 84, + utia_key = 88, + utia_num_want = 92, + utia_port = 96, + utia_size = 98, + + utis_size = 16, + + uto_action = 0, + uto_transaction_id = 4, + uto_size = 8, + + utoc_connection_id = 8, + utoc_size = 16, + + utoa_interval = 8, + utoa_leechers = 12, + utoa_seeders = 16, + utoa_size = 20, + + utos_size = 8, + + utoe_size = 8, +}; diff --git a/install/xbt/linux/misc/bt_strings.h b/install/xbt/linux/misc/bt_strings.h new file mode 100644 index 000000000..d46ed2cc2 --- /dev/null +++ b/install/xbt/linux/misc/bt_strings.h @@ -0,0 +1,115 @@ +#pragma once + +enum +{ + bti_choke , + bti_unchoke, + bti_interested, + bti_uninterested, + bti_have, + bti_bitfield, + bti_request, + bti_piece, + bti_cancel, + + bti_get_info, + bti_info, + bti_get_peers, + bti_peers, + + bti_extended = 20, + + bti_bvalue = 0x40, +}; + +enum +{ + bti_extended_handshake, + bti_extended_ut_pex, +}; + +enum +{ + bti_none, + bti_completed, + bti_started, + bti_stopped, +}; + +const std::string bts_action = "action"; +const std::string bts_admin_port = "admin port"; +const std::string bts_admin_user = "admin user"; +const std::string bts_admin_pass = "admin pass"; +const std::string bts_announce = "announce"; +const std::string bts_announce_list = "announce-list"; +const std::string bts_banned_client = "access denied, banned client"; +const std::string bts_can_not_leech = "access denied, leeching forbidden, you are only allowed to seed"; +const std::string bts_park = "access denied, account parked"; +const std::string bts_close_torrent = "close torrent"; +const std::string bts_complete = "complete"; +const std::string bts_complete_total = "complete total"; +const std::string bts_completed_at = "completed at"; +const std::string bts_completes_dir = "completes dir"; +const std::string bts_down_rate = "down rate"; +const std::string bts_downloaded = "downloaded"; +const std::string bts_erase_torrent = "erase torrent"; +const std::string bts_events = "events"; +const std::string bts_failure_reason = "failure reason"; +const std::string bts_files = "files"; +const std::string bts_flags = "flags"; +const std::string bts_get_options = "get options"; +const std::string bts_get_status = "get status"; +const std::string bts_hash = "hash"; +const std::string bts_incomplete = "incomplete"; +const std::string bts_incomplete_total = "incomplete total"; +const std::string bts_incompletes_dir = "incompletes dir"; +const std::string bts_info = "info"; +const std::string bts_interval = "interval"; +const std::string bts_ipa = "ip"; +const std::string bts_left = "left"; +const std::string bts_length = "length"; +const std::string bts_login = "login"; +const std::string bts_merkle_hash = "merkle hash"; +const std::string bts_message = "message"; +const std::string bts_min_interval = "min interval"; +const std::string bts_min_request_interval = "min_request_interval"; +const std::string bts_name = "name"; +const std::string bts_open_torrent = "open torrent"; +const std::string bts_pass = "pass"; +const std::string bts_path = "path"; +const std::string bts_peer_id = "peer id"; +const std::string bts_peer_limit = "peer limit"; +const std::string bts_peer_port = "peer port"; +const std::string bts_peers = "peers"; +const std::string bts_peers_limit_reached = "access denied, peers limit reached"; +const std::string bts_piece_length = "piece length"; +const std::string bts_pieces = "pieces"; +const std::string bts_private = "private"; +const std::string bts_port = "port"; +const std::string bts_priority = "priority"; +const std::string bts_seeding_ratio = "seeding ratio"; +const std::string bts_set_options = "set options"; +const std::string bts_set_priority = "set priority"; +const std::string bts_set_state = "set state"; +const std::string bts_size = "size"; +const std::string bts_started_at = "started at"; +const std::string bts_state = "state"; +const std::string bts_time = "time"; +const std::string bts_torrent = "torrent"; +const std::string bts_torrent_limit = "torrent limit"; +const std::string bts_torrents_dir = "torrents dir"; +const std::string bts_torrents_limit_reached = "access denied, torrents limit reached"; +const std::string bts_total_downloaded = "total downloaded"; +const std::string bts_total_uploaded = "total uploaded"; +const std::string bts_tracker_port = "tracker port"; +const std::string bts_unregistered_ipa = "unregistered IP address"; +const std::string bts_unregistered_torrent = "unregistered torrent"; +const std::string bts_unregistered_torrent_pass = "unregistered torrent pass"; +const std::string bts_unsupported_tracker_protocol = "unsupported tracker protocol, please upgrade your client"; +const std::string bts_up_rate = "up rate"; +const std::string bts_upload_rate = "upload rate"; +const std::string bts_upload_slots = "upload slots"; +const std::string bts_user_agent = "user agent"; +const std::string bts_version = "version"; +const std::string bts_wait_time = "access denied, wait time in effect"; +const std::string bts_disabled = "access denied, account disabled"; \ No newline at end of file diff --git a/install/xbt/linux/misc/bt_torrent.cpp b/install/xbt/linux/misc/bt_torrent.cpp new file mode 100644 index 000000000..8adaac78b --- /dev/null +++ b/install/xbt/linux/misc/bt_torrent.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "bt_torrent.h" + +#include "bt_strings.h" + +Cbt_torrent::Cbt_torrent() +{ +} + +Cbt_torrent::Cbt_torrent(const Cbvalue& v) +{ + write(v); +} + +int Cbt_torrent::write(const Cbvalue& v) +{ + m_announce = v[bts_announce].s(); + m_announces.clear(); + const Cbvalue::t_list& announces = v[bts_announce_list].l(); + for (Cbvalue::t_list::const_iterator i = announces.begin(); i != announces.end(); i++) + { + for (Cbvalue::t_list::const_iterator j = i->l().begin(); j != i->l().end(); j++) + m_announces.push_back(j->s()); + } + return write_info(v[bts_info]); +} + +int Cbt_torrent::write_info(const Cbvalue& v) +{ + m_files.clear(); + const Cbvalue::t_list& files = v[bts_files].l(); + for (Cbvalue::t_list::const_iterator i = files.begin(); i != files.end(); i++) + { + std::string name; + long long size = (*i)[bts_length].i(); + { + const Cbvalue::t_list& path = (*i)[bts_path].l(); + for (Cbvalue::t_list::const_iterator i = path.begin(); i != path.end(); i++) + { + if (i->s().empty() || i->s()[0] == '.' || i->s().find_first_of("\"*/:<>?\\|") != std::string::npos) + return 1; + name += '/' + i->s(); + } + } + if (name.empty()) + return 1; + m_files.push_back(Cfile(name, size)); + } + if (m_files.empty()) + m_files.push_back(Cfile("", v[bts_length].i())); + m_name = v[bts_name].s(); + m_piece_size = v[bts_piece_length].i(); + return 0; +} + +long long Cbt_torrent::size() const +{ + long long r = 0; + for (t_files::const_iterator i = m_files.begin(); i != m_files.end(); i++) + r += i->size(); + return r; +} + +bool Cbt_torrent::valid() const +{ + for (t_files::const_iterator i = m_files.begin(); i != m_files.end(); i++) + { + if (i->size() < 0) + return false; + } + return !files().empty() + && !name().empty() + && name()[0] != '.' + && name().find_first_of("\"*/:<>?\\|") == std::string::npos + && piece_size() >= 16 << 10 + && piece_size() <= 4 << 20; +} diff --git a/install/xbt/linux/misc/bt_torrent.h b/install/xbt/linux/misc/bt_torrent.h new file mode 100644 index 000000000..7540d782b --- /dev/null +++ b/install/xbt/linux/misc/bt_torrent.h @@ -0,0 +1,75 @@ +#pragma once + +#include "bvalue.h" + +class Cbt_torrent +{ +public: + class Cfile + { + public: + const std::string& name() const + { + return m_name; + } + + long long size() const + { + return m_size; + } + + Cfile() + { + } + + Cfile(const std::string& name, long long size) + { + m_name = name; + m_size = size; + } + private: + std::string m_name; + long long m_size; + }; + + typedef std::vector t_announces; + typedef std::vector t_files; + + long long size() const; + bool valid() const; + int write(const Cbvalue&); + int write_info(const Cbvalue&); + Cbt_torrent(); + Cbt_torrent(const Cbvalue&); + + const std::string& announce() const + { + return m_announce; + } + + const t_announces& announces() const + { + return m_announces; + } + + const t_files& files() const + { + return m_files; + } + + const std::string& name() const + { + return m_name; + } + + int piece_size() const + { + return m_piece_size; + } +private: + std::string m_announce; + t_announces m_announces; + t_files m_files; + std::string m_name; + int m_piece_size; +}; diff --git a/install/xbt/linux/misc/bt_tracker_account.cpp b/install/xbt/linux/misc/bt_tracker_account.cpp new file mode 100644 index 000000000..9f3458af9 --- /dev/null +++ b/install/xbt/linux/misc/bt_tracker_account.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "xbt/virtual_binary.h" +#include "bt_tracker_account.h" + +#include "stream_reader.h" + +Cbt_tracker_account::Cbt_tracker_account() +{ +} + +Cbt_tracker_account::Cbt_tracker_account(const std::string& tracker, const std::string& user, const std::string& pass) +{ + m_tracker = tracker; + m_user = user; + m_pass = pass; +} + +int Cbt_tracker_account::pre_dump() const +{ + return tracker().size() + user().size() + pass().size() + 12; +} + +void Cbt_tracker_account::dump(Cstream_writer& w) const +{ + w.write_data(tracker()); + w.write_data(user()); + w.write_data(pass()); +} + +Cvirtual_binary Cbt_tracker_accounts::dump() const +{ + int cb_d = 4; + for (const_iterator i = begin(); i != end(); i++) + cb_d += i->pre_dump(); + Cvirtual_binary d; + Cstream_writer w(d.write_start(cb_d)); + w.write_int(4, size()); + for (const_iterator i = begin(); i != end(); i++) + i->dump(w); + assert(w.w() == d.end()); + return d; + +} + +const Cbt_tracker_account* Cbt_tracker_accounts::find(const std::string& v) const +{ + for (const_iterator i = begin(); i != end(); i++) + { + if (i->tracker() == v) + return &*i; + } + return NULL; +} + +void Cbt_tracker_accounts::load(const Cvirtual_binary& s) +{ + clear(); + if (s.size() < 4) + return; + Cstream_reader r(s); + for (int count = r.read_int(4); count--; ) + { + std::string tracker = r.read_string(); + std::string name = r.read_string(); + std::string pass = r.read_string(); + push_back(Cbt_tracker_account(tracker, name, pass)); + } +} diff --git a/install/xbt/linux/misc/bt_tracker_account.h b/install/xbt/linux/misc/bt_tracker_account.h new file mode 100644 index 000000000..34ee73247 --- /dev/null +++ b/install/xbt/linux/misc/bt_tracker_account.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +class Cbt_tracker_account +{ +public: + int pre_dump() const; + void dump(Cstream_writer&) const; + Cbt_tracker_account(); + Cbt_tracker_account(const std::string& tracker, const std::string& user, const std::string& pass); + + const std::string& tracker() const + { + return m_tracker; + } + + const std::string& user() const + { + return m_user; + } + + const std::string& pass() const + { + return m_pass; + } +private: + std::string m_tracker; + std::string m_user; + std::string m_pass; +}; + +class Cbt_tracker_accounts: public std::list +{ +public: + Cvirtual_binary dump() const; + const Cbt_tracker_account* find(const std::string&) const; + void load(const Cvirtual_binary&); +}; diff --git a/install/xbt/linux/misc/bt_tracker_url.cpp b/install/xbt/linux/misc/bt_tracker_url.cpp new file mode 100644 index 000000000..c31ed9711 --- /dev/null +++ b/install/xbt/linux/misc/bt_tracker_url.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "bt_tracker_url.h" + +#include + +Cbt_tracker_url::Cbt_tracker_url() +{ +} + +Cbt_tracker_url::Cbt_tracker_url(const std::string& v) +{ + write(v); +} + +void Cbt_tracker_url::clear() +{ + m_protocol = tp_unknown; + m_host.erase(); + m_port = 0; + m_path.erase(); +} + +bool Cbt_tracker_url::valid() const +{ + switch (m_protocol) + { + case tp_http: + if (m_path.empty() || m_path[0] != '/') + return false; + case tp_udp: + return !m_host.empty() + && m_port >= 0 && m_port < 0x10000; + } + return false; +} + +void Cbt_tracker_url::write(const std::string& v) +{ + clear(); + size_t a; + int protocol; + int port; + if (boost::istarts_with(v, "http://")) + { + a = 7; + protocol = tp_http; + port = 80; + } + else if (boost::istarts_with(v, "udp://")) + { + a = 6; + protocol = tp_udp; + port = 2710; + } + else + return; + size_t b = v.find_first_of("/:", a); + std::string host; + if (b == std::string::npos) + host = v.substr(a); + else + { + host = v.substr(a, b - a); + if (v[b] == '/') + m_path = v.substr(b); + else + { + b++; + a = v.find('/', b); + if (a == std::string::npos) + port = atoi(v.substr(b).c_str()); + else + { + port = atoi(v.substr(b, a - b).c_str()); + m_path = v.substr(a); + } + } + } + m_protocol = protocol; + m_host = host; + m_port = port; +} diff --git a/install/xbt/linux/misc/bt_tracker_url.h b/install/xbt/linux/misc/bt_tracker_url.h new file mode 100644 index 000000000..a6ad3c905 --- /dev/null +++ b/install/xbt/linux/misc/bt_tracker_url.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +class Cbt_tracker_url +{ +public: + enum + { + tp_http, + tp_udp, + tp_unknown + }; + + void clear(); + bool valid() const; + void write(const std::string&); + Cbt_tracker_url(const std::string&); + Cbt_tracker_url(); + + int m_protocol; + std::string m_host; + int m_port; + std::string m_path; +}; diff --git a/install/xbt/linux/misc/bvalue.cpp b/install/xbt/linux/misc/bvalue.cpp new file mode 100644 index 000000000..6daa9f371 --- /dev/null +++ b/install/xbt/linux/misc/bvalue.cpp @@ -0,0 +1,370 @@ +#include "stdafx.h" +#include "bvalue.h" + +#include +#include +#include "bt_misc.h" + +Cbvalue::Cbvalue(long long v) +{ + m_value_type = vt_int; + m_int = v; +} + +Cbvalue::Cbvalue(t_value_type t) +{ + switch (m_value_type = t) + { + case vt_int: + break; + case vt_string: + m_string = new std::string; + break; + case vt_list: + m_list = new t_list; + break; + case vt_dictionary: + m_map = new t_map; + break; + default: + assert(false); + } +} + +Cbvalue::Cbvalue(const std::string& v) +{ + m_value_type = vt_string; + m_string = new std::string(v); +} + +Cbvalue::Cbvalue(const Cbvalue& v) +{ + switch (m_value_type = v.m_value_type) + { + case vt_int: + m_int = v.m_int; + break; + case vt_string: + m_string = new std::string(*v.m_string); + break; + case vt_list: + m_list = new t_list(*v.m_list); + break; + case vt_dictionary: + m_map = new t_map(*v.m_map); + break; + default: + assert(false); + } +} + +Cbvalue::Cbvalue(const_memory_range s) +{ + m_value_type = vt_int; + if (write(s)) + clear(); +} + +Cbvalue::~Cbvalue() +{ + clear(); +} + +const Cbvalue& Cbvalue::operator=(const Cbvalue& v) +{ + clear(); + m_value_type = v.m_value_type; + switch (v.m_value_type) + { + case vt_int: + m_int = v.m_int; + break; + case vt_string: + m_string = new std::string(*v.m_string); + break; + case vt_list: + m_list = new t_list(*v.m_list); + break; + case vt_dictionary: + m_map = new t_map(*v.m_map); + break; + default: + assert(false); + } + return *this; +} + +int Cbvalue::write(const_memory_range s) +{ + return write(reinterpret_cast(s.begin), s.size()); +} + +int Cbvalue::write(const char* s, int cb_s) +{ + return write(s, s + cb_s); +} + +int Cbvalue::write(const char*& s, const char* s_end) +{ + clear(); + if (s >= s_end) + return 1; + switch (*s++) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + const char* a = s - 1; + while (s < s_end && *s != ':') + s++; + if (s++ >= s_end) + return 1; + int l = atoi(a); + if (s + l > s_end) + return 1; + m_value_type = vt_string; + m_string = new std::string(s, l); + s += l; + return 0; + } + case 'd': + { + m_value_type = vt_dictionary; + m_map = new t_map; + while (s < s_end && *s != 'e') + { + Cbvalue v; + Cbvalue w; + if (v.write(s, s_end) || v.m_value_type != vt_string) + return 1; + if (w.write(s, s_end)) + return 1; + (*m_map)[*v.m_string] = w; + } + if (s++ >= s_end) + return 1; + return 0; + } + break; + case 'i': + { + const char* a = s; + while (s < s_end && *s != 'e') + s++; + if (s++ >= s_end) + return 1; + m_value_type = vt_int; + m_int = atoll(a); + return 0; + } + case 'l': + { + m_value_type = vt_list; + m_list = new t_list; + while (s < s_end && *s != 'e') + { + Cbvalue v; + if (v.write(s, s_end)) + return 1; + m_list->push_back(v); + } + if (s++ >= s_end) + return 1; + return 0; + } + } + return 1; +} + +void Cbvalue::clear() +{ + switch (m_value_type) + { + case vt_int: + break; + case vt_string: + delete m_string; + break; + case vt_list: + delete m_list; + break; + case vt_dictionary: + delete m_map; + break; + default: + assert(false); + } + m_value_type = vt_int; +} + +const Cbvalue::t_map& Cbvalue::d() const +{ + static t_map z; + return m_value_type == vt_dictionary ? *m_map : z; +} + +bool Cbvalue::d_has(const std::string& v) const +{ + return m_value_type == vt_dictionary && m_map->find(v) != m_map->end(); +} + +const Cbvalue& Cbvalue::d(const std::string& v) const +{ + if (m_value_type == vt_dictionary) + { + t_map::const_iterator i = m_map->find(v); + if (i != m_map->end()) + return i->second; + } + static Cbvalue z; + return z; +} + +const Cbvalue& Cbvalue::operator[](const std::string& v) const +{ + return d(v); +} + +long long Cbvalue::i() const +{ + return m_value_type == vt_int ? m_int : 0; +} + +const Cbvalue::t_list& Cbvalue::l() const +{ + static t_list z; + return m_value_type == vt_list ? *m_list : z; +} + +const std::string& Cbvalue::s() const +{ + static std::string z; + return m_value_type == vt_string ? *m_string : z; +} + +Cbvalue& Cbvalue::d(const std::string& v, const Cbvalue& w) +{ + if (m_value_type != vt_dictionary) + { + clear(); + m_value_type = vt_dictionary; + m_map = new t_map; + } + (*m_map)[v] = w; + return *this; +} + +Cbvalue& Cbvalue::l(const Cbvalue& v) +{ + if (m_value_type != vt_list) + { + clear(); + m_value_type = vt_list; + m_list = new t_list; + } + (*m_list).push_back(v); + return *this; +} + +int Cbvalue::pre_read() const +{ + switch (m_value_type) + { + case vt_int: + return n(m_int).size() + 2; + case vt_string: + return n(m_string->size()).size() + m_string->size() + 1; + case vt_list: + { + int v = 2; + BOOST_FOREACH(t_list::const_reference i, *m_list) + v += i.pre_read(); + return v; + } + case vt_dictionary: + { + int v = 2; + BOOST_FOREACH(t_map::const_reference i, *m_map) + v += n(i.first.size()).size() + i.first.size() + i.second.pre_read() + 1; + return v; + } + } + assert(false); + return 0; +} + +Cvirtual_binary Cbvalue::read() const +{ + Cvirtual_binary d; + int cb_d = read(d.write_start(pre_read())); + assert(cb_d == d.size()); + return d; +} + +int Cbvalue::read(void* d) const +{ + return read(reinterpret_cast(d)); +} + +int Cbvalue::read(char* d) const +{ + char* w = d; + switch (m_value_type) + { + case vt_int: +#ifdef WIN32 + sprintf(d, "i%I64d", m_int); +#else + sprintf(d, "i%lld", m_int); +#endif + w += strlen(d); + *w++ = 'e'; + return w - d; + case vt_string: +#ifdef WIN32 + sprintf(w, "%d:", m_string->size()); +#else + sprintf(w, "%zu:", m_string->size()); +#endif + w += n(m_string->size()).size() + 1; + memcpy(w, m_string->data(), m_string->size()); + w += m_string->size(); + return w - d; + case vt_list: + { + *w++ = 'l'; + for (t_list::const_iterator i = m_list->begin(); i != m_list->end(); i++) + w += i->read(w); + *w++ = 'e'; + return w - d; + } + case vt_dictionary: + { + *w++ = 'd'; + for (t_map::const_iterator i = m_map->begin(); i != m_map->end(); i++) + { +#ifdef WIN32 + sprintf(w, "%d:", i->first.size()); +#else + sprintf(w, "%zu:", i->first.size()); +#endif + w += n(i->first.size()).size() + 1; + memcpy(w, i->first.data(), i->first.size()); + w += i->first.size(); + w += i->second.read(w); + } + *w++ = 'e'; + return w - d; + } + } + assert(false); + return 0; +} diff --git a/install/xbt/linux/misc/bvalue.h b/install/xbt/linux/misc/bvalue.h new file mode 100644 index 000000000..5a031617c --- /dev/null +++ b/install/xbt/linux/misc/bvalue.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include + +class Cbvalue +{ +public: + enum t_value_type + { + vt_int, + vt_string, + vt_list, + vt_dictionary, + }; + + typedef std::map t_map; + typedef std::vector t_list; + + void clear(); + const t_map& d() const; + const t_list& l() const; + long long i() const; + const std::string& s() const; + bool d_has(const std::string&) const; + Cbvalue& d(const std::string& v, const Cbvalue& w); + Cbvalue& l(const Cbvalue& v); + int pre_read() const; + int read(char* d) const; + int read(void* d) const; + Cvirtual_binary read() const; + int write(const char* s, int cb_s); + int write(const_memory_range); + Cbvalue(long long v = 0); + Cbvalue(t_value_type t); + Cbvalue(const std::string& v); + Cbvalue(const Cbvalue&); + Cbvalue(const_memory_range); + const Cbvalue& operator=(const Cbvalue&); + const Cbvalue& operator[](const std::string&) const; + ~Cbvalue(); +private: + const Cbvalue& d(const std::string&) const; + + t_value_type m_value_type; + + union + { + long long m_int; + std::string* m_string; + t_list* m_list; + t_map* m_map; + }; + + int write(const char*& s, const char* s_end); +}; diff --git a/install/xbt/linux/misc/config_base.h b/install/xbt/linux/misc/config_base.h new file mode 100644 index 000000000..18a8bd63b --- /dev/null +++ b/install/xbt/linux/misc/config_base.h @@ -0,0 +1,108 @@ +#pragma once + +#include +#include +#include +#include +#include + +class Cconfig_base +{ +public: + template + struct t_attribute + { + const char* key; + T* value; + T default_value; + }; + + template + class t_attributes: public std::map > + { + }; + + virtual int set(const std::string& name, const std::string& value) + { + t_attributes::iterator i = m_attributes_string.find(name); + if (i != m_attributes_string.end()) + *i->second.value = value; + else + return set(name, atoi(value.c_str())); + return 0; + } + + virtual int set(const std::string& name, int value) + { + t_attributes::iterator i = m_attributes_int.find(name); + if (i != m_attributes_int.end()) + *i->second.value = value; + else + return set(name, static_cast(value)); + return 0; + } + + virtual int set(const std::string& name, bool value) + { + t_attributes::iterator i = m_attributes_bool.find(name); + if (i != m_attributes_bool.end()) + *i->second.value = value; + else + return 1; + return 0; + } + + std::istream& load(std::istream& is) + { + for (std::string s; getline(is, s); ) + { + size_t i = s.find('='); + if (i != std::string::npos) + set(boost::trim_copy(s.substr(0, i)), boost::trim_copy(s.substr(i + 1))); + } + return is; + } + + int load(const std::string& file) + { + std::ifstream is(file.c_str()); + if (!is) + return 1; + load(is); + return !is.eof(); + } + + std::ostream& save(std::ostream& os) const + { + save_map(os, m_attributes_bool); + save_map(os, m_attributes_int); + save_map(os, m_attributes_string); + return os; + } + +protected: + t_attributes m_attributes_bool; + t_attributes m_attributes_int; + t_attributes m_attributes_string; + + template + void fill_map(t_attribute* attributes, const t_attributes* s, t_attributes& d) + { + for (t_attribute* i = attributes; i->key; i++) + { + *i->value = s ? *s->find(i->key)->second.value : i->default_value; + d[i->key] = *i; + } + } + + template + void save_map(std::ostream& os, const T& v) const + { + for (typename T::const_iterator i = v.begin(); i != v.end(); i++) + { + if (*i->second.value == i->second.default_value) + os << "# "; + os << i->first << " = " << *i->second.value << std::endl; + } + } +}; diff --git a/install/xbt/linux/misc/const_memory_range.h b/install/xbt/linux/misc/const_memory_range.h new file mode 100644 index 000000000..70fa7abf2 --- /dev/null +++ b/install/xbt/linux/misc/const_memory_range.h @@ -0,0 +1,252 @@ +#pragma once + +#include +#include +#include + +template +class memory_range_base +{ +public: + memory_range_base() + { + begin = NULL; + end = NULL; + } + + template + memory_range_base(const memory_range_base& v) + { + assign(v.begin, v.end); + } + + memory_range_base(void* begin_, void* end_) + { + assign(begin_, end_); + } + + memory_range_base(void* begin_, size_t size) + { + assign(begin_, size); + } + + template + memory_range_base(boost::array& v) + { + assign(&v.front(), v.size()); + } + + template + memory_range_base(boost::array& v) + { + assign(&v.front(), v.size()); + } + + memory_range_base(std::vector& v) + { + assign(&v.front(), v.size()); + } + + memory_range_base(std::vector& v) + { + assign(&v.front(), v.size()); + } + + memory_range_base assign(void* begin_, void* end_) + { + begin = reinterpret_cast(begin_); + end = reinterpret_cast(end_); + return *this; + } + + memory_range_base assign(void* begin_, size_t size) + { + begin = reinterpret_cast(begin_); + end = begin + size; + return *this; + } + + void clear() + { + begin = end = NULL; + } + + bool empty() const + { + return begin == end; + } + + size_t size() const + { + return end - begin; + } + + std::string string() const + { + return std::string(reinterpret_cast(begin), size()); + } + + memory_range_base sub_range(size_t o, size_t s) + { + return memory_range_base(begin + o, s); + } + + operator T() const + { + return begin; + } + + memory_range_base operator++(int) + { + memory_range_base t = *this; + begin++; + return t; + } + + memory_range_base operator+=(size_t v) + { + begin += v; + return *this; + } + + T begin; + T end; +}; + +typedef memory_range_base memory_range; + +template +class const_memory_range_base +{ +public: + const_memory_range_base() + { + begin = NULL; + end = NULL; + } + + template + const_memory_range_base(const const_memory_range_base& v) + { + assign(v.begin, v.end); + } + + template + const_memory_range_base(const memory_range_base& v) + { + assign(v.begin, v.end); + } + + const_memory_range_base(const void* begin_, const void* end_) + { + assign(begin_, end_); + } + + const_memory_range_base(const void* begin_, size_t size) + { + assign(begin_, size); + } + + const_memory_range_base(const std::string& v) + { + assign(v.data(), v.size()); + } + + template + const_memory_range_base(const boost::array& v) + { + assign(&v.front(), v.size()); + } + + template + const_memory_range_base(const boost::array& v) + { + assign(&v.front(), v.size()); + } + + const_memory_range_base(const std::vector& v) + { + assign(&v.front(), v.size()); + } + + const_memory_range_base(const std::vector& v) + { + assign(&v.front(), v.size()); + } + + const_memory_range_base assign(const void* begin_, const void* end_) + { + begin = reinterpret_cast(begin_); + end = reinterpret_cast(end_); + return *this; + } + + const_memory_range_base assign(const void* begin_, size_t size) + { + begin = reinterpret_cast(begin_); + end = begin + size; + return *this; + } + + void clear() + { + begin = end = NULL; + } + + bool empty() const + { + return begin == end; + } + + template + const_memory_range_base find(U v) const + { + const_memory_range_base t = *this; + while (!t.empty() && *t != v) + t++; + return t; + } + + long long i() const + { + return atoll(reinterpret_cast(begin)); + } + + size_t size() const + { + return end - begin; + } + + std::string string() const + { + return std::string(reinterpret_cast(begin), size()); + } + + const_memory_range_base sub_range(size_t o, size_t s) + { + return const_memory_range_base(begin + o, s); + } + + operator T() const + { + return begin; + } + + const_memory_range_base operator++(int) + { + const_memory_range_base t = *this; + begin++; + return t; + } + + const_memory_range_base operator+=(size_t v) + { + begin += v; + return *this; + } + + T begin; + T end; +}; + +typedef const_memory_range_base const_memory_range; diff --git a/install/xbt/linux/misc/find_ptr.h b/install/xbt/linux/misc/find_ptr.h new file mode 100644 index 000000000..231a447d1 --- /dev/null +++ b/install/xbt/linux/misc/find_ptr.h @@ -0,0 +1,15 @@ +#pragma once + +template +typename T::mapped_type* find_ptr(T& c, U v) +{ + typename T::iterator i = c.find(v); + return i == c.end() ? NULL : &i->second; +} + +template +const typename T::mapped_type* find_ptr(const T& c, U v) +{ + typename T::const_iterator i = c.find(v); + return i == c.end() ? NULL : &i->second; +} diff --git a/install/xbt/linux/misc/sha1.cpp b/install/xbt/linux/misc/sha1.cpp new file mode 100644 index 000000000..ff90e66b8 --- /dev/null +++ b/install/xbt/linux/misc/sha1.cpp @@ -0,0 +1,419 @@ +/* + * sha1.c + * + * Description: + * This file implements the Secure Hashing Algorithm 1 as + * defined in FIPS PUB 180-1 published April 17, 1995. + * + * The SHA-1, produces a 160-bit message digest for a given + * data stream. It should take about 2**n steps to find a + * message with the same digest as a given message and + * 2**(n/2) to find any two messages with the same digest, + * when n is the digest size in bits. Therefore, this + * algorithm can serve as a means of providing a + * "fingerprint" for a message. + * + * Portability Issues: + * SHA-1 is defined in terms of 32-bit "words". This code + * uses (included via "sha1.h" to define 32 and 8 + * bit unsigned integer types. If your C compiler does not + * support 32 bit unsigned integers, this code is not + * appropriate. + * + * Caveats: + * SHA-1 is designed to work with messages less than 2^64 bits + * long. Although SHA-1 allows a message digest to be generated + * for messages of any number of bits less than 2^64, this + * implementation only works with messages with a length that is + * a multiple of the size of an 8-bit character. + * + */ + +#include "stdafx.h" +#include "sha1.h" + +/* + * Define the SHA1 circular left shift macro + */ +#define SHA1CircularShift(bits,word) \ + (((word) << (bits)) | ((word) >> (32-(bits)))) + +/* Local Function Prototyptes */ +void SHA1PadMessage(SHA1Context *); +void SHA1ProcessMessageBlock(SHA1Context *); + +/* + * SHA1Reset + * + * Description: + * This function will initialize the SHA1Context in preparation + * for computing a new SHA1 message digest. + * + * Parameters: + * context: [in/out] + * The context to reset. + * + * Returns: + * sha Error Code. + * + */ +int SHA1Reset(SHA1Context *context) +{ + if (!context) + { + return shaNull; + } + + context->Length_Low = 0; + context->Length_High = 0; + context->Message_Block_Index = 0; + + context->Intermediate_Hash[0] = 0x67452301; + context->Intermediate_Hash[1] = 0xEFCDAB89; + context->Intermediate_Hash[2] = 0x98BADCFE; + context->Intermediate_Hash[3] = 0x10325476; + context->Intermediate_Hash[4] = 0xC3D2E1F0; + + context->Computed = 0; + context->Corrupted = 0; + + return shaSuccess; +} + +/* + * SHA1Result + * + * Description: + * This function will return the 160-bit message digest into the + * Message_Digest array provided by the caller. + * NOTE: The first octet of hash is stored in the 0th element, + * the last octet of hash in the 19th element. + * + * Parameters: + * context: [in/out] + * The context to use to calculate the SHA-1 hash. + * Message_Digest: [out] + * Where the digest is returned. + * + * Returns: + * sha Error Code. + * + */ +int SHA1Result( SHA1Context *context, + uint8_t Message_Digest[SHA1HashSize]) +{ + int i; + + if (!context || !Message_Digest) + { + return shaNull; + } + + if (context->Corrupted) + { + return context->Corrupted; + } + + if (!context->Computed) + { + SHA1PadMessage(context); + for(i=0; i<64; ++i) + { + /* message may be sensitive, clear it out */ + context->Message_Block[i] = 0; + } + context->Length_Low = 0; /* and clear length */ + context->Length_High = 0; + context->Computed = 1; + + } + + for(i = 0; i < SHA1HashSize; ++i) + { + Message_Digest[i] = context->Intermediate_Hash[i>>2] + >> 8 * ( 3 - ( i & 0x03 ) ); + } + + return shaSuccess; +} + +/* + * SHA1Input + * + * Description: + * This function accepts an array of octets as the next portion + * of the message. + * + * Parameters: + * context: [in/out] + * The SHA context to update + * message_array: [in] + * An array of characters representing the next portion of + * the message. + * length: [in] + * The length of the message in message_array + * + * Returns: + * sha Error Code. + * + */ +int SHA1Input( SHA1Context *context, + const void *message_array0, + size_t length) +{ + const uint8_t *message_array = reinterpret_cast(message_array0); + if (!length) + { + return shaSuccess; + } + + if (!context || !message_array) + { + return shaNull; + } + + if (context->Computed) + { + context->Corrupted = shaStateError; + + return shaStateError; + } + + if (context->Corrupted) + { + return context->Corrupted; + } + while(length-- && !context->Corrupted) + { + context->Message_Block[context->Message_Block_Index++] = + (*message_array & 0xFF); + + context->Length_Low += 8; + if (context->Length_Low == 0) + { + context->Length_High++; + if (context->Length_High == 0) + { + /* Message is too long */ + context->Corrupted = 1; + } + } + + if (context->Message_Block_Index == 64) + { + SHA1ProcessMessageBlock(context); + } + + message_array++; + } + + return shaSuccess; +} + +/* + * SHA1ProcessMessageBlock + * + * Description: + * This function will process the next 512 bits of the message + * stored in the Message_Block array. + * + * Parameters: + * None. + * + * Returns: + * Nothing. + * + * Comments: + + * Many of the variable names in this code, especially the + * single character names, were used because those were the + * names used in the publication. + * + * + */ +void SHA1ProcessMessageBlock(SHA1Context *context) +{ + const uint32_t K[] = { /* Constants defined in SHA-1 */ + 0x5A827999, + 0x6ED9EBA1, + 0x8F1BBCDC, + 0xCA62C1D6 + }; + int t; /* Loop counter */ + uint32_t temp; /* Temporary word value */ + uint32_t W[80]; /* Word sequence */ + uint32_t A, B, C, D, E; /* Word buffers */ + + /* + * Initialize the first 16 words in the array W + */ + for(t = 0; t < 16; t++) + { + W[t] = context->Message_Block[t * 4] << 24; + W[t] |= context->Message_Block[t * 4 + 1] << 16; + W[t] |= context->Message_Block[t * 4 + 2] << 8; + W[t] |= context->Message_Block[t * 4 + 3]; + } + + for(t = 16; t < 80; t++) + { + W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); + } + + A = context->Intermediate_Hash[0]; + B = context->Intermediate_Hash[1]; + C = context->Intermediate_Hash[2]; + D = context->Intermediate_Hash[3]; + E = context->Intermediate_Hash[4]; + + for(t = 0; t < 20; t++) + { + temp = SHA1CircularShift(5,A) + + ((B & C) | ((~B) & D)) + E + W[t] + K[0]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + + B = A; + A = temp; + } + + for(t = 20; t < 40; t++) + { + temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for(t = 40; t < 60; t++) + { + temp = SHA1CircularShift(5,A) + + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for(t = 60; t < 80; t++) + { + temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + context->Intermediate_Hash[0] += A; + context->Intermediate_Hash[1] += B; + context->Intermediate_Hash[2] += C; + context->Intermediate_Hash[3] += D; + context->Intermediate_Hash[4] += E; + + context->Message_Block_Index = 0; +} + +/* + * SHA1PadMessage + * + + * Description: + * According to the standard, the message must be padded to an even + * 512 bits. The first padding bit must be a '1'. The last 64 + * bits represent the length of the original message. All bits in + * between should be 0. This function will pad the message + * according to those rules by filling the Message_Block array + * accordingly. It will also call the ProcessMessageBlock function + * provided appropriately. When it returns, it can be assumed that + * the message digest has been computed. + * + * Parameters: + * context: [in/out] + * The context to pad + * ProcessMessageBlock: [in] + * The appropriate SHA*ProcessMessageBlock function + * Returns: + * Nothing. + * + */ + +void SHA1PadMessage(SHA1Context *context) +{ + /* + * Check to see if the current message block is too small to hold + * the initial padding bits and length. If so, we will pad the + * block, process it, and then continue padding into a second + * block. + */ + if (context->Message_Block_Index > 55) + { + context->Message_Block[context->Message_Block_Index++] = 0x80; + while(context->Message_Block_Index < 64) + { + context->Message_Block[context->Message_Block_Index++] = 0; + } + + SHA1ProcessMessageBlock(context); + + while(context->Message_Block_Index < 56) + { + context->Message_Block[context->Message_Block_Index++] = 0; + } + } + else + { + context->Message_Block[context->Message_Block_Index++] = 0x80; + while(context->Message_Block_Index < 56) + { + + context->Message_Block[context->Message_Block_Index++] = 0; + } + } + + /* + * Store the message length as the last 8 octets + */ + context->Message_Block[56] = context->Length_High >> 24; + context->Message_Block[57] = context->Length_High >> 16; + context->Message_Block[58] = context->Length_High >> 8; + context->Message_Block[59] = context->Length_High; + context->Message_Block[60] = context->Length_Low >> 24; + context->Message_Block[61] = context->Length_Low >> 16; + context->Message_Block[62] = context->Length_Low >> 8; + context->Message_Block[63] = context->Length_Low; + + SHA1ProcessMessageBlock(context); +} + +Csha1::Csha1() +{ + SHA1Reset(&m_context); +} + +Csha1::Csha1(const_memory_range s) +{ + SHA1Reset(&m_context); + write(s); +} + +void Csha1::read(void* d) +{ + SHA1Result(&m_context, reinterpret_cast(d)); +} + +std::string Csha1::read() +{ + char d[SHA1HashSize]; + read(d); + return std::string(d, SHA1HashSize); +} + +void Csha1::write(const_memory_range s) +{ + SHA1Input(&m_context, s, s.size()); +} diff --git a/install/xbt/linux/misc/sha1.h b/install/xbt/linux/misc/sha1.h new file mode 100644 index 000000000..e26a11191 --- /dev/null +++ b/install/xbt/linux/misc/sha1.h @@ -0,0 +1,94 @@ +/* + * sha1.h + * + * Description: + * This is the header file for code which implements the Secure + * Hashing Algorithm 1 as defined in FIPS PUB 180-1 published + * April 17, 1995. + * + * Many of the variable names in this code, especially the + * single character names, were used because those were the names + * used in the publication. + * + * Please read the file sha1.c for more information. + * + */ + +#ifndef _SHA1_H_ +#define _SHA1_H_ + +#include +#include + +#ifdef WIN32 +typedef unsigned int uint32_t; +typedef int int_least16_t; +typedef unsigned char uint8_t; +#endif + +/* + * If you do not have the ISO standard stdint.h header file, then you + * must typdef the following: + * name meaning + * uint32_t unsigned 32 bit integer + * uint8_t unsigned 8 bit integer (i.e., unsigned char) + * int_least16_t integer of >= 16 bits + * + */ + +#ifndef _SHA_enum_ +#define _SHA_enum_ +enum +{ + shaSuccess = 0, + shaNull, /* Null pointer parameter */ + shaInputTooLong, /* input data too long */ + shaStateError /* called Input after Result */ +}; +#endif +#define SHA1HashSize 20 + +/* + * This structure will hold context information for the SHA-1 + * hashing operation + */ +typedef struct SHA1Context +{ + uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */ + + uint32_t Length_Low; /* Message length in bits */ + uint32_t Length_High; /* Message length in bits */ + + /* Index into message block array */ + int_least16_t Message_Block_Index; + uint8_t Message_Block[64]; /* 512-bit message blocks */ + + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corrupted? */ +} SHA1Context; + +/* + * Function Prototypes + */ + +int SHA1Reset( SHA1Context *); +int SHA1Input( SHA1Context *, + const void *, + size_t); +int SHA1Result( SHA1Context *, + uint8_t Message_Digest[SHA1HashSize]); + +class Csha1 +{ +public: + void read(void*); + std::string read(); + void write(const_memory_range); + Csha1(); + Csha1(const_memory_range); +private: + SHA1Context m_context; +}; + +#endif + diff --git a/install/xbt/linux/misc/socket.cpp b/install/xbt/linux/misc/socket.cpp new file mode 100644 index 000000000..20e1f2c30 --- /dev/null +++ b/install/xbt/linux/misc/socket.cpp @@ -0,0 +1,223 @@ +#include "stdafx.h" +#include "socket.h" + +#ifdef WIN32 +#pragma comment(lib, "ws2_32.lib") +#else +#include +#include +#include +#include +#include +#endif + +#ifndef INADDR_NONE +const int INADDR_NONE = -1; +#endif + +#ifndef MSG_NOSIGNAL +const int MSG_NOSIGNAL = 0; +#endif + +static bool g_start_up_done = false; + +Csocket::Csocket(SOCKET s) +{ + m_source = s == INVALID_SOCKET ? NULL : new Csocket_source(s); +} + +int Csocket::accept(int& h, int& p) +{ + sockaddr_in a; + socklen_t cb_a = sizeof(sockaddr_in); + a.sin_family = AF_INET; + int r = ::accept(*this, reinterpret_cast(&a), &cb_a); + if (r == INVALID_SOCKET) + return r; + h = a.sin_addr.s_addr; + p = a.sin_port; + return 0; +} + +int Csocket::bind(int h, int p) +{ + sockaddr_in a = {0}; + a.sin_family = AF_INET; + a.sin_addr.s_addr = h; + a.sin_port = p; + return ::bind(*this, reinterpret_cast(&a), sizeof(sockaddr_in)); +} + +int Csocket::blocking(bool v) +{ +#ifdef FIONBIO + unsigned long p = !v; + return ioctlsocket(*this, FIONBIO, &p); +#else + return fcntl(*this, F_SETFL, v ? 0 : O_NONBLOCK) == -1; +#endif +} + +void Csocket::close() +{ + *this = INVALID_SOCKET; +} + +int Csocket::connect(int h, int p) +{ + sockaddr_in a = {0}; + a.sin_family = AF_INET; + a.sin_addr.s_addr = h; + a.sin_port = p; + return ::connect(*this, reinterpret_cast(&a), sizeof(sockaddr_in)); +} + +int Csocket::listen() +{ + return ::listen(*this, SOMAXCONN); +} + +const Csocket& Csocket::open(int t, bool _blocking) +{ + start_up(); + *this = socket(AF_INET, t, 0); + if (*this != INVALID_SOCKET && !_blocking && blocking(false)) + close(); + return *this; +} + +int Csocket::recv(memory_range d) const +{ + return ::recv(*this, reinterpret_cast(d.begin), d.size(), MSG_NOSIGNAL); +} + +int Csocket::recvfrom(memory_range d, sockaddr* a, socklen_t* cb_a) const +{ + return ::recvfrom(*this, reinterpret_cast(d.begin), d.size(), MSG_NOSIGNAL, a, cb_a); +} + +int Csocket::send(const_memory_range s) const +{ + return ::send(*this, reinterpret_cast(s.begin), s.size(), MSG_NOSIGNAL); +} + +int Csocket::sendto(const_memory_range s, const sockaddr* a, socklen_t cb_a) const +{ + return ::sendto(*this, reinterpret_cast(s.begin), s.size(), MSG_NOSIGNAL, a, cb_a); +} + +int Csocket::getsockopt(int level, int name, void* v, socklen_t& cb_v) +{ + return ::getsockopt(*this, level, name, reinterpret_cast(v), &cb_v); +} + +int Csocket::getsockopt(int level, int name, int& v) +{ + socklen_t cb_v = sizeof(int); + return getsockopt(level, name, &v, cb_v); +} + +int Csocket::setsockopt(int level, int name, const void* v, int cb_v) +{ + return ::setsockopt(*this, level, name, reinterpret_cast(v), cb_v); +} + +int Csocket::setsockopt(int level, int name, int v) +{ + return setsockopt(level, name, &v, sizeof(int)); +} + +int Csocket::get_host(const std::string& name) +{ + hostent* e = gethostbyname(name.c_str()); + return e && e->h_addrtype == AF_INET && e->h_length == sizeof(in_addr) && e->h_addr_list ? *reinterpret_cast(*e->h_addr_list) : INADDR_NONE; +} + +std::string Csocket::error2a(int v) +{ + switch (v) + { + case WSAEACCES: return "EACCES"; + case WSAEADDRINUSE: return "EADDRINUSE"; + case WSAEADDRNOTAVAIL: return "EADDRNOTAVAIL"; + case WSAEAFNOSUPPORT: return "EAFNOSUPPORT"; + case WSAEALREADY: return "EALREADY"; + case WSAEBADF: return "EBADF"; + case WSAECONNABORTED: return "ECONNABORTED"; + case WSAECONNREFUSED: return "ECONNREFUSED"; + case WSAECONNRESET: return "ECONNRESET"; + case WSAEDESTADDRREQ: return "EDESTADDRREQ"; + case WSAEDQUOT: return "EDQUOT"; + case WSAEFAULT: return "EFAULT"; + case WSAEHOSTDOWN: return "EHOSTDOWN"; + case WSAEHOSTUNREACH: return "EHOSTUNREACH"; + case WSAEINPROGRESS: return "EINPROGRESS"; + case WSAEINTR: return "EINTR"; + case WSAEINVAL: return "EINVAL"; + case WSAEISCONN: return "EISCONN"; + case WSAELOOP: return "ELOOP"; + case WSAEMFILE: return "EMFILE"; + case WSAEMSGSIZE: return "EMSGSIZE"; + case WSAENAMETOOLONG: return "ENAMETOOLONG"; + case WSAENETDOWN: return "ENETDOWN"; + case WSAENETRESET: return "ENETRESET"; + case WSAENETUNREACH: return "ENETUNREACH"; + case WSAENOBUFS: return "ENOBUFS"; + case WSAENOPROTOOPT: return "ENOPROTOOPT"; + case WSAENOTCONN: return "ENOTCONN"; + case WSAENOTEMPTY: return "ENOTEMPTY"; + case WSAENOTSOCK: return "ENOTSOCK"; + case WSAEOPNOTSUPP: return "EOPNOTSUPP"; + case WSAEPFNOSUPPORT: return "EPFNOSUPPORT"; + case WSAEPROTONOSUPPORT: return "EPROTONOSUPPORT"; + case WSAEPROTOTYPE: return "EPROTOTYPE"; + case WSAEREMOTE: return "EREMOTE"; + case WSAESHUTDOWN: return "ESHUTDOWN"; + case WSAESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT"; + case WSAESTALE: return "ESTALE"; + case WSAETIMEDOUT: return "ETIMEDOUT"; + case WSAETOOMANYREFS: return "ETOOMANYREFS"; + case WSAEUSERS: return "EUSERS"; + case WSAEWOULDBLOCK: return "EWOULDBLOCK"; +#ifdef WIN32 + case WSAECANCELLED: return "ECANCELLED"; + case WSAEDISCON: return "EDISCON"; + case WSAEINVALIDPROCTABLE: return "EINVALIDPROCTABLE"; + case WSAEINVALIDPROVIDER: return "EINVALIDPROVIDER"; + case WSAENOMORE: return "ENOMORE"; + case WSAEPROVIDERFAILEDINIT: return "EPROVIDERFAILEDINIT"; + case WSAEREFUSED: return "EREFUSED"; + case WSANOTINITIALISED: return "NOTINITIALISED"; + case WSASERVICE_NOT_FOUND: return "SERVICE_NOT_FOUND"; + case WSASYSCALLFAILURE: return "SYSCALLFAILURE"; + case WSASYSNOTREADY: return "SYSNOTREADY"; + case WSATYPE_NOT_FOUND: return "TYPE_NOT_FOUND"; + case WSAVERNOTSUPPORTED: return "VERNOTSUPPORTED"; + case WSA_E_CANCELLED: return "E_CANCELLED"; + case WSA_E_NO_MORE: return "E_NO_MORE"; +#endif + } + char b[12]; + sprintf(b, "%d", v); + return b; +} + +std::string Csocket::inet_ntoa(int v) +{ + in_addr a; + a.s_addr = v; + return ::inet_ntoa(a); +} + +int Csocket::start_up() +{ + if (g_start_up_done) + return 0; + g_start_up_done = true; +#ifdef WIN32 + WSADATA wsadata; + if (WSAStartup(MAKEWORD(2, 0), &wsadata)) + return 1; +#endif + return 0; +} diff --git a/install/xbt/linux/misc/socket.h b/install/xbt/linux/misc/socket.h new file mode 100644 index 000000000..2273bdbd0 --- /dev/null +++ b/install/xbt/linux/misc/socket.h @@ -0,0 +1,135 @@ +#pragma once + +#include +#include +#include +#include + +#ifdef WIN32 +#include + +typedef int socklen_t; +#else +#include +#include +#include + +#define closesocket close +#define ioctlsocket ioctl +#define WSAGetLastError() errno + +#define WSAEACCES EACCES +#define WSAEADDRINUSE EADDRINUSE +#define WSAEADDRNOTAVAIL EADDRNOTAVAIL +#define WSAEAFNOSUPPORT EAFNOSUPPORT +#define WSAEALREADY EALREADY +#define WSAEBADF EBADF +#define WSAECONNABORTED ECONNABORTED +#define WSAECONNREFUSED ECONNREFUSED +#define WSAECONNRESET ECONNRESET +#define WSAEDESTADDRREQ EDESTADDRREQ +#define WSAEDQUOT EDQUOT +#define WSAEFAULT EFAULT +#define WSAEHOSTDOWN EHOSTDOWN +#define WSAEHOSTUNREACH EHOSTUNREACH +#define WSAEINPROGRESS EINPROGRESS +#define WSAEINTR EINTR +#define WSAEINVAL EINVAL +#define WSAEISCONN EISCONN +#define WSAELOOP ELOOP +#define WSAEMFILE EMFILE +#define WSAEMSGSIZE EMSGSIZE +#define WSAENAMETOOLONG ENAMETOOLONG +#define WSAENETDOWN ENETDOWN +#define WSAENETRESET ENETRESET +#define WSAENETUNREACH ENETUNREACH +#define WSAENOBUFS ENOBUFS +#define WSAENOPROTOOPT ENOPROTOOPT +#define WSAENOTCONN ENOTCONN +#define WSAENOTEMPTY ENOTEMPTY +#define WSAENOTSOCK ENOTSOCK +#define WSAEOPNOTSUPP EOPNOTSUPP +#define WSAEPFNOSUPPORT EPFNOSUPPORT +#define WSAEPROTONOSUPPORT EPROTONOSUPPORT +#define WSAEPROTOTYPE EPROTOTYPE +#define WSAEREMOTE EREMOTE +#define WSAESHUTDOWN ESHUTDOWN +#define WSAESOCKTNOSUPPORT ESOCKTNOSUPPORT +#define WSAESTALE ESTALE +#define WSAETIMEDOUT ETIMEDOUT +#define WSAETOOMANYREFS ETOOMANYREFS +#define WSAEUSERS EUSERS +#define WSAEWOULDBLOCK EWOULDBLOCK + +typedef int SOCKET; + +const int INVALID_SOCKET = -1; +const int SOCKET_ERROR = -1; +#endif + +class Csocket_source: boost::noncopyable +{ +public: + Csocket_source(SOCKET s) + { + m_s = s; + mc_references = 0; + } + + ~Csocket_source() + { + closesocket(m_s); + } + + operator SOCKET() const + { + return m_s; + } + + friend void intrusive_ptr_add_ref(Csocket_source* v) + { + v->mc_references++; + } + + friend void intrusive_ptr_release(Csocket_source* v) + { + v->mc_references--; + if (!v->mc_references) + delete v; + } +private: + SOCKET m_s; + int mc_references; +}; + +class Csocket +{ +public: + static std::string error2a(int v); + static int get_host(const std::string& name); + static std::string inet_ntoa(int h); + static int start_up(); + int accept(int& h, int& p); + int bind(int h, int p); + int blocking(bool v); + void close(); + int connect(int h, int p); + int getsockopt(int level, int name, void* v, socklen_t& cb_v); + int getsockopt(int level, int name, int& v); + int listen(); + const Csocket& open(int t, bool blocking = false); + int recv(memory_range) const; + int recvfrom(memory_range, sockaddr* a, socklen_t* cb_a) const; + int send(const_memory_range) const; + int sendto(const_memory_range, const sockaddr* a, socklen_t cb_a) const; + int setsockopt(int level, int name, const void* v, int cb_v); + int setsockopt(int level, int name, int v); + Csocket(SOCKET = INVALID_SOCKET); + + operator SOCKET() const + { + return m_source ? static_cast(*m_source) : INVALID_SOCKET; + } +private: + boost::intrusive_ptr m_source; +}; diff --git a/install/xbt/linux/misc/sql/database.cpp b/install/xbt/linux/misc/sql/database.cpp new file mode 100644 index 000000000..67d739f56 --- /dev/null +++ b/install/xbt/linux/misc/sql/database.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "database.h" + +#include +#include +#include + +#ifdef WIN32 +#pragma comment(lib, "libmysql") +#else +#include +#endif + +Cdatabase::Cdatabase() +{ + mysql_init(&m_handle); +} + +Cdatabase::~Cdatabase() +{ + close(); +} + +void Cdatabase::open(const std::string& host, const std::string& user, const std::string& password, const std::string& database, bool echo_errors) +{ + m_echo_errors = echo_errors; + if (!mysql_init(&m_handle) || mysql_options(&m_handle, MYSQL_READ_DEFAULT_GROUP, "") || !mysql_real_connect(&m_handle, host.c_str(), user.c_str(), password.empty() ? NULL : password.c_str(), database.c_str(), 0, NULL, 0)) + throw exception(mysql_error(&m_handle)); + char a0 = true; + mysql_options(&m_handle, MYSQL_OPT_RECONNECT, &a0); +} + +Csql_result Cdatabase::query(const std::string& q) +{ + if (!m_query_log.empty()) + { + static std::ofstream f(m_query_log.c_str()); + f << q.substr(0, 239) << std::endl; + } + if (mysql_real_query(&m_handle, q.data(), q.size())) + { + if (m_echo_errors) + { + std::cerr << mysql_error(&m_handle) << std::endl + << q.substr(0, 239) << std::endl; + } +#ifndef WIN32 + syslog(LOG_ERR, "%s", mysql_error(&m_handle)); +#endif + throw exception(mysql_error(&m_handle)); + } + MYSQL_RES* result = mysql_store_result(&m_handle); + if (!result && mysql_errno(&m_handle)) + throw exception(mysql_error(&m_handle)); + return Csql_result(result); +} + +void Cdatabase::close() +{ + mysql_close(&m_handle); +} + +int Cdatabase::insert_id() +{ + return mysql_insert_id(&m_handle); +} + +void Cdatabase::set_query_log(const std::string& v) +{ + m_query_log = v; +} diff --git a/install/xbt/linux/misc/sql/database.h b/install/xbt/linux/misc/sql/database.h new file mode 100644 index 000000000..325908689 --- /dev/null +++ b/install/xbt/linux/misc/sql/database.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include "sql_result.h" + +class Cdatabase: boost::noncopyable +{ +public: + class exception: public std::runtime_error + { + public: + exception(const std::string& s): runtime_error(s) + { + } + }; + + void open(const std::string& host, const std::string& user, const std::string& password, const std::string& database, bool echo_errors = false); + Csql_result query(const std::string&); + void set_query_log(const std::string&); + int insert_id(); + void close(); + Cdatabase(); + ~Cdatabase(); + + MYSQL* handle() + { + return &m_handle; + } +private: + bool m_echo_errors; + MYSQL m_handle; + std::string m_query_log; +}; diff --git a/install/xbt/linux/misc/sql/sql_query.cpp b/install/xbt/linux/misc/sql/sql_query.cpp new file mode 100644 index 000000000..ebd8e6aee --- /dev/null +++ b/install/xbt/linux/misc/sql/sql_query.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "sql_query.h" + +#include +#include +#include "database.h" + +Csql_query::Csql_query(Cdatabase& database, const std::string& v): + m_database(database) +{ + m_in = v; +} + +Csql_result Csql_query::execute() const +{ + return m_database.query(read()); +} + +std::string Csql_query::read() const +{ + return m_out + m_in; +} + +void Csql_query::operator=(const std::string& v) +{ + m_in = v; + m_out.clear(); +} + +void Csql_query::operator+=(const std::string& v) +{ + m_in += v; +} + +Csql_query& Csql_query::p_name(const std::string& v) +{ + std::vector r(2 * v.size() + 2); + r.resize(mysql_real_escape_string(m_database.handle(), &r.front() + 1, v.data(), v.size()) + 2); + r.front() = '`'; + r.back() = '`'; + p_raw(r); + return *this; +} + +Csql_query& Csql_query::p_raw(const_memory_range v) +{ + size_t i = m_in.find('?'); + m_out.append(m_in.data(), i); + if (i == std::string::npos) + m_in.clear(); + else + m_in.erase(0, i + 1); + m_out.append(v.begin, v.end); + return *this; +} + +Csql_query& Csql_query::p(long long v) +{ + char b[21]; +#ifdef WIN32 + sprintf(b, "%I64d", v); +#else + sprintf(b, "%lld", v); +#endif + p_raw(const_memory_range(b)); + return *this; +} + +Csql_query& Csql_query::p(const_memory_range v) +{ + std::vector r(2 * v.size() + 2); + r.resize(mysql_real_escape_string(m_database.handle(), &r.front() + 1, reinterpret_cast(v.begin), v.size()) + 2); + r.front() = '\''; + r.back() = '\''; + p_raw(r); + return *this; +} diff --git a/install/xbt/linux/misc/sql/sql_query.h b/install/xbt/linux/misc/sql/sql_query.h new file mode 100644 index 000000000..0f691e384 --- /dev/null +++ b/install/xbt/linux/misc/sql/sql_query.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +class Cdatabase; +class Csql_result; + +class Csql_query +{ +public: + Csql_result execute() const; + std::string read() const; + void operator=(const std::string&); + void operator+=(const std::string&); + Csql_query& p_name(const std::string&); + Csql_query& p_raw(const_memory_range); + Csql_query& p(long long); + Csql_query& p(const_memory_range); + Csql_query(Cdatabase&, const std::string& = ""); +private: + std::string m_in; + std::string m_out; + Cdatabase& m_database; +}; diff --git a/install/xbt/linux/misc/sql/sql_result.cpp b/install/xbt/linux/misc/sql/sql_result.cpp new file mode 100644 index 000000000..82a557f83 --- /dev/null +++ b/install/xbt/linux/misc/sql/sql_result.cpp @@ -0,0 +1,15 @@ +#include "stdafx.h" +#include "sql_result.h" + +Csql_row::Csql_row(MYSQL_ROW data, unsigned long* sizes, const boost::shared_ptr& source) +{ + m_data = data; + m_sizes = sizes; + m_source = source; +} + +Csql_row Csql_result::fetch_row() const +{ + MYSQL_ROW data = mysql_fetch_row(h()); + return Csql_row(data, mysql_fetch_lengths(h()), m_source); +} diff --git a/install/xbt/linux/misc/sql/sql_result.h b/install/xbt/linux/misc/sql/sql_result.h new file mode 100644 index 000000000..5ef5ee1ae --- /dev/null +++ b/install/xbt/linux/misc/sql/sql_result.h @@ -0,0 +1,142 @@ +#pragma once + +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#include +#else +#include +#endif + +class Csql_result_source: boost::noncopyable +{ +public: + Csql_result_source(MYSQL_RES* h) + { + m_h = h; + } + + ~Csql_result_source() + { + mysql_free_result(m_h); + } + + MYSQL_RES* h() const + { + return m_h; + } +private: + MYSQL_RES* m_h; +}; + +class Csql_field +{ +public: + Csql_field(const char* begin, int size) + { + m_begin = begin; + m_size = size; + } + + const char* raw() const + { + return m_begin; + } + + int size() const + { + return m_size; + } + + float f(float d = 0) const + { + return raw() ? atof(raw()) : d; + } + + long long i(long long d = 0) const + { +#ifdef WIN32 + return raw() ? _atoi64(raw()) : d; +#else + return raw() ? atoll(raw()) : d; +#endif + } + + const std::string s(const std::string& d = "") const + { + return raw() ? std::string(raw(), size()) : d; + } + + const_memory_range vdata() const + { + return const_memory_range(raw(), size()); + } +private: + const char* m_begin; + int m_size; +}; + +class Csql_row +{ +public: + Csql_row(MYSQL_ROW, unsigned long* sizes, const boost::shared_ptr&); + + Csql_row() + { + } + + operator bool() const + { + return m_data; + } + + Csql_field operator[](size_t i) const + { + return Csql_field(m_data[i], m_sizes[i]); + } +private: + MYSQL_ROW m_data; + unsigned long* m_sizes; + boost::shared_ptr m_source; +}; + +class Csql_result +{ +public: + Csql_row fetch_row() const; + + Csql_result(MYSQL_RES* h) + { + m_source = boost::make_shared(h); + } + + operator bool() const + { + return c_rows(); + } + + int c_fields() const + { + return mysql_num_fields(h()); + } + + int c_rows() const + { + return mysql_num_rows(h()); + } + + void data_seek(int i) + { + mysql_data_seek(h(), i); + } +private: + MYSQL_RES* h() const + { + return m_source->h(); + } + + boost::shared_ptr m_source; +}; diff --git a/install/xbt/linux/misc/stream_int.h b/install/xbt/linux/misc/stream_int.h new file mode 100644 index 000000000..a008182aa --- /dev/null +++ b/install/xbt/linux/misc/stream_int.h @@ -0,0 +1,83 @@ +#pragma once + +#include +#include + +inline float read_float(const void* r) +{ + float v; + memcpy(&v, r, sizeof(float)); + return v; +} + +inline float read_float(const void* r0, const void* s_end) +{ + return read_float(r0); +} + +template +static T write_float(T w0, float v) +{ + unsigned char* w = reinterpret_cast(w0); + memcpy(w, &v, sizeof(float)); + return w + sizeof(float); +} + +inline long long read_int(int cb, const void* r0) +{ + const unsigned char* r = reinterpret_cast(r0); + long long v = 0; + while (cb--) + v = v << 8 | *r++; + return v; +} + +inline long long read_int(int cb, const_memory_range s) +{ + return s.size() < cb ? 0 : read_int(cb, s.begin); +} + +inline long long read_int(int cb, const void* r, const void* s_end) +{ + return read_int(cb, const_memory_range(r, s_end)); +} + +template +T write_int(int cb, T w0, long long v) +{ + unsigned char* w = reinterpret_cast(w0); + w += cb; + for (int i = 0; i < cb; i++) + { + *--w = v & 0xff; + v >>= 8; + } + return reinterpret_cast(w + cb); +} + +inline long long read_int_le(int cb, const void* r0) +{ + const unsigned char* r = reinterpret_cast(r0); + r += cb; + long long v = 0; + while (cb--) + v = v << 8 | *--r; + return v; +} + +inline long long read_int_le(int cb, const void* r, const void* s_end) +{ + return read_int_le(cb, r); +} + +template +T write_int_le(int cb, T w0, long long v) +{ + unsigned char* w = reinterpret_cast(w0); + for (int i = 0; i < cb; i++) + { + *w++ = v & 0xff; + v >>= 8; + } + return reinterpret_cast(w); +} diff --git a/install/xbt/linux/misc/stream_reader.cpp b/install/xbt/linux/misc/stream_reader.cpp new file mode 100644 index 000000000..f57d5ba6a --- /dev/null +++ b/install/xbt/linux/misc/stream_reader.cpp @@ -0,0 +1,3 @@ +#include "stdafx.h" +#include "stream_reader.h" + diff --git a/install/xbt/linux/misc/stream_reader.h b/install/xbt/linux/misc/stream_reader.h new file mode 100644 index 000000000..15e78fbe1 --- /dev/null +++ b/install/xbt/linux/misc/stream_reader.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +class Cstream_reader +{ +public: + const unsigned char* d() const + { + return m_d; + } + + const unsigned char* d_end() const + { + return m_d.end(); + } + + const unsigned char* r() const + { + return m_r; + } + + const unsigned char* read(int size) + { + m_r += size; + return m_r - size; + } + + long long read_int(int cb) + { + m_r += cb; + return ::read_int(cb, m_r - cb); + } + + Cvirtual_binary read_data() + { + int l = read_int(4); + return Cvirtual_binary(const_memory_range(read(l), l)); + } + + std::string read_string() + { + int l = read_int(4); + return std::string(reinterpret_cast(read(l)), l); + } + + Cstream_reader() + { + } + + Cstream_reader(const Cvirtual_binary& d) + { + m_r = m_d = d; + } +private: + Cvirtual_binary m_d; + const unsigned char* m_r; +}; diff --git a/install/xbt/linux/misc/stream_writer.cpp b/install/xbt/linux/misc/stream_writer.cpp new file mode 100644 index 000000000..88041c56b --- /dev/null +++ b/install/xbt/linux/misc/stream_writer.cpp @@ -0,0 +1,2 @@ +#include "stdafx.h" +#include "stream_writer.h" diff --git a/install/xbt/linux/misc/stream_writer.h b/install/xbt/linux/misc/stream_writer.h new file mode 100644 index 000000000..108f4c483 --- /dev/null +++ b/install/xbt/linux/misc/stream_writer.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include + +class Cstream_writer +{ +public: + unsigned char* w() const + { + return m_w; + } + + unsigned char* write(int size) + { + m_w += size; + return m_w - size; + } + + void write_int(int cb, long long v) + { + m_w = ::write_int(cb, m_w, v); + } + + void write_data(const_memory_range v) + { + write_int(4, v.size()); + memcpy(write(v.size()), v, v.size()); + } + + Cstream_writer() + { + } + + Cstream_writer(unsigned char* w) + { + m_w = w; + } +private: + unsigned char* m_w; +}; diff --git a/install/xbt/linux/misc/tf_misc.cpp b/install/xbt/linux/misc/tf_misc.cpp new file mode 100644 index 000000000..5a3927f78 --- /dev/null +++ b/install/xbt/linux/misc/tf_misc.cpp @@ -0,0 +1,170 @@ +#include "stdafx.h" +#include "tf_misc.h" + +#include +#include + +static std::string web_encode(const std::string& v) +{ + std::string d; + d.reserve(v.size() << 1); + for (int a = 0; a < v.size();) + { + int b = v.find_first_of("\"<&", a); + if (b == std::string::npos) + { + d += v.substr(a); + return d; + } + d += v.substr(a, b - a); + switch (v[b]) + { + case '"': + d += """; + break; + case '<': + d += "<"; + break; + case '&': + d += "&"; + break; + } + a = b + 1; + } + return d; +} + +static std::string web_link(const std::string& link_title, const std::string& link, bool encode) +{ + return encode + ? web_link(web_encode(link_title), web_encode(link), false) + : (boost::format("%s") % link % (link_title.empty() ? link : link_title)).str(); +} + +static std::string encode_local_url(const std::string& url, const std::string& local_domain_url) +{ + if (!local_domain_url.empty() && boost::istarts_with(url, local_domain_url)) + return url.substr(local_domain_url.length()); + return url; +} + +std::string encode_field(const std::string& v, const std::string& local_domain_url) +{ + std::string r; + r.reserve(v.length() << 1); + for (size_t i = 0; i < v.length(); ) + { + if (boost::istarts_with(v.c_str() + i, "ftp.") + || boost::istarts_with(v.c_str() + i, "ftp://") + || boost::istarts_with(v.c_str() + i, "http://") + || boost::istarts_with(v.c_str() + i, "https://") + || boost::istarts_with(v.c_str() + i, "mailto:") + || boost::istarts_with(v.c_str() + i, "www.")) + { + size_t p = i; + while (p < v.length() + && !isspace(v[p] & 0xff) + && v[p] != '\"' + && v[p] != '<' + && v[p] != '>') + { + p++; + } + if (v[p - 1] == '!' || v[p - 1] == ',' || v[p - 1] == '.' || v[p - 1] == '?') + p--; + if (v[p - 1] == ')') + p--; + std::string url = web_encode(v.substr(i, p - i)); + if (boost::istarts_with(v.c_str() + i, "ftp.")) + r += web_link(url, "ftp://" + url, false); + else if (boost::istarts_with(v.c_str() + i, "www.")) + r += web_link(url, "http://" + url, false); + else + r += web_link(boost::istarts_with(v.c_str() + i, "mailto:") ? url.substr(7) : encode_local_url(url, local_domain_url), url, false); + i = p; + } + else + { + char c = v[i++]; + switch (c) + { + case '<': + r += "<"; + break; + case '&': + r += "&"; + break; + default: + r += c; + } + } + } + return r; +} + +std::string encode_text(const std::string& v, const std::string& local_domain_url, bool add_span) +{ + std::string r; + r.reserve(v.length() << 1); + for (size_t i = 0; i < v.length(); ) + { + size_t p = v.find('\n', i); + if (p == std::string::npos) + p = v.length(); + std::string line = v.substr(i, p - i); + line = encode_field(line, local_domain_url); + r += add_span && boost::istarts_with(line, "> ") ? "" + line + "" : line; + r += "
"; + i = p + 1; + } + return r; +} + +std::string trim_field(const std::string& v) +{ + std::string r; + bool copy_white = false; + for (size_t i = 0; i < v.length(); i++) + { + if (isspace(v[i] & 0xff)) + copy_white = true; + else + { + if (copy_white) + { + if (!r.empty()) + r += ' '; + copy_white = false; + } + r += v[i]; + } + } + return r; +} + +std::string trim_text(const std::string& v) +{ + std::string r; + bool copy_white = false; + for (size_t i = 0; i < v.length(); ) + { + size_t p = v.find('\n', i); + if (p == std::string::npos) + p = v.length(); + std::string line = trim_field(v.substr(i, p - i)); + if (line.empty()) + copy_white = true; + else + { + if (copy_white) + { + if (!r.empty()) + r += '\n'; + copy_white = false; + } + r += line + '\n'; + } + i = p + 1; + } + return r; +} diff --git a/install/xbt/linux/misc/tf_misc.h b/install/xbt/linux/misc/tf_misc.h new file mode 100644 index 000000000..e9d8d0017 --- /dev/null +++ b/install/xbt/linux/misc/tf_misc.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +std::string encode_field(const std::string&, const std::string& local_domain_url); +std::string encode_text(const std::string&, const std::string& local_domain_url, bool add_span); +std::string trim_field(const std::string&); +std::string trim_text(const std::string&); diff --git a/install/xbt/linux/misc/virtual_binary.cpp b/install/xbt/linux/misc/virtual_binary.cpp new file mode 100644 index 000000000..caaa208fd --- /dev/null +++ b/install/xbt/linux/misc/virtual_binary.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "xbt/virtual_binary.h" + +#include +#include +#include + +Cvirtual_binary_source::Cvirtual_binary_source(const_memory_range d) +{ + m_range.begin = new unsigned char[d.size()]; + m_range.end = m_range.begin + d.size(); + if (d) + memcpy(m_range, d, d.size()); +} + +Cvirtual_binary::Cvirtual_binary(size_t v) +{ + m_source = boost::make_shared(const_memory_range(NULL, v)); +} + +Cvirtual_binary::Cvirtual_binary(const_memory_range d) +{ + m_source = boost::make_shared(d); +} + +int Cvirtual_binary::save(const std::string& fname) const +{ + FILE* f = fopen(fname.c_str(), "wb"); + if (!f) + return 1; + int error = fwrite(data(), 1, size(), f) != size(); + fclose(f); + return error; +} + +int Cvirtual_binary::load(const std::string& fname) +{ + FILE* f = fopen(fname.c_str(), "rb"); + if (!f) + return 1; + struct stat b; + int error = fstat(fileno(f), &b) ? 1 : fread(write_start(b.st_size), 1, b.st_size, f) != b.st_size; + fclose(f); + return error; +} + +Cvirtual_binary& Cvirtual_binary::load1(const std::string& fname) +{ + load(fname); + return *this; +} + +void Cvirtual_binary::clear() +{ + m_source.reset(); +} + +size_t Cvirtual_binary::read(void* d) const +{ + memcpy(d, data(), size()); + return size(); +} + +unsigned char* Cvirtual_binary::write_start(size_t cb_d) +{ + if (data() && size() == cb_d) + return data_edit(); + m_source = boost::make_shared(const_memory_range(NULL, cb_d)); + return data_edit(); +} + +void Cvirtual_binary::write(const_memory_range d) +{ + memcpy(write_start(d.size()), d, d.size()); +} diff --git a/install/xbt/linux/misc/windows/ETSLayout.cpp b/install/xbt/linux/misc/windows/ETSLayout.cpp new file mode 100644 index 000000000..222ba77bf --- /dev/null +++ b/install/xbt/linux/misc/windows/ETSLayout.cpp @@ -0,0 +1,3058 @@ +//////////////////////////////////////////// +// ___ ____ _________________ // +// / _/_ _// _______________/ // +// / _/ / / / / ___ ___ ____ // +// /__/ /_/ / / / // _/_ _/ // +// _________/ / / / // _/ / / // +// (c) 1998-2000_/ /___//_/ /_/ // +// // +//////////////////////////////////////////// +// all rights reserved // +//////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutDialog +// +// A class for smart layouting of Dialogs and such +// +// USAGE: See LayoutMgr.html +// +// AUTHOR: Erwin Tratar +// +// DISCLAIMER: +// +// This Sourcecode and all accompaning material is 1998-1999 Erwin Tratar. +// All rights reserved. +// +// The source code may be used in compiled form in any way you desire +// (including usage in commercial applications), providing that your +// application adds essential code (i.e. it is not only a wrapper) to the +// functionality found here +// +// Redistribution of the sourcecode itself, publication in any media or +// inclusion in a library requires the authors expressed written consent. +// You may not sale this code for profit. +// +// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. USE IT +// AT YOUR OWN RISK! THE AUTHOR ACCEPTS NO LIABILITY FOR ANY DAMAGE/LOSS OF +// BUSINESS THAT THIS PRODUCT MAY CAUSE. +// +// +// HISTORY: +// 1998/05/1 Initial Release +// 1998/05/13 Added ability to have a Pane with a control +// 1998/05/13 Added better support for TabControls +// 1998/05/14 automatically set Icon to IDR_MAINFRAME +// 1998/05/19 no flicker on restoring position in OnInitialUpdate +// Changed procedure for load/save, see constructor +// 1998/10/02 Added support for Maximum (tracking) size +// 1998/10/02 Much improved handling regarding RELATIVE/GREEDY +// /w critical minimum size +// 1998/10/02 turn on/off gripper at lower right corner +// 1998/10/05 Support for user defined minimum size for items +// (was hardcoded 5 before) +// 1998/10/07 Fix for FormViews +// 1998/10/31 Support for SECDialogBar/CDialogBar +// 1998/10/31 simplified interface +// 1998/10/31 Advanced positioning options +// 1998/10/31 Added paneNull for empty Pane (former: NULL) +// 1998/11/20 Swapped ETSLayoutDialog constructor parameters +// 1998/11/20 Added Pane::addItemSpaceBetween +// [Leo Zelevinsky] +// 1998/11/24 Added fixup for greedy panes +// 1998/11/24 addItemSpaceBetween now subtracts 2*nDefaultBorder +// 1998/11/24 addGrowing() added as a shortcut for a paneNull +// 1998/11/24 simplified interface: no more PaneBase:: / Pane:: +// needed +// 1998/11/24 added FILL_* Modes +// 1998/11/24 improved maximum size handling for greedy panes +// 1998/11/25 Fixup of greedy panes caused infinite loop in some +// cases +// 1999/01/07 addItemSpaceLike() added +// 1999/04/03 Fixed ETSLayoutFormView memory leak +// 1999/04/07 Fixed ALIGN_xCENTER +// 1999/04/08 New simple stream-interface added +// 1999/04/09 Added support for an empty Status-Bar for resizing +// instead of a gripper in the lower right corner +// [Andreas Kapust] +// 1999/04/11 New code for much less flickering, OnEraseBkgnd() +// overidden for this task +// 1999/05/12 Split Layout code into understandable pieces and adding +// a lot of comments +// 1999/06/20 ABSOLUTE_X + ALIGN_FILL_X expands item if there is any +// left space (after all Abs/Rel/Greedy processing is done) +// 1999/10/06 Changed Load() and Save() to use WINDOWPLACEMENT +// [Keith Bussell] +// 1999/11/18 Added possibility to add panes of the same orientation +// to another pane. This merges both panes in one big +// pane with the same orientation +// 1999/11/18 Added support for BCGDialogBar (only with BCG > 4.52!) +// 1999/11/25 Addes support for PropertyPages/Sheets. Uses some code +// of a code submission from Anreas Kapust +// 1999/11/25 Renamed classes to ETSLayoutXXX +// 1999/11/25 Use CreateRoot() and Root() instead of m_pRootPane in +// derived class. +// 1999/11/26 Added autopointer support. No need to use normal pointers +// when defining layout anymore. Changed m_pRootPane to +// m_RootPane +// 1999/11/26 Bug in Fixup Greedy II with multiple GREEDY panes and one +// of them min/max limited +// 1999/11/28 Fixed PaneTab::getConstrainVert() for ABSOLUTE_VERT +// 1999/11/28 Fixed itemFixed() +// 1999/11/28 Changed DWORD modeResize Arguments to layModeResize for +// better type safety. Added typesafe operator| +// 1999/12/04 Don't reposition window in UpdateLayout if it's a child +// (as a child Dialog or PropertyPage) +// 1999/12/04 Erase Backgroung with GCL_HBRBACKGROUND (if available) +// 1999/12/04 itemSpaceXXX() adds a NORESIZE item instead of ABSOLUTE_XXX +// this will fix unwanted growing in secondary direction +// +// Version: 1.0 [1999/12/04] Initial Article on CodeProject +// +// 1999/12/10 Erase Backgroung within TabCtrl was 'fixed' badly. Reverted to +// old working code +// 2000/02/02 When the Dialog is child of a View the class works correctly +// now [Didier BULTIAUW] +// 2000/02/15 Combo-Boxes were not working correctly (in all modes!) +// 2000/02/17 aligned SpinButton Controls (with buddy) now handled +// automatically +// !! do not add such a control to the layout !! it is always +// reattached to its buddy. +// 2000/02/17 changed some cotrol class names to the defined constants +// +// Version: 1.1 [2000/02/17] +// +// 2000/02/25 Fixed auto alignment of SpinButton Controls to only affect +// visible ones +// 2000/02/27 Put all the classes into the namespace 'ETSLayout' +// 2000/03/07 Fixed growing Dialog after minimizing and restoring +// 2000/05/22 Whole Statusbar (Gripper) is not excluded anymore in EraseBkgnd() +// instead only the triangular Gripper is excluded +// 2000/05/31 Fix for PropertySheets with PSH_WIZARDHASFINISH [Thmmi] +// 2000/05/31 Fix for UpDown-Controls with EditCtrl Buddy in PropertyPages. +// These were not repositioned every time the page is being show +// until the first resize +// 2000/07/28 Problems with resizing ActiveX Controls fixed [Micheal Chapman] +// 2000/07/28 Some strings were not properly wrapped with _T() +// 2000/08/03 Check for BS_GROUPBOX was not correct as BS_GROUPBOX is more than one Bit +// 2000/08/03 New override AddMainArea added to ETSLayoutPropertySheet in order to +// have a hook for additional controls in a PropertySheet (besides the Tab) +// 2000/08/03 New override AddButtons added to ETSLayoutPropertySheet in order to +// have a hook for additional controls in the bottem pane of a PropertySheet +// 2000/08/03 Removed the need for DECLARE_LAYOUT +// +// Version: 1.2 [2000/08/05] + +#define OEMRESOURCE +#include + +#include "stdafx.h" +#include "ETSLayout.h" + +using namespace ETSLayout; +#pragma warning(disable: 4097 4610 4510 4100) + + +#ifndef OBM_SIZE +#define OBM_SIZE 32766 +// taken from WinresRc.h +// if not used for any reason +#endif + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +static UINT auIDStatusBar[] = +{ + ID_SEPARATOR +}; + +const int ERASE_GROUP_BORDER = 10; +const int FIXUP_CUTOFF = 5; +const int TAB_SPACE = 5; + +// the _NULL-Pane +CWnd* ETSLayoutMgr::paneNull = 0; + +void ETSLayoutMgr::Layout(CRect& rcClient) +{ + if(rcClient.Height() && rcClient.Width() && m_RootPane.IsValid()) \ + m_RootPane->resizeTo(rcClient); \ +} + + +ETSLayoutMgr::CPane ETSLayoutMgr::pane( layOrientation orientation, ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, + int sizeBorder /*=nDefaultBorder*/, int sizeExtraBorder /*=0*/, + int sizeSecondary /*=0*/) +{ + Pane* pPane = new Pane ( this, orientation, sizeBorder, sizeExtraBorder ); + pPane->m_sizeSecondary = sizeSecondary; + pPane->m_modeResize = modeResize; + + return CPane(pPane); +} + +ETSLayoutMgr::CPane ETSLayoutMgr::paneTab( CTabCtrl* pTab, layOrientation orientation, + ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, int sizeBorder /*=nDefaultBorder*/, + int sizeExtraBorder /*=0*/, int sizeSecondary /*=0*/) +{ + Pane* pPane = new PaneTab ( pTab, this, orientation, sizeBorder, sizeExtraBorder ); + pPane->m_sizeSecondary = sizeSecondary; + pPane->m_modeResize = modeResize; + + return CPane(pPane); +} + + +ETSLayoutMgr::CPane ETSLayoutMgr::paneCtrl( CWnd* pCtrl, layOrientation orientation, + ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, int sizeBorder /*=nDefaultBorder*/, + int sizeExtraBorder /*=0*/, int sizeTopExtra /*=0*/, + int sizeSecondary /*=0*/) +{ + Pane* pPane = new PaneCtrl ( pCtrl, this, orientation, sizeBorder, sizeExtraBorder, sizeTopExtra ); + pPane->m_sizeSecondary = sizeSecondary; + pPane->m_modeResize = modeResize; + + return CPane(pPane); +} + +ETSLayoutMgr::CPane ETSLayoutMgr::paneCtrl( UINT nID, layOrientation orientation, ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, + int sizeBorder /*=nDefaultBorder*/, int sizeExtraBorder /*=0*/, + int sizeTopExtra /*=0*/, int sizeSecondary /*=0*/) +{ + Pane* pPane = new PaneCtrl ( nID, this, orientation, sizeBorder, sizeExtraBorder, sizeTopExtra ); + pPane->m_sizeSecondary = sizeSecondary; + pPane->m_modeResize = modeResize; + + return CPane(pPane); +} + + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::item(UINT nID, ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, int sizeX /*=0*/, int sizeY /*=0*/, + int sizeXMin /*=-1*/, int sizeYMin /*=-1*/) +{ + return new PaneItem( nID, this, modeResize, sizeX, sizeY, sizeXMin, sizeYMin); +} + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::item(CWnd* pWnd, ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, + int sizeX /*=0*/, int sizeY /*=0*/, int sizeXMin /*=-1*/, + int sizeYMin /*=-1*/) +{ + return new PaneItem( pWnd, this, modeResize, sizeX, sizeY, sizeXMin, sizeYMin); +} + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::itemFixed(layOrientation orientation, int sizePrimary) +{ + CPaneBase p = new PaneItem(paneNull, this, NORESIZE, (orientation==HORIZONTAL)?sizePrimary:0, (orientation==VERTICAL)?sizePrimary:0); + return p; +} + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::itemGrowing(layOrientation orientation) +{ + return new PaneItem(paneNull, this, (orientation==HORIZONTAL)?ABSOLUTE_VERT:ABSOLUTE_HORZ, 0, 0, -nDefaultBorder, -nDefaultBorder); +} + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::itemSpaceBetween( layOrientation orientation, CWnd* pWndFirst, CWnd* pWndSecond ) +{ + if( orientation == HORIZONTAL ) { + // I'm interested in horizontal spacing + + CRect rLeft, rRight; + pWndFirst->GetWindowRect(&rLeft); + pWndSecond->GetWindowRect(&rRight); + + int sizeX = rRight.left - rLeft.right; + + if( sizeX < 0 ) { + // compare top to top + sizeX = rRight.left - rLeft.left; + } + else { + sizeX -= 2*nDefaultBorder; + } + + return new PaneItem(paneNull, this, NORESIZE, sizeX, 0); + } + else { + // I'm interested in vertical spacing + CRect rTop, rBot; + pWndFirst->GetWindowRect(&rTop); + pWndSecond->GetWindowRect(&rBot); + + int sizeY = rBot.top - rTop.bottom; + + if( sizeY < 0 ) { + // compare top to top + sizeY = sizeY = rBot.top - rTop.top; + } + else { + sizeY -= 2*nDefaultBorder; + } + + return new PaneItem(paneNull, this, NORESIZE, 0, sizeY); + } +} + + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::itemSpaceBetween( layOrientation orientation, UINT nIDFirst, UINT nIDSecond ) +{ + CWnd *pFirst = GetWnd()->GetDlgItem(nIDFirst); + CWnd *pSecond = GetWnd()->GetDlgItem(nIDSecond); + + ASSERT( pFirst && pSecond ); + + return itemSpaceBetween( orientation, pFirst, pSecond ); +} + + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::itemSpaceLike( layOrientation orientation, CWnd* pWnd ) +{ + CRect rRect; + pWnd->GetWindowRect(&rRect); + + if( orientation == HORIZONTAL ) { + // I'm interested in horizontal spacing + return new PaneItem(paneNull, this, NORESIZE, rRect.Width(), 0); + } + else { + // I'm interested in vertical spacing + return new PaneItem(paneNull, this, NORESIZE, 0, rRect.Height() ); + } + +} + + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::itemSpaceLike( layOrientation orientation, UINT nID ) +{ + CWnd *pWnd = GetWnd()->GetDlgItem(nID); + ASSERT( pWnd ); + + return itemSpaceLike( orientation, pWnd ); +} + + + +ETSLayoutMgr::~ETSLayoutMgr() +{ +} + +void ETSLayoutMgr::UpdateLayout() +{ + if(!m_RootPane) + return; + + // Check constraints + CRect rcClient = GetRect(); + + if( m_pWnd->IsKindOf( RUNTIME_CLASS( CDialog ) ) && !(m_pWnd->GetStyle()&WS_CHILD) ) { + CRect rcWindow; + m_pWnd->GetWindowRect(rcWindow); + + // Added by Didier BULTIAUW + CWnd* parentWnd = m_pWnd->GetParent(); + if( (parentWnd != 0) && parentWnd->IsKindOf(RUNTIME_CLASS(CView)) ) + { + CRect rcParent; + parentWnd->GetWindowRect(rcParent); + rcWindow.OffsetRect(-rcParent.left,-rcParent.top); + } + // end add + + CRect rcBorder = rcWindow; + rcBorder -= rcClient; + + // Min and Max info + int minWidth = m_RootPane->getMinConstrainHorz() + rcBorder.Width() + 2*m_sizeRootBorders.cx; + int minHeight = m_RootPane->getMinConstrainVert() + rcBorder.Height() + 2*m_sizeRootBorders.cy; + int maxWidth = m_RootPane->getMaxConstrainHorz(); + if(maxWidth != -1) { + maxWidth += rcBorder.Width() + 2*m_sizeRootBorders.cx; + maxWidth = max(maxWidth, minWidth); + } + int maxHeight = m_RootPane->getMaxConstrainVert(); + if(maxHeight != -1) { + maxHeight += rcBorder.Height() + 2*m_sizeRootBorders.cy; + maxHeight = max(maxHeight, minHeight); + } + + if(rcWindow.Width() < minWidth) + rcWindow.right = rcWindow.left + minWidth; + if(rcWindow.Height() < minHeight) + rcWindow.bottom = rcWindow.top + minHeight; + + if(maxWidth != -1 && rcWindow.Width() > maxWidth) + rcWindow.right = rcWindow.left + maxWidth; + if(maxHeight != -1 && rcWindow.Height() > maxHeight) + rcWindow.bottom = rcWindow.top + maxHeight; + + m_pWnd->MoveWindow(rcWindow); + } + // Do the Layout + rcClient = GetRect(); + + // Add a Border around the rootPane + rcClient.top += m_sizeRootBorders.cy; + rcClient.bottom -= m_sizeRootBorders.cy; + rcClient.left += m_sizeRootBorders.cx; + rcClient.right -= m_sizeRootBorders.cx; + + if(GetWnd()->IsWindowVisible()) { + // Avoid ugly artifacts + //GetWnd()->SetRedraw(FALSE); + Layout(rcClient); + //GetWnd()->SetRedraw(TRUE); + } + else + Layout(rcClient); + + // Take special care of SpinButtons (Up-Down Controls) with Buddy set, enumerate + // all childs: + CWnd* pWndChild = GetWnd()->GetWindow(GW_CHILD); + TCHAR szClassName[ MAX_PATH ]; + while(pWndChild) + { + ::GetClassName( pWndChild->GetSafeHwnd(), szClassName, MAX_PATH ); + DWORD dwStyle = pWndChild->GetStyle(); + + // is it a SpinButton? + if( _tcscmp(szClassName, UPDOWN_CLASS)==0 && ::IsWindowVisible(pWndChild->GetSafeHwnd()) ) { + HWND hwndBuddy = (HWND)::SendMessage( pWndChild->GetSafeHwnd(), UDM_GETBUDDY, 0, 0); + if( hwndBuddy != 0 && (dwStyle&(UDS_ALIGNRIGHT|UDS_ALIGNLEFT)) != 0 ) + { + // reset Buddy + ::SendMessage( pWndChild->GetSafeHwnd(), UDM_SETBUDDY, (WPARAM)hwndBuddy, 0); + } + } + + + pWndChild = pWndChild->GetWindow(GW_HWNDNEXT); + } + + + GetWnd()->Invalidate(); +} + + +bool ETSLayoutMgr::Save(LPCTSTR lpstrRegKey) +{ + CRect rcWnd; + + if(IsWindow(GetWnd()->m_hWnd)) + { + WINDOWPLACEMENT wp; + if(GetWnd()->GetWindowPlacement(&wp)) + { + // Make sure we don't pop up + // minimized the next time + if(wp.showCmd != SW_SHOWMAXIMIZED) + wp.showCmd = SW_SHOWNORMAL; + + AfxGetApp()->WriteProfileBinary(lpstrRegKey, + _T("WindowPlacement"), + reinterpret_cast(&wp), sizeof(wp)); + } + } + return true; +} + +bool ETSLayoutMgr::Load(LPCTSTR lpstrRegKey) +{ + LPBYTE pbtData = 0; + UINT nSize = 0; + if(AfxGetApp()->GetProfileBinary(lpstrRegKey, + _T("WindowPlacement"), &pbtData, &nSize)) + { + WINDOWPLACEMENT* pwp = + reinterpret_cast(pbtData); + + ASSERT(nSize == sizeof(WINDOWPLACEMENT)); + if(nSize == sizeof(WINDOWPLACEMENT)) + GetWnd()->SetWindowPlacement(reinterpret_cast(pbtData)); + + delete [] pbtData; + } + return true; +} + + +void ETSLayoutMgr::EraseBkgnd(CDC* pDC) +{ + CRect rcClient; + GetWnd()->GetClientRect( rcClient ); + + CRgn rgn; + rgn.CreateRectRgnIndirect(rcClient); + TRACE("CreateRgn (%d,%d,%d,%d)\n", rcClient.left, rcClient.top, rcClient.right, rcClient.bottom ); + + CRgn rgnRect; + rgnRect.CreateRectRgn(0,0,0,0); + + CRect rcChild; + CWnd* pWndChild = GetWnd()->GetWindow( GW_CHILD ); + + TCHAR szClassName[ MAX_PATH ]; + + pDC->SelectClipRgn(NULL); + + while( pWndChild ) { + + pWndChild->GetWindowRect(rcChild); + GetWnd()->ScreenToClient( rcChild ); + + rgnRect.SetRectRgn( rcChild ); + + ::GetClassName( pWndChild->GetSafeHwnd(), szClassName, MAX_PATH ); + DWORD dwStyle = pWndChild->GetStyle(); + + // doesn't make sense for hidden children + if( dwStyle & WS_VISIBLE ) { + + // Fix: BS_GROUPBOX is more than one Bit, extend check to (dwStyle & BS_GROUPBOX)==BS_GROUPBOX [ET] + if( _tcscmp(szClassName,_T("Button"))==0 && (dwStyle & BS_GROUPBOX)==BS_GROUPBOX ) { + // it is a group-box, ignore completely + } + else if( _tcscmp(szClassName,WC_TABCONTROL )==0 ) { + // ignore Tab-Control's inside rect + static_cast(pWndChild)->AdjustRect(FALSE,rcChild); + + CRgn rgnContent; + rgnContent.CreateRectRgnIndirect(rcChild); + + rgnRect.CombineRgn( &rgnRect, &rgnContent, RGN_DIFF ); + rgn.CombineRgn( &rgn, &rgnRect, RGN_DIFF ); + } + else if( _tcscmp(szClassName,STATUSCLASSNAME)==0 ) { + + CPoint ptTriangleGrip[3]; + ptTriangleGrip[0] = CPoint(rcChild.right,rcChild.top); + ptTriangleGrip[1] = CPoint(rcChild.right,rcChild.bottom); + ptTriangleGrip[2] = CPoint(rcChild.right-rcChild.Height(),rcChild.bottom); + + CRgn rgnGripper; + rgnGripper.CreatePolygonRgn(ptTriangleGrip,3, WINDING); + + rgn.CombineRgn( &rgn, &rgnGripper, RGN_DIFF ); + + } + else { + rgn.CombineRgn( &rgn, &rgnRect, RGN_DIFF ); + } + } + + pWndChild = pWndChild->GetNextWindow(); + } + + + HBRUSH hBrBack = (HBRUSH) ::GetClassLong(GetWnd()->GetSafeHwnd(), GCL_HBRBACKGROUND) ; + if( hBrBack == 0 ) + hBrBack = ::GetSysColorBrush(COLOR_BTNFACE); + + pDC->FillRgn( &rgn, + CBrush::FromHandle( hBrBack ) + ); + +} + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutMgr::PaneItem implementation + + +ETSLayoutMgr::PaneItem::PaneItem(CWnd* pWnd, ETSLayoutMgr* pMgr, ETSLayoutMgr::layResizeMode modeResize/*=GREEDY*/ + , int sizeX/*=0*/, int sizeY/*=0*/ + , int sizeXMin/*=-1*/, int sizeYMin/*=-1*/ ) : PaneBase( pMgr ) +{ + m_modeResize = modeResize; + m_hwndCtrl = pWnd->GetSafeHwnd(); + + m_sizeX = 0; + m_sizeY = 0; + + m_bComboSpecial = false; + + m_sizeXMin = sizeXMin; + m_sizeYMin = sizeYMin; + + if(!m_hwndCtrl) { // only Dummy! + m_sizeX = sizeX; + m_sizeY = sizeY; + } + else { + CRect rcControl; + ::GetWindowRect(m_hwndCtrl, &rcControl); + + if(sizeX == 0) { + m_sizeX = rcControl.Width(); + } + else { + m_sizeX = sizeX; + } + if( m_sizeXMin == -1 ) { + // do not make smaller than current size + m_sizeXMin = rcControl.Width(); + } + + if(sizeY == 0) { + m_sizeY = rcControl.Height(); + } + else { + m_sizeY = sizeY; + } + if( m_sizeYMin == -1 ) { + // do not make smaller than current size + m_sizeYMin = rcControl.Height(); + } + + TCHAR szClassName[ MAX_PATH ]; + ::GetClassName( m_hwndCtrl, szClassName, MAX_PATH ); + + // special treatment for combo-boxes + if( _tcscmp(szClassName,_T("ComboBox"))==0 || _tcscmp(szClassName,WC_COMBOBOXEX)==0) { + m_bComboSpecial = true; + } + } +} + +ETSLayoutMgr::PaneItem::PaneItem( UINT nID, ETSLayoutMgr* pMgr, ETSLayoutMgr::layResizeMode modeResize/*=GREEDY*/ + , int sizeX/*=0*/, int sizeY/*=0*/ + , int sizeXMin/*=-1*/, int sizeYMin/*=-1*/ ) : PaneBase( pMgr ) +{ + CWnd* pWnd = pMgr->GetWnd()->GetDlgItem(nID); + m_hwndCtrl = pWnd->GetSafeHwnd(); + + m_sizeX = 0; + m_sizeY = 0; + + m_bComboSpecial = false; + + m_modeResize = modeResize; + + m_sizeXMin = sizeXMin; + m_sizeYMin = sizeYMin; + + if(!m_hwndCtrl) { // only Dummy! + m_sizeX = sizeX; + m_sizeY = sizeY; + } + else { + CRect rcControl; + ::GetWindowRect(m_hwndCtrl, &rcControl); + + if(sizeX == 0) { + m_sizeX = rcControl.Width(); + } + else { + m_sizeX = sizeX; + } + if( m_sizeXMin == -1 ) { + // do not make smaller than current size + m_sizeXMin = rcControl.Width(); + } + + if(sizeY == 0) { + m_sizeY = rcControl.Height(); + } + else { + m_sizeY = sizeY; + } + if( m_sizeYMin == -1 ) { + // do not make smaller than current size + m_sizeYMin = rcControl.Height(); + } + + TCHAR szClassName[ MAX_PATH ]; + ::GetClassName( m_hwndCtrl, szClassName, MAX_PATH ); + + // special treatment for combo-boxes + if( _tcscmp(szClassName,_T("ComboBox"))==0 || _tcscmp(szClassName,WC_COMBOBOXEX)==0) { + m_bComboSpecial = true; + } + } +} + +int ETSLayoutMgr::PaneItem::getConstrainHorz(int sizeParent) +{ + if( m_modeResize & ABSOLUTE_HORZ) { + return m_sizeX; + } + if(m_modeResize & RELATIVE_HORZ) { + return (sizeParent * m_sizeX) / 100; + } + return -1; +} + +int ETSLayoutMgr::PaneItem::getConstrainVert(int sizeParent) +{ + if(m_modeResize & ABSOLUTE_VERT) { + return m_sizeY; + } + if(m_modeResize & RELATIVE_VERT) { + return (sizeParent * m_sizeY) / 100; + } + return -1; +} + +int ETSLayoutMgr::PaneItem::getMinConstrainHorz() +{ + if(m_modeResize & ABSOLUTE_HORZ) { + return m_sizeX; + } + return max(nMinConstrain,m_sizeXMin); +} + +int ETSLayoutMgr::PaneItem::getMinConstrainVert() +{ + if(m_modeResize & ABSOLUTE_VERT) { + return m_sizeY; + } + return max(nMinConstrain,m_sizeYMin); +} + +int ETSLayoutMgr::PaneItem::getMaxConstrainHorz() +{ + if(m_modeResize & ABSOLUTE_HORZ) { + return m_sizeX; + } + return -1; +} + +int ETSLayoutMgr::PaneItem::getMaxConstrainVert() +{ + if(m_modeResize & ABSOLUTE_VERT) { + return m_sizeY; + } + return -1; +} + +bool ETSLayoutMgr::PaneItem::resizeTo(CRect& rcNewArea) +{ + if(m_hwndCtrl) { + + CRect rcWnd; + ::GetWindowRect( m_hwndCtrl, rcWnd ); + + if( !(m_modeResize & ALIGN_FILL_HORZ) && m_modeResize & ABSOLUTE_HORZ ) { + + + if( (m_modeResize & ALIGN_HCENTER) == ALIGN_HCENTER ) { + rcNewArea.OffsetRect( (rcNewArea.Width() - rcWnd.Width())/2, 0 ); + } + else if( m_modeResize & ALIGN_RIGHT ) { + rcNewArea.OffsetRect( rcNewArea.Width() - rcWnd.Width(), 0 ); + } + + rcNewArea.right = rcNewArea.left + rcWnd.Width(); + } + if( !(m_modeResize & ALIGN_FILL_VERT) && m_modeResize & ABSOLUTE_VERT ) { + + + if( (m_modeResize & ALIGN_VCENTER) == ALIGN_VCENTER ) { + rcNewArea.OffsetRect( 0, (rcNewArea.Height()-rcWnd.Height())/2 ); + } + else if( m_modeResize & ALIGN_BOTTOM ) { + rcNewArea.OffsetRect( 0, rcNewArea.Height() - rcWnd.Height()); + } + + rcNewArea.bottom = rcNewArea.top + rcWnd.Height(); + + } + + DWORD dwStyle = ::GetWindowLong( m_hwndCtrl, GWL_STYLE ); + + // special treatment for combo-boxes + if( m_bComboSpecial && (dwStyle & CBS_DROPDOWN) ) { + // keep height (though only fully visible when dropped down) + rcNewArea.bottom = rcNewArea.top + rcWnd.Height(); + } + + // FIX: ::MoveWindow would case problems with some ActiveX Controls [Micheal Chapman] + CWnd* pTempWnd = CWnd::FromHandle( m_hwndCtrl ); + pTempWnd->MoveWindow( rcNewArea.left, rcNewArea.top, rcNewArea.Width(), rcNewArea.Height() ); + + if( m_bComboSpecial && !(dwStyle & CBS_DROPDOWN) && !(dwStyle & CBS_NOINTEGRALHEIGHT) ) { + + // Keep CB Size = Edit + LB ( if not CBS_NOINTEGRALHEIGHT) + + ::GetWindowRect( m_hwndCtrl, rcWnd ); + + CRect rcListBox; + HWND hwndListBox = ::GetDlgItem(m_hwndCtrl, 1000); // ListBox of CB + if( hwndListBox != 0 ) + { + ::GetWindowRect( hwndListBox, rcListBox ); + rcWnd.bottom = rcListBox.bottom; + + rcNewArea.bottom = rcNewArea.top + rcWnd.Height(); + + // FIX: ::MoveWindow would case problems with some ActiveX Controls [Micheal Chapman] + CWnd* pTempWnd = CWnd::FromHandle( m_hwndCtrl ); + pTempWnd->MoveWindow( rcNewArea.left, rcNewArea.top, rcNewArea.Width(), rcNewArea.Height(), true ); + } + } + + ::RedrawWindow(m_hwndCtrl,0,0, RDW_INVALIDATE | RDW_UPDATENOW ); + + } + return true; +} + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutMgr::PaneTab implementation + + +ETSLayoutMgr::PaneTab::PaneTab( CTabCtrl* pTab, ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder /*= nDefaultBorder*/, int sizeExtraBorder /*= 0*/ ) +: ETSLayoutMgr::Pane(pMgr, orientation, sizeBorder, sizeExtraBorder) +{ + ASSERT(pTab); + m_pTab = pTab; +} + +int ETSLayoutMgr::PaneTab::getConstrainHorz(int sizeParent) +{ + CRect rcTab; + m_pTab->AdjustRect(TRUE, &rcTab); + + if(rcTab.Width() > sizeParent) + return rcTab.Width(); + + return Pane::getConstrainHorz(sizeParent /*- rcTab.Width()*/); +} + +int ETSLayoutMgr::PaneTab::getConstrainVert(int sizeParent) +{ + CRect rcTab; + m_pTab->AdjustRect(TRUE, &rcTab); + + if( m_modeResize & ABSOLUTE_VERT ) { + return m_sizeSecondary + rcTab.Height(); + } + + if(rcTab.Height() > sizeParent) + return rcTab.Height(); + + return Pane::getConstrainVert(sizeParent /*- rcTab.Height()*/); +} + +int ETSLayoutMgr::PaneTab::getMinConstrainHorz() +{ + CRect rcTab(0,0,0,0); + m_pTab->AdjustRect(TRUE, &rcTab); + + return Pane::getMinConstrainHorz() + rcTab.Width() ; +} + +int ETSLayoutMgr::PaneTab::getMinConstrainVert() +{ + CRect rcTab(0,0,0,0); + m_pTab->AdjustRect(TRUE, &rcTab); + + return Pane::getMinConstrainVert() + rcTab.Height(); +} + +int ETSLayoutMgr::PaneTab::getMaxConstrainHorz() +{ + CRect rcTab(0,0,0,0); + m_pTab->AdjustRect(TRUE, &rcTab); + + int paneMax = Pane::getMaxConstrainHorz(); + return (paneMax != -1) ? paneMax + rcTab.Width() : -1; +} + +int ETSLayoutMgr::PaneTab::getMaxConstrainVert() +{ + CRect rcTab(0,0,0,0); + m_pTab->AdjustRect(TRUE, &rcTab); + + int paneMax = Pane::getMaxConstrainVert(); + return (paneMax != -1) ? paneMax + rcTab.Height() : -1; +} + +bool ETSLayoutMgr::PaneTab::resizeTo(CRect& rcNewArea) +{ + m_pTab->MoveWindow(rcNewArea); + m_pTab->AdjustRect(FALSE,rcNewArea); + + return Pane::resizeTo(rcNewArea); +} + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutMgr::PaneCtrl implementation + + +ETSLayoutMgr::PaneCtrl::PaneCtrl( CWnd* pCtrl, ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder /*= nDefaultBorder*/, int sizeExtraBorder /*= 0*/, int sizeTopExtra /*= 0*/ ) +: ETSLayoutMgr::Pane(pMgr, orientation, sizeBorder, sizeExtraBorder) +{ + m_sizeTopExtra = sizeTopExtra; + + ASSERT(pCtrl); + m_hwndCtrl = pCtrl->GetSafeHwnd(); +} + +ETSLayoutMgr::PaneCtrl::PaneCtrl( UINT nID, ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder /*= nDefaultBorder*/, int sizeExtraBorder /*= 0*/, int sizeTopExtra /*= 0*/ ) +: ETSLayoutMgr::Pane(pMgr, orientation, sizeBorder, sizeExtraBorder) +{ + m_sizeTopExtra = sizeTopExtra; + + m_hwndCtrl = ::GetDlgItem(pMgr->GetWnd()->GetSafeHwnd(), nID); + ASSERT(m_hwndCtrl); +} + +int ETSLayoutMgr::PaneCtrl::getConstrainHorz(int sizeParent) +{ + return Pane::getConstrainHorz(sizeParent) ; +} + +int ETSLayoutMgr::PaneCtrl::getConstrainVert(int sizeParent) +{ + return Pane::getConstrainVert(sizeParent); +} + +int ETSLayoutMgr::PaneCtrl::getMinConstrainHorz() +{ + return Pane::getMinConstrainHorz(); +} + +int ETSLayoutMgr::PaneCtrl::getMinConstrainVert() +{ + return Pane::getMinConstrainVert() + m_sizeTopExtra; +} + +int ETSLayoutMgr::PaneCtrl::getMaxConstrainHorz() +{ + int paneMax = Pane::getMaxConstrainHorz(); + return ( paneMax == -1) ? -1 : paneMax ; +} + +int ETSLayoutMgr::PaneCtrl::getMaxConstrainVert() +{ + int paneMax = Pane::getMaxConstrainVert(); + return ( paneMax == -1) ? -1 : paneMax + m_sizeTopExtra; +} + +bool ETSLayoutMgr::PaneCtrl::resizeTo(CRect& rcNewArea) +{ + // FIX: ::MoveWindow would case problems with some ActiveX Controls [Micheal Chapman] + CWnd* pTempWnd = CWnd::FromHandle( m_hwndCtrl ); + pTempWnd->MoveWindow( rcNewArea.left, rcNewArea.top, rcNewArea.Width(), rcNewArea.Height(), true ); + + ::RedrawWindow(m_hwndCtrl,0,0, RDW_INVALIDATE | RDW_UPDATENOW |RDW_ERASE); + rcNewArea.top += m_sizeTopExtra; + return Pane::resizeTo(rcNewArea); +} + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutMgr::Pane implementation + +ETSLayoutMgr::Pane::Pane( ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder /* = nDefaultBorder */, int sizeExtraBorder /*= 0*/) +: PaneBase(pMgr) +{ + m_Orientation = orientation; + m_sizeBorder = sizeBorder; + m_sizeSecondary = 0; + m_modeResize = 0; + m_sizeExtraBorder= sizeExtraBorder; +} + + +ETSLayoutMgr::Pane::~Pane() +{ +} + + +bool ETSLayoutMgr::Pane::addItem( CWnd* pWnd, ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, int sizeX /*=0*/, int sizeY /*=0*/, int sizeXMin /*=0*/, int sizeYMin /*=0*/) +{ + CPaneBase pItem = new PaneItem( pWnd, m_pMgr, modeResize, sizeX, sizeY, sizeXMin, sizeYMin); + return addPane( pItem ); +} + +bool ETSLayoutMgr::Pane::addItem( UINT nID, ETSLayoutMgr::layResizeMode modeResize /*=GREEDY*/, int sizeX /*=0*/, int sizeY /*=0*/, int sizeXMin /*=0*/, int sizeYMin /*=0*/) +{ + CPaneBase pItem = new PaneItem( nID, m_pMgr, modeResize, sizeX, sizeY, sizeXMin, sizeYMin); + return addPane( pItem ); +} + +bool ETSLayoutMgr::Pane::addItemFixed(int size) +{ + CPaneBase pNewItem = m_pMgr->itemFixed(m_Orientation, size); + return addPane( pNewItem ); +} + +bool ETSLayoutMgr::Pane::addItemGrowing() +{ + CPaneBase pNewItem = m_pMgr->itemGrowing(m_Orientation); + return addPane( pNewItem ); +} + +bool ETSLayoutMgr::Pane::addItemSpaceBetween( CWnd* pWndFirst, CWnd* pWndSecond ) +{ + CPaneBase pNewItem = m_pMgr->itemSpaceBetween(m_Orientation, pWndFirst, pWndSecond); + return addPane( pNewItem ); +} + +bool ETSLayoutMgr::Pane::addItemSpaceBetween( UINT nIDFirst, UINT nIDSecond ) +{ + CPaneBase pNewItem = m_pMgr->itemSpaceBetween(m_Orientation, nIDFirst, nIDSecond); + return addPane( pNewItem ); +} + +bool ETSLayoutMgr::Pane::addItemSpaceLike( CWnd* pWnd ) +{ + CPaneBase pNewItem = m_pMgr->itemSpaceLike(m_Orientation, pWnd); + return addPane( pNewItem ); +} + +bool ETSLayoutMgr::Pane::addItemSpaceLike( UINT nID ) +{ + CPaneBase pNewItem = m_pMgr->itemSpaceLike(m_Orientation, nID); + return addPane( pNewItem ); +} + +bool ETSLayoutMgr::Pane::addPane( CPane pSubpane, ETSLayoutMgr::layResizeMode modeResize, int sizeSecondary /* = 0 */) +{ + if( pSubpane->getOrientation() == m_Orientation) + { + // wrap in subpane of opposite orientation + CPane pPaneWrap = new Pane(m_pMgr, m_Orientation==HORIZONTAL?VERTICAL:HORIZONTAL,0,0); + pPaneWrap->addPane( pSubpane ); + + addPane( pPaneWrap, modeResize, sizeSecondary ); + } + else + { + pSubpane->m_modeResize = modeResize; + + if(m_Orientation==HORIZONTAL && (modeResize & ABSOLUTE_HORZ) ) { + if(sizeSecondary == 0) { + pSubpane->m_sizeSecondary = pSubpane->getMinConstrainHorz(); + } + } + else if(m_Orientation==HORIZONTAL && (modeResize & RELATIVE_HORZ) ) { + pSubpane->m_sizeSecondary = sizeSecondary; + } + else if(m_Orientation==VERTICAL && (modeResize & ABSOLUTE_VERT) ) { + if(sizeSecondary == 0) { + pSubpane->m_sizeSecondary = pSubpane->getMinConstrainVert(); + } + } + else if(m_Orientation==VERTICAL && (modeResize & RELATIVE_VERT) ) { + pSubpane->m_sizeSecondary = sizeSecondary; + } + + m_paneItems.Add(pSubpane); + } + + return true; +} + +bool ETSLayoutMgr::Pane::addPane( CPaneBase pItem ) +{ + m_paneItems.Add(pItem); + return true; +} + +int ETSLayoutMgr::Pane::getConstrainHorz(int sizeParent) +{ + ASSERT( m_Orientation == VERTICAL); + + if( m_modeResize & RELATIVE_HORZ ) { + return (sizeParent * m_sizeSecondary) / 100; + } + else if( m_modeResize & ABSOLUTE_HORZ ){ + return m_sizeSecondary; + } + else + return 0; +} + + +int ETSLayoutMgr::Pane::getConstrainVert(int sizeParent) +{ + ASSERT( m_Orientation == HORIZONTAL); + + if( m_modeResize & RELATIVE_VERT ) { + return (sizeParent * m_sizeSecondary) / 100; + } + else if( m_modeResize & ABSOLUTE_VERT ) { + return m_sizeSecondary; + } + else { + return 0; + } +} + +int ETSLayoutMgr::Pane::getMaxConstrainHorz() +{ + if(m_Orientation == HORIZONTAL) { + int nMaxConstr = -1; + for(int i=0; igetMaxConstrainHorz(); + if(nConstrain == -1) + return -1; + + nMaxConstr += nConstrain; + } + return (nMaxConstr == -1) ? -1 : nMaxConstr + (m_paneItems.GetUpperBound()*m_sizeBorder) + 2*m_sizeExtraBorder; + } + else if( m_modeResize & ABSOLUTE_HORZ && m_sizeSecondary!=0) { + return m_sizeSecondary; // + 2*m_sizeExtraBorder; + } + else { + int nMaxConstr = -1; + for(int i=0; igetMaxConstrainHorz(); + + if( nConstrain == -1) + return -1; + else + nMaxConstr = max(nMaxConstr, nConstrain); + + } + return (nMaxConstr == -1) ? -1 : nMaxConstr + 2*m_sizeExtraBorder; + } +} + +int ETSLayoutMgr::Pane::getMaxConstrainVert() +{ + if(m_Orientation == VERTICAL) { + int nMaxConstr = -1; + for(int i=0; igetMaxConstrainVert(); + if(nConstrain == -1) + return -1; + + nMaxConstr += nConstrain; + } + return (nMaxConstr == -1) ? -1 : nMaxConstr + (m_paneItems.GetUpperBound()*m_sizeBorder) + 2*m_sizeExtraBorder; + } + else if( m_modeResize & ABSOLUTE_VERT && m_sizeSecondary!=0) { + return m_sizeSecondary; // + 2*m_sizeExtraBorder; + } + else { + int nMaxConstr = -1; + for(int i=0; igetMaxConstrainVert(); + + if( nConstrain == -1) + return -1; + else + nMaxConstr = max(nMaxConstr, nConstrain); + + } + return (nMaxConstr == -1) ? -1 : nMaxConstr + 2*m_sizeExtraBorder; + } +} + +int ETSLayoutMgr::Pane::getMinConstrainHorz() +{ + if(m_Orientation == HORIZONTAL) { + int nMaxConstr = 0; + for(int i=0; igetMinConstrainHorz()); + } + return nMaxConstr + (m_paneItems.GetUpperBound()*m_sizeBorder) + 2*m_sizeExtraBorder; + } + else if( m_modeResize & ABSOLUTE_HORZ && m_sizeSecondary!=0) { + return m_sizeSecondary; // + 2*m_sizeExtraBorder; + } + else { + int nMaxConstr = 0; + for(int i=0; igetMinConstrainHorz(); + nMaxConstr = max(nMaxConstr, nConstrain); + } + return nMaxConstr + 2*m_sizeExtraBorder; + } +} + +int ETSLayoutMgr::Pane::getMinConstrainVert() +{ + if(m_Orientation == VERTICAL) { + int nMaxConstr = 0; + for(int i=0; igetMinConstrainVert()); + } + return nMaxConstr + (m_paneItems.GetUpperBound()*m_sizeBorder) + 2*m_sizeExtraBorder; + } + else if( m_modeResize & ABSOLUTE_VERT && m_sizeSecondary!=0) { + return m_sizeSecondary; // + 2*m_sizeExtraBorder; + } + else { + int nMaxConstr = 0; + for(int i=0; igetMinConstrainVert(); + nMaxConstr = max(nMaxConstr, nConstrain); + } + return nMaxConstr + 2*m_sizeExtraBorder; + } +} + + +int ETSLayoutMgr::Pane::resizeToAbsolute(int& availSpace, CArray& sizePrimary, + CArray& sizeMin, CArray& sizeMax) +{ + // count all greedy items as returnvalue + int nGreedy = 0; + + // first, subtract all absoulute items from available space + for(int i=0; imodeResize() & ABSOLUTE_HORZ) { + availSpace -= (sizePrimary[i] = pItem->getConstrainHorz(0)); + } + + // count Greedy items for later + if(!(pItem->modeResize() & ABSOLUTE_HORZ) && !(pItem->modeResize() & RELATIVE_HORZ)) { + nGreedy++; + } + + sizeMin[i] = pItem->getMinConstrainHorz(); + sizeMax[i] = pItem->getMaxConstrainHorz(); + } + else { + + // for absolute items subtract their size from available space + if(pItem->modeResize() & ABSOLUTE_VERT) { + availSpace -= (sizePrimary[i] = pItem->getConstrainVert(0)); + } + + // count Greedy items for later + if(!(pItem->modeResize() & ABSOLUTE_VERT) && !(pItem->modeResize() & RELATIVE_VERT)) { + nGreedy++; + } + + sizeMin[i] = pItem->getMinConstrainVert(); + sizeMax[i] = pItem->getMaxConstrainVert(); + } + + } + + // Must not be negative !! + availSpace = max(availSpace, 0); + + return nGreedy; +} + +bool ETSLayoutMgr::Pane::resizeToRelative(int& availSpace, CArray& sizePrimary, + CArray& sizeMin, CArray& sizeMax) +{ + // Then all relative items as percentage of left space (as of now after + // all absolute items are subtracted + + int availRel = availSpace; // At the beginning all of remaining space is available. We want all + // operation to be relative to the left space at this moment, so we + // save this amount here. Then we safly can lower availSpace + + int relDiff = 0; // The cumulated difference between first proposed size and + // eventual maximum/minimum size. This amount has to be + // saved in some other place (i.e. where relativ items/subpane + // are not limited by min/max + + int relLeft = 0; // The cumulated amout of space that can be saved by + // shrinking the items/panes up to the minimum + + int relCount = 0; // Actually allocated item/subpane's cumulated primary sizes + // of non-limited items/subpanes (these can be modified in fixup) + // needed for equally distribution of differences amoung non-limited + // relative items/subpanes + + for(int i=0; imodeResize() & RELATIVE_HORZ) + || + (m_Orientation==VERTICAL && pItem->modeResize() & RELATIVE_VERT) ) + { + // minimum item/subpane size in primary direction (pixels) + int nSizeRelMin = sizeMin[i]; + + // maximum item/subpane size in primary direction (pixels) + int nSizeRelMax = sizeMax[i]; + + // Relative size in primary direction (pixels) + int nSizeRel = (m_Orientation==HORIZONTAL) + ? + (pItem->getConstrainHorz(availRel)) + : + (pItem->getConstrainVert(availRel)); + + if( nSizeRel < nSizeRelMin) { + // The item/pane is shrinked too small! + // We will grow it to it's minimum-size. In order not to modify + // this item later when fixing up set the size to the negative + // minimum size + sizePrimary[i] = -nSizeRelMin; + + // As we grew one item/subpane we have to shrink another one. + // We keep count on how much space we needed to grow the item + // to it's minimum size + relDiff += ( nSizeRelMin - nSizeRel ); + } + else if( nSizeRelMax != -1 && nSizeRel > nSizeRelMax) { + // if there's a maximum size (nSizeRelMax != -1) and our item/subpane + // is to be resized over that amount correct it. In order not to modify + // this item later when fixing up set the size to the negative + // maximum size + sizePrimary[i] = -nSizeRelMax; + + // As we shrinked one item/subpane we have to grow another one. + // We keep count on how much space we needed to grow the item + // to it's maximum size. + relDiff += ( nSizeRelMax - nSizeRel ); + } + else { + // this is the normal case: neither are we minimum limited nor maximum + // limited + + // As this item/subpane is larger that it's minimum we could later (if + // necessary for fixup) shrink it for the difference amount of pixels + relLeft += ( nSizeRel - nSizeRelMin ); + + // Set the primary size of this item/pane. Can later be modified by fixup + sizePrimary[i] = nSizeRel; + + // Add this item/subpane's primary size to the count of already allocated + // cumulated size of non-limited items/subpanes (these can be modified in fixup) + relCount += nSizeRel; + } + + // decrease available space by used space in this step + availSpace -= nSizeRel; + } + } + + // We now have the situation that some items/subpanes had to be adjusted for cumulated + // relDiff pixels (positive value means more space taken than indicated by percentage of + // left space). On the other hand we have some items/subpanes which were not limited (in + // their current dimensions) but could be if necessary up to relLeft pixels. + if(relLeft < relDiff && availSpace >= (relDiff-relLeft) ){ + + // If it's not possible to shrink other (relative) panes in order to distribute the + // difference because the left for shrinking (relLeft) is too small we need to aquire + // more space from the globally left space (if available at all) + availSpace -= (relDiff-relLeft); + relDiff = relLeft; + } + + // At this point we should have some space left (at least not be negative with the leftover + // space) and on the other hand there's enough space for the limit-difference to be distributed +// ASSERT( availSpace >= 0 && relLeft >= relDiff); + + // Fixup Relative: + // Distribute (if anecessary) relDiff on other (not limited) relative items/subpanes + // (if available - if not later just grow the limited panes) + while( relDiff != 0 && relCount >= 0 ) { + + // in every iteration there must be some space distributed (of the difference) or it could + // come to endless looping. Save the amount of space actually distributed in this iteration + int relDist = 0; + + for(int i=0; imodeResize() & RELATIVE_HORZ) && sizePrimary[i] > 0) + || + (m_Orientation==VERTICAL && (pItem->modeResize() & RELATIVE_VERT) && sizePrimary[i] > 0) ) + { + // keep a flag for termination of this iteration + bool bLast = false; + + // the difference should be distributed amoung all non-limited items/subpanes equally. + // nDiff is the amount for the current item/subpane + int nDiff = (relDiff * sizePrimary[i]) / relCount; + + // if it's a too small value just add it to the current pane and break iteration + if( abs(relDiff) <= FIXUP_CUTOFF ) { + // take it all in this step + nDiff = relDiff; + + // set break flag + bLast = true; + } + + // calculate the new size for the current item/subpane + int nNewSize = sizePrimary[i] - nDiff; + + if( nNewSize < sizeMin[i] ) { + // oh, we are limited here. Revise our plan: + + // Not all of the space could be saved, add the actually possible space + // to the sum + relDist += ( sizePrimary[i] - sizeMin[i] ); + + // set it to the minimum possible size + sizePrimary[i] = -sizeMin[i]; + + // as this item/subpane is now limited it's occupied space doesn't count + // for relCount anymore + relCount-= ( sizePrimary[i] ); + } + else { + // account the difference of the sizes in relDist and set new size + relDist += ( sizePrimary[i] - nNewSize ); + sizePrimary[i] = nNewSize; + + // if it's the last one break now + if(bLast) + break; + } + } + } + // Distributed some relDiff-space in every iteration +// ASSERT(relDist != 0); + relDiff -= relDist; + + if( relDist == 0 ) + break; + } + + { + // Fixup Relative: invert all negative (limited) sized to correct value + for(int i=0; imodeResize() & RELATIVE_HORZ) && sizePrimary[i] < 0) + || + (m_Orientation==VERTICAL && (pItem->modeResize() & RELATIVE_VERT) && sizePrimary[i] < 0) ) + { + sizePrimary[i] *= -1; + } + } + } + + return true; +} + +bool ETSLayoutMgr::Pane::resizeToGreedy(int& availSpace, int nGreedy, CArray& sizePrimary, + CArray& sizeMin, CArray& sizeMax) +{ + // Now resize all Greedy items/subpanes equally among the remaining space + int greedyDiff = 0; // The cumulated difference between first proposed size and + // eventual maximum/minimum size. This amount has to be + // saved in some other place (i.e. where items/subpane + // are not limited by min/max + + int greedyLeft = 0; // The cumulated amount of space that can be saved by + // shrinking the items/panes up to the minimum + + int greedyCount = 0; // Actually allocated item/subpane's cumulated primary sizes + // of non-limited items/subpanes (these can be modified in fixup) + // needed for equally distribution of differences amoung non-limited + // items/subpanes + + for(int i=0; imodeResize()&ABSOLUTE_HORZ) + && !(pItem->modeResize()&RELATIVE_HORZ) + ) + || + (m_Orientation==VERTICAL + && !(pItem->modeResize()&ABSOLUTE_VERT) + && !(pItem->modeResize()&RELATIVE_VERT) + ) + ) + { + + // All greedy items get an equal portion of the left space + int nSize = availSpace / nGreedy; + + // minimum item/subpane size in primary direction (pixels) + int nSizeMin = sizeMin[i]; + + // maximum item/subpane size in primary direction (pixels) + int nSizeMax = sizeMax[i]; + + + // the last gets the all of the remaining space + if( nGreedy == 1 ) + nSize = availSpace; + + if( nSize < nSizeMin) { + // The item/pane is shrinked too small! + // We will grow it to it's minimum-size. In order not to modify + // this item later when fixing up set the size to the negative + // minimum size + sizePrimary[i] = -nSizeMin; + + // As we grew one item/subpane we have to shrink another one. + // We keep count on how much space we needed to grow the item + // to it's minimum size + greedyDiff += ( nSizeMin - nSize ); + } + else if( nSizeMax != -1 && nSize > nSizeMax) { + // if there's a maximum size (nSizeRelMax != -1) and our item/subpane + // is to be resized over that amount correct it. In order not to modify + // this item later when fixing up set the size to the negative + // maximum size + sizePrimary[i] = -nSizeMax; + + // As we shrinked one item/subpane we have to grow another one. + // We keep count on how much space we needed to grow the item + // to it's maximum size. + greedyDiff += ( nSizeMax - nSize ); + } + else { + + // this is the normal case: neither are we minimum limited nor maximum + // limited + + // As this item/subpane is larger that it's minimum we could later (if + // necessary for fixup) shrink it for the difference amount of pixels + greedyLeft += ( nSize - nSizeMin ); + + // Set the primary size of this item/pane. Can later be modified by fixup + sizePrimary[i] = nSize; + + // Add this item/subpane's primary size to the count of already allocated + // cumulated size of non-limited items/subpanes (these can be modified in fixup) + greedyCount += nSize; + } + + // decrease available space by used space in this step + availSpace -= nSize; + + // one greedy item/subpane complete + --nGreedy; + } + } + + + // Fixup Greedy I + // Distribute (if anecessary) greedyDiff on other (not limited) greedy items/subpanes + // (if available - if not later just grow the limited panes) + + // at least on not limited item present + bool bAtLeastOne = true; + + while( bAtLeastOne && greedyDiff != 0 && greedyCount > 0) { + + // in every iteration there must be some space distributed (of the difference) or it could + // come to endless looping. Save the amount of space actually distributed in this iteration + int greedyDist = 0; + + // at least on not limited item present + bAtLeastOne = false; + + for(int i=0; imodeResize()&ABSOLUTE_HORZ) + && !(pItem->modeResize()&RELATIVE_HORZ) + && sizePrimary[i] > 0 + ) + || + (m_Orientation==VERTICAL + && !(pItem->modeResize()&ABSOLUTE_VERT) + && !(pItem->modeResize()&RELATIVE_VERT) + && sizePrimary[i] > 0 + ) + ) + { + // keep a flag for termination of this iteration + bool bLast = false; + + // the difference should be distributed among all non-limited items/subpanes equally. + // nDiff is the amount for the current item/subpane + int nDiff = (greedyDiff * sizePrimary[i]) / greedyCount; + + // if it's a too small value just add it to the current pane and break iteration + if( abs(greedyDiff) <= FIXUP_CUTOFF || nDiff == 0) { + // take it all in this step + nDiff = greedyDiff; + + // set break flag + bLast = true; + } + + // calculate the new size for the current item/subpane + int nNewSize = sizePrimary[i] - nDiff; + + if( nNewSize < sizeMin[i] ) { + // oh, we are limited here. Revise our plan: + + if( sizePrimary[i] != sizeMin[i] ) + bAtLeastOne = true; + + // Not all of the space could be saved, add the actually possible space + // to the sum + greedyDist += ( sizePrimary[i] - sizeMin[i] ); + + // set it to the minimum possible size + sizePrimary[i] = sizeMin[i]; + + // as this item/subpane is now limited its occupied space doesn't count + // for relCount anymore + greedyCount -= ( sizePrimary[i] ); + } + else { + // yes, there is one + bAtLeastOne = true; + + // account the difference of the sizes in relDist and set new size + greedyDist += ( sizePrimary[i] - nNewSize ); + sizePrimary[i] = nNewSize; + + // if it's the last one break now + if(bLast) + break; + } + } + } + // Distributed some greedyDiff-space in every iteration + ASSERT(!bAtLeastOne || greedyDist != 0 || greedyCount<=0); + greedyDiff -= greedyDist; + } + + + // Fixup Greedy II + if( greedyDiff < 0 ) { + // still difference, some space left + + // are there any items which are minimum-limited where we can give more space? + for(int i=0; imodeResize()&ABSOLUTE_HORZ) + && !(pItem->modeResize()&RELATIVE_HORZ) + ) + || + (m_Orientation==VERTICAL + && !(pItem->modeResize()&ABSOLUTE_VERT) + && !(pItem->modeResize()&RELATIVE_VERT) + ) + ) + { + if( sizePrimary[i] == -sizeMin[i] ) { + // fill this one up as much as possible + if( sizeMax[i] == -1) { + // all fits in + sizePrimary[i] += greedyDiff; + greedyDiff = 0; + } + else { + sizePrimary[i] += -min( -greedyDiff, sizeMax[i]-sizeMin[i]); + greedyDiff -= -min( -greedyDiff, sizeMax[i]-sizeMin[i]); + } + } + } + } + } + + { + // Fixup Greedy III: invert all negative (limited) sized to correct value + for(int i=0; imodeResize() & ABSOLUTE_HORZ) + && !(pItem->modeResize() & RELATIVE_HORZ) + && sizePrimary[i] < 0 + && sizeMin[i] >= 0 + ) + || + (m_Orientation==VERTICAL + && !(pItem->modeResize() & ABSOLUTE_VERT) + && !(pItem->modeResize() & RELATIVE_VERT) + && sizePrimary[i] < 0 + && sizeMin[i] >= 0 + ) + ) + { + if(sizePrimary[i] < 0) + sizePrimary[i] *= -1; + } + } + } + + return true; +} + + +bool ETSLayoutMgr::Pane::resizeTo(CRect& rcNewArea) +{ + // There must be some items or subpanes + ASSERT(m_paneItems.GetSize()); + + // This Array holds the size in primary direction for each item/subpane + CArray sizePrimary; + sizePrimary.SetSize(m_paneItems.GetSize()); + + // This Array holds information about the minimum size in primary direction + CArray sizeMin; + sizeMin.SetSize(m_paneItems.GetSize()); + + // This Array holds information about the maximum size in primary direction + CArray sizeMax; + sizeMax.SetSize(m_paneItems.GetSize()); + + + // How much space is actually available, subtract all borders between items + int availSpace = (m_Orientation == HORIZONTAL ? rcNewArea.Width() : rcNewArea.Height() ) - (m_paneItems.GetUpperBound()*m_sizeBorder); + + // If there is some Extra border (on top/bottem resp. left/right) subtract it too + availSpace -= 2*m_sizeExtraBorder; + + // Add the extra Border to top/bottem resp. left/right + if(m_Orientation == HORIZONTAL) { + rcNewArea.top += m_sizeExtraBorder; + rcNewArea.bottom -= m_sizeExtraBorder; + } + else { + rcNewArea.left += m_sizeExtraBorder; + rcNewArea.right -= m_sizeExtraBorder; + } + + // Counts the number of greedy items/subpanes + int nGreedy = resizeToAbsolute(availSpace, sizePrimary, sizeMin, sizeMax ); + + if(nGreedy == -1) + return false; + + if(! resizeToRelative(availSpace, sizePrimary, sizeMin, sizeMax ) ) + return false; + + if(! resizeToGreedy(availSpace, nGreedy, sizePrimary, sizeMin, sizeMax ) ) + return false; + + + // If there is any left space and there are ALIGN_FILL_* Items to assign it + // equally among them + if( availSpace > 0 ) { + // Count possible Items + int nFillItems = 0; + + for(int i=0; imodeResize() & ABSOLUTE_HORZ ) + && (pItem->modeResize() & ALIGN_FILL_HORZ) + + || + + (pItem->modeResize() & ABSOLUTE_VERT ) + && (pItem->modeResize() & ALIGN_FILL_VERT) + ) + { + ++nFillItems; + } + } + + if( nFillItems > 0 ) { + // okay, there are nFillItems, make them all availSpace/nFillItems bigger + for(int i=0; imodeResize() & ABSOLUTE_HORZ ) + && (pItem->modeResize() & ALIGN_FILL_HORZ) + + || + + (pItem->modeResize() & ABSOLUTE_VERT ) + && (pItem->modeResize() & ALIGN_FILL_VERT) + ) + { + + if( nFillItems == 1 ) { + // the last one gets all the rest + sizePrimary[i] += availSpace; + availSpace = 0; + --nFillItems; + } + else { + sizePrimary[i] += availSpace/nFillItems; + availSpace -= availSpace/nFillItems; + --nFillItems; + } + + } + } + } + + } + + // Now reposition all items: + + // starting offset + int nOffset = (m_Orientation==HORIZONTAL ? rcNewArea.left : rcNewArea.top ) + m_sizeExtraBorder; + for(int i=0; iresizeTo( rcPane ); + + // go to the next position (old pos + size + border) + ASSERT(sizePrimary[i] >= 0); + nOffset += m_sizeBorder + sizePrimary[i]; + } + + + return true; +} + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutDialog dialog + +#pragma warning(disable: 4355) +ETSLayoutDialog::ETSLayoutDialog(UINT nID, CWnd* pParent /*=NULL*/, LPCTSTR strName /*=NULL*/, bool bGripper /*=true*/) + : CBaseDialog(nID, pParent), ETSLayoutMgr( this ) +{ + //{{AFX_DATA_INIT(ETSLayoutDialog) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_bGripper = bGripper; + + if(strName) + m_strRegStore = strName; +} +#pragma warning(default: 4355) + +BEGIN_MESSAGE_MAP(ETSLayoutDialog, CBaseDialog) + //{{AFX_MSG_MAP(ETSLayoutDialog) + ON_WM_SIZE() + ON_WM_GETMINMAXINFO() + ON_WM_ERASEBKGND() + ON_WM_DESTROY() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutDialog message handlers + +BOOL ETSLayoutDialog::OnEraseBkgnd(CDC* pDC) +{ + EraseBkgnd(pDC); + return true; +} + +void ETSLayoutDialog::OnSize(UINT nType, int cx, int cy) +{ + CBaseDialog::OnSize(nType, cx, cy); + + if( abs(cx) + abs(cy) > 0) + { + // Reposition Size Marker + // Re-Layout all controls + UpdateLayout(); + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); + } + +} + +void ETSLayoutDialog::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) +{ + if(m_RootPane.IsValid()) { + + CRect rcClient = GetRect(); + if( rcClient.Height() > 0 || rcClient.Width() > 0 ) + { + + CRect rcWnd; + GetWindowRect(rcWnd); + + // How much do Window and Client differ + int nDiffHorz = rcWnd.Width() - rcClient.Width(); + int nDiffVert = rcWnd.Height() - rcClient.Height(); + + // Take into account that there is a border around the rootPane + lpMMI->ptMinTrackSize = CPoint(m_RootPane->getMinConstrainHorz() + nDiffHorz + 2*m_sizeRootBorders.cx, + m_RootPane->getMinConstrainVert() + nDiffVert + 2*m_sizeRootBorders.cy); + + int maxWidth = m_RootPane->getMaxConstrainHorz(); + int maxHeight = m_RootPane->getMaxConstrainVert(); + + if( maxWidth != -1 ) { + lpMMI->ptMaxTrackSize.x = maxWidth + nDiffHorz + 2*m_sizeRootBorders.cx; + lpMMI->ptMaxSize.x = maxWidth + nDiffHorz + 2*m_sizeRootBorders.cx; + } + + if( maxHeight != -1 ) { + lpMMI->ptMaxTrackSize.y = maxHeight + nDiffVert + 2*m_sizeRootBorders.cy; + lpMMI->ptMaxSize.y = maxHeight + nDiffVert + 2*m_sizeRootBorders.cy; + } + } + } +} + + +CRect ETSLayoutDialog::GetRect() +{ + CRect r; + GetClientRect(r); + + if( m_bGripper ) + { + if( ::IsWindow(m_StatusBar.GetSafeHwnd()) ) + { + CRect rcSizeIcon; + m_StatusBar.GetWindowRect( rcSizeIcon); + r.bottom -= (rcSizeIcon.Height() - m_sizeRootBorders.cy - 5); + } + } + + return r; +} + + +BOOL ETSLayoutDialog::OnInitDialog() +{ + CBaseDialog::OnInitDialog(); + + // Ensure that the dialog is resizable + this->ModifyStyle(0, WS_THICKFRAME); + + if(!m_strRegStore.IsEmpty()) { + Load(m_strRegStore); + } + +#ifdef _AUTO_SET_ICON + POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition(); + if(pos) { + + class ETSPseudoDocTemplate : public CDocTemplate + { + friend class ETSLayoutDialog; + }; + + ETSPseudoDocTemplate* pDocT = (ETSPseudoDocTemplate*) AfxGetApp()->GetNextDocTemplate(pos); + SetIcon( AfxGetApp()->LoadIcon(pDocT->m_nIDResource) ,FALSE); + } +#endif + + // Sizing icon + if(m_bGripper) + { + if(m_StatusBar.Create(m_pWnd)) + { + m_StatusBar.SetIndicators(auIDStatusBar, sizeof(auIDStatusBar) / sizeof(UINT)); + m_StatusBar.SetWindowText(_T("")); + m_StatusBar.SetPaneStyle( 0, SBPS_STRETCH | SBPS_NOBORDERS ); + m_pWnd -> RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); + } + else + AfxMessageBox(_T("Error - Statusbar")); + + } + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void ETSLayoutDialog::OnDestroy() +{ + // Store size/position + if(!m_strRegStore.IsEmpty()) { + Save(m_strRegStore); + } + + // manually delete layout definition if object is reused + m_RootPane = 0; + + CBaseDialog::OnDestroy(); +} + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutDialog dialog + +#pragma warning(disable: 4355) +#ifdef CS_HELP +ETSLayoutDialogBar::ETSLayoutDialogBar(UINT nID ) + : CBaseDialogBar( nID ), ETSLayoutMgr( this ) +#else +ETSLayoutDialogBar::ETSLayoutDialogBar() + : ETSLayoutMgr( this ) +#endif +{ + //{{AFX_DATA_INIT(ETSLayoutDialogBar) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_bInitialized = false; + setRootBorders(0,0); +} +#pragma warning(default: 4355) + +BEGIN_MESSAGE_MAP(ETSLayoutDialogBar, CBaseDialogBar) + //{{AFX_MSG_MAP(ETSLayoutDialogBar) + ON_WM_SIZE() + ON_WM_GETMINMAXINFO() + ON_WM_DESTROY() + ON_WM_ERASEBKGND() + ON_MESSAGE(WM_INITDIALOG, OnInitDialog) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutDialogBar message handlers + +LRESULT ETSLayoutDialogBar::OnInitDialog(WPARAM, LPARAM) +{ + Default(); + Initialize(); + return TRUE; +} + +void ETSLayoutDialogBar::UpdateLayout() +{ + ETSLayoutMgr::UpdateLayout(); + + if(m_RootPane.IsValid()) { + CRect rcClient = GetRect(); + + CRect rcWnd; + GetWindowRect(rcWnd); + + // How much do Window and Client differ + CSize sizeDiff( rcWnd.Width() - rcClient.Width(), rcWnd.Height() - rcClient.Height()); + + // Take into account that there is a border around the rootPane +// m_szMin = CSize(m_RootPane->getMinConstrainHorz() + sizeDiff.cx + 2*m_sizeRootBorders.cx, +// m_RootPane->getMinConstrainVert() + sizeDiff.cy + 2*m_sizeRootBorders.cy); + } +} + +CSize ETSLayoutDialogBar::CalcDynamicLayout(int nLength, DWORD dwMode) +{ + CSize sizeRet = CBaseDialogBar::CalcDynamicLayout(nLength, dwMode); + + CSize sizeMin = sizeRet; + CSize sizeMax = sizeRet; + + if(m_RootPane.IsValid()) { + CRect rcClient = GetRect(); + + CRect rcWnd; + GetWindowRect(rcWnd); + + // How much do Window and Client differ + CSize sizeDiff( rcWnd.Width() - rcClient.Width(), rcWnd.Height() - rcClient.Height()); + + // Take into account that there is a border around the rootPane +// sizeMin = CSize(m_RootPane->getMinConstrainHorz() + sizeDiff.cx + 2*m_sizeRootBorders.cx, +// m_RootPane->getMinConstrainVert() + sizeDiff.cy + 2*m_sizeRootBorders.cy); + + + int maxWidth = m_RootPane->getMaxConstrainHorz(); + int maxHeight = m_RootPane->getMaxConstrainVert(); + + if( maxWidth != -1 ) { + sizeMax.cx = maxWidth + sizeDiff.cy + 2*m_sizeRootBorders.cx; + } + + if( maxHeight != -1 ) { + sizeMax.cy = maxHeight + sizeDiff.cy + 2*m_sizeRootBorders.cy; + } + } + + if( IsFloating() || !(dwMode&LM_HORZ)) + { + sizeRet.cx = min( sizeRet.cx, sizeMax.cx ); + } + if( IsFloating() || (dwMode&LM_HORZ)) + { + sizeRet.cy = min( sizeRet.cy, sizeMax.cy ); + } + + sizeRet.cx = max( sizeRet.cx, sizeMin.cx ); + sizeRet.cy = max( sizeRet.cy, sizeMin.cy ); + + return sizeRet; +} + +BOOL ETSLayoutDialogBar::OnEraseBkgnd(CDC* pDC) +{ + EraseBkgnd(pDC); + return true; +} + + +void ETSLayoutDialogBar::OnSize(UINT nType, int cx, int cy) +{ + CBaseDialogBar::OnSize(nType, cx, cy); + + if( abs(cx) + abs(cy) > 0) + { + // Re-Layout all controls + UpdateLayout(); + } + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); + +} + + +CRect ETSLayoutDialogBar::GetRect() +{ + CRect r; + GetClientRect(r); + + if( IsFloating() ) + r.DeflateRect(4,4); + + return r; +} + + +void ETSLayoutDialogBar::OnDestroy() +{ + // Store size/position on your own! + CBaseDialogBar::OnDestroy(); +} + + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutFormView dialog + +IMPLEMENT_DYNAMIC(ETSLayoutFormView, CFormView) + +#pragma warning(disable: 4355) +ETSLayoutFormView::ETSLayoutFormView(UINT nID, LPCTSTR strName /*=NULL*/) + : CBaseFormView(nID), ETSLayoutMgr( this ) +{ + if(strName) + m_strRegStore = strName; +} +#pragma warning(default: 4355) + +BEGIN_MESSAGE_MAP(ETSLayoutFormView, CBaseFormView) + //{{AFX_MSG_MAP(ETSLayoutFormView) + ON_WM_SIZE() + ON_WM_GETMINMAXINFO() + ON_WM_ERASEBKGND() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutFormView message handlers + +BOOL ETSLayoutFormView::OnEraseBkgnd(CDC* pDC) +{ + EraseBkgnd(pDC); + return true; +} + + +void ETSLayoutFormView::OnSize(UINT nType, int cx, int cy) +{ +// CBaseFormView::OnSize(nType, cx, cy); + SetScrollSizes(MM_TEXT, CSize(cx,cy)); + if( abs(cx) + abs(cy) > 0) { + // Re-Layout all controls + UpdateLayout(); + } +// MoveWindow(0,0,cx,cy); +} + +/* +void ETSLayoutFormView::UpdateLayout() +{ + ETSLayoutMgr::UpdateLayout(); + + if(m_RootPane.IsValid()) { + // Force MainFrame to re-layout + CFrameWnd* pFrame = static_cast(GetParent()); + if(pFrame) { + + CRect rcWnd; + pFrame->GetWindowRect(rcWnd); + pFrame->MoveWindow(rcWnd); + pFrame->RecalcLayout(); + + } + return; + } +} +*/ + +void ETSLayoutFormView::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) +{ + // To use this you'll have to modify your CMainFrame: + // + // 1) Add a handler for WM_GETMINMAXINFO() + // 2) Let this handler be: + // void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) + // { + // CFrameWnd::OnGetMinMaxInfo(lpMMI); + // + // if( GetActiveView() && GetActiveView()->IsKindOf( RUNTIME_CLASS(ETSLayoutFormView) ) ) { + // GetActiveView()->SendMessage( WM_GETMINMAXINFO, 0, (LPARAM) lpMMI ); + // } + // } + // 3) Add "#include "dialogmgr.h" to MainFrm.cpp + + if(m_RootPane.IsValid()) { + CRect rcClient = GetRect(); + + CRect rcWnd; + GetParent()->GetWindowRect(rcWnd); + + // How much do Window and Client differ + rcWnd-=rcClient; + + // Take into account that there is a border around the rootPane + lpMMI->ptMinTrackSize = CPoint(m_RootPane->getMinConstrainHorz() + rcWnd.Width() + 2*m_sizeRootBorders.cx, + m_RootPane->getMinConstrainVert() + rcWnd.Height() + 2*m_sizeRootBorders.cy); + + int maxWidth = m_RootPane->getMaxConstrainHorz(); + int maxHeight = m_RootPane->getMaxConstrainVert(); + + if( maxWidth != -1 ) { + lpMMI->ptMaxTrackSize.x = maxWidth + rcWnd.Width()+ 2*m_sizeRootBorders.cx; + lpMMI->ptMaxSize.x = maxWidth + rcWnd.Width()+ 2*m_sizeRootBorders.cx; + } + + if( maxHeight != -1 ) { + lpMMI->ptMaxTrackSize.y = maxHeight + rcWnd.Height() + 2*m_sizeRootBorders.cy; + lpMMI->ptMaxSize.y = maxHeight + rcWnd.Height() + 2*m_sizeRootBorders.cy; + } + } +} + +ETSLayoutFormView::~ETSLayoutFormView() +{ + // Cleanup +} + + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutPropertyPage + +#ifdef CS_HELP + IMPLEMENT_DYNCREATE(ETSLayoutPropertyPage, ETSCSHelpPropPage) +#else + IMPLEMENT_DYNCREATE(ETSLayoutPropertyPage, CPropertyPage) +#endif + +#pragma warning(disable: 4355) +ETSLayoutPropertyPage::ETSLayoutPropertyPage( ) : ETSLayoutMgr( this ) +{ + m_bLockMove = false; + m_bResetBuddyOnNextTimeVisible = true; +} + +ETSLayoutPropertyPage::ETSLayoutPropertyPage( UINT nIDTemplate, UINT nIDCaption /*= 0*/ ) + : CBasePropertyPage(nIDTemplate, nIDCaption), ETSLayoutMgr( this ) +{ + m_bLockMove = false; + m_bResetBuddyOnNextTimeVisible = true; +} + +ETSLayoutPropertyPage::ETSLayoutPropertyPage( LPCTSTR lpszTemplateName, UINT nIDCaption /*= 0*/ ) + : CBasePropertyPage(lpszTemplateName, nIDCaption), ETSLayoutMgr( this ) +{ + m_bLockMove = false; + m_bResetBuddyOnNextTimeVisible = true; +} +#pragma warning(default: 4355) + +ETSLayoutPropertyPage::~ETSLayoutPropertyPage() +{ +} + + +BEGIN_MESSAGE_MAP(ETSLayoutPropertyPage, CBasePropertyPage) + //{{AFX_MSG_MAP(ETSLayoutPropertyPage) + ON_WM_SIZE() + ON_WM_GETMINMAXINFO() + ON_WM_ERASEBKGND() + ON_WM_WINDOWPOSCHANGING() + ON_WM_DESTROY() + ON_WM_WINDOWPOSCHANGED() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// Behandlungsroutinen fr Nachrichten ETSLayoutPropertyPage + + + +void ETSLayoutPropertyPage::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) +{ + CBasePropertyPage::OnWindowPosChanged(lpwndpos); + + // This code is needed in order to reset the buddy after this page has + // been activated. At least on Win2k this is not done thru normal resizing, + // as the page is not visible when first layouted. And without the page + // being visible it's not possible to tell if the attached buddy is visible + // or not (at least I don't know any way to do so) + + if( ::IsWindowVisible( GetWnd()->GetSafeHwnd() ) ) + { + if( m_bResetBuddyOnNextTimeVisible ) + { + // Take special care of SpinButtons (Up-Down Controls) with Buddy set, enumerate + // all childs: + CWnd* pWndChild = GetWnd()->GetWindow(GW_CHILD); + TCHAR szClassName[ MAX_PATH ]; + while(pWndChild) + { + ::GetClassName( pWndChild->GetSafeHwnd(), szClassName, MAX_PATH ); + DWORD dwStyle = pWndChild->GetStyle(); + + // is it a SpinButton? + if( _tcscmp(szClassName, UPDOWN_CLASS)==0 && ::IsWindowVisible(pWndChild->GetSafeHwnd()) ) { + HWND hwndBuddy = (HWND)::SendMessage( pWndChild->GetSafeHwnd(), UDM_GETBUDDY, 0, 0); + if( hwndBuddy != 0 && (dwStyle&(UDS_ALIGNRIGHT|UDS_ALIGNLEFT)) != 0 ) + { + // reset Buddy + ::SendMessage( pWndChild->GetSafeHwnd(), UDM_SETBUDDY, (WPARAM)hwndBuddy, 0); + } + } + + + pWndChild = pWndChild->GetWindow(GW_HWNDNEXT); + } + + m_bResetBuddyOnNextTimeVisible = false; + } + } + else + { + // has been hidden again + m_bResetBuddyOnNextTimeVisible = true; + } +} + +void ETSLayoutPropertyPage::OnWindowPosChanging( WINDOWPOS* lpwndpos ) +{ + // In WizardMode the System calls SetWindowPos with the + // original size at every activation. This could cause + // some flicker in certain circumstances. Therefore we lock + // moving the page and unlock it only if _we_ move the page + if( m_bLockMove) + { + lpwndpos->flags |= SWP_NOMOVE | SWP_NOSIZE; + } + CBasePropertyPage::OnWindowPosChanging( lpwndpos ); +} + +BOOL ETSLayoutPropertyPage::OnEraseBkgnd(CDC* pDC) +{ + EraseBkgnd(pDC); + return true; +} + +void ETSLayoutPropertyPage::OnDestroy() +{ + // manually delete layout definition if object is reused + m_RootPane = 0; + + CBasePropertyPage::OnDestroy(); +} + +void ETSLayoutPropertyPage::OnSize(UINT nType, int cx, int cy) +{ + CBasePropertyPage::OnSize(nType, cx, cy); + + if( abs(cx) + abs(cy) > 0) + { + // Re-Layout all controls + UpdateLayout(); + } +} + +void ETSLayoutPropertyPage::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) +{ + if(m_RootPane.IsValid()) { + CRect rcClient = GetRect(); + + CRect rcWnd; + GetWindowRect(rcWnd); + + // How much do Window and Client differ + int nDiffHorz = rcWnd.Width() - rcClient.Width(); + int nDiffVert = rcWnd.Height() - rcClient.Height(); + + // Take into account that there is a border around the rootPane + lpMMI->ptMinTrackSize = CPoint(m_RootPane->getMinConstrainHorz() + nDiffHorz + 2*m_sizeRootBorders.cx, + m_RootPane->getMinConstrainVert() + nDiffVert + 2*m_sizeRootBorders.cy); + + int maxWidth = m_RootPane->getMaxConstrainHorz(); + int maxHeight = m_RootPane->getMaxConstrainVert(); + + if( maxWidth != -1 ) { + lpMMI->ptMaxTrackSize.x = maxWidth + nDiffHorz + 2*m_sizeRootBorders.cx; + lpMMI->ptMaxSize.x = maxWidth + nDiffHorz + 2*m_sizeRootBorders.cx; + } + + if( maxHeight != -1 ) { + lpMMI->ptMaxTrackSize.y = maxHeight + nDiffVert + 2*m_sizeRootBorders.cy; + lpMMI->ptMaxSize.y = maxHeight + nDiffVert + 2*m_sizeRootBorders.cy; + } + } +} + + +CRect ETSLayoutPropertyPage::GetRect() +{ + CRect r; + GetClientRect(r); + return r; +} + + +BOOL ETSLayoutPropertyPage::OnInitDialog() +{ + CBasePropertyPage::OnInitDialog(); + UpdateLayout(); + + ETSLayoutPropertySheet* pSheet = (ETSLayoutPropertySheet*) GetParent(); + + ASSERT_KINDOF( ETSLayoutPropertySheet, pSheet); + if(pSheet) + { + if(pSheet->IsWizard()) + { + m_bLockMove = true; + } + } + + return TRUE; +} + +BOOL ETSLayoutPropertyPage::OnSetActive() +{ + ETSLayoutPropertySheet* pSheet = (ETSLayoutPropertySheet*) GetParent(); + + ASSERT_KINDOF( ETSLayoutPropertySheet, pSheet); + if(pSheet) + { + if(pSheet->IsWizard()) + { + // In WizardMode the System calls SetWindowPos with the + // original size on Page Activation. This will position the + // page at the correct position + m_bLockMove = false; + MoveWindow(pSheet->m_rcPage); + m_bLockMove = true; + } + } + + UpdateLayout(); + + return CBasePropertyPage::OnSetActive(); +} + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutPropertySheet + +IMPLEMENT_DYNAMIC(ETSLayoutPropertySheet, CPropertySheet) + +#pragma warning(disable: 4355) +ETSLayoutPropertySheet::ETSLayoutPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage, + LPCTSTR strName /*=NULL*/, bool bGripper/*=true*/) + : CPropertySheet(nIDCaption, pParentWnd, iSelectPage), ETSLayoutMgr( this ) +{ + Init(strName, bGripper); +} + +ETSLayoutPropertySheet::ETSLayoutPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, + LPCTSTR strName /*=NULL*/, bool bGripper/*=true*/) + : CPropertySheet(pszCaption, pParentWnd, iSelectPage), ETSLayoutMgr( this ) +{ + Init(strName, bGripper); +} +#pragma warning(default: 4355) + +void ETSLayoutPropertySheet::Init(LPCTSTR strName, bool bGripper) +{ + m_bGripper = bGripper; + if(strName) + m_strRegStore = strName; + + m_bAutoDestroy = false; + m_bAutoDestroyPages = false; + m_bModelessButtons = false; +} + +ETSLayoutPropertySheet::~ETSLayoutPropertySheet() +{ +} + + +BEGIN_MESSAGE_MAP(ETSLayoutPropertySheet, CPropertySheet) + //{{AFX_MSG_MAP(ETSLayoutPropertySheet) + ON_WM_CREATE() + ON_WM_SIZE() + ON_WM_GETMINMAXINFO() + ON_WM_DESTROY() + ON_WM_ERASEBKGND() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// Behandlungsroutinen fr Nachrichten ETSLayoutPropertySheet + +BOOL ETSLayoutPropertySheet::OnEraseBkgnd(CDC* pDC) +{ + EraseBkgnd(pDC); + return true; +} + + +int ETSLayoutPropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (CPropertySheet::OnCreate(lpCreateStruct) == -1) + return -1; + + ModifyStyle(0,WS_THICKFRAME| WS_SYSMENU); + return 0; +} + + +void ETSLayoutPropertySheet::Resize(int cx, int cy) +{ + if( abs(cx) + abs(cy) > 0 && m_RootPane.IsValid() ) + { + UpdateLayout(); + + // Fix for PSH_WIZARDHASFINISH [Thmmi] + if (IsWizard() && !(m_psh.dwFlags & PSH_WIZARDHASFINISH) ) + { + // manual reposition of the FINISH button + // can not be done with normaly layouting because it + // shares position with the NEXT button + CWnd *pWndFinish; + pWndFinish=GetDlgItem(ID_WIZFINISH); + + if(pWndFinish) + { + CRect rcWnd; + GetDlgItem(ID_WIZNEXT)->GetWindowRect(&rcWnd); + ScreenToClient(&rcWnd); + pWndFinish->MoveWindow(rcWnd); + pWndFinish->RedrawWindow(0,0, RDW_INVALIDATE | RDW_UPDATENOW ); + } + } + + // reposition Gripper + if(m_bGripper) + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); + + CPropertyPage* pPage = (CPropertyPage*)GetActivePage(); + + if(pPage) + { + CRect rcWnd; + GetTabControl()->GetWindowRect(&rcWnd); + ScreenToClient(&rcWnd); + + if(!IsWizard()) { + // get inside of tab + GetTabControl()->AdjustRect(FALSE, &rcWnd); + } + else + { + rcWnd.bottom += 5; + } + + // we need this size in WizardMode in order to + // reposition newly activated page correctly + m_rcPage = rcWnd; + + if( IsWizard() && pPage->IsKindOf(RUNTIME_CLASS(ETSLayoutPropertyPage)) ) + { + ETSLayoutPropertyPage* pEtsPage = reinterpret_cast(pPage); + + pEtsPage->m_bLockMove = false; + pEtsPage->MoveWindow(m_rcPage); + pEtsPage->m_bLockMove = true; + } + else + { + pPage->MoveWindow(m_rcPage); + } + + } + + if(IsWindowVisible()) + { + RedrawWindow(0,0, RDW_INVALIDATE|RDW_UPDATENOW ); + + if(!IsWizard()) + GetTabControl()->RedrawWindow(0,0, RDW_INVALIDATE|RDW_UPDATENOW ); + } + } +} + +void ETSLayoutPropertySheet::OnSize(UINT nType, int cx, int cy) +{ + CPropertySheet::OnSize(nType, cx, cy); + Resize(cx,cy); +} + +// IDs of all PropertySheet controls +long _PropertySheetIDs[] = +{ + ID_WIZBACK, + ID_WIZNEXT, + ID_WIZFINISH, + IDOK, + IDCANCEL, + ID_APPLY_NOW, + IDHELP +}; + +void ETSLayoutPropertySheet::AddMainArea(CPane paneRoot, CPaneBase itemTab) +{ + // the default is: Whole main Area is covered by the TabCtrl + paneRoot << itemTab; +} + +void ETSLayoutPropertySheet::AddButtons(CPane paneBottom) +{ + // first item greedy to keep others right + paneBottom->addItem (paneNull, GREEDY); + + + // add all Controls to the layouting + bool bFirst = true; + for(int i = 0; i < (sizeof(_PropertySheetIDs) / sizeof(long)) ; i++) + { + // Prevent movement of finish button, if it is not shown explicitly [Thmmi] + if( IsWizard() + && _PropertySheetIDs[i] == ID_WIZFINISH + && !(m_psh.dwFlags & PSH_WIZARDHASFINISH) ) + { + continue; + } + + CWnd* pWnd = GetDlgItem(_PropertySheetIDs[i]); + + if(pWnd) + { + + if(!(m_psh.dwFlags & PSH_HASHELP) && _PropertySheetIDs[i] == IDHELP) + { + // don't insert + continue; + } + + if((m_psh.dwFlags & PSH_NOAPPLYNOW) && _PropertySheetIDs[i] == ID_APPLY_NOW) + { + // don't insert + continue; + } + + // space before first one and between BACK & NEXT + if( IsWizard() ) + { + if( !bFirst && !(_PropertySheetIDs[i]==ID_WIZNEXT) ) + { + paneBottom->addItem(paneNull, NORESIZE,12,0,0,0); + } + } + + pWnd->ShowWindow(true); + paneBottom->addItem(_PropertySheetIDs[i], NORESIZE); + bFirst = false; + } + } + +} + +BOOL ETSLayoutPropertySheet::OnInitDialog() +{ + BOOL bRet = CPropertySheet::OnInitDialog(); + + ASSERT(!m_RootPane); + + // Save initial rect + GetWindowRect(&m_rcStart); + + CPropertyPage* pPage = CPropertySheet::GetActivePage(); + ASSERT(pPage); + + CRect rcPage; + pPage->GetClientRect(&rcPage); + + CreateRoot(VERTICAL); + ASSERT(m_RootPane.IsValid()); + + // Add Tabcontrol to root pane + m_ItemTab = item( GetTabControl(), GREEDY, 0, 0, 0, 0); + AddMainArea(m_RootPane, m_ItemTab); + + // Tabcontrol is invisible in WizardMode + if(IsWizard()) + { + GetTabControl()->ShowWindow(false); + } + + // add horizontal line in WizardMode + if(IsWizard() && GetDlgItem(ID_WIZFINISH+1)) + { + m_RootPane << item(ID_WIZFINISH+1, ABSOLUTE_VERT, 0, 0, 0, 0); + } + + if( IsWizard() || !m_bModeless || m_bModelessButtons ) + { + // No spaces in WizardMode in order to keep BACK & NEXT together + CPane bottomPane = pane(HORIZONTAL, ABSOLUTE_VERT, IsWizard() ? 0 : 5); + + AddButtons(bottomPane); + // add bottom (button) pane if any controls were added + if(bottomPane->m_paneItems.GetSize() > 0) { + m_RootPane << bottomPane; + } + } + + + + // some Space between Buttons und Gripper + if(m_bGripper) + { + m_RootPane->addItem(paneNull, ABSOLUTE_VERT,0,2); + + if(m_StatusBar.Create(m_pWnd)) + { + m_StatusBar.SetIndicators(auIDStatusBar, + sizeof(auIDStatusBar) / sizeof(UINT)); + m_StatusBar.SetWindowText(_T("")); + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); + } + else + { + AfxMessageBox(_T("Error - Statusbar")); + } + } + + if(!m_strRegStore.IsEmpty()) + { + Load(m_strRegStore); + } + + Resize(1,1); // Fix. for 95/98/NT difference + + CRect rcWnd; + GetWindowRect( & rcWnd ); + MoveWindow( rcWnd ); + + return bRet; +} + + +void ETSLayoutPropertySheet::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) +{ + if(m_RootPane.IsValid() && GetTabControl() != 0 ) + { + CRect rcWnd; + GetWindowRect(rcWnd); + + CRect rcClient = GetRect(); + rcWnd-=rcClient; + + // ask for MinMax of all pages + CSize sizePageMax(0,0); + CSize sizePageMin(0,0); + for( int nPage=0; nPageGetSafeHwnd()) ) + { + pPage->SendMessage(WM_GETMINMAXINFO, 0, (LPARAM) &mmi); + + if(mmi.ptMaxTrackSize.x != 0) + { + sizePageMax.cx = min(sizePageMax.cx, mmi.ptMaxTrackSize.x); + } + if(mmi.ptMaxTrackSize.y != 0) + { + sizePageMax.cy = min(sizePageMax.cy, mmi.ptMaxTrackSize.y); + } + if(mmi.ptMinTrackSize.x != 0) + { + sizePageMin.cx = max(sizePageMin.cx, mmi.ptMinTrackSize.x); + } + if(mmi.ptMinTrackSize.y != 0) + { + sizePageMin.cy = max(sizePageMin.cy, mmi.ptMinTrackSize.y); + } + } + } + } + static_cast( m_ItemTab.GetPaneBase() )->m_sizeXMin = sizePageMin.cx; + static_cast( m_ItemTab.GetPaneBase() )->m_sizeYMin = sizePageMin.cy; + + // calculate the needed size of the tabctrl in non-wizard-mode + CRect rcItem(0,0,0,0); + if(!IsWizard()) + { + GetTabControl()->AdjustRect( TRUE, rcItem ); + } + + lpMMI->ptMinTrackSize.x = m_RootPane->getMinConstrainHorz() + rcWnd.Width() + 2*m_sizeRootBorders.cx + + rcItem.Width(); + + lpMMI->ptMinTrackSize.y = m_RootPane->getMinConstrainVert() + rcWnd.Height() + 2*m_sizeRootBorders.cy + + rcItem.Height(); + + // never smaller than inital size! + lpMMI->ptMinTrackSize.x = max(lpMMI->ptMinTrackSize.x, m_rcStart.Width() ); + lpMMI->ptMinTrackSize.y = max(lpMMI->ptMinTrackSize.y, m_rcStart.Height() ); + + // Rest like ETSLayoutMgr + + int maxWidth = m_RootPane->getMaxConstrainHorz(); + int maxHeight = m_RootPane->getMaxConstrainVert(); + + if( maxWidth != -1 ) + { + lpMMI->ptMaxSize.x = sizePageMax.cx + rcWnd.Width()+ 2*m_sizeRootBorders.cx + rcItem.Width() ; + } + + if( maxHeight != -1 ) + { + lpMMI->ptMaxSize.y = sizePageMax.cy + rcWnd.Height() + 2*m_sizeRootBorders.cy + rcItem.Width() ; + } + + lpMMI->ptMaxTrackSize = lpMMI->ptMaxSize; + + } +} + + +void ETSLayoutPropertySheet::OnDestroy() +{ + // Store size/position + if(!m_strRegStore.IsEmpty()) + { + Save(m_strRegStore); + } + m_RootPane = 0; + + CPropertySheet::OnDestroy(); +} + +void ETSLayoutPropertySheet::PostNcDestroy() +{ + if(m_bAutoDestroyPages) + { + // walk all pages and destry them + for( int nPage=0; nPageRelease(); +} + +void ETSLayoutMgr::CPaneBase::operator=( PaneBase* pPane ) +{ + if(m_pPaneHolder) + { + m_pPaneHolder->Release(); + m_pPaneHolder = 0; + } + + if( pPane != 0 ) + m_pPaneHolder = new PaneHolder( pPane ); +} + +void ETSLayoutMgr::CPaneBase::operator=( const CPaneBase& other ) +{ + ASSERT( other.m_pPaneHolder ); + + if(m_pPaneHolder) + { + m_pPaneHolder->Release(); + m_pPaneHolder = 0; + } + + other.m_pPaneHolder->AddRef(); + m_pPaneHolder = other.m_pPaneHolder; +} + +ETSLayoutMgr::PaneBase* ETSLayoutMgr::CPaneBase::operator->() const +{ + ASSERT(m_pPaneHolder); + + if(!m_pPaneHolder) + return 0; + + return (m_pPaneHolder->m_pPane); +} + + + +ETSLayoutMgr::CPane::CPane( ) +{ +} + +ETSLayoutMgr::CPane::CPane( Pane* pPane ) : ETSLayoutMgr::CPaneBase( static_cast(pPane) ) +{ +} + +ETSLayoutMgr::CPane::CPane( const CPane& other ) +{ + operator=(other); +} + +ETSLayoutMgr::CPane::~CPane() +{ +} + +void ETSLayoutMgr::CPane::operator=( Pane* pPane ) +{ + CPaneBase::operator=(pPane); +} + +void ETSLayoutMgr::CPane::operator=( const ETSLayoutMgr::CPane& other ) +{ + ASSERT( other.m_pPaneHolder ); + + if(m_pPaneHolder) + { + m_pPaneHolder->Release(); + m_pPaneHolder = 0; + } + + other.m_pPaneHolder->AddRef(); + m_pPaneHolder = other.m_pPaneHolder; +} + +ETSLayoutMgr::Pane* ETSLayoutMgr::CPane::operator->() const +{ + ASSERT(m_pPaneHolder); + + if(!m_pPaneHolder) + return 0; + + return reinterpret_cast(m_pPaneHolder->m_pPane); +} + +ETSLayoutMgr::CPaneBase ETSLayoutMgr::CPane::ConvertBase() const +{ + ASSERT(m_pPaneHolder); + return CPaneBase( m_pPaneHolder->m_pPane ); +} + +ETSLayoutMgr::CPane& ETSLayoutMgr::CPane::operator<< ( const ETSLayoutMgr::CPane pPane ) +{ + GetPane()->addPane( pPane, (ETSLayoutMgr::layResizeMode)pPane->m_modeResize, pPane->m_sizeSecondary); + return (*this); +} + +ETSLayoutMgr::CPane& ETSLayoutMgr::CPane::operator<< ( const ETSLayoutMgr::CPaneBase pItem ) +{ + GetPane()->addPane( pItem ); + return (*this); +} diff --git a/install/xbt/linux/misc/windows/ETSLayout.h b/install/xbt/linux/misc/windows/ETSLayout.h new file mode 100644 index 000000000..43d912fcc --- /dev/null +++ b/install/xbt/linux/misc/windows/ETSLayout.h @@ -0,0 +1,964 @@ +//////////////////////////////////////////// +// ___ ____ _________________ // +// / _/_ _// _______________/ // +// / _/ / / / / ___ ___ ____ // +// /__/ /_/ / / / // _/_ _/ // +// _________/ / / / // _/ / / // +// (c) 1998-2000_/ /___//_/ /_/ // +// // +//////////////////////////////////////////// +// all rights reserved // +//////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////// +// ETSLayoutDialog +// +// A class for smart layouting of Dialogs and such +// +// USAGE: See LayoutMgr.html +// +// AUTHOR: Erwin Tratar +// +// DISCLAIMER: +// +// This Sourcecode and all accompaning material is 1998-1999 Erwin Tratar. +// All rights reserved. +// +// The source code may be used in compiled form in any way you desire +// (including usage in commercial applications), providing that your +// application adds essential code (i.e. it is not only a wrapper) to the +// functionality found here +// +// Redistribution of the sourcecode itself, publication in any media or +// inclusion in a library requires the authors expressed written consent. +// You may not sale this code for profit. +// +// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. USE IT +// AT YOUR OWN RISK! THE AUTHOR ACCEPTS NO LIABILITY FOR ANY DAMAGE/LOSS OF +// BUSINESS THAT THIS PRODUCT MAY CAUSE. + + +#if !defined(ETS_LAYOUTMGR_INCLUDED_) +#define ETS_LAYOUTMGR_INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 +// DialogMgr.h : header file +// + +namespace ETSLayout +{ + +#ifdef CS_HELP + typedef ETSCSHelpDialog CBaseDialog; + typedef ETSCSHelpFormView CBaseFormView; + typedef ETSCSHelpDlgBar CBaseDialogBar; + typedef ETSCSHelpPropPage CBasePropertyPage; +#else + typedef CDialog CBaseDialog; + typedef CFormView CBaseFormView; + typedef CDialogBar CBaseDialogBar; + typedef CPropertyPage CBasePropertyPage; +#endif +} + +// Support for CBCGDialogBar instead of CDialogBar available: +// you just have to change the typedef to CBaseDialogBar + +#ifndef ETSGUI_EXT_CLASS +#define ETSGUI_EXT_CLASS +#endif + +#include + +// Support for CBCGDialogBar instead of CDialogBar + +/** + * Controls whether the Icon is automatically set to IDR_MAINFRAME + */ +#define _AUTO_SET_ICON + +/** + * Forward class declarations + */ +class ETSLayoutDialog; +class ETSLayoutDialogBar; +class ETSLayoutFormView; +class ETSLayoutMgr; +class ETSLayoutPropertyPage; +class ETSLayoutPropertySheet; + + +/** + * These are NOOPs now + */ +#define DECLARE_LAYOUT() +#define IMPLEMENT_LAYOUT() + +/** + * This is the default border size between the panes. You + * may override it in Pane constructor, but it is the + * fixed border around the root pane + */ +const int nDefaultBorder = 5; + +/** + * The minimum size for not ABSOLUTE_XXX items + */ +const int nMinConstrain = 5; + +class ETSGUI_EXT_CLASS ETSLayoutMgr +{ +public: + + enum layResizeMode { + GREEDY = 0, // Will eat up as much as it can + ABSOLUTE_HORZ = 1 << 0, // Horizontal size is absolute + RELATIVE_HORZ = 1 << 1, // Horizontal size in percent + ABSOLUTE_VERT = 1 << 2, // Vertical size is absolute + RELATIVE_VERT = 1 << 3, // Vertical size in percent + + NORESIZE = ABSOLUTE_HORZ | ABSOLUTE_VERT, + + SIZE_MASK = NORESIZE, + + ALIGN_LEFT = 1 << 4, // following only for NORESIZE + ALIGN_RIGHT = 1 << 5, + ALIGN_TOP = 1 << 6, + ALIGN_BOTTOM = 1 << 7, + + ALIGN_HCENTER = ALIGN_LEFT | ALIGN_RIGHT, + ALIGN_VCENTER = ALIGN_TOP | ALIGN_BOTTOM, + + ALIGN_CENTER = ALIGN_HCENTER | ALIGN_VCENTER, + + ALIGN_FILL_HORZ = 1 << 8, + ALIGN_FILL_VERT = 1 << 9, + ALIGN_FILL = ALIGN_FILL_HORZ | ALIGN_FILL_VERT, + +/* TRACKER_LEFT = 1 << 10, // not yet. May allow tracking of borders + TRACKER_RIGHT = 1 << 11, // between items in the future + TRACKER_TOP = 1 << 12, + TRACKER_BOTTOM = 1 << 13, +*/ + }; + + enum layOrientation { + HORIZONTAL, + VERTICAL + }; + + /** + * This is the base class for all kind of panes. + */ + class ETSGUI_EXT_CLASS PaneBase { + friend class ETSLayoutMgr; + friend class CPaneBase; + friend class CPane; + + public: + + /** + * Informs the caller how much of the given space this pane would + * like to receive in horizontal direction + */ + virtual int getConstrainHorz(int sizeParent) = 0; + + + /** + * Informs the caller how much of the given space this pane would + * like to receive in vertical direction + */ + virtual int getConstrainVert(int sizeParent) = 0; + + /** + * Informs the caller how much of the given space this pane + * minimally need. This would be an absolute Value if + * the mode contains ABSOLUTE_HORZ or an explicit minimum + * value, else nMinConstrain + */ + virtual int getMinConstrainHorz() = 0; + /** + * Informs the caller if there is an restriction for maximum + * space this pane needs. Return -1 for unrestricted (GREEDY + * or RELATIVE) + */ + virtual int getMaxConstrainHorz() = 0; + + /** + * Informs the caller how much of the given space this pane + * minimally need. This would be an absolute Value if + * the mode contains ABSOLUTE_VERT or an explicit minimum + * value, else nMinConstrain + */ + virtual int getMinConstrainVert() = 0; + + /** + * Informs the caller if there is an restriction for maximum + * space this pane needs. Return -1 for unrestricted (GREEDY + * or RELATIVE) + */ + virtual int getMaxConstrainVert() = 0; + + /** + * This will do the actual resize operation after the + * caller computed a new area for this pane + */ + virtual bool resizeTo(CRect& rcNewArea) = 0; + + /** + * Constructor needed pointer to LayoutManager + */ + PaneBase( ETSLayoutMgr* pMgr ) { m_pMgr = pMgr; }; + + /** + * Virtual destructor needed in Container operations + */ + virtual ~PaneBase() {}; + + /** + * Returs the Resize Mode of this pane + */ + DWORD modeResize() { return m_modeResize; }; + + protected: + /** + * How this Item will be resized, a combination of the flags above + */ + DWORD m_modeResize; + + /** + * A pointer to the holding LayoutManager derivate + */ + ETSLayoutMgr* m_pMgr; + }; + + /** + * CPaneBase represents an autopointer to a PaneBase. Use this and you won't have to worry + * about cleaning up any Panes. Also this autopointer lets you return Pane objects + * from function without using pointers (at least you won't see them :) ) + */ + struct ETSGUI_EXT_CLASS PaneHolder + { + PaneHolder(PaneBase* pPane ); + ~PaneHolder(); + + void AddRef(); + void Release(); + + PaneBase* m_pPane; + long m_nRefCount; + }; + + class ETSGUI_EXT_CLASS CPaneBase + { + protected: + PaneHolder* m_pPaneHolder; + + public: + // Standardconstructor + CPaneBase( ); + CPaneBase( PaneBase* pPane ); + CPaneBase( const CPaneBase& other ); + + ~CPaneBase(); + + void operator=( PaneBase* pPane ); + void operator=( const CPaneBase& other ); + PaneBase* operator->() const; + PaneBase* GetPaneBase() { return operator->(); } + + bool IsValid() { return (m_pPaneHolder != 0); } + bool operator !() { return (m_pPaneHolder == 0); } + + }; + + class Pane; + class ETSGUI_EXT_CLASS CPane : public CPaneBase + { + public: + // Standardconstructor + CPane( ); + CPane( Pane* pPane ); + CPane( const CPane& other ); + + ~CPane(); + + void operator=( Pane* pPane ); + void operator=( const CPane& other ); + Pane* operator->() const; + Pane* GetPane() { return operator->(); } + + CPaneBase ConvertBase() const; + + CPane& operator<< ( const CPane pPane ); + CPane& operator<< ( const CPaneBase pItem ); + }; + + + + /** + * PaneItem represents a single control + */ + class ETSGUI_EXT_CLASS PaneItem : public PaneBase { + friend class ETSLayoutMgr; + friend class Pane; + protected: + /** + * Creates a new PaneItem from an Control. If sizeX or sizeY are 0 + * and modeResize is ABSOLUTE will copy the current dimensions of + * the control to m_sizeX/Y. So the appearance does not change + * from the Dialog Editor + */ + PaneItem( CWnd* pWnd, ETSLayoutMgr* pMgr, layResizeMode modeResize = GREEDY, int sizeX=0, int sizeY=0, int sizeXMin=0, int sizeYMin=0); + + /** + * If your control is not mapped you can name it by its ChildID. Pass + * the pMgr to receive the CWnd* of nID. + * The rest as stated above + */ + PaneItem( UINT nID, ETSLayoutMgr* pMgr, layResizeMode modeResize = GREEDY, int sizeX=0, int sizeY=0, int sizeXMin=0, int sizeYMin=0); + + + public: + /** + * see PaneBase + */ + virtual int getConstrainHorz(int sizeParent); + virtual int getConstrainVert(int sizeParent); + virtual int getMinConstrainHorz(); + virtual int getMinConstrainVert(); + virtual int getMaxConstrainHorz(); + virtual int getMaxConstrainVert(); + virtual bool resizeTo(CRect& rcNewArea); + + bool isDummy() { return (m_hwndCtrl == 0); } + + protected: + friend class ETSLayoutPropertySheet; + + /** + * The horizontal size of the control (see m_modeResize) + */ + int m_sizeX; + int m_sizeXMin; + + /** + * The vertical size of the control (see m_modeResize) + */ + int m_sizeY; + int m_sizeYMin; + + /** + * Child Control pointer + */ + HWND m_hwndCtrl; + + /** + * Combo box needs special treatment + */ + bool m_bComboSpecial; + }; + + + /** + * This class encapsulates a Subpane (and indeed the root Pane too) + * it is a container of PaneBase* which it will recursivly resize + */ + class ETSGUI_EXT_CLASS Pane : public PaneBase { + friend class ETSLayoutMgr; + friend class CPaneBase; + friend class CPane; + friend class ETSLayoutPropertySheet; + + protected: + /** + * Tell the pane in which direction it is positioned. A HORIZONTAL pane + * arranges it's subpanes from left to right, a VERTICAL from top to bottom + */ + Pane( ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0 ); + + public: + /** + * If your control is not mapped you can name it by its ChildID. Pass + * the pMgr to receive the CWnd* of nID. + * The rest as stated above + */ + bool addItem( UINT nID, layResizeMode modeResize = GREEDY, int sizeX=0, int sizeY=0, int sizeXMin=-1, int sizeYMin=-1); + + /** + * Creates a new PaneItem from an Control. If sizeX or sizeY are 0 + * and modeResize is ABSOLUTE will copy the current dimensions of + * the control to m_sizeX/Y. So the appearance does not change + * from the Dialog Editor + */ + bool addItem( CWnd* pWnd, layResizeMode modeResize = GREEDY, int sizeX=0, int sizeY=0, int sizeXMin=-1, int sizeYMin=-1); + + + /** + * Add a whitespace Item (paneNull) of variable size with + * a minimum size of 0 + */ + bool addItemGrowing(); + + /** + * Add a whitespace Item (paneNull) with fixed size + */ + bool addItemFixed(int size); + + /** + * Add a whitespace Item (paneNull) of fixed size based on the + * current layout (as in the dialog template). Based on the layout + * of the pane vertical or horizontal spacing is considered + * + * First argument is the left (top) item for a HORIZONTAL (VERTICAL) pane + */ + bool addItemSpaceBetween( CWnd* pWndFirst, CWnd* pWndSecond ); + bool addItemSpaceBetween( UINT nIDFirst, UINT nIDSecond ); + + + /** + * Add a whitespace Item (paneNull) of fixed size based on the + * size of another item + */ + bool addItemSpaceLike( CWnd* pWnd ); + bool addItemSpaceLike( UINT nID ); + + + /** + * Add an item to the pane, appending at the end. This may be either obtained + * by a call to ETSLayoutMgr::item() or one of the ETSLayoutMgr::paneXXX() calls + */ + bool addPane( CPaneBase pItem ); + bool addPane( CPane pSubpane, layResizeMode modeResize, int sizeSecondary /* = 0 */); + + virtual int getConstrainHorz(int sizeParent); + virtual int getConstrainVert(int sizeParent); + virtual int getMinConstrainHorz(); + virtual int getMinConstrainVert(); + virtual int getMaxConstrainHorz(); + virtual int getMaxConstrainVert(); + virtual bool resizeTo(CRect& rcNewArea); + + /** + * The destructor takes care of destroying all Subpanes and items + */ + virtual ~Pane(); + + /** + * Access to the orientation of this pane + */ + layOrientation getOrientation() { return m_Orientation; }; + + + protected: + + int resizeToAbsolute(int& availSpace, CArray& sizePrimary, + CArray& sizeMin, CArray& sizeMax); + + bool resizeToRelative(int& availSpace, CArray& sizePrimary, + CArray& sizeMin, CArray& sizeMax); + + bool resizeToGreedy( int& availSpace, int nGreedy, CArray& sizePrimary, + CArray& sizeMin, CArray& sizeMax); + + /** + * The orientation of the pane. Keep in mind that all subpanes + * must have the complementary orientation, i.e. a VERTICAL + * pane must have all HORIZONTAL SubPanes (or normal Items + * of course) + */ + layOrientation m_Orientation; + + /** + * This array holds the pointers to the Items/SubPanes + */ + CArray m_paneItems; + + /** + * The secondary constrain + */ + int m_sizeSecondary; + + /** + * Size of gap between childs + */ + int m_sizeBorder; + int m_sizeExtraBorder; + }; + + + /** + * This class encapsulates a Subpane which is a Tab + * it will use calls to AdjustRect to position it's + * childs + */ + class ETSGUI_EXT_CLASS PaneTab : public Pane + { + friend class ETSLayoutMgr; + + protected: + /** + * Tell the pane in which direction it is positioned. A HORIZONTAL pane + * arranges it's subpanes from left to right, a VERTICAL from top to bottom + */ + PaneTab( CTabCtrl* pTab, ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0 ); + + public: + virtual int getConstrainHorz(int sizeParent); + virtual int getConstrainVert(int sizeParent); + virtual int getMinConstrainHorz(); + virtual int getMinConstrainVert(); + virtual int getMaxConstrainHorz(); + virtual int getMaxConstrainVert(); + virtual bool resizeTo(CRect& rcNewArea); + + private: + CTabCtrl* m_pTab; + }; + + /** + * This class encapsulates a Subpane which is a Static + * it will use calls to AdjustRect to position it's + * childs + */ + class ETSGUI_EXT_CLASS PaneCtrl : public Pane + { + friend class ETSLayoutMgr; + protected: + /** + * Tell the pane in which direction it is positioned. A HORIZONTAL pane + * arranges it's subpanes from left to right, a VERTICAL from top to bottom + */ + PaneCtrl( CWnd* pCtrl, ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0, int sizeTopExtra = 0); + PaneCtrl( UINT nID, ETSLayoutMgr* pMgr, layOrientation orientation, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0, int sizeTopExtra = 0 ); + + public: + + virtual int getConstrainHorz(int sizeParent); + virtual int getConstrainVert(int sizeParent); + virtual int getMinConstrainHorz(); + virtual int getMinConstrainVert(); + virtual int getMaxConstrainHorz(); + virtual int getMaxConstrainVert(); + virtual bool resizeTo(CRect& rcNewArea); + + private: + HWND m_hwndCtrl; + int m_sizeTopExtra; + }; + + + + + ETSLayoutMgr(CWnd* pWnd) { m_pWnd = pWnd; m_sizeRootBorders = CSize(5,5); }; + virtual ~ETSLayoutMgr(); + + virtual CRect GetRect() { CRect r; m_pWnd->GetClientRect(r); return r; }; + CWnd* m_pWnd; + CWnd* GetWnd() { return m_pWnd; }; + void setRootBorders(int cx, int cy) { m_sizeRootBorders = CSize(cx,cy); }; + + /** + * Pass this for a pseudo Pane with no content + */ + static CWnd* paneNull; + + /** + * Loads the current position and size from the registry using a supplied + * key. Will be loaded with AfxGetApp()->WriteProfileXXX(). You may + * specify a subfolder (e.g. Load( _T("MyDialog\\Layout") ); ). Will + * load the following keys: + * + * - lpstrRegKey+"SizeX"; + * - lpstrRegKey+"SizeY"; + * - lpstrRegKey+"PosX"; + * - lpstrRegKey+"PosY"; + * + * Is automatically called during OnActivate() if key specified in + * constructor. + */ + bool Load(LPCTSTR lpstrRegKey); + + /** + * Store the current position and size to the registry using a supplied + * key. Will be stored with AfxGetApp()->WriteProfileXXX(). You may + * specify a subfolder (e.g. Save( _T("MyDialog\\Layout") ); ). Will + * create the following keys: + * + * - lpstrRegKey+"SizeX"; + * - lpstrRegKey+"SizeY"; + * - lpstrRegKey+"PosX"; + * - lpstrRegKey+"PosY"; + * + * Is automatically called during DestroyWindow() if key specified in + * constructor. + */ + bool Save(LPCTSTR lpstrRegKey); + + /** + * Updates the layout after you specify the new + * layout + */ + virtual void UpdateLayout(); + virtual void UpdateLayout(CPane p) { + if(m_RootPane.IsValid()) + { + // free old root + m_RootPane = 0; + } + m_RootPane = p; + UpdateLayout(); + } + + /** + * Does the actual Layout, called from OnSize() + * Default implementation does nothing, use + * IMPLEMENT_LAYOUT in your derived class (see above) + */ + virtual void Layout(CRect& rcClient); + + + /** + * Erasing only the these parts of the client area where + * there is no child window. Extra-code for group-boxes + * included! + */ + void EraseBkgnd(CDC* pDC); + + /** + * Helperfunctions for the stream-interface. For usage see sample Application + * and/or documentation. + */ + + /** + * Create a new Pane. You may specify the resize + * mode for both directions. If you add modes for the secondary direction + * (i.e. *_VERT for a HORIZONTAL pane) then sizeSecondary is used as it's + * size. If you do not specify sizeSecondary and the mode is ABSOLUTE_VERT + * it will be computed as the maximum Height of all SubPanes (the same is + * true for VERTICAL panes and subpanes with *_HORZ) + */ + CPane pane( layOrientation orientation, layResizeMode modeResize = GREEDY, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0, int sizeSecondary = 0); + + /** + * Create one of the special control panes. Parameter are like pane(). For + * additional information see documentation + */ + CPane paneTab( CTabCtrl* pTab, layOrientation orientation, layResizeMode modeResize = GREEDY, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0, int sizeSecondary = 0); + CPane paneCtrl( UINT nID, layOrientation orientation, layResizeMode modeResize = GREEDY, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0, int sizeTopExtra = 0, int sizeSecondary = 0); + CPane paneCtrl( CWnd* pCtrl, layOrientation orientation, layResizeMode modeResize = GREEDY, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0, int sizeTopExtra = 0, int sizeSecondary = 0); + + /** + * Creates a new PaneItem for an Control. If sizeX or sizeY are 0 + * and modeResize is ABSOLUTE will copy the current dimensions of + * the control to m_sizeX/Y. So the appearance does not change + * from the Dialog Editor. size*Min = -1 means: do not make smaller + * than in Dialog Template. + */ + CPaneBase item(UINT nID, layResizeMode modeResize = GREEDY, int sizeX =0, int sizeY =0, int sizeXMin =-1, int sizeYMin =-1); + CPaneBase item(CWnd* pWnd, layResizeMode modeResize = GREEDY, int sizeX =0, int sizeY =0, int sizeXMin =-1, int sizeYMin =-1); + + + /** + * Add a whitespace Item (paneNull) of variable size with + * a minimum size of 0 + */ + CPaneBase itemGrowing(layOrientation orientation); + + /** + * Add a whitespace Item (paneNull) with fixed size + */ + CPaneBase itemFixed(layOrientation orientation, int sizePrimary); + + /** + * Add a whitespace Item (paneNull) of fixed size based on the + * current layout (as in the dialog template). Based on the layout + * of the pane vertical or horizontal spacing is considered + * + * First argument is the left (top) item for a HORIZONTAL (VERTICAL) pane + */ + CPaneBase itemSpaceBetween( layOrientation orientation, CWnd* pWndFirst, CWnd* pWndSecond ); + CPaneBase itemSpaceBetween( layOrientation orientation, UINT nIDFirst, UINT nIDSecond ); + + /** + * Add a whitespace Item (paneNull) of fixed size based on the + * size of another item + */ + CPaneBase itemSpaceLike( layOrientation orientation, CWnd* pWnd ); + CPaneBase itemSpaceLike( layOrientation orientation, UINT nID ); + +protected: + /** + * This holds the root pane. Fill in InitDialog() + */ + CPane m_RootPane; + + /** + * Create a root pane + */ + CPane CreateRoot(layOrientation orientation, int sizeBorder = nDefaultBorder, int sizeExtraBorder = 0 ) + { + if(m_RootPane.IsValid()) + { + // free old root + m_RootPane = 0; + } + m_RootPane = new Pane( this, orientation, sizeBorder, sizeExtraBorder); + return m_RootPane; + } + + /** + * Key in Registry where to store Size + */ + CString m_strRegStore; + + /** + * Borders around root + */ + CSize m_sizeRootBorders; +}; + +inline ETSLayoutMgr::layResizeMode operator|(const ETSLayoutMgr::layResizeMode m1, + const ETSLayoutMgr::layResizeMode m2) + { return (ETSLayoutMgr::layResizeMode)( (DWORD)m1|(DWORD)m2); } + + +/** + * Base class for the Layout function. Derive your own class + * from this or derive it from CDialog and modify _all_ + * references to CDialog to ETSLayoutDialog + */ +class ETSGUI_EXT_CLASS ETSLayoutDialog : public ETSLayout::CBaseDialog, protected ETSLayoutMgr +{ +// Construction +public: + ETSLayoutDialog(UINT nID, CWnd* pParent = NULL, LPCTSTR strName = NULL, bool bGripper = true); // standard constructor + +// Dialog Data + //{{AFX_DATA(ETSLayoutDialog) + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(ETSLayoutDialog) + //}}AFX_VIRTUAL + +// Implementation +protected: + // Generated message map functions + //{{AFX_MSG(ETSLayoutDialog) + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + virtual BOOL OnInitDialog(); + afx_msg void OnDestroy(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + + virtual CRect GetRect(); + + bool m_bGripper; + CStatusBar m_StatusBar; +}; + + +/** + * Base class for the Layout function. Derive your own class + * from this or derive it from CDialog and modify _all_ + * references to CFormView to ETSLayoutFormView + */ +class ETSGUI_EXT_CLASS ETSLayoutFormView : public ETSLayout::CBaseFormView, public ETSLayoutMgr +{ +// Construction + DECLARE_DYNAMIC(ETSLayoutFormView) +public: + ETSLayoutFormView(UINT nID, LPCTSTR strName = NULL); // standard constructor + virtual ~ETSLayoutFormView(); + +// virtual void UpdateLayout(); + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(ETSLayoutDialog) + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(ETSLayoutDialog) + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + + +/** + * Base class for the Layout function. Derive your own class + * from this or derive it from CBCGDialogBar/CDialogBar and + * modify _all_ references to CBCGDialogBar/CDialogBar to + * ETSLayoutDialogBar + */ +class ETSGUI_EXT_CLASS ETSLayoutDialogBar : public ETSLayout::CBaseDialogBar, protected ETSLayoutMgr +{ +// Construction +public: +#ifdef CS_HELP + ETSLayoutDialogBar(UINT nID); +#else + ETSLayoutDialogBar(); +#endif + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(ETSLayoutDialogBar) + virtual CSize CalcDynamicLayout(int nLength, DWORD dwMode); + //}}AFX_VIRTUAL + + /** + * Override this to define Layout + */ + virtual BOOL Initialize() { return false; }; + virtual void UpdateLayout(); + +// Implementation +protected: + // Generated message map functions + //{{AFX_MSG(ETSLayoutDialogBar) + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnDestroy(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + //}}AFX_MSG + LRESULT OnInitDialog(WPARAM, LPARAM); + DECLARE_MESSAGE_MAP() + + virtual CRect GetRect(); + bool m_bInitialized; +}; + + + +/************************************************** + ** ! the code is only tested for modal sheets ! ** + **************************************************/ + + +/** + * Resizable PropertySheet. Use this class standalone + * or as your base class (instead CProptertySheet) + */ +class ETSGUI_EXT_CLASS ETSLayoutPropertySheet : public CPropertySheet, protected ETSLayoutMgr +{ + DECLARE_DYNAMIC(ETSLayoutPropertySheet) + +// Construction +public: + ETSLayoutPropertySheet(UINT nIDCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0, LPCTSTR strName=NULL, bool bGripper=true); + ETSLayoutPropertySheet(LPCTSTR pszCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0, LPCTSTR strName=NULL, bool bGripper=true); + +// Operationen +public: + void SetAutoDestroy() { m_bAutoDestroy = true; } + void SetAutoDestroyPages() { m_bAutoDestroyPages = true; } + void ModelessWithButtons() { m_bModelessButtons = true; } +// Overrides + virtual void AddMainArea(CPane paneRoot, CPaneBase itemTab); + virtual void AddButtons(CPane paneBottom); + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(ETSLayoutPropertySheet) + public: + virtual BOOL OnInitDialog(); + virtual void PostNcDestroy(); + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~ETSLayoutPropertySheet(); + + // Generated message map functions +protected: + //{{AFX_MSG(ETSLayoutPropertySheet) + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); + afx_msg void OnDestroy(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + + void Resize(int cx, int cy); + +friend class ETSLayoutPropertyPage; + + void Init(LPCTSTR strName, bool bGripper); + CRect m_rcStart; + CRect m_rcPage; + bool m_bGripper; + CStatusBar m_StatusBar; + CPaneBase m_ItemTab; + bool m_bAutoDestroy; + bool m_bAutoDestroyPages; + bool m_bModelessButtons; +}; + +/** + * Base class for the Layout function. Derive your own class + * from this or derive it from CPropertyPage and + * modify _all_ references to CPropertyPage to + * ETSLayoutPropertyPage + */ +class ETSGUI_EXT_CLASS ETSLayoutPropertyPage : public ETSLayout::CBasePropertyPage, protected ETSLayoutMgr +{ +friend class ETSLayoutPropertySheet; + + DECLARE_DYNCREATE(ETSLayoutPropertyPage) + +// Konstruktion +public: + ETSLayoutPropertyPage( ); + ETSLayoutPropertyPage( UINT nIDTemplate, UINT nIDCaption = 0 ); + ETSLayoutPropertyPage( LPCTSTR lpszTemplateName, UINT nIDCaption = 0 ); + + ~ETSLayoutPropertyPage(); + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(ETSLayoutPropertyPage) + public: + virtual BOOL OnSetActive(); + //}}AFX_VIRTUAL + +// Implementation +protected: + // Generated message map functions + //{{AFX_MSG(ETSLayoutPropertyPage) + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); + virtual BOOL OnInitDialog(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + afx_msg void OnWindowPosChanging( WINDOWPOS* lpwndpos ); + afx_msg void OnDestroy(); + afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + + virtual CRect GetRect(); + bool m_bLockMove; + bool m_bResetBuddyOnNextTimeVisible; +}; + + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Developer Studio will insert additional declarations immediately before the previous line. + +#endif // !defined(ETS_LAYOUTMGR_INCLUDED_) diff --git a/install/xbt/linux/misc/windows/browse_for_directory.cpp b/install/xbt/linux/misc/windows/browse_for_directory.cpp new file mode 100644 index 000000000..04010b571 --- /dev/null +++ b/install/xbt/linux/misc/windows/browse_for_directory.cpp @@ -0,0 +1,33 @@ +#include "stdafx.h" +#include "browse_for_directory.h" + +int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + if (uMsg == BFFM_INITIALIZED) + SendMessage(hwnd, BFFM_SETSELECTION, true, lpData); + return 0; +} + +int browse_for_directory(HWND hWnd, const std::string& title, std::string& directory) +{ + BROWSEINFO bi; + ZeroMemory(&bi, sizeof(BROWSEINFO)); + bi.hwndOwner = hWnd; + bi.lpszTitle = title.c_str(); + bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS; + bi.lpfn = BrowseCallbackProc; + bi.lParam = reinterpret_cast(directory.c_str()); + ITEMIDLIST* idl = SHBrowseForFolder(&bi); + if (!idl) + return 1; + char path[MAX_PATH]; + if (!SHGetPathFromIDList(idl, path)) + *path = 0; + LPMALLOC lpm; + if (SHGetMalloc(&lpm) == NOERROR) + lpm->Free(idl); + if (!*path) + return 1; + directory = path; + return 0; +} \ No newline at end of file diff --git a/install/xbt/linux/misc/windows/browse_for_directory.h b/install/xbt/linux/misc/windows/browse_for_directory.h new file mode 100644 index 000000000..bd275bd77 --- /dev/null +++ b/install/xbt/linux/misc/windows/browse_for_directory.h @@ -0,0 +1,3 @@ +#pragma once + +int browse_for_directory(HWND, const std::string& title, std::string& directory); diff --git a/install/xbt/linux/misc/windows/nt_service.cpp b/install/xbt/linux/misc/windows/nt_service.cpp new file mode 100644 index 000000000..392f46c57 --- /dev/null +++ b/install/xbt/linux/misc/windows/nt_service.cpp @@ -0,0 +1,67 @@ +#include "stdafx.h" +#include "nt_service.h" + +#include + +int nt_service_install(const char* name) +{ + SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (!scm) + return 1; + char file_name[MAX_PATH]; + GetModuleFileName(NULL, file_name, MAX_PATH); + SC_HANDLE service = CreateService(scm, + name, + name, + SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + file_name, + NULL, + NULL, + NULL, + "NT AUTHORITY\\LocalService", + NULL); + if (!service) + { + service = CreateService(scm, + name, + name, + SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + file_name, + NULL, + NULL, + NULL, + NULL, + NULL); + } + if (!service) + { + CloseServiceHandle(scm); + return 1; + } + CloseServiceHandle(service); + CloseServiceHandle(scm); + return 0; +} + +int nt_service_uninstall(const char* name) +{ + SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (!scm) + return 1; + int result = 1; + SC_HANDLE service = OpenService(scm, name, DELETE); + if (service) + { + if (DeleteService(service)) + result = 0; + CloseServiceHandle(service); + } + CloseServiceHandle(scm); + return result; +} diff --git a/install/xbt/linux/misc/windows/nt_service.h b/install/xbt/linux/misc/windows/nt_service.h new file mode 100644 index 000000000..0102ab78f --- /dev/null +++ b/install/xbt/linux/misc/windows/nt_service.h @@ -0,0 +1,4 @@ +#pragma once + +int nt_service_install(const char* name); +int nt_service_uninstall(const char* name); diff --git a/install/xbt/linux/misc/xbt/virtual_binary.h b/install/xbt/linux/misc/xbt/virtual_binary.h new file mode 100644 index 000000000..b0d4ac09d --- /dev/null +++ b/install/xbt/linux/misc/xbt/virtual_binary.h @@ -0,0 +1,129 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +class Cvirtual_binary_source: boost::noncopyable +{ +public: + Cvirtual_binary_source(const_memory_range); + + ~Cvirtual_binary_source() + { + delete[] m_range.begin; + } + + memory_range range() + { + return m_range; + } + + void resize(size_t v) + { + assert(v <= m_range.size()); + m_range.end = m_range.begin + v; + } +private: + memory_range m_range; +}; + +class Cvirtual_binary +{ +public: + int save(const std::string&) const; + int load(const std::string&); + Cvirtual_binary& load1(const std::string&); + void clear(); + size_t read(void* d) const; + unsigned char* write_start(size_t cb_d); + void write(const_memory_range); + Cvirtual_binary(size_t); + Cvirtual_binary(const_memory_range); + + Cvirtual_binary() + { + } + + const unsigned char* begin() const + { + return range().begin; + } + + unsigned char* mutable_begin() + { + return mutable_range().begin; + } + + const unsigned char* data() const + { + return range().begin; + } + + unsigned char* data_edit() + { + return mutable_range().begin; + } + + const unsigned char* end() const + { + return range().end; + } + + unsigned char* mutable_end() + { + return mutable_range().end; + } + + const_memory_range range() const + { + return m_source ? m_source->range() : memory_range(); + } + + memory_range mutable_range() + { + if (!m_source) + return memory_range(); + if (!m_source.unique()) + m_source = boost::make_shared(range()); + return m_source->range(); + } + + bool empty() const + { + return range().empty(); + } + + size_t size() const + { + return range().size(); + } + + void resize(size_t v) + { + if (!m_source) + write_start(v); + mutable_range(); + m_source->resize(v); + } + + operator const unsigned char*() const + { + return data(); + } + + operator const_memory_range() const + { + return range(); + } + + operator memory_range() + { + return mutable_range(); + } +private: + boost::shared_ptr m_source; +}; diff --git a/install/xbt/linux/misc/xcc_z.cpp b/install/xbt/linux/misc/xcc_z.cpp new file mode 100644 index 000000000..97bb10566 --- /dev/null +++ b/install/xbt/linux/misc/xcc_z.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "xcc_z.h" + +#include +#include +#include +#include "stream_int.h" + +Cvirtual_binary xcc_z::gunzip(const_memory_range s) +{ + if (s.size() < 18) + return Cvirtual_binary(); + Cvirtual_binary d; + z_stream stream; + stream.zalloc = NULL; + stream.zfree = NULL; + stream.opaque = NULL; + stream.next_in = const_cast(s.begin) + 10; + stream.avail_in = s.size() - 18; + stream.next_out = d.write_start(read_int_le(4, s.end - 4)); + stream.avail_out = d.size(); + return stream.next_out + && Z_OK == inflateInit2(&stream, -MAX_WBITS) + && Z_STREAM_END == inflate(&stream, Z_FINISH) + && Z_OK == inflateEnd(&stream) + ? d + : Cvirtual_binary(); +} + +Cvirtual_binary xcc_z::gzip(const_memory_range s) +{ + Cvirtual_binary d; + unsigned long cb_d = s.size() + (s.size() + 999) / 1000 + 12; + unsigned char* w = d.write_start(10 + cb_d + 8); + *w++ = 0x1f; + *w++ = 0x8b; + *w++ = Z_DEFLATED; + *w++ = 0; + *w++ = 0; + *w++ = 0; + *w++ = 0; + *w++ = 0; + *w++ = 0; + *w++ = 3; + { + z_stream stream; + stream.zalloc = NULL; + stream.zfree = NULL; + stream.opaque = NULL; + deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + stream.next_in = const_cast(s.begin); + stream.avail_in = s.size(); + stream.next_out = w; + stream.avail_out = cb_d; + deflate(&stream, Z_FINISH); + deflateEnd(&stream); + w = stream.next_out; + } + w = write_int_le(4, w, crc32(crc32(0, NULL, 0), s, s.size())); + w = write_int_le(4, w, s.size()); + d.resize(w - d.data()); + return d; +} + +void xcc_z::gzip_out(const_memory_range s) +{ + gzFile f = gzdopen(fileno(stdout), "wb"); + gzwrite(f, const_cast(s.begin), s.size()); + gzflush(f, Z_FINISH); +} diff --git a/install/xbt/linux/misc/xcc_z.h b/install/xbt/linux/misc/xcc_z.h new file mode 100644 index 000000000..0d10e08ec --- /dev/null +++ b/install/xbt/linux/misc/xcc_z.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace xcc_z +{ + Cvirtual_binary gunzip(const_memory_range); + Cvirtual_binary gzip(const_memory_range); + void gzip_out(const_memory_range); +} diff --git a/install/xbt/linux/misc/xif_key.cpp b/install/xbt/linux/misc/xif_key.cpp new file mode 100644 index 000000000..e90165e0d --- /dev/null +++ b/install/xbt/linux/misc/xif_key.cpp @@ -0,0 +1,196 @@ +#include "stdafx.h" +#include "xif_key.h" + +#include +#include "stream_int.h" + +static int read_int(const byte*& r) +{ + r += 4; + return read_int_le(4, r - 4); +} + +void Cxif_key::load_old(const byte*& data) +{ + for (int count = read_int(data); count--; ) + { + Cxif_key& i = set_key(read_int(data)); + i.load_old(data); + } + for (int count = read_int(data); count--; ) + { + Cxif_value& i = set_value(read_int(data)); + i.load_old(data); + } +} + +void Cxif_key::load_new(const byte*& data) +{ + for (int count = read_int(data), id = 0; count--; ) + { + id += read_int(data); + open_key_write(id).load_new(data); + } + for (int count = read_int(data), id = 0; count--; ) + { + id += read_int(data); + open_value_write(id).load_new(data); + } +} + +void Cxif_key::load_external(const byte*& data) +{ + BOOST_FOREACH(t_xif_key_map::reference i, m_keys) + i.second.load_external(data); + BOOST_FOREACH(t_xif_value_map::reference i, m_values) + i.second.load_external(data); +} + +int Cxif_key::get_size() const +{ + int size = 8; + BOOST_FOREACH(t_xif_key_map::const_reference i, m_keys) + size += 4 + i.second.get_size(); + BOOST_FOREACH(t_xif_value_map::const_reference i, m_values) + { + size += 9; + switch (i.second.get_type()) + { + case vt_bin32: + case vt_int32: + break; + default: + if (!i.second.external_data()) + size += i.second.get_size(); + } + } + return size; +} + +int Cxif_key::get_external_size() const +{ + int size = 0; + BOOST_FOREACH(t_xif_key_map::const_reference i, m_keys) + size += i.second.get_external_size(); + BOOST_FOREACH(t_xif_value_map::const_reference i, m_values) + if (i.second.external_data()) + size += i.second.get_size(); + return size; +} + +void Cxif_key::save(byte*& data) const +{ + { + data = write_int_le(4, data, m_keys.size()); + int id = 0; + BOOST_FOREACH(t_xif_key_map::const_reference i, m_keys) + { + data = write_int_le(4, data, i.first - id); + id = i.first; + i.second.save(data); + } + } + { + data = write_int_le(4, data, m_values.size()); + int id = 0; + BOOST_FOREACH(t_xif_value_map::const_reference i, m_values) + { + data = write_int_le(4, data, i.first - id); + id = i.first; + i.second.save(data); + } + } +} + +void Cxif_key::external_save(byte*& data) const +{ + BOOST_FOREACH(t_xif_key_map::const_reference i, m_keys) + i.second.external_save(data); + BOOST_FOREACH(t_xif_value_map::const_reference i, m_values) + i.second.external_save(data); +} + +int Cxif_key::load_key(const byte* data, size_t size) +{ + const byte* read_p = data; + const t_xif_header_fast& header = *reinterpret_cast(read_p); + if (size < sizeof(t_xif_header_old) + || header.id != file_id + || header.version != file_version_old && header.version != file_version_new && header.version != file_version_fast) + return 1; + int error = 0; + if (header.version == file_version_old) + { + read_p += sizeof(t_xif_header_old) - 4; + load_old(read_p); + error = size != read_p - data; + } + else + { + unsigned long cb_d = header.size_uncompressed; + if (cb_d) + { + Cvirtual_binary d; + if (header.version == file_version_new) + error = Z_OK != uncompress(d.write_start(cb_d), &cb_d, data + sizeof(t_xif_header_old), size - sizeof(t_xif_header_old)); + else + error = Z_OK != uncompress(d.write_start(cb_d), &cb_d, data + sizeof(t_xif_header_fast), header.size_compressed); + if (!error) + { + read_p = d.data(); + load_new(read_p); + error = read_p != d.end(); + if (header.version == file_version_fast && !error) + { + read_p = data + sizeof(t_xif_header_fast) + header.size_compressed; + load_external(read_p); + error = size != read_p - data; + } + } + } + else + { + read_p = data + (header.version == file_version_fast ? sizeof(t_xif_header_fast) : sizeof(t_xif_header_old)); + load_new(read_p); + load_external(read_p); + error = size != read_p - data; + } + } + return error; +} + +Cvirtual_binary Cxif_key::vdata(bool fast) const +{ + Cvirtual_binary d; + int size = get_size(); + int external_size = get_external_size(); + if (fast) + { + t_xif_header_fast& header = *reinterpret_cast(d.write_start(sizeof(t_xif_header_fast) + size + external_size)); + header.id = file_id; + header.version = file_version_fast; + header.size_uncompressed = 0; + header.size_compressed = size; + header.size_external = external_size; + byte* w = d.data_edit() + sizeof(t_xif_header_fast); + save(w); + external_save(w); + assert(d.end() == w); + return d; + } + Cvirtual_binary s; + byte* w = s.write_start(size); + save(w); + unsigned long cb_d = s.size() + (s.size() + 999) / 1000 + 12; + t_xif_header_fast& header = *reinterpret_cast(d.write_start(sizeof(t_xif_header_fast) + cb_d + external_size)); + compress(d.data_edit() + sizeof(t_xif_header_fast), &cb_d, s.data(), s.size()); + w = d.data_edit() + sizeof(t_xif_header_fast) + cb_d; + external_save(w); + header.id = file_id; + header.version = file_version_fast; + header.size_uncompressed = size; + header.size_compressed = cb_d; + header.size_external = external_size; + d.resize(sizeof(t_xif_header_fast) + cb_d + external_size); + return d; +} diff --git a/install/xbt/linux/misc/xif_key.h b/install/xbt/linux/misc/xif_key.h new file mode 100644 index 000000000..ea9fc4850 --- /dev/null +++ b/install/xbt/linux/misc/xif_key.h @@ -0,0 +1,252 @@ +#pragma once + +#include +#include +#include +#include + +const static int file_id = 0x1a464958; // *reinterpret_cast("XIF\x1a"); +const static int file_version_old = 0; +const static int file_version_new = 1; +const static int file_version_fast = 2; + +struct t_xif_header_old +{ + int id; + int version; + int size_uncompressed; +}; + +struct t_xif_header_fast +{ + int id; + int version; + int size_uncompressed; + int size_compressed; + int size_external; +}; + +class Cxif_key; + +typedef std::map t_xif_key_map; +typedef std::map t_xif_value_map; + +class Cxif_key +{ +public: + Cxif_key(): + m_keys(*new t_xif_key_map) + { + } + + ~Cxif_key() + { + delete &m_keys; + } + + Cxif_key(const Cxif_key& v): + m_keys(*new t_xif_key_map) + { + m_keys = v.m_keys; + m_values = v.m_values; + } + + explicit Cxif_key(const Cvirtual_binary& v): + m_keys(*new t_xif_key_map) + { + load_key(v); + } + + const Cxif_key& operator=(const Cxif_key& v) + { + m_keys = v.m_keys; + m_values = v.m_values; + return *this; + } + + Cxif_key& set_key(int id) + { + m_keys[id] = Cxif_key(); + return m_keys[id]; + } + + const Cxif_key& open_key_read(int id) const + { + return m_keys.find(id)->second; + } + + Cxif_key& open_key_edit(int id) + { + return m_keys[id]; + } + + Cxif_key& open_key_write() + { + return open_key_write(m_keys.empty() ? 0 : m_keys.rbegin()->first + 1); + } + + Cxif_key& open_key_write(int id) + { + m_keys[id] = Cxif_key(); + return m_keys[id]; + } + + const Cxif_value& open_value_read(int id) const + { + return m_values.find(id)->second; + } + + Cxif_value& open_value_edit(int id) + { + return m_values[id]; + } + + Cxif_value& open_value_write(int id) + { + m_values[id] = Cxif_value(); + return m_values[id]; + } + + Cxif_value& set_value(int id) + { + m_values[id] = Cxif_value(); + return m_values[id]; + } + + void set_value_bin(int id, int v) + { + m_values[id] = Cxif_value(vt_bin32, v); + } + + void set_value_binary(int id, const Cvirtual_binary v, bool fast = false) + { + m_values[id] = Cxif_value(v, fast); + } + + void set_value_float(int id, float v) + { + m_values[id] = Cxif_value(v); + } + + void set_value_int(int id, int v) + { + m_values[id] = Cxif_value(vt_int32, v); + } + + void set_value_string(int id, const std::string& v) + { + m_values[id] = Cxif_value(v); + } + + void set_value_int64(int id, long long v) + { + set_value_binary(id, Cvirtual_binary(const_memory_range(&v, 8))); + } + + const Cxif_key& get_key(int id) const + { + static Cxif_key z; + t_xif_key_map::iterator i = m_keys.find(id); + return i == m_keys.end() ? z : i->second; + } + + const Cxif_value& get_value(int id) const + { + static Cxif_value z; + t_xif_value_map::const_iterator i = m_values.find(id); + return i == m_values.end() ? z : i->second; + } + + float get_value_float(int id) const + { + return get_value(id).get_float(); + } + + float get_value_float(int id, float v) const + { + return get_value(id).get_float(v); + } + + int get_value_int(int id) const + { + return get_value(id).get_int(); + } + + int get_value_int(int id, int v) const + { + return get_value(id).get_int(v); + } + + long long get_value_int64(int id) const + { + return *reinterpret_cast(get_value(id).get_data()); + } + + std::string get_value_string(int id) const + { + return get_value(id).get_string(); + } + + std::string get_value_string(int id, const std::string& v) const + { + return get_value(id).get_string(v); + } + + bool exists_key(int id) const + { + return m_keys.find(id) != m_keys.end(); + } + + bool exists_value(int id) const + { + return m_values.find(id) != m_values.end(); + } + + int c_keys() const + { + return m_keys.size(); + } + + int c_values() const + { + return m_values.size(); + } + + int load_key(const Cvirtual_binary& data) + { + return load_key(data.data(), data.size()); + } + + void delete_key(int id) + { + m_keys.erase(id); + } + + void delete_value(int id) + { + m_values.erase(id); + } + + void clear() + { + m_keys.clear(); + m_values.clear(); + } + + void dump(std::ostream& os, bool show_ratio, int depth = 0, Cvirtual_binary* t = NULL) const; + void dump_ratio(std::ostream& os, Cvirtual_binary* t) const; + Cvirtual_binary export_bz() const; + int load_key(const byte* data, size_t size); + Cvirtual_binary vdata(bool fast = false) const; + + t_xif_key_map& m_keys; + t_xif_value_map m_values; +private: + int get_size() const; + int get_external_size() const; + void load_old(const byte*& data); + void load_new(const byte*& data); + void load_external(const byte*& data); + void save(byte*& data) const; + void external_save(byte*& data) const; +}; diff --git a/install/xbt/linux/misc/xif_key_r.cpp b/install/xbt/linux/misc/xif_key_r.cpp new file mode 100644 index 000000000..58ee3db22 --- /dev/null +++ b/install/xbt/linux/misc/xif_key_r.cpp @@ -0,0 +1,86 @@ +#include "stdafx.h" +#include "xif_key_r.h" + +#include +#include +#include +#include + +static int read_int(const byte*& r) +{ + r += 4; + return read_int_le(4, r - 4); +} + +int Cxif_key_r::import(const_memory_range s) +{ + Cvirtual_binary d; + const t_xif_header_fast& h = *reinterpret_cast(s.begin); + if (s.size() < sizeof(t_xif_header_fast) + 8 + || h.id != file_id + || h.version != file_version_fast) + return 1; + unsigned long cb_d = h.size_uncompressed; + if (cb_d) + { + if (Z_OK != uncompress(d.write_start(cb_d), &cb_d, s + sizeof(t_xif_header_fast), h.size_compressed)) + return 1; + /* + if (uncompress(d.write_start(cb_d), &cb_d, s + sizeof(t_xif_header_fast), h.size_compressed) != Z_OK) + return 1; + */ + load(d); + // m_external_data = d + h.size_compressed; + } + else + { + load(s + sizeof(t_xif_header_fast)); + // m_external_data = s + sizeof(t_xif_header_fast) + h.size_uncompressed + } + + return 0; +} + +int Cxif_key_r::load(const byte* s) +{ + const byte* r = s; + { + int count = read_int(r); + int id = 0; + m_keys.reserve(count); + while (count--) + { + id += read_int(r); + m_keys.push_back(std::make_pair(id, Cxif_key_r())); + r += m_keys.rbegin()->second.load(r); + } + } + { + int count = read_int(r); + int id = 0; + m_values.reserve(count); + while (count--) + { + id += read_int(r); + m_values.push_back(std::make_pair(id, Cxif_value())); + m_values.rbegin()->second.load_new(r); + } + } + return r - s; +} + +Cxif_key_r::t_key_map::const_iterator Cxif_key_r::find_key(int id) const +{ + t_key_map::const_iterator i = keys().begin(); + while (i != keys().end() && i->first != id) + i++; + return i; +} + +Cxif_key_r::t_value_map::const_iterator Cxif_key_r::find_value(int id) const +{ + t_value_map::const_iterator i = values().begin(); + while (i != values().end() && i->first != id) + i++; + return i; +} diff --git a/install/xbt/linux/misc/xif_key_r.h b/install/xbt/linux/misc/xif_key_r.h new file mode 100644 index 000000000..690a253d3 --- /dev/null +++ b/install/xbt/linux/misc/xif_key_r.h @@ -0,0 +1,97 @@ +#pragma once + +#include +#include "xif_value.h" + +class Cxif_key_r +{ +public: + typedef std::vector > t_key_map; + typedef std::vector > t_value_map; + + const Cxif_key_r& get_key(int id) const + { + return find_key(id)->second; + } + + const Cxif_value& get_value(int id) const + { + static Cxif_value z; + t_value_map::const_iterator i = find_value(id); + return i == values().end() ? z : i->second; + } + + float get_value_float(int id) const + { + return get_value(id).get_float(); + } + + float get_value_float(int id, float v) const + { + return get_value(id).get_float(v); + } + + int get_value_int(int id) const + { + return get_value(id).get_int(); + } + + int get_value_int(int id, int v) const + { + return get_value(id).get_int(v); + } + + long long get_value_int64(int id) const + { + return *reinterpret_cast(get_value(id).get_data()); + } + + std::string get_value_string(int id) const + { + return get_value(id).get_string(); + } + + std::string get_value_string(int id, const std::string& v) const + { + return get_value(id).get_string(v); + } + + const t_key_map& keys() const + { + return m_keys; + } + + const t_value_map& values() const + { + return m_values; + } + + int c_keys() const + { + return keys().size(); + } + + int c_values() const + { + return values().size(); + } + + bool has_key(int id) const + { + return find_key(id) != keys().end(); + } + + bool has_value(int id) const + { + return find_value(id) != values().end(); + } + + t_key_map::const_iterator find_key(int id) const; + t_value_map::const_iterator find_value(int id) const; + int import(const_memory_range); +private: + int load(const byte* s); + + t_key_map m_keys; + t_value_map m_values; +}; diff --git a/install/xbt/linux/misc/xif_value.cpp b/install/xbt/linux/misc/xif_value.cpp new file mode 100644 index 000000000..eceb9d6b9 --- /dev/null +++ b/install/xbt/linux/misc/xif_value.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" +#include "xif_value.h" + +#include +#include "stream_int.h" + +static float read_float(const byte*& r) +{ + assert(sizeof(float) == 4); + float v; + memcpy(&v, r, 4); + r += 4; + return v; +} + +static int read_int(const byte*& r) +{ + r += 4; + return read_int_le(4, r - 4); +} + +t_vt Cxif_value::get_type() const +{ + if (m_type != vt_unknown) + return m_type; + const byte* data = m_data.data(); + if (!data) + return vt_binary; + int size = m_data.size(); + if (!data[size - 1]) + { + const byte* r = data; + int c = size - 1; + while (c--) + { + if (*r != 9 && *r < 0x20) + break; + r++; + } + if (c == -1) + return vt_string; + } + if (size == 4) + return vt_int32; + return vt_binary; +} + +void Cxif_value::load_old(const byte*& data) +{ + m_data.clear(); + int size = read_int(data); + if (size == 4) + memcpy(m_value, data, size); + memcpy(m_data.write_start(size), data, size); + data += size; + m_type = vt_unknown; + m_type = get_type(); +} + +void Cxif_value::load_new(const byte*& data) +{ + m_data.clear(); + m_type = static_cast(*data++); + switch (m_type) + { + case vt_bin32: + case vt_int32: + m_value_int = read_int(data); + break; + case vt_float: + m_value_float = read_float(data); + break; + case vt_external_binary: + m_data.write_start(read_int(data)); + break; + default: + { + int size = read_int(data); + memcpy(m_data.write_start(size), data, size); + data += size; + } + } +} + +void Cxif_value::load_external(const byte*& data) +{ + if (!external_data()) + return; + memcpy(m_data.data_edit(), data, get_size()); + data += get_size(); +} + +int Cxif_value::skip(const byte* s) +{ + const byte* r = s; + t_vt type = static_cast(*r++); + switch (type) + { + case vt_bin32: + case vt_int32: + read_int(r); + break; + case vt_float: + read_float(r); + break; + case vt_external_binary: + read_int(r); + break; + default: + r += read_int(r); + } + return r - s; +} + +void Cxif_value::save(byte*& data) const +{ + *data++ = external_data() ? vt_external_binary : m_type; + switch (m_type) + { + case vt_bin32: + case vt_int32: + data = write_int_le(4, data, get_int()); + break; + case vt_float: + data = write_float(data, get_float()); + break; + default: + { + int size = get_size(); + data = write_int_le(4, data, size); + if (!external_data()) + { + memcpy(data, get_data(), size); + data += size; + } + } + } +} + +bool Cxif_value::external_data() const +{ + return m_type == vt_external_binary; +} + +void Cxif_value::external_save(byte*& data) const +{ + if (!external_data()) + return; + memcpy(data, get_data(), get_size()); + data += get_size(); +} diff --git a/install/xbt/linux/misc/xif_value.h b/install/xbt/linux/misc/xif_value.h new file mode 100644 index 000000000..f248c2193 --- /dev/null +++ b/install/xbt/linux/misc/xif_value.h @@ -0,0 +1,113 @@ +#pragma once + +#include +#include + +enum t_vt {vt_bin32, vt_binary, vt_int32, vt_string, vt_external_binary, vt_float, vt_unknown}; + +class Cxif_value +{ +public: + Cxif_value() + { + m_type = vt_unknown; + } + + Cxif_value(float v) + { + m_type = vt_float; + m_value_float = v; + } + + Cxif_value(t_vt type, int v) + { + m_type = type; + m_value_int = v; + } + + Cxif_value(const Cvirtual_binary v, bool fast = false) + { + m_type = fast ? vt_external_binary : vt_binary; + m_data = v; + } + + Cxif_value(const std::string& v) + { + m_type = vt_string; + memcpy(m_data.write_start(v.length() + 1), v.c_str(), v.length() + 1); + } + + Cvirtual_binary get_vdata() const + { + assert(!idata()); + return m_data; + } + + const byte* get_data() const + { + return idata() ? m_value : m_data.data(); + } + + int get_size() const + { + return idata() ? 4 : m_data.size(); + } + + float get_float() const + { + assert(get_size() == 4); + return m_value_float; + } + + float get_float(float v) const + { + return get_size() ? get_float() : v; + } + + int get_int() const + { + assert(get_size() == 4); + return m_value_int; + } + + int get_int(int v) const + { + return get_size() ? get_int() : v; + } + + std::string get_string() const + { + assert(get_size()); + return reinterpret_cast(get_data()); + } + + std::string get_string(const std::string& v) const + { + return get_size() ? get_string() : v; + } + + bool idata() const + { + // internal data? + return get_type() == vt_bin32 || get_type() == vt_float || get_type() == vt_int32; + } + + void dump(std::ostream& os, int depth = 0) const; + t_vt get_type() const; + void load_old(const byte*& data); + void load_new(const byte*& data); + void load_external(const byte*& data); + void save(byte*& data) const; + static int skip(const byte* s); + bool external_data() const; + void external_save(byte*& data) const; +private: + Cvirtual_binary m_data; + t_vt m_type; + union + { + byte m_value[4]; + float m_value_float; + int m_value_int; + }; +}; diff --git a/install/xbt/sql/update_mysql.sql b/install/xbt/sql/update_mysql.sql new file mode 100644 index 000000000..581bdd8a1 --- /dev/null +++ b/install/xbt/sql/update_mysql.sql @@ -0,0 +1,81 @@ +CREATE TABLE IF NOT EXISTS `bb_bt_tor_dl_stat` ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_id` mediumint(9) NOT NULL default '0', + `attach_id` mediumint(8) unsigned NOT NULL default '0', + `t_up_total` bigint(20) unsigned NOT NULL default '0', + `t_down_total` bigint(20) unsigned NOT NULL default '0', + `t_bonus_total` bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (`topic_id`,`user_id`) +); + +CREATE TABLE IF NOT EXISTS `bb_bt_torrents_del` ( + `topic_id` mediumint(8) unsigned NOT NULL, + `info_hash` tinyblob NOT NULL, + `is_del` tinyint(4) NOT NULL default '1', + `dl_percent` tinyint(4) NOT NULL default '100', + PRIMARY KEY (`topic_id`) +); + +ALTER TABLE `bb_bt_tracker` ADD `peer_id` varchar(20) NOT NULL AFTER `topic_id`; +ALTER TABLE `bb_bt_tracker` ADD `ipv6` varchar(32) DEFAULT NULL; +ALTER TABLE `bb_bt_tracker` ADD `complete_percent` bigint(20) NOT NULL default '0'; + +ALTER TABLE bb_bt_torrents ADD speed_up mediumint(8) NOT NULL default 0; +ALTER TABLE bb_bt_torrents ADD speed_down mediumint(8) NOT NULL default 0; + +----------------- +-- XBTT Tables -- +----------------- +CREATE TABLE IF NOT EXISTS `xbt_announce_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ipa` int(10) unsigned NOT NULL DEFAULT '0', + `port` int(11) NOT NULL DEFAULT '0', + `event` int(11) NOT NULL DEFAULT '0', + `info_hash` blob NOT NULL, + `peer_id` blob NOT NULL, + `downloaded` bigint(20) NOT NULL DEFAULT '0', + `left0` bigint(20) NOT NULL DEFAULT '0', + `uploaded` bigint(20) NOT NULL DEFAULT '0', + `uid` int(11) NOT NULL DEFAULT '0', + `mtime` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS `xbt_config` ( + `name` varchar(255) NOT NULL DEFAULT '', + `value` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`name`) +); + +CREATE TABLE IF NOT EXISTS `xbt_deny_from_hosts` ( + `begin` int(11) NOT NULL DEFAULT '0', + `end` int(11) NOT NULL DEFAULT '0' +); + +CREATE TABLE IF NOT EXISTS `xbt_files_users` ( + `fid` int(11) NOT NULL DEFAULT '0', + `uid` int(11) NOT NULL DEFAULT '0', + `active` tinyint(4) NOT NULL DEFAULT '0', + `announced` int(11) NOT NULL DEFAULT '0', + `completed` int(11) NOT NULL DEFAULT '0', + `downloaded` bigint(20) NOT NULL DEFAULT '0', + `left` bigint(20) NOT NULL DEFAULT '0', + `uploaded` bigint(20) NOT NULL DEFAULT '0', + `mtime` int(11) NOT NULL DEFAULT '0', + UNIQUE KEY `fid` (`fid`,`uid`), + KEY `uid` (`uid`) +); + +CREATE TABLE IF NOT EXISTS `xbt_scrape_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ipa` int(11) NOT NULL DEFAULT '0', + `info_hash` blob, + `uid` int(11) NOT NULL DEFAULT '0', + `mtime` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +); + +-- bb_config -- +insert into bb_config +select * from xbt_config +where name='torrent_pass_private_key'; \ No newline at end of file diff --git a/install/xbt/windows/XBT Tracker.exe b/install/xbt/windows/XBT Tracker.exe new file mode 100644 index 0000000000000000000000000000000000000000..d6087c23e07e965b6654fa7c99c4c0eeb6225f6d GIT binary patch literal 379904 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 diff --git a/install/xbt/windows/htdocs/xbt_files.php b/install/xbt/windows/htdocs/xbt_files.php new file mode 100644 index 000000000..e7e1f471d --- /dev/null +++ b/install/xbt/windows/htdocs/xbt_files.php @@ -0,0 +1,59 @@ + + + +XBT Files +'); + printf('completed%d', $result['completed']); + printf('peers%d100 %%', $result['peers']); + if ($result['peers']) + { + printf('leechers%d%d %%', $result['leechers'], $result['leechers'] * 100 / $result['peers']); + printf('seeders%d%d %%', $result['seeders'], $result['seeders'] * 100 / $result['peers']); + } + printf('torrents%d', $result['torrents']); + printf('time%s', gmdate('Y-m-d H:i:s')); + echo(''); + echo('


'); + $results = mysql_query("select * from xbt_files where leechers or seeders order by ctime desc"); + echo(''); + echo(''); + echo(''); + printf('
fid'); + echo('info_hash'); + echo('leechers'); + echo('seeders'); + echo('completed'); + echo('modified'); + echo('created'); + while ($result = mysql_fetch_assoc($results)) + { + echo('
%d', $result['fid']); + printf('%s', bin2hex($result['info_hash'])); + echo(''); + if ($result['leechers']) + printf('%d', $result['leechers']); + echo(''); + if ($result['seeders']) + printf('%d', $result['seeders']); + echo(''); + if ($result['completed']) + printf('%d', $result['completed']); + printf('%s', gmdate('Y-m-d H:i:s', $result['mtime'])); + printf('%s', gmdate('Y-m-d H:i:s', $result['ctime'])); + } + echo('
'); +?> +
+
+ XBT project at SF + Valid CSS! + Valid HTML 4.01! +
\ No newline at end of file diff --git a/install/xbt/windows/libmysql.dll b/install/xbt/windows/libmysql.dll new file mode 100644 index 0000000000000000000000000000000000000000..a80f347fcb861fed0a7c1b2ce2a9009a2e4ab2db GIT binary patch literal 2510848 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

h-Y-k4Q{YiUtDJ~2$a(4ikEJ1Lw}p@z<( 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

k!K;HSbit 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 z z@f?M(EGu~Fs!j5re z+((h6j}6@F+?-sSw3nVufA*Vz(;h6$anb(->ot4bcl##bn6EwGefUh| z*;DYSK|20c(CEvxK16?C4&O;i$MuH@&#a8e`oV1M^^56v<*Sws8U8T;M^lV*I!?s4 z2fl3Ron-*DRd&wQiP+`L-I&)$NO-98&8HLbv4YL6EfR@7oOj)KnS_luSqyIy;{bH! z`p>f_;dA?X1ukhy+E3Z}!nrwTwhR?K_nzpNwG!q}Xld7rJ%$PqZKub6Yewc9d9$v3 zOcgGTSe`TchdaVVWatuu>STTzYjo;-vM{dFM#pIr$b4wgpu`dNqFit{piqf zK0vGLEvl3xtUk5)M$N>gKtDH{wswf%f+n`H{!Z%i;oL}%Awt5ltM{JOAn|jm41SX+ zRNYYb`-TESk3QRL4$!qvZB=(7^T#{`g>|CfQ?%(~Crd)-HyOAyL8w2zmPhv1)<6f> zmVS#Ds@7kn*x^FttI?*CbG$G$wTaHa)`Y&)>%!DH;ojG5Q`7S>A4ZF|F1j2mqaW=9kGY|>Psghg)z1h zZqI#f2y~6233VfdxX2u-(IztAN29EI4HAAW+vB1ClgwuuH+r}{LKw5(XU%~PPC(mT zo$)kWC=BYanlZjR(7xNO%)*6+NB`N-)P~qgzUfwKn2>qD>Sv1=q&<8&G3rpL@Mw3y zkzR*jK8=DaH`59g^33KZ6^>~LbngLsy+VZZHryY$` zk1p&D5;hL4^HQcXCEb`wNGrYpp)FirVL+Wkf$=%Dsc@ zV;o^Ui6jQyKJ*dl8`aRdYf9wvoz-_jZz1m2O{<9>WIZ9bjnL~QG(Y3>Giy~Rl3$C# zD+7fkyF4;uf0Fz%oTAMGgmJxw)ciY@$dk1yRPYm?H5?uH+@9!DE$`{wL%^fE9?1?T z_6)Y2a==Hh+jYU}W+AbMa!~J^Uc#!8Gj2ND68mP=Y4OQJNVIBWIQ=VW|G}NE>vt8d z+JDqJ+Kc2Ld}@MJA#~cWr9ZPZ376k8^l=jQ?{_Nb+=hfJj}E^j6H?p1v}qH5Nd@$g zS@ms&D#L4ZeVj|{vu&o2RM@%H$K+xcSf3$fy;t>(g^6~4_ioN7^+8>lG-xFJYCqj# zz|}^CF8h&pZSa}Q57e#<sZNyOBmZ98$)2%rz;dD!e$`%Y!b51wqbQ6Z^MhxW* zIbEOA`kb!EP^rrh)#Y?;PS;|n)?p~u=5%#VS7V5@7%Ho9x-zE`r;F+{d;DZ5|H0{R zoc_uXePO8l#OaTmE@UV#V5rXL^gB+!;q+^U=oLfd3r;`h^iziNCk)k(IQ@{*c?^}g z4AFf~-{tfjPTyiEzsXR2ozvGieU+i|3PW_6(-%2?fuZ^wL-|=wpXT%_PM=_?JkAgu zW}ShUfr8b0C+!|7F=Uda$;F;p(+^fFE_VJKhBP`!xL3pxE4L*;yiXdb8Ma5{t2t695K zuVN_Ys9eeUS-f3xl&@g4aybuQ#=|+vmva6R&gUp!%xGmM4`0N?Im#FE@CBUDQT`X_ z&u6Hf$HO_w=koA5JUoMkb5zde{8^mOQ9hH=${9R-IuGY4pT@(daz01-6waT_P(6u< zbCgfy;psel0uSe?9MAdVIG>|j$!KL748ILeb5txV$KLwGnxc_Qa0a6U(QJfoFyJUo_%bCk#M@WGtVQ6A0t zQ4H0QJe;F^5D$;w;o&@-qcV*1Lph(LJcQB8U>+XC!#Tmx#6b{u?X z`o_@eWIaQ+H{Ec|JUP(At0`HppzT%BJ;&AOO`_9{$odCGRZ%{0jC^`;g|9J9pI8+= zcD((xeY?xw6(szo7JBAb<)_ik=3mKr6%DVBUOJj}Iks%ZLbCot?%L>$V~-Ip4yJA; z>wT23qkQM6wKQzy{&A*+o>5Ky-qA1p-pV!hWc`EoRaX}{YJaa;FMCvXLL+VY2ggae zdlsMlPS#5(SV#TQF*M_I?)(;H{fZXVM4ug3)kq0{v5$tgt*!jxnDg^N=L2|sCh_4U+09P_Fw&zr3#>sMGY%YQj)1;@@y+C}wO zqoKOUvGuHX&tsFx^9fYHRu;mW&e#8eb-)QGqqXyFQ7wIai;I2b&*nVALLBb!`lUKzYq2E&QWk?CDQ8sJ^U> zvTEa1VJ|42DS9^mhv^}yNWv-ocx;-}NS0 z4X{!=a?1fZjj!JxHN?{w?RfudC+#m2I|Mhx!{!BA;i;8Kem^>@8)C(~f9mS}qV2nj znQkN8_HyXq@koz^XLm|$gd^LT^c&sVkfJJ38cQqt@9e=adoyttWSsc>+my9TX_>ay5FerW7|`G*6Ezp1pivw zvurdX*nwEsml&2J^vZHCvr zxcc;Vd{vsiQ(`mxW0dW-*4L;!Po34x@XuzOp04;!ZV`Q>n8if??EnWQ}^FLuf{R{L?4)L*#`4m-i8Pt5XI zIgf@5W>FHHzux+5+*xYhE1ece@a>C|%o-19dwOnuN`g1Wy;5+P3gMA1P~D!Smq4AU*A8ElK-QnprDb;{nq@q&{&a&r6kUY&NvU zvC|A%-m7E{H0ox1vo-Gc_qvvNwDN+}a08s`J*IutS)~0d>$_|)!0ob= zZ2KgU=Vi(Pikk+wMU@$5o({BsC%K}wxZ0LwXOfhpeJIs#=54X1gY@l$zI1%na}REd zqef4!am<0*E7BvQEq?Iw?nduIq7Ni=Q@6zvts=5&9-;j`&+~a(T=ZyEx@;YJeyw!q z-q;YQ_F3yY>)s-vhQ$1JYht3E4KnOLYwx;GQ|Bm*E-gv zK}Vp`LcdFf*y2d%zCXfg`>7g$jPTe#o}*jUu1?}72bvqe!DsRi)Qy{#Bx~{f9ZNCfq>@&hu(j!k9>k;{oe!u5NxORO-L7RcJ{p((-+emo3 z*rMHI-&%ON*S+oe7 zGU?zdA>p+iywej*U-le3I;aJqH#`vZgjX$`#~cfCBDBlH*?NL!>$@9f^r7uZE1NoAJx?p^1m9qE!yHv!s8z2))N+(zShYbNA+Ln z$+mjJj-HwC?!{C6%zKhnPv{Y-JMdEqEwAlUpL#+){k_$WrWX)>?0nj)o^Uk#O>Xo# znqL0wovz^dx82*(T`Wlc=bj0=g8Z<_&#F#TpFN+?))oF*cipCGBibHzJWtRS&R2W6 zIV*tLtMd!2D;T9d{kCI=8A&g^sH-bf8SC~V*`CIqlq1v?&eYLH-sID;U zzE|z@9#p>>*Nf^14u|9u%p217mvLi79bsMDNoGI0ekbzIxQXisV$6Va1Xy7M@dS{7d(RnnI7@V^?l!QTcb}2GtZAte51} z?5iN@7vvS`2z58+*;JZO+i&{^f{t)-(zb$i+ucZbwTD4ELX7~+Gpjy$5<2f;k+v|e zyV;KGtEfHqJX)bG$iM6j`gwxdYuaP1Ei{xa?H?8Rgw&_^liV7@(Pyi26MsH6j*|2@y3wGPi~(J88yEurn6r&SlcmYp0rps_2V zzddhNUC8XY=w7XZH2uC8LN%e%KhD+EL#g~pFN3NH&%#!Ie7b{{*Zx(JmaxFus7B+% zwEyM3TA?Kjxvcj!_cBdC_chiM?3>Q<+q#yHC-OJBRfW5=R9OMj30E0os1^1IwBLRLXr*DXV7`&suct%~6BVwl|=KN{aHzf~2X z>zAOxJ3F=`=^y3`m4&Sx2ETT`P4z$eeNbhgW^jzw<8ico>lGAL5)6%#*4J{T@~$gb zQAyBN1yl-9pmVNfNZp5BRXmAg`VFDNWR!Xty0(ZV?clE37`3M6!yc7Nc_y|jOA z_<)gMV-no$>wMZ?`@a;5viG<Px7^?!|jW%t;yvql|( z$`|k^?PvBqSx-gYcd8G?Tj57`_lrAY>;q~4e*6~y$gbaDc}L@aDwF(9y-WL^y)Wvo z8|MRQ``M5$e9I2ZTy^5qBHBOF-xqz&PRW>DMgE+Y-@5>R&2C)y*I!u|Y5QzjnD!-m zQr^_C>xDG`*M-98>=C(_Yj;{i^}G2)(WmT_)l+KT2%z?j`iMVezi8sr@@zY*pS+L4 z$Lx_$wufEZ;7#P2|EcIh_NYl;FPly#?^}@UGyag>b&`P+*Q4^~eNHRPUN^>c*sT|o zR(=r*vTF_7k$!kEwO`|}MennFJRV+Dy=5bke#2M%KKs+5DeZN2$om0g^(`$wd&A=w z)3v{KBy{4(w0GHK?`8+~kx+d#{*?AMJLl--vy1oA`sjWxdYwIf;*z4oeYAal`JDDD zJMNyH?sqB8@6wl|7um+ErmcG#N9E7@n)W<9^XcQI`L}6%i27FaG~4sV+dk%MI=)H1 zr#;C&w_?b#OD|iI@=tv)dX&9o=nLmT5wt&;|0sHxZP;YzGK-V6ey4t`E8D9qfGAhQ|L@bSXQgkxb|5aB2_qtLSWY!338f0e*BmQvNDB znSJof!-)^VsXin{MTfK3>2UI7ZvTz4vM-|+fa+j1N*<$XVm|YiG%;Mh{SX+MI=+H19?>)b7 zal4QuvJmAk$Hg7<@qilr{3m1#QB6#Xf8M|)AIF~_)};CB3{}d+23NQD$;T19QrA38 zo+-Qk>0Y~-#C&Wd+wm}W&J5M5C8>>FC+Fj$^qrpBlR{(@3QwGIT%M1uL!^y|yU&r; zo%%Jl_wIbG6LPnk*}6rt&s~!`%srQnhxj~fc(-MSY}Mtf7Ox-WW4}?yjT_m^WzDYs z+BWEWJ|1<*``DW$F{&Q@^e$D>e~&vaQFPWlzCd+O8mm6k{yjdqHuj(TyL+heOgC;_ z?ED@tw|T!<=rm8&W7gVJi~7FD+MC|)A1og)8`WcsY+urQoI35sey5Cas+Tio*nOS$ z9>>&Oc-cUAjwojz_Bk{ATU^ z`C~VZm)V7;#*efsz)4ys_l(`1DZ}e_`dsKyfY*HZkR5nNu%t zR(ZT`;*|oN<8&vWYvl}C&rXgTx4kaF6AZ4o);%*s)?lwx=U25t{CK?d%HR)^WYU{n zKN4FP;?Y$b&w93Wnyjc{_|6)#LcF$*O?qqNd9wE_<^~<_S%^*Cy!*fHKV5ZpqrL6= zA%!rXb{1aRFHjA-sTH?%Mj=*J&6LgjYq{$4iYHcg))(T3A49I&JWf?T*`R;a^k^YI z+HQdDm!jpWHdcCG>+ToggUj>lY2ThEYp&c})%9B;F8tc_tHGs(s`h4|TkACZfQQdD zZysGZP_=M_@2!v04|vgtphx#kj#HUV4GFH{{Q+N8zNyDfac51n6cTj(-I zR{P%1%$;{XV9ViyRd-%5lCAH!Z0OFfAMm4IeXeN#GhgLA=;Er|4L{eMtswlnt={(Fin%04?rl|H}6*D*z(@TWSH4C~6K zs8WJnKTmD-8E1~1GO26)I91BHweE}YXWZplMC`2%8LHEf&OKiRea2Vgq`msI%~0V1 z_kE(3pK-^Am38(FS|poX=~Z(5m7j5^%&KpPHAq)k95%1?=J02Ht$V}EUV1BJq23p5 z3Lk#PV@EVNPI**bDQC%-6Dw4igQnd&IqeI!-#xnU$ox#%ovilGPd0zS zMxK*;zJIYmHbb$yp~b~7`0qzAECyanRM`w`kh%5!7aY6r(JK9O6J;lg=G5$0|0^~y z>}@vU`ZCp%Mc=QubN<=|qdkYJe7*0l7(eDKzBIAf z=zfitsSZ>>llVUCE4FxgVa}oCIjW5O)#K+J`--y*hHQ5mJz559?j~W+zv6hWr^C;* z9WIM_GGNr8THmn6wdMmn`pi>Vns$4=#QYoHWOH{+fAa;h0fvq{s|0?-51eM+iSM*b z)%zcF{pBOR;S*uU&x}30L?-+k5g4=l8NK2RB|vhVX` zW>TN;_)*+}gSkVNs=5yRUNAK6JGS2(FxIDcs;XPHmFC;me#d6*0_t4-v0QcKuxCcg zbKi0La?_EQ9LCGETi)n*q~JSFS{j4T{9LYD>NoM;k|sa!J$K)!5xV1KBQF&NZIb`M zIwvON*}5)~d0y^i_CE3l^e^|K?o;NvTsKR1lG*`fs>Yv_wRCZrfT%m>fKDM|HMm2j&QM6EmajvtzBbsr=NJ(#AQQ9 zxi3>qUi1BK4#g+QBAbCQ|0N#pV(q|Tr@IR zDhu9Ksj&6cpZG}Q{NcTB&y@u&8D+Wf$4}hPv$4Gv8l$_PLG9smmwGCU~9v-ecr1{9tCSGi|QTmEF!*vufL#UwEF$(nbbLm#f}K z&N6ks_zTb2Qg2t`yrnARz9Da$efx#C?^!eH!^vf`g$H76I~W#Wmsz!iwJYbzo6)I!*e>)cu+4+QZk%*<|2XG%}pEMDrk<*@~-3-J+R@ECdVm9Mp-Ukvk z?VNyT9UotGNVtICb^i9t*^KUo`$Ez{e&l_H07s_4N3#z-jgp%E=;C=(c_co3@_4u| zBheSm=Op|-GOe=pk*LUQA~lP>NX}3!n^EF_mbSS5b*a>|okav$ zNEFDMqaCZCdF07?y$a17O6S9JBmYG{Lvg+(V(C!$4JNmTh~hr|{4`N-A_g9>t-Z+O z2-a^Yfl@9Csbj8nKOT5oSRY6}*RcP{NsBTwPvhpah&-X(^7(#KBw`KzyJHdO@_nWv z^8KdbzEi~an`+RR?K4Fp^8Kbr#3a7YR7AetRNQxpHnV-D8sz&;k%)Z1DH3rJ-)}0S zGp9x5`%RIEi~0Ui5ykzcB7WohM@1C(n~E69!$lPLn~KQyn<5eUep4i(8{c0lVr5Q? zc!cdAMIw&>f7tsH_?WJ@|3fT6Fw`!H5Mob=wP6wof@JndGMUNjTV!T3X2~keWD!Xu zvS7rnmeSIqwAGdtwbWW$i_)T&YD;Npt4ikooSA!L<{H}f$NT<%@Bhus=bPuA=RD_o z&Ux;cJNKTs_c=tGloN?GDVq^#QXVGW8zm+Az9}i=iF{J_B+{h3LA)}y$~RTDe)r)C`h_3SH}7j4o27u?qb?6LHV^uQe(~q8=uxkRj7PRJ zvsRqlO}{oZvnX&o{JtZV`kh|9mww*&Vit-6K3ke;E^{A!`_e&CYk!CIs_)acG&(@P z{`sXdXE{(mi`}WkmV@*)&2F5w$vZ&%nygyFIz&G(GES)JNgt0+(BeyfKTKB+YVy%f z!qLFD97PUAeEvi7)A=#ShCjM)V(#9>n(TGW#of*I(v77-k9{k9;qpF5zeCyVH4p zTnHEe?O97N`Qa?R^w%iOpPQk-A*E%fYtPXWhV^W&{vG@y^$Bh=?L0j?wS3FY@1gzL zPw)5nkFZ6ql9ySAxN0HG0lAJkl=@72w5tgNF!`Om7_jQWQDRom#q3xnbJz1>%uymjUq z`r~eQhp^AV@69Ed@>7;?={pk^+@ADdT{zk@RM(bviGJ?h=;ay52SfXpEc<-ZCA#il z8(QlLo#1#KT2~NsnO=USmZ2LQI38V$5VbK~rhh`;f-K*Gzs8LGp7ZHt`sq2RmzBQP zbv%k4y5gr6SLoljnlM1~HT?d0X2iFJ~%BKQ}#F<`7y&1nqQ@d-Id4RT#Coz2CY+*SI7o*N{`4#M$6#rMDHevMu`$DL=Mt}Qo`!iqO z1b_4mliyr(jjk;EWB!{==)W$r9BL>7Pvg+HXu_;GG_%=? zZTU8M?Zc|XJrbweH zPL?&zYM5r#MOrmnm655iFw)W?U>}&Fp%8n`Ddo;$kk;ccJl-}Np(JGe^^;>aaV_>l zx-55lT%kR=9(Lu15ZB2e;dKRrR8u-8M354u+u{1Qm`=)Zuddj+BYbldG){Sx@==s8#LRpFC3=0tl@oYkkzr#WwjOP%v>@Z;X^nvtAS<>9V* zHh6g9^BXe8AJTBwyc+!2ol}_n#*#(EJR1D?wQQJi{3jELc{BKNd#9qOfxRZ2<(wyL zgmT8*?Z?}{HvE!vUaS#%pU#nU*>8qtJLka~p-;K5(928bhP&py8X?KBaTETywItj% z&(#Q3eD+3kWLjCcYhJ4{TCicm)yMPf#5`7G^y~M%Y6nfR5%X4!QRv1N`YV4FguCXc z8l!D3{Y(X;=Z3rHr5dC6H*Sfu#uXCtP(EndgVV`lzo{hVoqW)M+%8AUhrJ$t*g4PS zgXW6ong^U(AO5>@UdadPV+XE}Svfo0HIL+jn$|22n!IB}_yFg;Q4`dD(_ZOqMO3(J zo~Q}R@_GI1D@P5)yigOgWpnn&$E(tbd7vh!#lYaDM+;Ylzu}zsX@Z)6|JI%@E!KtS zJLh?tqIqW@cWF9uez-LYg=|ApZq=R8GAv@OYOC`u_J<|SI9IU|nLWOOSJcg;hzMD`v-E~@*k4u9yJ zcW8y)X}WOh&~~qfPj=2Tv_i+ek+eMPu!Otj6 zyn!FmcCFD3PSp_e1b%4S;!C4i80UxQIOhdgqxH?lzcG7_CEPU+&>C&3+4ChUX_6ZP3rNPlmp!EFTx|Kq`*5C3}fxXyuIG@!O?c{FbU zvxTB$u|)dp{G3_2ujT!_`~UB*|AqY@Iq~@c&7YnBAL0L)m~ndjIJ^oAJZKKv;D9*T z0`N{2Y$z^nm{K_mc3@-0K}=f!+@3*PZfB@FzYjNWX;=;SaS(;mWdOHz5WNxZ z`K+#m$>3(s88;Pf{hUEz;Vw|21#Y+@G+80=IIaio51qUCHW2s`@M2B`T$l%7KycrP zfCHonm&Iie++A8tO31)`rWEHM+;^JHgbr>)4Jsl5ccsofxIuO1!o8|X!mTEhMNkfb zJpwxfHVE>OY?u+r^uvt!rWBT_gOHm;%n&jYhY=;ysSr9`iSJr15V0IupoG=F!6`CL z8rVS8Q;T*;DuhOd)fAljGPMc907I559pIK1;FhOLOP4_qRihOmSf&kuB5APp*${|j zYH*e{ngZ(g4cQ18R2f6ERWhB-phQ{-YYSC6W7}%ebWWWH8UO(`AqFvou7$c)28~ni zTv!p(BpGP|QIMU@w3=ZJ3h1mA+G5UtsI0i%87f#)K|4g9VsLUm;93Jtr>hLAY^zF# z8%XM`CKwEGc*wM?KLO7E)az6xyc)_A8(3n~S;#{Nfti7rECY*Zx~$x6AO^9@1f3&o z^bmU%;(^wu!7mV1-nH5uX#@4ZxCOtt@u+kGW|=Nsri8e#q@7A(^+>}3hl7oyjha-h z6_}pX3n7jzGTcSC_QDdCX?l4IuBM(72d2dz46+V+nl2?BOvp5jHw+Q_od+C;+6PZU zxaT1dtUo&iRt2-`;r;u6w53gA@X=*L9wp>%r;J29Kr&({qD{_p6xskX zDJBN3b;_w|8OW#@E-E4P79uSr@?)K89z3Mz;t2+c>+^TYNaW{~5L4JGqtLD2asEVf z*(s-@6HYk|?Q_Z`w8<&CsLCmMsK_a&piHOaBOM_{ASZJsqFASlLSvjV76m&c7j*#{ zJt-13ampxk_cxr5MVFnDi%x)?#F&b9gPh9aqU|6VOb%K_$a1G-APYzqZz7U{oW$iK zmQzkd5l$J420JAab#cll^yogei$=GcaxyySl#|dtr<{VeIAsi4<&<%#$|)IWmQzke zI;V_8iB6e>Vw{qL!km(i`Z}cm(VQ|K4scr#~^XaoY8-#xDdAk;CQ91~19T1ZOf#Tr` zEGr;dWmcF{j6^mHn21+=aT!ILOtLH}<2v-KAJHz-xdoQYq1HF0~ES6GXy?&^^cnGmMcxu8&aGL;h0l2 z__&h{c-+9nr7#)V;X1bIYUg?>9!IXe8c!QI<{TbxD)#N97$mhSEpWL67wiW3W`n$^ zyi-qu+$#30U_7w7S5$b5FU%Y!47`u zb*}j~0rH9Q>Kv;;i6jzO2tt>lF~EhAL;~v$KzHGm684Q2)2J|zu(A{GlG9cV%Nw{7 z5(!?0irj~Fi0W;OGOTuS!+K>39dO{2lQJ0V@aEfy22)lv+I>W$-2_|&oB-?t>;!B9 ztOe*|+t7R;wWZzqt1ayuU9$*w=x*5@c2Lwlpb7Eu=*t69GIx#9wV_EReAPn8~9>V;vwIFa{6?2muTR z1Oxg40s#JiE`SaIU%(?rTiSiVO~47jKEM`06~G8!0YU&Yz^yv40c--41C)Rmz!*Rn zU@*WR@ZfP<+Figkz!|^}KrO%shyeru?t{!te|B*d?RVJ z+!8-pK43P02kGxC{Aj-en$Gj1t%CFe&_4nMLi!e@SHb>T$bTOYK&J=b$^$t<~8 z!Z!t^rG_-a5d7H~f)^fvJk<~*+>GksjEk3|gLwfshr+vAHpLi0$ z)m2D8UF8s1(-=6&MXpr}vlTdDo&;9WfOa~+VFRFUeA$8TjjVbQNRdWr@V;{eKQ&$z z4YJSx_zzc3a33EK7!??RgcdEZCqpfGE(EW1j91=(eN&nRt|C-QND|8#J2S{rIkq7# zLZ0}Fyez@%XW^wwVY0n_MILDD4^=9vW4kimgU7qLAC#TwaQfwnr&VYO4 zG*b@jr-Q`bH}3nYOi01P!r;T){@^!!X%v9R2#hhjmJZ}a#XGxMuLBhdAPr#OSq3CI z0+ngtG`NA3r=>a1T^V@bNi1;g0>6h2hXri$IT7|p40lQAxe@1$f^^2HumB<-ES<}4 zfjzNo5+2j8@eDdl3j&4qVKX8bSWab3cBZE?qMefK)MJ|%{O@1fw(x>ztY{j|=U*(} zP^`fN4IXIlK!XPwJka2Q1`jlNpuqzT9%%4Dg9jQs(BOdv4>Wk7!2=B*Xz)OT2O2!k z;DH7YG{<}=63%3Jv-6!z?~)E}AMkYhI}p0QAl=)K?Y;3+ zIY|Cku$Ow_w-CA_kQ)Hx=Ly?;<9Fw%0vm6ixucYNa2qh!WkT;>57|B}cLHCNfu26V zKa4(O`cpK;LJa?bb7Yn5>+y=}AQKy~bh*}rUCpZ5Lcs7z!9+%xm=+1z2 zKX+hzZ~mlmko*Y7kGFFM4|swHdHSd+6bdJFi6FiC3G?Ez*q?ZFKYvmATo!O{2m1wH z>e@i)_JO~cfeEY!0+p+T-?Abru9?TU$=$}<5+3rWc8%yE9^+*Yw5v2RE z!S>#c4V8oB_s^u!Hc|L-`*st$Ga#wwV_e2tU#UD~9pPY48{+8)Tt{C*HwGlN4qV1t z9aJ8&4lUSQD0SfSC4{aPr29Ds+k5j9m4oD82KHyX@ZThK4=DWD-WxxagXBK}_F+Sx z_E8L>6M>}q2$%8ZBPtJB$9=G`^-{+sLbuyX9k`6QI;cEk9bK~EnP)F`(1yAC))yr8 ze1gk(tAolz))5Z&Qi6}v;qhc4bR}Nuz-7GELFFO&HrU`!hN6Ag+AfNw%)j@rLwPcdC2lv1(1}2j-|N`c8#lE) z$t4B*S~qT779WpIgl;!TlK&c^!)3gU8+RTX*x)+w1H$gd#&@`9Kd=q1)1T1yB_vrM z=l@-KY_kFClTx^G8!d#c2qf7L(%##-h{}O&@pc0EcYEPKL+Gwi__4h=ekzBH9mXcu z2aNFa4Q_uJp^FCT{`tc8-uS5;B)?w)T>pFFUqI;AQuwjGH-0Jy$sY{%m%Z@cCv;81 zJll`$z422yNd9QBj{pubjV1OEkI*SWx_^GLy*GX;2gxS|`&C}}w-dU36n<>)ji1Uv z^3MW$H1g^8cOZ0qLAoDbZ10Vq%0cq40(+?!ehZ;1qVQvTZ~Rmal7AoA@AkrfhR|K3 z@MC*#{8SE-|0dW6jC$HXVT3Lkr2Fy3_TKoZ93+2}LKy#E_!khmwG@7A?~R|zLGlNK z{beuw_X%B-(a<+If0ExX*xnmIm4oDu2Kxxi;kG%)KcQ1n__4h=ekun^cVae-e+oY? zzn#$S21&LZ+j{$sp_V7P?}Pm#3O8;$ZH%iw0U+J^vAwspQ#nZffMPhe6I`SYmp2l+ zSs=-_V_R=+rxGpKjDS{8lk%n(*2lXdvE+y4wC;7*oTbs z^bKx*G@;{xbmzzR-uS5;B)@+-yyxhJe=VWgPT|M)-uS5;B!4*A-}S=ZzSAso@;39R{KT1Mpq3~mSZ~RmalB*o-w|L>-N9fK___4h=ekupazXR-P z;ZGmmzJx9eq`QBxy*GX;2g!dK?2TUdiwNBU3O}~@#!uxS`Dqm}{=M*DBXsvE{Mgzj{y6S@lX3Fn$Yn;y88#)d*i2ako-olukymbme6gd@MC*#{8SE-e*xIv^}^p| z0x|wUy0;(Od*i2ako-Hro<(qxI_LN&bQX~A=Vom0ji1Uva$N)aEnfKd5xO%Jer)fJ zpUOe<)8@hWr$2ps`x3e^knZPaZ10Vq%0cpv0ehnt{vtxRfWnXMz422yNPZ*OpYXze zjnLf(>F$4Q?~R|zLGmvE`;dsI{S!^-cpyE-&olU`93+2;Ac$7(#*e>SmqB_hp~Ly4 zt^56_dl{U+KpR9mL*cmw>05*j=X>LEFN50Lg`Iyj=shm&089 zz)nly%7k>08yB|m#^qiPb6p0z?G&zkkUrtYg>AfXxtGISC@>t(DtmSj_FH`bQP|ANf;rZp?rhDd7%g>K^ zem;GYXFj$4!Bd`}e=`30`E3)PpC9)(`E&m!zgMCsKehi;1<%jlCiKkTP4Rz9vS&Wk zKeIH?&##{G{QSkKp7}>9^|SP@d_0!?VV@kQ)OM^U?4FhXfx)vLYWd&No}V8!^ZEI+ zDf#Z7BiweD<@x1B>7M!2@>eoE^QrBBBhxeA{d11%UtH~(Pvx(i@0m{>M}BtCd}{rR z7d<~eruO;y*Oq(cZ>NldqSrn1sqOcBdy&-xs_ zapw8?6+e0AQ$Nq8cRcgm+lT9IdCxPSdYlFKJ@cvMZ&327^^a`S%Gp0$*FE%PzX_p# zR=@B1xNOOMYP+hNwyHljEqB|ewy$~5XY(xX)r$5u0JqIsJwHL-o#*7g8qkVH2e_Aa z?|+Y=RNLoq@cx+$We zgjW&j1XjZaBQ(1+LT?U4X!Hn#^ur(?b9;n1qac1g;EmC)n9QlLp8)s@>{QbcdJM6b z<2xXf2QRmMHw2z*=mtLlK+NT?AU_z1(6%6i`oIH%?*Lx`$hqy{SwG0X2HaiYOmhHi z#z6TQkq9jU?21C@2IQ}S_|GGw5#oZ>^oCVcLAL}rGR7kG7PRkP2topggZmeh2@Qki zMj>EmFz|&>L?{sIbU;L0CDY#`{vpbgz%|FsU#XFy>vv<2!N(G~m%aul@bR4hWP zA-*de`n?~H-PeGh0S-VrF%1m_i~>XfxBv;j3Mc~111tf&0r&`T6mT8z0N^K~A%DP7 z03E;r$N_nPg@AVedjV$ww*ZZ$G}Ijs0*C~}0ulfkfC-Qfm=D+h_y}+ea0zf1-~hCi z(NGsaUqCp33D5$v0CNC#z&gNoz&^m2fE$1Z0GgbJh5;A=HNXle0@MJO1KtN527C*+ z4``);z5zl369HU+8jt~~1iS&*1vm!y4)7VmqWZm2u*M?Fwa)C&bbbn-yd2la)B=KWBASZQzo!col!qakQ08iqnpC>oANpfEHN zjY6a0S=+H_9C{UnBZ!}l=qLh3qKPO9MWab*GMWN$bEl$dXgZ2TafpGKh=tgQgSd!? z_$VGFphP4dg_OOO=FkQ^zH5~+|HX;AFciE#ohJ9elN!k+81(v)%qL`K)c zYF-jp2tsC5ffC+TmB`d;XJ};!M4UF0I;$lOmS)zcSO^6K{55D)5~~?vUb~9n5Wq4B z$!wCCRTc@3CQW9*8U*$G?i@G{GZ?E<2}7ky4$FPH*pybiQQ}lUbYgWHp~W$ql}d=| z?lOYt^yHq&WT-bXnIKR+Vd3nU#1-wH(5Y3h29E^R(9w}RZW@Uami>W9@vh=-8Kfs% zDjlqiW6^r*z+Gf9%q>x*Ss_9)LFCl9_0?Iu!~$WzNeh!og#*y(s>~R7ZRaJ>BHA^(2MGV_?-6SNBY?z?)pAAU{ITLibM;PP&aTGpsP7 zz&<1jn^gv)ef0|GK?b#_!tDUz54XptthcnlLN~BP0v;j|tsFkQ&Q&X(l?~?)rLKN- zU{+#;xjai2(^@Ucv!|BPn{2rMLgA7WNDOhx-ephetdLA=daE8TVlE6UsFvdD} zF0hlQfP0*u5O+(b*5iZfB*hDIkY_okf_ipyDphXhDN<2?vT`XhVXZlf2b1%ZjVCp7J>Bxv61w z1R3^-djpKHcAgBDH*<|-r!n}|^SHPiE%8>IGS*$?DFYt&%Q?z%(0U2A0o38-w1&X^ zPkHMpm1|`q$&(KXp{PG^k?ALAHbP^TsmUJ0m#61>Aw%X|8i(*9T!1ue4IXIlK!XPw zJka2Q1`jlNpuqzT9{9I=U@fB!Z5dzzpd1jfuqUkq)?c#$G66;aZe$VU%>oz!N`MH! z0>l8u073wL0sep{fCq7HXtw~@0A~O@0jmHd01H3~hyjcN1OPe!9zb0;0cQaF0NVkz z09=1BKsoFO8(q(=yK(dCq_}9Xkel|b|;J&yG z?I@rYkO>F@_yX=HLtg zqE(7CrOFh+lchzOvW%99h$r>9+Y)Q^Iakm0X6$aunjXas9sXQurT|RIx!;Oi2%E~=I3MN4RsV}*((xePl z)KxvV*ASnAa=fBrp6%18Y`KvVmMJA27P@?PA?T)iAEI#?=X#CLE#gro4yL|SV0C*~ zusS7OHN})>HS!`N-KPzxxhV?10J?&f4+*#U-y?Yzu(v((McQ?`m#}DS0QWRe7 zaSiTeNd9Lv$K4i>jZtBLKRT%Xj!QFGG--O6M&_tsiVUW&@M_v=hG#U-qkWUCu+pbe zB{M{)>18PfrurF$+}la^iBi^UN%wMb(Zipz@yri8mE-8GNn05&5-pLP$`X2cjTJop;L9p`?B?_q$u?k=R! zAD%k*e7sMC{9wW+8l>oN?5XAdm2{?C9VM{8ib(Hp(|->8m)+9;N|G%B+tB1^{Q#*+6XZu#*Z_aq)x9@l^TiB?@|l=HC$PcD2Ob>rhl zS}j_tg#Sm5^94e{c+k*8|KZ1+CYj8cJZ^? zLHO1qABuY(NA9!B!*!}h*@o}sC+C>|4d1(e*T(-%=gByDbV{aCd5lNuSdM`wceq+v zswxH^Z-V(A_s_*MZQ(>kWo;Pe4dWbtcJP?_pV%%wg1K|RH9(WcFn0}z0mK4u{SD)> zVLbj%jz_m^CqCEtbnSFimY4ISyIqv?k>9_yi+9;Yr>NnPz!-SQST8fUremKvTYFxo zL^&Vpc3t6ejVcAz+^sF~k?{B?<&xU-nnz}lJ+C~T=T1@M>0atLgJ+vuzQMgnqtdz8 zNBGcb7oBE!KBvn+f6EzPe_SSI!b7j{#QRe%@NBDFpW;=f6m{0$*^|ffAM#Izhc?Yx zm6A&9c3k+*UU5|L%rNzi$D^%$JU{B{AC=A1ZgQH*qRP&eJs!fTV=ZQPE*GrZvXwrM!uH=OVPC(rlz zISKqr^UdaMX_o=#0Iref`ro%hTiX3s+S2v`Y5_(-1i%-7+qt`aTiP;!1rP)92i$7c zmbL>>1mFR}0FP);4&Vn^)wV573J3<=Yy-A{B0vD(eru=;Py}#qhx@+NK8Q9D-jBoE z&5mtp*8rCR7Xjx0Cjg%Vb^~?*wg5H&Rsm`ORe%zJ4Uh>i0<-`rAQ8X5k=wz*fsNpuOlhb7vujBL{5x~o-}z%%+zVqW8)Z17MsK6@#7N`1xYfw z0^au3Xj5jS>hy**<4lv;VolG;%*qZ49X=v#-<&=35&# zz5UMSEnDB+w*9^LKiKi%M<4Ip^~tBZ_w4;_-~Iy!KR!RKb+mAdtQ%D)bR;`Q*Nv&`5YjPZY~8pzT1dN) zSL?#-T86X=8DBS{&Nrk*2)!<%&M%~ONMzl_x;7zgL!#=U>jZU4b)Fx^e=Q}f6V)Zx ziR-!qbPezi=n>E(q-V&;fZ+i?j%JRQj#mTLBcG5XL0<%I3wk%`cu=!`P5T`TIuP`F z(5j$aK|6!i3~$>0=jlm*J`6m`lvRh_ynJa9nZz`%8Z0fD^&KMg!J;^c@yfkOjF28IPj z^qbf(vR{jS)xGEUuIgRW+unOo@5Q}qdj|#f34C1tE%2}P{AHAS>}cx zA1udbIKniEtKR2eics3NF5Xl_thP-#$jP*~95puR!=K?{OVP~)J5 zL4HBBpbkM@g7iTzqX&i{V^CTUD@YtPBS;qXUC`B_>p|CoW(Jvp%t16qJ4buRD~=A1 zj*d=_&W$qRd01~O>b@Ql-|8V0z>+Q^bH9L=@-&JBsgS1$YVz| z_pzh5Bhb;u(bo~==;!F~2zCr`40H@~40a5040Q~1gg8PS!yO|WVUCfGQI64$F^;j0 zagIpGL`Re(+A+y7*)hctt9(IIdo zIjVhXeCGQs@LA|%_gUmq>$BKriO*7>Wj@P&R`{&+S>^M(&l;b#KI?qm@LBJ(!RJk% ztv>JiZ1dUf^PbQ9J|Fn(@cGc^BcG3bcKYn{`NZc_pWQxtd_MEp=d<7EfX_jn&wUR0 zG!1PQ+C0=Zv_)vk&{m;-p{+yPgtiTR8ONU%+Ag$x=qsTeLOX_b3hf-)CA4d3x6tmP z{-HfWdxrK34G8TW8W`Fqv~OroXur_@p~0a8LeDoo)cA1YgN={iDV+b?8$-Zo#PDH6 zF_Ia@jB>_D3_4rIPGw()FjtK@OF136kz5h?b8ZVpD~2zlC1Vg{4C4xW5+jBoVTc*? z7_T!T*gl+xoG9)g?p1EDgr5>S3i=Do0+x_15~082cDe>`1nTt!Eq9I`$&=@9bur<{V$nUz|FQgVTvSmK(#J!kxqwbBnk~xQDsN zxVI7q2nGoT3Wf-H!giv*qH&@$(f#Bcu|wQJ(oyo6#8*B_K3&d`4^z!iEmEyjeW<#w zx~ulp1Zx6P<*8YzM^ewEUPx`L3)7_<2bxBiUNucI2~0xMCevJVSH{ce|BG>SVsvD5 zV02-;%7D8I27_^(agK3@@g?Ic##zQy#x=%y#}Yl=yNtbw{U`e&`vJQpXBB59 zrzy7?w==f~_Yz|ocPdxLm2%U#2JXk)JKSsBd)!;xpSeG9Z*m`TA8>!;{=~h({gL}C z_ZRM6?se{M?qA#s@n6Sx!jri#ybTqE3M_(j0bf`s3>V!@{yzCea$~WN*esqUZY1d< z=`7hVX({K*d2)`NEnla)p&F_gtQn{oq#2@7q#jFcr=#h{=puCyx(T|?rXq8x`J&~9 zrHi$fHP|}98e$E#4!4f5&b8*IzmxuH`p@YXGQP{WmoYBulPpX2k?fv~UJMR{%Sd4? zW~^nr!C1#|Fj_FXGFvh`GFvlg%y!JS%wHM5GyY=SW!z&tW;9~9VoqgGVNYhqu(j+L z?)(cA%w$)vx3D{N+Hu-*+Hg8?)^L2ey}1EgBX=gZ1+Oj7kJpk%<2B;7;x*y51|)P9bQ6pgj1d$GG6jW#TtSwgK#(s; z5GD%e2up;sg{8uW!cL+r(YMLX#OY#-_=TGf1Z^eVCFdnyN!rN$@d~ANU_O=nWJX@)4uC3g5HUG!_d-;#@{R+Al^eQkE zmm>I?tGWpC9CX2~tj%SWzj$uYIdCYL; zWTt}oGW!2w93rNaIgH6*j$#U!$;=pL5;K-PogK%vvfpQazz*W{; z#o5H^!!>iQ+#b9kyq>%XynZ|euRm`xFN!yU7sH##>&_d%o5mZ@)ew4JAx04si7s>5%n><}! zD%Z=)9V^qJW?yDslhK8wOY1kT(CSD`f zOw~-*NHs6q`4=YOY7#W6)Gtye>cqOmx_n)Uu2eT$w^TPnm#wSP8Fl44tzbDAFUp4A8HS^53~=q z_hZB}%#68=rHmDfjf_o#(AG2TOjNy#tjN^oGhH^%6A~~OMKIXub9hb{xbJg4oZYDR2 z`xW;L_bk`Uv+`a>|6h#5&dcO2?Vp4O%lCW+g+t6i#`y&F4`e_Q?yaE zRkTgiMchr?N!(G~UEEHbDPAI8Bwi+7D7K4#7x$C&mkf~DB>9p&$t=k?lFO3ElHVi_ zNn2?L=`iU?X(#DGX-8>qX@BVe=^$x$X(xF{IbA+M9wE<@ACe!H?~{Kj-z)!6eoB5p zzEOT!enx&o{<(aEe3yKu{Dl0x{Gj}p{5|>C@~!f7@~`A)hxo(%sQr)P1G9jDN&`;ccOD zp0UPQW?XC>Y#L%3V~R0pOev<_rsJmbrn9CKrZ>$S%qz_s&FjqLt;?;8txK#$>3h?E zO~0RhJ>zl41bA35GV4&*=ULg=S=kS>>t^xt%Jb&tHMM(&it170W*PJ z!>(qpVly~VoN1gmPAq3SXA0*a=Md*J&K^!{ZUQ%lyM%jzyNS1(w}E$@cZj!x_Xckp z?;vk4Zx`<^-kz6o{@cgf-MwX|9!C`a7TVi zUMIgVZ>MOipsOaSHmY{1zEcIMho}S8{nf+Nz0|?#P<3DRA8Lo@wB{Gh8O;gJEzSFy z&6?jdKWOe~_GwOPwrjrDT-WT-e4+VPb5FBHb6)eE<{Ql^&5YE-)Z*0lQctCxP3@&S zq-&)gt{_ofqC-)sNRt(2vr0*Z-y)tM9KLqaUCjsvoIuqaUQ- zX#B{y&A7?9+4#0`hw&ZbT4RU_2dcK1elT4&T`_%NK5YKj{I2#VD-Ypj{+#p!d>OVU42Kal=e`u_Ar8GoifNNXYn3-E z4_6(p+Eeve)%5CV)yJv}7P9Qq?XmVayL?f~q9coLFS@s=QSFA>3$>SO?TZ&LPGoFj z__12E`mpXW`>}#p510d3omkCS;jCV)ZmjmKcC3dG?7agknDq;@H>(w^E2|6Z9`k4B z5Y|9e9di(?1#1?2Eqfh%HTxL*DEk2W2s@r5;_x^^PBLd8H;=oLyPSK8dy_}wH{y@x zKjK~I{mN^`f5_{=|ABX#cZJu2|1B?w6BlQbYHD9JCWMN+CTQM5(4P58cWyYL<1 zd%_QeJA_R{Y!P3?65SR(7X2mqQFK#uSMn) zRxlM)72^~v#dyU)#UMqnB2E#jh*3>dEmrMO?N?1yPgOJ3QEHAlRy|1_seYjDpy{aT z3_lc%(Z*;eYq{F7+KF18c7S%9wzD=?%hrz9-q*0S5!!HVly;zYlJ*sC7j2}rEVVTC zgVa8{{<>gYKV4tlUEK`*LVbyTj$W&x_6 z`q_Gweu4h5@tpCR@x1YK;}^!UrYzGV)1RitrU#}!OvUEg<`$Np&6mwTn!kmcm}INS znq(DNKe6t&9<;t|-Dcfo-D&;My4SkHIyZew`r-6r>BrLtWc11i$Oz8(AtNNSf99CX z9+_d8qcdNu?XJ>6nL{!IGJ9nX&*W#ZvZPs(toST(R&rKCR#MirtgBhyXI;v=k@Z8? zxvZk>lI-)@&2rl1l+Nm%+c~#YZp++&+`!xpxwPDlx!rR8b6e+j&F!8$E>DuTAa8%( zp1fwZF1C)guC~s$@iw~c7hB`}ySAqJw{7=r&GH}E?%90vAKO~yKeFAi-Oj(2j|yl7 z0}BQf1Q!f0__$zDA*Ya6IIVC@A**m|;mE?ULT2Ic!m)*;3Og4@6owWC7e?WSQ2)&v zuehxEt>XE`Ym473E-zkFysX$*l2MXhQc#jxl2y{Bj8@jB%&)9tS_43u_85Nu6otk%M-WT(>RyL|?R`o|Es(M&?ztX4bab?r02bBw}u2g+f z^<5RGI<7jl`dsxl)n}_OR-dmfTqw6I?6Q|~{VTL5+m-f2yV(A*{kz&ti#IGew~A9IBA?y zob#M>oG&>vZd-0wE}a{}oxuH!`$#>RKZCF4NAtye89$0YjUUR7=QH_y{xH6hKZZY) zFX9j8EBGV$k^BU{Z$hht773RUnkKePY?gRA;abAOgvN;@6aPr~Ga*1A7mP}ZOq!ac zPMVPvf#cTwo44>Jc~Vl+e&IghUg4+01Hu*}Ur}?BR3s85i<&1lOKy|g zJ-JhIU~;?U0m&VbyC(Nd?w{N_`McyX;!)xe;?d#{#5=_Ai{BG}A|5FjElH5TiUg8W z$s);O$qGrWJW+Kd*mRe?@;(e@*|F{-M69;h_GAezX3h z{vG|d`aktM^nd7o)9=@x(swhwr~g|2lm49kNBuAQpY=EO2lV^&Z|QI8Kh@vR|7mP7 zv*pak#yiIGrd(6L$=}@F+{yfkxvP1Oxv8b4#mCajQfF>$xor8}@?vdwmHxxxZw<7n ztZJ*=YP42b&se{-zGppbJ!YMkekT1?`i1n-851(XGe%{M$rzWBni-YJ$W&!%v-DYi zWz}Ra%nry2&gq^rIHzAu*PNa?Lvw0oEt<7(*5ur%+?lyUbI0a}=SJj)O6(;SC38#WmsXYzEbCF$r!1%}v}{OOud?oCfn`(6 zlgi&L-&DS_d_(zLXFz?d5u2rq8x>a?q>QmLLsz(*Pm{irXDxj)u zRbW-8s_s=Cs$RzNzgcy=>Ty*<_3`T8s&73ykI_KUQQ?00Dk8IrY^ z^^#AOuThjMzEJE|{Gd3bIG{MDc(Jy-N}p0(Rh&>txdJ3?o7RtI#f4I zH&{2!Fvh?$^fnAPXbjT~0frz$A47M8(2!{8Ylt@(3_}e43~7ciL!4opVXz^}(8Dmn zaK!L3`u}1arG~BshCyM7HsDoIB!;dtyUpx3Gh}A(nWJVJX8O;JH5Hj`rcve~bC`L6 zd7NdSWrQWr5@Z=^8D$Bx46}5%^s@w8f~@_lsn!|R@2nTBSFPu*=d9maFI#icXQkWI z=cjK^znIRH?cy`V7mBYHpD6yeIH6=u$=;H! zC55H-(pSr*W&AR6S$J7w*~{qvi*fMEgk`L<$z@?>ss z`N!qE%eR+*Q2u`Tr{z1!%PMA9s$MM z?T@v0YJaHxwf1)HJB#05{Mm|QD^9K`V7$$GkM%BV8*4x76V@iy2ds}-n^^~0d7KPR zF6R>G2Im^*JI+A4gPWdMgBqlN&Z#-HU1s`*ZeE|{rm&`>-{?OLkA%UG}H6k<3@dkj2WPWpT0zvM^bHS!-D{ z*=Tr_GEn}Ca)Pp_a-edEa=db|vaQlz*+JP_IZD|{*;&~P)*D-?+M-&dE>+J_m#FRP zB6Y30LhYkjkfKj{8OJ{8s5R^~d}P>YIBBpOmKpXL&KTY@tT${o zFlGv7rp#2%oH|o8Q#4aIQ#~_wrfQ~m=H!{$nej8nnK-7==1FF{d4f63l4RjqBo?tH z(n7ZgEJBOOl5WkkqV&7gM(Mv=f3ZHaI;{7t_pINhUrHBdq-Lly#2Jc=m(l+hy)t`Mc1F(b9BGarN0YO4*0x#i&6=N^m0O*gpIezL%r)et@t0syv$Ih zE6Xa&DVtEHEt8j*m6w(uE_o>84reW-eLO+w9>n(;LeH4|!tHPdU9HSC(OnyEE$HIr(_*3fH`YHAnO+85Xt z+K<_f*bmtc+yAitW&hLuyFGr9Wl{PfT5Y@9S87|JhFJ$PJOSG#TT z*2UWwUs>|QvVs+DR=%<_VCDC$pIO&gU$JhpzGi*N`hsj##ceUDwpDd2>1 z-{#iA60Y6jJI6ofcZhEm-y*(se4F?`_?_Z=#rww7;(zCNN$8YdO?)k}FmZljSz=b= z?8Mx}$B99LKtW%@3_*(EO45y_ACk@{eU)@B>1vWy_^t4J;T7R^;SJ$U;djDo!b`%| zBDtt2c@De?q7d`N31Xi3wD>D=OUY!3QSzZ=itNRD{xV9_Wz%IDGFZ$~CXpq{5@lA| zK=~YHqLQavtISkNl-WwQQlku0>XkW4lj?QVS=Cpn)#?rEkcxu?Tl438QY#T(ze}QZClmdX;vrAU~JpAZQC~Ad9UXuBp>ejzV@|ut#i&k+Ux8W zt`S}oo)l(BCjvtO%&gRaJ&e_i6?!E3K?nCahyUe}8UE)6J-saxtzUYp+ce&5I zPq@cJ?V-_7SExHQ1ZoXoq2W+(=%cTi|C8^#@0;(p@0qWy|E+IHAQ&hMEDVGK^8@j~ zqDqnn#*OT11*f7DgCRLX;9^ zM~P8dloh2$$MVrH0&m_^Jr%mFMR2jmzyWtBK{MzEQ6LY*fL>4vl0iKv1H+&Zl!F{F2@=4|G7w~dbg*2pO0izC zOo3BomH8^XN~kVWyDDY>vts?d(8`eR(pf08> z)Sc8H*6+}t(C^V-*6-4v(~mcfF-|a!H4Zn9Hm)_UF|IbPHytu zFyFI$vb?qYv|O{ivfQ>jvplriu-vgcx0G3~TRvF6TQoMEZLO_hzW)#X+}6XMb(Apfpq-S{UjZZXE6q?iy|s?j7zF?h@`8 z-VyE)X&31f=^g12=@V%m>G&U*|8*^$xyN|8A*0Y^-Z-;ZA{foH%m87 zw@%+qpG)6O-%OuRUrt|0Ur%q%yve-H^vq7pPRZ)BV76vyozlwSzk2ENvOQ&I%9at( z_8qu)|20n8&YP`H!x$&<;(!{G;<4c5Ay``7!zO}=IrO3>nNk7lHf1rQk+zAGjUd0xkjPft$cRisOoNiVKQkipz@a ziZhDqid%|1*{pfnf{ehN+r4+;+nPYRC=4-Jow42+D3;{oOs)KWyD`G8;#>V;$7k`;sfGs;ya6%CYB{uBrYc!CYvN%CL1K1 zB^xElNlKEJOeKNTh}7uR@KpcQ$W(5sak^K!W4c|sOS*0Pb^1a2eR^AFSLSEtb*5J~ zmTghmt+YpJuhOQa?MkneT`CKemz4KGbwYJP4Mu%NhjDgX6z9P~xQhAyKXe3lnQ)PC zo^XZ$ko%Bx$wu;Uih#0t59%VjZo@5SY4Pl+(oZwvJ+~d6C zJmI|JyyraNyyiH$F79>S6`oyGByx)uh)P5^MGHk%QBo8Y%@a|?Ys5FiwI$cU_uyUd z9(WUc1il2{f_Cr~cprQYUIyQQ@4%;uyNWl8CyK|4*NRt)Pl|hrp~`7Wxk{;8u3o2J zqF$z+rk$jnqkW;>s9T|1r(5+O*#B9oTdjMm`>Ow;|D=DbuWDFoSYf~$_Zn-N8<_u? zzMATr@0sqIZ<+6yADHi&ubXe12Uy2hr&)(v2U{mw`&!3Z2U(|DCt8PCM_OlChg!#5 z2U@4tKH7fS6n3RuZU^lu`w_=M#}3B<$3Dki$8N`Q#~#NsM;)iaxx!N!{JT9?Pl+ey zDe|oKWId2)nJ3`kd-p--p^eZ5=m@kD+6nD|jzK4((f(onDgF`uvHn&5hJ~#P+Z47d ztXtT*utQ-^VdKJy!SO*=@JH}>@K^9#@MmyYXl8hJct&_ucuHhkWKv{mWPHRHwM5-f zN7Na$M@PmM#>!$PvAJ<)yjNTkpB3lEXUAK|t#L`59GAyQaZLO~@yX&-#m9<|6t7Qg zOI%5`Pj*bsOI}P)OKnLFO;^oSM*J1C@i)CDyE3~XyE;3%bbM)H+1au?Ww*+1m)$HI zS3bM^K|wKY4emPO8es&PN`J`AV}0U$;QZm#~$hV8rU zr%h+q+D|*qI_f&ldX{@md(L@|d)9e&c(!|%c-}&~PW77lD zi_;A=`~OJ*)XXBX`PsSI6WQb0-`Qi?eOXi~wUkkMudGFRzw$iPV%#0VUBUyxXL7Xs z73~A_EAtEUGqVb}5%(VNHt(_Mw&;fFqNts`lf0L_t-OQ0g}k-Arm}&Opj@ETt19OE z|IkL&ZuJTELp7xFYW^)QwMTVr4C@VIqtH0cJl;IQJk~tiJi#osO05Q~&?>TeY%1#( z+jiSF+cn2?&uz~O&t=ae&tuP5&rhg^uYvD7^ao=2>3*D_=AT$dDI^rmEF=}?7a|I$ z6%q?;hw6sRVPzN!Yr~STF{}<_BKeWkkwCOCx<0lhc0YbTem8zFek^_~emj08{vduj zel7keel`9qeyey>;$fmsvS*T+yp{Z!q*coPXT|;@Aw^E@N=;4AOt;Lm$u!75%RbFs z$==NROPQt0Qc=E>%{=C|f|<~0$E)m$m_ zKc{t$t&07IgXjF|`R-}r{o$$Ut>>-ft?O;>YvJSgclf{g<%N<$ULjaWFBBIx3N;A% z!;Y{g>>qViL?E7U5iZrr}yKHOKl#^M|56Go1iZRVQe z)`Ydl`oJ;5JKj6U7buKIBT;q{qli-^NP;O!nv@}D@R^I5OPTW-ObNaOSMs>DyzEoi zdE9eCKQ2wK&?>c8bx51fHq1BD$MVGs;r{^ti9(&TU1(oSR5U3$BRM5`Bq>kPGhMTU zEWPA=>5o!#nWd~&xvpGU{*l&F%$7^cGV^HPKL7mi{+O~zUZhCT(pNIwvZu;8@*BEL zp|0q7l9l0RN~|S?E5e6kmLhABxky){FZo)A3EGOx z8Bhb52uuPd15<#hz%*bwFawwg%mQWubAY)(K7as_017|@1po%X0yqE<5C9@T0>}Ub zpaL|24lsa!OMHM0Z~!jA1NeXd5CS4V3`hVeAOk=^4k!R6paRr@2G9ckF0lg!zzCQC zGhhL%fDNz%4!{Yx05{+PyZ{9F06!1_3V|RH0>VH9__w(Nz(5?B4=ex{0*ipfz!G37 zP#N)8%*HZcIj{m)39JHE18ab_z&c<(umRWzYyvg|TY#;=Hefrj1K0`d0(Jv?fW5#z zU_WpGI0zg94g*JkqrfrXIB)_u37i5>180DUPJpVxc@%&@?Dbz2tq+okN zXMA;HKVoCbU+R7CM)4_ebIEw+p!_lU&+>2OKhM9Pe>?w1etmTNf;k0U@!jyPhy#fZ zvYXtLGMb{Ms3!2H>m!P{AbSjuz5GbgHxsSVx z8-VYFAA%o4v=hxl579)l5_Loy5l3!8=}s|Ij1&{aO1Vqb(A>0Y^tN<0{WAR${Vbir zqOmwECX2^nv4|`Ni^Srx-g4h?$MHwu6o zzrk-frVj>#nTlzHX^-iSX6qO5~4&XK1w0QPk|``ikA|n6jSa|>(Uz1 z3Tb{?kmjR>Xf@~^=z6-Aet~|TevbZ{{*3;H{*iv4{)qmN{)7IO{+0fdUWM_AK8odH z1zBNMgjK|XSPGVjWn{@&4wjFlV_8^AmYOx3`;PmG`;q&B`ANE8xKB9vq#QVAp}mXt_%5|xB2F-gJ_wcIFY zEB7jQD-SA29aJrmsr#^T*vNuv5ogZBsEsHLV&Wi$xUWtK;{)xQ&6vB+~AS?(w0zzmJ zYJ?x*M(7Z85J`jxkwF*`4ul>NMU)_l5M>A$;Y1W8#0VLp47Cfj2Q?Hu7@dcnh8~38 zg|1sruV738Tu@X1VQd%&CWdihd>Apth_Pb07zsv=;bB4;5W~bUFewZh!^dziUvb}Y zAYO@=;>CCcUXIt|?RX8|gjeC!cvhw8&s41c3-A_ved1K&X5tRwS>hSu2I48=e&QD5 zF5*Gr72S>0XvN55v}JT;^kZ~oG+;Dl3}7^4G-1?d)M2z|G-r)vt!8avooDS~tzd0oonWnD zZDg%w?PM)ytz&ItjpZ)m?&Q|t{o>~En(}J%esZhx>hT)zYVdw@oA4U*zVPbuJ$wm2 z%!m0}zKNgWd--m@njhi^`9^*@KgLh> zuUf5IqFSJur&^^dRozxUQ;*k7(2UarH7U(n?MLl@C;5Fhm=I`f!;2-1f_z&d&Tl}5;Z~SZgef+Kb!~B>0NBq0| z&HU5+jr_0tFZ?(Bhx`Nl?ff(Rr~G&P4g6pHBmCF=Q~WjjC;XfIAN=F|6a0hx7yOg_ zUSg-%E#4x&BEBZRC+;liBIzX^BJD5jBpo9iFKsHVE4?AfljcaB>vwXRHqH?Bk zmQtdWD^*IF@`Un{@|p6b@~-lQ@`>`H(xW=1I-okHI;`5R+M?R5+N64^+N(OM+M_zC zI-=U9I;nc4exn|snXZ|kS*lr~F=!8IYwN1(a&$Fxb#-60Kea!!Pj%09HT6yOP4zYO zjrEQ64fS>O)%DHvvkY?#vkg-XQw*04rwwNfR}5zi_DZQgsaXHF8qXW6n5vqLX1&>9 zwwdi_hq=0?wxz0tV2jy8wmr65_J;OG_U88C_G|W|_Ivj8_G9(~_H*{b_J{WC_FMK7 z_RIF;_Ote@_9yn!_P>rU&LZb^=O5>HXD!z=XBF3F=P1`p=N0EC=PT!Z=LhF!XMNXC z=NIQY=Zi|2|2=ZvbN+CCbiQ`#ylSu6tMX3t<@@+Pkx%Hm=+6n%3MfMlBljb3BKIQi zqr0PfqnD$HqkE!9qbH-sqL*S9W0(XYfl3r4W+n0y9g#JVwUEt_U6BB?9r82c6Cw{e z9N7=~1@RTp3fUgn8QBv#6gdz%2-y%xLKUIns1v9|sKcmZs52-gnuJE9X=pkci)Nuu zqZ<~K74*P9z_h|P#XiM+#5}^Z#s0bb!vM zQyC-%pHZ>4`#^wG!jbe{r2V=S4xxer3`6ODwmq2bg5ICk`9y#q=ize)Gl>P zTS{G0lhh*BNTbqQ@{98G^4s#0@{zU&@~iR-@;mZ-@=Nm5^272Y@}u$_@-y=L@<~el z|38*i;ZLX3Dyyh|C_gFxD8DE_Dt{`gsxGRos~)SasCKEIsvfGIt8S?-sBWq*scx%o zsIIE6sh+9ssPC#jsXwc`XviA6W}RlgW~b(mW}jxSW{YNrCZIj8?VxL?YpiRgYpUy} zYocqRYolwc>#FOi>!$Cg@2VfFAE@u8AE586@1pOm&(rtO57J`{WCOxLF%%fk29)8Y z;g#W@;f>+7;f3Lr;f~?9!E5vzJ;p*~&=@d6#%spLrV0mNVFNj)W~LgZMyA@Px~7Jv zI;N&3w>f4Gn1g1YIb`;jJ6bwenphfIT3cFLnprwonpzrJ>RTu_rj2G}*r+zLEn$Og z2WqpP25wyURWhO5Af z_Ac-)^Cr9@Z_Hcfg}h0x*IVe#cs<_5-n4hVcd577oAQRerQWEw$UE6L#V7S?d|IE< zXZI<5HXrD7`K&&*&+Ka&m>$FjO~FOMg+XmdAKDz+8rl*%AHEp=6Zsse7X2If8Oe$M zihPM&iQbD|kKTwrjNXktj$Vu2j9!i2iav@WV-=>a!UpnVh}h-WgV>E2B|%T@N<2*6 z%?!-i^5sYol8K}t8OQ?UY$O$_M9x6YMNUMLk+YC2WDDd}BpoS4ijiz22RRKn0VzYO zka#2tc@8B;OVJXv41EQC5#7I_q(Fn!V#i?TVv*P(*gjYkmW3UL9f}38XzWyMh28&W zpgwjmmW$2Dj>OKu_Q#IKPQcE_*2UMt|HL;ZJivd!-@<>wS0TK{|HjuQe8blxe8iu{ z*CM>ZKg55)KgPep-^Vv3{K7XTJjGWf)F-^hKgYkrHz4E?C`1N{K*EyvBpPW1X(&lb zLXzktE=fWvAaO`|(qs~qgeFZPkx4U1VbVC#T+&F=9Fm+QBuyuwNI23Y5{0BB%gFo5 z`^ZE}M`}H42WnetXKH|<*#WkbZDH?bm$6r~OW8^GN_LnHvLSYqEn}}`YuF`hDSHju%wEJE%`UH$`g=Xw z!*;M^>=0YdF5sT#a(PT1nMdSNcr0FPzCi#9qJk2ER3HYw0`b4(Vm-0qI%k@k&|$RE+;~(ht&$(%;gn($mt1(w)*D@&<~p@>YsZ^7@K* z@*KrSd1J*d`CoZWMKeVe#W(pEc|AonMMH&EX;PY%Hf0A@D^)F36IE+fT~%$>Uu7dz zN0m?YMfFYfS(T%%s{XC2rLLm>q57rztE#WAr~ag>t>$RhnlqXUnzNdU`TjrjNzEzE zdCfUZMC;dH)Q;2*)b-a5(hb%P(dFsJ>bmPj>xSxP=+XL_`nmd9`Z@X@`l))Po@3w} zga(m;Z4eunhMk5VhHr*1hOdT*vB(%T4mC|T4KZ~$0j92|TvMK@wW*J(gK3bduc^Oj zplPsagsH8mo2kg0GAGOn%|k6?Eh8+$ETb$_E&VLLEfX!%E#oZXEwe16ExjykTd}Rg zR%*-IPS{S`PTS7e&fAXK&f1RKI@v2D{)*Y?Xm4kqZl7$QVQ=l|?r7s^=jiX~ol)09*D_bgWpt@ri(G0~#N}`myV5R=tH`z7 zWpTM&L073O>ssL|bXi@CU29!FSJJi4WpgcYL9R6}tt;aqdU4*p-mTt>`Tjrj0q=hA zVeby_I`1*>cJD^-Ht#9#Chtz~F7H9_Ztos1+UNHb`K)pVNQEf8Bri-?4emK)*o8z{ud}ASFl*T7rv%mXIlA2<-|T2yGAT z4ebwI3*QOf4&Mr24c`mj59dbfMVmz1N9#wsMBheVMBha}ML$G8MlVHQMqfprM{zMi zj1((~VPmgipJMN0A7kHQk7D0rFa87h|7GlJ>{;wh%vkI#_7$5G(u6pnNPvmG2~jd9 z^*EJGXOYFoB4in|5V;WPLI#mxWGPaBEJ4CZClW%^QI}9n3z`%xDp>k2z-8FQ*wt7a zb}DWGHjedSBiPMY2X-MA#xBBIutDq+tPNX?osSJ;>*IS9h7&4-|2BkPYHL>Imu>>R{?H>ICXk>J-{U8iBrqzL>s} zew?wLaf{xJ44sxwG!kABd=dSZv{sL&4u3t=LEk6zXZ<&^@MeWt%PR;#{{10@$L57y`WJ6`cWF%QAESpxw@&kS-O1P zY~38)9o;J(L(kE3^%T8Suh5J1GQC_c)C=@9Jxi}Ps0>Pj+)&L}*I3_DlB3j#&=01L2tN80(np80C24 zc;oo$_~!WT$Z?Kwj&+WAYMi58XI8*D)y#d+ z^~&|eb;$M8b=CF2)y{p>^~ZJ1`@s9ed(r#Qd&B#}d)xccd&~RE``mlg`^A&s2;lJt656lgW3=jho0{8$S zFeNZGfDX(EpaQc3a{`C}J?IG9gFAwIg6o3YgPViykUiuNT?<_doemuhT?yR^oef#cIT=$Cxorj2>gf7_q8wUAQ}39c~NvfE&T};VN)b z_;2iYtR|cT_k^p#?crRw4crQ@0k?!r#i8P0akLmpSQEZPWkldlxDxinfyA-I!NmK- zyM!buPs)Q%_31m$~xY`CIaLBljYYAlD!dAx|JTA&(&sAlD)HBX=OzBTpia zBex*8A+Ms0Xg%75Hlq(>Z(>hj&tXquPhf9j_hBz#4`H8U_hK(#L)f#}%h(6lE7)V$ z57^V#>(~R>=J*1FfWRRj2y+QD2_OMW$R|(Co!p6%M^RAO)LB$6RY{dl zX;cA~Pi0ZxQ4zF!+AP{!+HBfk+9}!*+DY0`+64Mq`fB=D#!TicW?$x1<}l`9<^bk2 z=0GNb*_%0m*_kDXbz^mB<+2X5-?Lw`8*`d+>To)9ayga3e;#KtrxT|Ir!{9JXE>)T zryHj}rw0e%^x{n94CM^u)aA70OyG3q^yJjzJY~1z4B&L(G~|F>n0t}ymUM4?eQLpW17R45VV3C9Y#!gm6_ zaEMSSoFD{+Q-oR}K{!#U7S0il7S0w97gB@>Axbz{h!zeMnuKG7)5KH7lf{$7GsF|c zS#g6OKgGZP1N;Bq#b3qW#97%D*)dr}wog_ri_3~+^JME~+hs>&7i7C-`(@*&^9|*SyHw}woo=*fl;6pYz0Fx zQ9)I(6iS6&AyP0ElN1ESWW{WSTtQbL6$OgQ;D3r@u7adMC_~DiGNz0w!^$zLNvhGR zQK|{5S*n?;De773*=n>JrN*l#s1a(UI$u3WJxx7VjZxoM|5g7{|5kU<7&JPKOZZmP zNLyX|Rr5#lOY>dxP19KWQ}adhTJu@+Ta(sq*51})b#xs=ht}bAB%M&l*I{%-om6*E z2kA5VB7H>f))(tNdar)I-laF_(|Wr;p*Q_IT6G#M27{rAv9+;{v8l0@v4yd#vDts% z{I{L4v2mesfw9c^(#SJ$Oj48DBs3{aT$9SAFv(3!lis8?u}vGyo6Kv?K8x34w}dP< zi^pQLge@kE%VM?!Ekzc$#bSXiQk&Suw+U<#+Y;Mi+fv(2+bvrcJIBFr=o}P>&_Q;v z97;zQKFy(Z@Eu^K=xy9c|cx_i5?yJouwx+l5&yXkJZd!#$x zJ;#l9gYLubuzR$7x_g*A&n<9U-Ba9s-3&LzEpsE?^`IQ+tG7P%!+XX1**h2d=4}Yo zfvQ4ZybYil&=ucF-)Y|&-yPpg-wod>-#MShpY`AMKlVTJS4R7H0bRfua0fI2SHKZa2aJI+!P&uCL2i%}Sop;+kOi}9gI zC=`l^ibBy49C{bJ7kU+XA9@oy7kVCg7L!Zg?g4}fRE z(_kqqfe|nR=EER73}(V|co2+%*)S4T!ufCkJO{?XgW>YxlH#)BY%!dOCt`_Y;!NU4 z;&yYZR8{5MdT~wJLFsBL*zYV#ki{s^fi zt|{&pwh^v9t}3n>t{UzKwgWB)_ZRye>nE5AQ9_E~B{&E+f|^iBFcKg_j1VSh2~L8K zU?LO|B7{E#G4U4Z4e2rIGU)~B2I)2FCFvvS0qGv;Cg~OF4(T@OI_VkdE=fneN3M(r z9+KG-fIaH3Cqva?$DvpJt;qW+1IQbkWhsL3BW^)QS3=WcGIARWw!{z8WD(*b) zeBL}>Ij;skhu@XIUbsbgyi)WhEA|iP3C{=<)gD4F`Y927qZ*TunPz&q6)vluJ9pN zZKAEKZLZy>b?D4GkIt!+>FhdCXVtlM8}uvmoAj&o%k)Gh#LADXBh$GKw~ds592c9O5-Zy8>7!uVhWgIrl=`l z3YmhYtSM~rm{KM;I&E5Ha+-FU_nLQ^cbJ!2wptEY7Ft$V_FMK@4qHksXDo*-M=U2T zrz~qN+bs#pE=##(iDivtxn;iPxJ6}qV0&nLY`aq_`yaV>s-0r@JG>5;19F5MK}VsZ zg)`}1WWa_@JacCT<}-0R)v+@;U*Z7es| zCDtxxj45M=m@2jyUIc65ENq15!A0;2I0RSB_y3`nz!`WYY=D!n4PFSpfy1y9E`}Gt z7T5>RhXb$|4#H`8DQtxycsX1O7sCDFvc&wv-vl9PNg9*Zq$_DpI+LcPJLyQ;l4p{q zlPy!LQ)^Py(pA#6(xvH=^uhG@^v?8-^nvv5^wISC%)`vn%((3MEF;Uz(zEYNK9qbe zSz7iNSsewSz9DO(YN5U${~+t3>Z5)m>!J$LLG*j{Tl5UvB-|X_P~1e^EZj`oG#mj} z8Sz)l1_?I-mxmjR>xUbM8-eSC8-;6&Ur8t>tS8JPEF`QYtRgHX%qRRM{3U%N{U&`S zeIZpRe93UYk1R9JT+3X|EN8;Z70mg}5R=E;$n4LOapar? zXCBAHNpea!5l$f|zzK2|a>_XZ&U#LYqvaa82Cj*_fxD5rnYWI&oVS6umA8VomRCho zQ`AcISolrYLiAqvNZ48QSNKZ!K-f;yLG(x1Q}jXjM%Y~RRrpjmK~!7xMEFzKK=e!a zQdmcnBWf+`E@~wDBJ3fmCHf?6DME=Cix-L)h?j_~N~%cyimOQ`f;~Vh2!TgHxKi?8 z#rO|_elQ5KKm_OkNnirhf)daPVnHQ{29Y2hECS;o6|4d>K{03n`Ct?*01H7OXakEu zHmCzdpb6ZdSgXh?)+y#GGK%Gj&5BaRVnvx^kz&4Lg`z~URIyQ!Qf8C{67OS%X$Q z(zwC6$+*$D)pXLd$F$0H#u=^%zVmx()`tO)AGXd)N<8w-%{QB!}7%P z#q!?r&ho}`*P^wpvaPeNw!OB!w7sysvOTdqvvKTv`$9)~rL2D|#($Zk*s;Kob|f7w zod{=v6YWGg^PMPXu4lBTk*A8Mx2K_}j;DdAlc%nyr>DK=r@OD`hr70?zUPy>kLQEC zh3BjLrTe4%m%FLwh5Na?rRR^km#2egfTx=0x4Wa~i+hl#hv%vLnfsmlt^2#XwWqTO z@YM6P@eK5^D&_ni2eBazq=W85Du@7KATor8m=FmrFk$<88wf~*}mH%wu zNMKvwV&Ht>Qs8o6XW(jJPhel*aNt_tU|>gJci?(pTySnM5_}xI8@wKT7Q7L>9ef&` z7b*$O4`oB0!`;H&!@1!B;TGX`;g;bh;WptO;hz72{r~3Srs3A%X5seXR^hhcev#Zr z>qy&3=Sa6m%Sfw;Dk_hHQGQe$9T@8y>mBP88yxEq8xZrvys<#c5p%}eF?;MBd=Nea z?}M+yTi~S>B;J5Gr_!)cxJ_etGpTMW#%kXjd9()IW3ZI8BR!aWg z4Bv;3z?)!m@v7pL#cPV!6)#FGNL)Pyv%&e ze8{}dOv_Hr^0Vr!BFoEavzn|tE68%PlI*XNA0@v_{+4_#sa0B~^n1zAlG>#;N^?qG zWf#jDl{YSLk7|Z$g=&jxg1UnmQgFXOj$`0t|AG9k!troyoD`?T(QrCkdwe_mF~V-b zal&504#EM#F2WH)D{>ohJ8~Ctb8<6sV{%J!FLGOQXL3jKTkvI_etg z3hFZI2I^|+TIwb$pC+L3Xdvx5?J4aE?HTPcZ8m)uy_C6(nP47fZeku`?q{B2?x>Xf zzn8g<8Dw7NT;ZJKoaG$n?B@762RS!6A34`Kd0ZRU%w51e#@oZ&$2-A0$vey2&D+V_ z!8^t4#vdZ$iDruUqQN48Xq<>Dl8Uq2NZi1+Z0z6`xN^X zCl!|zClp5&XBE2@*A%-HM-(>{Hx;GIGNn+(Q}I<26;~xziBvXqMmiOz= z8oOqow!e0ecC0o}J4QQHJ6H>7cWR$#GrCgUd|inyt6QL3s4Lc`E2aK3sk^Ozu79k5 zp}(VlsK2SduYaI_t-q_kr(a~4Vw_=|ZrozrX54ICZ`^9UV|r+MYPxN@Y-j@I1kyQ@Z@`B z9*qa<;d>aKpoiz7dN3ZYN8(|7xn7Pp3q_zL6o+8Q2RWbwl!6Qp1TBO-P!x(mrH~sc zf=Zwa%^&(Wpa5kDXW{a~GYrFqLTe7}v_tI9Sol85G zHZSd6+M%>{Y1h)mrEN+(mHNuOWl-6gvejjm%dV9DC~I0iw!8r?3$%Dz=$oZ&Z zCZg@3@1!4OZf5RcK4soxK4v~*K4actzU4gUJmkFOJmNg#IJkE17VZu11zt#$5IIDP zMSfAaC@Y#TDicAXxF{^DjQA^Nqgdn;EfXyg#Y8sI5>ZCv5d}rCh%8<$t|K`GE(bq> zm%xYME$}t?6np~S0Y8AZ!3W?o@V?@`;+f)u;*sK=;(>DrNlNq+73BrhBLRsQ<06 zX85W9rT?I>Vfe29qt7v{G%PbvjASFuNHAiIB;y|AKI4944Ra&&2U8XEU(-)hL-Qw7 zJ@ZFXHFF(vb#qnoH`8xZP4hd`dsAa`UGp<@f9n|QBx{~^Mrwq$k9DSXf_1vJw{?yc zu#UD4vre&&vQD+xY*w4a_R03a*3Z7vamaDXal&!fan!NP@!UanlAIK$%VYOMJWD;r zo_U@^&q9yMv&fV2l>G`P zT7?Y?YZulmY+u-{ux%kCC=V)wiXa#)4i*K!2f zCbl4!jiqDdvH7vm*u2>MxGTOk&WYpV)8pniAx?>F<1^#PI4aJFOXHFFoVX}%h~wkf zI697qE8@DiDb9@3;_Ns-Zja~3iSeVw`-+bjA1ppxytQ~uVqIcYqI0rSvURdUvQ09R zoS!U7R;=$<2D&U+n!KF6lzg9@n3|HBm71BFnwp&Ip6;9Om+q6!OAk&DO!rR@N(1Rs zdSQBgx?1K(`cwLA`g{6Y`b+v}`gi(I`d7MoW>4l%=69xQ_W#&>53t0uEK%IqNjqtG z^6cz{ot@m1XJ;oTbIv*EY*}J1Ez6$nT`gU^t*zB=t5kF)BZ!~~1tL-genk+30t*yS zP*fDfoXWD_;U`tq-4k~HJNtEvA@P1 zzW812zx6ctyxPO;dC)W8^SI}Yp0DgPHcBLnYi%|sRkv4@TQghJTjN?| zTT@$eTJ!z~eE*Zwn%J7rn$lX(8r|x9%kP%|t)N@qy#0&Yzr6jM+mzeH+vMAWxBG98 zw7t^yA8p*Wt~P92a~rv>wXMIcr;XJ1T3b`w-L~GgSKC-^x7&u=2yK)$b{oEp*rtB% z;cKebhF^d5`uyt?DT}Y`UN^q}m5wiWe654t!RVlL&^ibm{qIQr!*vil9(CwD<~np8 zXC2{pBJM=qxp&9o?yv6t;_lyeeyH;Uoge9ZPv^%vKiK)+&i8k|uT#`%==|%h_jJ9t z>xHf#cLjC@cLjAJUE;3EuJNw>T_auhx*m3Mx~95#U1MFz*eGlmHV~VH4Z5 zIBX;~8k>fV$0lN1dtT{T?0HwOTkofPzt;Qh-f#83(EH8a;NF_99jmK@t3OOKt8H^wi-e>~yWNxw<@ZPH{4CiO2nyYEEn@wCSo@6Y*Y&PQ@Skn`c3 zzsdR698-=l$CSHPxKt=FR2AwAWrd4{hQisx%|d12OrfbTy@*-#;VYlTd;{|(%%?Hm z#{47Z%b2fVUch_?^Ht2}G2g;`xa@;v?=SnSviFt|%SdH}GJIKInXF>Ef?F|J@#)I+ zDoM4pda8Q2`U^Fmdq;l%{>Pfn*L6qfs=l)R zT0N$|y1t~ow!W;sqCUSq=*7Sn|K-KT7r8G!dGX@KYrlK+lJ=$Smor|@dU>;9w_&S6 z-(YT7ZFnman~rWC-~2$+hnqgs z^uDI^n}6N(#?22l{Z&(Db7FH+b6j&qb8>Thb4qhUb5k?7nbUmK9NyyJ64>J264esh z65SHi67!C{fBv#4h-mR_iEN2$@p`5Dm8w@dUwPlF?|=0JuhL)be|6wh+N;H_*ILV4 z3tLNCueVOLM&63J6?QB9R@5!_E%)2Mz0JHmaNE>|v?<#r+UDD4+fLi;ZSppK8?|k< zP1>eu+iqKK)3!~uDcVGB>bAAE8?Vj3w(y$y^%pw6-SM4{Z+3kB9XbEQ9o!C1hq1%d zvDlG(C*e-Yowz&WcgF6F-VxsMzw39`>n`ao`R?C$eya0ponPquYUk%Vzufty&Tn*n zrSprOpYQx+=S1g+x<1(TH(ej@`f1lj*JjsJm#J%|YqiVLwbP~Pdemj_GIZ&?tX*$0FrO&{Z6a$53Qidz`3Hnujk{%dQ(t=L;}w_c4y4_PEWx zJ#u^K_VDcwwSS`haod;L|F->;?H6sIYX4~aH`_nk{*m^>Hn;ZUw)eOHP5YA2`fzms_<>rUF8 z`*$Ypgx?Lln{YSyZqVJRyZ_Yr&z(Q){7&b$I)BpnLg)87f7bckPNY-XDenAe*T=g) z*7c$8zwSQndT;l~yHC2@yWijaH{I{+{!I5LyFbv~i@l2_V6oW$z}~_BJGSc`dH??> zwjJAz?Z>r@9F~IZ!Q!#wSSt2)ED1}--tFn?>Flxgtn{q)toHn%_j|obz3IKF zy(zs3y|;UR5%F_)Fmyyt#*W1bWBrr-l4L2$l-<-P8K2AftD^J5cNd)$x)ph0yfJ|o ze@pRkPLKt@&Zi_iLi-qU!eQ{;mFIeN%l)ePjKr^&u~g z!k^_fzVvsE-)j7N<3BWhrSbEPpKbg`vGGfdFEoC!@oVqM@1K8J{(qtA3r(ME z`cl(Zn?B$4?WVw{;^u47YwIhmskf4DrQGtp z?S0$lHt+Ut+ke^qllB+df8GA8_8+wWy!~74KW+a`yLk2`+RG2UVB z$i5@FBfcZL6Mr}M?$0}a-Raxu-Rars(fNya&t}hd&sNXpdjGEX?|XmP8`_)Go89{#y}VFy>~yRwwlpCqDL6@+ zqDt9I{l}ay<$OKo%Q+t^`s<<(6n*4M3?>#6hl#{|vFsnpsAVsf>ngMr`ie&t#Z?1U zKdxcdU}{TiI&G-t?`euQio6k2edOA2-*x{Aebg;+gm$Z|D*NaTVHSO zXidMBdCTv1aC>-rV0%z|Si4`lPrHA6K)Y}IZ#$Md3hxx$k==>Dn{+p{GpaMXGq^LX z)4wzD9oheY&dAR2&e_h-c740+mtC=4FEs<4Y#8&;3iVdt=iSS{9w<@D_I{J8f=z5mqf*;~~6S}(5m z*AaIk*W=gX%MwD8bSd9&3QK!e=DRcBllel<*K%IZ+06Y|(Z`Gawn$o(gh|AFx$Ncg zm&*U898;yK&a2C=8OLU z|NZ|fEv+prEln*xuYC5^JFVHbvTg}(XST<*r?khlr?yXZOn125iS112{9@NXbbYBS zvOB&zygRTvq&uiPraPfKxI47_G4>eiz%FAqu_xFS>=D+C-NvqB_pm!y3)YT3!0uz$ zv0K=Qp4pzgp8cNp^?tthXT3k|{YkG^Z&>eN7Q2_NOM5ZBS9?o(AI8qah9(s!e>Z0< zcRTkJMQNA}ObR9)^OdrN3TuV7`e!xV8ct1NT}OTMi^VT{HU6yWr%gX@3TkR^d99_V zwYT*@Td}Re+heyUZWp!Zw->ZqU-#|s>hSA8I;nI->qMI$^4RUqhF(cV@-2yb6xZG z<~N$}wA^hWwh~(LtykNN+e_L@+soSnI?C>(-Oca5+FjiJp`MTQe6;6pdp_Rtv7Wx3 z!=4ZH`t@Gxz1~~fThsf+xLiz0-LIO4UM00o-mYlB)?U?K*`D56(OuqM+FjZG$(~R2 z9QAzg9oc_EZ$2gmb6i*0_?xC*H~qG$r=|N9YOAC*sH6N&#U1&bjJveE*`2wad7WSF z`c%(ndi;CepZUe2Z>BHQs+Hn?~a!)5&#buK#z_7w3m_bMppd^}T&3;&Bh(qziu& z|8~niM^^oX?bUrE@F2vyxe4%N_;D!z7>xdjx}pu zAB+#dhvLKV;rIxABt8ls4f_#;kHyE~HJGJ#AYQ^+(TMiAryB0;2x43Q%>-5eu@6tRPlo6UY+tPup z^i1>C8PQQa?M<~zl%IH$=B+LMpY*?X1p*;M-*@ds5b*!!01wB@&Aw7)&EA{Hdh-PvVm+Oc4Q0LMjXfv zvWx7!CBHu%?>=&X93n@^F>->OB4@~B%hr($_vcyc^zHTS zLXYl!o_$_@L%V9TKrI~5o^VB z;zwegSTCLzFNh6dqu3-~6fcR*VvBfLydt)WSH)}Mb+JvnA>I_*#arTSu|vEg-WBhO z_r(X|L-CRL7+ssUt}ITBN3|#7Q}LPjvG`p4M0_E3M?4Tu#0&98d=Ov65AjC=kU%5| z2}VMYP$UcqM3F1Bn!z#a*$jk56MRg zkV2#gxq=iUSCJ9~gOnm=NI6o0R3h+C6C>9U_=j+j>qs4P1F1*)5FCO>2nZ1&A!LMt zP?3IwhR~4#gnG%OW13!po;#v41{4k!4AHj3*T>L#e56{O3O3sZjxY$1$2jRE~TqIf> z{YP!yy4HVMiu(gzqEOvt-v%0^VK{e!C&A6l3(yHZl2}4CA&wA3@Ri^RVUiFDj?jnJ zc@jN{?nJO8Ubt-C+?I%D&^(7p%2PfbYzTyKiJKddkR{n5v1Ctc5(p%y^Co6P-BWOv zc!Mqp&`**K)Xj|y)Q9Lt^hNz!h|6d>1^xvC9;k(f#D|bdNJ06helE+Ew~XmhH~nm6 zZ?_(xEG4=6q~H@9>G z18P=@>%=vv*(5nVN+?o_FU=2XFJWxJSq?)VZft`5Vh}Ny7(xsnh7${6?Q$grk_ci3^q3D)C^3xakIp+slJ};Sb#pr; zG9`P&BO+hIkn9tOTy+OvdkknJvLq+O5zz7^9JFp&vO%;HPoZv`NR#Xm9mE~tsN|kx zP_l*kr%N``62|weAMP{GIipJ$kmO3;+&sw#=z8QyccJtqySbf0c|uB(o|BGA>C$|# z$p$<_t)7s!Nq*!Mkl`Ma*-2jHEz%+Bh?FT!l|ClzlM`&e!xs!d#JESbB z2f09+EWIG5p{+82>L}wfnQRtzNG_96wCGMLC_LF5<(^C+o0Q#`nJ9Y7uxv!OKv7aS zvI&_)rlE|=*s_NduIv$o53#C-Rx^MG%9PAVc>o%*Oe&kF2xUXSi)1Rwv`kJxfd5kv zOADkq>z8KMXWZNZXc4p&khf>-Gix9_A&9m$vpkbP3#Y}?OrYBUG|xoSEKnL}l4zl{ zI9dp_S)5q`&E`xDEt0l6lSs48SZBg$$+Re1FwGzB-A>Hzyk1NR5q+*E*b1GBTr zS^KuvaX>a8n^g`ZX~Y9_v)Td8 zfOJ4H`v@!_%t{7yv+4o)tO(jn4onQ_XJ-ed2lN9A0}p3)pj()onKgi=3UD4!4R{F; zT>WNg;@}JpGu_;hHJO?rW{ifzOwdGX*vwcBk0}Iw9@Iww@`2Aq&+7;?Uc+KWX~Hxq zns801CQ*~F$kK+3|zD(M4hnBj~WLGX*(d+#u(``7ua1BOnP40-*N{4>%lyf-`EEFz^ib z(M-YN4fDVb@N{W+X^1z-+goz_X7LW8JVyBols;KHSz_>Zmgv0wB`)s>bZ1LU-T?1> z>G9GCv_AmN$*6q=PW;O0D6|FKS=m}yT{!~oY;(c(r(oNkz6dhifE}EV_hBHCPAn+j1-6KR1BZ=q4$HXVZGsrK2Sh!(I5B8(A62?Ef- zOAgH~Zf?Qk70NQj3bjr!y5f%x^LY-TkjbKnF=&SKfOdtDPts{=w58d_*-3~OAtB~X zxo$@0=9U2?S^{6Dfkl@`H@5-s8SBcDo+QDu79r$Nm{Sp&sT8tRiW1sC1@s** znS~56yE0%IFb`OP&qpI3`avUX+Td=!Y;iHl5T35XtO$wdET8&$dpX6NfvDv{40uY$ z!7_muM~p|uwuY`m2q6@-nWzsD;XYx4Ae1CReG!b>7gk_g;!W})jiGb!BYC;j(#`FP z)ZSl=&g3de!^vUjenpWZ$dRs{+kzhK6pc(JQ^QPWW!sbuiVbv|ly$W4%dt9u&!X+j zK-Q7v!)or%WYh9!xwITwCP+?LhjmyR*qpVxR(Nf8ePDIKHej3GfST1=JJ9E#8lGkr zXo@t2nkyPH)2Ua$3MhwXfzEOeI9X!D1B1k%f-|V(c$huSqdYz@aoK6oiAKrR?&RUbp$g(Q%(dpp#3Xbr{n2$1p{o=_jwMHvY_Yjr5AVR!dQF6HABRE)rj3FGi*NEWm*^QZk)h0|5VqvUPglX42oL*9h zsW6uSQmJ%K_6SB-OxvE7GiA&yT_zfP;RG=u4J>AuUeNZ6Bpvt(Nf0TJbYBwx?5sLH zZJ_&90%Lx}@i7Y^_8`ZsJL!{scsrqe>SPBqvrGk3$&3Iwn=pfuLMb6UAY>6U!E>=> z5?xJr!BF-n2b6s@Vy>cVqlMW=g0&1VhnNl4W#~#Dp*GHb+}z@zbsjO77)%Nwl}i&~ ze2IX^loQG+Se4KYA>JSo(UE$CtsHzkg(+9h71B!7uO3!o9`JbPXy$b0WCjDHz-YDx z9J6*;M8XVob1HeaL50StQxiqVAt(qlFdF5X zM&#!97)E_YId{#l6kP|{Pw4;gde}rRp^#WZtN^bi#H++gVma{&v6fg&EFfMZRuij; zMb0%s`z%H2bs`2W(Hk|e&#``&1yW5iKh&ou)g4MZ)Q6(7(?7IPJe~B0_E0~^E^n7UpVOUL5Af;cRt;@em}HHGxyY>3EHH7JRc4jux~5jMH(+KGp_Za4 z2f7X?hN@X(y1D6@bIf|pL*PiDpJ(<1tr&ktAXwui6jbi<`O)9}jh*of1{GJI9% z7+x4&94)>c zYH4_9*gjmKTZLLTx2<8@uoXCrt8b@n6Rm;FZBW5|v}BMP9vZBiRgQ^cFsyTw28BUx zFc}OSongkX$eA1VH;v}40JE5f@Pf^9kOIwN z=1HEvS;D)I*1;zrUWhpoT1Z{;WpD8L9dscAKP$u~pr0U05G{cA0#9qO;B+MtcwcLP zz~AZ*oR`(d8YJ+ro~<0OINKNLodf_Y2yg_LJyF6!V%#;;jnN_=w-WD7YNVSM}^)tcUuH_7#I55xI*@`7oXVvzy%yFsiY!eU)a(li^)I^CWtMj?xGHaKPj z+(@w73cvuXzs(QUy67~IkN~}3m6V`kaC*%o<&q>IWs|Z<4>xx>7#8PtqvcA4X# znFf@gH6jgLBLGgSd7u$$c$y&%NypS2GP#-~<{ooEGpQLt?S?gC%|7Hyxn_&$V2)}y znjpqD^PUFL$TSmRF@;*WxiMTN>=ER#ejQbJHjD%A@$f0c2|;%>OaTe6BkFGG4nQ-c zW9b;W{o&)`li?s0O?Nnaz#P!k>zKMhup0(+Kt$1@d@GQ3YlZ{PF=vmnYS=JX!N$%x z;#dqj92@Z4oGp&s;NWZnziHS+vm3k+IXi|G!xre^*GQD^Ld`zlI!L>yCdE9<%Yy6# zIhU7a&NauGAMsSYWOIxl$((IgLsZZ463yx69CNH$!%IaiGtK$tcyk8u4|#d023|@} zOF@t|P7o^yu|`5R3I&X?CJW%C3X^~aTEjt;CXi(=MZAkpN822ZTE%2Hpr#I zP@wSri7?zYAq=nup^{TW6v-j)5JWR}yhvupiKHM!O+-!{?VjwyExwyEnK|jS%bN5& zNJ2Bq!(;XF-ZZ=~39|%e4f)yWPkR=f=fh86fA$PIUV%9Z#^!`XiIXzlbk02G>52qZ zFdCPq(3@eZfKX4wfL$IbAI@|N)!70@0kJa=tGB?@11*GJRfLBGH6cl&A@mVT!5&Av zv~`BIvz*6AsaS^}#SCijic&?TqD%pQtQOVeD<)}$iULK2f=|m)On~(m;8RFuWWxF< zF`RNbaN)qk0H&#uRT-)XMiS_v8IhpLQbjT1P`h}bi6{pr#8sxKQeFE9w*hb(%_(z2 z_fWHn?wmUdUM|30FwdA<8lz?jcrVt5#-e%5^oF`MjTN<<(`;%MHS@sFYU~<=MhToJ z%dFYfm^5n5BaH%N53pa*=rrd{6-YMC6Nm@BMhiS-0F*j8C%CgmA>-WBNpxd6DR7?b zOTAb(`KC-Xr9*Twke4+xIzJ=UcbRy79qgEblZ?;^g)bVv(ROX>ns1xXXz~2K@ z8V7n`H=;W;oESX0?p!b9slnUmZag;l8jlQ53>TayoO8}&gNN~ygQxMB3j2wu#9oTyxmLJ=p@r8Y{ z!s^^GBQOrC=n;%475c_I%mn1KKnVp-E_BTCS>EajDB!<*BmZB&4CIA)S%Q$Yx{!pUcQWHJ4U_ ztUb-HCII5spXJ92V)+6GHm#J9mswNygx)lfHCk{T&(i8dG+RX zo}Jfc-s0JK8@x5%CNEbotIHGQ!2V?mQfv=|I=dcb3({m7%(w(r^BT3RHRM zs6tsGtYB6!JB0m6=io_%7(%jSj!*$B1m{;$<7!v;Z0`o1@MZhh;bFx z3&SV@3abFRQU*rFP?UjO?6d$ZR+XyCpuB`ARwS&Z6Am?}n#Y=G)&;C}Jj+81*&S+P zS*bviSjUr9j2@&TU#p`E*SO}DLE)C6pAzMMLmhC>-b@JW^J_nF{r{E0_SMV&cV0Omry~tPMViUr6ZIybj2$P{X{B}LUh(nqi3oDb~esfMW`lR zBh14ofIJOneNf@#VD;EFgcOOBqY>%EYrxgH&bJIAT?`)NXv8z9PMfQ8I+aE(mQ$%E z@_y<7=+xj#LmO5w6)eS&f~|N6GGtIyxeD?m^j!HYu3*hrz7Pu;tSnagv*?In`+zQ% zy$|~t$KKOL!;W7XXngM@kmr(`$h{8`Bs14HkYx7vStZY^eD*$GF3Hj(+B(jrW9LekyW12C;=+E`z zCa}|usW9_nAh`90Ul%+mxAX|<|a zh=Uqfi2_!zwvZL#nth6Ew=>Zl9ybeNu8(0CD+N_nsj$Mv62Xk7ba5 z*gq%4xLy+Qodk?xhP(hHzYhHrv%H3{vaY~C@eMbO`J7h;YZEM4ggI)ZO0q^ei;h`9 zt(I5GN2xq2pIQmN;l`i|6-zV&%|bKL7HMYJ8r@*jF|NBJIZRu^Dq~?_*Fv?GKucNS z+6q=Va85YV9YQ2$u+!M->|+O0BCPEYdU9b7Fj6>OWDShdBGE}7N#|gt&5|Vvf%K59BID6Lfz_a1gK-O~MyOqs znxr-8EapMdk>{YTUb-MPgQNxCAhk+GurC(rBaoJ)%b*_z`95_8xVOTf94D`rGvrkH z8f}8wFCUOE)9CU^>I15niibYxxe z*UD+~Dd+=UU2=lFPd*L&I7Ea9@Ht2oeJYt^o2F1qDYj^0s6)_tiNc2N0G~maf99uCXE@Mh6%)1_Np$fhR&qXHZpx3>t9od63bs8c>me zr!s0-@CjE{4fGOfpK+IRj5bx94Ut&K!n1PN>DqqQsV-KFV-Z>PtY~efHb)zvhkHf) zMAyfnu;{E5?TIc!d!2Qr%hsOj5}@}?XdS1G*OF1sBvz7^#!Ax?SjkXFW#zK7*pDIZ z5<$B0w!WPsC}Nke-SrXNVz#%wl$~Sr)kkp)*jLzo(5t^bRA0`HhVvAt57T?;Q-O=& zma#qb;ZU2x#jr!UA;49zee@T)LbfOHL4YCLNNyfG7`SlPSEHr2PBQzi|-Ak%G__Q6p;&PoUVn(fk} zU(g5kRUi?eq*!kNr9nN&f@<50kZdIjr~-m@K!CT_S+84VLYlSKwq&1$&mK5vRS#&k z!-$1_z}4B%3-v;8=#1aEne@ z?JIVU$YNi$&pPA|1z1TOQlK*qnIjMVmZ)&DU^0I)V=C|P|~doSQ8D*;+`mOf+vDGyKa?LH0KP-Rn%Fknz~O@D;}aJl&NAe z23b|?2)zX?>j}$1Z%DXA4v|e9fiXFOMzTpZCHjsWSE6Cw0E@N0FRoz!jst{D;)V>+=AOmt)GM1DD_Y7c-wo+TBC29GrA&}rzrlqhs ztUj=kvm~tR+Ct#q#mB;H3$$ab`z##D<=P3BfRzv2H8xROszq28T7p&#?IR)E4YNwL z_gIr430c>)SG8BP^;#xtip6GCv+J}Ypl7i}tWg$^h0#v4inX=cDs8kr3R?alDAHy_ zO)ccBLVbchPhV}k!7kEY)z`6;^~L%t`g(SZzJ`s5`aX66Sf=TTY>Yl%U#cHq)7ZKC z9MEOyQ}hI|z_EF%Sdh8KIQ?~YKf4CbB8g3A$LmY<*No}q=O7IFh=nQjm2CtNF-DP-;Q##xZCDoBLifdOZRkKHpn0I zW-Cy;If74TZ^`XK?&$^^R!!98mTpDS2F{qUhyC=dz81OnhVf>G=1R{oQ zUPuS+C5(xnf6<2B4)?$~@LP5paGQ3KXcDA#yHIprlrS-1i$`C}sS_Hw6Ot!VCLTE+ zIua*Tj-p8|XyzPhph**+d+?1JAl$Kg-g|y~S0=qsDfA$FD&!#eAm|`#DrX9Al|##v z8A=$}(bCcKk!-qh+IVa^a%v36Gt=_v{b}ln<75RgIDEd<52E9xla8gkWCvu>9l-nY zU8*nSmNm#d>wtcAg$h0oGo~3cP+r1AI8#bMvUZN8Who$$X;`x$!|kh|VGX(>nZ+Jr zSL(0nne1|XHAF)NU@02Q0yM5-`3L4@;gn#^IxP?j#;roD$jU-T#I!l=+x98Zw8$Tw zrxhKq(|?UCs@Uvd_8554IhLnP$E#2;hODJyJz~}Buj|XWhvqo`5cpan+#^B^QYYka zZz%lfdKhJ$euP~PwK8!(P~y%3#80zV!-1-o`V>{j4jz+Tt^eA6Ha1W(W_fd?aCkOt7t2ZJOg zXA4|`qr_yt{%P!%7Dv?ji6);lx%teLYK&eu>SUw{^p}O}!kWa}ks51F6 zRW3iHo>OP#N;x7wq8?J8faP;=C=Oxl;q(x?U9k&X6g`N(qX?x(pkvtwO)&jL5e8Bu zeM_;YI8tmYHbD!&7%2|W@~N*`hJ+z!z&-n|!R-KaPBnw_Pwna2MHWpv zpf$0USsJkH*D@eqFR`dv3k%{AkPK^v1LUyzY%ZIqrvQHsVui;RvJoRmFJR;KeV`iy z9RW%w)WANC8>_h0+)D10andL&Wc#T`Zt>sR;a#b?y#fkaYd}K~^ zuGZf%O4;-VuSsI%Sm##IXAk!6Z<`Y7?#sM{RtF7@my{bOg`|YjD0-gzLg# zn^nlMacu%re-EX5_DdT?1gFa(7R@^r9O)BRCxakni_y0o{DE(Xgxo3Ek%JYWi^q!T z{u9~>L>NRHi!?;qhZCogN7Ge|6<8todQp+Fn(+{JLBkkCZ_QQkF#+pxpZ&mCyZG2VhK@61B5%qL{RxO;#8IM< z$cK1@U4VEzl8lhJXk6|}b|m|fJ;|YjO>#&MBuMsC_%c!N@goFQ6g)q5Z!7@%{e&26$ehUywhP&&vZr4hQt^H_451E!0Hzo8@!znErLS z59ovY^>T|m8aTiHAfQWN@y8)anM^OB!|PlbtjwebDwF6w${c#6@!e`B)L5 z%uuG&eUV@m~ROSQ<@geaH?ep$5%RIfTvXL zYDcvPERJ@awaeOOjcZK|k$%(F_R_=K=|0p>>h*eseh$u+ian-RvuEIBiuDim3N}rz z)lad9^$1%GwT}P?^h*7#Uc#PckAl@Kn*&s(m$N1MIXzQ9q8|iV#-7ldj4Zv9&DX2- zQZ`r5)=%qa*pqBM`+*(-i|0VsKVWP00=>}LPA}E>>mRbU>>)i*e_yX*-_uX&A3=@$ zEp48+c5=FBb&O}+o{?v_NLCHx3WhNYMvU`gc%SrROHd~Zt;KZ74)@v@vl zUX8Ql^V2O)%sJ313hZc|(bo>NtI?`Jbr$Q2 zRVC0_A6lhWg8h7HkHa8q$IUt$%2nx9Nd%2)BeX+XLXHZ93braL%?b+ym=b(2U#e+a_&V zo6@!o8Zl@zfX@MWiv-ap^4WSII<&*xvLzMyZ^2(a0R9*derMgQ%pD38Plrkq)9gs5} zD~{X=lf&Z30sSIqE+KCs8)T!y?6A6Y5qqI~ad5lG?nUo~L0N|0@|V`(d!>^zqNqL0 zWc*&_UdY~(t4#^m1n-MfU^L?WliicOlLJ(O&qb&3d4q5d?)3z? z3vF_zO}5fW;TJ^Ju?li3;EC!9>yh>pxH+v(tJlu!7uXAWqu#)tXB!|>oEcAy$8a8x zjEBY{?x_*O&$8rLO8MEA1&FG7!44X+i#C&O3EjU_*xR73ha&jY;3%9(*sGr2CX5q# zBu`3We-exXeygH8=^6BR3B#^)ty(=37EL(dg~CVQBAfE${tXy)jyK~hx zV+-yYlh&X$Y8N1@&jW(2H|tI8MZJ-|1Y>@T=8s%Uo+TenOaiNI#b$FXAMX&- zB_bl+_7s13>y*(s++7%TzOtNN0OQn(_CSJc3S%z>*;DPIzJS?2QF*D|)y^9CA&((v zxx`+EURLy0pib~Gd79i!U}?NCa=As8W9yOi(0XEBv#r`53)f-PbD|K4;0;I8-WtTf zK4F4*AI6c=pCPH2jKZoNO9EtpvQ${-E$F?1UZlJNBiLaaFuc|Kj9tba%y3cbIkXIS zl$mW|ucAGd@eg3ceXt6X;0<2gz`+S6;w96>DWW$8hsq}?g*}j5NZh5CK3E;*6g@99}Gl_uYLm4NDNRuEtAxV}X3zkJtqGZ985LmSsz(`pbB|;WUNtDII z%P|o!2(%%TWT4TMIFNm2{3xlE7)q!tkdi=&mHATwC|)yRvT#ZgB}Eo43k91f%CuW(rp%*Lr>DTBCI#pSsq|sB={xfy-YI>FOs*+A8(D6ztolLJ$_R&j~I69tQ zrX(qA==CoD&qwvgxnT7ZhS%U_eT+Iu9j6Xdhp2tke(J!%Ge)dBP3<#y1TpA77^?Oh z3{xkd=K)^ygZXNI^*Q4)!++36ovTh%=czN)QR+;nPgdusv(y2D(dtvi3BzO1Z!lf$ zI~bw%f-_X04p#@MFBn0C$KW+yo#OKM$43aeJ!IBeA!|eqg@XsUFNT)27Htyn>)IHg zXIj5G@1bMujy7*-3GB`Rvxnk`vW7y3?AiU4zzpPeQngxwsuSFKeVRxoeLb=)#iim%%N3n+EB_+?$C)gV<=L6s!bpA znDZGr)W!|jw6S0jJrq0?G_n}83w2hu|NJTYv3^Uxt$)Ja z)1T`1q3_3R?-7T7U2g+^Q@_DJf%1gyIpXwnrjMErnqOr{%Zo{yflvEAo=p_LyxihcGGSo_ZVj2!A$(0PW>ht5Z$bxzNJ2<&=y zv{(2g*OYGZHH|@jPBR6V0wHT6+53)Zlxq@m!%Tdxl)EGFhSn*7PDpl@m(ts5zh!`b!$Pp&_;4Fq27y-d zi!DqGi(hKN!;MvL8MX{sD*1i(TIxZ9&+Qhvr4Cxcw*!_c zeg&U`^0k&~%QdJU0_0joEVX=|rJhfQI*jGaS_9f^d^(@Xzs@IGDlGkcvW37W@ynr} zYU#6-S%`d=g>AWRp@3x#e^EfPoWlJ+0MhS6mBo8Cbk!mVSxs175d^Kme@naSfH#5f z>Kf3<)g9ZuU{4Ue>b07>x&@kLK^)j5t){QWtOl&E3T%R1fgSY0t2orZ|7zOmI>?)X zjMXJU?CN7{^6H`pzDa{tW`WPDRd8;l@jXCFT=iUaU)=!Pc#tlv5v$>=DXV^~+n{+4 z`!;wdj$a7fH#Th^XfIfCBW-DpS0-RB_B#Pcz5t&3*kxmr91>b4_!tL#F($a|o#}RNP z6MK$*$2O`vvN;@>iA~^(Cr%t!C+vwGHoH$2}KfQ7a-}{};o~lj{(f5(l148nUI?GhJ@zdb`&IC*Y zKAn;Q+$F@%B+kUlM9xIJZbky!mQKK-W$X;TKWZj?rmsH^>LX@|{Ru8R7=sdi2>^t% z;JRJm+<-htAELAA9QrVQNXY`3MQ1BVpkydVz>ev%Wuh&et({PIjgosLRwv>PpbS&Z$EN!v<@CFH{$+%b~1L*Qqg3hJxkqL-9~3n&rdif}xC` z3!ICaD;V;hOPY_IyD|hXo4HufCjy26MgxN9p`xLLxsbVlxg?MyP+bg4;WY!L|46_{ z&U_eT$%OgL`S|(Zk@Wf0d05r?K+t6Y_Y{)n6X%0QQsy&Ux)7*$LiU?%Aa9teO*N)I z$Y=B1BA{x>jZgoO{Bz%qi?IBP|g zQP6Nf9zu0fAPw{LRP`kj52*?8PI^Brc2pSLgU+ldHd|KOjC+d4|%1Kvll1aVEIZn<=pCN5BGf5_v z+~gwJmb)#>>b>`#-g`1FlXgKJfj}S-MRZU#0)q@PAix3vruX8;`|mB;$M@#lN#2{^ zq`ar~`+aMD>sxEDz1IILYweA^?Z50V@fZ7V%5KTd`)~QL`LD<>%dYxM{Y0NKS((2C zy-Pt?{8wd{Aid$gF1zi&0EPt5NnTUq||tFTm#_t?^eV+v3BjmN?O;8F^EDgnZ^~CH=5D*#dt(OtzFY z<%iUg3Z_G8LgvXVl23%`>`HEEbv2iU_f6AhNbeE6^NWZ)1NkhyjJ3C%1=r3Ih^jY$ zu5JwWs{yi6d2Vu!F3<^e^_HuotxS^IvM;Zq6(<5o=y0HrJ=?W@~3_ zW-H;*M55!K^Yr`hPmvC~)rlBlltRXePKc@B`R6 zuf@`A!84Yn33;n!+CF8U!`)}?Gj^e91NUFw7m3#Pd!WT$PYyG=>%T{8sXIQV>WX*9 z+v6SafVwpqPG^9|E6i|eV{K|0DIaPEj=i29eH^lIYNh}%hGG>Kmn(gqanG1%1d?IT zfM?J%OwI&o|xn{A)GdpZz6-raac7~)uwJw zwk7vck@T>}m+@wvXV#}yb$40)oMzL;)Xc_fXb;bZM;dG0YTjzuYTRm^Z91|uqO}bg z;L=;P4ccaK^;#ai2_=WV2(2yATeXd-9VR71!`Rkob&qs1#uMEZbfaLffVx4a*Ques zb)6BiP2G;}v2KIVA;Y9w)2ZHh&XQr?z(@ZDgU}!{Fbo0%51)QmHauj(l0n#C(8>g{ z4PpbwP{Gn+lzXglvh8pVgQhl93-r|r>H+ndI!z;-K2x`;1GOPeyJ>(k%;_=>neMX& zIRmDC(zVSW8T*1l_`x>iiAJ>qGYtcWc1iL0K-lFRS%8 zqIMUxwopnwtW3)j^5#$@u4)0bhm!KvPy;x;rHP)6_Qg*{aqdcqoiP7>O?x4j;Hk+PIhyuUAtnC7{)j<`vcjeYDB}$ZsFZZ zhqjVNTw{g>?1J7VsX=BK=TMJyIuG3`?Fzfx{sgF)_RafB5;LZUL88;-uaG^&nz}KGRN z)Z;0`lo9=i)H2&T+rHICdJ&)At?kryX%AZtbBoSO&UuTmfqQH+*5CO+#|PzzX3LmYE|NQ41|=?BQiK=1rvC{RK~vq#4>H zQV(=At(qeDyiv{0R1Z0?SxMOh+R%p9RYN`U1`z&ojzcxkOia$G zY1}kvnlO#QL+3bjtb}iA;WhKvmPR1WwY2hcIdix{$j(y9XT8=Eo;6ocnnBcAZ{+h_KzbdlrYq0Kh zyUuQhg{+I5`+NHq(t{Q~JkPR+>*09Vp0kqEl48jP$&%-sgylIeQH%JVGm^vmw*uJ~ ze~-V--|g@4SIW9bq^n?6)u2v)J6R|CX63!4hh*dfp}tT*$>-#Uqm;l?sLE30I14JT zM8}nvqgPS8NJ?f@gYj8a2fXA`wDZVU!fHnf@5MC9^q2R7zyOJ^_|9vk$q+#L{+o)}DqZSY!9AFCg8G#d=y*}!VoFu>|Pnl+uUTF|_S zVOlUTO&k-C!{P8bv!-RvqG^f4GI2SFBNF+FMQRaQ#H9VoEDDR#BC*IVy(HpRAm_C2 z+HHpj+V|`)mQM@tyuAF>Zn1BR&I#TChckj#%MSZlf!$sxc)468*tdK3eWb;HdKZE_ zg)8x{VE>Wm`My@<-QV9o*!S;miQMR0Dv^1l(CRhG70HUHL?Quy^~j#bpff6H+~4mX z_7C|7{PnU1S)FXqKjI&Syb;)+QcS=OUdcy7Z{&pv;y$nCw9shirJNcX4vmM#NZY;{ z#cOpXO^JUm55ma_b~6$uxH-h1q4+TP-sC{CFWH}T!j|!?mpYJH!l^Q&$!2re`qigX z&!8a{&~gD2%Txy}SW3tHMcs4VAc?=)(#Jb5C{j#@M&pA?>rworYKOI>+Hviec0?;f z|HHJ;h(q@wogX>g-I2MQalnY`BD%0HpbP2}I@ddkIJ)S>DDE@KnqWOMSPf61e=198 z8fMuI`v$kcX|Nb*EQevwFvL1AOtD;sF_sN|##tk{>hC8Z2OdcJ8rQ@#ErS!7_$Cpg zV(?33%a>lYZt3Ugv3?EcF=*AYh8*^4*|uz11e^ihhUJlEkf*h5lJZZl4g;~cy%bgu z-M=P?+D(WHA-m7+w+HNQw3U$daT$5Bz>E47a90H$`*VBDeo=5q5V0RXN~HL{UXA5RWlTl{XbNk2+@q8wmg}u@I(|(4Z>7Vn{{WGXff?8!w zvI+kbxE9$w@^hpO(nC|Bvm|#KIU{sNF&ml-O^2AFTd=(IiWyktLTH|}O`IFaD0Un9 zG_3P}^g*;ddMA39lupF)j0GDVkJI8~@k!L6cjUv#vE)#)OFfbtO^zqK)xGK-^)pzm z3$#yKFn*gz6TNxa7g-x=jon*v`h-?NSJG)(>;bxr&ck@l@G-oMq%N&Xkyhw4%&>xn zfWdF@7^Yct7L&A|1(w(F+`wSXv*uW{EG4W%Zdx&kVJ#BV3P);^nG}#oP)D?a_IE5s zi{YIWr0r$UNy46j7O#W5AxIwSljvXQ!V~fS3uwzMdLlB3PNQDrdb9s}|JDA>{ZpK^4KYKMY$Mta)2eCBq`{rlCMk&xAsyr4{Abyf>%K4r9ErU+3yHWIc@{Fa>0GUU6ikn@Vfx4ib06Q zWWFmp?>gst3j2PWDqzC~p!HC4U-AI_JxTeIRkMI!r)<&BMtRoNE$foC%Q_HI-zFY# z<%TXQmQeCToX{dlJOxMT%30+ca6U}a@tHVN1shjQBqx(J?84b}4#;D#n=0Py0n$_2 zRl0^gO=5jYA7Q-FMM-q|tgInzcx6~-WehJ3Il~JQyLHnh@R9+o4U?Qh<579zJnK74 zI^%dCsKEM9JBl1f6F70vWffUOmt2>DK$WBttK<2No+q9i&yt_x=li)>U(eCHmP3~m zf{>70$-I(*RrHZ(n8zB&QM@KbE!4jqnWBhxd>6whv9@b)e9JeP&Zo8>L==3t3*&@|}a-Ic^>z*uk< zYrXC`@3`zZ=cs`;E*|Nk*intz6-TM#lB2|N!SPH~=6EQ$cGP-!^x#=oV%vnrRHD6{>_u>g>8Yn0 zy0^mCYe);Pli0zVJRXq^MWM~mW$X`{&~``}x~eEq$V1|gHq<90#`!eWkUK$Dv?0n? z)W6$^0PYP7(cHz?Wa8-=trsUxLH=Nkh{RrBP$h>}W!n zUzwb*gRs3{+#{{Y4Hiz|9O3}{sLLMV7x-wc!^QW zx&-dBvGmC1FB&&s({|Gq$7$N+I7s^?MuN>)Sg=UH#cO#6DI2^s_xwxj^A@bFR&c{n zC%EaThcy!Exv0uj;i`1`MFG*n_pHW2YTJptMY8XChO&x=lf8e-zXpx1`$uJCvJG&z z$({VV;*R2m;+CQewVR}b7@MoqL6ZwWm$>r-QN=1V-Z9=XDp_jQO{0W$!?@1U zur^q$tZT-r#@j|YYlWqFFCs-v&w&Mx=R>aJm^enxQ_e1D2MF$)4j^-z^c;^VVtUMR znS!Q}$-wcO%p5J}3CC-C#0j7Wc0V$QCM|IbhnKUYEn!Q>vc!u3+W?7gt00MTk@o_* zfG6UGNU4w)wQzY^OU#l&Jz?SVf)+7vo3qSYfo|TWM!^HeLr0aP4!XJTxa(+!UMd~6 zj&jExNN$6ORPDIusBpBPtw~VtXb{vu-u<4o!lGu^prqFo6AijDqB^pr&sB|bz*Ud@ zjp(JQ-__{~iBh7Z2(uC8kk`0gh`L;9QBc(5iio13tf4T77&qML3)_Ho=(Y-q)+08b#zPmB~eeS#0S2Yj3EJ!$I~MjkQ_kL1xduyE(v== zo?%J%K^y8pj|(j$62GT|?EiLD*d*kKi6)zojmviZI=|I#^gs2_%Bc7!YzDv0|HNAVZrbuGRKp8v^OeL4n&uf zJY`3;KiU-)DVGs#+7MUx%AROnRG{pRc9KzsxK0pXRtZ!~D%c=sDb9f(@Z%!Ya-1D! z#kujtIA6t!Gm_)#F*Or$hLv1MQpp$t+e-OT&*3ZHls^?$2f@YAQUuR=qA_d28Iwks zJ(VlUy~!5lT33m?9jE^%2y9Qorx_iFO)_3sIIk?PEr-`T{LPAIq{hY2ttc*x)6^m0 ze>#)ZT-YS~Y|#72b8-n8tt*Z9jSr0vj9aV#k<3=!jv<&?F_(d=j!bO;(9Esh39 z8@%@vzHiZ7sCoOebh_v^v@y-GVMM&c{7T_|&*0 z;c@xtvLV>#U{tJ<#3iZ~6+0PDCDi)qtNPcBI^#C0)>wm)wLs-1*74euHf2nEoUF;t zd1cC(UYH!XkCZ1v3_F865vjw`iFh>bIxQ{~7l}t)qgdaVD~CJ2@K7ZgPui39q&!TS z+dnU3$ULDI#X)E`g42C;B)S5GCCXNXG%kxTCMVR7p%ugQ8^$BLj&+Sh7pD!Lak`LM zroXN~#Vlg(pvMjUV^+P<$kMY6m}jBci8-AzzrlRF$cRbB3}`@iLFVxvAQE_wkc~i# z@So|PExPtJ^Cre`JVJ4Y)nI%=S_1TJCVK62ip*!gJ;T_C>74bv^{iEal@qBK$o7HG zLZ=fhn(GY8x9KI;jz~%71m`8AQKzCq(WYoubRiy%MrBH=QXc2P>xnd_nberDGN6vX zog5G-dHsTO7|}dEx3N3@lx&&T_T#PZz}5h4uXn2-`Os|N*2wJe?BLcQX^(j3r|alU zE#7?7iLr1Np+BJ;z_YastqG-`K8l_@bQbymALQDjo21H7k#ap zM|#DX-AaWOZSYFTmP=L*Z;N-;y2dN9o)@q3E?Xb*)I8O@-q47n5B*0#Jr0^<5M{Sx zL@*&31J@54Cw*{KFzy%<3<`!EV*)L%9(D9Oh6Pjsjcg_6a9LaojhBe0VZE>j*Np3; zc+z!AOn1$>W+A(P*0-t93;*-ZN=|!cBomTJ$&}=j_l;*7Hecj@P1@aaf5N{gW6SV9 z$sh6KWC#lTeg2rAC5!rlsKr46f3Lz93Wo+2!-@e#KPFC8B{e!09gh-oP{vV@OI1tBNi`QX98I0gOlwZ(&g6DA7Fes9US=&7k0>G`D{2QU zH|siyCjOex^0~VDp$o^*{DLP>m=?Mz303ayqCPi-t)L~ z%AfXU{7W*PEEbA};=pJkN&_-#;G&7EkWXQ^<|mhd&ACh@BhEgX9)stNDfY3}JLdbi zU*YP-&BGO3+AP_0O_y$7ChN4ViLH@$zwJ`DsJMz4T|0Tj)})K&#O{rytOr zbcr^|5^L>rA6mHRt<7jV|Ji6uJ6(J>!-lgGspB5%t8I6zE3}-AB6-bC;fzegydS0cj_N9?=i14?=WvL z8<_3-DdT;NjGaPXxJ{Jrr&;3*Xtf_YoiL6e=YZ&-anPJ`&^T)38DF!Q#z|v{#WnUq z$^gA$WmrAN6f4QfvF432R+iPRFSkyk1$QyNWQ`c9#y6}!BMXuRBj1={MOjNmwsFQt zGp1Q_)_^h0S~Ny*=OOZ%_hB z?tr=5{DPC^w40mF<>m;d%6u0s8BUH}*XIX&hWr`9}dZiTeP9K~2KK?%-1^Fwo| zx!+vKy>D(Xx0%zBV#haknS05RiQ1Q^6#BGUE3IbUn03ZVw?5%DS|_Yc)&c82ugB_u z&-Gd#z-A{w@F^bE+Gk~0JFV;R50=%#Yqt(tpYwKj-BzZx#ae6aK))Jml~vE1vNl_1 zQJb^w^7eR7dCz#`RtvA+S`V3lS7D`D=dE>CCy#CIf}{=fn0G+LN2?e4pw-4R@$5V! z&&?aMHdsfj)z)eBc|R?DS^eRA^)<|I&v8@m2<4`O=a>^{98Vnz$D&}@A#=ERI)~h0 zamBZ#(b?^md)R>TOI37Fr4n1nm9E%PEN(X4(Va5D}4uOM(J}VBX zL+h|RIN-S;wqstfyB9L(zx!6rLMbTmP_kea4FEnB->@Kb=Rs( zz)|zeo@~7JrMI?IFR2K?>KIWRp4%jYsBSZ zwM*z)bUkuOT-9Q|>!DbOmJQc7aw0uGDi3R)<~`nCZ-ckqTkT!KzQmC9d;7d|j)&eF z?*l~8PHz?R0q;HU9dE6--P`2lORhlD1|rh3MB=#bE%V;=j(E$x*S*)grD$PG>bxuo zS5oP1^v+2Jy`$cFjD6eN;_dL>@D6!7s4Yq^dwG&>?=5e$_o}zTd)Ld9EJ#|tW8PtJ z*U{*Q_c+W;Afrnz1mJUl)5yiLvw@tyFmOH~kgdr0GNRW@|7ElwmLq@VzZtj^$okKP z-}sl&dJ(c40U5Y!f!F>sf#N_>;8x&z;A%i96Un5q7yjD;iL8XY{t}tvx4ppi@Tu_G za9Q|F_+_Xtj0lgtHyJ7kUkN8dRK>OMh48H6YPcv&SL8xvfs5hu;Z*2mcoMy^w=o(sCkZP3ds7kr2d=lrOhFwC1 zlVkjGd?WrSj`L((u6i0bfZL2);>Ng2rB<0y+ltFn3e{?SJHC$EZrl`Ki|fDoO&8Nr79^-3X_tgh&&I=l8Pi<&465@UeUZ!581j!UW!TlzcNM#{?m5L+3m`SN~D1mV1QszSDe5N>aIfH*qsEKEynN%hL zKAo{>VkqIuSt381JC{38zOh@&Npe><{n#HHu^S1D%f?geBJL;|OGl9Vc>?(CvOtJ@ z$2IP~6Sx<+3q8*(ZihwDshk@-{)To_yRKc+1~AH;enwB+VH$Z8vxV8roF(go>}^sT z6-F7k!xXZW#&hfy;}&XKqXhYB_O@}uC^pKCo5oe63X)>>Bcqh;y=D{|&$G|4HK?r{ zMaHx2BKF%cFLS5Nm$<;tJZ~=Mp5u<2=gc$aNi)ODG_%ZX^O*T8mu9A#7tH6m6Xpxt zGu&x&3Ho2;(#f^r$(AQWY+bU3c{qzXB-TZ1kjJ-1cp|I78s`Nd#XfB1S)<^%=qa_X zSeLCrtJoSM+uqIuJBTCfa69}CkpO@6PDVT#a;YHXPzaO)mm}&>2_%9QLC~QV>^lw| z5l4WGhe_9SmzeBNjMXgObH!bDR~_P)6;a6Tvbh?>CRfbWC=Rk!1ct{Bo3n1Dvl!eyXwV0l>4q)@l)3`SIFf+4NnVXPH;HsN}fA7Ua@!4%kkuMfj;mgS$$wDN^pniZg^4gAbc-e6>bQZBW84l7ZlCmhvAlR zeYh=L5#}m5ipp?%_)fSr%s{ND4cCMl!}r5%@Jov7a8sD4sKa%KiK$>I)}k76{72D^ zs1}?wx*B~P?FcKQI^~pC65Widql)NCR2K zExxL9gWFVj;@0?f)ED1FZB6Aueh_!Yz486{v-rA-xW6X3ib$}YTu`&r8_6~BYEV)7 zY`QRww+-sk>6|*N&Zy6%uVt>lmrFCJ(pNL*(k0+?8FMC+v1+oJ7pTdyFErAuB>NI? z?C-6%=Vo%#x!K&oG+mE3#YR2pOPD)s_MRO^9LTOc46R>HGK;czk z&rySjq>;VSc;W9vV(3Hk1wB*WhN$rvBkme6uuaAta8{$iXf$4AV}>C7I%X_kTa0Go z6XPZJW%kpfyWS~XS`>YLU_)^(I?)+8_WC7!CYY6Wpe){$@| z9lN<4d{77PTN7*xVh*)+Q?M?`IMR*{!ImK9SVhaDcfN^xxq8LKor>IrZtS40e(@=H z#+7xoi#s8I?Mk`2#a-f@>y7J`t4I8T^tWwm2YHRsyWw30rdsc&MB`P#Lmq)Nk}dC= zWL={6Zb&x0tKK#5y0?$)54#SG!W%Ya1A!rw>$0vuAIibNs%%3x66gu^28ILOf&Rdn ztQ*$c6<$^hgoWhZ$XE1)MT%b1#{0s9C69NmrfhYe&+s|v;= z@mSm+55&XqXnb4sNVTO3#h=GFlWgo#TjZW~A^lQ)Dg8=aoW7Wzg{_rkW;CxeuQI>` zgvgz{kh_$-h<)bjrVn=0&eWJQ(7+3a9^Mj%58(Oc=-tk3*d38>q10QmJcISIm8idT z=mn?U=iFz3@)`HGSMSvkc#+Wn^FS$9424I+!{iDdlU|6OFrL8ZkCKbzj`~`CBXd1- zf0Y>Tf1M_0S^5s=*|*s@*;l~f_j}-Rm;1D0K`yJ=YO=bmMf_)02kNKzFL~$r zR;$hW6tzNfq*sL2c*RbKz(V@K6XXX16LN##nZPb^f-?(j0;6C@aMfAjJnOvZ#OQ)+ zPM6>*dBu6uuQ)F`OP!aUdxCS$T~Z2!+=Jo~F=7R zR>3IpVez<_CLR#ah$m2^iZ7z)VKTv^3`ddbDN2*qBH8y^y;~BOchCDoVuzM?B+tCt z5{LJR7k{P~Frt?pv#p~a#O!_QwRp`Eo7d@eLuQp2WK)6pz-(YVzz9&`bu%EX z%qU}`#9U#4Ph~qYR$wlmm(cg zjas8d*qJ42Qa(ZXJo+qZkGi9H9t1g}zNiP~jxrPtME9e?s0+1RT&F5b5OcngHmRJ^ zOx&Q##$S_OxTAWaO2qS5Gi%$A;;o9#iY z>}5V+SFrbu&x{6)*T}8s)^HoRb=+Fa5$AZmA2SRIF7vPPgVyW(GX70|!0NMJ;a}pH z@Sj_6@UQYq`4K@_5EMjlSHB>D{5j~pleqo{;s`^`6whNW*TLTe`Mp6z0IwwEbxNM& zk>I)HK;n_?OMKpElCU>`HXnT4C2>o5hy}|5K5{|8DO(~V!-BlJRE+lqU7ZXp(lb;A4BUG2cQ*fTpTu+y0<~0m>%h@dI|A<|SxbB}W(P3H5 z+$L_h^MMoZ5yirQUm^+!!}E}H^!>~}=*ne$$aWi_KuU#KpjOC7^|+T~3rH zE+tCv6X6XKy^b7Xc7S|yIpfDY{P`Rw{V{#x0uc3OkP?m`3Y+d_5$tmEBJBi zU4Giy>U@CN#30RBlhzm3s5NUX=Rf49toI;~3mTmPbUT}z z7~h!`G&q}`UCxxC2lclpjlPTG`|c|DU3WFsbjSU`UE{8FKXg~1cH3P}uJa!9m?SKD z=`Hk~_MP%&y)V3HeMP=k-gCa3_lz$hNl6ltgf}UPN|N5RH|2fpeFH4wz#;^~j8R(+ z?86Tw0hi1pQvxAb-~e^(Hvx4(8dwX+1Db#vl4mjn(Hhn(wiS;RI)yYW4vXM%5)g0= zpN-j-FQYGDsZW)Ku~V^3^mOc1bWfR!7R9nri_)fi9knXop#4m&4E||XT|s^wgxykg zE#ZVs?}4sD;!xd4SV$Wu$5u<#7&R$To0B%xZc?m1tvRc?l|G}n3GG#7n3~GWf~F$# zAXA;G$()1rKg5KT=f-MsJcrpz+DaSOZr(H7%&Myy|GsDYhXRE1%1u|XTNjA z`4Tf6boM%joWssnf;WOuC;lypyB-!$>#lQi#XK=byd*C1mHICD5Y>EH$!keQ@Ki5s#*En~8JId{btb^Od9pfID`?!PLUhWXrYaZeDaQBa_khuCVmDuX| zS73V${3c*kYOCirqiiH`gMA1moL7Y7PI#p7EbyU%gJprEIZq3VP?iWU3oi*T2up=y z&NISu!eYppLSYl3w#&1s9cF@r7j} znLcn<8j(E?#ASv+Otz~~h0O|^!lJM$T*{{kW!MBJwuyZigfqa_%oby7c58W7gg$dy!r6IJp91m24@wG8)B>GXgG4peC#2hu#pevu*Z(i01%^`EZ+NK+0IMv`EK~mNiRt6_?`q3GE=||&sT@{ z6qjO`;os13>_MVDu@9V|CGV%p)A!Q#8Ma0|OJ~k8``EqgQ#*w_Z?LK!b_&*&Hpk7A z+yuDfJ6n5btFk??RoXiE6}C=teLZ_Og*PzY>mY`ciCN=%cb|Jztb&bb#A#AtRudzgI&+z@*J`aevk zcV@Y-fXNJZj$5=l&wXP)wVN^1xuBgO(=S0Qg4RAb*(Of_gW@lz5E_qt*yb< z3F+G;axXja>ycCCeB|UhtB6%OZwv1V>x7Gt;~k)|Tv#u>5BXuL6$+g=xjCza0%wJA z(^(^2cdj^Bos~kCbHk}d+m`bV*}FmbfGl~CNt_Dg8s|gdl9S_t)r z@Lh$}oP(`MZymMQ`EE$Nd^NsWU#WD$cSqXm8}jw|!hsIofUnQj=&SaP`EE{EroY~Xb8c_0nzevSGwl#W1A5c^v2O&}Bq2KED|cK9D8sMgBaj z4}0K)e(;Fe$o&c{$p;l~vc#PgrtkrHN7xncgpJ^y~8Ei_JA9) zn%MoA4f49!P587=`7q{J#+6ZJRV=2w4auF@gIG06Z8)H8jy1$uVimD_vBp?)q8!pN z#t12O;fS&}Rv!y0n_|}?y#@Nx)RVv|FA-36p~Pu35yZ~Z3cfKBQ*|e*6LpE_s$SIF z5}k>NDyfRAni93Bhg4xzWx|i%K2=oJkw}1RN%SRBD2dd7KJB1SQzBWEN+n+<>k}`M z&y%N8Ds?FNCYeM;!n<`fk)KJWQG1zuo%ALPQ}JXb8AwKwr&GD4FBwdRlUcMX)G_i3 zqCb)RUsA(fo2*LLr>|%l(};11bG7N_bgAYdxJ#PKbVIsCQu2VjJhv_*DJ~|8T@cGA8Mr+fJO_ zoLb}tM2;t7v)F_Z&zs^Mlrz3*-+k#Ud~(iLe&nYm!ArpeEbT(@V(^^&T(C4)9K0Ni zkTw}Z9uFrJ;c#3L4M!AFMNDxXeu$@bWqYhO))q@B)5;{QjYtED!9*Gsa5i;5buOh= zU)8jwThlE^7$5feKb^k-ZghP006t3H*aqq-f>|I)-wxRn`LjwW?5UzE%~ez z^-t5T)~bC?w`iYg@n)O;662hjw`t#?e4AGF3rrT1&0NFlKPFSHN95NlkrQc>)D)F{ zc8A8EVxQZ=-zBj}*<vW@GSY`E&eH+qjKto8(VJ+jRaEsdJWTG1KnjpdYGu@}m$vM=^h*@H+k zl*lNv7+ni*z|-KofV+IOM!XZ@&)Q~eTyh;xojt-%;jXh=XmWO8EoLY7Rrem&!NS}h zNSVG0=|ky)uM+lp4YpS*za+mZzaG3SFAH9g6JwVk&xK!-7MoGL2xk@9a0a!3Sbyx5 zaxgZYc%d3g3@37`k;Evxt2lKbr9sTOPI_%SX`k0LWtt9>Thj0}U8Mh?UDajJui|}S zR-Zk$dKOS?|;Bz(N_Zus-+xX?UC;y zrjy=yGk8OOBlrqyeiJT?oQePs#p^IN_F6d>qs899KS!XE@z`i=D0WIU{B9qh0u9(& zf`;;93U&!1QYVmD20DDrmF(4Q@# ze5RPY!Y$q9@%em)ZJCefL0~m1bU2+(yK_J|C>#+EL4v63ekR^0QCjgeNSA$l%uVd8 zBQd%!$Fq)4;uHCVkk&(X7m|Cyo5=5z*xf~bM}A9w50cxUx9KeAcQJA%hn_g4p2eCA)ia5?#2eMMR4I_WlDeAePTvBKH$lCb zo{WIBIGn^a7gj4*@8lM8tlZoC{huwDnM_z5PFc=JZmrt|wA^B;uaU&)71lQo?VVRK z6Gdu9Vj(e~=u4NSu44_W@RMHBFM5#oW!V4A`3jCKUPzWR>|#WdE3kS2v?t~Z`3snX z1iT1@_iD(;p}~D8QFA%v(9oEWDx^WCgFkJ%4=_&;Nbi>UeBvg|)=TOce;XlJ_*$gR zQl(GhQ~A`sRgAIgc5D&!BK(@K&r4_<=SDuNH>4}+zV%aM{uS>%%HTI5FLdgN;4 z3ff*{^@nKz7%*cORmG|c&?^JAMdi-ARWlKq2a34yFh6X^iPvS%&WUMBVrPBgZr_&lCAKHh`YI2 zwu~?3yPY2Ar0~EwA)FF=okR;P+--6{0qVOTB0U$I-NqySDauFCj?VYkx8~dOt^3-g zUD6)uhHul?E!Fz;zHMJGG|(ws^|hhw0O4dQuMgG+YcQK8P-CzGd3CT_UWKwQSSu&` z+#|FTxgU8DDUaNZJd9LFDkD{qQ;1k^6n7#u5pIkh6U3GYUBq}XHcC#cM8!h61VYSA z@DgX$1b0roln^FliRFY8S`&jrctI>k@WHKsDpM7yP4$CRO{xl-+ESON?xDP&(yAY( z9;vHSgX!@!G0sr>zJ{8JDXfTv}KGQ$~> zrY!4))~{y|G#=8wjoFK<{m_0h5ixTut4ldvPL)&UhF7)!WHv#pJ)NFRPo<|a z5)ys*X7*Uzq5< z=eA?MA#qsz)Hf_0lI~)bO_+^5ri>|K*HvYzYnV}mW)?_1(9C6KG3w>jCs_&C?<8i9 zDC>5(o#dMLaqXVZ;(JD}6j6>WN2N}mjpVF8htKXCA^l}6I2h~?QiB7SRS#$ggy=ANxOclGWx~aNxwA&r_Bl69dF7YIBQLP7l#)LU> zNo@eP3ED`Q5?Yj7iJiow#07P+8gD-m>xsvZ5o!CVJgl{*I!Ij-wOe0ym$p<-sw>r! z>PL@ekWSrw)VDpgt?ncF-XjV2u{53ZV#EuS%rrY)Nm|81nuYpYnvs5ZWF<1qQihe` zLU;TO2l)a>p;^rEGI9+g)0twUjuDX4LGu}@=3cfu`!IVyTM65`3%U&oXdYxknxN)R zwgR=oWXYDST2XtNHIcI2tT}t{o#&V5?vwlw^1<9dZWv|HYVYc1Zu?!Iw+_S|L6t^)Vc(eaxi91! zCw+t%fk+HkeTN*Q23wF%2I)a2B%R>rg44l;;1p`}!B*5Kf^Ep#<+G3wX)ZDx8HtQX zM&Sefq#q1LrXph`cNYFJ6Pb*hQ%*+)BDBZ^q*StnxY7{YiJ3_+d5rw7>S;_Lvw$!G5i=`>GOH{M$4bi6wlAD{6P*Dk%*myotR;soI}7NO<50y9q}k zj4}Xnfg%Ze;%OoX&YF0ha3-P&TjH|Xl6aQbhm1&Lu=o)W4YZJ&N{yxlQ!}aY)I@4H zMNbW+sHy4HY-&C=gmzYnotjHAQx+ zt1!(#PhPr4BSuXG;-{6!m(${mCcT!HrUmJhj5H(2C^3#Eqspi>%8Vi-$}DFjnbnLi zBZJ2@W!tm0*@kRb(*iH(&dMRH%XVaYvd!6=Y#U^)*{*CS{(Q4BTb-@Xmabk|t%B5( z-OC_cIVvrS_kI*CMm5vxAVkd1dk+`P5u8x!T zPzI}7OmS13)MmO4I*Dj}*&1L1o6RXO{(&2oa^yeUAP1hnJhJK=>c{G}%of=fZ%4Rs zoUbR)Gl_9~vvU67++brz{cBeh{7GrCvM;MdTg=xjUkdUtUY8tp7P+jvsJx`SpmfH{ zkD@p)wUk;;@lyuU?zgZ)ZTeBVUb7Bs=+6#hqng^>SgsFiX508db|jUEII)(B*H#uzE}XX|sq z+)gejE>%8{(m?I#;D^|DwRf^piWXBQMJ@=m(BXEqsF#^X393yayz%c^H2pl7DjKDDh#|RuFaE!n)0>=m( zBXEqsF#^X393yayz%c^H2pl7DjKDDh#|RuFaE!n)0>=m(BXEqsF#^X393yayz%c^H z2pl7DjKDDh#|RuFaE!n)0>=m(BXEqsF#^X393yayz%c^H2pl7DjKDDh|DqB2@NN1L zBE7AAS{4_4Y5L7~=}7)-WWwi<{$4ul@atsy?Eg(7+CTi40?ubX`?;_B>aY3Q55Df} zzu_Cd>6^c$;9EccZQuSK|K>Zt>$|__d%y1s-~R(2esuB&f9T^+e)vaz^v8buCw}tZ z{yWM~{q)cL?9cuCpZ^d4@jv~-FaFYh{^e7JMW@f4J$JtN!o^FMOG>X?y;gSp#?4!| z@7%q2zx+YP!^*1an%cVhhQ_Amme#iRj?S*`p5DIxfx)5SkmjyzRcts+W$rVbKTC=*gzOlK5|L07ne{3-BJTaMfpIWT8J-fsCY~STR z@OXXC{efU89Erx_iDW9B$>v_XeD(TGp8W$K6v#jPpx}!i;hS6^AAVb}>*r1s+`;#^ ze)Z%B1(lzCQ1F+ZKm4{Hp)xu8v(f)6_5Gfs@9@1<@5`S&QShy2PZYfQUX1t4_%;{X ziSK;rG4_cc{Ggx{-|VX-?gQ#PqW?GF`TFIzH$?eUpx?wdw+MRsov+y|pD$ovJ*4-# ze#(A@?`{#_`Z{qU5Bkh!J}CQqf$iGicfLsRzlQ9cNB=YV`BAj^=PBM((EqNVe`P=Z zSK;R;{&&~^55>8!-2N{j&i(&={Z;wud`-SKUze}XH{=`hP5I`0OTIPVmT%8@ z{rn%~|1keY`9IG8N&Zjsf0qCA{9ok%Oa8y+|6BgQ=l@6kFZ2I1|5y3H&i_sRZ}Wdg zgip$6D4(T#WB!}-FDc)X|K9u$xNBMfnH&DKj@=cU)rhE&ffby-BZ^(aBe({7Ex6hpTLca3k_vODo zUw^XUSq_k^jm3zs>)$3m*h+HSMpc$*Yaig>-ih`oB3P$+xa{ByZL+XMku5dQBG6NP|i}$ zQO;9}DHkXgDVHdhDJ7Ir$`#60$~8(EIG7;Z~x+y)BUP>ROpE5uhqzqApDI=6o z${1yw@+*{IrTiM@*D1e2`Ay1iQGT29JCxt0{2t}^DStruL&_gf{+RM7ls~2X8RgF@ zfAJM8@jVd#8CfcYMwy^YQl===lo`q_WsX9p%u^T?CS`%bqOd886b^+;S)%YLe9AIK zKoL?z6ftFmBB4krGK!p{peQLSikhOKtWwq}>y!=3CS{BAi1L3?_m;tJY)iYa6Fbbz z;3N)%6Ni~OVp)>K%uE(pY=LEqY{{|=VP@K4W@d%~g?5+|hpxZ6^;O+Ex9Y7rKhFE^ z+y9odrdM@8)6+A(R(D^_zLb4A`%3oJ>}%QAvu|YI%)XU?hezv!7)@&wi2pclOKdSJ|(#-(`&RBv%mab znhd8$(xd66>1FA$^muxCdLq3dJ(*saUX@;*UX#8weOda7^p)wW(pRUiNne}3F8yB> zy)Auv`i}IS>ATW*r~j3{Cw*`FzV!X+2htCwA4)%*ekA>9`tkG==_k`qrJqhelYaL9 zy8d7J{l7PEozW(vZAQC{_8A>A>Sc7y=#OA{WAt+49pmmF*svL#?Xvm8N)M1Wc=4MXJ?Ge7?qKeF*;*R20CMG#<+~}851%l zW=zVMoH3>D+Nl}SGNxzD$e5WiD`R%XoQ$~{^D^dVEXY`xu_$A4#*z#~2J*jJA*+5? z^Q_icowM3!bJ%j%TXH!CM=NYKTbbxKVCn6KS4iXKT$t%KS@7nKUqI{KSe)fKUF_< zKSm}qla_2k>7Ua#XGqS% zoJl#AIaN8;IVCy4oD(_Aa{g6Qrn+BxWcSMMn0YZLGjrvrRijpqS~F_xsF9;ajhZm3 zAjgtp&cW3Am?3?J_i0n-V^;O)-KSTd!*zaUP@V7k-`pw@9r5XT(_%+(-IxQ}Ur2pI zT32@`%DA2Zva@8bxjffu$LC~JFo3X(t7Ij~S4gJ9PvtDjAxlZJBdf;zm)A$$MQg&2 z^X3aqmlem6{3nQ}$R)@s<_Xnv1 z{X_XnY05Ut{jd7?pBb}airCWFk9afON34f@S#i*MEciSo$5N{H8QUPD`9JObWu0>~ z@IAy`-IFSxkk(;&(g&Jg+05K9Vo~Tr4C!p10I|FA*<>ZXH}4}aLoilie_|h& zw3nAC+AB%Qo62eGdIdViRY%;-2$3V*s)WP?+&oE^_B(nwiA%E4AJ7l5YPo|&1H?PU zMe3v0T;I^DmQ^RJmr-I8lQRRoh_ah`%B~YIRU||$G9N2s43Z&@ALGps9kFi^c;po1 zGNc;06!R9_B)1jmXx?rzNWNHdgqq`NYNP!PlV`Wu-A;oJZb4u?UxxBg&KP-lid=-usvcz;Y5)uK3G6OA2)7yJqQP)ReT4m!os+~K07yKInt`NF3S{5!_ zUdD}Gj}J_Ac8o_1!R?`3psrId)=k#0qr9{>D?S=)Q;sVqme)hJL@KeBctLJ0VIHXo z`2;ycX-+GkU7){VPvqa`Lfl^b^MVtCe?{VdW=t1l(@u&zNh}hpcD{j4PBW%i4$_0Z z&i$k*~OR%@`!$zAQJ!iJ&Fh&hPUh&IS`*zvf{fxWQ<;r6!y?l;%U;I?r`1dMO(?n=yc+I>vqh+gv8X55iP+n!nEHkOsbfpYsl=JY zwS*qsl}RhyiZ>c{sO#i;A$M#P;=brv7)_Z^`Jci2Uso+>*BGM`O`I8AZ}cm@F^9R6 zKv94eNTMGw-EbS+?ffgP7fZkp59{^LFdRc3LbbunMq}~A2!E@K2xt~A+MIU zo%xOVk)>jH7Y-6xR2x;p)$Q};`36gK{W@EbuS*dWxK_drX`{v%zPw#Ue)TML4R#0C zMC(uQCJV`2>fh>FmT`_Wf2|)CLm--=Qdl#tHuoxtLw--)KpQ|G&zi&C!q1gmQJpjI z^e(f3ws%fMp~wHccwFRkj9=carW6rDv_Q_sF2GI2jmQhom(gn&YXl{tJdHiS+P~7T zFA9Zeh_lI+2s3gEvJ0vsY5`h;uEFfZ{KiyZVQicKvn9j7g7V)uZi(~Z(S+p$3kgT2 zl7r+Y)MwPM)O?zgRzdrV)|rlBEM~@8cUWuKleqPHvv{9)(z@5bxZu2yE*UHpN=L}5 zWTUhmog{yn5imEfbhgke+bkVy>9#GlZ8n@eXdmprI2U`F-fl(913v@jLfWu0GA;jS zWM$csSXx?x@yo z6S>0PM*E9?kFmDmzUn}bBTg?rhj^FEAsiy+&{C(ne?yIqo?pAU!yJ2)g@~{rWYl0|89m6Uq&lwR8n@blwRi0D#)y7SZg0ezq z(fvSvxOHM9cLT3Td=qg4F%fA+PQ-k}e!#-``?)WP=SgQte@H0u5=wpA5ZY~e4@M*Q z2rh-Zg?o_uoLj|biR*f;iCanLs23QH8orskScX`Z+v?jt+G9SNU+Cxg1O7Mu(}4$p z3$dT&a&Zx2GP1aCFN;8~CC_KpW6$JeiqFgTOQxz0YHnzc=1(*OWwwJo9gD8o$ zx)q&RG^DE5_^qUv{4$n~c#r)`7)d&tx038*SY-|6hqQkOYRGABz@$Qb;#WDCl!fk| z1uY#3bOuGh<`q|RWy-0BPL>9?9!2L$WTDfA>qEUzwU~(%EZ?jcqgot36CM(M;y6Yg zN&n86gt&$Ek{7W?^8Ml$DnLElD7LRC#)M;uw&>ef5$+G!%bp{(4w#;d@5EMK7v3Z z=b&d`qx6=n8~hoPW-_+Af5FADGjaplg>;yFRZ2AsFG!jTh&9SuG}ikrcn*=q!a-mQBQJR((lX2v~b?q%6RU7hz8*U1hsz*DNaQ zH{KTaSNAvnI?P?HniQmk=y*md!ioKb>V5ZL-eT99Fn~NWb@02Sb9U@K6+eL0j zX+>#6=}K|Y{4{{3pj%lk)_qoht!FplHRlcE>39YF<$_+KF`@$!ue6DbD4VS8ujDIF zYwPK$`SlE3!#e|DY-3tuo?waDZaIrw3*1!iM{h6xWIxWY_A>*I0xQG3NI|r7X=SWD z-W1Uo(Gx*H#L)`OCBkUp1!5oac-l$EZw`~6%bzXXtx{{*#yu`o(VlSc=*Zkpgx}@= zg;D-D{`H#GLKqXjR^kfuHkIS4?{PWavn@D@G9C#ccOe_$d*?kQzaSr{BbX!DTe*vP zZv;tUzVy8`N4r?3gs3WxDKdT+RxA%w3C3OY0PxfO8PCXlvP{C4L1{Ut|WX3h&GiF5EiW zIU0=7G$$$=QH4|mcR7D;@%@;Ly@20Ec+%Oa{7CG#*CjV{zL7g3hAODq5xf)Vu^0$* zon)sEV6>+&06?y^>~XL8C}!~9O; z5z|Kh-!Yw~xnqInE@D1<7M6isL9S2fNO?%@&zi^D%4sJUEjTNgBkd%;&Zo!`N{jM5 z*J|8kx@Y-s1o^*MYGJ`ztI^)gF~PCgE%RRrd@jxp=|h_$;fS+rb8-pBg&!{;s}!K! z27JK|`z7<@Tr_blWj*^h?-wsmcvltFmS|fVat)6SadU6WY)hlU(f&y>W~g_~Gn5u{ z0SjT9pw{Ex5Rs%Qsvab z7&TVTSiq+9hst&o_X^!c(kSNwm$?-d3^wM~p^vkPWHGrZr3DAgr-W`Hx{?Ny6cV(5 zD!v1873m!V%R0&*52$4(>$R$!40iNDFMZQCd#Xl{CM#vG;u0@6F0`QiFS#{X;1t6 zp`Pfo3Ek*ihLOjReA0F`%B-L4ojr3xI}&G26zz8-+H}H|mexA-!Voczb%J@*^}`S! z5D79sKggQQd(VF^5f|#cll+MA$H1>g9$ke0Ozud_q1kEe z>0{_(`cC=>W*hc$UJt%Zj!{k2PSk5`6YTkRo#(Lsf!|&HvA80lFRNevr1B(&!2YD` z!1qcns*eXYN7b<`X(h3x@PhDHup)Y2+clI&tS{Kf{vn)&94f!V-yiJn-f6)_rwJ8u z5#cLwD0!%5u&OBz4)3hmgg_uEC@pFhraCYm*N<31?m;V~ZK8dp^`ZwDyI2$1SJ+zw z()R zfZI!7$ypM79h@D>M~jJrNO($|_Cp#h=&n5wfJ(^adlfy9hsE3E+1ej51iCeD43R+G zNMcYT^f;Ho&y<;TkDadr?L)spOQKo%6Z6+&R?~VBG^DnSwx~Sx#=7|5MRXdbH6BMK z5(%U-@)t@G^#G%cHH@R=&k`IEJQm#6-I2;=NvT|MMv0~0(drEgOgIz9bjz%?WMkMa zp*!Vn>CY&d8)#LM9%>cpQmTs$E6=XDQ+5$`6Vn`5pV*SJhFQ(&DczxeV*F&waA8C4 z2ta96H4Pi5@1R#o4Jx+&upwo-CVr*beN<7nYR%9qNQj+5jC;hu{8Tsh@5 zgU1a>@&YqL?aI-()4Udu`J@#gH+l);Z*;=lvWTcKvKK{J!kvkX0=<@iWe6Xaz%i;M zfS62aO@9%rkG&f3*$jn$XivCm1h-E1e*!s3(MS8Ixly5b#4A00)*AVqK zrH1yIZemw(jw{Q}vk*UNix3Y8%X8N;j>}tEe%W&Dhwa;gao@_qPgFl^6UXDz^C8Jp z=~&I^{JD8r>n6v>#7E?D+Cx@^P2kG;$90QU7i{}%gMv%KEl}SHkvw-@3`{NLD1WK` z3Va{}0a2_=$m&TMp6LgSkJTx%#eW4CgI+>nhs@?_U4@ zfHg#m-!E?_8gEXZrcyT3J^VZ3F`6d&66-$!{j{`6HRt%9j1#a$+Se64dX@dXv)neB zev;18&NWRA@dYnQ$-LH<0^QJ}&qxuyi)fsrz8umB3<59SZwNf5U1p!uUNhWw42*t= zRJvXl4y!zhlh6ZPinN1bP2hT9QaO_QMbiRt2LTXhK{ALi~p_R z%6KyASXF-$%3fhlI4DI+15X2*;_k88vCYU09G}&0Vit z^*wEUgZ&Ewt3%f!zsf&WN~(~EWr$)_E@mNNEolnv4*f2D8fz!78~+ObnjnJCw5+$S zwWk#Y0*3{{Y>&S*Yg#naCtZ6i!_|!tET&C1MBdJ=#tr7rNq(f3nKn{Rk-K{q%C5TF8ynjbq+)X$NpJmKOdnFF zlCHY19}s6&H4|F%I_IrIx4>C&EqRZ1UxVe5PnCa@sH&5)CFrw)!4@Fv z?xcyTv9?R$EIOojVGZ;Q%SLyOzqlkf{*k}gjV*1$Y|Pv%!PLqAPoUTS@xc*zG;%Qd zH0C^Z71=^t%5X4mv77Mk@%gfVbgX)udZZR*xalqTFARl4pF<~N#hwl%FM@<@iSYTS z1zVSILYZkX(q8f&+C6qH`zYrDZ=vvxu$gqXtW-HryT$0Yrr8#_&bsWr%%Y|x+>j;K zG*Q3|vqsg$f1DDH^n&%L^@!AM-RJq{VCzpSXb(1nJQ(U635~0PSs2Spy@{8_a zg=>6+Fs*Q03WC2@&`{&lK-$Y*(0d^a#qwiCbdUPH5#d_O=4ySI8PZBw6Aei#&X1T2 zV-JkQHM@~A=1DH4un@5saSxS=xPX2`PH^pl1JYjVnYvB-?#5?kx#ODO9J(CV#yXcL zF;^`^Q03S-|Ge~yGDq{=J~+4{MyRZ*W@u&*6VeeDT6qdF7FmS+3%w1qkJ_EFT|L=w z-7z}ySL{oyX*^!ds#(p`h&y3cV9qFxdC$@oF+$9~@&(GN=1&&6?Vo^tTG|^|-_X$L zOq@JgA7%G5M`bFXsfkyVLjHUb!RS85nqIIR%f7C5-rwI#W@qE1fKP78(dTT@n#9+io z#8|{+#5BZAL@t7esN38@hy#8^TSp6e38ETNgIJ1Kj@XLWf!K|>gt&+}fjEUYhPaJ* zgm{g3jQEOZg3Lo^BgsfAl7O6t)FHjdAhH~3LJE-zWEd$&79wNF&gdJ+$H+^_JIMRU ztH^uEE65b`39>6{AgVoTFe(ex0M#A&1(}H&gc^$ajeLu2gKCJHg_?&-=i^Z*)O=JP zDixqp(mp!p{JpzqcP~kXdIe_{$>=SMQ9n?hIXLuD|#3DAo?WwEc!kgK;sKvpkLR$1HVImM*l`S>|E>|Y$wD5>=NuPGz}}n%CMbDCafOoz{apkv8%DGu$!@4vAeOyv2D$FV~?>v zd2f_&u+Ootv9;KGxGA{lxS_aVxXHNTxUslFxE?qJE{N0ON^o?X5~s&0a1opdXT#}m zE?fv#h&zp2j@yG$=z?b8z@tg5xyc53;@4>Id z-@~88KgOTHKftH(H}LIqzv4UQ{>J~pcgy{bN93Y%A1g=aj?EpFJ3copO`OZg9g!=^ z73CJ@+H(E5OLI$egSo46H|Oro-I;qV_dxE^+~c`Na?j*m%DtLx8DnTLhTUjM#pUE&?$6XFA6iujoLmRL*tPW(aqN&H2uPijhPP3lHkEyyAb zB@H8uB8?|aC0#S(NhlJ6lt&_xSR@9CPm+*?q<_y&|5LN`Np?~diH6*OTtV7SIz@U; zdO#{B-6h>4W##qCYm?VKuSs6lyy;t-RX2A9>Bm&Bz_eqsUkC29w8Yy&CR#7)nH&YK%L)5>h2dHPM7pd2&*QmFs_o*+bAE=+H&1hX|U1)7+-DqQJ<7l&K zvuM+42pWNgqtR(B8izKIrlsjS4DAZ-GVMQw=)cGJ77eC7q}`+4 zr$IE3_MG;D_KNnN_L26E_KEh5_M4VYZ$hWiDfDLaHuR44LG)qt@$?z=`Sitf1bqY@ zP0yth=p;ImE~TsKdb*SDpj+vFx|bfNd+62l1ihTTl)jd}iGF~7i~fV2qJN{mr$40c zVEmzHG8l}sv@VR+j6sZ+jFF6Pj1G(;jQ)&PjERgq#teptp=Zz;3mJ16OBig%ECz=$ zlObV<86<|CQOtP8a55?wE=H0OW5gK|#u`Qu17z%B0F3L5os4(%gN##*U5q=7CCm=Y zhRiRFuZ%S2Cq^wJoteq}!FbPT!EDK#$DGO>$Q;02$ehNU%pA%b&78uV$(+qpGxba& zlf=wpikTXwoXKS>nRF(ViDhb;31*DxVQyrWGAo#VW|+BwxtV!^d5(FO`IUKwd7OEQ zxsQ3CX|P^oK4rqpFU(rzC*~jKFXm6?Z)O^+F{=ry1*s*)etr+s59&*0EQx zgKQtWhP{g|u8aQ**@xIK*hko>*f9Gn`x^TT`vkiqXEdiFryZw1XDp`&w-aX|rxl0K zk#lq$1ZOa}j1%Ro;;iF%IR`lRIM+BQIj1@MId?e6IPW>nI87V?2jpyI!JN08q1-Q= zPn-{&T231G7pF6~JGTM1AGa@e2zNAh40jxNEO$J2k#;^emy72v;S#wtE|sg|=5rlf zC)Zz;A9p&xio#h?k9pL?^5dHV~p5X1_ z-QwNj0laCvr@R-ucf8NMue?_Lj{Khd{`>*_@$upOY5cML8T|45as0V_8lS-@@!5P1 z-^W+**YVAK5kJ5$;;-f}M58j7$lf3SRxoDK-9(mb_j+DNCLJ%FR%(~1VOQ> zyd->1J|}!A+%G&XTq7JV3JaGCD}`mkox(@L=fe7;ZlXWJrsD6y55i}{2BK}ko}$;n z_M(@7aPP@u}$m}JH^G~a&eisTD(%cUc5oPMZ8_SO}s<= zm-vAAl=!^(y7;m9mH4Ijqxfyz_y3{l#*%iD_L6Rrev-ZtnglOlNkkHdq*ziRu}hMY z0*OGPmP8~W$qC7O$#uy=$!*C=$wSFz$u`L$$v(+_$y>=?$={M*(k0%p(jn3*((%$R z(lOE;X`@^py0K^pW&}^ttq! z^rW;_dRLl~-jx0=eIp$vlgWn5y2w;Ax@@YfuS_f(BGbv1$a=|U$tKDWvVO8ZvL3SW zGKXxvtXy_h_LuCs?4WFm?1XH)?1t>7EGSzgJ0`1<&5*Z|FIK#geUtr`O_P6+jg-HY zjgnuG{eS3BmA8|Bl@-d3@_e~nZj;O9Wcf$ARPKiil#1;=N*{Vvk~nVzc70;=JOaA}#H%qKWdCqPwz-lB>iky-J>vrChAcRZ5gW z*+^amKyrw*>yrI0L1eC9o&y=5)Kb7B=f0Qj$tySGr169LRLsi+T zQL0I*$*O6p>8iP^MJl37qbg82RCbj|6;Z`h%T;SsdsW+2$5p3PCsdbI*Hn-SP=TuN zs;{b6s7~sp>h9`}>K^LR>JjQe>MZqCHA0P4->D|3MQVXsq0U!p)h4x3eMY@QeM!Av zeMJ34{YL#ryKYTWC9I+i81h`)h}4 zCu?VGmuMGi7ih`ax!OFfP|MNswPLMQo3GVr3$-4tM(fx5v<_{lwnAH_U8P;2J*M5E zJ+9rQJ*eHIJ)qsDy{J8>y{5gZg|&~gzqNm~X=y*T^>pvFwb~EbkJ@Is7P=<7Ub+Fg z-nvX(A6-A)XkE5$l5U=EzHY9Lq9f{p~wS68Gf z(ZzI8T|!r(+p62C+oRj7+owCGyQsURyQX`j19eYy&vbw5Milo8RBiJAbfYPJT(gCciM>oL`Y2$X}7aD}R0dmi(*vr}EF| z-^f3de<1&4{<-{D`Tq?3pXJ}n|CRqKzmcJ>p^c%7VW?qtV_Mp7<4NNQ<6)ySblP~%c+q&- zc++^@c-MH(_|OO%A>&iyYvVg(eN!t_Q&U4zj;XV$i>aq+jA@{0tO;c@nlemFOwCM- zO><0I6W63M@l6Vo(j+m-OjV|GQ;n(ERB5U(6`3NYpowZqn9iGynl6|wn|7K`nI4*6 znA(`zo1dDVm>A|Xb0c#*^GDNHQzvr^^A}TJ^8oW;b1(Ba^APhC^J4QXGtP`OPdB5? zL^IvYG3T1OW{FvAcA7)xmF7+6<>n3MW#+Z!9p>%kZRXA9z2<}FBj%IlW9B>NYvu=L z$UG_e*8IWz$^6A!Yi{@tIek;#(%sU*($q4?vdA*rGRiW|GR893qPFB(5Ehk1V3Apn z7Pcj7@ma{0pv7WITJ~8sTUJq} z+bvrY`&-+4TQ~b4dtdtq`=b9?MEc)*t`x=Q+NavFcC`JcO=*|exptmiV|UuUcE7!@ z28(^Ez0AJSzQRtoNA2tETkX5-hwOXo2kl4f$L#y;XYCj5SM7K0ckE~E_w0}Dfc=@h z*8ao(+g{I6-_gL)$kEi%!qM8%(J{y|#4+BHqubC*-?)H;_s zea^McPtJC(m(EMhU(R&b9cMGwQRi1@BNyQO;B4XQFl9x(2%@yYk#F zm)<3IZF0$64wuk1*EQ57cNtt`T<2UY*Iw6QSB>kg>!NGF>z?b1>!|CL>y~SoE7SeQ z^~u%A-Pt|V-OJs<-QNAvHQmj26W#OwA=!5`-1Q3=x$$nBd!^g!4!iyCwQi}q)SYzy z?e@4U-FkO{JLEp=-sisT-s`^NzUhAGe&T-M{_bvC*sicy;cs`XyJ2CU!mfqch0_X` z6yg!MLV6*;P+1r)Tv52LaD8D>VW4n#;g-S^g{KO)7M?Ba>)lXzqwrDTi^5lhX=#rO z?-#x;Z0l+0Y3xb!qq z9)U;ZA$hPKwnyY?;9c&i@i;tNJm)(>;Z?Uh3kKv>F{yjVWPtE4}I6kRQtE&%`&ao_`z!n_{3rYu{m1RJT)I~KJr>QvObD5q#cynoS<*j>91WxbaNu6x zSD-fVBal(tptxyqqvBS@Es9$gBWl_eUktP_?pVw(mKH0E)y4MWMDelWL&f`wFBjh{ zzEymo_h3E@@Kor?^K+&yv<9y-H@5j48=38C|llo)UM7tE8yJUlJ_|mz0(yO4gSwE7@4G zwd7REwvt07Cri$hoG-aw0+;+O`BCz+JZ8dwFvbLbqqBN4G4`5jR{Q%eG4K(s1Q1Y3AGF@2u%&;hKM0rNDz{T zbfL8|Rmc&tgzO<($RF~Bf}ypcEun3pT_Grx3e9KT57iI14R;BT3TKBGhI7NjFgwf* z3&ZNLDqIxyg&pDL;SJ#};q~EN;ho`q;UnRr;j`iM;Va==;m2Vxd_Vj%{5kw3+%xhg z+&(fi(jn3&LW>Y0b0P~OoXGr0S!7ydQ3MsKjKm_*NHUTaxg6OW`781w(kfaTnH?P- z{r7PCPtEQU?Gx=9?HipK9TS}tr9>G~b5s`1jc$!@jBbjSM)yWjqQx>j_rxuX zqIfVKidV+h##hHz#CODZ#*fEO#m~gg#~;LB$B{K3;*X7A;-BNK%A1#uFYi~LSw60O zO8MM!Wci|Uak;!)@ej$qP?l@T)#dBUx0G)y-(7y9{CN4P@)zYV>q>bvNwiJ0PjpUX zCVC`#Ci*3MCx#}5C#EE(CT1oUB<3VgiA4!?0+U#rz$fB~^2Dmdro`sNfyCp){lvq> zoy66|>%^PH`^1ODkHoh`y^2;94Jx2Smx>`3<0|G<%&eGRF{`33{#1dlSW-c*AXLyR zSQXp~PKB^STp_C1RI#<siAcvDpi%Q z%2TzWN?v8Gs;F97wXSM=)rqR3Rr{;LC>s8;Xo>slCdRz6Ys%v$( z>YmlwYD2Z9+FtFgE~*YxN2<%J!_`&QtE$&k@2Os2y{VcRzfgUt`f~M^>KoM$svlK9 ztOlx|R6nnNTb-8nsrpOx*Xr-pKdOIL|Eg|O)41j@U5A>?nxQpQYZlgEYH&5|n!3c+ z8fFczhF>G85!L8xR5iMqvYN`8r8Ognr-h^tNAm!kQ2uYZ{RQ29^P}F#1J_yPe#J=M z8Nv6+58fR5Km>^RiAY1HBPSqpkrAXHS%EA?UPMku^+EkX_C(D^DNr*}rKnG+JE(lA(0aJ-tjX8q3k4eKe!uG?euu<%G>_cqJ+De=sw+{CQSBNJOxP*;_GlbKG zR<(861hv(~?ZjpzEQw5_lGvn`q&N5r2s{$6ZLOM@;4S5C=N;zN@>=o-edqD_^D%-W{Ca}fg3E$-wE|)L z+HxUOS7J#lnk!O^3Pg}7CAuY^CZR|QC349f)vDKnH5W?OAV{9sT*lNtNUvPYX)hCYgiherbbgwE7v-7mAYzOQny;ysdlb@3nnukk%d*sR%YrGGXI*CPSzFJ^a$23I zonM^uT{~S^H>vKMPVDYgyVc#hHnX;o_p`UHf1KaoU*kXIf9&s5`^AqfvKGAyd8pA}ycN5;`{e4J3uEgxJvq;^1JXl-=@QE|88L4`J{ zN(PhLlKYcsm5M5H)v($w)mQ6mH7!k%smxSmsxvj2+Du)hJ~KblkO}=s{b}^4{{LSS z45$ax2hxEIpaIYjXaqC{ngC6KW`1+)g*0BwPGKzpDA&=KeabOyQrU4d>u zcc2H*6X*r>1~P#@KwqFAkOlMy1^@$rLBL>O2rv{F1`G#A0NKDuU=)x8j0VO4V}WtN zcwhoB5tsx_2BrX0fwZ(~z;s{+FcX*s%m(HFbAfrld|&~v5Lg5(29^K_012P~G=KrH z01m(dxc~tm0wf?0AOjSD3eW&LzyO#43t$5rfD7;dJ|F;ufCvx+52zU$t00=+;45WZ3 zz*FEE@Emvn{0+PWUIDLxH^5uq9q=Cb0DJ^K0iS^{z*pcK@ExeF)4>nmC-4jS4g3Mp zzCf z2YY}$!Cqi*Fca(p_67TaSzv!~05}jF1P%s=fJ4Dy;BasRm<^5uM}axuXmAWT790nT z2Pc3N!Aam`a0)mToCZz@XMi)oS>SAN4mcN_2hIl*o$N{+^59EUaPzZ`ZF(?70pbV6Q3Q!5EKsBfV zwV)2vgZ~8d)6()m184+Ipc%A)1)vqQfp*XVIzboc1`9zC=mmYCA1nd`U@=$%2Eh;* z1|wh;ECtKJ7#Ii3!30EJJL54acH2kr+CfCs@t;9>9xcoaMa9tTf=C&5$TY48kq z7CZ-@2QPpZ!Asy}@CtYpyarweZ-6(!Ti|W*4tN*52i^xCfDge(;A0Q~K@b9AFa@FVyM{0x2pzk=Vu?_e$X1N;g80)K;lz%-~H zR3A!*GN1-fL#Pqd7-|AFg_=Rlp%zd}s1?*2Y6G=}+ClB14p2v^6Vw^%0(FJDLEWJq zP*12A)Eml#`apf5eoz+F9~uA+ga$!_p&`&vXc#mc8UbZPBcV}H4)o8!e>5}(8Viks z#zPaJiO?iyGBgF63QdEiLo=Y6&@5;+GzXds&4cDc3!sJ2B4{zR1VTVa2nC@b41|Sn z5FW~f2oMn>L3t1vqCixL2GJn~#DrK78{$A*hzIc@0VIS(kQkCcQb-2LAqAv_RCPK~ zLmEg6=^#Cn4;dgMWP;3)1uB57kPWg!4#)|)AU9M9c_1(3gZxlkp%$nZDuIGf2ns_H zC<>KAWl#)?L*-Bcs(_MEB~%4fLp9J+Xc@E|S^=$uRza(wHPBjU9kd?W0BwXeL7Sm1 z&{k+0v>n<3?SytgyP?0JJ42rq&c!%JWUjD%4z8pgm_7zg9w zT$lh8VG^7NlVJ)>g=sJyX249C1+!re%!PR{9~QtuSOkk<2`q(WupCyvN>~M}VGXQ> zb+8`JhYhe1Ho<1t0vEtm*aq8S2keAhup2IfJ+K${!G5?14#3552^@q&a2SrjQMeQ? zgJWF3SJGbf!D(8;Pvo^I@$jTv=QC}Z-%$P zTj6c+c6bN86W#^yhW~>1zN8w}eargv$5c76z<1$$@O}6J{1AQwKZXGqgdrG)Q}7e`Df|q6 z4!?l^uG7Iw_!aybegnUS-@)(U5Aa9$6Z{$e0)K_S!QbIp_y_zG{ssSr|G;Ufda3%U z^i)QwL8@V@QL1sONvdh8S*m%eMXF`0RjPHWO{#6GU8;SmL#kt{Q>t^SOR8(CTdI4i zN2+J4SE_d^Gu0>6H`OndmFk}wkQ$g8lp35Gk{X&CmKvTKk;+buOpQwAq(-O4q{gPk zrN*Zwq$Z{&r6#AQq^72(rKYE5q-LgOrDmt*q~@mPrRJv=q!y+Yr52}_q!1}&3Y9{q zFez*bm%^uVQ-l;TMM~wR$SF#SnxduXDMpH!Vx`zAPKul2rTD3T0{Urbf|M{NN{LgF zlr$wv$y17yGNnqXQ<{`ErAz5k`6)xnm@=izDNCv#Wlh;q_LL*#Ou16-RAI`K`d{pQ z1#}xtmadnXnRk|%8Np;SW;q(nJfx8ahREznK`o6RV_KpiIm-aUtg8VE!%%) zcHYjO*>|?j>8cCgy;XJVR&}dwsmm3!Vo|J$O|dHu#i_Uyx8hN}icj$?0VSw}l(15v zM3kr!Q{qZOS*9#kRwyf#N@bO@8ZoF+)+lS0b;^2WgR)WCq-<8UC|i|n%64UkvQycm z>{j+DdzF34e&v92P&uR=R*on~m1D|r<%DulIi;Ld&M0SF@IJXc;Q zFO^ryYvqmdR(YqqS3W2ol}}1m$tjvf#QvE53Hwv_XY9|}U$DPqf5rZq{SEtD_IK>> z**~y1+m@$!4+HYz~{t=CS!~0b9rxvH!ysvr=YYMrLA5*iu%;%9)v2n3dU>ojI73xtN=I zn3wsOp9NTug;lz6TgH~N6>KG|WUJU}R>jt^wQL<*&o;1)Y!lnewy>>i z8{5uyu$^od+s*c{y=))b&knGI><~N5j=L`o zuCS}@8oSPJu$$}_yUp&fyX+pj&mORc>=AqXZ8HB!R?TWyiYbgS&Qz9W8CJ`lu&3-9 zd(K|4m+TdL&EBxL>>Yd0KCqAM6U(w3`^^50{X6>)R>Hr7e<%Mg{@wh0`1kVfA^yYsNBEEOALBpHe}exc|0({{{Ac*j@}J{B&wqjcBL5}+%ludPukw z@5OubKD;mQ$NTdEd>|jh2lF9(C?Cd$^AUU`AH_%WF?=i^$H(&td?KI3C-W(MDxb!u z^BH_5pT%eMIeadk$LI3}d?8=N{|{fxOSyp?xrr~~OL-YD=VorMSMk-nim%~o`8vLyZ{QpGCcc?( z;amAOzMb#jJNYiYoA2R!`98j%AK(Z1A%2)2;Yax~ew?4+C;2IUnxElk`8j@`U*H${ zC4QM-;aB-Jex2XoH~B4oo8RGg`8~woK7YU;@<;qJPx5MB!&6-0jB~E?G|%u_{)9i} z&-ioxg1_Xi_-p=#zvb`vd;WocYu28s{Wb!=jvamf2sbJ`q%2; zsDG>eo%;9cKdAqx{*(I8>c6P}sy0!Zs?F5qY74cc+DdJ$wo%)v?bP;a2eqTxN$sq5 zQM;<$)b45zwWr!k?XBi#zp*EDjs13Z;i=u9|HaRK?Q38A>)-gVd2U`(^36Uu|DXTd z{M%vm;n(cG$*1@KHP6jUO1{}A=l}Dcn}2)E|CgTLe|z*$--}Rbr+WVfX)Rqyk`5?8 z)YIuLzcG5z|D%V+r3w7E;Bx#I;Ywqrag}kku?qh=xEB9exZb$IxY4-DxY<}zvcJa4>UyomokybSym<5lA| z{Hps6<4xnOdiHu>-wL{w=}TUln3|fJnVOqgm|B`zo7$M#n%bG#n>v^}nmU;}o4S~~ zn!1^~n|hdfntGXfoBEjgn);dgn+BK$ng*E$n}(RCn5LShnWmd&m}cU?C+Fb*CFhyu zn--WBniiQBn@aJYlt#QhafxZEsmxSvGMg+WtI1}vn;a&m$z^h*Z?i=I2FjTnK$P}> zs#?!SmyV(OUFmy)7*RT0Q2LR*g3MNGucujEkJnrLFa6&i0mnBqABM8VdS+@w`tlp{ z*O<5etgJ^_&$3?lztleXuhf2J{mTZF4J_(UlWfy$vuyKhi)_nmt8D9Rn`~SBx4<`k ztSwzvx~6pff7^H(>)CmE|HoK{0C}1J}+&oOnw1rz<<9NY?hQRCAzw_M#>7h zFVzR|fAyMvU+Mn;lwGmU``?6ZSQnvUZ{JSbgKuJF-%kDi-@g3+8-XTeP0N~|hhQn|%cgRj6vIy0&(r5!reVZ@ypZ^o~_^rwR z1p3SEe&bpT+BE+cxBHg-y+Qf9v`J~x(q^T-K=&!_TiUO5YU#An>G($3%+gtZS4K78NofZ?Fwkm0c5h~cQ=nBlnLgyE#&l;O1D zjNz=|oZ-CTg5jd!lHs!93f>5I&2Zgt!*J7Z%W&Ip$8gth4{zssV0eh{rad+!4b_Gk zd~;1PFatNJhO{ALs5Lw>JT*KsJU6^ByfnNr6wg>Yd>^n!Y5rI0ni!iJn;DxMTj1Ml zt&FXWZH#U4?wa<-4#ti~ykrXBa_egBX6$b4VeDz_W$cY#C+}s;1WE^Z9 zVjPP9OB`+-VH{~3WgKlBV;pN7XB=;wV4P^2WSnfAVw`H6hVQ}6z&GJ$;eBFrjB}0i zjPvpBxP`_=#>K``qrqr2n(z&}rTErdIle1rFw7gho&$C8MNtlB62W`{1&Pq#Y(OqjlIZI=Z3dH!fLJ<}7oR*}smrX=T&D z5;3`KO4(G>&iqQuH{PF;k{J!W7)erFUg0Sz*(tsq77ZxQ&W@CGAHFR(-9IRZ@5_Wb z(KiPjmgS)pt|Q@@);;(ZP5xl`K2=G{0ig275opHXQ|5}0#xI3m?N}N5Xw6fVkl(j- zhMYN85oR@&RiPd}Jb4i)4ciNRwfCs4TOe<#m1EeN5O=N(Z5Q8UOj)1XRMJ=Cty*7w zxX`~`qu+j7iSGmUK&$Jh7wbcNfgBJlcW(>@9Is%ph2#Ux4{aqS4{S=g*2cKdSV*_p z6X3RnwuQEbx(9YZ^3ul2J?Kr8MiH~dtx3;5_}fW7c2T*T%94@^x?jTY>zwF10Qo+g z`$MzIdb#~M#<(}MCsZY4JrduRJK#PTn&D@{x_9ZJ&=FXTMZ{C?$H6nyzq&Xa4jq7( zWAIoeX2NMZDtge|H%>ea7@y4`3KMkC29AZ!lBY+uT1$n0i*F9~sm^an$qV>pp&^aN zRFA_GFy9H$;y%o167lHZnwTAhYzsOLiFwp4E>jPidd>*6COcPN?dj*-W^WFw3+|GV zgXT%u)6fqL9uJ)iJ++?-HE(p@FX?<-4P7Sgh!#)(S*f`gdWAW~(>#&)m54z}$u;QD z;hd7KMw=n%&V#!WnvCd7!+9Ot1)Ni}3B=?)MQNG!ux=ch7wu?)o`nMr|7&U`FYDym z39rS+Et=onww3N0>1Akk8m+78+1qIALFgXJl9HQLZgk&4eLr+pD`9&Jbw}ibH}Ej@ zh!A@J&7Dt#Y%-$X)6c;@ht&?zR&8jOZr+v9GeS>AtdF7J^I>x`SyJ*ev;Z?*4c%KB z%^TZe;dOTQ4q~K+W@exHCwNjJH}uI+I#d(79L$7<2vl8<6v`x*E+*KQ(1Ur|=Y*Y; zeGz&Sx}eMBOa9l=%d5~kLBB;^BXYXVyQj$Sdx4z`|HskGN_Wch7VUqK{(4exK1x0- zsl3k~V((c>e&>rwb#c7&eX577>q8xN+&)as_UBNua4vMrUQ!aHnJu9Dh#of&Ym$r9 zpOTU$;iklIMAW00i{(N-A2!$0RVm}O+;e<#sx zk>L|4M~9!L#)O9i#sV=eJU*;qyyws(?I@*;ScQH}f_6f9e_$f&x&F!FDdDN%MWUUV z;pyQS;c4M&`>b#}P@{{??65)Pl;&-z zmQ_DuYERSWb5M+=n_&{w*Y_a(%Y@Y}W7? zhZC{YABx9Lh*gxo&+Lw{Gu#=pO?WCPaf9k9M`|K_m(==g5A1gASK8qVd!#(#Pdg)F zlf@tQh9~LPhK36Q6%febB1VgC(eQdP#*om(!WE#xg3~OqR)b4u?mpO#QqH_4o24Z4 zJ7;^B*q4Qu!(w(0*JjeS3#}9$K2khafa`=-%d(ZAW@2Rfu%opE_O@7?s{|g`owU~G zCPZ>|c#UN%u;pke;j9WX|9YU-xYmR(VQ$xk*NSmy_`0K`Z39pn$={~%=I~vS!Jljo z0_H3ayrVgK;olOrWVgyzw}aXl-XZy2;r-_EXgh1)O|m%@&t=Xkw7e&5rLpJRyenn` z*IXd?;oL9190)h}b8AZM@dv#J!`ipF5tudP^&Get z@b}e+okn*axGV6I6?+G+q_zvPwM*fPpclFNh@Ety`Lc$`>B#ORi>ngrpmq!Gb#+{m z8ed?$eXg}taI*WLFDK?n!;M0exZ@2Z0Z@k!0Vn!&6L!PQQ`|Y*aT_C_cf(CQpWSP% zE1dW6o#i? zp1wrpb5GLd61xK@`}>rgg_eu!+IlVE_uVkQx4O7J3qJv7IeMAKcf+3w{EP4j+d=C2 zOCfoU`mLZn+2{75=u;-FhTlN;T*&opyLI{g9{Oe#9|`q2?1iRD#V6thR%kY=y^CCz zAB3+K6>rP6@1w6QAM0<5I!p3*`0o0tdV8b3RqPPtQ7?N}-ic(bDq3s)oMtg29V*%j zY^Qn=>`3xLtf&OCaC9SijTlRR%E4av)_y_XqoSXrad)Dl3y3e(L-5W2l9Hh~ z2ax5ciZ1AjKRX6oQ~RKbScALEg12G#?SS=|&8L;rWze0dm)$><}oTAf=13iiO2|_yFFv;292p=afPv--3D=0y^eg|Mf+6Va;Xltq+$g5Et4{fq|A~kw3x5U zA@4)}tPK!0ox}m!uH#*T_ExwnoE09a@kt8#NOS;YP)I`+Bd||o9TRAWdxf~Yr!_ge z(R>ZVY6W(ai{%S->$;-iB&{YlG|`F(d4A-Ni53zSaZt-}F2@-p*xYOE0nN*Wp(=4%?eaZ9d|G zZ1D_iC0{G;!E85bYg5IYqBe`s#oRWsHRz(VrD8i|gQ)Ly*d2tc($oYkZziaNI(M{W3?sb|Y^V_?{!nGa{;U(9#x~#gOeH-O=Grtm0TB{*DRlaiKdQ>Qhv! zx|nZ}t20qsYJNpMtaXl-xuQ_p7szhE|30n}#m8&&8R1)#_jR8KXC&(}UXypX@4RU1 zv>3x_9UAvXSQR~GTW6s=N&3lRmM=>5M0vegkG#7i<;A_xI4*XNn1})HJ<*3)_DTbr zNi=g;Nq$RciM)Gh&TusBJ_)1(G2?y}XCqv;5ESn>i8M*Y`MH zNFSHVUrHLECUvxdurDl+ysu@f-c`(SzpWUIwYV%hFYpHFCEgDx-&ZWpVrRoyQt}D> z$BLDpqwtWesB(U;Xn|4YAm1uI1)cLmMl_Mn3|oloX&Pzbd*HjQ8&3<0S38NsYNLH= z1ZC<*AlE_HOs8)dsmvay+~_U*jFlOPCo?)E#t>MQJwt7;k#nq#q@<)Z;U;5^PLg-9 zyUR~u{A*p8<-J$?NC)8B7Wveydz&|6e%e5OJkUjsT+dJ4L$4y|bgh-O;sOquWP&MSANztrcVM9%(P1rj4h#_tc>ZJuj|T ziJ2=%`v{BKqUFBedwg9ln)P1YtQWjBtQX4llh^f&bk&WqA^sbY^p6aV44^)qG!H83 z>t4*sz(`m`ZoE!6A~ICR6R7?r~t!4$ChdSqnO7cei8MPnkP8$pb1M5cLs zS}%_$0C$geGVEwrmE(ln#CrCVz)vOFWRz3tY4d%Z>X=6ImiFn9)!7QiF08T{k(rUX zj#kKmD`NgyTTk0&MP}1=XEyM=_>wr6imKtXux#wu_dhMO=dXHc5J8g{!3#T;->NBh^dN(0b(;PAUYFZ+agCq`3Z{3cn z`A0u6W8=K1Xf(6k6}q_M>Hv$CksGk-CPs@-SJcvKD)Sz`x~vkY*OoOzt^G=?b?9sU z*noKSbJt*Q)<;&$o#hI8IfpWHV`OvWA*hYn4UtXox3$RU7I52&Bn7|4_4Xpne(wem z=R7K9-hp43)9BqO-}&FlooZ9IOhj;3WIE<#XOW-0wMWeGKGLNrcaIQ#6u-{Y&2k`e zGIAnvJaSmr9-{h~;BYsK2)vgq=6!zsavQ9QkF$|e@OcKO2eW!QvZVpyplq|)5>NJN z4Cf--VY5@L-}8jN@D(uW8Yc|_)Sgl`*Y&Ai9y7sGu46=;a z;R}5?irmro8CY{?z+ZJYr8brkmPgdcGr1e|p%qd~-ZPPOB!)h`l5Nd}_KD<5N}ffm zkUZ5%w053@U+sGlIpBX;PorrI$5zWhe<$DT$QxkV+qYTXMt0eT<2N_oTHZsl9DVCx z-%R~_NDvpOdht10?r?Upk1E=w zv>twpe2Pqwk zddB%jkbawUB=+Z#0y_%zOUk=P6!Edqn0cLR41P;YqpG>Cq2zRu6ku(OCDPf1PP8GotOp>eKAH zW399o8I||*&eBp^=Oy?nQFNxGZ=fIbKW?5E-4AbO@{6Z>vR4}VoxCQkkIogE&g5?n zakEfXU?vw7SrytT)W)beS_;H`>haR(0_x#nNR~uda2Cz$b@xKyW1+P?y562)$ zmkHTsjL{_Mf>->O+0{zkK zjryZgC=#pfyUg}zC>o4zg=Lj{sockgVV)eKg}S~V4v@v7iReN2(~kX)L)lf)=bnhf zt_1Y~5nUc#L9%#snb0v?TUyWCsg*hAO33^A*6Th^X&xW@=112>H$_vJxhi34_HGcA zhR}}Z&W+KV6zM!)C`Vx(t_Ai8^=~t%2;y-T8FM&$t$a;%H6(M9yV?mK5_q0HjUGqW{ODH{4zATcSPW z73CJRDrMh==*8$I!rnxAgQ!?wC*pq%^axvbnu*IK-xa(Xy-|K0^ttGj=~%$!H-sNqTX%8{EbAOC8PI&sTR11 z*daEHRhbd;T{1USlBA*)J>HXouNqiKvK8~qd=gv{9BQp{QN>1+RZD;Ml0xFz`cTPPEWJmNWN_xvj6?26SZMW2@_5ZRCAP3$1U2m%lC^V8MGvOqx1lwe zc05KL_shP_Z^RO-#ec!E7#54jDkNHuQ_kU2SZp`VGWT|oGdzos3#7OAj`<|n1>{Wp zF16P3G=ZK0t_k^CAY#5Cwl;Xd-orB&ntN!ihu!2_YVPlz9UGyG%qZAg^eiM_nm_c9 z+AD>`NYb5dGinpjOR3D`hWKA$#AQO#UhGq&gS&Nez5x+mqO&nb`n?WSWGSeAc3CnH6%U(2W-J@j_(D{YJ9{ z&lLo|t_AERMP9M9%QdH=e6Uz7_7;uz7kLPPy8!L72JIO{kFXkwEHodORYwJ+VX5g# z`EWkFUDuZ`-iXjgQ9F^VBYe%Ui@iWwlXX49vo*}h%2-@_8yj3j^m3Fdq!ivg)_iyafQ@*2eufTu#!N*~&o{O?(|YIN7CQ)v+4c z>XodOcJh|^mG5*c?&xjjQm2CIEuzLq+DT^7E%>@E`cWIp#GXTcJNp9Vli1B{Q_EAl zC*ZoAuTuY5+e`9rH@gKM_oIi}F;!kgH0~tw=~e6<;m(?0$KDd9Y2FZJ6;}9fP|xx5 z_py7T{STzQ4{nX{_d@Qg!>Gp@kqr-k86ft6rtwc?_Zej__7Iwn#5bYeJAZ)u$`Y@& zU;k)E7@M;>>T$skjk5*G^2k<1x7JDUR0!M|>u7Tyds|TL;%=wG{U|#sdn-K9Jpk{P zIZ5;NQhxe(*g9YopV9NU|8cgx^!3Vq(9NSuIA~yMgN=+vrVHSgx2z@O1ej`#$9Jee&^&W}+XV zCL&UO;%nV~<1d}}1O4Lz;^o0=F*8F6(HA3|;TsgUc^|}*i0LG>H%jKl5MT~Ck4YXn zNIrreh%RrqoFQh(=4vmca1!e@<3>KE!oLm&U(D?XRNY9%` z$0x?8gQ^id#iz0CDO#_G5%HPAvZ=_M8F80yP+%{j_0Ba|WZ_lhT1V=|l=x(UpNe`C z(X&uaAZi@SY4I^AZLoMBIN^9LS0+C15$y~Nfp3<*;5p+R^Tp2@FKL9^Ty5obQXAbI zYN?++T9gIz;yz0$X*7&>EClyT#Auvl9ko5ya*^u!@g=r#HoKQ2B6EQ|A$Bc1n}{z0 zf8N^Omdft4j1#*){(?fjKiJ)vgh z)Qfbvpy_>(l?nW|ax+o=MGURrEI60q%_I0+B0KL-Lb4jC zb}SQhp6laUNBmZq!uM83&hMU_U((GMFwq)?}%@u_B)5>T6Pn4 zG~PoO53NNeW_baviED)F61qwC6Pl5}t{cSR8Yt>~Pp=elCy1+#A4h$wNOOs}v++}? zPvg8Sw99HWKNsQy?58{?_c=&UlID!iV|52D$Oi4W7{4u~PpMCu>~Z`K$r#F%w0R^c z4f7D(CB%J+wy%=rE|p1%;_)}Wr;LS4i9NN7R~(==w4)B#@~{s9dfm6J=P!Nt*;4@mo)+ItoN0W zypfvcvQ-WDEdEmR+B<*>$E)mO%NWs%tWKWSe~hch@ef7vCW(UWY$5-IT6>pJL9W&9 zfohG@E~TxcT}z^xNgnq<@fL~ZI$rNdquWB)QeK}mNr%KIiccH7u}I@zV{~uC2v=bj z>-Yt48oq0yQv-w-?-0{;+VMd4JI{9$n(h*z$$Mz`@rg290($!KL zSE6rX0HJSK56E>lKzQztdLYpk;HekpW)N`)EkgtXfAat}RB*#k4^J#|Yo~tPMZ)Tk>tZ-!oRqHPo zEB&N*ZbHGlzQr7WqN~(Zp_wNw3SRQ{g2a5%EE4*KUx6#O(zwzhWGUjX8EqL7Mv^xd z^K2?Y;X0UDQcqIf^AfrS_3@9@Wyo>gyX+g!5NE0ITHodb#=1ew6t1Ue;Sgm^2tM9t zUwX?D1MSlgRkN;bH)xCGKV}bOmor#BQlhm{PS>s$Ru@Sf32S08Wyc4^_mJ2RZhLK{ z^`Z18nvunN>ib^1J>k^(n-zF1u1t0P57PWZ2^B+mQI2}GKNmr0~?Z10NoKL9Nl z{Ga8hN~x9RmVU17)Pp*I1!@oEx$IGK$Iu!0of5eP)UHI6oQ8b>jn{ibch6Dqps$+} zwkPH54C>bb@^)DGJWBn+Ge1$|ekE}vaZqTl1&PAB?$TT=h@J>G%%n=O~^$DI2U zLq!w{`tivBedG<#FcNm>9`KLB-%a?elMsm;iHC`eWdeKB!4F+|)+ z75v~YBZ*eI`><>a?fljN5Y z9-5`A0(H9{dP?YkBaXJJ>&dk~Y@pnHme@-xUz6affwofuyD>NvV|z*5Q@V40F1^%9 zDos?a;3owcQ5~sQD(H4JiWi_ViIX&Hd?Ez5%<-9!TB{c15KlZwJe3knitB^>PJ?|X zuhGi4gw9g=5oH@{vsv<;&ddA6BXD7BU$K@B(q0?X%~?0Bq}RYSO`6S18*MF&I32cp zlv$kbK_YNP>;|}EC33npyXw3&Nq&IlmCzogwNf{NV#+M$p;J}4x{aZyKAx^Wm}&jO&vy~2I7rz zT0Mx$p;Y4UNJ)#mHQDag#TcJmg9CsVl6-?`4+hl^XUCj5T|&nQaN02@sg`kGjKVEY9#Lc6QGcXKiBD?$MD@i;x=D=R z8N!1K3C#oSxvTLuNljjbat%&AcW@YK2f>vquoiEa zoatWSSdX_%YP$TfF?q#*lKQYIIZM}<_3&3XHYXY4V8<#xfxO#+bDOz4u2T79D)=>` zm4XcSahT~X$pU{=>>$f+TOqq<-;TFi7IZr#Rgh@)P9fbTYE4!+2BIgslLc;%q*hQ4 zox&*k=k^Kd8_Jfw5;H*L@Gk5A7cc&(E+=m!D_vNcXn#Jy5oAXj@DDdxL zYt}bbWLzd$@c0DObIBE?jn}mT_bi#VO)$Rz=W;zw-a~K4=UyjQ$X)p*-qKp|!0^^q zjowG=@8-%_r$4 zE2*5M@~D0yXPQ)FANMy!iM`s=40Us&HNFL?R(KO^OCg!&Z;Q9WY8w4931euFH^p`+ z(saZdV>^)~jM#Mr)rGj@7|%59r~R>ucB|e6N;~>uEMaqZAf`|xtNlF)y(T-{+buZE zK0x5cdA8x2w86v8JxQOp*2-Ss`;)9M-b{NW*3!}&+?{gl=ae;PMDE~uRB!;^TRY!V zNj}#?-T^!Qpz3wO3AVwo8CZS8Hw5)ioRf2R;Q^n9oTI=EuYTekhPv)(Nh^A+kd45b zZ*f||jVF47PBIDfL>)g?R#oK&wg%q+l>V%+|p80Sk!rGH$y@jR^>NeE3zB+6_ zyk%UoxNW^^KJIPpG!=~(f4R`CbaQgXJdAoVkgPJ~uh8NM^mz#6Lu<^C4{;3wT}nAT zn9$f2b)E`V_yi>LqD{ROJB;k!!^iNNle%4FJ>^w1{|LMfeFn5AXr>BY zWMgZd%ho0c^thU9=83lPH6!gF%#z}tNb>2_#$AJL#Qsh< zO6{%eljPmQ3}InGmMx{R&a8Pu^(<(z7~y&3#3R=mku9?uX~E#JBF=O1ZudEO!@GWz zO?A0jkT0ldDWqlAsli1${9-|Oly`?lAqiLvHKm}J;N9`)XH6BNTL!8erz!Wk!h+h2 zQ#-79gFOEKC1^+aEPc`Gz`NvUVf?$iu9_v3rL8?>sNK-__jrVrX1NmM9u!{S*(x*c z6vfF4%rcw-oaMmy@!ok2kLRbTFX>{7=TLY{JytEPqY6+9Wu)i2Ovuxyu;g+zX?}u` zM(|#HjsDcgy42*AH63AJ=?la69qY=PKpBb;xGEO&{PG+XUh4StQ3 ztp~LM=h~WeB&(`fC3Oi&4MgMg%GuwgKf^#P!ccAq8Rv|n4IX2bouGt2DYt6=* z^4w-nr)2~Reg@DA%!$>rj8^Oc@`TT5Me7%TMRV;X%|*x$)?7sd=D~VT%|4Ru7ghz& z`uY&*j)}QE;XPh+j3kGJO;7n$40lWzJ;=EUc zykB!d@DFMp6=@z9aVHShWRXPcQIhtX3)VKaYMpKyu;plb6KQLp*-Cqz4?Q30?oR!m zAlAeo>`rP81143IKpZYR)8vVxRBE0Q{iLS0CPP#{3eN=nyk-wtc>(SfNnT3K6|sNx z7HjB@&_uBYUJLpy>g|4;dlc5hJ85}}dRmA!o}iQFBg#)WvpAO^Uvf2*s09nwdRv@L zQs_fqwEZ)oaj%e4F!ug5(r$=`b{L(_fV%1!V_)hpTX*=Ig42#s?xBHqMe9xIyDp{Z7VFUI5$ar80;E4s%F>j|-dr++{HRuKQi9&RBNKIZidg$c61l?UH zn_}DQ?vrxR+>A`w(T}02{yM$pXK?DH<9>O+)Ued3)HwSMMDvDc05G=P2$X$O0}-7; zsr}_=D8~vdPptY8rwCB}&Ckffi)a2AGogSZai#W|DLj61Am;uey)a=w0 zLJXHziWb!Rc;ct07L#^9%0)OAq)JosP!CC6rTI7uUkeE_hf3t5dn)Fro%H6!xLde- zx=o~Cnku8(m|7z6T9342Zpr|OC1oag1@)nwE`RcQqLR*g{onHIN8lVXGlsau8;xB8QWs`Ae=JKaPpyDt zWvY_Ut5d6}uA;JlT9aB^#BWHgORY~mwojv3pNUnr71`yYOqu}diEm@-3BJ2pd~8Z> zftMx0&8cmvt)Ql1t!zjAnX){O-Jxq|H_^LNJE?Y~&wEl`MV>Wv55X>!KMth!5@MgQ zJ&5{HYQNyxhWGcUvXL6fk-|cyY0=u<UjscDeJmWafw?QL z{{`7w>cz{{o78hquTm{3p4Tb!a^){bTfpY)_mF)c`EHC#JNAm~Y^e;8y)aY%_gPQ5 zMus*7-leY5zMRK5R!*~itk+gn$A8k%InXUJs)4dCJinKtY^D@@Zz}oEv?n&_A% zqmKI~Wt`Fl=<#GbL77PPB$Sht{nje?vG$qZ$xeWr2_Gj1ZkntV2>({8`-plz1YLXJh#%#j$4`>5-s#y33XDRY$tWHTS- zLZTLFASi=;GEnYbf9 ziRjpLnl_d#bho8ptcpXKhzJZv%Qq0|R&wWCV7rGEXop=Ia{aMf>?eAeM!U@(B^|s^ zQ5%l79wbr1B-(|7dHTx-O$ESFK$RAo$4W@7;DXnC zklw^ucU+hIS|>rRqdiqa+@iHSihM9wJukAX^KnPYgXnEoWZHXY3i7n#r94(ZKOx*A zjO-~@IV#76rx*1w zdGrO0bXnko@*djP${UnD<<9jE+zV-SUCfSV_g48VvnTIoS-q8elp^>^X~HmHa=m<3 zZa7annn8xOB<@wP(;<4zAq)F+N+fqfwwU*fCmT{SDYVS%^+$nkM?MOOeBGr;))ia} zAqh|qIUrtg{ZI`ECimB}UkmwQ`Jbb+)}m{67Rd&bXNO zx_Sjqpbr)JcvcD(mEwOzhrJ?$>zD4|UZ$H7G_jN4NXz0S>MK%v$Lz$1} zVu-*s74i3#76t?_zY5CXfNlsK~_%k46=DCsJ4MJ;!P-*FblI2XQdMNLCh#9&Btu? z%m;pr+?5KRJp$#`p$j_ve+WrkLgyB>vk|O<>tLTy2%50eCP1}?Jc2qdrMO-)KXJ>b zyod2bK`j@En5ea0RDj-!z6W(O#DSu=sz_GobH4^xpMs{Yt|ZHq4eU1v$!bw=Dncv` zZUw)FWNU?HBkC<|v*4;kjc;3l+Aq1fmJ8I5FX(VzM%wKHvxn^k)fV|PlvdU5BHI<< zmg{z_U2GrQ3E2UGI>ZhZ;R`)D!Va^!LUW=K#8D|bM$~bXC#B4WHGUf0DV&|1C z_5g9X$Zkk9c3isme1LuMo|N7a)OPnxP8*|-z7C)!BPMl6 zN78A0XC8#FPJAT1b|Gn3D!cK^MHbyj+5=@z-izouZ;eq?imdTW0XBVjU!CPkicD)) zKb@@DQ-7fuP!DkkBmLwVD5bN&&qV)+K(Yc?%E72t=DJWk2Jv_94iu50kPgFnTdYev z^uxjDkM?wJcqpTbypnQol*{G0BiH&!X*UMcSjpvm9k3s9kB027b0Fnr zUOI|UHe4;IVdN9}Z0etbuF!Ur6G9XCc-{(aPOuIO^|joSt>HH`s1M_G?Mwzeg-=3x z3w{REdU85ii7V=K$PZyGLuv2m3GFOlTMP6-*EDdm`4ig=K9jG`O%=MN>ok2P=>)6$ zMS1(2{0>7@s&d=N=RDZVA-nNne>&{CVwnrcJc{8N>JfS-?iA1!$gSK2 z#k$`G!J{KF_x436z_wdQlYb?As^1g&ki<1D0`33HFPruscbJGp2zUF3rt9%SqTQn=dPk4r8yhxK4oXTrK1u>TAsBfah z7ZP_HJKR(LOz>^Q6=NsH)~2WrFA4ER+7dr)WSG%EpD?Z`&1l>dJMHPONi*8b|i z2Ku}m{ti^68LSQfKLqCu$56GiwHsz~8?D+6x~o>+c9^hyPHTLicX*K}>?`&7LW}T7 znL1J(q0Y69mZ)i1FJlFF&prm!RH?(?iPVW|%0Es>CZL|8PExxd|0e5DxECXCuJ4x2 zpYDjdc1)MJroow@XAnO}9YV<2;Ov%J>U@&UqjIj=)w_VGyoY?bP)ZgNWy8+f!nRl~ zRSi<3$A7EnF)kz8TkkN5R+or65su5JR7+J?s!VO}Y3CX&?j&(nMY!w!Yo0h=Gulwr zx5a)F3e0M-b1bBJe@uJU4c!&MELtm!&Pu#ReMI}#Tdz$GqQ!2=4ZAv3%z%?HM*?xx zt$K()O>IAN2eB`#2G*s{kh^0Th=96Mt@1ARctL;mO!NBGkh&OsEc2Zs%OkF!y1~7| z?N_VHn~Hs=f;<=c^_X^?9?r2evZxw?_E~w1Fr6@-RYcwOT1h_#Uf-h!m1?ixAdKXu z|FJotE>oAQE7ZN-W}fQu)xcM&%WF0N`{8>Hc&~XpsEvr!T;$Tu+*-9gtqDZbebcdy zTG&YC66bogox3g2HMrkB8{7=(OW#&?i@HfQ)m+00z*8#7wyWC+ukkxT^_JPJNg6*M zQ=1*JW9)>*ZFx1=1#Y+SwukB_qIY$E()FGR;In|ZpXe*1T8AxA2guhh+8w&v_JZ3d zTJgy|nNA}rSYTJeI1b7g#+sBpIVf!Fu*K9N((e&>5Qo2j-mAOIXiEN%0)6BQ7R4=T z+*R)}wWsruW1i1Vd4^d+JZ;F4Hs{OI!7Wmuhir@(6)4;jl9W^QE?5?^$*9=kJmwTXwEaO}Ua`%9} zkMoh|aPCNMMj$J(nCsjj-E07(K9((^zeHE-Bp9c_AE)}EcNjA0SdI~=!>~aI>czK*BXl0NX*JU%GbdS{;t*mdGH$E zpQ^7=9)-;=&l~lnXj}7IcU;hUZ%_GCr_-npuzKI9WihV6y;HBjW2e9^ls9l*!Fd&D z-EmWJ5z4>I;6ADkX%CoAG18DD{T{KBuq#?eX0z(u+yaWq1G0W3e6(+{Ha@9#nfv)R z9j+$nW;DYObN6BQ$$2N&G~FDM+qtWV1c+%>$CcvS{X$9SWB|fytGKSl62lH z?*Bwo22uP~%*70vkAnUtM$kT;6g?g0X)QdoY2Ybu(E*v(4!Xy}0&5qNx}&Y8)2-P$ zO`ZzZ+dVr2f6yMLIXxqzS!Y#E?evpY9n+oCM}h0mpnqK&NU&RxtOh>%*3uJQISLX9Zm z@?MAOWK6U;JUtZB_lV#~ofh}1#EnUF!l@1Vcil2N{ZZVD=e+bvfT~ll%dTz>5gI*&jsq3e_pzsnBo4~9f~ELyJ49R z%>tYY(~HPcp&yIE-LlNEEVS>y{$xm(O07{+^W_@Vtd>H)ByB=jCJ`1voh;W7<=|{- ztJG>TN7|ltLb5^RiA!qTX)ncb}QKzv2*`oX2dUK~gVNjIiwUbUW$6Y*YA zeil>+D7*Bh=_BcIdJ()-q>mJ>XHBOa$NjN%A{|dJBmYgzvt3c=ZOd}v5Mj*3N{q0ZVcyRN*LtJrN?f5flh1i{t;+k;$`96UkhF#_>28AmG^k9sw>ag#IMcEk9;?!; z(k3A8+pC>VD2JQT+};+x)}}XLhg&1s#?>UZA-yiW9{fg}o6@zx&FL+mPP_JsdyJTi zQLgn3J~8)p-i7b&&~Hn79XrxnL7_)tzuuExPk#lufzKX6*Dlg&dW<#rLhc^z(4T78 z4!OtgL|g}p{Cg6#qMv(VIYQz;3FJOV_ov6Z4xoNYquHH4ls*FPFwTQGaaE-97?l;6 zx1{i^>5h|h7tQnuqBSX=ih*t$dM4LAje#7wPBHrn#88!|44<{~pgW zthL4VGK_7$h}tW{zDy4da?2IpJ&`X_*9GLpJQ+)^wYP+PBYo$4FfOo8=9ng#Of9}k zzb4!iza{v-o&{E*lzd93-SaH-Egz*swQNDFZ*ysi#31thNUXYii|>#t_e9UK!Y-Ho zoNkiAbEZsFl>Z$^5VPJ~w$%buOUbp8RQ;Z`$+U*9?N{pS<6ryE(f>}jq1oz6Iat87 zgO~O=*M<8fu2KekD#xnFsXu&<&VkSJ&Zq_hhTr`lzD3I41{)c z5jCDXWV(ayndwTB9#nqJ-4&VI3w&>qC1lJ$+pv+Lg4a^MA3?X_L z$|FT1ZRqn`D|zJ@o*9uT6<0Sr^+d+i9V4li1I73!`9@_%i!tC+sV7sk8t^~dQWv8+ zI_I8keu~jOt2aWgXJY0#$)1_DwkD9>IF#dYjwNn3m32MIQ5$34XD6mVYUW&3jQzm5Qj5T8sw7zHmJ#KI9*RK}^qHw{Ex z+}g56rNx-#z^stCl|)r$R-s;vvnsPDvo^C%=+|d9fa;OhDEK;0?`yitJa1yzV&9zE zlvyeEp8{%YW?NsF#CcYwKp^JeC1 z<~Hi<83SeNctr44=33@T<}!K7Tiw&q4~c$|xv!IHs4@P#nOEhHAWar&oR;&MUS==;OGSIJetgdf^&)e?`!w@JSmJYxIgj~3lJ`=M|Nju0w?g)Y>Q^Wu z$eNd#EsiRI(6>@Y8)=u!WjbK;;9k>cI)i&G z^13_d9<|+sUbF66+Z$XLoIQ2Yyx(3z(pRVHqoWJ0=j;AOngQSjl4K0+f_Y58+Kl@N zMSoBcy4cf~xOSfh*A5}uq2Hv3FM0pg>4s5nx7mh^UXMV%5j*P0qEU<@ZglM!DIH%s zwzfYaI1Z9$x=$Pvz~9yJ6KmsiCpW2f3fWGT9`s|HTx++V4;TaQBDnuaMC8u4)~rY2 z?>4oQtutz8*3PPJ|JjfEnk~FtOWuV|wR=wOyxO^t&6lk#AZnrHHGhjFw-{7utpTMG zr>S;H?NX_$Yq_kpTqkWV_lx^j2Ns>C&SHYw+Nj*tsI*|$ggzVFzXIc^?M1&)afd&l z&v8!RT#aHqwcc7^?en0UwEo%v)ghEY9lk=)k^jrye?VDLYzy3Y4=5@sjG&;XAfTYA zprD|rr^p zRqd`_zkTLR&Fb#G@2~oY*1zlW?@HnyZ2NM|+AOl`?hpHmj_d!@TE(hrRkNyFHLRLe zEvvRw$Es`9v+7$7tcF%2tFhI@YHBsJnp?kGEv%MSE338D#%gP|v)Wr7td3SEtFzU` z>S}efx?4T0o>nibx7Ek$YxT4GTLY|t)*x%JHN+Zf4YP(@Bdn3uC~LGe#u{slv&LH! ztcliSE6qx`rdU(0Y1VXWhBecgWzDwcSaYp;)_iM$wa{8*Ew+|eORZ(ra%+XP(pqJ$ zw$@l{t##IVYlF4X+GK6Ewpd%OZPs>chqcq%W$m{1SP2WXAPcq-3$-u{w+M^0D2uij zi?uk5w**VHBulmwOSLphw+t(3nbuxwpS9mQU>&p$S%>zH-iI$@o(PFbg| zGuBz_oORy1U|qB>S(mLV)>Z48b=|sQ-L!65x2-$YUF)88-+Ev@v>sWHttXac*_LCu zmS_1^V1-s>#nw|R!+K^_v8&qE?CN$6yQW>su5H(`>)Q3~`gQ}mq20)CY&Wr++Rg0d z_OEseyQSUAZf&=*+uH5y_I3xmqut5wY8yR&$MURv+X(d zTzj59-(FxZv=`Zn?Ire7dzro5USY4aSJ|uWHTGJ2oxR@PU~jZH*_-Vx_EvkFz1`kn z@3eQ>yX`%8!Uk=~hHb<~ZOq1P!X|CXrftS%ZO-Ox!4_@FmTkpWZOztg!%o_!z1QAn z@3#-w2kk@lVf%=E)c(yrW*@gt*eC5%_G$Z!ebzo_pSLgA7wt>-W&4VK)xKt5w{O@t z?OXP3`;L9rzGvUJAJ`A=NA_d;iEY`o?bxpE*}fgvp&i+={nXB|pV?KMs!lbhx>Lic z>C|#+J9V78PCci-)4*xyG;$g{O`N7qGpD)ptJA`1>9lfMJ8hh{PCKW))4}QJbaFa7 zU7W5?H>bPP!|Cbta(X*`oW4#!r@u468R!gh20KHXq0TU8xHG~T>5OtlJ7b)&&Nyeh zGr^hYOm@Vga3{Kx-847do#IY)r@7PJ8SYGXmOI;> z#lRxyBpk%?k0D$yT#q=ZgaQ0 zJKUY_E_b)P$4$7P3%Rh1xTuS{xJ$UCOS!bmxU9>$yeqh(E4i|(xT>qUx@)*e*L3%~ z``rER0r#ML$UW>HagVycxyRh&?g{s#d&)iSo^j8*=iKw|1^1$R$-V4eaj&}9-0SWQ z_ojQxz3tv{@4ENg`|bnxq5H^v>^^ZV*LEG(bv@U212=RdH+G-88SXQ;idWUE=2iD< zcs0FRUTv?ASJ$iO)%O~B4ZTKQW3P$V)NAH7_kQ(ScrCqFUTd$7*Vb$2wf8!B9lcIo zXRnLb)$8VU_j-6ey*w|N26zL#LEd0*h&R+5<_-5ocq6@0-e_-(H`W{H zjrS&a6TQh^nwRcP@uqsyyy@NyZ>BfPo9)f<=6dtI`Q8F=p|{9e>@D$@dds}!-U@G} zx5``Xt?|}+>%8^e25+Oc$=mF0@wR%~yzSl&Z>P7*+wJY~5+3M59_%3=>R}%45gzGL z9_=w6>v10M37+Ulp6n@}>S>D}^fdw0CM-aYTW_rQDTJ@OuVPdv-B zJ;!rB&-1;&3%$sTy{BG=_spx}SM{s;)%_ZNO~003+ppu-_3Qcd{RVzRzmebAZ{j!g zoB7TCU;P$-OTU%h+Hd2x_1pRF{SJOdzmwnD@8Wm$yZPPy9)3^1m*3m(Cf_K z`*Zxc{ycxazrbJUFY*`rOZ=t&GJmlz7{I&i%f4#rK-{^1hH~U-st^PKD zyT8NV>F@G)`+NL^5BiV~`-qSFn2-B}Px_Qk`;5=}oX`7$FZz-%`--pnny>qYpY%&%f_K@E`h*{Kx(i-|}tW@m=5ZeLwI+Kk{S$sh{CL^Q#0^gK9zb zphi$Ls1?)>>I8LzdO`i5LC`R06f_Q+1WkixLG$3(pheI!Xce>$+5~Nbc0v1~L(nnk z6m$-{1YLt}LHD3X&@<>2^bYz2eS>~M|6o8cFc=gJ4u%9ngJHq&U_>x77!`~T#sp)7 zal!atLNGCy9Ha&5!IWTXFfEuK%m`)%vx3>doM3J+FPI-J2o?s5g2lm-U}>-{SRSkh zRtBqr)xnxzZLls_A8ZIV2AhJ-!Iofaur1gg>2ZDpaq2O?EBsd!U790zX2PcA) z!KvVMa3(k#oD0qe7lMnyrQmXKCAb<~3$6z@f}6pu;C65)xEtIH?gtNohry%ZaquLt z0y}U5H}C>K2!b$(f;e~@WCYKGDq+>IT39`-5!MWAg|)*vVcoD^SU+qKHVhkujl(8k z)390CJp46m5w;9lg{{LjVcW1>*gotKb__d(ox?6+*RWgIJ?s(o410yW!#-i(uwU3e z91so+2Ze*fA>q()SU5Z!5snN;g`>kU;n;9oI6j;ZP7Ei9X<>ReC7c>g3#W%O!kOW$ zaCSH+oEy#y=Z6czh2f%bakwO08ZHZ$hbzLB;i_Z<3Xo!V)NQ7iag>=Y-Y{-RtD1>4tg>tBbYN&;JXoSho z4EKin!u{ca@L+f-JRBYgkA}a6$HL>`iST52Dm)#Y3D1V-!t>#U@M3r=yc}K$uZGvc z>*0;?W_T;S9o`A=hWEnz;e+sD_$YiFJ_)VR4xP{qz0ePXFbtzG4xfe@;j^$xR5hv= zRgY>!HKSTl?Wj&vH>wxaj~YY`qefBVs7cf`Y8Ew*evMj0Eu&UZ>!?lCHfk5Ok2*vh zqfSxhs7ur}>K1j6dPF^=UQzF;Pt-T+7xj+@L<6Hi(coxEG&C9(4Ua}dBcoB#=x9td zHX0X=k0wMDqsdWPlpalqrbg4E>Cud6W;83B9nFd6M)RWi(Sm4Uv?y8}Es2&!%cAAc zifCoDDq0<_iPlEzqV>^+Xk)Y~+8k|(wnp2c?a_{CXS6HY9qow{5g0)c93c@JVG$k? z5gAbt9WfCbaS)^7#)fZM@OQg(QnbQ=y-G@ zIvJgcPDf{=v(dTed~_kY7+s1kM^~b&(Y5G$bR)VM-HL8UccQz|z36`QAbJ=*iXKN# zA}g{ZCvqb%@}nRMqbQ1_r%^`qEUFS$jjP4g;~H_zxK>;{t`pad>&5ls264l}vw(J^C0#)OQC8Iv>8 zGp1+E%2=GSE@MN+#*AGVXa=4^WY8HWGR|k*&j>QYj5wq2U+xFgO>6aZY1+cHC27mj zT0ZTQ);Dc=+PJjpY2(vsq;*VdoZck8X?nBt=IOttw@7c9-YUIydabnDX;aeD(x#@> zNn4TDIlW7I*Ys}b-P3!d_e}4V-aEZddf)VZ>HX6Oqz_CVls-6pNczz9Vd=xuN2HHT zAC*2jeN6g*v`%RQ(;BBWO>3BzmY$wIC4Fl8wDjreGty_K&q|-2J|}%{dS>{b^abe) z(-);LPG6F~G<{k6^7IwyE7Mn{uTCG7)-`Q#TIaNvR5k&dfi1vRU>mR<*a7SWb^*JA zJwO5g0SJHr1V8}{zySgv0Scf224DdW-~j;;0SS-+1yBJE&;bKT0w%B**az$f4gd#% zL%?C+2yhhm4LAlI2TlMdfm6U~;0$mUI0u{uE&vySOTcB|%D*4hfmA$m zOtFSQ>d)nX)M-V5)J2)H6{-QL1xo;_Xgwg6tN^6u{02xpkvV^l%=uo<)#>HoZ>dXW zdFZvgsVm#&P3_+x&tLi%HqV#3^4HAVA~Uzl_m{T6kN-=_fBHvTN@hb!=HX?T<1d{r zfKO6VQkqQ9pZaNLe%aLdFYSLlypvhHoNw;GneQKl{#W&XIiG?T{zI?-63(t=6UZiz zO(2^!Yy#N?vI%4p$R?0Y zAe%rofouZV1hNTa6UZizO(2^!Yy#N?vI%4p$R?0YAe+EH6JR>#O`Y5!Z)%&)YJ-@@6~7K$v?iH+B)-{_?Pd~e^Trp z-lzZM@9FcG>F+21Rn|$(nx_7d{??x9QXw;CzQ+FF(q9K;I!ee)IsQd@+5g8x|8Dw} z)Xblh%r(8d{L5O7mp?gDGjrxKM~;7>$uUwJjxYp=hN z`^~rB&XYIwoqYMmz>|{A! z03{hgF`OVNnt6FHO7hif*Kgdsb^FfUd-oqaeDwIqZ?@xlesCs=pJqJ!{rQ!D?zjHh zAO5ZX1@M1ef7NQ$Yt*b&yH4GD^&2#7)VN90X3c+X(Xv(RHf{g9{(s;9zgqvsO`ErD z-IlrjUAy-rKnO-QVw;Jr+i2$Hxd_3Es_913+`Di8frEz*A36HlvEwIBo;rQz?78z7 zE?&BP<)8blzxIcJ>;M15`fJx|(CFooGuPX>OZUu=!N8#-#%8W<(qHXb_22ftwD|vo z|3$SI9bR-C^y0;f!9#{kevy{`N5kLF`@f{$sc!vxjhi-W(xz3z7hSu({4~B8FlyxJ zF%yTs$lBlfzxBWLN|6J|3A_Tl3giM_16~K-0CEFw0&f9t19^bFna(iY0rCO)fp>xT zfC4~4;C60pA1VfeOG6z>h#h;3wc`;1{40P#LHKR0XO5)qxs7O`sM~8>j=+1?mCy zfd)WBpb^j*XaY0^ngPv$Ux5}tOQ03d8fXKw1=<1afet{&OfMasfi6H-pc~K~=mGQu zdI7zGK0sffAJ88d01N~M0fT`dz))ZqFdP^Gj08pjqk%ENSYRA59+&`3{O2#<{~yjb z0M{JfLBv4eY09{f# zrSwP{n{p|~#FX(VzoxwO=#nGF0Der#m9iIjD`h|Me#$|hP|8b>E_pJ)&#I@?PI>9k zrAf+5k1nlK2Bw?`2B*CA=+ZUi3eY0u8gL!RnQ{}TnDSc69pLShd%y=N4}cF-9s!Sm zyeaRb)JUn5;sPGfG$jB+piRo4l&8RulxM*2K(~~0IsT^);Q#pj_wRqd|2N-%|0D5@ znIpDlhHu#UawM4PFDA1fGBfk?{AE(LOm8@uu5k8ey1_Yo~}pN2s2}(0MCBUj1F~U6KZD0M9Pfoc=za&->jFl%y>`t z4?X;A?cW@enE|i1k(mLm@MCsnXeZ}y!%q2`kzlT7#&C+ZQ<-sYxLxe!=X?0SU*lZ- zGGgIhQbK@bNXo3ze{1-o*!&{X1CW?``a7`mVE)t`DHBt69?GA(H^-$MpCA6Kub7u( z|LRBPuToWC$&AI2`S%~m%zyV!voV=Jb*Gt`_h#mO|0TC`fBw`eFR$|t{$eu4Gylr| z)j!QkA2l!2C%`MO)L{#!4$r*KUt6+||F0zQKW?=Cww?QX@y9lA>fc)akNdp8U-v&$ z{$aEK>pth-@8kYA-*f-tKJUNnbN*?c_s{#7f8OW(e{P?bz5Xow{Qs-{b0l&mUQOgm zyqS0_@pd9lB5&gTMBzk{MA1aCMDfIDi4uvDiO&;XBuXW|Oq5QPO_WP~m-yp%C$sW> zqI{x4qGIBw#4m|TiOPwpiE4@Ji5iKTiCT%;i8_h8iF%0!iAIUWi6)7riDrrBi56Mp zTP9j1+9cX0+9f(9Iwm?LIw!g$x+c0Mx+i)hdM0`$dMElM`X>4%`X>e?1||k2h9-t3 zMkGci#w5li#wR8uCMG5&(i1ZhGZXU?^AigaixP_yOA^Zx%M&XSD-){{s}pMy>l2$3 zTM}Cn+Y;LoI}(}yE+n7?n!plxf=G}FDnTc>gp`mIN`m-X97r5Y98Mfb z98LU|IF>k`IFUG+IGs3~IF~q|xRAJ*xRkh@xRSV@xRJP(xShC{c#wFMc${z&ULs6H zi8%2zk&$?wc#%i}bAUO)SHai7*TFZy+~AvF9xxTm2jE>4g2lk%;HThcU%k4+MsO3j8QcPH1Gj@az@6YOa5uOIOn@K= zfiQ@GD2RbLNPr|rfegrk9LR$LD1s6wgBqxVNzerMg8RV(;6d;Zco;ka9tDqsC&5$T zY48kq7CZ-@2QPq^z{}tj@EUj>yaC<&H-Gs0j24R1_)(6^A~BK7&d?C85uuFQ8J;m(W+x*HCGw3{(~>2YnBf zhkk^9f_}~-{|i(Jsti?wYCyH2I#6AxKGYa$3N?e8LoJ|IP;00S)D~(7b%eS?-JtGJ zPpB8v7wQKMfCfT?pdrvuXc#mc8Uc-jMnPktiO?iyGL#0TLsOvX&?S_7?x)Vz3B_I%jAQ(a*6v7}JA|Mi?AR1yI7UCctk|7n+ARS6VCbSpY2knOrKnI~C&~fMl zbP_rRorcap=b;PGCFnAA1-c4dgRVn2pqtRGEFAuk>7QA@4c&q6LHD7D&|~NcWI;CM zKrZA%0TeuZM2>uu@3>Sevfs4Y$;Nn^2KZQSoOTZ=J&*3lNQt+2>X}Aph zEnE)%9xe}8fPa90ge$^7!Ij`Da1FR7TnnxZ*MsZB4d8}wBe*f#6mAALhku1zz%Aic zaBH{?+!k&JcZ55^o#8HUSGXJ86Yd4~hWo&M;eK#`cmO;Q9t01DhrmPOVeoKx1UwQR z1&@Zu!sFoa@C0}wJPA&N)8Q%bGxzfI%37VHkl?7=v+`fJvBwX_$j~ zScIi49R88%pIMh-71m%KHsB;|!Uy0(@KN|T_!xW~J^`PCPs3;6v+z0iJbVGZ1Yd@) zz*pgGS@gaR-+*tzx8U3G9r!-{0DcHRf*-?AUg}jEmj=X{7M&3l;M)Dwek#~@MNPgr!qySP7c^~-zDTI886h?|5pCCn% zVn}i1Q{*$G1X2?D0x5-jiF}28jg&^pAm1S0B4v?s$al#1NO`0J@&ocCQW5zH`5E~I zsf1KUsvuR7YDjgY7E&9ji_}LNB8`zINK>R4(h_Nnv_;w>?U9a1C!{md1?h@(L%Jh9 zke)~{q&LzB>5KG3`Xd97fyf|aFfs%giVQ=BBO{QJ$S7nqG6oroj6)_OlaMqd9hrhm zL#87$keSFVWHvGfnU5?)79&fLrN}a5IkEy-gRDc=BU_NISvdRwLiLj|51FL`aN0MKX|Q z$nVH=VzT?Sb}0d!fD2K4@RGAKD)sfDS|l zp@Y#O=umVRIvgE=jzmYHW6^Qw1au-g2~9(%pi|Ll=yY@jIvbsf&PNxZ3(-aBGITk* z0$qi!M%SS0&_CJK|8lzZ=mvBnx(VHkZb7%A+tBUk4s;i~8{LB@P!NSs7)4MN#ZVk2 zP!gq38fCKR&7vI2qXH_T5-Ot#s-haIqXwEpO>{5158aO*Ko6pa(Ie^J%OIe zB7Yh^gPujtq36*H=w0DXi$MxUTI>Yy&_p*|X*AsV4i z(P!v$^hKsy>=Y~qmJ`c`y@tJk<;LE|@?d$fRO}rrAC@00fW40u!al@4!al|dV@0r{ zSTU?P_9^xmRst)DeU5#BmBPNnzQVr7N@HcPZ?JE%vRFCnd#pTG0s8^_5vz#(g#Ch5 z!YX4`u&P)!tU6W$tBKXZYGZY!A|KGpzhh&93*V@aA|_!nreG?jVLE1DNzBCd zVh6B;*kSAlb`(2?oxo0Fr?Au58SFfE5xb0C!LDN0up8JN>>hR>voITTumF38{f<4y za^N}fSMglN8+RKG5A<~96lbOfKS9H;pzBvdm_;P#&z7k)Bug2HlYw>mXdVB-E8Q+3$#kb+x@g4Xsd^f%a z2eZgSIE*7WieosA6F7-eIE^zni*q=S3%H0&xQr{fifg!zoA_RQKYjo|j3331;m7e4 z_-XtsejdMwU&gQC*YNB34g3~<8^43!!|&q{@Q3&#{4xFnw{RPGa2NM*9}n;lkMJ0O zif7=zS zLE;0V5b+`LF;SQ(LKG#65ygp5iO+}b{C*o(~7orkTnW#ckC8`nCi5f3&SNz9QO`;Z2o2Wz7CF&9Ni3UVNq7l)UXht+A zS`aOXRzw@3Ezyo>PjnzU5}k;yM0cWR7QK5By@@_VU!or|fEY*&A_fyfh@r$VVmL8^ z7)gvGMiXO*vBWrHJTZZoNK7Kqi1aM-Q;4a=G-5h2gP29kCgu=xiFw3)Vga#`SVSx) zmJmycWyEq~1+kJ?MXV;)5NnC`#0Fv`v5DABY$3K0+ld{-E@C&ahX4tPfC+>^35>uA zf}jY7;0T@&2$7HonNSIh(1|2r5_^gL!~x0r8ly2#0V9kMN0r2#J_@N@Nhvh~J6l#EZ<(3@Ky| zGAH>8`6`)FwX*14o2*0D zCF_xm$i`$-vKiT&Y(cgpTam5FHe_3}9odoWN_Hc=lRe0uWG}Ke*@x_#MZO=|pBz9A zBnOd$$sy!Wau_+B96^pGN0Fn+G2~cs966qxKu#nlk(0?ZGM$`4P9>+2)5#g+OmY@E zo18<=CFhaz$pz#>auK5wkzkv%7Bex`n*Dp8fGDpXaf8daUDLDi&cQMIYMR6VLb)qrY9 zHKH0*O{k_+GpafDE7gK(NwuO{Q*EfWR6D9Y)q(0rb)q^`U8t^9H>wBKlj=qFq54w& zsQ%OdY9KX;8cYqLhEl_*;nWCfBsGc}O^u<(Qsb!c)C6iGHHn%`rBUhB6ly9pjhar) zpk`9DsM*vUYA!X8noljD7E+6-#ncjNDYcARPOYF;Qmd%d)Ea6%wSn41ZKk$R+oLSPEn_+Gt^n?9Ce<$KwYFRWzqXGb%nZ0U8Am3 zH>jJ`E$TLPhq_DMqwZ4=sE5=e>M`|%vMGmhDW3|ckcz3NS>!XQXVmZ1bLs_^gU(66 zLg%7iqhF`rpmWo2(r?jk(|PE;bSnK0osZ5>ze~SI7oZE$@6#X9h3F6IkLZu-!gLY( z6S^o}j4n=pN`FR|pi9!F=r8H7>C*JKbXmF_{T=;1U7oH$SEPTYf1xYUmFX&URk|8o zovumOqHEK2>3Vd1x*^?&ZcI0!o6^nb=5$NC72TR{L${^d(e3FDbVs@q-G%N-ccXjI zJ?UO_AG$BykM2(opa;@}=%Ms*dL%uH9!-y-$I|2IiS#5ojZUYh(9`JY^bC3?J&T@A z&!OkjOX#KaGI}+=hF(Xn|8KYW|6I%eb+!%kCVDfyh2BbUqqoyL=-o6#!!$ypG)Chz zMbk7(b2Lv2v`9;|Oe?gSMQ@GPX@gGECcTe7Kp&(J(TC|H^ildZ`WStjK0%+PPtm98 zGxS;d9DSa?KwqRUWs$#3U!kwk*XZl?4f-a1i@r_Yq3_c7==<~o`Z4{4wrPiUX`c@0 zkdEk>eoAN1&*>aYPUaQnRVEjcn|YIYo5{oEW!_=(G5MKynfI6iOhKj)^AS^+DZ+fh z6lIDr#hDUJN#+Zt6!RtXHB*`?!+gVh%amoxG3A+x%umeE%r8tOrZQ8Nsm4@iYBIH$ z+Dsj$E>n-G&op2fGL4wVOcSOV^DEPWY00!=S~G2!woE&wBh!iL!gOW2F+G@`OfRN4 z(}(HH^kW7xgPEbsFlIP2f*Hw-V#Y9InQ_bnW+F3*nardy>C6;n>K~7){3q=G_c^CA z)0r8}OlB4{o0-GRW#%&rn1#$DW-+sbS;{P9mNP4umCPz;HM53U%dBJ8GaIt#y^-0( zY-YAFTbXUlc4h~&i`mWWVG<0;Kn%>F494IL$xuw@gNY2s@QlESS>z=~W;DiNOlB{$ zkJ-;0U=A{enIp_m<`{FFIl-J_PBUkiv&=c>Jad7$$XsTwGS`_K%uVJNbDO!t+-Dvz zkC?~I6UJs7#$`OlX96Z$7{gJK6{=`;dE3;MEYHW43CR>ZG&DLS-vh~>d zY(usY+k|b#HfMijTd*zJR_xzx@SiN(vhCOoY)7^e+lB4Qc4ND{fOgyPe&^?qqkdyV*S~#KJ7fVl2** zEXC3+!?G;L@~p%vtj6lB!6sRg-OC~;1wdxyQp z-e(`MkJ!iT6V_sF)?r;XU^Ccf?C zD)$bTkIT=!%N5`Xa_@5=aD})JxsSMyxx!o#?h~#kSBxvpead~tmEcNppL1VurMNG- zueh(d(p(wt8}3`KELV>Ej{BY~&sE?mazAmuaFw{qTve_*SA(m`)#Cn>cK`d_wYhp+ z1FkXGgloz*<63g9xHeo{t{vBb>&SKDI&)pPu3R^+C)bzj$Mxq1a09tPS@a&t4dX^| zBe_xB7;Y>#jvLQS;3jgDxXD}^m(ES+W^%K*+1wm%9ygy`z%Aq!af`FaFX5JQ%edv- z3T`F0id)UC;ns5Nxb@ryZX>se+stj@wsPCJ?c5G-HwSVM2XiQga|B0n6i0I$CvXxc za|)+&8mDtf&gAxT`?&+$LGBQDm^;E9<$mLiamTq6+)3^fcbYrHo#!ra7r9H^W$p@h zmAl4W=WcK}xm(P-v$ams9^IiGwd=I`S-;3|f z_u>2U{rCa=Kz-fwekebTAI^{9NAjci(fk;GEI*DP&rjed@{{<Wt5PvNKX z)A;H941N|ro1eqawJ}@BDKSSPF(HVB)AEy6ZoyRb{x zE$k5z0w_QNEMNj9&;lc{0w?f-B*=m)Xo4;z1yk57>=X722ZV#dA>oK{TsR?|6iy3g zgmc1q;ev2UxGY=|t_s(L>%tA;rf^HRE!+|A3ipKj!UN%<@JM(pJP|Cx797D9LLnBO z3K_!hSvdT&UH+`|=faE3AfhQ^4l$>gOMG3-ExswfCB7}@5%Y@gi220);(KBNv7q?A z_<>kR{80Qz{P^WV$bY25ViEBZv8Y%~EG~W~mJmydpNn6JrNl4Auf@`08SxwOTd}NI zPW(>%UMw$G5PuMV%pzY={7L*-{6(xJRu-#@)x_#z4Y8(JORO!{6YGl&#YSRdv8mWh zY%cyPwh&v2t;DusJF&gkLF_1Y5<81s#I9mDv4_}G>?QUQ`-=U<{^9^}pg2ezEDjNe zio?X=;s|l1I7%EXjuFR-i#NoZ;w|yEct^Y|-WMN;55-5~WATY-XVKdcUC|c4b{Oe!Ijls=cfkV;8kN?%D|OQoeU(l^q#Qdy~-^qus*R9>ne{UH4) zRg`{`ewKcbDoK^4DpFOcnp9n?CDoSdO7*1rQbVb+)I@43HItf4Ev42{d#QueQR*ah zmAXkiq@GeQsgKl8>MsqD218NyEI*~>1Q_^YaoOE8gAYGI$NtdN7(lzP2bX&S3-IeZ1_oWBYBk8g9M6x7X zawJ#sBtMIMAcayS#nMwLLwY9tEiCk1JCKs1Kl|Pe9$R*{^B{e=nDpE66{{Kgt#5pX8tAU*t-1Wx1MMU9KtDl55L#<$7{`xq;kJZX`FB zo5{`PU*(o^E4j7YMs6#&liSN3Bjl0tD0#FzMjk7VlgG;w`L=vV zzAN98@5>M5hw>x&vHV1~WLtJ*SN3FI4&+ddi_E~;DM}6{r}B#O zs*+22O?h2;L&>eYsl27Ut>jViDyhmlNkJ8KewWhA2aoVajl2 zgfdbYrHod_WRV}Mj8n!d6O@U{BxSOarlc!Vl&Q)zWx6s$nW@ZDW-D`)xyn3czOq1B ztSnKMDa(}=$|_~GvPM~}tW(x28*{d8-4l0M0Bg#?bm~vb>p`27sDW{b)%6a9oaz(kSTvM(qHKUwNQB zQXVT$6icxcM{$)viIk^GhVo4LU3sp&P*T(!YEJc4HJAFD`i7cYeN%l)eOt|==2hQO z^QrmOchv%FLG^w01GSL)p;}ZerhcY=u707GQomG7tADbo|K)UL)pF{0>i22|wW9iy z`iojgt*lm6tEtu18fs0omReh_r#4a>t4-9VYBROD+EQ(mMejChTeY3qLG7q^Qah_% z)UIkbwWr!w?Wguv2dD$pLFy27s5(p?p^j8Xsbkc!>bNZOKb*ux>4P%Zc(?Y+tnTFZgr0es*nn+ zsEVn$N~oktskF+dtjejpDyWhwtBR_snyRZw)l~PY`_%*LLG`eDL_MnhrXEv|t0&Y` z>S^_ydS1PtUQ{osm(?rkHTAlBL%pTmR`00y)cfiK^`ZJmeXKrF9o18PHBdt}Qe*Y0 znxQ^dU#KZs4lSqls+LQ8O?zE?L(8qbspZj9wR~EB?Op9Xt$eXJGMifYBQ z;@ZD7$e-N!srH#xLMy42(!SD4Yu{+)wC}a@S_SO~?MJPm_LKIr_KQ|YtE^Sgs%q7= z>RJu0W){6`X|=VwT0O14)#B9r zx@$eN$oJBEYkjo7T0d=|Hb@(y4b_HeBeap)C~dShMjNY*(7lKrf_!sDG>%){E$$ z=tcEndU3skUQ#cmf2n_^f326+%jnObi}>%Zug z^vZe_y{cYKuddh7Yw5N1I(l8bo?c&Xpf}7S-$-w)H_@Bw&GhE_uX+o;rQS+!t+&zJ z>h1LQdI!Cu-bwGQchS4*-SqBy551?}OYf`q(+B7S^+Ea&eV9I6AEA%bN9kkrar#7k zl0I2a)6?}S`ZRsIK0}|S&(`PY^Yr=p0)3&rNMEck(UVqrOSstZ&h`>f7|~`VM`kzDwV&@6i)Fs6#reBRZ;MI<6BssZ%~#{jh#SKdS$xAJdQPC-js0DgCs5Mn9j0!@o4n zpU`+gzocK*ujx1RoBA#Nwth#yuRqWq>W}p&x~1E?qq};bhkC3()id;G`tSPlEPB7t z0VBo8VdOMkF7aNc+V(c6g1v9J}?Ry|G2CV zjgO3vjlxC|;}fH(QOqcAd}fp|N*bRVUl^r~FO9E_(ncBMTcfN|&iLLaZ&WaTFn%;D z8b2A8jLJq8qpDHOsBY9SY8thS+D2WYo>AXuU^Fxu8I6r5MpL7i(cJjeXkoN8S{bd4 zHbz^cozdRtV01J(8J&$TMpvVo(bMQ<^fCGx{fq&|Kx2?G*cf6AHHH}@jZwyEW2`aG z7;j84CK{8BG$Y-ZVoWur8Pkm!#!O?DG2579%r)j2^Nj_@LSvD!*jQpLGnN}GjFrYJ zW3{oySZAy^HW(X?O~z(pi?P+%W^6Zh7(0z!SvdS7lRvY*+t_0y4A6iK*gy=_zzp0V z4AP(s+F%XN;0@7`4B1c&)zA#xFpOjty-j1UvCr6V954 z!!>*(FhV0XGK^=&@5XZ@M>1#fmE^0*T*=pxuP5I~=1#tud^?#ZnK$`PGG8)(^1Wn% zWWnV7$q$l+k{>2NP8LoUNq&+nnk<$qp8PcVS+Yd3WU^H9%jDO|(#bN(ZExN@x#aoeh2+KL zrR3%0mE`s0&E)OmohUBFhLVCVG}cPlQb!lHhEJpMN=|mQ!@?IH20eO%>Cv8^PqVoi{3}gW9D)5gn7z5 zZJsgDn&-^(<^}VzdBwbL-Y{>Px6Iq-9rM2Vz12_2P0#erzzof&W`_Cf z|6%Vvqng^@^-+-6d+!REVAmC5@4ZV$K#EiWML`7x1nCNjf?~nmdw?Xg1VRartlpcw z*R5`KTVu=he?Q4N%jG3G#CSJ05^i0z|G(mFab;iw}L5PDwqbQgWJJf zU@o{D%mep<1>gbjFnAO^1|A1bfG5E-;6?Bfcp1C`UImN65>O3lz*4XrtN<&)->LKe zluHZhz$&mBtOXmuMz9Gqf+i3I5fBA&kOXOv0a=g(c~AgF@H%({yb0cFHt##&UGN@w zAAA5l1RsM>z^CAI@DK0>_zL_Jd=0(<--3UE@4)xq2k;~K3H%J2!7t75U%_wSckl;j z0b4*eP)n#4)Ea6FwTC)D9idK8XQ&(01L_U+f%-!Ip#IPxXfR|4*+WAh8RP&Bg@!@H zp%KtXXbc2Ej*tQx2aSg&Kogp`9gk>KNJA1f&!r+C>RQXLZL8dH53j-K#|ZIXe|^4t%KG> z(a=U{6BGw+hPFTn&{il3N`|&UDNs6;31ve$&`xL%ln3QQd!c<$0dxR52pxh7p~KJ- z=qPjyIsu)6&Om3ObI|{!$?rUV9=ZTsgf2r@psSD)DuRlk5=aH9Aq`Xtl|kiD1yl)X zAsti&RYSE<9aIk)n$5cbYJ`lC3HoWY1tAa$;Sd3l5Czc?1F?_*U4w2wH=$e5ZRiek z7kU6agdR7;KY^Y?&!FefAJ7ZvCG-mV6M7B3f!;!YLGPgV&`0PK^cgZkU!bqh56A*p z!!2MNxHa4cZVR`A+ryn;E5I6P0aRMaY#nSbS=j(ZRy}QH_R}oW?EBdEwH;tP(6$HA z6KDgp1=<1afet`NpcBv;=mK;F)IVL5K3N6YhuVkP53(O;ud;HqRoL3tjkLRGxo>%F znd30a!Pfq~eYYVk>|5Ih*}K_aw3=$$%AutLDkEit43wEy5b#(u4RKl|zS1MSD#kF+0U-^RYZ{dW5u_UZN+_9N_v+YhxLX8*wQJ9Yk_ za&>{b!QJ5=a8I}w+#Bu-_k;Vx1K@%1Ab2or3){i=@DNxE%U}n1C_D@v4v&CG!oQ9+ z8Xg0Wg#lO&JHiThJUjuO2v341!&Bg?@HBWjJOiEy&w^*ebKtq~Ja|650AAP(zX)Co zFM*fB%i!g(6YLDT!S1jpyaM)uec+X_FYE{V!vXLrI2aCv!{F6$I2-{-!fW8Q@H%)s z91Sye+)tx18~ZY=fS;$3Yb|cKxY6SJPdBZbElyk2Sy3&<*mt$>Y=6$GtsP)%kk!j7 zWfihehd_rQhcJh5hY*Lu_K@tXjFQo^eX?`1^Ri2_i?R!{%d!ZE&JLX%1~?3IsIaoN zwX;27cgXIr-9fuTyLAqc4r?5u98w$yIQFsw74~)wifalxyI)!P|4zIC-Ux4kqi35@uiy7U65~P1xGf!eV2QSXx?ISz24# zSlU|JS=w7VSUOrdSvp&~Sh`xeS-M+#SbAD|S$bRgSo&J}S^8TBSO!`KSq58dEp`@r z%MgpyBC|MHhFXSMhFeBhMp{N$Mq9>M###W2+~R0aSjJh#TP9d0S|(X0Tc%j1TAo;@ zTV_~hT4q^h|1{p4Ynf-6Z&_ejXjx=gY*}JiYFTDkZgH|WTU;!z7B`E##lzxhSz+|A1e>f5Lyk@8I|F2lylW3H}0q zg}=i;U<+)Gv_NbS3G(aeZi%!)S|ja{PDp2@3(^(ohIB`IBE68_NMEEM(jOUs3`7PY zgArTA4zWjuAW}ru4DWypMTQ|GkdeqJWHd4c8H)gj9C1Vx$T(y?G69*0OhP6jQ;@01 zG-Nt51DT1;LS`d#kh#b_WInP0k;@(B3i&wsc=-hRMENB7Wcd{NRQWXdbomVVO!+MN zZ227dT=_iteE93EsWP3CG4kR1NL3Sd$ zkX&RpvIogS@{zsBKBNHIj~qY_B8QN}$Pwfyatt|+oIp+@r;yXg8RRT-4mpopKrSLN zb{p(A+HJCnwTrXcY`4WO-Y(&nGjX6@kX^7{h+U{%nB8i-aJvY*$X{Cj59fPr_SqEJ z?6)~!bI|6HO`*+Une>R(&m)SX`8b)=WNc~T(G%lbIIni&41NNZKJU% zwJEbHx2dqHw9(q=Y^rRkZS*!ZHnlc&HuW|Jn?{=^8>5ZM2DE`};QxmIujBph_m_~% z$Q9%&qC|?2Vx$C7A!KyD(pklV-|S?)>YO|)>qa`)>GC=)=@S{HdtmSvzIx@hRTM^M#x6X#>nI{N7;DU1leTS6xnpy z4B0H%Y}s7dJlTBN0@*^@BH3cu64~$8?fZsN3;{#8SRR8L%X9r(Ozh8v@hBZ z?T-#X2cm<}!Kght1eKyP)Bzoe4nv2dzvdo+jzmYHqtP+wSQJ3zs3WRC$D!lV3Ft(0 z5;_^3f=)%Jq0`YB=uC7LItQJL&TEFBk1jwLqD#=F=yKEvbw*uLH`E>VKt0hFs292t z^+o;A0CW`^hz6m-Xb2jHu13Sr2s9F1gRVuR&;yEtibIO-c7=*2#aYEU#d*aA#bLz} z#ZkpE#c{<6#Yx2}#c9PE1)|uk*rUi(kcw)F^5db&7n&Ud28|fnvYH!LD9mQ0!FfQsgQGg;7zYC{~mx zZYnM-t|+c5l#1I5O2H}`6|mx#!ld|>ssEkvI&?i6jmDrG(2eLOG!~6RH=|q7M06{f zgeIfg&=fQkO+(Ys3^WtXLbszk(ClXV<)Ay!U1%=48{LEEq50@ubRSxP?ne)x2hl@l zA$k}+f*wVWqbJal=qdCxdImk)41W$ik6u78qLVzdNRp=wlvmZD{7 zIa+~MqB^t+tw!}|4O)xVq4lT%Z9p5*Ce&m_SzWPmu(q;t{P~(`J=^-4m78^y)g7zV z)=PdK33Lo{40a5040Q~1T z#WCJ7!72>K1=}qY^>22v9>0RkP>3!(~=|kxw>0{{= z=~L-5>2qnIG)NjO4UvXQ!=$UF;nE0cq;!pRtu#uyPP$%NW94q=VW+pMweq#|v-7tL z_%Gi?|C#k+L`^7&LMV(PD2iezjuI$|QYeiwD2wu_fQslf^g4P2y@}pJZ=-k6yUp~w zhu%jYpbyc<=o9oA`Um;~eTlw8|3qJ-Z_u~sU+6pZJ^BIth<-vpqh|CA`W5}w4F4Vd zfm%>2%o=Nf*cqFGw#+FG(*;uSl;-mC_<k2RM3jm^R4VhgZ^*kWu6wiH{AIbpw!;EcIou9zFtOG0S~|vSOIte-hdCV67U850Dm9=SOo+EK|nAN z0)zr#z-k~IhyWsiHNaXR3RnlM2cm%(U<0rb*aXA^almF^3lI+^0Exg>APGnYwgD+X zDv$=G0~tUjkOgc9b^zHx4zLs01>^#|fjvMTkPqwy_5lUJuZ;cgiuYp&u!Gnk>ePGYCAGuT<|9CjYNfL+9{V8vJoroz;i1}nuXuu4qVOus6u8mqx-u{x|CGhhu^ zBWA)N48c$g!*GniNQ}l9jKz3Nz(njCb{)IX41W{5h26&PV0W>5*nR8)_7HoFJ;9!0 z&#>p%AJ_}*74|3g8heZVg}uYxV;``O*eC2WX2!l?U$Jl4ckDE91~?0x1I_~%fQ!H- z;4*LpxC$tNBA^&30aSn*&;X@C8Bh*X0F{6i&;eCIHJ}G-fLfpqs0R!{1JDRG0Y<TCWCGLy+;{o_8yo;o(q?@F>q=%%Z#9Goz z(p%C;(pSI3I39sV;%o4=_4M0l$P_!LQ;%=!AtQnyd1BjOWT#wh_wRjy~j~nm?yb(7x8|(Kn_y3PE6Mv1r#s9+J;qUPe z_(%K`{ssSr|G+Ijx2~`zS`fc7XG63kS`n>@wnRIkJ<*ZqM06&)5M7CGM0cVm(TnI! z^db5Y{fPm@Kw=Ovn6M{?5HiAn7)lH$Mi3*LjrHre|Hl7}flBGh?&GJVm2{{m`ltf<`WBug~TFaaWl@B5KD<=#B#!ka3)*`SHg{O zCp-vGVg=zvtR#F1eqX!b)kalqg#(+bG*A z+bO#!yDGaWyDNJrdn$V=dn@}Y`ziY?2Pg+BZIx2xDCKD7SS6s8D<>%@E2k-EDVHjj zD?OCnNS)07#?Ol6jGyD~?)Q@Kl-tISvKR~}OySDsX!Ql3^` zQeIYGQ7V-sN|jQp)G4c#dS#8$plnh?N=(TsMddx^edQzNQ{^+|AIg`?*UC4_x5{_Q z56X|qZ_4jVt0GBJtD;|Z_)o97ql#2a|TBJvoH@b*?hffgDN>BZreC$dTk2(veh<)s|NOy7t=|%dGD@k9{ zp9~;Zk%43o8BB(dtH}s*4Y`(#B0CgyEb3g;wWv?gfFj$X;YFj0Mi-4M8ecT2Xj;*{ zqWMJ&ixwBT6nPYR7X=lC6h#%SD~c)FR1{kjSG2ikYf(~Ba#2cAT2XpYc2Q1IZc%>G zv7+Ne=ZY$e>Wd6TO+`=qYh zym(yk#NtWCQ;KI5&n})@JimBB@si?Y#mkGGid~95idPi-75f*jDh@0TDh?}-D2^S!A@j(5axb}$EFkxj2grluA+nG>OdcVRlE=v7%8li%VQe{7U>wLQBF* z5=v4_GE1^c@=NxX94I+fqAk&t=u7HLz!IngEiURS(qw)j-uS)jZXF)gsjr)iRZn%3bB5@>F@Le46)R5Dy>SdYEl_h zpbApKDoRDGIMp@PJ=J4X8+BWCdvynO7j-vvcXc0iUv+==0QEri5Vce-Qx8**Qjb%Q zS5H(=QcqUTQqNY;Q!i4xs9n__YEQMd+D{#*j#nqBlhmo|bal2mN4-nETfI+Rpx&=8 zR3B4cQe$dL&8csxZ#VNn{*{y88IPgHQUE2V94Q4gftpB7rlwF+sp-@VY9=*{noZ52 z=28o&Mbr{%DYcARPB~G|&Gd7n+$eX-lUhM}Q9jg4%9rw^{HXwH6%|AUQz29+6-KS5 z!l?)~qDxmgLch%3-&($y0Z`5Y>SM_(bMAK5!M$=x?LDNIiQ`1}1 zS7WOgrV()_7;t$C+;ulb<)r1`8d zYrbf{YAio5^IDfmO52onDeYR?y|hPZ&(Z;<9;Ke8D@wgfeM|jH14>twhL(mk^TGX{ zn*W;X0CkW$L={qpsUy@;>KJvLIzgSJPEn_+Gt^n?0(FtPOkJU_QbklTRYIvKHKl2$ zUnx~VX{jozn$lA>R4r9UHBgO|kup&rg-|GkQ8-0VB*jnyB~sU@>(q^A_?y%n>MnJk zdO$s-9#c=Kr_?j*IrRtig8GyCi+V@Br#?_0sZW%d`a*rBzER()AC!f%qOIu`v<)qx z!%HJe*Osm?jVaww8e1A)np&Dxno*irnpK)xnqRuV^i=8T(o3bv(xy^lDO8GeW zRmzp}rDEyz(wn8XOYfCFDt%V^t+Y#7pRxgEwq?W0hL?>j8&~F1=33@a=3N$87E~5e z7FHHjmRgowcD(Fd*`+dNS$SDynXat9tf>qtqssWQTV=P)?v*_(dsOzM>}A=jve#vA z%RZO&DDPR`r@VjpfO2WMtbAzsu=3&MBg%ntdHJ~VN&hSSKU>nR=+<-_x-H#~Zclfh zJJFr#E_7GA8{M7mLHDG4(Y@(DbYHq3-Jc#n52OdtgXv$_k1cIS+tWj6DJ`QN=%Ms5 zdN@6T9!Za)N7G~Iv9u$tpvTh_=!x`XdMZ7Qo=(qbhM!5#p%>5#=|%KndI`OhcA}kW zSK5tsr#la&>uWd0BaRd3CwIyr#Uqyr~>3 z$IHobs+=yrR{pZQOGVd;9u<8mWEG<-##Jn;2(5^yI974I;#9@CimMgM3Uvin@uuQ^ z#pepEO6$s&mBT8BSB|P2TM1N7s+?RowQ^qNqRM5J9+jSzft8_^5tT8O8!9(d##JU& zCRe6bW>)4_?yk(M%&**Axv%nI<)LOih`)0BJLC0qG#x{4pf}Q+=vX?A-b`GSjj`eHNuW%>$zl~&S4bTM5*Yv?k%g07^sw2rQ(Yv@|K zjyBK@bR*qF8)*{_(hv>P2#wMhjnf28(uI|WE00y4s=QQrx$oeqV1#YtL?8HsFiAE+F{yJ+Hu#q&ehH9g<>$K6@4cd5Zl6JTDl2)ZH(`vQ#T7$MxYt&*|O3P_) zYwv3BYoBSKYhP;LXg_Ps+OOL0T8XZY&Q>=~H(fVNH&3@r=d5$pdFy<1e!4(igf3F| zJ9Yk_a#1u*Gc-$cG*1h(NMEOK&^PH@^lkbMeV4vR-=`nY59vqrWBLjGlzv7(r~hcC z-wXOB{fhpReoeoj-_n24@8}QoNBR?OroYf%>2LIR`Uh>Htr%;j1!KcVn3hZ{=GVEj zVcIe6nGQ@xrW4bd>B@9tx-&hPo=h*MH`9md%k*RVGXt1`%phhkW6Rhv_RJ7Q%E%Z8 zW+*d^8P2TLt<%No;&k!4BweO1OSeOpquZ(5t=pqh>WXwKU71d=tI^fz3_3^$>o6Um zBXyLH)-k$ky6d`|y4$)ty8F6^x<|Ulx@WqVy7#&dx=*^#I(Wf;;S;MGOMzx zc2wn7U8=fVb+t-arK-|YX{&y2&0SSf)l>ylU8}lY^{tr?-mjee&Ugefk{QE{W#o(_ zqhQ7}6PSt2BxW)*g_+9CU}iCMn7Pb6WS=1SXN$$|Nz#%r+*4NoO*cEM_~igUMlbGP{^u#;RIU-LblJb=T@X z)dQ++tA|&QtR7cAzIsCSr0S{F)2gRe�bPJ->Qk_2TN~)y~x})gIN})j`!E)lt>i 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

Axip-9*v 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⋙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%0D8##P2O#&yOG#!bd8 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%0Dtq!eXZ&T*dQ80Zf(psvhJ}piqTFBNb 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

8{GBoW_JtxI*5K5>~ase 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 and (bt.u_up_total+bt.u_up_bonus)greatest(5368709120,bt.u_down_total) then 0 when bt.u_up_total>5368709120 and bt.u_down_total>0 then floor((bt.u_up_total+bt.u_up_bonus)/0.3/bt.u_down_total)+1 when (bt.u_up_total+bt.u_up_bonus)>bt.u_down_total then 3 else 2 end + +column_files_dl_percent = (select case tor.tor_type when 1 then 0 when 2 then 50 else 100 end from bb_bt_torrents tor where tor.topic_id=bt.topic_id) as dl_percent + +log_announce = 0 +gdc = 1 +debug = 0 +#free_leech = 0 +log_access = 0 + +redirect_url = http://site.ru/forum/ +trust_ipv6 = 1 +pid_file = F:/AnimeTracker/XBTT/xbt_tracker.pid + diff --git a/install/xbt/windows/zlibwapi.dll b/install/xbt/windows/zlibwapi.dll new file mode 100644 index 0000000000000000000000000000000000000000..1c9092e7e167607282497ac50a942621fc309f8f GIT binary patch literal 139264 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 aDm33e*FPHgM+5(8;2#bAqk;b^8u(vw1Vr!v literal 0 HcmV?d00001 diff --git a/install/xbt/windows/Установка.txt b/install/xbt/windows/Установка.txt new file mode 100644 index 000000000..466f5f2b9 --- /dev/null +++ b/install/xbt/windows/Установка.txt @@ -0,0 +1,2 @@ + ( - - cmd). + C:\ \"XBT Tracker".exe --install \ No newline at end of file diff --git a/install/xbt/xbt_tracker.conf b/install/xbt/xbt_tracker.conf new file mode 100644 index 000000000..affea3aa7 --- /dev/null +++ b/install/xbt/xbt_tracker.conf @@ -0,0 +1,47 @@ +mysql_host = localhost +mysql_database = forum +mysql_user = user +mysql_password = user + +auto_register = 0 +anonymous_announce = 0 +anonymous_scrape = 0 +anonymous_connect = 0 +full_scrape = 0 +listen_check = 0 + +gzip_debug = 0 +gzip_scrape = 1 +full_scrape = 0 + +announce_interval = 700 +clean_up_interval = 60 +read_config_interval = 60 +read_db_interval = 150 +scrape_interval = 0 +write_db_interval = 3 +read_files_interval = 2 + +table_files = bb_bt_torrents +table_users = bb_bt_users +table_files_users = bb_bt_tracker + +column_files_completed = complete_count +column_files_fid = topic_id +column_users_uid = user_id + +column_users_can_leech = case when bt.u_down_total>5368709120 and (bt.u_up_total+bt.u_up_bonus)greatest(5368709120,bt.u_down_total) then 0 when bt.u_up_total>5368709120 and bt.u_down_total>0 then floor((bt.u_up_total+bt.u_up_bonus)/0.3/bt.u_down_total)+1 when (bt.u_up_total+bt.u_up_bonus)>bt.u_down_total then 3 else 2 end + +column_files_dl_percent = (select case tor.tor_type when 1 then 0 when 2 then 50 else 100 end from bb_bt_torrents tor where tor.topic_id=bt.topic_id) as dl_percent + +log_announce = 0 +gdc = 1 +debug = 0 +#free_leech = 0 +log_access = 0 + +redirect_url = http://site.ru/forum/ +trust_ipv6 = 1 +pid_file = xbt_tracker.pid + diff --git a/upload/.htaccess b/upload/.htaccess new file mode 100644 index 000000000..b5e089499 --- /dev/null +++ b/upload/.htaccess @@ -0,0 +1,15 @@ +## Set charset server +AddDefaultCharset UTF-8 +## Set charset for php mb-functions +php_value mbstring.internal_encoding UTF-8 + +## RSS MOD +RewriteEngine On +RewriteRule ^rss.xml$ rss.php [L] + +## Access control + +deny from all + + +# Copyright (c) 2008-2011, Pandora. \ No newline at end of file diff --git a/upload/admin/.htaccess b/upload/admin/.htaccess new file mode 100644 index 000000000..c2c2cc412 --- /dev/null +++ b/upload/admin/.htaccess @@ -0,0 +1,8 @@ +AddDefaultCharset UTF-8 +#order allow deny +#deny from all +#allow from 127.0.0.1 + + +allow from all + \ No newline at end of file diff --git a/upload/admin/admin_attach_cp.php b/upload/admin/admin_attach_cp.php new file mode 100644 index 000000000..fc56a70a5 --- /dev/null +++ b/upload/admin/admin_attach_cp.php @@ -0,0 +1,592 @@ +'; + +for($i = 0; $i < count($view_types_text); $i++) +{ + $selected = ($view == $view_types[$i]) ? ' selected="selected"' : ''; + $select_view .= ''; +} +$select_view .= ''; + +if (count($mode_types_text) > 0) +{ + $select_sort_mode = ''; +} + +$select_sort_order = ''; + +$submit_change = ( isset($_POST['submit_change']) ) ? TRUE : FALSE; +$delete = ( isset($_POST['delete']) ) ? TRUE : FALSE; +$delete_id_list = get_var('delete_id_list', array(0)); + +$confirm = isset($_POST['confirm']); + +if ($confirm && sizeof($delete_id_list) > 0) +{ + $attachments = array(); + + delete_attachment(0, $delete_id_list); +} +else if ($delete && sizeof($delete_id_list) > 0) +{ + // Not confirmed, show confirmation message + $hidden_fields = ''; + $hidden_fields .= ''; + $hidden_fields .= ''; + $hidden_fields .= ''; + $hidden_fields .= ''; + + for ($i = 0; $i < sizeof($delete_id_list); $i++) + { + $hidden_fields .= ''; + } + + print_confirmation(array( + 'FORM_ACTION' => "admin_attach_cp.php", + 'HIDDEN_FIELDS' => $hidden_fields, + )); +} + +// Assign Default Template Vars +$template->assign_vars(array( + 'S_VIEW_SELECT' => $select_view, + 'S_MODE_ACTION' => append_sid('admin_attach_cp.php')) +); + +if ($submit_change && $view == 'attachments') +{ + $attach_change_list = get_var('attach_id_list', array(0)); + $attach_comment_list = get_var('attach_comment_list', array('')); + $attach_download_count_list = get_var('attach_count_list', array(0)); + + // Generate correct Change List + $attachments = array(); + + for ($i = 0; $i < count($attach_change_list); $i++) + { + $attachments['_' . $attach_change_list[$i]]['comment'] = $attach_comment_list[$i]; + $attachments['_' . $attach_change_list[$i]]['download_count'] = $attach_download_count_list[$i]; + } + + $sql = 'SELECT * + FROM ' . BB_ATTACHMENTS_DESC . ' + ORDER BY attach_id'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t get Attachment informations', '', __LINE__, __FILE__, $sql); + } + + while ( $attachrow = DB()->sql_fetchrow($result) ) + { + if ( isset($attachments['_' . $attachrow['attach_id']]) ) + { + if ($attachrow['comment'] != $attachments['_' . $attachrow['attach_id']]['comment'] || $attachrow['download_count'] != $attachments['_' . $attachrow['attach_id']]['download_count']) + { + $sql = "UPDATE " . BB_ATTACHMENTS_DESC . " + SET comment = '" . attach_mod_sql_escape($attachments['_' . $attachrow['attach_id']]['comment']) . "', download_count = " . (int) $attachments['_' . $attachrow['attach_id']]['download_count'] . " + WHERE attach_id = " . (int) $attachrow['attach_id']; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Couldn\'t update Attachments Informations', '', __LINE__, __FILE__, $sql); + } + } + } + } + DB()->sql_freeresult($result); +} + +// Statistics +if ($view == 'stats') +{ + $upload_dir_size = get_formatted_dirsize(); + + if ($attach_config['attachment_quota'] >= 1048576) + { + $attachment_quota = round($attach_config['attachment_quota'] / 1048576 * 100) / 100 . ' ' . $lang['MB']; + } + else if ($attach_config['attachment_quota'] >= 1024) + { + $attachment_quota = round($attach_config['attachment_quota'] / 1024 * 100) / 100 . ' ' . $lang['KB']; + } + else + { + $attachment_quota = $attach_config['attachment_quota'] . ' ' . $lang['BYTES']; + } + + // number_of_attachments + $row = DB()->fetch_row(" + SELECT COUNT(*) AS total FROM ". BB_ATTACHMENTS_DESC ." + "); + $number_of_attachments = $number_of_posts = $row['total']; + + $number_of_pms = 0; + + // number_of_topics + $row = DB()->fetch_row(" + SELECT COUNT(*) AS topics FROM ". BB_TOPICS ." WHERE topic_attachment = 1 + "); + $number_of_topics = $row['topics']; + + // number_of_users + $row = DB()->fetch_row(" + SELECT COUNT(DISTINCT user_id_1) AS users FROM ". BB_ATTACHMENTS ." WHERE post_id != 0 + "); + $number_of_users = $row['users']; + + $template->assign_vars(array( + 'TPL_ATTACH_STATISTICS' => true, + + 'TOTAL_FILESIZE' => $upload_dir_size, + 'ATTACH_QUOTA' => $attachment_quota, + 'NUMBER_OF_ATTACHMENTS' => $number_of_attachments, + 'NUMBER_OF_POSTS' => $number_of_posts, + 'NUMBER_OF_PMS' => $number_of_pms, + 'NUMBER_OF_TOPICS' => $number_of_topics, + 'NUMBER_OF_USERS' => $number_of_users) + ); + +} + +// Search +if ($view == 'search') +{ + // Get Forums and Categories + //sf - add [, f.forum_parent] + $sql = "SELECT c.cat_title, c.cat_id, f.forum_name, f.forum_id, f.forum_parent + FROM " . BB_CATEGORIES . " c, " . BB_FORUMS . " f + WHERE f.cat_id = c.cat_id + ORDER BY c.cat_id, f.forum_order"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain forum_name/forum_id', '', __LINE__, __FILE__, $sql); + } + + $s_forums = ''; + while ($row = DB()->sql_fetchrow($result)) + { //sf + $s_forums .= ''; + + if( empty($list_cat[$row['cat_id']]) ) + { + $list_cat[$row['cat_id']] = $row['cat_title']; + } + } + + if( $s_forums != '' ) + { + $s_forums = '' . $s_forums; + + // Category to search + $s_categories = ''; + + foreach ($list_cat as $cat_id => $cat_title) + { + $s_categories .= ''; + } + } + else + { + message_die(GENERAL_MESSAGE, $lang['NO_SEARCHABLE_FORUMS']); + } + + $template->assign_vars(array( + 'TPL_ATTACH_SEARCH' => true, + + 'S_FORUM_OPTIONS' => $s_forums, + 'S_CATEGORY_OPTIONS' => $s_categories, + 'S_SORT_OPTIONS' => $select_sort_mode, + 'S_SORT_ORDER' => $select_sort_order) + ); +} + +// Username +if ($view == 'username') +{ + $template->assign_vars(array( + 'TPL_ATTACH_USER' => true, + + 'S_MODE_SELECT' => $select_sort_mode, + 'S_ORDER_SELECT' => $select_sort_order) + ); + $total_rows = 0; + bb_die('removed'); +} + +// Attachments +if ($view == 'attachments') +{ + $user_based = ($uid) ? TRUE : FALSE; + $search_based = (isset($_POST['search']) && $_POST['search']) ? TRUE : FALSE; + + $hidden_fields = ''; + + $template->assign_vars(array( + 'TPL_ATTACH_ATTACHMENTS' => true, + + 'S_MODE_SELECT' => $select_sort_mode, + 'S_ORDER_SELECT' => $select_sort_order) + ); + + $total_rows = 0; + + // Are we called from Username ? + if ($user_based) + { + $sql = "SELECT username + FROM " . BB_USERS . " + WHERE user_id = " . intval($uid); + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Error getting username', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + $username = $row['username']; + + $s_hidden = ''; + + $template->assign_block_vars('switch_user_based', array()); + + $template->assign_vars(array( + 'S_USER_HIDDEN' => $s_hidden, + 'L_STATISTICS_FOR_USER' => sprintf($lang['STATISTICS_FOR_USER'], $username)) + ); + + $sql = "SELECT attach_id + FROM " . BB_ATTACHMENTS . " + WHERE user_id_1 = " . intval($uid) . " + GROUP BY attach_id"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attachments', '', __LINE__, __FILE__, $sql); + } + + $attach_ids = DB()->sql_fetchrowset($result); + $num_attach_ids = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_attach_ids == 0) + { + message_die(GENERAL_MESSAGE, 'For some reason no Attachments are assigned to the User "' . $username . '".'); + } + + $total_rows = $num_attach_ids; + + $attach_id = array(); + + for ($j = 0; $j < $num_attach_ids; $j++) + { + $attach_id[] = intval($attach_ids[$j]['attach_id']); + } + + $sql = "SELECT a.* + FROM " . BB_ATTACHMENTS_DESC . " a + WHERE a.attach_id IN (" . implode(', ', $attach_id) . ") " . + $order_by; + + } + else if ($search_based) + { + // we are called from search + $attachments = search_attachments($order_by, $total_rows); + } + + if (!$search_based) + { + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attachments', '', __LINE__, __FILE__, $sql); + } + + $attachments = DB()->sql_fetchrowset($result); + $num_attach = DB()->num_rows($result); + DB()->sql_freeresult($result); + } + + if (sizeof($attachments) > 0) + { + for ($i = 0; $i < sizeof($attachments); $i++) + { + $delete_box = ''; + + for ($j = 0; $j < count($delete_id_list); $j++) + { + if ($delete_id_list[$j] == $attachments[$i]['attach_id']) + { + $delete_box = ''; + break; + } + } + + $row_class = !($i % 2) ? 'row1' : 'row2'; + + // Is the Attachment assigned to more than one post ? + // If it's not assigned to any post, it's an private message thingy. ;) + $post_titles = array(); + + $sql = "SELECT * + FROM " . BB_ATTACHMENTS . " + WHERE attach_id = " . intval($attachments[$i]['attach_id']); + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attachments', '', __LINE__, __FILE__, $sql); + } + + $ids = DB()->sql_fetchrowset($result); + $num_ids = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($j = 0; $j < $num_ids; $j++) + { + if ($ids[$j]['post_id'] != 0) + { + $sql = "SELECT t.topic_title + FROM " . BB_TOPICS . " t, " . BB_POSTS . " p + WHERE p.post_id = " . intval($ids[$j]['post_id']) . " AND p.topic_id = t.topic_id + GROUP BY t.topic_id, t.topic_title"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t query topic', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + $post_title = $row['topic_title']; + + if (strlen($post_title) > 32) + { + $post_title = substr($post_title, 0, 30) . '...'; + } + + $view_topic = append_sid(BB_ROOT . 'viewtopic.php?' . POST_POST_URL . '=' . $ids[$j]['post_id'] . '#' . $ids[$j]['post_id']); + + $post_titles[] = '' . $post_title . ''; + } + else + { + $post_titles[] = $lang['PRIVATE_MESSAGE']; + } + } + + $post_titles = implode('
', $post_titles); + + $hidden_field = ''; + + $template->assign_block_vars('attachrow', array( + 'ROW_NUMBER' => $i + ( @$_GET['start'] + 1 ), + 'ROW_CLASS' => $row_class, + + 'FILENAME' => htmlspecialchars($attachments[$i]['real_filename']), + 'COMMENT' => htmlspecialchars($attachments[$i]['comment']), + 'EXTENSION' => $attachments[$i]['extension'], + 'SIZE' => round(($attachments[$i]['filesize'] / MEGABYTE), 2), + 'DOWNLOAD_COUNT' => $attachments[$i]['download_count'], + 'POST_TIME' => bb_date($attachments[$i]['filetime']), + 'POST_TITLE' => $post_titles, + + 'S_DELETE_BOX' => $delete_box, + 'S_HIDDEN' => $hidden_field, + 'U_VIEW_ATTACHMENT' => append_sid(BB_ROOT . 'download.php?id=' . $attachments[$i]['attach_id'])) + ); + + } + } + + if (!$search_based && !$user_based) + { + if ($total_attachments == 0) + { + $sql = "SELECT attach_id FROM " . BB_ATTACHMENTS_DESC; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query Attachment Description Table', '', __LINE__, __FILE__, $sql); + } + + $total_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + } + } +} + +// Generate Pagination +if ($do_pagination && $total_rows > $bb_cfg['topics_per_page']) +{ + $pagination = generate_pagination('admin_attach_cp.php?view=' . $view . '&mode=' . $mode . '&order=' . $sort_order . '&uid=' . $uid, $total_rows, $bb_cfg['topics_per_page'], $start).' '; + + $template->assign_vars(array( + 'PAGINATION' => $pagination, + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], ( floor( $start / $bb_cfg['topics_per_page'] ) + 1 ), ceil( $total_rows / $bb_cfg['topics_per_page'] )), + )); +} + +print_page('admin_attach_cp.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_attachments.php b/upload/admin/admin_attachments.php new file mode 100644 index 000000000..e1c781125 --- /dev/null +++ b/upload/admin/admin_attachments.php @@ -0,0 +1,997 @@ +sql_query($sql)) +{ + message_die(GENERAL_ERROR, 'Could not find Attachment Config Table', '', __LINE__, __FILE__, $sql); +} + +while ($row = DB()->sql_fetchrow($result)) +{ + $config_name = $row['config_name']; + $config_value = $row['config_value']; + + $new_attach[$config_name] = get_var($config_name, trim($attach_config[$config_name])); + + if (!$size && !$submit && $config_name == 'max_filesize') + { + $size = ($attach_config[$config_name] >= 1048576) ? 'mb' : (($attach_config[$config_name] >= 1024) ? 'kb' : 'b'); + } + + if (!$quota_size && !$submit && $config_name == 'attachment_quota') + { + $quota_size = ($attach_config[$config_name] >= 1048576) ? 'mb' : (($attach_config[$config_name] >= 1024) ? 'kb' : 'b'); + } + + if (!$pm_size && !$submit && $config_name == 'max_filesize_pm') + { + $pm_size = ($attach_config[$config_name] >= 1048576) ? 'mb' : (($attach_config[$config_name] >= 1024) ? 'kb' : 'b'); + } + + if (!$submit && ($config_name == 'max_filesize' || $config_name == 'attachment_quota' || $config_name == 'max_filesize_pm')) + { + if ($new_attach[$config_name] >= 1048576) + { + $new_attach[$config_name] = round($new_attach[$config_name] / 1048576 * 100) / 100; + } + else if ($new_attach[$config_name] >= 1024) + { + $new_attach[$config_name] = round($new_attach[$config_name] / 1024 * 100) / 100; + } + } + + if ( $submit && ( $mode == 'manage' || $mode == 'cats') ) + { + if ($config_name == 'max_filesize') + { + $old = $new_attach[$config_name]; + $new_attach[$config_name] = ( $size == 'kb' ) ? round($new_attach[$config_name] * 1024) : ( ($size == 'mb') ? round($new_attach[$config_name] * 1048576) : $new_attach[$config_name] ); + } + + if ($config_name == 'attachment_quota') + { + $old = $new_attach[$config_name]; + $new_attach[$config_name] = ( $quota_size == 'kb' ) ? round($new_attach[$config_name] * 1024) : ( ($quota_size == 'mb') ? round($new_attach[$config_name] * 1048576) : $new_attach[$config_name] ); + } + + if ($config_name == 'max_filesize_pm') + { + $old = $new_attach[$config_name]; + $new_attach[$config_name] = ( $pm_size == 'kb' ) ? round($new_attach[$config_name] * 1024) : ( ($pm_size == 'mb') ? round($new_attach[$config_name] * 1048576) : $new_attach[$config_name] ); + } + + if ($config_name == 'ftp_server' || $config_name == 'ftp_path' || $config_name == 'download_path') + { + $value = trim($new_attach[$config_name]); + + if ($value[strlen($value)-1] == '/') + { + $value[strlen($value)-1] = ' '; + } + + $new_attach[$config_name] = trim($value); + + } + + if ($config_name == 'max_filesize') + { + $old_size = $attach_config[$config_name]; + $new_size = $new_attach[$config_name]; + + if ($old_size != $new_size) + { + // See, if we have a similar value of old_size in Mime Groups. If so, update these values. + $sql = 'UPDATE ' . BB_EXTENSION_GROUPS . ' + SET max_filesize = ' . (int) $new_size . ' + WHERE max_filesize = ' . (int) $old_size; + + if ( !($result_2 = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not update Extension Group informations', '', __LINE__, __FILE__, $sql); + } + + } + + $sql = "UPDATE " . BB_ATTACH_CONFIG . " + SET config_value = '" . attach_mod_sql_escape($new_attach[$config_name]) . "' + WHERE config_name = '" . attach_mod_sql_escape($config_name) . "'"; + } + else + { + $sql = "UPDATE " . BB_ATTACH_CONFIG . " + SET config_value = '" . attach_mod_sql_escape($new_attach[$config_name]) . "' + WHERE config_name = '" . attach_mod_sql_escape($config_name) . "'"; + } + + if( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Failed to update attachment configuration for ' . $config_name, '', __LINE__, __FILE__, $sql); + } + + if ($config_name == 'max_filesize' || $config_name == 'attachment_quota' || $config_name == 'max_filesize_pm') + { + $new_attach[$config_name] = $old; + } + } +} +DB()->sql_freeresult($result); + +// Clear cached config +CACHE('bb_cache')->rm('attach_config'); + +$select_size_mode = size_select('size', $size); +$select_quota_size_mode = size_select('quota_size', $quota_size); +$select_pm_size_mode = size_select('pm_size', $pm_size); + +// Search Imagick +if ($search_imagick) +{ + $imagick = ''; + + if (preg_match('/convert/i', $imagick)) + { + return true; + } + else if ($imagick != 'none') + { + if (!preg_match('/WIN/i', PHP_OS)) + { + $retval = @exec('whereis convert'); + $paths = explode(' ', $retval); + + if (is_array($paths)) + { + for ( $i=0; $i < sizeof($paths); $i++) + { + $path = basename($paths[$i]); + + if ($path == 'convert') + { + $imagick = $paths[$i]; + } + } + } + } + else if (preg_match('/WIN/i', PHP_OS)) + { + $path = 'c:/imagemagick/convert.exe'; + + if ( !@file_exists(@amod_realpath($path))) + { + $imagick = $path; + } + } + } + + if ( !@file_exists(@amod_realpath(trim($imagick)))) + { + $new_attach['img_imagick'] = trim($imagick); + } + else + { + $new_attach['img_imagick'] = ''; + } +} + +// Check Settings +if ($check_upload) +{ + // Some tests... + $attach_config = array(); + + $sql = 'SELECT * + FROM ' . BB_ATTACH_CONFIG; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not find Attachment Config Table', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < $num_rows; $i++) + { + $attach_config[$row[$i]['config_name']] = trim($row[$i]['config_value']); + } + + if ($attach_config['upload_dir'][0] == '/' || ($attach_config['upload_dir'][0] != '/' && $attach_config['upload_dir'][1] == ':')) + { + $upload_dir = $attach_config['upload_dir']; + } + else + { + $upload_dir = BB_ROOT . $attach_config['upload_dir']; + } + + $error = false; + + // Does the target directory exist, is it a directory and writeable. (only test if ftp upload is disabled) + if (intval($attach_config['allow_ftp_upload']) == 0) + { + if ( !@file_exists(@amod_realpath($upload_dir)) ) + { + $error = true; + $error_msg = sprintf($lang['DIRECTORY_DOES_NOT_EXIST'], $attach_config['upload_dir']) . '
'; + } + + if (!$error && !is_dir($upload_dir)) + { + $error = TRUE; + $error_msg = sprintf($lang['DIRECTORY_IS_NOT_A_DIR'], $attach_config['upload_dir']) . '
'; + } + + if (!$error) + { + if ( !($fp = @fopen($upload_dir . '/0_000000.000', 'w')) ) + { + $error = TRUE; + $error_msg = sprintf($lang['DIRECTORY_NOT_WRITEABLE'], $attach_config['upload_dir']) . '
'; + } + else + { + @fclose($fp); + unlink_attach($upload_dir . '/0_000000.000'); + } + } + } + else + { + // Check FTP Settings + $server = ( empty($attach_config['ftp_server']) ) ? 'localhost' : $attach_config['ftp_server']; + + $conn_id = @ftp_connect($server); + + if (!$conn_id) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_CONNECT'], $server) . '
'; + } + + $login_result = @ftp_login($conn_id, $attach_config['ftp_user'], $attach_config['ftp_pass']); + + if ( (!$login_result) && (!$error) ) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_LOGIN'], $attach_config['ftp_user']) . '
'; + } + + if (!@ftp_pasv($conn_id, intval($attach_config['ftp_pasv_mode']))) + { + $error = TRUE; + $error_msg = $lang['FTP_ERROR_PASV_MODE']; + } + + if (!$error) + { + // Check Upload + $tmpfname = @tempnam('/tmp', 't0000'); + + @unlink($tmpfname); // unlink for safety on php4.0.3+ + + $fp = @fopen($tmpfname, 'w'); + + @fwrite($fp, 'test'); + + @fclose($fp); + + $result = @ftp_chdir($conn_id, $attach_config['ftp_path']); + + if (!$result) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_PATH'], $attach_config['ftp_path']) . '
'; + } + else + { + $res = @ftp_put($conn_id, 't0000', $tmpfname, FTP_ASCII); + + if (!$res) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_UPLOAD'], $attach_config['ftp_path']) . '
'; + } + else + { + $res = @ftp_delete($conn_id, 't0000'); + + if (!$res) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_DELETE'], $attach_config['ftp_path']) . '
'; + } + } + } + + @ftp_quit($conn_id); + + @unlink($tmpfname); + } + } + + if (!$error) + { + message_die(GENERAL_MESSAGE, $lang['TEST_SETTINGS_SUCCESSFUL'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', '')); + } +} + +// Management +if ($submit && $mode == 'manage') +{ + if (!$error) + { + message_die(GENERAL_MESSAGE, $lang['ATTACH_CONFIG_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', '')); + } +} + +if ($mode == 'manage') +{ + $yes_no_switches = array('disable_mod', 'allow_pm_attach', 'allow_ftp_upload', 'display_order', 'ftp_pasv_mode'); + + for ($i = 0; $i < sizeof($yes_no_switches); $i++) + { + eval("\$" . $yes_no_switches[$i] . "_yes = ( \$new_attach['" . $yes_no_switches[$i] . "'] != '0' ) ? 'checked=\"checked\"' : '';"); + eval("\$" . $yes_no_switches[$i] . "_no = ( \$new_attach['" . $yes_no_switches[$i] . "'] == '0' ) ? 'checked=\"checked\"' : '';"); + } + + if (!function_exists('ftp_connect')) + { + $template->assign_block_vars('switch_no_ftp', array()); + } + else + { + $template->assign_block_vars('switch_ftp', array()); + } + + $template->assign_vars(array( + 'TPL_ATTACH_MANAGE' => true, + + 'L_MANAGE_TITLE' => $lang['ATTACH_SETTINGS'], + 'L_MANAGE_EXPLAIN' => $lang['MANAGE_ATTACHMENTS_EXPLAIN'], + 'L_ATTACHMENT_SETTINGS' => $lang['ATTACH_SETTINGS'], + 'L_ATTACHMENT_FILESIZE_SETTINGS' => $lang['ATTACH_FILESIZE_SETTINGS'], + 'L_ATTACHMENT_NUMBER_SETTINGS' => $lang['ATTACH_NUMBER_SETTINGS'], + 'L_ATTACHMENT_OPTIONS_SETTINGS' => $lang['ATTACH_OPTIONS_SETTINGS'], + 'L_ATTACHMENT_FTP_SETTINGS' => $lang['FTP_INFO'], + 'L_NO_FTP_EXTENSIONS' => $lang['NO_FTP_EXTENSIONS_INSTALLED'], + 'L_UPLOAD_DIR' => $lang['UPLOAD_DIRECTORY'], + 'L_UPLOAD_DIR_EXPLAIN' => $lang['UPLOAD_DIRECTORY_EXPLAIN'], + 'L_ATTACHMENT_IMG_PATH' => $lang['ATTACH_IMG_PATH'], + 'L_IMG_PATH_EXPLAIN' => $lang['ATTACH_IMG_PATH_EXPLAIN'], + 'L_ATTACHMENT_TOPIC_ICON' => $lang['ATTACH_TOPIC_ICON'], + 'L_TOPIC_ICON_EXPLAIN' => $lang['ATTACH_TOPIC_ICON_EXPLAIN'], + 'L_DISPLAY_ORDER' => $lang['ATTACH_DISPLAY_ORDER'], + 'L_DISPLAY_ORDER_EXPLAIN' => $lang['ATTACH_DISPLAY_ORDER_EXPLAIN'], + 'L_MAX_FILESIZE' => $lang['MAX_FILESIZE_ATTACH'], + 'L_MAX_FILESIZE_EXPLAIN' => $lang['MAX_FILESIZE_ATTACH_EXPLAIN'], + 'L_PM_ATTACH' => $lang['PM_ATTACHMENTS'], + 'L_PM_ATTACH_EXPLAIN' => $lang['PM_ATTACHMENTS_EXPLAIN'], + 'L_ATTACHMENT_FTP_PATH' => $lang['ATTACH_FTP_PATH'], + 'L_ATTACHMENT_FTP_USER' => $lang['FTP_USERNAME'], + 'L_ATTACHMENT_FTP_PASS' => $lang['FTP_PASSWORD'], + 'L_ATTACHMENT_FTP_PATH_EXPLAIN' => $lang['ATTACH_FTP_PATH_EXPLAIN'], + 'L_ATTACHMENT_FTP_SERVER' => $lang['FTP_SERVER'], + 'L_ATTACHMENT_FTP_SERVER_EXPLAIN' => $lang['FTP_SERVER_EXPLAIN'], + 'L_DOWNLOAD_PATH' => $lang['FTP_DOWNLOAD_PATH'], + 'L_DOWNLOAD_PATH_EXPLAIN' => $lang['FTP_DOWNLOAD_PATH_EXPLAIN'], + + 'S_ATTACH_ACTION' => append_sid('admin_attachments.php?mode=manage'), + 'S_FILESIZE' => $select_size_mode, + 'S_FILESIZE_QUOTA' => $select_quota_size_mode, + 'S_FILESIZE_PM' => $select_pm_size_mode, + 'S_DEFAULT_UPLOAD_LIMIT' => default_quota_limit_select('default_upload_quota', intval(trim($new_attach['default_upload_quota']))), + 'S_DEFAULT_PM_LIMIT' => default_quota_limit_select('default_pm_quota', intval(trim($new_attach['default_pm_quota']))), + + 'UPLOAD_DIR' => $new_attach['upload_dir'], + 'ATTACHMENT_IMG_PATH' => $new_attach['upload_img'], + 'TOPIC_ICON' => $new_attach['topic_icon'], + 'MAX_FILESIZE' => $new_attach['max_filesize'], + 'ATTACHMENT_QUOTA' => $new_attach['attachment_quota'], + 'MAX_FILESIZE_PM' => $new_attach['max_filesize_pm'], + 'MAX_ATTACHMENTS' => $new_attach['max_attachments'], + 'MAX_ATTACHMENTS_PM' => $new_attach['max_attachments_pm'], + 'FTP_SERVER' => $new_attach['ftp_server'], + 'FTP_PATH' => $new_attach['ftp_path'], + 'FTP_USER' => $new_attach['ftp_user'], + 'FTP_PASS' => $new_attach['ftp_pass'], + 'DOWNLOAD_PATH' => $new_attach['download_path'], + 'DISABLE_MOD_YES' => $disable_mod_yes, + 'DISABLE_MOD_NO' => $disable_mod_no, + 'PM_ATTACH_YES' => $allow_pm_attach_yes, + 'PM_ATTACH_NO' => $allow_pm_attach_no, + 'FTP_UPLOAD_YES' => $allow_ftp_upload_yes, + 'FTP_UPLOAD_NO' => $allow_ftp_upload_no, + 'FTP_PASV_MODE_YES' => $ftp_pasv_mode_yes, + 'FTP_PASV_MODE_NO' => $ftp_pasv_mode_no, + 'DISPLAY_ORDER_ASC' => $display_order_yes, + 'DISPLAY_ORDER_DESC' => $display_order_no, + )); +} + +if ($submit && $mode == 'cats') +{ + if (!$error) + { + message_die(GENERAL_MESSAGE, $lang['ATTACH_CONFIG_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', '')); + } +} + +if ($mode == 'cats') +{ + $s_assigned_group_images = $lang['NONE']; + $s_assigned_group_streams = $lang['NONE']; + $s_assigned_group_flash = $lang['NONE']; + + $sql = 'SELECT group_name, cat_id + FROM ' . BB_EXTENSION_GROUPS . ' + WHERE cat_id > 0 + ORDER BY cat_id'; + + $s_assigned_group_images = array(); + $s_assigned_group_streams = array(); + $s_assigned_group_flash = array(); + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Group Names from ' . BB_EXTENSION_GROUPS, '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < sizeof($row); $i++) + { + if ($row[$i]['cat_id'] == IMAGE_CAT) + { + $s_assigned_group_images[] = $row[$i]['group_name']; + } + else if ($row[$i]['cat_id'] == STREAM_CAT) + { + $s_assigned_group_streams[] = $row[$i]['group_name']; + } + else if ($row[$i]['cat_id'] == SWF_CAT) + { + $s_assigned_group_flash[] = $row[$i]['group_name']; + } + } + + $display_inlined_yes = ( $new_attach['img_display_inlined'] != '0' ) ? 'checked="checked"' : ''; + $display_inlined_no = ( $new_attach['img_display_inlined'] == '0' ) ? 'checked="checked"' : ''; + + $create_thumbnail_yes = ( $new_attach['img_create_thumbnail'] != '0' ) ? 'checked="checked"' : ''; + $create_thumbnail_no = ( $new_attach['img_create_thumbnail'] == '0' ) ? 'checked="checked"' : ''; + + $use_gd2_yes = ( $new_attach['use_gd2'] != '0' ) ? 'checked="checked"' : ''; + $use_gd2_no = ( $new_attach['use_gd2'] == '0' ) ? 'checked="checked"' : ''; + + // Check Thumbnail Support + if (!is_imagick() && !@extension_loaded('gd')) + { + $new_attach['img_create_thumbnail'] = '0'; + } + else + { + $template->assign_block_vars('switch_thumbnail_support', array()); + } + + $template->assign_vars(array( + 'TPL_ATTACH_SPECIAL_CATEGORIES' => true, + + 'L_MANAGE_CAT_TITLE' => $lang['MANAGE_CATEGORIES'], + 'L_MANAGE_CAT_EXPLAIN' => $lang['MANAGE_CATEGORIES_EXPLAIN'], + 'L_SETTINGS_CAT_STREAM' => $lang['SETTINGS_CAT_STREAMS'], + 'L_CREATE_THUMBNAIL' => $lang['IMAGE_CREATE_THUMBNAIL'], + 'L_CREATE_THUMBNAIL_EXPLAIN' => $lang['IMAGE_CREATE_THUMBNAIL_EXPLAIN'], + 'L_MIN_THUMB_FILESIZE' => $lang['IMAGE_MIN_THUMB_FILESIZE'], + 'L_MIN_THUMB_FILESIZE_EXPLAIN' => $lang['IMAGE_MIN_THUMB_FILESIZE_EXPLAIN'], + 'L_IMAGICK_PATH' => $lang['IMAGE_IMAGICK_PATH'], + 'L_IMAGICK_PATH_EXPLAIN' => $lang['IMAGE_IMAGICK_PATH_EXPLAIN'], + 'L_SEARCH_IMAGICK' => $lang['IMAGE_SEARCH_IMAGICK'], + + 'IMAGE_MAX_HEIGHT' => $new_attach['img_max_height'], + 'IMAGE_MAX_WIDTH' => $new_attach['img_max_width'], + + 'IMAGE_LINK_HEIGHT' => $new_attach['img_link_height'], + 'IMAGE_LINK_WIDTH' => $new_attach['img_link_width'], + 'IMAGE_MIN_THUMB_FILESIZE' => $new_attach['img_min_thumb_filesize'], + 'IMAGE_IMAGICK_PATH' => $new_attach['img_imagick'], + + 'DISPLAY_INLINED_YES' => $display_inlined_yes, + 'DISPLAY_INLINED_NO' => $display_inlined_no, + + 'CREATE_THUMBNAIL_YES' => $create_thumbnail_yes, + 'CREATE_THUMBNAIL_NO' => $create_thumbnail_no, + + 'USE_GD2_YES' => $use_gd2_yes, + 'USE_GD2_NO' => $use_gd2_no, + + 'S_ASSIGNED_GROUP_IMAGES' => implode(', ', $s_assigned_group_images), + 'S_ATTACH_ACTION' => append_sid('admin_attachments.php?mode=cats')) + ); +} + +// Check Cat Settings +if ($check_image_cat) +{ + // Some tests... + $attach_config = array(); + + $sql = 'SELECT * + FROM ' . BB_ATTACH_CONFIG; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not find Attachment Config Table', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < $num_rows; $i++) + { + $attach_config[$row[$i]['config_name']] = trim($row[$i]['config_value']); + } + + if ($attach_config['upload_dir'][0] == '/' || ($attach_config['upload_dir'][0] != '/' && $attach_config['upload_dir'][1] == ':')) + { + $upload_dir = $attach_config['upload_dir']; + } + else + { + $upload_dir = BB_ROOT . $attach_config['upload_dir']; + } + + $upload_dir = $upload_dir . '/' . THUMB_DIR; + + $error = false; + + // Does the target directory exist, is it a directory and writeable. (only test if ftp upload is disabled) + if (intval($attach_config['allow_ftp_upload']) == 0 && intval($attach_config['img_create_thumbnail']) == 1) + { + if ( !@file_exists(@amod_realpath($upload_dir)) ) + { + @mkdir($upload_dir, 0755); + @chmod($upload_dir, 0777); + + if ( !@file_exists(@amod_realpath($upload_dir)) ) + { + $error = TRUE; + $error_msg = sprintf($lang['DIRECTORY_DOES_NOT_EXIST'], $upload_dir) . '
'; + } + + } + + if (!$error && !is_dir($upload_dir)) + { + $error = TRUE; + $error_msg = sprintf($lang['DIRECTORY_IS_NOT_A_DIR'], $upload_dir) . '
'; + } + + if (!$error) + { + if ( !($fp = @fopen($upload_dir . '/0_000000.000', 'w')) ) + { + $error = TRUE; + $error_msg = sprintf($lang['DIRECTORY_NOT_WRITEABLE'], $upload_dir) . '
'; + } + else + { + @fclose($fp); + @unlink($upload_dir . '/0_000000.000'); + } + } + } + else if (intval($attach_config['allow_ftp_upload']) && intval($attach_config['img_create_thumbnail'])) + { + // Check FTP Settings + $server = ( empty($attach_config['ftp_server']) ) ? 'localhost' : $attach_config['ftp_server']; + + $conn_id = @ftp_connect($server); + + if (!$conn_id) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_CONNECT'], $server) . '
'; + } + + $login_result = @ftp_login($conn_id, $attach_config['ftp_user'], $attach_config['ftp_pass']); + + if (!$login_result && !$error) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_LOGIN'], $attach_config['ftp_user']) . '
'; + } + + if (!@ftp_pasv($conn_id, intval($attach_config['ftp_pasv_mode']))) + { + $error = TRUE; + $error_msg = $lang['FTP_ERROR_PASV_MODE']; + } + + if (!$error) + { + // Check Upload + $tmpfname = @tempnam('/tmp', 't0000'); + + @unlink($tmpfname); // unlink for safety on php4.0.3+ + + $fp = @fopen($tmpfname, 'w'); + + @fwrite($fp, 'test'); + + @fclose($fp); + + $result = @ftp_chdir($conn_id, $attach_config['ftp_path'] . '/' . THUMB_DIR); + + if (!$result) + { + @ftp_mkdir($conn_id, $attach_config['ftp_path'] . '/' . THUMB_DIR); + } + + $result = @ftp_chdir($conn_id, $attach_config['ftp_path'] . '/' . THUMB_DIR); + + if (!$result) + { + + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_PATH'], $attach_config['ftp_path'] . '/' . THUMB_DIR) . '
'; + } + else + { + $res = @ftp_put($conn_id, 't0000', $tmpfname, FTP_ASCII); + + if (!$res) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_UPLOAD'], $attach_config['ftp_path'] . '/' . THUMB_DIR) . '
'; + } + else + { + $res = @ftp_delete($conn_id, 't0000'); + + if (!$res) + { + $error = TRUE; + $error_msg = sprintf($lang['FTP_ERROR_DELETE'], $attach_config['ftp_path'] . '/' . THUMB_DIR) . '
'; + } + } + } + + @ftp_quit($conn_id); + + @unlink($tmpfname); + } + } + + if (!$error) + { + message_die(GENERAL_MESSAGE, $lang['TEST_SETTINGS_SUCCESSFUL'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', '')); + } +} + +// Quota Limit Settings +if ($submit && $mode == 'quota') +{ + // Change Quota Limit + $quota_change_list = get_var('quota_change_list', array(0)); + $quota_desc_list = get_var('quota_desc_list', array('')); + $filesize_list = get_var('max_filesize_list', array(0)); + $size_select_list = get_var('size_select_list', array('')); + + $allowed_list = array(); + + for ($i = 0; $i < sizeof($quota_change_list); $i++) + { + $filesize_list[$i] = ( $size_select_list[$i] == 'kb' ) ? round($filesize_list[$i] * 1024) : ( ($size_select_list[$i] == 'mb') ? round($filesize_list[$i] * 1048576) : $filesize_list[$i] ); + + $sql = 'UPDATE ' . BB_QUOTA_LIMITS . " + SET quota_desc = '" . attach_mod_sql_escape($quota_desc_list[$i]) . "', quota_limit = " . (int) $filesize_list[$i] . " + WHERE quota_limit_id = " . (int) $quota_change_list[$i]; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t update Quota Limits', '', __LINE__, __FILE__, $sql); + } + } + + // Delete Quota Limits + $quota_id_list = get_var('quota_id_list', array(0)); + + $quota_id_sql = implode(', ', $quota_id_list); + + if ($quota_id_sql != '') + { + $sql = 'DELETE + FROM ' . BB_QUOTA_LIMITS . ' + WHERE quota_limit_id IN (' . $quota_id_sql . ')'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not delete Quota Limits', '', __LINE__, __FILE__, $sql); + } + + // Delete Quotas linked to this setting + $sql = 'DELETE + FROM ' . BB_QUOTA . ' + WHERE quota_limit_id IN (' . $quota_id_sql . ')'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not delete Quotas', '', __LINE__, __FILE__, $sql); + } + } + + // Add Quota Limit ? + $quota_desc = get_var('quota_description', ''); + $filesize = get_var('add_max_filesize', 0); + $size_select = get_var('add_size_select', ''); + $add = ( isset($_POST['add_quota_check']) ) ? TRUE : FALSE; + + if ($quota_desc != '' && $add) + { + // check Quota Description + $sql = 'SELECT quota_desc + FROM ' . BB_QUOTA_LIMITS; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not query Quota Limits Table', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ( $num_rows > 0 ) + { + for ($i = 0; $i < $num_rows; $i++) + { + if ($row[$i]['quota_desc'] == $quota_desc) + { + $error = TRUE; + if( isset($error_msg) ) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['QUOTA_LIMIT_EXIST'], $extension_group); + } + } + } + + if (!$error) + { + $filesize = ( $size_select == 'kb' ) ? round($filesize * 1024) : ( ($size_select == 'mb') ? round($filesize * 1048576) : $filesize ); + + $sql = "INSERT INTO " . BB_QUOTA_LIMITS . " (quota_desc, quota_limit) + VALUES ('" . attach_mod_sql_escape($quota_desc) . "', " . (int) $filesize . ")"; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not add Quota Limit', '', __LINE__, __FILE__, $sql); + } + } + + } + + if (!$error) + { + $message = $lang['ATTACH_CONFIG_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $message); + } + +} + +if ($mode == 'quota') +{ + $max_add_filesize = $attach_config['max_filesize']; + $size = ($max_add_filesize >= 1048576) ? 'mb' : ( ($max_add_filesize >= 1024) ? 'kb' : 'b' ); + + if ($max_add_filesize >= 1048576) + { + $max_add_filesize = round($max_add_filesize / 1048576 * 100) / 100; + } + else if ( $max_add_filesize >= 1024) + { + $max_add_filesize = round($max_add_filesize / 1024 * 100) / 100; + } + + $template->assign_vars(array( + 'TPL_ATTACH_QUOTA' => true, + + 'L_MANAGE_QUOTAS_TITLE' => $lang['MANAGE_QUOTAS'], + 'L_SIZE' => $lang['MAX_FILESIZE_ATTACH'], + 'MAX_FILESIZE' => $max_add_filesize, + + 'S_FILESIZE' => size_select('add_size_select', $size), + + 'S_ATTACH_ACTION' => append_sid('admin_attachments.php?mode=quota')) + ); + + $sql = "SELECT * FROM " . BB_QUOTA_LIMITS . " ORDER BY quota_limit DESC"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get quota limits', '', __LINE__, __FILE__, $sql); + } + + $rows = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < sizeof($rows); $i++) + { + $size_format = ($rows[$i]['quota_limit'] >= 1048576) ? 'mb' : ( ($rows[$i]['quota_limit'] >= 1024) ? 'kb' : 'b' ); + + if ( $rows[$i]['quota_limit'] >= 1048576) + { + $rows[$i]['quota_limit'] = round($rows[$i]['quota_limit'] / 1048576 * 100) / 100; + } + else if($rows[$i]['quota_limit'] >= 1024) + { + $rows[$i]['quota_limit'] = round($rows[$i]['quota_limit'] / 1024 * 100) / 100; + } + + $template->assign_block_vars('limit_row', array( + 'QUOTA_NAME' => $rows[$i]['quota_desc'], + 'QUOTA_ID' => $rows[$i]['quota_limit_id'], + 'S_FILESIZE' => size_select('size_select_list[]', $size_format), + 'U_VIEW' => append_sid("admin_attachments.php?mode=$mode&e_mode=view_quota&quota_id=" . $rows[$i]['quota_limit_id']), + 'MAX_FILESIZE' => $rows[$i]['quota_limit']) + ); + } +} + +if ($mode == 'quota' && $e_mode == 'view_quota') +{ + $quota_id = get_var('quota_id', 0); + + if (!$quota_id) + { + message_die(GENERAL_MESSAGE, 'Invalid Call'); + } + + $template->assign_block_vars('switch_quota_limit_desc', array()); + + $sql = "SELECT * FROM " . BB_QUOTA_LIMITS . " WHERE quota_limit_id = " . (int) $quota_id . " LIMIT 1"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get quota limits', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $template->assign_vars(array( + 'L_QUOTA_LIMIT_DESC' => $row['quota_desc'], + )); + + $sql = 'SELECT q.user_id, u.username, q.quota_type + FROM ' . BB_QUOTA . ' q, ' . BB_USERS . ' u + WHERE q.quota_limit_id = ' . (int) $quota_id . ' + AND q.user_id <> 0 + AND q.user_id = u.user_id'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get quota limits', '', __LINE__, __FILE__, $sql); + } + + $rows = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < $num_rows; $i++) + { + if ($rows[$i]['quota_type'] == QUOTA_UPLOAD_LIMIT) + { + $template->assign_block_vars('users_upload_row', array( + 'USER_ID' => $rows[$i]['user_id'], + 'USERNAME' => $rows[$i]['username']) + ); + } + else if ($rows[$i]['quota_type'] == QUOTA_PM_LIMIT) + { + $template->assign_block_vars('users_pm_row', array( + 'USER_ID' => $rows[$i]['user_id'], + 'USERNAME' => $rows[$i]['username']) + ); + } + } + + $sql = 'SELECT q.group_id, g.group_name, q.quota_type + FROM ' . BB_QUOTA . ' q, ' . BB_GROUPS . ' g + WHERE q.quota_limit_id = ' . (int) $quota_id . ' + AND q.group_id <> 0 + AND q.group_id = g.group_id'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get quota limits', '', __LINE__, __FILE__, $sql); + } + + $rows = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < $num_rows; $i++) + { + if ($rows[$i]['quota_type'] == QUOTA_UPLOAD_LIMIT) + { + $template->assign_block_vars('groups_upload_row', array( + 'GROUP_ID' => $rows[$i]['group_id'], + 'GROUPNAME' => $rows[$i]['group_name']) + ); + } + else if ($rows[$i]['quota_type'] == QUOTA_PM_LIMIT) + { + $template->assign_block_vars('groups_pm_row', array( + 'GROUP_ID' => $rows[$i]['group_id'], + 'GROUPNAME' => $rows[$i]['group_name']) + ); + } + } +} + +if ($error) +{ + $template->assign_vars(array('ERROR_MESSAGE' => $error_msg)); +} + +print_page('admin_attachments.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_board.php b/upload/admin/admin_board.php new file mode 100644 index 000000000..92ed102d2 --- /dev/null +++ b/upload/admin/admin_board.php @@ -0,0 +1,178 @@ +sql_query($sql)) +{ + message_die(CRITICAL_ERROR, "Could not query config information in admin_board", "", __LINE__, __FILE__, $sql); +} +else +{ + while( $row = DB()->sql_fetchrow($result) ) + { + $config_name = $row['config_name']; + $config_value = $row['config_value']; + $default_config[$config_name] = $config_value; + + $new[$config_name] = isset($_POST[$config_name]) ? $_POST[$config_name] : $default_config[$config_name]; + + // Attempt to prevent a mistake with this value. + if ($config_name == 'avatar_path') + { + $new['avatar_path'] = trim($new['avatar_path']); + if (strstr($new['avatar_path'], "\0") || !is_dir(BB_ROOT . $new['avatar_path']) || !is_writable(BB_ROOT . $new['avatar_path'])) + { + $new['avatar_path'] = $default_config['avatar_path']; + } + } + + if (isset($_POST['submit']) && $row['config_value'] != $new[$config_name]) + { + bb_update_config(array($config_name => $new[$config_name])); + } + } + + if( isset($_POST['submit']) ) + { + $message = $lang['CONFIG_UPDATED'] . "

" . sprintf($lang['CLICK_RETURN_CONFIG'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + } +} + +$lang_select = language_select($new['default_lang'], 'default_lang', "language"); +$timezone_select = tz_select($new['board_timezone'], 'board_timezone'); + +$disable_board_yes = ( $new['board_disable'] ) ? "checked=\"checked\"" : ""; +$disable_board_no = ( !$new['board_disable'] ) ? "checked=\"checked\"" : ""; + +$bbcode_yes = ( $new['allow_bbcode'] ) ? "checked=\"checked\"" : ""; +$bbcode_no = ( !$new['allow_bbcode'] ) ? "checked=\"checked\"" : ""; + +$activation_none = ( $new['require_activation'] == USER_ACTIVATION_NONE ) ? "checked=\"checked\"" : ""; +$activation_user = ( $new['require_activation'] == USER_ACTIVATION_SELF ) ? "checked=\"checked\"" : ""; +$activation_admin = ( $new['require_activation'] == USER_ACTIVATION_ADMIN ) ? "checked=\"checked\"" : ""; + +$confirm_yes = ($new['enable_confirm']) ? 'checked="checked"' : ''; +$confirm_no = (!$new['enable_confirm']) ? 'checked="checked"' : ''; + +$allow_autologin_yes = ($new['allow_autologin']) ? 'checked="checked"' : ''; +$allow_autologin_no = (!$new['allow_autologin']) ? 'checked="checked"' : ''; + +$board_email_form_yes = ( $new['board_email_form'] ) ? "checked=\"checked\"" : ""; +$board_email_form_no = ( !$new['board_email_form'] ) ? "checked=\"checked\"" : ""; + +$privmsg_on = ( !$new['privmsg_disable'] ) ? "checked=\"checked\"" : ""; +$privmsg_off = ( $new['privmsg_disable'] ) ? "checked=\"checked\"" : ""; + +$prune_yes = ( $new['prune_enable'] ) ? "checked=\"checked\"" : ""; +$prune_no = ( !$new['prune_enable'] ) ? "checked=\"checked\"" : ""; + +$smile_yes = ( $new['allow_smilies'] ) ? "checked=\"checked\"" : ""; +$smile_no = ( !$new['allow_smilies'] ) ? "checked=\"checked\"" : ""; + +$sig_yes = ( $new['allow_sig'] ) ? "checked=\"checked\"" : ""; +$sig_no = ( !$new['allow_sig'] ) ? "checked=\"checked\"" : ""; + +$namechange_yes = ( $new['allow_namechange'] ) ? "checked=\"checked\"" : ""; +$namechange_no = ( !$new['allow_namechange'] ) ? "checked=\"checked\"" : ""; + +$avatars_local_yes = ( $new['allow_avatar_local'] ) ? "checked=\"checked\"" : ""; +$avatars_local_no = ( !$new['allow_avatar_local'] ) ? "checked=\"checked\"" : ""; +$avatars_remote_yes = ( $new['allow_avatar_remote'] ) ? "checked=\"checked\"" : ""; +$avatars_remote_no = ( !$new['allow_avatar_remote'] ) ? "checked=\"checked\"" : ""; +$avatars_upload_yes = ( $new['allow_avatar_upload'] ) ? "checked=\"checked\"" : ""; +$avatars_upload_no = ( !$new['allow_avatar_upload'] ) ? "checked=\"checked\"" : ""; + +$smtp_yes = ( $new['smtp_delivery'] ) ? "checked=\"checked\"" : ""; +$smtp_no = ( !$new['smtp_delivery'] ) ? "checked=\"checked\"" : ""; + +// +// Escape any quotes in the site description for proper display in the text +// box on the admin page +// +$template->assign_vars(array( + "S_CONFIG_ACTION"=> append_sid("admin_board.php"), + + "SITENAME" => htmlCHR($new['sitename']), + "CONFIG_SITE_DESCRIPTION" => htmlCHR($new['site_desc']), + "S_DISABLE_BOARD_YES" => $disable_board_yes, + "S_DISABLE_BOARD_NO" => $disable_board_no, + "ACTIVATION_NONE" => USER_ACTIVATION_NONE, + "ACTIVATION_NONE_CHECKED" => $activation_none, + "ACTIVATION_USER" => USER_ACTIVATION_SELF, + "ACTIVATION_USER_CHECKED" => $activation_user, + "ACTIVATION_ADMIN" => USER_ACTIVATION_ADMIN, + "ACTIVATION_ADMIN_CHECKED" => $activation_admin, + "CONFIRM_ENABLE" => $confirm_yes, + "CONFIRM_DISABLE" => $confirm_no, + "ALLOW_AUTOLOGIN_YES" => $allow_autologin_yes, + "ALLOW_AUTOLOGIN_NO" => $allow_autologin_no, + "AUTOLOGIN_TIME" => (int) $new['max_autologin_time'], + "BOARD_EMAIL_FORM_ENABLE" => $board_email_form_yes, + "BOARD_EMAIL_FORM_DISABLE" => $board_email_form_no, + "MAX_POLL_OPTIONS" => $new['max_poll_options'], + "FLOOD_INTERVAL" => $new['flood_interval'], + "TOPICS_PER_PAGE" => $new['topics_per_page'], + "POSTS_PER_PAGE" => $new['posts_per_page'], + "HOT_TOPIC" => $new['hot_threshold'], + "LANG_SELECT" => $lang_select, + "DEFAULT_DATEFORMAT" => $new['default_dateformat'], + "TIMEZONE_SELECT" => $timezone_select, + "S_PRIVMSG_ENABLED" => $privmsg_on, + "S_PRIVMSG_DISABLED" => $privmsg_off, + "INBOX_LIMIT" => $new['max_inbox_privmsgs'], + "SENTBOX_LIMIT" => $new['max_sentbox_privmsgs'], + "SAVEBOX_LIMIT" => $new['max_savebox_privmsgs'], + "MAX_LOGIN_ATTEMPTS" => $new['max_login_attempts'], + "LOGIN_RESET_TIME" => $new['login_reset_time'], + "PRUNE_YES" => $prune_yes, + "PRUNE_NO" => $prune_no, + "BBCODE_YES" => $bbcode_yes, + "BBCODE_NO" => $bbcode_no, + "SMILE_YES" => $smile_yes, + "SMILE_NO" => $smile_no, + "SIG_YES" => $sig_yes, + "SIG_NO" => $sig_no, + "SIG_SIZE" => $new['max_sig_chars'], + "NAMECHANGE_YES" => $namechange_yes, + "NAMECHANGE_NO" => $namechange_no, + "AVATARS_LOCAL_YES" => $avatars_local_yes, + "AVATARS_LOCAL_NO" => $avatars_local_no, + "AVATARS_REMOTE_YES" => $avatars_remote_yes, + "AVATARS_REMOTE_NO" => $avatars_remote_no, + "AVATARS_UPLOAD_YES" => $avatars_upload_yes, + "AVATARS_UPLOAD_NO" => $avatars_upload_no, + "AVATAR_FILESIZE" => $new['avatar_filesize'], + "AVATAR_MAX_HEIGHT" => $new['avatar_max_height'], + "AVATAR_MAX_WIDTH" => $new['avatar_max_width'], + "AVATAR_PATH" => $new['avatar_path'], + "AVATAR_GALLERY_PATH" => $new['avatar_gallery_path'], + "SMILIES_PATH" => $new['smilies_path'], + "INBOX_PRIVMSGS" => $new['max_inbox_privmsgs'], + "SENTBOX_PRIVMSGS" => $new['max_sentbox_privmsgs'], + "SAVEBOX_PRIVMSGS" => $new['max_savebox_privmsgs'], + "EMAIL_FROM" => $new['board_email'], + "EMAIL_SIG" => $new['board_email_sig'], + "SMTP_YES" => $smtp_yes, + "SMTP_NO" => $smtp_no, + "SMTP_HOST" => $new['smtp_host'], + "SMTP_USERNAME" => $new['smtp_username'], + "SMTP_PASSWORD" => $new['smtp_password']) +); + +print_page('admin_board.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_bt_forum_cfg.php b/upload/admin/admin_bt_forum_cfg.php new file mode 100644 index 000000000..892ca642c --- /dev/null +++ b/upload/admin/admin_bt_forum_cfg.php @@ -0,0 +1,157 @@ + 'http://yourdomain.com/bt/', + 'bt_add_comment' => '', + 'bt_add_publisher' => '', +); + +$default_cfg_bool = array( + 'bt_disable_dht' => 1, + 'bt_show_peers' => 1, + 'bt_add_auth_key' => 1, + 'bt_show_dl_list' => 0, + 'bt_dl_list_only_1st_page' => 1, + 'bt_dl_list_only_count' => 1, + 'bt_gen_passkey_on_reg' => 1, + 'bt_replace_ann_url' => 1, + 'bt_show_ip_only_moder' => 1, + 'bt_show_port_only_moder' => 1, + 'bt_check_announce_url' => 0, + 'bt_show_dl_list_buttons' => 1, + 'bt_show_dl_but_will' => 1, + 'bt_show_dl_but_down' => 0, + 'bt_show_dl_but_compl' => 1, + 'bt_show_dl_but_cancel' => 1, + 'bt_show_dl_stat_on_index' => 1, + 'bt_newtopic_auto_reg' => 1, + 'bt_tor_browse_only_reg' => 1, + 'bt_search_bool_mode' => 1, + 'bt_allow_spmode_change' => 1, + 'bt_del_addit_ann_urls' => 1, + 'bt_set_dltype_on_tor_reg' => 1, + 'bt_unset_dltype_on_tor_unreg' => 0, +); + +$default_cfg_num = array( + 'bt_show_peers_mode' => SHOW_PEERS_COUNT, +); + +$default_cfg = array_merge($default_cfg_str, $default_cfg_bool, $default_cfg_num); + +$db_fields_bool = array( + 'allow_reg_tracker' => 0, // Allowed forums for registering torrents on tracker + 'allow_dl_topic' => 0, // Allowed forums for dl-topics + 'self_moderated' => 0, // Users can move theirs topic to another forum +); + +// Get config +$cfg = bb_get_config(BB_CONFIG, true, false); + +// Submit new config +if ($submit && $confirm) +{ + foreach ($db_fields_bool as $field_name => $field_def_val) + { + update_table_bool(BB_FORUMS, 'forum_id', $field_name, $field_def_val); + } + + update_config_table(BB_CONFIG, $default_cfg_str, $cfg, 'str'); + update_config_table(BB_CONFIG, $default_cfg_bool, $cfg, 'bool'); + update_config_table(BB_CONFIG, $default_cfg_num, $cfg, 'num'); + + $datastore->update('cat_forums'); + + $message = $lang['CONFIG_UPD'] .'

'. sprintf($lang['RETURN_CONFIG'], '', '') .'

'. sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + message_die(GENERAL_MESSAGE, $message); +} + +// Set template vars +set_tpl_vars ($default_cfg_str, $cfg); +set_tpl_vars_lang ($default_cfg_str); + +set_tpl_vars_bool ($default_cfg_bool, $cfg); +set_tpl_vars_lang ($default_cfg_bool); + +set_tpl_vars ($default_cfg_num, $cfg); +set_tpl_vars_lang ($default_cfg_num); + +set_tpl_vars_lang ($db_fields_bool); + +// Get Forums list +$sql = "SELECT f.* + FROM ". BB_CATEGORIES ." c, ". BB_FORUMS ." f + WHERE f.cat_id = c.cat_id + ORDER BY c.cat_order, f.forum_order"; + +if (!$result = DB()->sql_query($sql)) +{ + message_die(GENERAL_ERROR, 'Could not obtain forum names', '', __LINE__, __FILE__, $sql); +} + +$rowset = DB()->sql_fetchrowset($result); +$forum_rows = min($max_forum_rows, count($rowset)); + +foreach ($db_fields_bool as $field_name => $field_def_val) +{ + $$field_name = ''; +} + +foreach ($rowset as $rid => $forum) +{ + foreach ($db_fields_bool as $field_name => $field_def_val) + { + $forum_name = $forum['forum_name']; + $selected = ($forum[$field_name]) ? ' selected="selected"' : ''; + + $forum_name = str_short($forum_name, $max_forum_name_len); + + $$field_name .= '\n"; + } +} + +foreach ($db_fields_bool as $field_name => $field_def_val) +{ + $$field_name = ''; + $template->assign_vars(array('S_'. strtoupper($field_name) => $$field_name)); +} + +$template->assign_vars(array( + 'L_BT_SHOW_PEERS_MODE_COUNT' => ($cfg['bt_show_peers_mode'] == SHOW_PEERS_COUNT) ? ''. $lang['BT_SHOW_PEERS_MODE_COUNT'] .'' : $lang['BT_SHOW_PEERS_MODE_COUNT'], + 'L_BT_SHOW_PEERS_MODE_NAMES' => ($cfg['bt_show_peers_mode'] == SHOW_PEERS_NAMES) ? ''. $lang['BT_SHOW_PEERS_MODE_NAMES'] .'' : $lang['BT_SHOW_PEERS_MODE_NAMES'], + 'L_BT_SHOW_PEERS_MODE_FULL' => ($cfg['bt_show_peers_mode'] == SHOW_PEERS_FULL) ? ''. $lang['BT_SHOW_PEERS_MODE_FULL'] .'' : $lang['BT_SHOW_PEERS_MODE_FULL'], + + 'BT_SHOW_PEERS_MODE_COUNT_VAL' => SHOW_PEERS_COUNT, + 'BT_SHOW_PEERS_MODE_NAMES_VAL' => SHOW_PEERS_NAMES, + 'BT_SHOW_PEERS_MODE_FULL_VAL' => SHOW_PEERS_FULL, + + 'BT_SHOW_PEERS_MODE_COUNT_SEL' => ($cfg['bt_show_peers_mode'] == SHOW_PEERS_COUNT) ? HTML_CHECKED : '', + 'BT_SHOW_PEERS_MODE_NAMES_SEL' => ($cfg['bt_show_peers_mode'] == SHOW_PEERS_NAMES) ? HTML_CHECKED : '', + 'BT_SHOW_PEERS_MODE_FULL_SEL' => ($cfg['bt_show_peers_mode'] == SHOW_PEERS_FULL) ? HTML_CHECKED : '', + + 'S_HIDDEN_FIELDS' => '', + 'S_CONFIG_ACTION' => append_sid("admin_bt_forum_cfg.php"), +)); + +print_page('admin_bt_forum_cfg.tpl', 'admin'); diff --git a/upload/admin/admin_bt_tracker_cfg.php b/upload/admin/admin_bt_tracker_cfg.php new file mode 100644 index 000000000..b19179d6b --- /dev/null +++ b/upload/admin/admin_bt_tracker_cfg.php @@ -0,0 +1,65 @@ + 'Tracker is disabled', + 'browser_redirect_url' => 'http://yourdomain.com/', +); + +$default_cfg_bool = array( + 'autoclean' => 1, + 'off' => 0, + 'compact_mode' => 1, + 'update_dlstat' => 1, + 'limit_active_tor' => 0, + 'limit_concurrent_ips' => 0, +); + +$default_cfg_num = array( + 'numwant' => 50, + 'expire_factor' => 4, + 'limit_seed_count' => 20, + 'limit_leech_count' => 4, + 'leech_expire_factor' => 60, + 'limit_seed_ips' => 0, + 'limit_leech_ips' => 0, +); + +// Set template vars +set_tpl_vars ($default_cfg_str, $tr_cfg); +set_tpl_vars_lang ($default_cfg_str); + +set_tpl_vars_bool ($default_cfg_bool, $tr_cfg); +set_tpl_vars_lang ($default_cfg_bool); + +set_tpl_vars ($default_cfg_num, $tr_cfg); +set_tpl_vars_lang ($default_cfg_num); + +$template->assign_vars(array( + 'L_CONFIGURATION_TITLE' => $lang['TRACKER_CFG_TITLE'], + + 'IGNORE_REPORTED_IP' => $bb_cfg['ignore_reported_ip'], + 'ANNOUNCE_INTERVAL' => $bb_cfg['announce_interval'], + 'PASSKEY_KEY' => $bb_cfg['passkey_key'], + 'DISABLE_SUBMIT' => true, + + 'S_HIDDEN_FIELDS' => '', + 'S_CONFIG_ACTION' => append_sid("admin_bt_tracker_cfg.php"), +)); + +print_page('admin_bt_tracker_cfg.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_cron.php b/upload/admin/admin_cron.php new file mode 100644 index 000000000..15896d559 --- /dev/null +++ b/upload/admin/admin_cron.php @@ -0,0 +1,361 @@ +session_start(); + redirect('admin/'.basename(__FILE__) . '?mode=list'); +} +else { + require('./pagestart.php'); +} +// ACP Header - END + +require(LANG_DIR .'lang_admin_cron.php'); +require(INC_DIR .'functions_admin_torrent.php'); +require(INC_DIR .'functions_admin_cron.php'); + +if ($mode == 'list') { + $sql = "SELECT * + FROM ". BB_CRON ." + ORDER BY cron_id"; + + if( !$result1 = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not query cron list", "", __LINE__, __FILE__, $sql); + } + + while($row = DB()->sql_fetchrow($result1)) + { + $cron_id = $row['cron_id']; + $cron_active = $row['cron_active'] ? $lang['YES'] : $lang['NO']; + $cron_title = $row['cron_title']; + $cron_script = $row['cron_script']; + $schedule = $row['schedule']; + $leech = $row['run_day']; + $row_style = ( !($i % 2) ) ? 'row1' : 'row2'; + $last_run = $row['last_run']; + $next_run = $row['next_run']; + $run_count = $row['run_counter']; + + $tpl .= ""; + $tpl .= ""; + $tpl .= "$cron_id"; + $tpl .= "$cron_active"; + $tpl .= "$cron_title"; + $tpl .= "$cron_script"; + $tpl .= " $schedule "; + $tpl .= " $last_run "; + $tpl .= " $next_run "; + $tpl .= " $run_count"; + $tpl .= " + + [Run] + [Edit] + [Del] + + "; + + $tpl .= ""; + + $i++; + } +// $tpl .= ""; + $template->assign_vars(array( + 'TPL_CRON_LIST' => true, + 'LIST' => $tpl, + 'S_CRON_ACTION' => append_sid("admin_cron.php"), + 'S_MODE' => 'list', + )); + + $default_cfg_bool = array( + 'cron_enabled' => true, + ); + $default_cfg_num = array( + 'cron_check_interval' => $bb_cfg['cron_check_interval'], + ); + + $cfg = array_merge($default_cfg_bool, $default_cfg_num); + + set_tpl_vars_bool ($default_cfg_bool, $cfg); + set_tpl_vars_lang ($default_cfg_bool); + + set_tpl_vars ($default_cfg_num, $cfg); + set_tpl_vars_lang ($default_cfg_num); + + //detect cron status + if (@file_exists('../triggers/cron_running')){ + $template->assign_vars(array( + 'CRON_RUNNING' => true, + )); + } + print_page('admin_cron.tpl', 'admin'); +} +if ($mode == 'repair') { + if (@file_exists('../triggers/cron_running')) { + rename("../triggers/cron_running", "../triggers/cron_allowed"); + } + redirect('admin/'.basename(__FILE__) . '?mode=list'); +} +if (($mode == 'run' && $job_id)) { + run_jobs($job_id); + redirect('admin/'.basename(__FILE__) . '?mode=list'); +} + +if ($mode == 'edit' && $job_id) { + $sql = "SELECT * + FROM ". BB_CRON ." + WHERE cron_id = $job_id"; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not query cron", "", __LINE__, __FILE__, $sql); + } + + while($row = DB()->sql_fetchrow($result)) + { + $cron_id = $row['cron_id']; + $cron_active = $row['cron_active']; + $cron_title = $row['cron_title']; + $cron_script = $row['cron_script']; + $schedule = $row['schedule']; + $run_day = $row['run_day']; + $run_time = $row['run_time']; + $run_order = $row['run_order']; + $last_run = $row['last_run']; + $next_run = $row['next_run']; + $run_interval = $row['run_interval']; + $log_enabled = $row['log_enabled']; + $log_file = $row['log_file']; + $log_sql_queries = $row['log_sql_queries']; + $disable_board = $row['disable_board']; + $run_counter = $row['run_counter']; + + } + //build schedule html + $schedule_html = ''; + $schedule_option = 'value="'.$schedule.'"'; + $schedule_selected = 'value="'.$schedule.'" selected="selected"'; + $schedule_result = str_replace( $schedule_option, $schedule_selected, $schedule_html); + //build run_day html + $run_day_html = ''; + // + $template->assign_vars(array( + 'TPL_CRON_EDIT' => true, + 'S_CRON_ACTION' => append_sid("admin_cron.php"), + 'S_MODE' => 'edit', + 'SCHEDULE' => $schedule_result, + 'RUN_DAY' => $run_day_html, + 'L_CRON_EDIT_HEAD' => $lang['CRON_EDIT_HEAD_EDIT'], + )); + + + $default_cfg_str = array( + 'cron_title' => $cron_title, + 'cron_script' => $cron_script, + 'run_time' => $run_time, + 'last_run' => $last_run, + 'next_run' => $next_run, + 'run_interval' => $run_interval, + 'log_file' => $log_file, + ); + $default_cfg_bool = array( + 'cron_active' => $cron_active, + 'log_enabled' => $log_enabled, + 'log_sql_queries' => $log_sql_queries, + 'disable_board' => $disable_board, + ); + $default_cfg_num = array( + 'cron_id' => $cron_id, + 'run_order' => $run_order, + 'run_counter' => $run_counter, + ); + + $cfg = array_merge($default_cfg_str, $default_cfg_bool, $default_cfg_num); + + set_tpl_vars ($default_cfg_str, $cfg); + set_tpl_vars_lang ($default_cfg_str); + + set_tpl_vars_bool ($default_cfg_bool, $cfg); + set_tpl_vars_lang ($default_cfg_bool); + + set_tpl_vars ($default_cfg_num, $cfg); + set_tpl_vars_lang ($default_cfg_num); + + print_page('admin_cron.tpl', 'admin'); +} +if ($mode == 'add') { + + $cron_id = 'none'; + $cron_active = 1; + $cron_title = ''; + $cron_script = ''; + $schedule = ''; + $run_day = ''; + $run_time = ''; + $run_order = 255; + $last_run = '0000-00-00 00:00:00'; + $next_run = '0000-00-00 00:00:00'; + $run_interval = ''; + $log_enabled = 0; + $log_file = ''; + $log_sql_queries = 0; + $disable_board = 0; + $run_counter = 0; + + + //build schedule html + $schedule_html = ''; + $schedule_option = 'value="'.$schedule.'"'; + $schedule_selected = 'value="'.$schedule.'" selected="selected"'; + $schedule_result = str_replace( $schedule_option, $schedule_selected, $schedule_html); + //build run_day html + $run_day_html = ''; + // + $template->assign_vars(array( + 'TPL_CRON_EDIT' => true, + 'S_CRON_ACTION' => append_sid("admin_cron.php"), + 'S_MODE' => 'add', + 'SCHEDULE' => $schedule_result, + 'RUN_DAY' => $run_day_html, + 'L_CRON_EDIT_HEAD' => $lang['CRON_EDIT_HEAD_ADD'], + )); + + + $default_cfg_str = array( + 'cron_title' => $cron_title, + 'cron_script' => $cron_script, + 'run_time' => $run_time, + 'last_run' => $last_run, + 'next_run' => $next_run, + 'run_interval' => $run_interval, + 'log_file' => $log_file, + ); + $default_cfg_bool = array( + 'cron_active' => $cron_active, + 'log_enabled' => $log_enabled, + 'log_sql_queries' => $log_sql_queries, + 'disable_board' => $disable_board, + ); + $default_cfg_num = array( + 'cron_id' => $cron_id, + 'run_order' => $run_order, + 'run_counter' => $run_counter, + ); + + $cfg = array_merge($default_cfg_str, $default_cfg_bool, $default_cfg_num); + + set_tpl_vars ($default_cfg_str, $cfg); + set_tpl_vars_lang ($default_cfg_str); + + set_tpl_vars_bool ($default_cfg_bool, $cfg); + set_tpl_vars_lang ($default_cfg_bool); + + set_tpl_vars ($default_cfg_num, $cfg); + set_tpl_vars_lang ($default_cfg_num); + + print_page('admin_cron.tpl', 'admin'); +} + +if ($mode == 'delete' && $job_id) { + if (isset($_GET['confirm'])) { + delete_jobs($job_id); + redirect('admin/'.basename(__FILE__) . '?mode=list'); + } + else { + message_die(GENERAL_MESSAGE, "Are you sure?
Delete Back"); + } +} + +if ($submit && $confirm) { + if ($_POST['mode'] == 'list') { + if ($cron_action == 'run' && $jobs) { + run_jobs($jobs); + } + else if ($cron_action == 'delete' && $jobs) { + delete_jobs($jobs); + } + else if (($cron_action == 'disable' || $cron_action == 'enable') && $jobs) { + toggle_active($jobs, $cron_action); + } + $bb_cfg_options = array( + 'cron_enabled', + 'cron_check_interval' + ); + foreach ($bb_cfg_options as $option) { + update_config_php($option, $_POST[$option]); + } + redirect('admin/'.basename(__FILE__) . '?mode=list'); + } + else if (validate_cron_post($_POST) == 1) { + if($_POST['mode'] == 'edit') { + update_cron_job($_POST); + } + else if ($_POST['mode'] == 'add'){ + insert_cron_job($_POST); + } + else { + bb_die(); + } + redirect('admin/'.basename(__FILE__) . '?mode=list'); + } + else { + $message = validate_cron_post($_POST); + message_die(GENERAL_MESSAGE, $message); + } + +} \ No newline at end of file diff --git a/upload/admin/admin_disallow.php b/upload/admin/admin_disallow.php new file mode 100644 index 000000000..e510ddaaa --- /dev/null +++ b/upload/admin/admin_disallow.php @@ -0,0 +1,107 @@ +sql_query( $sql ); + if ( !$result ) + { + message_die(GENERAL_ERROR, "Could not add disallowed user.", "",__LINE__, __FILE__, $sql); + } + $message = $lang['DISALLOW_SUCCESSFUL']; + } + + $message .= "

" . sprintf($lang['CLICK_RETURN_DISALLOWADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); +} +else if( isset($_POST['delete_name']) ) +{ + $disallowed_id = ( isset($_POST['disallowed_id']) ) ? intval( $_POST['disallowed_id'] ) : intval( $_GET['disallowed_id'] ); + + $sql = "DELETE FROM " . BB_DISALLOW . " + WHERE disallow_id = $disallowed_id"; + $result = DB()->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't removed disallowed user.", "",__LINE__, __FILE__, $sql); + } + + $message .= $lang['DISALLOWED_DELETED'] . "

" . sprintf($lang['CLICK_RETURN_DISALLOWADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + +} + +// +// Grab the current list of disallowed usernames... +// +$sql = "SELECT * + FROM " . BB_DISALLOW; +$result = DB()->sql_query($sql); +if( !$result ) +{ + message_die(GENERAL_ERROR, "Couldn't get disallowed users.", "", __LINE__, __FILE__, $sql ); +} + +$disallowed = DB()->sql_fetchrowset($result); + +// +// Ok now generate the info for the template, which will be put out no matter +// what mode we are in. +// +$disallow_select = ''; + +$template->assign_vars(array( + "S_DISALLOW_SELECT" => $disallow_select, + "S_FORM_ACTION" => append_sid("admin_disallow.php"), + + "L_DISALLOW_TITLE" => $lang['DISALLOW_CONTROL'], + "L_DELETE_DISALLOW" => $lang['DELETE_DISALLOW_TITLE'], + "L_DELETE_EXPLAIN" => $lang['DELETE_DISALLOW_EXPLAIN'], + "L_ADD" => $lang['ADD_DISALLOW'], + "L_ADD_DISALLOW" => $lang['ADD_DISALLOW_TITLE'], + "L_ADD_EXPLAIN" => $lang['ADD_DISALLOW_EXPLAIN'], +)); + +print_page('admin_disallow.tpl', 'admin'); diff --git a/upload/admin/admin_extensions.php b/upload/admin/admin_extensions.php new file mode 100644 index 000000000..85689bf5b --- /dev/null +++ b/upload/admin/admin_extensions.php @@ -0,0 +1,819 @@ +update('attach_extensions'); +} +register_shutdown_function('update_attach_extensions'); + +require('./pagestart.php'); +// ACP Header - END + +if (!intval($attach_config['allow_ftp_upload'])) +{ + if ( ($attach_config['upload_dir'][0] == '/') || ( ($attach_config['upload_dir'][0] != '/') && ($attach_config['upload_dir'][1] == ':') ) ) + { + $upload_dir = $attach_config['upload_dir']; + } + else + { + $upload_dir = BB_ROOT . $attach_config['upload_dir']; + } +} +else +{ + $upload_dir = $attach_config['download_path']; +} + +include(BB_ROOT .'attach_mod/includes/functions_selects.php'); + +// Check if the language got included +if (!isset($lang['TEST_SETTINGS_SUCCESSFUL'])) +{ + // include_once is used within the function + include_attach_lang(); +} + +// Init Vars +$types_download = array(INLINE_LINK, PHYSICAL_LINK); +$modes_download = array('inline', 'physical'); + +$types_category = array(IMAGE_CAT, STREAM_CAT, SWF_CAT); +$modes_category = array($lang['CATEGORY_IMAGES'], $lang['CATEGORY_STREAM_FILES'], $lang['CATEGORY_SWF_FILES']); + +$size = get_var('size', ''); +$mode = get_var('mode', ''); +$e_mode = get_var('e_mode', ''); + +$submit = (isset($_POST['submit'])) ? TRUE : FALSE; + +// Get Attachment Config +$attach_config = array(); + +$sql = 'SELECT * +FROM ' . bb_ATTACH_CONFIG; + +if ( !($result = DB()->sql_query($sql)) ) +{ + message_die(GENERAL_ERROR, 'Could not query attachment information', '', __LINE__, __FILE__, $sql); +} + +while ($row = DB()->sql_fetchrow($result)) +{ + $attach_config[$row['config_name']] = trim($row['config_value']); +} +DB()->sql_freeresult($result); + +// Extension Management +if ($submit && $mode == 'extensions') +{ + // Change Extensions ? + $extension_change_list = get_var('extension_change_list', array(0)); + $extension_explain_list = get_var('extension_explain_list', array('')); + $group_select_list = get_var('group_select', array(0)); + + // Generate correct Change List + $extensions = array(); + + for ($i = 0; $i < sizeof($extension_change_list); $i++) + { + $extensions['_' . $extension_change_list[$i]]['comment'] = $extension_explain_list[$i]; + $extensions['_' . $extension_change_list[$i]]['group_id'] = intval($group_select_list[$i]); + } + + $sql = 'SELECT * + FROM ' . BB_EXTENSIONS . ' + ORDER BY ext_id'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t get Extension Informations.', '', __LINE__, __FILE__, $sql); + } + + $num_rows = DB()->num_rows($result); + $extension_row = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + if ($num_rows > 0) + { + for ($i = 0; $i < sizeof($extension_row); $i++) + { + if ($extension_row[$i]['comment'] != $extensions['_' . $extension_row[$i]['ext_id']]['comment'] || intval($extension_row[$i]['group_id']) != intval($extensions['_' . $extension_row[$i]['ext_id']]['group_id'])) + { + $sql_ary = array( + 'comment' => (string) $extensions['_' . $extension_row[$i]['ext_id']]['comment'], + 'group_id' => (int) $extensions['_' . $extension_row[$i]['ext_id']]['group_id'] + ); + + $sql = 'UPDATE ' . BB_EXTENSIONS . ' SET ' . attach_mod_sql_build_array('UPDATE', $sql_ary) . ' + WHERE ext_id = ' . (int) $extension_row[$i]['ext_id']; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Couldn\'t update Extension Informations', '', __LINE__, __FILE__, $sql); + } + } + } + } + + // Delete Extension? + $extension_id_list = get_var('extension_id_list', array(0)); + + $extension_id_sql = implode(', ', $extension_id_list); + + if ($extension_id_sql != '') + { + $sql = 'DELETE + FROM ' . BB_EXTENSIONS . ' + WHERE ext_id IN (' . $extension_id_sql . ')'; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete Extensions', '', __LINE__, __FILE__, $sql); + } + } + + // Add Extension ? + $extension = get_var('add_extension', ''); + $extension_explain = get_var('add_extension_explain', ''); + $extension_group = get_var('add_group_select', 0); + $add = ( isset($_POST['add_extension_check']) ) ? TRUE : FALSE; + + if ($extension != '' && $add) + { + $template->assign_vars(array( + 'ADD_EXTENSION' => $extension, + 'ADD_EXTENSION_EXPLAIN' => $extension_explain) + ); + + if (!$error) + { + // check extension + $sql = 'SELECT extension + FROM ' . BB_EXTENSIONS; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not query Extensions', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_rows > 0) + { + for ($i = 0; $i < $num_rows; $i++) + { + if (strtolower(trim($row[$i]['extension'])) == strtolower(trim($extension))) + { + $error = TRUE; + if( isset($error_msg) ) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['EXTENSION_EXIST'], strtolower(trim($extension))); + } + } + } + + if (!$error) + { + $sql_ary = array( + 'group_id' => (int) $extension_group, + 'extension' => (string) strtolower($extension), + 'comment' => (string) $extension_explain + ); + + $sql = 'INSERT INTO ' . BB_EXTENSIONS . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not add Extension', '', __LINE__, __FILE__, $sql); + } + + } + } + } + + if (!@$error) + { + $message = $lang['ATTACH_CONFIG_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $message); + } +} + +if ($mode == 'extensions') +{ + // Extensions + $template->assign_vars(array( + 'TPL_ATTACH_EXTENSIONS' => true, + + 'L_EXTENSIONS_TITLE' => $lang['MANAGE_EXTENSIONS'], + 'L_EXTENSIONS_EXPLAIN' => $lang['MANAGE_EXTENSIONS_EXPLAIN'], + + 'S_CANCEL_ACTION' => append_sid("admin_extensions.php?mode=extensions"), + 'S_ATTACH_ACTION' => append_sid("admin_extensions.php?mode=extensions")) + ); + + if ($submit) + { + $template->assign_vars(array( + 'S_ADD_GROUP_SELECT' => group_select('add_group_select', $extension_group)) + ); + } + else + { + $template->assign_vars(array( + 'S_ADD_GROUP_SELECT' => group_select('add_group_select')) + ); + } + + $sql = 'SELECT * + FROM ' . BB_EXTENSIONS . ' + ORDER BY group_id'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t get Extension informations', '', __LINE__, __FILE__, $sql); + } + + $extension_row = DB()->sql_fetchrowset($result); + $num_extension_row = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_extension_row > 0) + { + $extension_row = sort_multi_array($extension_row, 'group_name', 'ASC'); + + for ($i = 0; $i < $num_extension_row; $i++) + { + if ($submit) + { + $template->assign_block_vars('extension_row', array( + 'EXT_ID' => $extension_row[$i]['ext_id'], + 'EXTENSION' => $extension_row[$i]['extension'], + 'EXTENSION_EXPLAIN' => $extension_explain_list[$i], + 'S_GROUP_SELECT' => group_select('group_select[]', $group_select_list[$i])) + ); + } + else + { + $template->assign_block_vars('extension_row', array( + 'EXT_ID' => $extension_row[$i]['ext_id'], + 'EXTENSION' => $extension_row[$i]['extension'], + 'EXTENSION_EXPLAIN' => $extension_row[$i]['comment'], + 'S_GROUP_SELECT' => group_select('group_select[]', $extension_row[$i]['group_id'])) + ); + } + } + } + +} + +// Extension Groups +if ($submit && $mode == 'groups') +{ + // Change Extension Groups ? + $group_change_list = get_var('group_change_list', array(0)); + $extension_group_list = get_var('extension_group_list', array('')); + $group_allowed_list = get_var('allowed_list', array(0)); + $download_mode_list = get_var('download_mode_list', array(0)); + $category_list = get_var('category_list', array(0)); + $upload_icon_list = get_var('upload_icon_list', array('')); + $filesize_list = get_var('max_filesize_list', array(0)); + $size_select_list = get_var('size_select_list', array('')); + + $allowed_list = array(); + + for ($i = 0; $i < sizeof($group_allowed_list); $i++) + { + for ($j = 0; $j < sizeof($group_change_list); $j++) + { + if ($group_allowed_list[$i] == $group_change_list[$j]) + { + $allowed_list[$j] = 1; + } + } + } + + for ($i = 0; $i < sizeof($group_change_list); $i++) + { + $allowed = (isset($allowed_list[$i])) ? 1 : 0; + + $filesize_list[$i] = ($size_select_list[$i] == 'kb') ? round($filesize_list[$i] * 1024) : ( ($size_select_list[$i] == 'mb') ? round($filesize_list[$i] * 1048576) : $filesize_list[$i] ); + + $sql_ary = array( + 'group_name' => (string) $extension_group_list[$i], + 'cat_id' => (int) $category_list[$i], + 'allow_group' => (int) $allowed, + 'download_mode' => (int) $download_mode_list[$i], + 'upload_icon' => (string) $upload_icon_list[$i], + 'max_filesize' => (int) $filesize_list[$i] + ); + + $sql = 'UPDATE ' . BB_EXTENSION_GROUPS . ' SET ' . attach_mod_sql_build_array('UPDATE', $sql_ary) . ' + WHERE group_id = ' . (int) $group_change_list[$i]; + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t update Extension Groups Informations', '', __LINE__, __FILE__, $sql); + } + } + + // Delete Extension Groups + $group_id_list = get_var('group_id_list', array(0)); + + $group_id_sql = implode(', ', $group_id_list); + + if ($group_id_sql != '') + { + $sql = 'DELETE + FROM ' . BB_EXTENSION_GROUPS . ' + WHERE group_id IN (' . $group_id_sql . ')'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not delete Extension Groups', '', __LINE__, __FILE__, $sql); + } + + // Set corresponding Extensions to a pending Group + $sql = 'UPDATE ' . BB_EXTENSIONS . ' + SET group_id = 0 + WHERE group_id IN (' . $group_id_sql . ')'; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not assign Extensions to Pending Group.', '', __LINE__, __FILE__, $sql); + } + } + + // Add Extensions? + $extension_group = get_var('add_extension_group', ''); + $download_mode = get_var('add_download_mode', 0); + $cat_id = get_var('add_category', 0); + $upload_icon = get_var('add_upload_icon', ''); + $filesize = get_var('add_max_filesize', 0); + $size_select = get_var('add_size_select', ''); + + $is_allowed = (isset($_POST['add_allowed'])) ? 1 : 0; + $add = ( isset($_POST['add_extension_group_check']) ) ? TRUE : FALSE; + + if ($extension_group != '' && $add) + { + // check Extension Group + $sql = 'SELECT group_name + FROM ' . BB_EXTENSION_GROUPS; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not query Extension Groups Table', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_rows > 0) + { + for ($i = 0; $i < $num_rows; $i++) + { + if ($row[$i]['group_name'] == $extension_group) + { + $error = TRUE; + if( isset($error_msg) ) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['EXTENSION_GROUP_EXIST'], $extension_group); + } + } + } + + if (!$error) + { + $filesize = ($size_select == 'kb') ? round($filesize * 1024) : ( ($size_select == 'mb') ? round($filesize * 1048576) : $filesize ); + + $sql_ary = array( + 'group_name' => (string) $extension_group, + 'cat_id' => (int) $cat_id, + 'allow_group' => (int) $is_allowed, + 'download_mode' => (int) $download_mode, + 'upload_icon' => (string) $upload_icon, + 'max_filesize' => (int) $filesize, + 'forum_permissions' => '' + ); + + $sql = 'INSERT INTO ' . BB_EXTENSION_GROUPS . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not add Extension Group', '', __LINE__, __FILE__, $sql); + } + } + + } + + if (!@$error) + { + $message = $lang['ATTACH_CONFIG_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_ATTACH_CONFIG'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $message); + } +} + +if ($mode == 'groups') +{ + // Extension Groups + if (!$size && !$submit) + { + $max_add_filesize = $attach_config['max_filesize']; + + $size = ($max_add_filesize >= 1048576) ? 'mb' : ( ($max_add_filesize >= 1024) ? 'kb' : 'b' ); + } + + if ($max_add_filesize >= 1048576) + { + $max_add_filesize = round($max_add_filesize / 1048576 * 100) / 100; + } + else if ( $max_add_filesize >= 1024) + { + $max_add_filesize = round($max_add_filesize / 1024 * 100) / 100; + } + + $viewgroup = get_var(POST_GROUPS_URL, 0); + + $template->assign_vars(array( + 'TPL_ATTACH_EXTENSION_GROUPS' => true, + + 'L_EXTENSION_GROUPS_TITLE' => $lang['MANAGE_EXTENSION_GROUPS'], + 'L_EXTENSION_GROUPS_EXPLAIN' => $lang['MANAGE_EXTENSION_GROUPS_EXPLAIN'], + 'L_MAX_FILESIZE' => $lang['MAX_GROUPS_FILESIZE'], + 'L_FORUM_PERMISSIONS' => $lang['EXT_GROUP_PERMISSIONS'], + + 'ADD_GROUP_NAME' => ( isset($submit) ) ? @$extension_group : '', + 'MAX_FILESIZE' => $max_add_filesize, + + 'S_FILESIZE' => size_select('add_size_select', $size), + 'S_ADD_DOWNLOAD_MODE' => download_select('add_download_mode'), + 'S_SELECT_CAT' => category_select('add_category'), + 'S_CANCEL_ACTION' => append_sid("admin_extensions.php?mode=groups"), + 'S_ATTACH_ACTION' => append_sid("admin_extensions.php?mode=groups")) + ); + + $sql = 'SELECT * + FROM ' . BB_EXTENSION_GROUPS; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t get Extension Group informations', '', __LINE__, __FILE__, $sql); + } + + $extension_group = DB()->sql_fetchrowset($result); + $num_extension_group = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($i = 0; $i < $num_extension_group; $i++) + { + // Format the filesize + if (!$extension_group[$i]['max_filesize']) + { + $extension_group[$i]['max_filesize'] = $attach_config['max_filesize']; + } + + $size_format = ($extension_group[$i]['max_filesize'] >= 1048576) ? 'mb' : ( ($extension_group[$i]['max_filesize'] >= 1024) ? 'kb' : 'b' ); + + if ( $extension_group[$i]['max_filesize'] >= 1048576) + { + $extension_group[$i]['max_filesize'] = round($extension_group[$i]['max_filesize'] / 1048576 * 100) / 100; + } + else if($extension_group[$i]['max_filesize'] >= 1024) + { + $extension_group[$i]['max_filesize'] = round($extension_group[$i]['max_filesize'] / 1024 * 100) / 100; + } + + $s_allowed = ($extension_group[$i]['allow_group'] == 1) ? 'checked="checked"' : ''; + + $template->assign_block_vars('grouprow', array( + 'GROUP_ID' => $extension_group[$i]['group_id'], + 'EXTENSION_GROUP' => $extension_group[$i]['group_name'], + 'UPLOAD_ICON' => $extension_group[$i]['upload_icon'], + + 'S_ALLOW_SELECTED' => $s_allowed, + 'S_SELECT_CAT' => category_select('category_list[]', $extension_group[$i]['group_id']), + 'S_DOWNLOAD_MODE' => download_select('download_mode_list[]', $extension_group[$i]['group_id']), + 'S_FILESIZE' => size_select('size_select_list[]', $size_format), + + 'MAX_FILESIZE' => $extension_group[$i]['max_filesize'], + 'CAT_BOX' => ( $viewgroup == $extension_group[$i]['group_id'] ) ? $lang['DECOLLAPSE'] : $lang['COLLAPSE'], + 'U_VIEWGROUP' => ( $viewgroup == $extension_group[$i]['group_id'] ) ? append_sid("admin_extensions.php?mode=groups") : append_sid("admin_extensions.php?mode=groups&" . POST_GROUPS_URL . "=" . $extension_group[$i]['group_id']), + 'U_FORUM_PERMISSIONS' => append_sid("admin_extensions.php?mode=$mode&e_mode=perm&e_group=" . $extension_group[$i]['group_id'])) + ); + + if ($viewgroup && $viewgroup == $extension_group[$i]['group_id']) + { + $sql = 'SELECT comment, extension + FROM ' . BB_EXTENSIONS . ' + WHERE group_id = ' . (int) $viewgroup; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Couldn\'t get Extension informations', '', __LINE__, __FILE__, $sql); + } + + $extension = DB()->sql_fetchrowset($result); + $num_extension = DB()->num_rows($result); + DB()->sql_freeresult($result); + + for ($j = 0; $j < $num_extension; $j++) + { + $template->assign_block_vars('grouprow.extensionrow', array( + 'EXPLANATION' => $extension[$j]['comment'], + 'EXTENSION' => $extension[$j]['extension']) + ); + } + } + } +} + +if ($e_mode == 'perm') +{ + $group = get_var('e_group', 0); + + $add_forum = (isset($_POST['add_forum'])) ? TRUE : FALSE; + $delete_forum = (isset($_POST['del_forum'])) ? TRUE : FALSE; + + if (isset($_POST['close_perm'])) + { + $e_mode = ''; + } +} + +// Add Forums +if (@$add_forum && $e_mode == 'perm' && $group) +{ + $add_forums_list = get_var('entries', array(0)); + $add_all_forums = FALSE; + + for ($i = 0; $i < sizeof($add_forums_list); $i++) + { + if ($add_forums_list[$i] == GPERM_ALL) + { + $add_all_forums = TRUE; + } + } + + // If we add ALL FORUMS, we are able to overwrite the Permissions + if ($add_all_forums) + { + $sql = 'UPDATE ' . BB_EXTENSION_GROUPS . " SET forum_permissions = '' WHERE group_id = " . (int) $group; + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not update Permissions', '', __LINE__, __FILE__, $sql); + } + } + + // Else we have to add Permissions + if (!$add_all_forums) + { + $sql = 'SELECT forum_permissions + FROM ' . BB_EXTENSION_GROUPS . ' + WHERE group_id = ' . intval($group) . ' + LIMIT 1'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get Group Permissions from ' . BB_EXTENSION_GROUPS, '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + if (trim($row['forum_permissions']) == '') + { + $auth_p = array(); + } + else + { + $auth_p = auth_unpack($row['forum_permissions']); + } + + // Generate array for Auth_Pack, do not add doubled forums + for ($i = 0; $i < sizeof($add_forums_list); $i++) + { + if (!in_array($add_forums_list[$i], $auth_p)) + { + $auth_p[] = $add_forums_list[$i]; + } + } + + $auth_bitstream = auth_pack($auth_p); + + $sql = 'UPDATE ' . BB_EXTENSION_GROUPS . " SET forum_permissions = '" . attach_mod_sql_escape($auth_bitstream) . "' WHERE group_id = " . (int) $group; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not update Permissions', '', __LINE__, __FILE__, $sql); + } + } + +} + +// Delete Forums +if (@$delete_forum && $e_mode == 'perm' && $group) +{ + $delete_forums_list = get_var('entries', array(0)); + + // Get the current Forums + $sql = 'SELECT forum_permissions + FROM ' . BB_EXTENSION_GROUPS . ' + WHERE group_id = ' . intval($group) . ' + LIMIT 1'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get Group Permissions from ' . BB_EXTENSION_GROUPS, '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $auth_p2 = auth_unpack(trim($row['forum_permissions'])); + $auth_p = array(); + + // Generate array for Auth_Pack, delete the chosen ones + for ($i = 0; $i < sizeof($auth_p2); $i++) + { + if (!in_array($auth_p2[$i], $delete_forums_list)) + { + $auth_p[] = $auth_p2[$i]; + } + } + + $auth_bitstream = (sizeof($auth_p) > 0) ? auth_pack($auth_p) : ''; + + $sql = 'UPDATE ' . BB_EXTENSION_GROUPS . " SET forum_permissions = '" . attach_mod_sql_escape($auth_bitstream) . "' WHERE group_id = " . (int) $group; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not update Permissions', '', __LINE__, __FILE__, $sql); + } +} + +// Display the Group Permissions Box for configuring it +if ($e_mode == 'perm' && $group) +{ + $sql = 'SELECT group_name, forum_permissions + FROM ' . BB_EXTENSION_GROUPS . ' + WHERE group_id = ' . intval($group) . ' + LIMIT 1'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get Group Name from ' . BB_EXTENSION_GROUPS, '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $group_name = $row['group_name']; + $allowed_forums = trim($row['forum_permissions']); + + $forum_perm = array(); + + if ($allowed_forums == '') + { + $forum_perm[0]['forum_id'] = 0; + $forum_perm[0]['forum_name'] = $lang['PERM_ALL_FORUMS']; + } + else + { + $forum_p = array(); + $act_id = 0; + $forum_p = auth_unpack($allowed_forums); + $sql = "SELECT forum_id, forum_name FROM " . BB_FORUMS . " WHERE forum_id IN (" . implode(', ', $forum_p) . ")"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Forum Names', '', __LINE__, __FILE__, $sql); + } + + while ($row = DB()->sql_fetchrow($result)) + { + $forum_perm[$act_id]['forum_id'] = $row['forum_id']; + $forum_perm[$act_id]['forum_name'] = $row['forum_name']; + $act_id++; + } + } + + for ($i = 0; $i < sizeof($forum_perm); $i++) + { + $template->assign_block_vars('allow_option_values', array( + 'VALUE' => $forum_perm[$i]['forum_id'], + 'OPTION' => htmlCHR($forum_perm[$i]['forum_name'])) + ); + } + + $template->assign_vars(array( + 'TPL_ATTACH_EXTENSION_GROUPS_PERMISSIONS' => true, + + 'L_GROUP_PERMISSIONS_TITLE' => sprintf($lang['GROUP_PERMISSIONS_TITLE_ADMIN'], trim($group_name)), + 'A_PERM_ACTION' => append_sid("admin_extensions.php?mode=groups&e_mode=perm&e_group=$group")) + ); + + $forum_option_values = array(GPERM_ALL => $lang['PERM_ALL_FORUMS']); + + $sql = "SELECT forum_id, forum_name FROM " . BB_FORUMS; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Forums', '', __LINE__, __FILE__, $sql); + } + + while ($row = DB()->sql_fetchrow($result)) + { + $forum_option_values[intval($row['forum_id'])] = $row['forum_name']; + } + DB()->sql_freeresult($result); + + foreach ($forum_option_values as $value => $option) + { + $template->assign_block_vars('forum_option_values', array( + 'VALUE' => $value, + 'OPTION' => htmlCHR($option)) + ); + } + + $empty_perm_forums = array(); + + $sql = "SELECT forum_id, forum_name FROM " . BB_FORUMS . " WHERE auth_attachments < " . AUTH_ADMIN; + + if ( !($f_result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Forums.', '', __LINE__, __FILE__, $sql); + } + + while ($row = DB()->sql_fetchrow($f_result)) + { + $forum_id = $row['forum_id']; + + $sql = "SELECT forum_permissions + FROM " . BB_EXTENSION_GROUPS . " + WHERE allow_group = 1 + ORDER BY group_name ASC"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query Extension Groups.', '', __LINE__, __FILE__, $sql); + } + + $rows = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + $found_forum = FALSE; + + for ($i = 0; $i < $num_rows; $i++) + { + $allowed_forums = auth_unpack(trim($rows[$i]['forum_permissions'])); + if (in_array($forum_id, $allowed_forums) || trim($rows[$i]['forum_permissions']) == '') + { + $found_forum = TRUE; + break; + } + } + + if (!$found_forum) + { + $empty_perm_forums[$forum_id] = $row['forum_name']; + } + } + DB()->sql_freeresult($f_result); + + $message = ''; + + foreach ($empty_perm_forums as $forum_id => $forum_name) + { + $message .= ( $message == '' ) ? $forum_name : '
' . $forum_name; + } + + if (sizeof($empty_perm_forums) > 0) + { + $template->assign_vars(array('ERROR_MESSAGE' => $lang['NOTE_ADMIN_EMPTY_GROUP_PERMISSIONS'] . $message)); + } +} + +if (@$error) +{ + $template->assign_vars(array('ERROR_MESSAGE' => $error_msg)); +} + +print_page('admin_extensions.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_forum_prune.php b/upload/admin/admin_forum_prune.php new file mode 100644 index 000000000..246cb5a02 --- /dev/null +++ b/upload/admin/admin_forum_prune.php @@ -0,0 +1,72 @@ +fetch_rowset($sql) as $i => $row) + { + $pruned_topics = topic_delete('prune', $row['forum_id'], $prunetime, !empty($_POST['prune_all_topic_types'])); + $pruned_total += $pruned_topics; + $prune_performed = true; + + $template->assign_block_vars('pruned', array( + 'ROW_CLASS' => !($i % 2) ? 'prow1' : 'prow2', + 'FORUM_NAME' => htmlCHR($row['forum_name']), + 'PRUNED_TOPICS' => $pruned_topics, + )); + } + if (!$prune_performed) + { + message_die(GENERAL_MESSAGE, return_msg_prune($lang['NONE_SELECTED'])); + } + if (!$pruned_total) + { + message_die(GENERAL_MESSAGE, return_msg_prune($lang['NO_SEARCH_MATCH'])); + } +} + +$template->assign_vars(array( + 'L_PRUNE_RESULT' => $lang['PRUNE_SUCCESS'], + 'L_PRUNE_EXPLAIN' => $lang['FORUM_PRUNE_EXPLAIN'], + 'L_PRUNE_TOPICS' => $lang['PRUNE_TOPICS_NOT_POSTED'], + + 'PRUNED_TOTAL' => $pruned_total, + 'S_PRUNE_ACTION' => basename(__FILE__), + 'SEL_FORUM' => get_forum_select('admin', 'f[]', null, 65, 16, '', $all_forums), +)); + +print_page('admin_forum_prune.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_forumauth.php b/upload/admin/admin_forumauth.php new file mode 100644 index 000000000..d3867e1ff --- /dev/null +++ b/upload/admin/admin_forumauth.php @@ -0,0 +1,266 @@ + array(AUTH_ALL, AUTH_ALL, AUTH_ALL, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_ALL, AUTH_ALL, AUTH_MOD, AUTH_MOD), // Public +/* Reg */ 1 => array(AUTH_ALL, AUTH_ALL, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_MOD, AUTH_MOD), // Registered +/* Reg [Hid] */ 2 => array(AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_MOD, AUTH_MOD), // Registered [Hidden] +/* Priv */ 3 => array(AUTH_REG, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_MOD, AUTH_MOD), // Private +/* Priv [Hid] */ 4 => array(AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_MOD, AUTH_MOD), // Private [Hidden] +/* MOD */ 5 => array(AUTH_REG, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD), // Moderators +/* MOD [Hid] */ 6 => array(AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD), // Moderators [Hidden] +); + +$simple_auth_types = array( + $lang['PUBLIC'], + $lang['REGISTERED'], + $lang['REGISTERED'] .' ['. $lang['HIDDEN'] .']', + $lang['PRIVATE'], + $lang['PRIVATE'] .' ['. $lang['HIDDEN'] .']', + $lang['MODERATORS'], + $lang['MODERATORS'] .' ['. $lang['HIDDEN'] .']', +); + +$field_names = array(); +foreach ($forum_auth_fields as $auth_type) +{ + $field_names[$auth_type] = $lang[strtoupper($auth_type)]; +} + +$forum_auth_levels = array('ALL', 'REG', 'PRIVATE', 'MOD', 'ADMIN'); +$forum_auth_const = array(AUTH_ALL, AUTH_REG, AUTH_ACL, AUTH_MOD, AUTH_ADMIN); + +if (@$_REQUEST[POST_FORUM_URL]) +{ + $forum_id = (int) $_REQUEST[POST_FORUM_URL]; + $forum_sql = "WHERE forum_id = $forum_id"; +} +else +{ + unset($forum_id); + $forum_sql = ''; +} + +if( isset($_GET['adv']) ) +{ + $adv = intval($_GET['adv']); +} +else +{ + unset($adv); +} + +// +// Start program proper +// +if( isset($_POST['submit']) ) +{ + $sql = ''; + + if(!empty($forum_id)) + { + if(isset($_POST['simpleauth'])) + { + $simple_ary = $simple_auth_ary[intval($_POST['simpleauth'])]; + + for($i = 0; $i < count($simple_ary); $i++) + { + $sql .= ( ( $sql != '' ) ? ', ' : '' ) . $forum_auth_fields[$i] . ' = ' . $simple_ary[$i]; + } + + if (is_array($simple_ary)) + { + $sql = "UPDATE " . BB_FORUMS . " SET $sql WHERE forum_id = $forum_id"; + } + } + else + { + for($i = 0; $i < count($forum_auth_fields); $i++) + { + $value = intval($_POST[$forum_auth_fields[$i]]); + + if ( $forum_auth_fields[$i] == 'auth_vote' ) + { + if ( $_POST['auth_vote'] == AUTH_ALL ) + { + $value = AUTH_REG; + } + } + + $sql .= ( ( $sql != '' ) ? ', ' : '' ) .$forum_auth_fields[$i] . ' = ' . $value; + } + + $sql = "UPDATE " . BB_FORUMS . " SET $sql WHERE forum_id = $forum_id"; + } + + if ( $sql != '' ) + { + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update auth table', '', __LINE__, __FILE__, $sql); + } + } + + $forum_sql = ''; + $adv = 0; + } + + $datastore->update('cat_forums'); + $message = $lang['FORUM_AUTH_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_FORUMAUTH'], '', ""); + message_die(GENERAL_MESSAGE, $message); + +} // End of submit + +// +// Get required information, either all forums if +// no id was specified or just the requsted if it +// was +// +$forum_rows = DB()->fetch_rowset("SELECT * FROM ". BB_FORUMS ." $forum_sql"); + +if (empty($forum_id)) +{ + // Output the selection table if no forum id was specified + $template->assign_vars(array( + 'TPL_AUTH_SELECT_FORUM' => true, + + 'L_AUTH_TITLE' => $lang['AUTH_CONTROL_FORUM'], + 'L_AUTH_EXPLAIN' => $lang['FORUM_AUTH_EXPLAIN'], + 'L_AUTH_SELECT' => $lang['SELECT_A_FORUM'], + + 'S_AUTH_ACTION' => "admin_forumauth.php", + 'S_AUTH_SELECT' => get_forum_select('admin', 'f', null, 80), + )); + +} +else +{ + // Output the authorisation details if an id was specified + $forum_name = $forum_rows[0]['forum_name']; + + @reset($simple_auth_ary); + while( list($key, $auth_levels) = each($simple_auth_ary)) + { + $matched = 1; + for($k = 0; $k < count($auth_levels); $k++) + { + $matched_type = $key; + + if ( $forum_rows[0][$forum_auth_fields[$k]] != $auth_levels[$k] ) + { + $matched = 0; + } + } + + if ( $matched ) + { + break; + } + } + + // + // If we didn't get a match above then we + // automatically switch into 'advanced' mode + // + if ( !isset($adv) && !$matched ) + { + $adv = 1; + } + + $s_column_span = 0; + + if ( empty($adv) ) + { + $simple_auth = ''; + + $template->assign_block_vars('forum_auth', array( + 'CELL_TITLE' => $lang['SIMPLE_MODE'], + 'S_AUTH_LEVELS_SELECT' => $simple_auth, + )); + + $s_column_span++; + } + else + { + // + // Output values of individual + // fields + // + for($j = 0; $j < count($forum_auth_fields); $j++) + { + $custom_auth[$j] = '  '; + + $cell_title = $field_names[$forum_auth_fields[$j]]; + + $template->assign_block_vars('forum_auth', array( + 'CELL_TITLE' => $cell_title, + 'S_AUTH_LEVELS_SELECT' => $custom_auth[$j], + )); + + $s_column_span++; + } + } + + $adv_mode = ( empty($adv) ) ? '1' : '0'; + $switch_mode = "admin_forumauth.php?f=$forum_id&adv=$adv_mode"; + $switch_mode_text = ( empty($adv) ) ? $lang['ADVANCED_MODE'] : $lang['SIMPLE_MODE']; + $u_switch_mode = '' . $switch_mode_text . ''; + + $s_hidden_fields = ''; + + $template->assign_vars(array( + 'TPL_EDIT_FORUM_AUTH' => true, + + 'FORUM_NAME' => htmlCHR($forum_name), + + 'L_AUTH_TITLE' => $lang['AUTH_CONTROL_FORUM'], + 'L_AUTH_EXPLAIN' => $lang['FORUM_AUTH_EXPLAIN'], + + 'U_SWITCH_MODE' => $u_switch_mode, + + 'S_FORUMAUTH_ACTION' => "admin_forumauth.php", + 'S_COLUMN_SPAN' => $s_column_span, + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); +} + +print_page('admin_forumauth.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_forumauth_list.php b/upload/admin/admin_forumauth_list.php new file mode 100644 index 000000000..6c900cd24 --- /dev/null +++ b/upload/admin/admin_forumauth_list.php @@ -0,0 +1,396 @@ + array(AUTH_ALL, AUTH_ALL, AUTH_ALL, AUTH_ALL, AUTH_REG, AUTH_REG, AUTH_MOD, AUTH_MOD, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_ALL), // Public +/* Reg */ 1 => array(AUTH_ALL, AUTH_ALL, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_MOD, AUTH_MOD, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG), // Registered +/* Reg [Hid] */ 2 => array(AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_MOD, AUTH_MOD, AUTH_REG, AUTH_REG, AUTH_REG, AUTH_REG), // Registered [Hidden] +/* Priv */ 3 => array(AUTH_REG, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_MOD, AUTH_MOD, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL), // Private +/* Priv [Hid] */ 4 => array(AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_MOD, AUTH_MOD, AUTH_ACL, AUTH_ACL, AUTH_ACL, AUTH_ACL), // Private [Hidden] +/* MOD */ 5 => array(AUTH_REG, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD), // Moderators +/* MOD [Hid] */ 6 => array(AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD, AUTH_MOD), // Moderators [Hidden] +); + +$simple_auth_types = array( + $lang['PUBLIC'], + $lang['REGISTERED'], + $lang['REGISTERED'] .' ['. $lang['HIDDEN'] .']', + $lang['PRIVATE'], + $lang['PRIVATE'] .' ['. $lang['HIDDEN'] .']', + $lang['MODERATORS'], + $lang['MODERATORS'] .' ['. $lang['HIDDEN'] .']', +); + +$forum_auth_fields = array( + 'auth_view', + 'auth_read', + 'auth_reply', + 'auth_edit', + 'auth_delete', + 'auth_vote', + 'auth_pollcreate', + 'auth_attachments', + 'auth_download', + 'auth_post', + 'auth_sticky', + 'auth_announce', +); + +$field_names = array(); +foreach ($forum_auth_fields as $auth_type) +{ + $field_names[$auth_type] = $lang[strtoupper($auth_type)]; +} + +$forum_auth_levels = array('ALL', 'REG', 'PRIVATE', 'MOD', 'ADMIN'); +$forum_auth_const = array(AUTH_ALL, AUTH_REG, AUTH_ACL, AUTH_MOD, AUTH_ADMIN); + +if(isset($_GET[POST_FORUM_URL]) || isset($_POST[POST_FORUM_URL])) +{ + $forum_id = (isset($_POST[POST_FORUM_URL])) ? intval($_POST[POST_FORUM_URL]) : intval($_GET[POST_FORUM_URL]); + $forum_sql = "AND forum_id = $forum_id"; +} +else +{ + unset($forum_id); + $forum_sql = ''; +} + +if(isset($_GET[POST_CAT_URL]) || isset($_POST[POST_CAT_URL])) +{ + $cat_id = (isset($_POST[POST_CAT_URL])) ? intval($_POST[POST_CAT_URL]) : intval($_GET[POST_CAT_URL]); + $cat_sql = "AND c.cat_id = $cat_id"; +} +else +{ + unset($cat_id); + $cat_sql = ''; +} + +if( isset($_GET['adv']) ) +{ + $adv = intval($_GET['adv']); +} +else +{ + unset($adv); +} + +// +// Start program proper +// +if( isset($_POST['submit']) ) +{ + $sql = ''; + + if(!empty($forum_id)) + { + if(isset($_POST['simpleauth'])) + { + $simple_ary = $simple_auth_ary[intval($_POST['simpleauth'])]; + + for($i = 0; $i < count($simple_ary); $i++) + { + $sql .= ( ( $sql != '' ) ? ', ' : '' ) . $forum_auth_fields[$i] . ' = ' . $simple_ary[$i]; + } + + if (is_array($simple_ary)) + { + $sql = "UPDATE " . BB_FORUMS . " SET $sql WHERE forum_id = $forum_id"; + } + } + else + { + for($i = 0; $i < count($forum_auth_fields); $i++) + { + $value = intval($_POST[$forum_auth_fields[$i]]); + + if ( $forum_auth_fields[$i] == 'auth_vote' ) + { + if ( $_POST['auth_vote'] == AUTH_ALL ) + { + $value = AUTH_REG; + } + } + + $sql .= ( ( $sql != '' ) ? ', ' : '' ) .$forum_auth_fields[$i] . ' = ' . $value; + } + + $sql = "UPDATE " . BB_FORUMS . " SET $sql WHERE forum_id = $forum_id"; + } + + if ( $sql != '' ) + { + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update auth table', '', __LINE__, __FILE__, $sql); + } + } + + $forum_sql = ''; + $adv = 0; + } + elseif (!empty($cat_id)) + { + for($i = 0; $i < count($forum_auth_fields); $i++) + { + $value = intval($_POST[$forum_auth_fields[$i]]); + + if ( $forum_auth_fields[$i] == 'auth_vote' ) + { + if ( $_POST['auth_vote'] == AUTH_ALL ) + { + $value = AUTH_REG; + } + } + + $sql .= ( ( $sql != '' ) ? ', ' : '' ) .$forum_auth_fields[$i] . ' = ' . $value; + } + + $sql = "UPDATE " . BB_FORUMS . " SET $sql WHERE cat_id = $cat_id"; + + if ( $sql != '' ) + { + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update auth table', '', __LINE__, __FILE__, $sql); + } + } + + $cat_sql = ''; + } + + $datastore->update('cat_forums'); + $message = $lang['FORUM_AUTH_UPDATED'] . '

' . sprintf($lang['CLICK_RETURN_FORUMAUTH'], '', ""); + message_die(GENERAL_MESSAGE, $message); + +} // End of submit + +// +// Get required information, either all forums if +// no id was specified or just the requsted forum +// or category if it was +// +$sql = "SELECT f.* + FROM " . BB_FORUMS . " f, " . BB_CATEGORIES . " c + WHERE c.cat_id = f.cat_id + $forum_sql $cat_sql + ORDER BY c.cat_order ASC, f.forum_order ASC"; +if ( !($result = DB()->sql_query($sql)) ) +{ + message_die(GENERAL_ERROR, "Couldn't obtain forum list", "", __LINE__, __FILE__, $sql); +} + +$forum_rows = DB()->sql_fetchrowset($result); +DB()->sql_freeresult($result); + +if( empty($forum_id) && empty($cat_id) ) +{ + // + // Output the summary list if no forum id was + // specified + // + $template->assign_vars(array( + 'TPL_AUTH_FORUM_LIST' => true, + + 'L_AUTH_TITLE' => $lang['PERMISSIONS_LIST'], + 'L_AUTH_EXPLAIN' => $lang['FORUM_AUTH_LIST_EXPLAIN'], + 'S_COLUMN_SPAN' => count($forum_auth_fields)+1, + )); + + for ($i=0; $iassign_block_vars('forum_auth_titles', array( + 'CELL_TITLE' => $field_names[$forum_auth_fields[$i]]) + ); + } + + // Obtain the category list + $sql = "SELECT c.cat_id, c.cat_title, c.cat_order + FROM " . BB_CATEGORIES . " c + ORDER BY c.cat_order"; + if( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query categories list', '', __LINE__, __FILE__, $sql); + } + + $category_rows = DB()->sql_fetchrowset($result); + $cat_count = count($category_rows); + + for ($i=0; $i<$cat_count; $i++) + { + $cat_id = $category_rows[$i]['cat_id']; + + $template->assign_block_vars('cat_row', array( + 'CAT_NAME' => htmlCHR($category_rows[$i]['cat_title']), + 'CAT_URL' => append_sid('admin_forumauth_list.php'.'?'.POST_CAT_URL.'='.$category_rows[$i]['cat_id'])) + ); + + for ($j=0; $jassign_block_vars('cat_row.forum_row', array( + 'ROW_CLASS' => !($j % 2) ? 'row4' : 'row5', + 'FORUM_NAME' => ''.htmlCHR($forum_rows[$j]['forum_name']).'', + 'IS_SUBFORUM' => $forum_rows[$j]['forum_parent'], + )); + + for ($k=0; $kassign_block_vars('cat_row.forum_row.forum_auth_data', array( + 'CELL_VALUE' => $lang['FORUM_' . $item_auth_level], + 'AUTH_EXPLAIN' => sprintf($lang[strtoupper('FORUM_AUTH_LIST_EXPLAIN_' . $forum_auth_fields[$k])], $lang[strtoupper('FORUM_AUTH_LIST_EXPLAIN_' . $item_auth_level)])) + ); + } + } + } + } +} +else +{ + // + // output the authorisation details if an category id was + // specified + // + + // + // first display the current details for all forums + // in the category + // + for ($i=0; $iassign_block_vars('forum_auth_titles', array( + 'CELL_TITLE' => $field_names[$forum_auth_fields[$i]]) + ); + } + + // obtain the category list + $sql = "SELECT c.cat_id, c.cat_title, c.cat_order + FROM " . BB_CATEGORIES . " c + WHERE c.cat_id = $cat_id + ORDER BY c.cat_order"; + if( !($result = DB()->sql_query($sql)) ) + { + message_die(general_error, 'Could not query categories list', '', __line__, __file__, $sql); + } + + $category_rows = DB()->sql_fetchrowset($result); + + $cat_id = $category_rows[0]['cat_id']; + $cat_name = $category_rows[0]['cat_title']; + + $template->assign_block_vars('cat_row', array( + 'CAT_NAME' => htmlCHR($cat_name), + 'CAT_URL' => append_sid('admin_forumauth_list.php'.'?'.POST_CAT_URL.'='.$cat_id)) + ); + + for ($j=0; $jassign_block_vars('cat_row.forum_row', array( + 'ROW_CLASS' => !($j % 2) ? 'row4' : 'row5', + 'FORUM_NAME' => ''.htmlCHR($forum_rows[$j]['forum_name']).'', + 'IS_SUBFORUM' => $forum_rows[$j]['forum_parent'], + )); + + for ($k=0; $kassign_block_vars('cat_row.forum_row.forum_auth_data', array( + 'CELL_VALUE' => $lang['FORUM_' . $item_auth_level], + 'AUTH_EXPLAIN' => sprintf($lang[strtoupper('FORUM_AUTH_LIST_EXPLAIN_' . $forum_auth_fields[$k])], $lang[strtoupper('FORUM_AUTH_LIST_EXPLAIN_' . $item_auth_level)])) + ); + } + } + } + + // + // next generate the information to allow the permissions to be changed + // note: we always read from the first forum in the category + // + for($j = 0; $j < count($forum_auth_fields); $j++) + { + $custom_auth[$j] = ''; + + $template->assign_block_vars('forum_auth_data', array( + 'S_AUTH_LEVELS_SELECT' => $custom_auth[$j]) + ); + } + + // + // finally pass any remaining items to the template + // + $s_hidden_fields = ''; + + $template->assign_vars(array( + 'TPL_AUTH_CAT' => true, + 'CAT_NAME' => htmlCHR($cat_name), + + 'L_AUTH_TITLE' => $lang['AUTH_CONTROL_CATEGORY'], + 'L_AUTH_EXPLAIN' => $lang['CAT_AUTH_LIST_EXPLAIN'], + + 'S_FORUMAUTH_ACTION' => append_sid("admin_forumauth_list.php"), + 'S_COLUMN_SPAN' => count($forum_auth_fields)+1, + 'S_HIDDEN_FIELDS' => $s_hidden_fields) + ); +} + +print_page('admin_forumauth_list.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_forums.php b/upload/admin/admin_forums.php new file mode 100644 index 000000000..36f48b914 --- /dev/null +++ b/upload/admin/admin_forums.php @@ -0,0 +1,1259 @@ + AUTH_ALL, + 'auth_read' => AUTH_ALL, + 'auth_post' => AUTH_REG, + 'auth_reply' => AUTH_REG, + 'auth_edit' => AUTH_REG, + 'auth_delete' => AUTH_REG, + 'auth_sticky' => AUTH_MOD, + 'auth_announce' => AUTH_MOD, + 'auth_vote' => AUTH_REG, + 'auth_pollcreate' => AUTH_REG, + 'auth_attachments' => AUTH_REG, + 'auth_download' => AUTH_REG, +); + +$mode = (@$_REQUEST['mode']) ? (string) $_REQUEST['mode'] : ''; + +$cat_forums = get_cat_forums(); + +if ($orphan_sf_sql = get_orphan_sf()) +{ + fix_orphan_sf($orphan_sf_sql, TRUE); +} +$forum_parent = $cat_id = 0; +$forumname = ''; + +if (isset($_REQUEST['addforum']) || isset($_REQUEST['addcategory'])) +{ + $mode = (isset($_REQUEST['addforum'])) ? "addforum" : "addcat"; + + if ($mode == 'addforum' && isset($_POST['addforum']) && isset($_POST['forumname']) && is_array($_POST['addforum'])) + { + $req_cat_id = array_keys($_POST['addforum']); + $cat_id = $req_cat_id[0]; + $forumname = stripslashes($_POST['forumname'][$cat_id]); + } +} + +$show_main_page = false; + +if ($mode) +{ + switch ($mode) + { + case 'addforum': + case 'editforum': + // + // Show form to create/modify a forum + // + if ($mode == 'editforum') + { + // $newmode determines if we are going to INSERT or UPDATE after posting? + + $l_title = $lang['EDIT_FORUM']; + $newmode = 'modforum'; + $buttonvalue = $lang['UPDATE']; + + $forum_id = intval($_GET[POST_FORUM_URL]); + + $row = get_info('forum', $forum_id); + + $cat_id = $row['cat_id']; + $forumname = $row['forum_name']; + $forumdesc = $row['forum_desc']; + $forumstatus = $row['forum_status']; + $forum_display_sort = $row['forum_display_sort']; + $forum_display_order = $row['forum_display_order']; + $forum_parent = $row['forum_parent']; + $show_on_index = $row['show_on_index']; + $prune_enabled = ($row['prune_days']) ? HTML_CHECKED : ''; + $prune_days = $row['prune_days']; + } + else + { + $l_title = $lang['CREATE_FORUM']; + $newmode = 'createforum'; + $buttonvalue = $lang['CREATE_FORUM']; + + $forumdesc = ''; + $forumstatus = FORUM_UNLOCKED; + $forum_display_sort = 0; + $forum_display_order = 0; + $forum_id = ''; + $show_on_index = 1; + $prune_enabled = ''; + $prune_days = 0; + } + + if (isset($_REQUEST['forum_parent'])) + { + $forum_parent = intval($_REQUEST['forum_parent']); + + if ($parent = get_forum_data($forum_parent)) + { + $cat_id = $parent['cat_id']; + } + } + else if (isset($_REQUEST['c'])) + { + $cat_id = (int) $_REQUEST['c']; + } + + $catlist = get_list('category', $cat_id, TRUE); + $forumlocked = $forumunlocked = ''; + + $forumstatus == ( FORUM_LOCKED ) ? $forumlocked = "selected=\"selected\"" : $forumunlocked = "selected=\"selected\""; + + // These two options ($lang['STATUS_UNLOCKED'] and $lang['STATUS_LOCKED']) seem to be missing from + // the language files. + $lang['STATUS_UNLOCKED'] = isset($lang['STATUS_UNLOCKED']) ? $lang['STATUS_UNLOCKED'] : 'Unlocked'; + $lang['STATUS_LOCKED'] = isset($lang['STATUS_LOCKED']) ? $lang['STATUS_LOCKED'] : 'Locked'; + + $statuslist = "\n"; + $statuslist .= "\n"; + + $forum_display_sort_list = get_forum_display_sort_option($forum_display_sort, 'list', 'sort'); + $forum_display_order_list = get_forum_display_sort_option($forum_display_order, 'list', 'order'); + + $s_hidden_fields = ''; + + $s_parent = '\n"; + $sel_forum = ($forum_parent && !isset($_REQUEST['forum_parent'])) ? $forum_id : $forum_parent; + $s_parent .= sf_get_list('forum', $forum_id, $sel_forum); + + $template->assign_vars(array( + 'TPL_EDIT_FORUM' => true, + + 'S_FORUM_DISPLAY_SORT_LIST' => $forum_display_sort_list, + 'S_FORUM_DISPLAY_ORDER_LIST' => $forum_display_order_list, + 'S_FORUM_ACTION' => append_sid("admin_forums.php"), + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + 'S_SUBMIT_VALUE' => $buttonvalue, + 'S_CAT_LIST' => $catlist, + 'S_STATUS_LIST' => $statuslist, + 'S_PRUNE_ENABLED' => $prune_enabled, + + 'SHOW_ON_INDEX' => $show_on_index, + 'L_SHOW_ON_INDEX' => $lang['SF_SHOW_ON_INDEX'], + 'L_PARENT_FORUM' => $lang['SF_PARENT_FORUM'], + 'S_PARENT_FORUM' => $s_parent, + 'CAT_LIST_CLASS' => ($forum_parent) ? 'hidden' : '', + 'SHOW_ON_INDEX_CLASS' => (!$forum_parent) ? 'hidden' : '', + + 'L_FORUM_TITLE' => $l_title, + 'L_FORUM_EXPLAIN' => $lang['FORUM_EDIT_DELETE_EXPLAIN'], + 'L_FORUM_DESCRIPTION' => $lang['FORUM_DESC'], + 'L_AUTO_PRUNE' => $lang['FORUM_PRUNING'], + + 'PRUNE_DAYS' => $prune_days, + 'FORUM_NAME' => htmlCHR($forumname), + 'DESCRIPTION' => htmlCHR($forumdesc), + )); + break; + + case 'createforum': + // + // Create a forum in the DB + // + $cat_id = intval($_POST[POST_CAT_URL]); + $forum_name = str_replace("\'", "''", trim($_POST['forumname'])); + $forum_desc = str_replace("\'", "''", trim($_POST['forumdesc'])); + $forum_status = intval($_POST['forumstatus']); + + $prune_enable = isset($_POST['prune_enable']); + $prune_days = ($prune_enable) ? intval($_POST['prune_days']) : 0; + + $forum_parent = ($_POST['forum_parent'] != -1) ? intval($_POST['forum_parent']) : 0; + $show_on_index = ($forum_parent) ? intval($_POST['show_on_index']) : 1; + + $forum_display_sort = intval($_POST['forum_display_sort']); + $forum_display_order = intval($_POST['forum_display_order']); + + if (!$forum_name) + { + message_die(GENERAL_ERROR, "Can't create a forum without a name"); + } + + if ($forum_parent) + { + if (!$parent = get_forum_data($forum_parent)) + { + message_die(GENERAL_ERROR, "Parent forum with id=$forum_parent not found"); + } + + $cat_id = $parent['cat_id']; + $forum_parent = ($parent['forum_parent']) ? $parent['forum_parent'] : $parent['forum_id']; + $forum_order = $parent['forum_order'] + 5; + } + else + { + $max_order = get_max_forum_order($cat_id); + $forum_order = $max_order + 5; + } + + if ($prune_enable && !$prune_days) + { + message_die(GENERAL_MESSAGE, $lang['SET_PRUNE_DATA']); + } + + // Default permissions of public forum + $field_sql = $value_sql = ''; + + foreach ($default_forum_auth as $field => $value) + { + $field_sql .= ", $field"; + $value_sql .= ", $value"; + } + + $columns = ' forum_name, cat_id, forum_desc, forum_order, forum_status, prune_days, forum_parent, show_on_index, forum_display_sort, forum_display_order'. $field_sql; + $values = "'$forum_name', $cat_id, '$forum_desc', $forum_order, $forum_status, $prune_days, $forum_parent, $show_on_index, $forum_display_sort, $forum_display_order". $value_sql; + + DB()->query("INSERT INTO ". BB_FORUMS ." ($columns) VALUES ($values)"); + + renumber_order('forum', $cat_id); + $datastore->update('cat_forums'); + + $message = $lang['FORUMS_UPDATED'] . "

" . sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + message_die(GENERAL_MESSAGE, $message); + + break; + + case 'modforum': + // + // Modify a forum in the DB + // + $cat_id = intval($_POST[POST_CAT_URL]); + $forum_id = intval($_POST[POST_FORUM_URL]); + $forum_name = str_replace("\'", "''", trim($_POST['forumname'])); + $forum_desc = str_replace("\'", "''", trim($_POST['forumdesc'])); + $forum_status = intval($_POST['forumstatus']); + + $prune_enable = isset($_POST['prune_enable']); + $prune_days = ($prune_enable) ? intval($_POST['prune_days']) : 0; + + $forum_parent = ($_POST['forum_parent'] != -1) ? intval($_POST['forum_parent']) : 0; + $show_on_index = ($forum_parent) ? intval($_POST['show_on_index']) : 1; + + $forum_display_order = intval($_POST['forum_display_order']); + $forum_display_sort = intval($_POST['forum_display_sort']); + + $forum_data = get_forum_data($forum_id); + $old_cat_id = $forum_data['cat_id']; + $forum_order = $forum_data['forum_order']; + + if (!$forum_name) + { + message_die(GENERAL_ERROR, "Can't modify a forum without a name"); + } + + if ($forum_parent) + { + if (!$parent = get_forum_data($forum_parent)) + { + message_die(GENERAL_ERROR, "Parent forum with id=$forum_parent not found"); + } + + $cat_id = $parent['cat_id']; + $forum_parent = ($parent['forum_parent']) ? $parent['forum_parent'] : $parent['forum_id']; + $forum_order = $parent['forum_order'] + 5; + + if ($forum_id == $forum_parent) + { + message_die(GENERAL_ERROR, "Ambiguous forum ID's. Please select other parent forum", '', __LINE__, __FILE__); + } + } + else if ($cat_id != $old_cat_id) + { + $max_order = get_max_forum_order($cat_id); + $forum_order = $max_order + 5; + } + else if ($forum_data['forum_parent']) + { + $old_parent = $forum_data['forum_parent']; + $forum_order = $cat_forums[$old_cat_id]['f'][$old_parent]['forum_order'] - 5; + } + + if ($prune_enable && !$prune_days) + { + message_die(GENERAL_MESSAGE, $lang['SET_PRUNE_DATA']); + } + + DB()->query(" + UPDATE ". BB_FORUMS ." SET + forum_name = '$forum_name', + cat_id = $cat_id, + forum_desc = '$forum_desc', + forum_order = $forum_order, + forum_status = $forum_status, + prune_days = $prune_days, + forum_parent = $forum_parent, + show_on_index = $show_on_index, + forum_display_order = $forum_display_order, + forum_display_sort = $forum_display_sort + WHERE forum_id = $forum_id + "); + + if ($cat_id != $old_cat_id) + { + change_sf_cat($forum_id, $cat_id, $forum_order); + renumber_order('forum', $cat_id); + } + + renumber_order('forum', $old_cat_id); + + $cat_forums = get_cat_forums(); + $fix = fix_orphan_sf(); + $datastore->update('cat_forums'); + + $message = $lang['FORUMS_UPDATED'] . "

"; + $message .= ($fix) ? "$fix

" : ''; + $message .= sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + message_die(GENERAL_MESSAGE, $message); + + break; + + case 'addcat': + // + // Create a category in the DB + // + verify_sid(); + + if (!$new_cat_title = trim($_POST['categoryname'])) + { + bb_die('Category name is empty'); + } + + check_name_dup('cat', $new_cat_title); + + $order = DB()->fetch_row("SELECT MAX(cat_order) AS max_order FROM ". BB_CATEGORIES); + + $args = DB()->build_array('INSERT', array( + 'cat_title' => (string) $new_cat_title, + 'cat_order' => (int) $order['max_order'] + 10, + )); + + DB()->query("INSERT INTO ". BB_CATEGORIES . $args); + + $datastore->update('cat_forums'); + + $message = $lang['FORUMS_UPDATED'] . "

" . sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + message_die(GENERAL_MESSAGE, $message); + + break; + + case 'editcat': + // + // Show form to edit a category + // + $cat_id = (int) $_GET['c']; + $cat_info = get_info('category', $cat_id); + + $hidden_fields = array( + 'mode' => 'modcat', + 'c' => $cat_id, + ); + + $template->assign_vars(array( + 'TPL_EDIT_CATEGORY' => true, + + 'CAT_TITLE' => htmlCHR($cat_info['cat_title']), + 'L_EDIT_CAT' => $lang['EDIT_CATEGORY'], + 'L_EDIT_CAT_EXPL' => $lang['EDIT_CATEGORY_EXPLAIN'], + 'S_HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + 'S_SUBMIT_VALUE' => $lang['UPDATE'], + 'S_FORUM_ACTION' => "admin_forums.php", + )); + + break; + + case 'modcat': + // + // Modify a category in the DB + // + verify_sid(); + + if (!$new_cat_title = trim($_POST['cat_title'])) + { + bb_die('Category name is empty'); + } + + $cat_id = (int) $_POST['c']; + + $row = get_info('category', $cat_id); + $cur_cat_title = $row['cat_title']; + + if ($cur_cat_title && $cur_cat_title !== $new_cat_title) + { + check_name_dup('cat', $new_cat_title); + + $new_cat_title_sql = DB()->escape($new_cat_title); + + DB()->query(" + UPDATE ". BB_CATEGORIES ." SET + cat_title = '$new_cat_title_sql' + WHERE cat_id = $cat_id + "); + } + + $datastore->update('cat_forums'); + + $message = $lang['FORUMS_UPDATED'] . "

" . sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + message_die(GENERAL_MESSAGE, $message); + + break; + + case 'deleteforum': + // + // Show form to delete a forum + // + $forum_id = (int) $_GET['f']; + + $move_to_options = ''; + $move_to_options .= sf_get_list('forum', $forum_id, 0); + + $foruminfo = get_info('forum', $forum_id); + + $hidden_fields = array( + 'mode' => 'movedelforum', + 'from_id' => $forum_id, + ); + + $template->assign_vars(array( + 'TPL_DELETE_FORUM' => true, + + 'WHAT_TO_DELETE' => htmlCHR($foruminfo['forum_name']), + 'DELETE_TITLE' => $lang['FORUM_DELETE'], + 'L_DELETE_EXPL' => $lang['FORUM_DELETE_EXPLAIN'], + 'L_MOVE_CONTENTS' => $lang['MOVE_CONTENTS'], + 'CAT_FORUM_NAME' => $lang['FORUM_NAME'], + + 'S_HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + 'S_FORUM_ACTION' => "admin_forums.php", + 'MOVE_TO_OPTIONS' => $move_to_options, + 'S_SUBMIT_VALUE' => $lang['MOVE_AND_DELETE'], + )); + + break; + + case 'movedelforum': + // + // Move or delete a forum in the DB + // + verify_sid(); + + $from_id = (int) $_POST['from_id']; + $to_id = (int) $_POST['to_id']; + + if ($to_id == -1) + { + // Delete everything from forum + topic_delete('prune', $from_id, 0, true); + } + else + { + // Move all posts + $sql = "SELECT * FROM ". BB_FORUMS ." WHERE forum_id IN($from_id, $to_id)"; + $result = DB()->query($sql); + + if (DB()->num_rows($result) != 2) + { + message_die(GENERAL_ERROR, "Ambiguous forum ID's", "", __LINE__, __FILE__); + } + + // Update topics + DB()->query(" + UPDATE ". BB_TOPICS ." SET + forum_id = $to_id + WHERE forum_id = $from_id + "); + + // Update posts + DB()->query(" + UPDATE ". BB_POSTS ." SET + forum_id = $to_id + WHERE forum_id = $from_id + "); + + // Update torrents + DB()->query(" + UPDATE ". BB_BT_TORRENTS ." SET + forum_id = $to_id + WHERE forum_id = $from_id + "); + + sync('forum', $to_id); + } + + DB()->query("DELETE FROM ". BB_FORUMS ." WHERE forum_id = $from_id"); + DB()->query("DELETE FROM ". BB_AUTH_ACCESS ." WHERE forum_id = $from_id"); + DB()->query("DELETE FROM ". BB_AUTH_ACCESS_SNAP ." WHERE forum_id = $from_id"); + + $cat_forums = get_cat_forums(); + fix_orphan_sf(); + update_user_level('all'); + $datastore->update('cat_forums'); + + $message = $lang['FORUMS_UPDATED'] . "

" . sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + message_die(GENERAL_MESSAGE, $message); + + break; + + case 'deletecat': + // + // Show form to delete a category + // + $cat_id = (int) $_GET['c']; + $catinfo = get_info('category', $cat_id); + $categories_count = $catinfo['number']; + + if ($categories_count == 1) + { + $row = DB()->fetch_row("SELECT COUNT(*) AS forums_count FROM ". BB_FORUMS); + + if ($row['forums_count'] > 0) + { + message_die(GENERAL_ERROR, $lang['MUST_DELETE_FORUMS']); + } + else + { + $template->assign_var('NOWHERE_TO_MOVE', $lang['NOWHERE_TO_MOVE']); + } + } + + $hidden_fields = array( + 'mode' => 'movedelcat', + 'from_id' => $cat_id, + ); + + $template->assign_vars(array( + 'TPL_DELETE_FORUM' => true, + + 'WHAT_TO_DELETE' => htmlCHR($catinfo['cat_title']), + 'DELETE_TITLE' => $lang['CATEGORY_DELETE'], + 'L_DELETE_EXPL' => $lang['FORUM_DELETE_EXPLAIN'], + 'CAT_FORUM_NAME' => $lang['CATEGORY'], + + 'S_HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + 'S_FORUM_ACTION' => "admin_forums.php", + 'MOVE_TO_OPTIONS' => get_list('category', $cat_id, 0), + 'S_SUBMIT_VALUE' => $lang['MOVE_AND_DELETE'], + )); + + break; + + case 'movedelcat': + // + // Move or delete a category in the DB + // + verify_sid(); + + $from_id = (int) $_POST['from_id']; + $to_id = (int) $_POST['to_id']; + + if ($from_id == $to_id || !cat_exists($from_id) || !cat_exists($to_id)) + { + bb_die('Bad input'); + } + + $order_shear = get_max_forum_order($to_id) + 10; + + DB()->query(" + UPDATE ". BB_FORUMS ." SET + cat_id = $to_id, + forum_order = forum_order + $order_shear + WHERE cat_id = $from_id + "); + + DB()->query("DELETE FROM ". BB_CATEGORIES ." WHERE cat_id = $from_id"); + + renumber_order('forum', $to_id); + $cat_forums = get_cat_forums(); + $fix = fix_orphan_sf(); + $datastore->update('cat_forums'); + + $message = $lang['FORUMS_UPDATED'] . "

"; + $message .= ($fix) ? "$fix

" : ''; + $message .= sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + message_die(GENERAL_MESSAGE, $message); + + break; + + case 'forum_order': + // + // Change order of forums + // + $move = intval($_GET['move']); + $forum_id = intval($_GET[POST_FORUM_URL]); + + $forum_info = get_info('forum', $forum_id); + renumber_order('forum', $forum_info['cat_id']); + + $cat_id = $forum_info['cat_id']; + + $move_down_forum_id = FALSE; + $forums = $cat_forums[$cat_id]['f_ord']; + $forum_order = $forum_info['forum_order']; + $prev_forum = (isset($forums[$forum_order - 10])) ? $forums[$forum_order - 10] : FALSE; + $next_forum = (isset($forums[$forum_order + 10])) ? $forums[$forum_order + 10] : FALSE; + + // move selected forum ($forum_id) UP + if ($move < 0 && $prev_forum) + { + if ($forum_info['forum_parent'] && $prev_forum['forum_parent'] != $forum_info['forum_parent']) + { + break; + } + else if ($move_down_forum_id = get_prev_root_forum_id($forums, $forum_order)) + { + $move_up_forum_id = $forum_id; + $move_down_ord_val = (get_sf_count($forum_id) + 1) * 10; + $move_up_ord_val = ((get_sf_count($move_down_forum_id) + 1) * 10) + $move_down_ord_val; + $move_down_forum_order = $cat_forums[$cat_id]['f'][$move_down_forum_id]['forum_order']; + } + } + // move selected forum ($forum_id) DOWN + else if ($move > 0 && $next_forum) + { + if ($forum_info['forum_parent'] && $next_forum['forum_parent'] != $forum_info['forum_parent']) + { + break; + } + else if ($move_up_forum_id = get_next_root_forum_id($forums, $forum_order)) + { + $move_down_forum_id = $forum_id; + $move_down_forum_order = $forum_order; + $move_down_ord_val = (get_sf_count($move_up_forum_id) + 1) * 10; + $move_up_ord_val = ((get_sf_count($move_down_forum_id) + 1) * 10) + $move_down_ord_val; + } + } + else + { + $show_main_page = true; + break; + } + + if ($forum_info['forum_parent']) + { + $sql = 'UPDATE ' . BB_FORUMS . " SET + forum_order = forum_order + $move + WHERE forum_id = $forum_id"; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't change forum order", '', __LINE__, __FILE__, $sql); + } + } + else if ($move_down_forum_id) + { + $sql = 'UPDATE '. BB_FORUMS ." SET + forum_order = forum_order + $move_down_ord_val + WHERE cat_id = $cat_id + AND forum_order >= $move_down_forum_order"; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't change forum order", '', __LINE__, __FILE__, $sql); + } + + $sql = 'UPDATE '. BB_FORUMS ." SET + forum_order = forum_order - $move_up_ord_val + WHERE forum_id = $move_up_forum_id + OR forum_parent = $move_up_forum_id"; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't change forum order", '', __LINE__, __FILE__, $sql); + } + } + + renumber_order('forum', $forum_info['cat_id']); + $datastore->update('cat_forums'); + + $show_main_page = true; + break; + + case 'cat_order': + $move = (int) $_GET['move']; + $cat_id = (int) $_GET['c']; + + DB()->query(" + UPDATE ". BB_CATEGORIES ." SET + cat_order = cat_order + $move + WHERE cat_id = $cat_id + "); + + renumber_order('category'); + $datastore->update('cat_forums'); + + $show_main_page = true; + break; + + case 'forum_sync': + sync('forum', intval($_GET['f'])); + $datastore->update('cat_forums'); + + $show_main_page = true; + break; + + default: + message_die(GENERAL_MESSAGE, $lang['NO_MODE']); + + break; + } +} + +if (!$mode || $show_main_page) +{ + $template->assign_vars(array( + 'TPL_FORUMS_LIST' => true, + + 'S_FORUM_ACTION' => append_sid("admin_forums.php"), + 'L_FORUM_TITLE' => $lang['FORUM_ADMIN_MAIN'], + 'L_FORUM_EXPLAIN' => $lang['FORUM_ADMIN_EXPLAIN'], + 'L_EDIT' => 'edit', //$lang['EDIT'], + 'L_RESYNC' => 'sync', //$lang['RESYNC'] + )); + + $sql = "SELECT cat_id, cat_title, cat_order + FROM " . BB_CATEGORIES . " + ORDER BY cat_order"; + if( !$q_categories = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not query categories list", "", __LINE__, __FILE__, $sql); + } + + if( $total_categories = DB()->num_rows($q_categories) ) + { + $category_rows = DB()->sql_fetchrowset($q_categories); + + $where_cat_sql = $req_cat_id = ''; + + if ($c =& $_REQUEST['c']) + { + if ($c !== 'all') + { + $req_cat_id = (int) $c; + $where_cat_sql = "WHERE cat_id = $req_cat_id"; + } + else + { + $req_cat_id = 'all'; + } + } + else + { + $where_cat_sql = "WHERE cat_id = '-1'"; + } + + $sql = "SELECT * + FROM ". BB_FORUMS ." + $where_cat_sql + ORDER BY cat_id, forum_order"; + if(!$q_forums = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not query forums information", "", __LINE__, __FILE__, $sql); + } + + if( $total_forums = DB()->num_rows($q_forums) ) + { + $forum_rows = DB()->sql_fetchrowset($q_forums); + } + + // + // Okay, let's build the index + // + $gen_cat = array(); + + $bgr_class_1 = 'prow1'; + $bgr_class_2 = 'prow2'; + $bgr_class_over = 'prow3'; + + $template->assign_vars(array( + 'U_ALL_FORUMS' => "admin_forums.php?c=all", + )); + + for($i = 0; $i < $total_categories; $i++) + { + $cat_id = $category_rows[$i]['cat_id']; + + $template->assign_block_vars("catrow", array( + 'S_ADD_FORUM_SUBMIT' => "addforum[$cat_id]", + 'S_ADD_FORUM_NAME' => "forumname[$cat_id]", + + 'CAT_ID' => $cat_id, + 'CAT_DESC' => htmlCHR($category_rows[$i]['cat_title']), + + 'U_CAT_EDIT' => "admin_forums.php?mode=editcat&c=$cat_id", + 'U_CAT_DELETE' => "admin_forums.php?mode=deletecat&c=$cat_id", + 'U_CAT_MOVE_UP' => "admin_forums.php?mode=cat_order&move=-15&c=$cat_id", + 'U_CAT_MOVE_DOWN' => "admin_forums.php?mode=cat_order&move=15&c=$cat_id", + 'U_VIEWCAT' => "admin_forums.php?c=$cat_id", + 'U_CREATE_FORUM' => "admin_forums.php?mode=addforum&c=$cat_id", + )); + + for($j = 0; $j < $total_forums; $j++) + { + $forum_id = $forum_rows[$j]['forum_id']; + + $bgr_class = (!($j % 2)) ? $bgr_class_2 : $bgr_class_1; + $row_bgr = " class=\"$bgr_class\" onmouseover=\"this.className='$bgr_class_over';\" onmouseout=\"this.className='$bgr_class';\""; + + if ($forum_rows[$j]['cat_id'] == $cat_id) + { + + $template->assign_block_vars("catrow.forumrow", array( + 'FORUM_NAME' => htmlCHR($forum_rows[$j]['forum_name']), + 'FORUM_DESC' => htmlCHR($forum_rows[$j]['forum_desc']), + 'NUM_TOPICS' => $forum_rows[$j]['forum_topics'], + 'NUM_POSTS' => $forum_rows[$j]['forum_posts'], + 'PRUNE_DAYS' => ($forum_rows[$j]['prune_days']) ? $forum_rows[$j]['prune_days'] : '-', + + 'ORDER' => $forum_rows[$j]['forum_order'], + 'FORUM_ID' => $forum_rows[$j]['forum_id'], + 'ROW_BGR' => $row_bgr, + + 'SHOW_ON_INDEX' => (bool) $forum_rows[$j]['show_on_index'], + 'FORUM_PARENT' => $forum_rows[$j]['forum_parent'], + 'SF_PAD' => ($forum_rows[$j]['forum_parent']) ? ' style="padding-left: 20px;" ' : '', + 'FORUM_NAME_CLASS' => ($forum_rows[$j]['forum_parent']) ? 'genmed' : 'gen', + 'ADD_SUB_HREF' => "admin_forums.php?mode=addforum&forum_parent={$forum_rows[$j]['forum_id']}", + 'U_VIEWFORUM' => BB_ROOT ."viewforum.php?f=$forum_id", + 'U_FORUM_EDIT' => "admin_forums.php?mode=editforum&f=$forum_id", + 'U_FORUM_DELETE' => "admin_forums.php?mode=deleteforum&f=$forum_id", + 'U_FORUM_MOVE_UP' => "admin_forums.php?mode=forum_order&move=-15&f=$forum_id&c=$req_cat_id", + 'U_FORUM_MOVE_DOWN' => "admin_forums.php?mode=forum_order&move=15&f=$forum_id&c=$req_cat_id", + 'U_FORUM_RESYNC' => "admin_forums.php?mode=forum_sync&f=$forum_id", + )); + + }// if ... forumid == catid + } // for ... forums + } // for ... categories + }// if ... total_categories +} + +print_page('admin_forums.tpl', 'admin'); + +// +// Functions +// +function get_info($mode, $id) +{ + switch($mode) + { + case 'category': + $table = BB_CATEGORIES; + $idfield = 'cat_id'; + $namefield = 'cat_title'; + break; + + case 'forum': + $table = BB_FORUMS; + $idfield = 'forum_id'; + $namefield = 'forum_name'; + break; + + default: + message_die(GENERAL_ERROR, "Wrong mode for generating select list", "", __LINE__, __FILE__); + break; + } + $sql = "SELECT count(*) as total + FROM $table"; + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't get Forum/Category information", "", __LINE__, __FILE__, $sql); + } + $count = DB()->sql_fetchrow($result); + $count = $count['total']; + + $sql = "SELECT * + FROM $table + WHERE $idfield = $id"; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't get Forum/Category information", "", __LINE__, __FILE__, $sql); + } + + if( DB()->num_rows($result) != 1 ) + { + message_die(GENERAL_ERROR, "Forum/Category doesn't exist or multiple forums/categories with ID $id", "", __LINE__, __FILE__); + } + + $return = DB()->sql_fetchrow($result); + $return['number'] = $count; + return $return; +} + +function get_list($mode, $id, $select) +{ + switch($mode) + { + case 'category': + $table = BB_CATEGORIES; + $idfield = 'cat_id'; + $namefield = 'cat_title'; + $order = 'cat_order'; + break; + + case 'forum': + $table = BB_FORUMS; + $idfield = 'forum_id'; + $namefield = 'forum_name'; + $order = 'cat_id, forum_order'; + break; + + default: + message_die(GENERAL_ERROR, "Wrong mode for generating select list", "", __LINE__, __FILE__); + break; + } + + $sql = "SELECT * + FROM $table"; + if( $select == 0 ) + { + $sql .= " WHERE $idfield <> $id"; + } + $sql .= " ORDER BY $order"; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't get list of Categories/Forums", "", __LINE__, __FILE__, $sql); + } + + $catlist = ''; + + while( $row = DB()->sql_fetchrow($result) ) + { + $s = ""; + if ($row[$idfield] == $id) + { + $s = " selected=\"selected\""; + } + $catlist .= "\n"; + } + + return($catlist); +} + +function renumber_order($mode, $cat = 0) +{ + switch($mode) + { + case 'category': + $table = BB_CATEGORIES; + $idfield = 'cat_id'; + $orderfield = 'cat_order'; + $cat = 0; + break; + + case 'forum': + $table = BB_FORUMS; + $idfield = 'forum_id'; + $orderfield = 'forum_order'; + $catfield = 'cat_id'; + break; + + default: + message_die(GENERAL_ERROR, "Wrong mode for generating select list", "", __LINE__, __FILE__); + break; + } + + $sql = "SELECT * FROM $table"; + if( $cat != 0) + { + $sql .= " WHERE $catfield = $cat"; + } + $sql .= " ORDER BY $orderfield ASC"; + + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't get list of Categories", "", __LINE__, __FILE__, $sql); + } + + $i = 10; + $inc = 10; + + while( $row = DB()->sql_fetchrow($result) ) + { + $sql = "UPDATE $table + SET $orderfield = $i + WHERE $idfield = " . $row[$idfield]; + if( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't update order fields", "", __LINE__, __FILE__, $sql); + } + $i += 10; + } + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't get list of Categories", "", __LINE__, __FILE__, $sql); + } + +} + +function get_cat_forums ($cat_id = FALSE) +{ + $forums = array(); + $where_sql = ''; + + if ($cat_id = intval($cat_id)) + { + $where_sql = "AND f.cat_id = $cat_id"; + } + + $sql = 'SELECT c.cat_title, f.* + FROM '. BB_FORUMS .' f, '. BB_CATEGORIES ." c + WHERE f.cat_id = c.cat_id + $where_sql + ORDER BY c.cat_order, f.cat_id, f.forum_order"; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't get list of Categories", "", __LINE__, __FILE__, $sql); + } + + if ($rowset = DB()->sql_fetchrowset($result)) + { + foreach ($rowset as $rid => $row) + { + $forums[$row['cat_id']]['cat_title'] = $row['cat_title']; + $forums[$row['cat_id']]['f'][$row['forum_id']] = $row; + $forums[$row['cat_id']]['f_ord'][$row['forum_order']] = $row; + } + } + + return $forums; +} + +function get_sf_count ($forum_id) +{ + global $cat_forums; + + $sf_count = 0; + + foreach ($cat_forums as $cid => $c) + { + foreach ($c['f'] as $fid => $f) + { + if ($f['forum_parent'] == $forum_id) + { + $sf_count++; + } + } + } + + return $sf_count; +} + +function get_prev_root_forum_id ($forums, $curr_forum_order) +{ + $i = $curr_forum_order - 10; + + while ($i > 0) + { + if (isset($forums[$i]) && !$forums[$i]['forum_parent']) + { + return $forums[$i]['forum_id']; + } + $i = $i - 10; + } + + return FALSE; +} + +function get_next_root_forum_id ($forums, $curr_forum_order) +{ + $i = $curr_forum_order + 10; + $limit = (count($forums) * 10) + 10; + + while ($i < $limit) + { + if (isset($forums[$i]) && !$forums[$i]['forum_parent']) + { + return $forums[$i]['forum_id']; + } + $i = $i + 10; + } + + return FALSE; +} + +function get_orphan_sf () +{ + global $cat_forums; + + $last_root = 0; + $bad_sf_ary = array(); + + foreach ($cat_forums as $cid => $c) + { + foreach ($c['f'] as $fid => $f) + { + if ($f['forum_parent']) + { + if ($f['forum_parent'] != $last_root) + { + $bad_sf_ary[] = $f['forum_id']; + } + } + else + { + $last_root = $f['forum_id']; + } + } + } + + return implode(',', $bad_sf_ary); +} + +function fix_orphan_sf ($orphan_sf_sql = '', $show_mess = FALSE) +{ + global $lang; + + $done_mess = ''; + + if (!$orphan_sf_sql) + { + $orphan_sf_sql = get_orphan_sf(); + } + + if ($orphan_sf_sql) + { + $sql = "UPDATE ". BB_FORUMS ." SET + forum_parent = 0, + show_on_index = 1 + WHERE forum_id IN($orphan_sf_sql)"; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't change subforums data", '', __LINE__, __FILE__, $sql); + } + + if ($affectedrows = DB()->affected_rows()) + { + $done_mess = "Subforums data corrected. $affectedrows orphan subforum(s) moved to root level."; + } + + if ($show_mess) + { + $message = $done_mess .'

'; + $message .= sprintf($lang['CLICK_RETURN_FORUMADMIN'], "", '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ''); + message_die(GENERAL_MESSAGE, $message); + } + } + + return $done_mess; +} + +function sf_get_list ($mode, $exclude = 0, $select = 0) +{ + global $cat_forums, $forum_parent; + + $opt = ''; + + if ($mode == 'forum') + { + foreach ($cat_forums as $cid => $c) + { + $opt .= ''; + + foreach ($c['f'] as $fid => $f) + { + $selected = ($fid == $select) ? HTML_SELECTED : ''; + $disabled = ($fid == $exclude && !$forum_parent) ? HTML_DISABLED : ''; + $style = ($disabled) ? ' style="color: gray" ' : (($fid == $exclude) ? ' style="color: darkred" ' : ''); + $opt .= '\n"; + } + + $opt .= ''; + } + } + + return $opt; +} + +function get_forum_data ($forum_id) +{ + global $cat_forums; + + foreach ($cat_forums as $cid => $c) + { + foreach ($c['f'] as $fid => $f) + { + if ($fid == $forum_id) + { + return $f; + } + } + } + + return FALSE; +} + +function get_max_forum_order ($cat_id) +{ + $row = DB()->fetch_row(" + SELECT MAX(forum_order) AS max_forum_order + FROM ". BB_FORUMS ." + WHERE cat_id = $cat_id + "); + + return intval($row['max_forum_order']); +} + +function check_name_dup ($mode, $name, $die_on_error = true) +{ + $name_sql = DB()->escape($name); + + if ($mode == 'cat') + { + $what_checked = 'Category'; + $sql = "SELECT cat_id FROM ". BB_CATEGORIES ." WHERE cat_title = '$name_sql'"; + } + else + { + $what_checked = 'Forum'; + $sql = "SELECT forum_id FROM ". BB_FORUMS ." WHERE forum_name = '$name_sql'"; + } + + $name_is_dup = DB()->fetch_row($sql); + + if ($name_is_dup && $die_on_error) + { + bb_die("This $what_checked name taken, please choose something else"); + } + + return $name_is_dup; +} + +/** + * Change subforums cat_id if parent's cat_id was changed + */ +function change_sf_cat ($parent_id, $new_cat_id, $order_shear) +{ + DB()->query(" + UPDATE ". BB_FORUMS ." SET + cat_id = $new_cat_id, + forum_order = forum_order + $order_shear + WHERE forum_parent = $parent_id + "); +} diff --git a/upload/admin/admin_groups.php b/upload/admin/admin_groups.php new file mode 100644 index 000000000..1c82a6291 --- /dev/null +++ b/upload/admin/admin_groups.php @@ -0,0 +1,184 @@ + $row['group_name'], + 'group_description' => $row['group_description'], + 'group_moderator' => $row['group_moderator'], + 'group_mod_name' => $row['moderator_name'], + 'group_type' => $row['group_type'], + ); + $mode = 'editgroup'; + $template->assign_block_vars('group_edit', array()); + } + else if (!empty($_POST['new'])) + { + $group_info = array( + 'group_name' => '', + 'group_description' => '', + 'group_moderator' => '', + 'group_mod_name' => '', + 'group_type' => GROUP_OPEN, + ); + $mode = 'newgroup'; + } + + // Ok, now we know everything about them, let's show the page. + $s_hidden_fields = ' + + + '; + + $template->assign_vars(array( + 'TPL_EDIT_GROUP' => true, + + 'GROUP_NAME' => stripslashes(htmlspecialchars($group_info['group_name'])), + 'GROUP_DESCRIPTION' => stripslashes(htmlspecialchars($group_info['group_description'])), + 'GROUP_MODERATOR' => replace_quote($group_info['group_mod_name']), + 'T_GROUP_EDIT_DELETE' => ($mode == 'newgroup') ? $lang['CREATE_NEW_GROUP'] : $lang['EDIT_GROUP'], + 'U_SEARCH_USER' => append_sid(BB_ROOT ."search.php?mode=searchuser"), + 'S_GROUP_OPEN_TYPE' => GROUP_OPEN, + 'S_GROUP_CLOSED_TYPE' => GROUP_CLOSED, + 'S_GROUP_HIDDEN_TYPE' => GROUP_HIDDEN, + 'S_GROUP_OPEN_CHECKED' => ($group_info['group_type'] == GROUP_OPEN) ? HTML_CHECKED : '', + 'S_GROUP_CLOSED_CHECKED' => ($group_info['group_type'] == GROUP_CLOSED) ? HTML_CHECKED : '', + 'S_GROUP_HIDDEN_CHECKED' => ($group_info['group_type'] == GROUP_HIDDEN ) ? HTML_CHECKED : '', + 'S_GROUP_ACTION' => append_sid("admin_groups.php"), + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); +} +else if (!empty($_POST['group_update'])) +{ + if (!empty($_POST['group_delete'])) + { + if (!$group_info = get_group_data($group_id)) + { + bb_die($lang['GROUP_NOT_EXIST']); + } + // Delete Group + delete_group($group_id); + + $message = $lang['DELETED_GROUP'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_GROUPSADMIN'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); + } + else + { + $group_type = isset($_POST['group_type']) ? intval($_POST['group_type']) : GROUP_OPEN; + $group_name = isset($_POST['group_name']) ? trim($_POST['group_name']) : ''; + $group_desc = isset($_POST['group_description']) ? trim($_POST['group_description']) : ''; + + $group_moderator = isset($_POST['username']) ? $_POST['username'] : ''; + + if ($group_name === '') + { + bb_die($lang['NO_GROUP_NAME']); + } + else if ($group_moderator === '') + { + bb_die($lang['NO_GROUP_MODERATOR']); + } + $this_userdata = get_userdata($group_moderator, true); + + if (!$group_moderator = $this_userdata['user_id']) + { + bb_die($lang['NO_GROUP_MODERATOR']); + } + + $sql_ary = array( + 'group_type' => (int) $group_type, + 'group_name' => (string) $group_name, + 'group_description' => (string) $group_desc, + 'group_moderator' => (int) $group_moderator, + 'group_single_user' => 0, + ); + + if ($mode == "editgroup") + { + if (!$group_info = get_group_data($group_id)) + { + bb_die($lang['GROUP_NOT_EXIST']); + } + + if ($group_info['group_moderator'] != $group_moderator) + { + // Create user_group for new group's moderator + add_user_into_group($group_id, $group_moderator); + + // Delete old moderator's user_group + if (@$_POST['delete_old_moderator']) + { + delete_user_group($group_id, $group_info['group_moderator']); + } + } + + $sql_args = DB()->build_array('UPDATE', $sql_ary); + + // Update group's data + DB()->query("UPDATE ". BB_GROUPS ." SET $sql_args WHERE group_id = $group_id"); + + $message = $lang['UPDATED_GROUP'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_GROUPSADMIN'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); + } + else if ($mode == 'newgroup') + { + $sql_args = DB()->build_array('INSERT', $sql_ary); + + // Create new group + DB()->query("INSERT INTO ". BB_GROUPS ." $sql_args"); + $new_group_id = DB()->sql_nextid(); + + // Create user_group for group's moderator + add_user_into_group($new_group_id, $group_moderator); + + $message = $lang['ADDED_NEW_GROUP'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_GROUPSADMIN'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); + } + else + { + bb_die($lang['NO_GROUP_ACTION']); + } + } +} +else +{ + $template->assign_vars(array( + 'TPL_GROUP_SELECT' => true, + + 'S_GROUP_ACTION' => append_sid("admin_groups.php"), + 'S_GROUP_SELECT' => stripslashes(get_select('groups')), + )); +} + +print_page('admin_groups.tpl', 'admin'); diff --git a/upload/admin/admin_log.php b/upload/admin/admin_log.php new file mode 100644 index 000000000..6e6c381e2 --- /dev/null +++ b/upload/admin/admin_log.php @@ -0,0 +1,435 @@ +enqueue(array( + 'moderators', +)); + +$log_action->init(); + +$per_page = 50; +$row_class_1 = 'prow1'; +$row_class_2 = 'prow2'; +$def_days = 3; +$def_datetime = TIMENOW; +$max_forum_name_len = 40; +$title_match_max_len = 60; +$poster_name_max_len = 25; +$select_max_height = 16; +$dt_format = 'Y-m-d'; // used in one-day filter + +$url = append_sid(basename(__FILE__)); + +// Key names +$type_key = 'type'; +$forum_key = 'f'; +$topic_key = 't'; +$user_key = 'u'; +$datetime_key = 'dt'; // value should be strtotime() time ("2006-06-25" etc.) +$daysback_key = 'db'; +$sort_key = 'sort'; +$title_match_key = 'tm'; + +// Key values +$all_types = 0; // =| +$all_users = 0; // |> only "0" is a valid value +$all_forums = 0; // =| + +$sort_asc = 'ASC'; +$sort_desc = 'DESC'; + +// Defaults +$def_types = $all_types; +$def_users = $all_users; +$def_forums = $all_forums; +$def_sort = $sort_desc; + +// Moderators data +if (!$mod = $datastore->get('moderators')) +{ + $datastore->update('moderators'); + $mod = $datastore->get('moderators'); +} +array_deep($mod['moderators'], 'html_entity_decode'); +array_deep($mod['admins'], 'html_entity_decode'); + +$users = array($lang['ACTS_LOG_ALL_ACTIONS'] => $all_users) + array_flip($mod['moderators']) + array_flip($mod['admins']); + +unset($mod); + +// Forums data +if (!$forums = $datastore->get('cat_forums')) +{ + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); +} +$f_data = $forums['f']; + +unset($forums); + +// Start +$start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; + +// Type +$type_selected = array($def_types); +$type_csv = ''; + +if ($var =& $_REQUEST[$type_key]) +{ + $type_selected = get_id_ary($var); + + if (in_array($all_types, $type_selected)) + { + $type_selected = array($all_types); + } + $type_csv = join(',', $type_selected); + $url = ($type_csv != $def_types) ? url_arg($url, $type_key, $type_csv) : $url; +} + +// User +$user_selected = array($def_users); +$user_csv = ''; + +if ($var =& $_REQUEST[$user_key]) +{ + $user_selected = get_id_ary($var); + + if (in_array($all_users, $user_selected)) + { + $user_selected = array($all_users); + } + $user_csv = join(',', $user_selected); + $url = ($user_csv != $def_users) ? url_arg($url, $user_key, $user_csv) : $url; +} + +// Forum +$forum_selected = array($def_forums); +$forum_csv = ''; + +if ($var =& $_REQUEST[$forum_key]) +{ + $forum_selected = get_id_ary($var); + + if (in_array($all_forums, $forum_selected)) + { + $forum_selected = array($all_forums); + } + $forum_csv = join(',', $forum_selected); + $url = ($forum_csv != $def_forums) ? url_arg($url, $forum_key, $forum_csv) : $url; +} + +// Topic +$topic_selected = null; +$topic_csv = ''; + +if ($var =& $_REQUEST[$topic_key]) +{ + $topic_selected = get_id_ary($var); + $topic_csv = join(',', $topic_selected); + $url = ($topic_csv) ? url_arg($url, $topic_key, $topic_csv) : $url; +} + +// Order +$order_val = 'log_time'; + +// Sort +$sort_val = $def_sort; + +if ($var =& $_REQUEST[$sort_key] AND $var != $def_sort) +{ + $sort_val = ($var == $sort_asc) ? $sort_asc : $sort_desc; + $url = url_arg($url, $sort_key, $sort_val); +} + +// Time +$datetime_val = $def_datetime; +$daysback_val = $def_days; + +if ($var =& $_REQUEST[$daysback_key] AND $var != $def_days) +{ + $daysback_val = max(intval($var), 1); + $url = url_arg($url, $daysback_key, $daysback_val); +} +if ($var =& $_REQUEST[$datetime_key] AND $var != $def_datetime) +{ + $tz = TIMENOW + (3600 * $bb_cfg['board_timezone']); + if (($tmp_timestamp = strtotime($var, $tz)) > 0) + { + $datetime_val = $tmp_timestamp; + $url = url_arg($url, $datetime_key, date($dt_format, $datetime_val)); + } +} + +$time_end_val = 86400 + mktime(0, 0, 0, date('m', $datetime_val), date('d', $datetime_val), date('Y', $datetime_val)); +$time_start_val = $time_end_val - 86400*$daysback_val; + +// First log time +$row = DB()->fetch_row("SELECT MIN(log_time) AS first_log_time FROM ". BB_LOG); +$first_log_time = (int) $row['first_log_time']; + +// Title match +$title_match_val = $title_match_sql = ''; + +if ($var =& $_REQUEST[$title_match_key]) +{ + if ($tmp_title_match = substr(urldecode(trim($var)), 0, $title_match_max_len)) + { + $title_match_val = htmlspecialchars($tmp_title_match); + $title_match_sql = DB()->escape($tmp_title_match); + $url = url_arg($url, $title_match_key, urlencode($tmp_title_match)); + } +} + +// +// SQL +// +$select = "SELECT *"; + +$from = "FROM ". BB_LOG; + +$where = " + WHERE log_time BETWEEN $time_start_val AND $time_end_val +"; +$where .= ($type_csv) ? " + AND log_type_id IN($type_csv) +" : ''; +$where .= ($user_csv) ? " + AND log_user_id IN($user_csv) +" : ''; +$where .= ($forum_csv) ? " + AND log_forum_id IN($forum_csv) +" : ''; +$where .= ($topic_csv) ? " + AND log_topic_id IN($topic_csv) +" : ''; +$where .= ($title_match_sql) ? " + AND MATCH (log_topic_title) AGAINST ('$title_match_sql' IN BOOLEAN MODE) +" : ''; + +$order = "ORDER BY $order_val"; + +$sort = $sort_val; + +$limit = "LIMIT $start, ". ($per_page + 1); + +$sql = " + $select + $from + $where + $order + $sort + $limit +"; + +$log_rowset = DB()->fetch_rowset($sql); +$log_count = count($log_rowset); + +if ($log_count == $per_page + 1) +{ + $items_count = $start + ($per_page * 2); + $pages = '?'; + array_pop($log_rowset); +} +else +{ + $items_count = $start + $log_count; + $pages = (!$log_count) ? 1 : ceil($items_count / $per_page); +} + +$template->assign_vars(array( + 'PAGINATION' => generate_pagination($url, $items_count, $per_page, $start), + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], floor($start / $per_page) + 1, $pages), +)); + +$filter = array(); + +if ($log_rowset) +{ + $log_type = $log_action->log_type; + $log_type_flip = array_flip($log_type); + + foreach ($log_rowset as $row_num => $row) + { + $msg = ''; + $forum_name = $forum_name_new = ''; + $topic_title = $topic_title_new = ''; + + $topic_deleted = ($row['log_type_id'] == $log_type['mod_topic_delete']); + + switch ($row['log_type_id']) + { + case $log_type['mod_topic_delete']: + case $log_type['mod_topic_move']: + case $log_type['mod_topic_lock']: + case $log_type['mod_topic_unlock']: + case $log_type['mod_post_delete']: + case $log_type['mod_topic_split']: + // topic_title + if (!empty($row['log_topic_title'])) + { + $topic_title = $row['log_topic_title']; + } + // topic_title_new + if (!empty($row['log_topic_title_new'])) + { + $topic_title_new = $row['log_topic_title_new']; + } + // forum_name + if ($fid =& $row['log_forum_id']) + { + $forum_name = ($fname =& $f_data[$fid]['forum_name']) ? $fname : 'id:'. $row['log_forum_id']; + } + // forum_name_new + if ($fid =& $row['log_forum_id_new']) + { + $forum_name_new = ($fname =& $f_data[$fid]['forum_name']) ? $fname : 'id:'. $row['log_forum_id']; + } + + break; + } + + $msg .= " $row[log_msg]"; + + $row_class = !($row_num & 1) ? $row_class_1 : $row_class_2; + + $datetime_href_s = url_arg($url, $datetime_key, date($dt_format, $row['log_time'])); + $datetime_href_s = url_arg($datetime_href_s, $daysback_key, 1); + + $template->assign_block_vars('log', array( + 'ACTION_DESC' => $lang['LOG_ACTION']['LOG_TYPE'][$log_type_flip[$row['log_type_id']]], + 'ACTION_HREF_S' => url_arg($url, $type_key, $row['log_type_id']), + + 'USER_ID' => $row['log_user_id'], + 'USERNAME' => $row['log_username'], + 'USER_HREF_S' => url_arg($url, $user_key, $row['log_user_id']), + 'USER_IP' => decode_ip($row['log_user_ip']), + + 'FORUM_ID' => $row['log_forum_id'], + 'FORUM_HREF' => BB_ROOT . FORUM_URL . $row['log_forum_id'], + 'FORUM_HREF_S' => url_arg($url, $forum_key, $row['log_forum_id']), + 'FORUM_NAME' => htmlCHR($forum_name), + + 'FORUM_ID_NEW' => $row['log_forum_id_new'], + 'FORUM_HREF_NEW' => BB_ROOT . FORUM_URL . $row['log_forum_id_new'], + 'FORUM_HREF_NEW_S' => url_arg($url, $forum_key, $row['log_forum_id_new']), + 'FORUM_NAME_NEW' => htmlCHR($forum_name_new), + + 'TOPIC_ID' => $row['log_topic_id'], + 'TOPIC_HREF' => (!$topic_deleted) ? BB_ROOT . TOPIC_URL . $row['log_topic_id'] : '', + 'TOPIC_HREF_S' => url_arg($url, $topic_key, $row['log_topic_id']), + 'TOPIC_TITLE' => $topic_title, + + 'TOPIC_ID_NEW' => $row['log_topic_id_new'], + 'TOPIC_HREF_NEW' => BB_ROOT . TOPIC_URL . $row['log_topic_id_new'], + 'TOPIC_HREF_NEW_S' => url_arg($url, $topic_key, $row['log_topic_id_new']), + 'TOPIC_TITLE_NEW' => $topic_title_new, + + 'DATE' => bb_date($row['log_time'], 'j-M'), + 'TIME' => bb_date($row['log_time'], 'H:i'), + 'DATETIME_HREF_S' => $datetime_href_s, + 'MSG' => $msg, + 'ROW_CLASS' => $row_class, + + )); + + // Topics + if ($topic_csv && empty($filter['topics'][$row['log_topic_title']])) + { + $template->assign_block_vars('topics', array( + 'TOPIC_TITLE' => $row['log_topic_title'], + )); + $filter['topics'][$row['log_topic_title']] = true; + } + // Forums + if ($forum_csv && empty($filter['forums'][$forum_name])) + { + $template->assign_block_vars('forums', array( + 'FORUM_NAME' => htmlCHR($forum_name), + )); + $filter['forums'][$forum_name] = true; + } + // Users + if ($user_csv && empty($filter['users'][$row['log_username']])) + { + $template->assign_block_vars('users', array( + 'USERNAME' => $row['log_username'], + )); + $filter['users'][$row['log_username']] = true; + } + } + + $template->assign_vars(array( + 'FILTERS' => ($topic_csv || $forum_csv || $user_csv), + 'FILTER_TOPICS' => !empty($filter['topics']), + 'FILTER_FORUMS' => !empty($filter['forums']), + 'FILTER_USERS' => !empty($filter['users']), + )); +} +else +{ + $template->assign_block_vars('log_not_found', array()); +} + +// +// Selects +// +$log_type_select = array($lang['ACTS_LOG_ALL_ACTIONS'] => $all_types) + $log_action->log_type_select; + +// Order select +$order_options = ''; + +$template->assign_vars(array( + 'LOG_COLSPAN' => 4, + + 'L_NO_MATCH' => $lang['NO_MATCH'], + 'L_ADM_LOG_ALL_ACTIONS' => $lang['ACTS_LOG_ALL_ACTIONS'], + 'L_ADM_LOG_SEARCH_OPTIONS' => $lang['ACTS_LOG_SEARCH_OPTIONS'], + 'L_ADM_LOG_FORUM' => $lang['ACTS_LOG_FORUM'], + 'L_ADM_LOG_ACTION' => $lang['ACTS_LOG_ACTION'], + 'L_ADM_LOG_USER' => $lang['ACTS_LOG_USER'], + 'L_ADM_LOG_LOGS_FROM' => $lang['ACTS_LOG_LOGS_FROM'], + 'L_ADM_LOG_FIRST' => $lang['ACTS_LOG_FIRST'], + 'L_ADM_LOG_DAYS_BACK' => $lang['ACTS_LOG_DAYS_BACK'], + 'L_ADM_LOG_TOPIC_MATCH' => $lang['ACTS_LOG_TOPIC_MATCH'], + 'L_ADM_LOG_SORT_BY' => $lang['ACTS_LOG_SORT_BY'], + 'L_ADM_LOG_ACTION' => $lang['ACTS_LOG_LOGS_ACTION'], + 'L_ADM_LOG_USERNAME' => $lang['ACTS_LOG_USERNAME'], + 'L_ADM_LOG_TIME' => $lang['ACTS_LOG_TIME'], + 'L_ADM_LOG_INFO' => $lang['ACTS_LOG_INFO'], + + 'DATETIME_NAME' => $datetime_key, + 'DATETIME_VAL' => date('Y-m-d', $datetime_val), + 'DAYSBACK_NAME' => $daysback_key, + 'DAYSBACK_VAL' => $daysback_val, + 'FIRST_LOG_TIME' => ($first_log_time) ? date('Y-m-d', $first_log_time) : 'none', + + 'TITLE_MATCH_MAX' => $title_match_max_len, + 'TITLE_MATCH_NAME' => $title_match_key, + 'TITLE_MATCH_VAL' => $title_match_val, + + 'ORDER_NAME' => '', + 'ORDER_OPTIONS' => $order_options, + + 'SORT_NAME' => $sort_key, + 'SORT_ASC' => $sort_asc, + 'SORT_DESC' => $sort_desc, + 'SORT_ASC_CHECKED' => ($sort_val == $sort_asc) ? HTML_CHECKED : '', + 'SORT_DESC_CHECKED' => ($sort_val == $sort_desc) ? HTML_CHECKED : '', + + 'SEL_FORUM' => get_forum_select('admin', "{$forum_key}[]", $forum_selected, $max_forum_name_len, $select_max_height, '', $all_forums), + 'SEL_LOG_TYPE' => build_select("{$type_key}[]", $log_type_select, $type_selected, 60, $select_max_height), + 'SEL_USERS' => build_select("{$user_key}[]", $users, $user_selected, 16, $select_max_height), + + 'S_LOG_ACTION' => append_sid("admin_log.php"), + 'TOPIC_CSV' => $topic_csv, +)); + +print_page('admin_log.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_mass_email.php b/upload/admin/admin_mass_email.php new file mode 100644 index 000000000..53b839a12 --- /dev/null +++ b/upload/admin/admin_mass_email.php @@ -0,0 +1,162 @@ +' . $lang['EMPTY_SUBJECT'] : $lang['EMPTY_SUBJECT']; + } + + if ( empty($message) ) + { + $error = true; + $error_msg .= ( !empty($error_msg) ) ? '
' . $lang['EMPTY_MESSAGE'] : $lang['EMPTY_MESSAGE']; + } + + $group_id = intval($_POST[POST_GROUPS_URL]); + + $sql = ( $group_id != -1 ) ? "SELECT u.user_email FROM " . BB_USERS . " u, " . BB_USER_GROUP . " ug WHERE ug.group_id = $group_id AND ug.user_pending <> 1 AND u.user_id = ug.user_id" : "SELECT user_email FROM " . BB_USERS; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select group members', '', __LINE__, __FILE__, $sql); + } + + if ( $row = DB()->sql_fetchrow($result) ) + { + $bcc_list = array(); + do + { + $bcc_list[] = $row['user_email']; + } + while ( $row = DB()->sql_fetchrow($result) ); + + DB()->sql_freeresult($result); + } + else + { + $message = ( $group_id != -1 ) ? $lang['GROUP_NOT_EXIST'] : $lang['NO_SUCH_USER']; + + $error = true; + $error_msg .= ( !empty($error_msg) ) ? '
' . $message : $message; + } + + if ( !$error ) + { + include(INC_DIR . 'emailer.class.php'); + + // + // Let's do some checking to make sure that mass mail functions + // are working in win32 versions of php. + // + if ( preg_match('/[c-z]:\\\.*/i', getenv('PATH')) && !$bb_cfg['smtp_delivery']) + { + $ini_val = ( @phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var'; + + // We are running on windows, force delivery to use our smtp functions + // since php's are broken by default + $bb_cfg['smtp_delivery'] = 1; + $bb_cfg['smtp_host'] = @$ini_val('SMTP'); + } + + $emailer = new emailer($bb_cfg['smtp_delivery']); + + $emailer->from($bb_cfg['board_email']); + $emailer->replyto($bb_cfg['board_email']); + + for ($i = 0; $i < count($bcc_list); $i++) + { + $emailer->bcc($bcc_list[$i]); + } + + $email_headers = 'X-AntiAbuse: Board servername - ' . $bb_cfg['server_name'] . "\n"; + $email_headers .= 'X-AntiAbuse: User_id - ' . $userdata['user_id'] . "\n"; + $email_headers .= 'X-AntiAbuse: Username - ' . $userdata['username'] . "\n"; + $email_headers .= 'X-AntiAbuse: User IP - ' . CLIENT_IP . "\n"; + + $emailer->use_template('admin_send_email'); + $emailer->email_address($bb_cfg['board_email']); + $emailer->set_subject($subject); + $emailer->extra_headers($email_headers); + + $emailer->assign_vars(array( + 'SITENAME' => $bb_cfg['sitename'], + 'BOARD_EMAIL' => $bb_cfg['board_email'], + 'MESSAGE' => $message) + ); + $emailer->send(); + $emailer->reset(); + + message_die(GENERAL_MESSAGE, $lang['EMAIL_SENT'] . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', '')); + } +} + +if ( @$error ) +{ + $template->assign_vars(array('ERROR_MESSAGE' => $error_msg)); +} + +// +// Initial selection +// + +$sql = "SELECT group_id, group_name + FROM ".BB_GROUPS . " + WHERE group_single_user <> 1"; +if ( !($result = DB()->sql_query($sql)) ) +{ + message_die(GENERAL_ERROR, 'Could not obtain list of groups', '', __LINE__, __FILE__, $sql); +} + +$select_list = ''; + +// +// Generate page +// +require(PAGE_HEADER); + +$template->assign_vars(array( + 'MESSAGE' => $message, + 'SUBJECT' => $subject, + + 'L_EMAIL_EXPLAIN' => $lang['MASS_EMAIL_EXPLAIN'], + 'L_EMAIL_SUBJECT' => $lang['SUBJECT'], + 'L_NOTICE' => @$notice, + + 'S_USER_ACTION' => append_sid('admin_mass_email.php'), + 'S_GROUP_SELECT' => $select_list) +); + +print_page('admin_mass_email.tpl', 'admin'); diff --git a/upload/admin/admin_phpinfo.php b/upload/admin/admin_phpinfo.php new file mode 100644 index 000000000..954ae38a4 --- /dev/null +++ b/upload/admin/admin_phpinfo.php @@ -0,0 +1,12 @@ +update('ranks'); } +register_shutdown_function('update_ranks'); + +require('./pagestart.php'); +// ACP Header - END + +$_POST['special_rank'] = 1; +$_POST['min_posts'] = -1; + +if( isset($_GET['mode']) || isset($_POST['mode']) ) +{ + $mode = isset($_GET['mode']) ? $_GET['mode'] : $_POST['mode']; +} +else +{ + // + // These could be entered via a form button + // + if( isset($_POST['add']) ) + { + $mode = "add"; + } + else if( isset($_POST['save']) ) + { + $mode = "save"; + } + else + { + $mode = ""; + } +} + + +if( $mode != "" ) +{ + if( $mode == "edit" || $mode == "add" ) + { + // + // They want to add a new rank, show the form. + // + $rank_id = ( isset($_GET['id']) ) ? intval($_GET['id']) : 0; + + $s_hidden_fields = ""; + + if( $mode == "edit" ) + { + if( empty($rank_id) ) + { + message_die(GENERAL_MESSAGE, $lang['MUST_SELECT_RANK']); + } + + $sql = "SELECT * FROM " . BB_RANKS . " + WHERE rank_id = $rank_id"; + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't obtain rank data", "", __LINE__, __FILE__, $sql); + } + + $rank_info = DB()->sql_fetchrow($result); + $s_hidden_fields .= ''; + + } + else + { + $rank_info['rank_special'] = 0; + } + + $s_hidden_fields .= ''; + + $rank_is_special = ( $rank_info['rank_special'] ) ? "checked=\"checked\"" : ""; + $rank_is_not_special = ( !$rank_info['rank_special'] ) ? "checked=\"checked\"" : ""; + + $template->assign_vars(array( + 'TPL_RANKS_EDIT' => true, + + "RANK" => @$rank_info['rank_title'], + "SPECIAL_RANK" => $rank_is_special, + "NOT_SPECIAL_RANK" => $rank_is_not_special, + "MINIMUM" => ( $rank_is_special ) ? "" : @$rank_info['rank_min'], + "IMAGE" => ( @$rank_info['rank_image'] ) ? $rank_info['rank_image'] : "images/ranks/rank_image.gif", + "IMAGE_DISPLAY" => ( @$rank_info['rank_image'] ) ? '' : "", + + "L_RANKS_TEXT" => $lang['RANKS_EXPLAIN'], + + "S_RANK_ACTION" => append_sid("admin_ranks.php"), + "S_HIDDEN_FIELDS" => $s_hidden_fields) + ); + + } + else if( $mode == "save" ) + { + // + // Ok, they sent us our info, let's update it. + // + + $rank_id = ( isset($_POST['id']) ) ? intval($_POST['id']) : 0; + $rank_title = ( isset($_POST['title']) ) ? trim($_POST['title']) : ""; + $special_rank = ( $_POST['special_rank'] == 1 ) ? TRUE : 0; + $min_posts = ( isset($_POST['min_posts']) ) ? intval($_POST['min_posts']) : -1; + $rank_image = ( (isset($_POST['rank_image'])) ) ? trim($_POST['rank_image']) : ""; + + if( $rank_title == "" ) + { + message_die(GENERAL_MESSAGE, $lang['MUST_SELECT_RANK']); + } + + if( $special_rank == 1 ) + { + $max_posts = -1; + $min_posts = -1; + } + + // + // The rank image has to be a jpg, gif or png + // + if($rank_image != "") + { + if ( !preg_match("/(\.gif|\.png|\.jpg)$/is", $rank_image)) + { + $rank_image = ""; + } + } + + if ($rank_id) + { + if (!$special_rank) + { + $sql = "UPDATE " . BB_USERS . " + SET user_rank = 0 + WHERE user_rank = $rank_id"; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, $lang['NO_UPDATE_RANKS'], "", __LINE__, __FILE__, $sql); + } + } + $sql = "UPDATE " . BB_RANKS . " + SET rank_title = '" . str_replace("\'", "''", $rank_title) . "', rank_special = $special_rank, rank_min = $min_posts, rank_image = '" . str_replace("\'", "''", $rank_image) . "' + WHERE rank_id = $rank_id"; + + $message = $lang['RANK_UPDATED']; + } + else + { + $sql = "INSERT INTO " . BB_RANKS . " (rank_title, rank_special, rank_min, rank_image) + VALUES ('" . str_replace("\'", "''", $rank_title) . "', $special_rank, $min_posts, '" . str_replace("\'", "''", $rank_image) . "')"; + + $message = $lang['RANK_ADDED']; + } + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't update/insert into ranks table", "", __LINE__, __FILE__, $sql); + } + + $message .= "

" . sprintf($lang['CLICK_RETURN_RANKADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + + } + else if( $mode == "delete" ) + { + // + // Ok, they want to delete their rank + // + + if( isset($_POST['id']) || isset($_GET['id']) ) + { + $rank_id = ( isset($_POST['id']) ) ? intval($_POST['id']) : intval($_GET['id']); + } + else + { + $rank_id = 0; + } + + if( $rank_id ) + { + $sql = "DELETE FROM " . BB_RANKS . " + WHERE rank_id = $rank_id"; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't delete rank data", "", __LINE__, __FILE__, $sql); + } + + $sql = "UPDATE " . BB_USERS . " + SET user_rank = 0 + WHERE user_rank = $rank_id"; + + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, $lang['NO_UPDATE_RANKS'], "", __LINE__, __FILE__, $sql); + } + + $message = $lang['RANK_REMOVED'] . "

" . sprintf($lang['CLICK_RETURN_RANKADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + + } + else + { + message_die(GENERAL_MESSAGE, $lang['MUST_SELECT_RANK']); + } + } + else + { + message_die(GENERAL_MESSAGE, 'Invalid mode'); + } +} +else +{ + // + // Show the default page + // + $sql = "SELECT * FROM " . BB_RANKS . " + ORDER BY rank_min, rank_title"; + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't obtain ranks data", "", __LINE__, __FILE__, $sql); + } + $rank_count = DB()->num_rows($result); + + $rank_rows = DB()->sql_fetchrowset($result); + + $template->assign_vars(array( + 'TPL_RANKS_LIST' => true, + + "L_RANKS_TEXT" => $lang['RANKS_EXPLAIN'], + "L_RANK" => $lang['RANK_TITLE'], + "L_ADD_RANK" => $lang['ADD_NEW_RANK'], + + "S_RANKS_ACTION" => append_sid("admin_ranks.php")) + ); + + for($i = 0; $i < $rank_count; $i++) + { + $rank = $rank_rows[$i]['rank_title']; + $special_rank = $rank_rows[$i]['rank_special']; + $rank_id = $rank_rows[$i]['rank_id']; + $rank_min = $rank_rows[$i]['rank_min']; + + if( $special_rank == 1 ) + { + $rank_min = $rank_max = "-"; + } + + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $rank_is_special = ( $special_rank ) ? $lang['YES'] : $lang['NO']; + + $template->assign_block_vars("ranks", array( + "ROW_CLASS" => $row_class, + "RANK" => $rank, + "IMAGE_DISPLAY" => ( @$rank_rows[$i]['rank_image'] ) ? '' : "", + "SPECIAL_RANK" => $rank_is_special, + "RANK_MIN" => $rank_min, + + "U_RANK_EDIT" => append_sid("admin_ranks.php?mode=edit&id=$rank_id"), + "U_RANK_DELETE" => append_sid("admin_ranks.php?mode=delete&id=$rank_id")) + ); + } +} + +print_page('admin_ranks.tpl', 'admin'); diff --git a/upload/admin/admin_rebuild_search.php b/upload/admin/admin_rebuild_search.php new file mode 100644 index 000000000..98a9d0a75 --- /dev/null +++ b/upload/admin/admin_rebuild_search.php @@ -0,0 +1,635 @@ +query(" + UPDATE ". BB_SEARCH_REBUILD ." SET + rebuild_session_status = ". REBUILD_SEARCH_ABORTED ." + WHERE rebuild_session_id = $last_session_id + "); + } + + $message = sprintf($lang['REBUILD_SEARCH_ABORTED'], $last_session_data['end_post_id']) .'

'. sprintf($lang['CLICK_RETURN_REBUILD_SEARCH'], '', ''); + message_die(GENERAL_MESSAGE, $message); +} + +// from which post to start processing +$start = abs(intval(@$_REQUEST['start'])); + +// get the total number of posts in the db +$total_posts = get_total_posts(); + +// clear the search tables and clear mode (delete or truncate) +$clear_search = isset($_REQUEST['clear_search']) ? (int) $_REQUEST['clear_search'] : 0; + +// get the number of total/session posts already processed +$total_posts_processed = ( $start != 0 ) ? get_total_posts('before', $last_session_data['end_post_id']) : 0; +$session_posts_processed = ( $mode == 'refresh' ) ? get_processed_posts('session') : 0; + +// find how many posts aren't processed +$total_posts_processing = $total_posts - $total_posts_processed; + +// how many posts to process in this session +if ($session_posts_processing = @intval($_REQUEST['session_posts_processing'])) +{ + if ($mode == 'submit') + { + // check if we passed over total_posts just after submitting + if ($session_posts_processing + $total_posts_processed > $total_posts) + { + $session_posts_processing = $total_posts - $total_posts_processed; + } + } + // correct it when posts are deleted during processing + $session_posts_processing = ($session_posts_processing > $total_posts) ? $total_posts : $session_posts_processing; +} +else +{ + // if we have finished, get all the posts, else only the remaining + $session_posts_processing = (!$total_posts_processing) ? $total_posts : $total_posts_processing; +} + +// how many posts to process per cycle +$post_limit = isset($_REQUEST['post_limit']) ? (int) $_REQUEST['post_limit'] : $def_post_limit; + +// correct the post_limit when we pass over it +if ( $session_posts_processed + $post_limit > $session_posts_processing ) +{ + $post_limit = $session_posts_processing - $session_posts_processed; +} + +// how much time to wait per cycle +if (isset($_REQUEST['time_limit'])) +{ + $time_limit = (int) $_REQUEST['time_limit']; +} +else +{ + $time_limit = $def_time_limit; + $time_limit_explain = $lang['TIME_LIMIT_EXPLAIN']; + + // check for safe mode timeout + if ( ini_get('safe_mode') ) + { + // get execution time + $max_execution_time = ini_get('max_execution_time'); + $time_limit_explain .= '
' . sprintf($lang['TIME_LIMIT_EXPLAIN_SAFE'], $max_execution_time); + + if ( $time_limit > $max_execution_time ) + { + $time_limit = $max_execution_time; + } + } + + // check for webserver timeout (IE returns null) + if ( isset($_SERVER["HTTP_KEEP_ALIVE"]) ) + { + // get webserver timeout + $webserver_timeout = intval($_SERVER["HTTP_KEEP_ALIVE"]); + $time_limit_explain .= '
' . sprintf($lang['TIME_LIMIT_EXPLAIN_WEBSERVER'], $webserver_timeout); + + if ( $time_limit > $webserver_timeout ) + { + $time_limit = $webserver_timeout; + } + } +} + +// how much time to wait between page refreshes +$refresh_rate = isset($_REQUEST['refresh_rate']) ? (int) $_REQUEST['refresh_rate'] : $def_refresh_rate; + +// check if the user gave wrong input +if ($mode == 'submit') +{ + if ($session_posts_processing <= 0 || $post_limit <= 0 || $refresh_rate <= 0 || $time_limit <=0) + { + $message = $lang['WRONG_INPUT'] .'

'. sprintf($lang['CLICK_RETURN_REBUILD_SEARCH'], '', ''); + message_die(GENERAL_MESSAGE, $message); + } +} + +//--------------------------------------------------------------------- +// Main code starts from here +// + +// Increase maximum execution time in case of a lot of posts, but don't complain about it if it isn't allowed. +@set_time_limit($time_limit + 20); + +// check if we are should start processing +if ($mode == 'submit' || $mode == 'refresh') +{ + // check if we are in the beginning of processing + if ($start == 0) + { + $last_session_data = get_empty_last_session_data(); + clear_search_tables($clear_search); + } + + // get the db sizes + list($search_data_size, $search_index_size, $search_tables_size) = get_db_sizes(); + + // get the post subject/text of each post + $result = DB()->query(" + SELECT + pt.post_id, + pt.post_text, pt.bbcode_uid, + IF(p.post_id = t.topic_first_post_id, t.topic_title, '') AS post_subject + FROM + ". BB_POSTS_TEXT ." pt, + ". BB_POSTS ." p, + ". BB_TOPICS ." t + WHERE p.post_id = pt.post_id + AND t.topic_id = p.topic_id + AND p.poster_id NOT IN(". BOT_UID .") + AND pt.post_id >= $start + ORDER BY pt.post_id ASC + LIMIT $post_limit + "); + + $expire_time = $start_time + $time_limit - 5; + $start_post_id = $end_post_id = $num_rows = 0; + $timer_expired = false; + $words_sql = array(); + + while ($row = DB()->fetch_next($result) AND !$timer_expired) + { + @set_time_limit(600); + $start_post_id = ($num_rows == 0) ? $row['post_id'] : $start_post_id; + $end_post_id = $row['post_id']; + + // Get search words + $words_sql[] = array( + 'post_id' => (int) $row['post_id'], + 'search_words' => add_search_words($row['post_id'], stripslashes($row['post_text']), stripslashes($row['post_subject']), $row['bbcode_uid'], true), + ); + + $timer_expired = (time() > $expire_time); + $num_rows++; + } + + // Store search words + if ($words_sql) + { + DB()->query("REPLACE INTO ". BB_POSTS_SEARCH . DB()->build_array('MULTI_INSERT', $words_sql)); + } + + // find how much time the last cycle took + $last_cycle_time = intval(time() - $start_time); + + // check if we had any data + if ($num_rows != 0) + { + if ($mode == 'submit') + { + // insert a new session entry + $args = DB()->build_array('INSERT', array( + 'end_post_id' => (int) $end_post_id, + 'end_time' => (int) time(), + 'last_cycle_time' => (int) $last_cycle_time, + 'session_time' => (int) $last_cycle_time, + 'session_posts' => (int) $num_rows, + 'session_cycles' => (int) 1, + 'start_post_id' => (int) $start_post_id, + 'start_time' => (int) $start_time, + 'search_size' => (int) $search_tables_size, + 'rebuild_session_status' => REBUILD_SEARCH_PROCESSED, + )); + DB()->query("REPLACE INTO ". BB_SEARCH_REBUILD . $args); + } + else // refresh + { + // update the last session entry + DB()->query(" + UPDATE ". BB_SEARCH_REBUILD ." SET + end_post_id = $end_post_id, + end_time = ". time() .", + last_cycle_time = $last_cycle_time, + session_time = session_time + $last_cycle_time, + session_posts = session_posts + $num_rows, + session_cycles = session_cycles + 1, + rebuild_session_status = ". REBUILD_SEARCH_PROCESSED ." + WHERE rebuild_session_id = $last_session_id + "); + } + } + + $last_session_data = get_rebuild_session_details('last', 'all'); + $template->assign_vars(array('TPL_REBUILD_SEARCH_PROGRESS' => true)); + + $processing_messages = ''; + $processing_messages .= ($timer_expired) ? sprintf($lang['TIMER_EXPIRED'], time() - $start_time) : ''; + $processing_messages .= ($start == 0 && $clear_search) ? $lang['CLEARED_SEARCH_TABLES'] : ''; + + // check if we have reached the end of our post processing + $session_posts_processed = get_processed_posts('session'); + $total_posts_processed = get_total_posts('before', $last_session_data['end_post_id']); + $total_posts = get_total_posts(); + + if ( $session_posts_processed < $session_posts_processing && $total_posts_processed < $total_posts ) + { + $form_parameters = '&start='.($end_post_id+1); + $form_parameters .= '&session_posts_processing='.$session_posts_processing; + $form_parameters .= '&post_limit='.$post_limit; + $form_parameters .= '&time_limit='.$time_limit; + $form_parameters .= '&refresh_rate='.$refresh_rate; + + $form_action = append_sid('admin_rebuild_search.php'.'?mode=refresh'.$form_parameters); + $next_button = $lang['NEXT']; + $progress_bar_img = $images['progress_bar']; + + $processing_messages .= sprintf($lang['PROCESSING_NEXT_POSTS'], $post_limit); + + // create the meta tag for refresh + $template->assign_vars(array( + 'META' => '', + 'CANCEL_BUTTON' => true, + )); + } + else // end of processing + { + $form_action = append_sid("admin_rebuild_search.php"); + $next_button = $lang['FINISHED']; + $progress_bar_img = $images['progress_bar_full']; + + $processing_messages .= ( $session_posts_processed < $session_posts_processing ) ? sprintf($lang['DELETED_POSTS'], $session_posts_processing - $session_posts_processed) : ''; + $processing_messages .= ( $total_posts_processed == $total_posts ) ? $lang['ALL_POSTS_PROCESSED'] : $lang['ALL_SESSION_POSTS_PROCESSED']; + + // if we have processed all the db posts we need to update the rebuild_status + DB()->query("UPDATE ". BB_SEARCH_REBUILD ." SET + rebuild_session_status = ". REBUILD_SEARCH_COMPLETED ." + WHERE rebuild_session_id = $last_session_id + AND end_post_id = $max_post_id + "); + + // optimize all search tables when finished + $table_ary = array(BB_POSTS_SEARCH); + + foreach ($table_ary as $table) + { + DB()->query("ANALYZE TABLE $table"); + DB()->query("OPTIMIZE TABLE $table"); + } + + $processing_messages .= '
' . $lang['ALL_TABLES_OPTIMIZED']; + } + + // calculate the percent + $session_percent = ($session_posts_processed / $session_posts_processing) * 100; + $total_percent = ($total_posts_processed / $total_posts) * 100; + + // get the db sizes + list($search_data_size, $search_index_size, $search_tables_size) = get_db_sizes(); + + // calculate the final (estimated) values + $final_search_tables_size = ''; + + if ($search_tables_size) + { + $start_search_tables_size = $last_session_data['search_size']; + $final_search_tables_size = $start_search_tables_size + round(($search_tables_size - $start_search_tables_size) * (100 / $session_percent)); + } + + // calculate various times + $session_time = $last_session_data['session_time']; + $session_average_cycle_time = round($session_time / $last_session_data['session_cycles']); + $session_estimated_time = round($session_time * (100 / $session_percent)) - $session_time; + + // create the percent boxes + create_percent_box('session', create_percent_color($session_percent), $session_percent); + create_percent_box('total', create_percent_color($total_percent), $total_percent); + + $template->assign_vars(array( + 'L_NEXT' => $next_button, + + 'L_TIME_LAST_POSTS_ADMIN' => sprintf($lang['TIME_LAST_POSTS'], $num_rows), + 'L_TIME_BEGINNING' => $lang['TIME_FROM_THE_BEGINNING'], + + 'L_ESTIMATED_VALUES' => $lang['INFO_ESTIMATED_VALUES'], + + 'PROCESSING_POSTS' => sprintf($lang['PROCESSED_POST_IDS'], $start_post_id, $end_post_id), + 'PROCESSING_MESSAGES' => $processing_messages, + 'PROGRESS_BAR_IMG' => $progress_bar_img, + + 'SESSION_DETAILS' => sprintf($lang['PROCESS_DETAILS'], $session_posts_processed - $num_rows + 1, $session_posts_processed, $session_posts_processing), + 'SESSION_PERCENT' => sprintf($lang['PERCENT_COMPLETED'], round($session_percent, 2)), + + 'TOTAL_DETAILS' => sprintf($lang['PROCESS_DETAILS'], $total_posts_processed - $num_rows + 1, $total_posts_processed, $total_posts), + 'TOTAL_PERCENT' => sprintf($lang['PERCENT_COMPLETED'], round($total_percent, 2)), + + 'LAST_CYCLE_TIME' => delta_time(time()), + 'SESSION_TIME' => delta_time($last_session_data['start_time']), + 'SESSION_AVERAGE_CYCLE_TIME'=> delta_time($session_average_cycle_time, 0), + 'SESSION_ESTIMATED_TIME' => delta_time($session_estimated_time, 0), + + 'SEARCH_TABLES_SIZE' => humn_size($search_tables_size), + 'FINAL_SEARCH_TABLES_SIZE' => humn_size($final_search_tables_size), + 'SEARCH_DATA_SIZE' => humn_size($search_data_size), + 'SEARCH_INDEX_SIZE' => humn_size($search_index_size), + + 'START_POST' => $last_session_data['start_post_id'], + 'POST_LIMIT' => $num_rows, + 'TIME_LIMIT' => $time_limit, + 'REFRESH_RATE' => $refresh_rate, + + 'S_REBUILD_SEARCH_ACTION' => $form_action, + )); +} +else // show the input page +{ + // create the page + // used only with the select input + $post_limit_hidden = ( $def_post_limit > $total_posts ) ? $total_posts : $def_post_limit; + + $s_hidden_fields = ''; + $s_hidden_fields .= ''; + + $next_start_post_id = 0; + $last_saved_processing = ''; + $clear_search_disabled = ''; + + if ($last_session_data['rebuild_session_id']) + { + $last_saved_post_id = $last_session_data['end_post_id']; + $next_start_post_id = $last_saved_post_id + 1; + $last_saved_date = bb_date($last_session_data['end_time']); + + // check our last status + if ( $last_session_data['rebuild_session_status'] == REBUILD_SEARCH_PROCESSED ) + { + $last_saved_processing = sprintf($lang['INFO_PROCESSING_STOPPED'], $last_saved_post_id, $total_posts_processed, $last_saved_date); + $clear_search_disabled = 'disabled="disabled"'; + + $template->assign_block_vars("start_select_input", array()); + } + elseif ( $last_session_data['rebuild_session_status'] == REBUILD_SEARCH_ABORTED ) + { + $last_saved_processing = sprintf($lang['INFO_PROCESSING_ABORTED'], $last_saved_post_id, $total_posts_processed, $last_saved_date); + // check if the interrupted cycle has finished + if ( time() - $last_session_data['end_time'] < $last_session_data['last_cycle_time'] ) + { + $last_saved_processing .= '
'.$lang['INFO_PROCESSING_ABORTED_SOON']; + } + $clear_search_disabled = 'disabled="disabled"'; + + $template->assign_block_vars("start_select_input", array()); + } + else // when finished + { + if ( $last_session_data['end_post_id'] < $max_post_id ) + { + $last_saved_processing = sprintf($lang['INFO_PROCESSING_FINISHED_NEW'], $last_saved_post_id, $total_posts_processed, $last_saved_date, ($total_posts - $total_posts_processed)); + $clear_search_disabled = 'disabled="disabled"'; + + $template->assign_block_vars("start_select_input", array()); + } + else + { + $last_saved_processing = sprintf($lang['INFO_PROCESSING_FINISHED'], $total_posts, $last_saved_date); + + $template->assign_block_vars("start_text_input", array()); + } + } + + $template->assign_block_vars("last_saved_info", array()); + } + else + { + $template->assign_block_vars("start_text_input", array()); + } + + // create the output of page + $template->assign_vars(array( + 'TPL_REBUILD_SEARCH_MAIN' => true, + + 'L_TIME_LIMIT_EXPLAIN' => $time_limit_explain, + + 'NEXT_START_POST_ID' => $next_start_post_id, + 'CLEAR_SEARCH_DISABLED' => $clear_search_disabled, + 'SESSION_POSTS_PROCESSING' => $session_posts_processing, + 'POST_LIMIT' => $post_limit, + 'REFRESH_RATE' => $refresh_rate, + 'TIME_LIMIT' => $time_limit, + + 'LAST_SAVED_PROCESSING' => $last_saved_processing, + + 'SESSION_ID' => $userdata['session_id'], + + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + 'S_REBUILD_SEARCH_ACTION' => append_sid("admin_rebuild_search.php?mode=submit"), + )); +} + +print_page('admin_rebuild_search.tpl', 'admin'); + +// +// Functions +// +function get_db_sizes () +{ + $search_data_size = $search_index_size = 0; + $search_table_like = DB()->escape(BB_POSTS_SEARCH); + + $sql = "SHOW TABLE STATUS FROM `". DB()->selected_db ."` LIKE '$search_table_like'"; + + foreach (DB()->fetch_rowset($sql) as $row) + { + $search_data_size += $row['Data_length']; + $search_index_size += $row['Index_length']; + } + + return array($search_data_size, $search_index_size, $search_data_size+$search_index_size); +} + +// get the latest post_id in the forum +function get_latest_post_id () +{ + $row = DB()->fetch_row("SELECT MAX(post_id) as post_id FROM ". BB_POSTS_TEXT); + + return (int) $row['post_id']; +} + +function get_empty_last_session_data () +{ + return array( + 'rebuild_session_id' => 0, + 'start_post_id' => 0, + 'end_post_id' => 0, + 'start_time' => 0, + 'end_time' => 0, + 'last_cycle_time' => 0, + 'session_time' => 0, + 'session_posts' => 0, + 'session_cycles' => 0, + 'search_size' => 0, + 'rebuild_session_status' => REBUILD_SEARCH_COMPLETED, + ); +} + +// get some or all of the rebuild details of a specific session or of the last session +// $id is the id or the 'last' id +// $details is one of the fields or 'all' of them +function get_rebuild_session_details ($id, $details = 'all') +{ + $session_details = get_empty_last_session_data(); + + if ($id != 'last') + { + $sql = "SELECT * FROM ". BB_SEARCH_REBUILD ." WHERE rebuild_session_id = $id"; + } + else + { + $sql = "SELECT * FROM ". BB_SEARCH_REBUILD ." ORDER BY rebuild_session_id DESC LIMIT 1"; + } + + if ($row = DB()->fetch_row($sql)) + { + $session_details = ($details == 'all') ? $row : $row[$details]; + } + + return $session_details; +} + +// get the number of processed posts in the last session or in all sessions +// 'total' to get the sum of posts of all sessions +// 'session' to get the posts of the last session +function get_processed_posts ($mode = 'session') +{ + global $last_session_data; + + if ($mode == 'total') + { + $sql = "SELECT SUM(session_posts) as posts FROM ". BB_SEARCH_REBUILD; + $row = DB()->fetch_row($sql); + } + else + { + $row['posts'] = $last_session_data['session_posts']; + } + + return (int) $row['posts']; +} + +// how many posts are in the db before or after a specific post_id +// after/before require and the post_id +function get_total_posts ($mode = 'after', $post_id = 0) +{ + if ($post_id) + { + $sql = "SELECT COUNT(post_id) as total_posts FROM " . BB_POSTS_TEXT . " + WHERE post_id " . (($mode == 'after') ? '>= ' : '<= ' ) . (int) $post_id; + } + else + { + $sql = "SELECT COUNT(*) as total_posts FROM " . BB_POSTS_TEXT; + } + + $row = DB()->fetch_row($sql); + + return (int) $row['total_posts']; +} + +function clear_search_tables ($mode = '') +{ + DB()->query("DELETE FROM ". BB_SEARCH_REBUILD); + + if ($mode) + { + $table_ary = array(BB_POSTS_SEARCH); + + foreach ($table_ary as $table) + { + $sql = (($mode == 1) ? "DELETE FROM " : "TRUNCATE TABLE ") . $table; + DB()->query($sql); + } + } +} + +// Create the percent color +// We use an array with the color percent limits. +// One color stays constantly at FF when the percent is between its limits +// and we adjust the other 2 accordingly to percent, from 200 to 0. +// We limit the result to 200, in order to avoid white (255). +function create_percent_color($percent) +{ + $percent_ary = array( + 'r' => array(86, 100), + 'g' => array(0, 50), + 'b' => array(51, 85), + ); + + foreach ($percent_ary as $key => $value) + { + if ( $percent <= $value[1] ) + { + $percent_color = create_color($key, round(200-($percent-$value[0])*(200/($value[1]-$value[0])))); + break; + } + } + + return $percent_color; +} + +// create the hex representation of color +function create_color($mode, $code) +{ + return (($mode == 'r') ? 'FF': sprintf("%02X", $code)) . (($mode == 'g') ? 'FF': sprintf("%02X", $code)) . (($mode == 'b') ? 'FF': sprintf("%02X", $code)); +} + +// create the percent bar & box +function create_percent_box($box, $percent_color, $percent_width) +{ + global $template; + + if ($box == 'session') + { + $template->assign_vars(array( + 'SESSION_PERCENT_BOX' => true, + 'SESSION_PERCENT_COLOR' => $percent_color, + 'SESSION_PERCENT_WIDTH' => round($percent_width), + )); + } + else + { + $template->assign_vars(array( + 'TOTAL_PERCENT_BOX' => true, + 'TOTAL_PERCENT_COLOR' => $percent_color, + 'TOTAL_PERCENT_WIDTH' => round($percent_width), + )); + } +} \ No newline at end of file diff --git a/upload/admin/admin_reports.php b/upload/admin/admin_reports.php new file mode 100644 index 000000000..d85c10521 --- /dev/null +++ b/upload/admin/admin_reports.php @@ -0,0 +1,612 @@ + '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''), + 'config' => '

' . sprintf($lang['CLICK_RETURN_REPORT_CONFIG'], '', ''), + 'admin' => '

' . sprintf($lang['CLICK_RETURN_REPORT_ADMIN'], '', '') +); + +$redirect_url = append_sid("admin/admin_reports.php", true); + +$template->assign_var('S_REPORT_ACTION', append_sid("admin_reports.php")); + +if (isset($_POST['mode']) || isset($_GET['mode'])) +{ + $mode = (isset($_POST['mode'])) ? $_POST['mode'] : $_GET['mode']; + + // + // allow multiple modes (we need this for sub-modes, e.g. the report reasons) + // + if (is_array($mode)) + { + $modes = $mode; + $mode = $modes[0]; + } + else + { + $modes = array($mode); + } +} +else +{ + $mode = ''; + $modes = array(); +} + +// +// Configuration page +// +if ($mode == 'config') +{ + if (isset($_POST['submit'])) + { + $config_update = (isset($_POST['bb_cfg'])) ? $_POST['bb_cfg'] : array(); + + bb_update_config($config_update); + report_modules_cache_clean(); + + message_die(GENERAL_MESSAGE, $lang['REPORT_CONFIG_UPDATED'] . $return_links['config'] . $return_links['index']); + } + else + { + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => '', + + 'REPORT_SUBJECT_AUTH_ON' => ($bb_cfg['report_subject_auth']) ? ' checked="checked"' : '', + 'REPORT_SUBJECT_AUTH_OFF' => (!$bb_cfg['report_subject_auth']) ? ' checked="checked"' : '', + 'REPORT_MODULES_CACHE_ON' => ($bb_cfg['report_modules_cache']) ? ' checked="checked"' : '', + 'REPORT_MODULES_CACHE_OFF' => (!$bb_cfg['report_modules_cache']) ? ' checked="checked"' : '', + 'REPORT_NOTIFY_CHANGE' => ($bb_cfg['report_notify'] == REPORT_NOTIFY_CHANGE) ? ' checked="checked"' : '', + 'REPORT_NOTIFY_NEW' => ($bb_cfg['report_notify'] == REPORT_NOTIFY_NEW) ? ' checked="checked"' : '', + 'REPORT_NOTIFY_OFF' => (!$bb_cfg['report_notify']) ? ' checked="checked"' : '', + 'REPORT_LIST_ADMIN_ON' => ($bb_cfg['report_list_admin']) ? ' checked="checked"' : '', + 'REPORT_LIST_ADMIN_OFF' => (!$bb_cfg['report_list_admin']) ? ' checked="checked"' : '', + 'REPORT_NEW_WINDOW_ON' => ($bb_cfg['report_new_window']) ? ' checked="checked"' : '', + 'REPORT_NEW_WINDOW_OFF' => (!$bb_cfg['report_new_window']) ? ' checked="checked"' : '', + + 'L_CONFIGURATION_TITLE' => $lang['REPORTS'] . ': ' . $lang['CONFIGURATION'], + 'L_CONFIGURATION_EXPLAIN' => $lang['REPORT_CONFIG_EXPLAIN']) + ); + + print_page('report_config_body.tpl'); + } +} +else if (isset($_POST[POST_CAT_URL]) || isset($_GET[POST_CAT_URL])) +{ + $module_id = (isset($_POST[POST_CAT_URL])) ? (int) $_POST[POST_CAT_URL] : (int) $_GET[POST_CAT_URL]; + + if (!$report_module = report_modules('id', $module_id)) + { + message_die(GENERAL_MESSAGE, $lang['REPORT_MODULE_NOT_EXISTS'] . $return_links['admin'] . $return_links['index']); + } + + switch ($mode) + { + // + // Edit module + // + case 'edit': + if (isset($_POST['submit'])) + { + $module_notify = (isset($_POST['report_module_notify']) && $_POST['report_module_notify'] == 1) ? 1 : 0; + $module_prune = (isset($_POST['report_module_prune'])) ? (int) $_POST['report_module_prune'] : $report_module->data['report_module_prune']; + + $auth_write = (isset($_POST['auth_write'])) ? (int) $_POST['auth_write'] : $report_module->data['auth_write']; + $auth_view = (isset($_POST['auth_view'])) ? (int) $_POST['auth_view'] : $report_module->data['auth_view']; + $auth_notify = (isset($_POST['auth_notify'])) ? (int) $_POST['auth_notify'] : $report_module->data['auth_notify']; + $auth_delete = (isset($_POST['auth_delete'])) ? (int) $_POST['auth_delete'] : $report_module->data['auth_delete']; + + report_module_edit($module_id, $module_notify, $module_prune, $auth_write, $auth_view, $auth_notify, $auth_delete); + + message_die(GENERAL_MESSAGE, $lang['REPORT_MODULE_EDITED'] . $return_links['admin'] . $return_links['index']); + } + else if (isset($_POST['cancel'])) + { + redirect($redirect_url); + } + + $module_info = $report_module->info(); + + $hidden_fields = ''; + + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'MODULE_TITLE' => $module_info['title'], + 'MODULE_EXPLAIN' => $module_info['explain'], + 'MODULE_NOTIFY_ON' => ($report_module->data['report_module_notify']) ? ' checked="checked"' : '', + 'MODULE_NOTIFY_OFF' => (!$report_module->data['report_module_notify']) ? ' checked="checked"' : '', + 'MODULE_PRUNE' => $report_module->data['report_module_prune'], + + 'L_EDIT_MODULE' => $lang['EDIT_REPORT_MODULE'], + 'L_AUTH_WRITE' => $lang['WRITE'], + 'L_AUTH_VIEW' => $lang['VIEW'], + 'L_AUTH_NOTIFY' => $lang['REPORT_NOTIFY'], + 'L_AUTH_NOTIFY_EXPLAIN' => $lang['REPORT_AUTH_NOTIFY_EXPLAIN'], + 'L_AUTH_DELETE' => $lang['DELETE'], + 'L_AUTH_DELETE_EXPLAIN' => $lang['REPORT_AUTH_DELETE_EXPLAIN']) + ); + + // + // Authorisation selects + // + report_auth_select('auth_write', $report_module->data['auth_write'], array(REPORT_AUTH_USER, REPORT_AUTH_MOD, REPORT_AUTH_ADMIN)); + report_auth_select('auth_view', $report_module->data['auth_view']); + report_auth_select('auth_notify', $report_module->data['auth_notify']); + report_auth_select('auth_delete', $report_module->data['auth_delete'], array(REPORT_AUTH_MOD, REPORT_AUTH_CONFIRM, REPORT_AUTH_ADMIN)); + + print_page('report_module_edit_body.tpl'); + break; + + // + // Report reasons + // + case 'reasons': + $reason_mode = (isset($modes[1])) ? $modes[1] : ''; + + $temp_url = append_sid("admin_reports.php?mode=reasons&" . POST_CAT_URL . "=$module_id"); + $return_links['reasons'] = '

' . sprintf($lang['CLICK_RETURN_REPORT_REASONS'], '', ''); + + $redirect_url = append_sid("admin/admin_reports.php?mode=reasons&" . POST_CAT_URL . "=$module_id", true); + + if (isset($_POST[POST_REPORT_REASON_URL]) || isset($_GET[POST_REPORT_REASON_URL])) + { + $reason_id = (isset($_POST[POST_REPORT_REASON_URL])) ? (int) $_POST[POST_REPORT_REASON_URL] : (int) $_GET[POST_REPORT_REASON_URL]; + + switch ($reason_mode) + { + // + // Edit reason + // + case 'edit': + $errors = array(); + + if (isset($_POST['submit'])) + { + $reason_desc = (isset($_POST['report_reason_desc'])) ? htmlspecialchars($_POST['report_reason_desc']) : ''; + + // + // Validate reason desc + // + if (empty($reason_desc)) + { + $errors[] = $lang['REASON_DESC_EMPTY']; + } + + if (empty($errors)) + { + $reason_desc = str_replace("\'", "'", $reason_desc); + + report_reason_edit($reason_id, $module_id, $reason_desc); + + message_die(GENERAL_MESSAGE, $lang['REPORT_REASON_EDITED'] . $return_links['reasons'] . $return_links['admin'] . $return_links['index']); + } + } + else if (isset($_POST['cancel'])) + { + redirect($redirect_url); + } + + // + // Show validation errors + // + if (!empty($errors)) + { + $template->assign_block_vars('switch_report_errors', array()); + foreach ($errors as $error) + { + $template->assign_block_vars('switch_report_errors.report_errors', array( + 'MESSAGE' => $error) + ); + } + } + + if (!$report_reason = report_reason_obtain($reason_id)) + { + message_die(GENERAL_MESSAGE, $lang['REPORT_REASON_NOT_EXISTS'] . $return_links['reasons'] . $return_links['admin'] . $return_links['index']); + } + + if (isset($reason_desc)) + { + $report_reason['report_reason_desc'] = stripslashes($reason_desc); + } + + $hidden_fields = ''; + $hidden_fields .= ''; + + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'REASON_DESC' => $report_reason['report_reason_desc'], + + 'L_EDIT_REASON' => $lang['EDIT_REASON'], + 'L_REASON_DESC' => $lang['FORUM_DESC'], + 'L_REASON_DESC_EXPLAIN' => $lang['REASON_DESC_EXPLAIN'], + 'L_SUBMIT' => $lang['SUBMIT'], + 'L_CANCEL' => $lang['CANCEL']) + ); + + print_page('report_reason_edit_body.tpl'); + break; + + // + // Move reason up/down + // + case 'up': + case 'down': + report_reason_move($reason_mode, $reason_id); + + redirect($redirect_url); + break; + + // + // Delete reason + // + case 'delete': + if (isset($_POST['confirm'])) + { + report_reason_delete($reason_id); + + message_die(GENERAL_MESSAGE, $lang['REPORT_REASON_DELETED'] . $return_links['reasons'] . $return_links['admin'] . $return_links['index']); + } + else if (isset($_POST['cancel'])) + { + redirect($redirect_url); + } + + $hidden_fields = ''; + $hidden_fields .= ''; + + $template->assign_vars(array( + 'S_CONFIRM_ACTION' => append_sid("admin_reports.php"), + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'MESSAGE_TITLE' => $lang['DELETE_REASON'], + 'MESSAGE_TEXT' => $lang['DELETE_REPORT_REASON_EXPLAIN'], + + 'L_YES' => $lang['YES'], + 'L_NO' => $lang['NO']) + ); + + print_page('confirm_body.tpl'); + break; + + default: + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['reasons'] . $return_links['admin'] . $return_links['index']); + break; + } + } + else + { + switch ($reason_mode) + { + // + // Add reason + // + case 'add': + $errors = array(); + + if (isset($_POST['submit'])) + { + $reason_desc = (isset($_POST['report_reason_desc'])) ? htmlspecialchars($_POST['report_reason_desc']) : ''; + + // + // Validate reason desc + // + if (empty($reason_desc)) + { + $errors[] = $lang['REASON_DESC_EMPTY']; + } + + if (empty($errors)) + { + $reason_desc = str_replace("\'", "'", $reason_desc); + + report_reason_insert($module_id, $reason_desc); + + message_die(GENERAL_MESSAGE, $lang['REPORT_REASON_ADDED'] . $return_links['reasons'] . $return_links['admin'] . $return_links['index']); + } + } + else if (isset($_POST['cancel'])) + { + redirect($redirect_url); + } + + // + // Show validation errors + // + if (!empty($errors)) + { + $template->assign_block_vars('switch_report_errors', array()); + foreach ($errors as $error) + { + $template->assign_block_vars('switch_report_errors.report_errors', array( + 'MESSAGE' => $error) + ); + } + } + + $hidden_fields = ''; + $hidden_fields .= ''; + + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'REASON_DESC' => (isset($reason_desc)) ? stripslashes($reason_desc) : '', + + 'L_EDIT_REASON' => $lang['ADD_REASON'], + 'L_REASON_DESC' => $lang['FORUM_DESC']) + ); + + print_page('report_reason_edit_body.tpl'); + break; + + case '': + + if ($report_reasons = $report_module->reasons_obtain()) + { + foreach ($report_reasons as $reason_id => $reason_desc) + { + $template->assign_block_vars('report_reasons', array( + 'DESC' => $reason_desc, + + 'U_EDIT' => append_sid("admin_reports.php?mode[]=reasons&" . POST_CAT_URL . "=$module_id&mode[]=edit&" . POST_REPORT_REASON_URL . "=$reason_id"), + 'U_MOVE_UP' => append_sid("admin_reports.php?mode[]=reasons&" . POST_CAT_URL . "=$module_id&mode[]=up&" . POST_REPORT_REASON_URL . "=$reason_id"), + 'U_MOVE_DOWN' => append_sid("admin_reports.php?mode[]=reasons&" . POST_CAT_URL . "=$module_id&mode[]=down&" . POST_REPORT_REASON_URL . "=$reason_id"), + 'U_DELETE' => append_sid("admin_reports.php?mode[]=reasons&" . POST_CAT_URL . "=$module_id&mode[]=delete&" . POST_REPORT_REASON_URL . "=$reason_id")) + ); + } + } + else + { + $template->assign_block_vars('switch_no_reasons', array()); + } + + $template->assign_vars(array( + 'U_ADD_REASON' => append_sid("admin_reports.php?mode[]=reasons&" . POST_CAT_URL . "=$module_id&mode[]=add"), + 'U_MODULES' => append_sid("admin_reports.php")) + ); + + print_page('report_module_reasons_body.tpl'); + break; + + default: + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['reasons'] . $return_links['admin'] . $return_links['index']); + break; + } + } + break; + + // + // Move module up/down + // + case 'up': + case 'down': + report_module_move($mode, $module_id); + + redirect($redirect_url); + break; + + // + // Synchronize module + // + case 'sync': + if (!method_exists($report_module, 'sync')) + { + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['admin'] . $return_links['index']); + } + + $report_module->sync(); + + message_die(GENERAL_MESSAGE, $lang['REPORT_MODULE_SYNCED'] . $return_links['admin'] . $return_links['index']); + break; + + // + // Uninstall module + // + case 'uninstall': + if (isset($_POST['confirm'])) + { + report_module_uninstall($module_id); + + message_die(GENERAL_MESSAGE, $lang['REPORT_MODULE_UNINSTALLED'] . $return_links['admin'] . $return_links['index']); + } + else if (isset($_POST['cancel'])) + { + redirect($redirect_url); + } + + $hidden_fields = ''; + + $template->assign_vars(array( + 'S_CONFIRM_ACTION' => append_sid("admin_reports.php"), + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'MESSAGE_TITLE' => $lang['UNINSTALL_REPORT_MODULE'], + 'MESSAGE_TEXT' => $lang['UNINSTALL_REPORT_MODULE_EXPLAIN']) + ); + + print_page('confirm_body.tpl'); + break; + + default: + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['admin'] . $return_links['index']); + break; + } +} +else if (isset($_POST['module']) || isset($_GET['module'])) +{ + $module_name = (isset($_POST['module'])) ? stripslashes($_POST['module']) : stripslashes($_GET['module']); + + if (!$report_module = report_modules_inactive('name', $module_name)) + { + message_die(GENERAL_MESSAGE, $lang['REPORT_MODULE_NOT_EXISTS'] . $return_links['admin'] . $return_links['index']); + } + + switch ($mode) + { + // + // Install module + // + case 'install': + if (isset($_POST['submit'])) + { + $module_notify = (isset($_POST['report_module_notify']) && $_POST['report_module_notify'] == 1) ? 1 : 0; + $module_prune = (isset($_POST['report_module_prune'])) ? (int) $_POST['report_module_prune'] : 0; + + $auth_write = (isset($_POST['auth_write'])) ? (int) $_POST['auth_write'] : REPORT_AUTH_USER; + $auth_view = (isset($_POST['auth_view'])) ? (int) $_POST['auth_view'] : REPORT_AUTH_MOD; + $auth_notify = (isset($_POST['auth_notify'])) ? (int) $_POST['auth_notify'] : REPORT_AUTH_MOD; + $auth_delete = (isset($_POST['auth_delete'])) ? (int) $_POST['auth_delete'] : REPORT_AUTH_ADMIN; + + report_module_install($module_notify, $module_prune, $module_name, $auth_write, $auth_view, $auth_notify, $auth_delete, false); + + message_die(GENERAL_MESSAGE, $lang['REPORT_MODULE_INSTALLED'] . $return_links['admin'] . $return_links['index']); + } + else if (isset($_POST['cancel'])) + { + redirect($redirect_url); + } + + $module_info = $report_module->info(); + + $hidden_fields = ''; + + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'MODULE_TITLE' => $module_info['title'], + 'MODULE_EXPLAIN' => $module_info['explain'], + 'MODULE_NOTIFY_ON' => ($bb_cfg['report_notify']) ? ' checked="checked"' : '', + 'MODULE_NOTIFY_OFF' => (!$bb_cfg['report_notify']) ? ' checked="checked"' : '', + 'MODULE_PRUNE' => 0, + + 'L_EDIT_MODULE' => $lang['INSTALL_REPORT_MODULE'], + 'L_AUTH_WRITE' => $lang['WRITE'], + 'L_AUTH_VIEW' => $lang['VIEW'], + 'L_AUTH_NOTIFY' => $lang['REPORT_NOTIFY'], + 'L_AUTH_NOTIFY_EXPLAIN' => $lang['REPORT_AUTH_NOTIFY_EXPLAIN'], + 'L_AUTH_DELETE' => $lang['DELETE'], + 'L_AUTH_DELETE_EXPLAIN' => $lang['REPORT_AUTH_DELETE_EXPLAIN']) + ); + + // + // Authorisation selects + // + report_auth_select('auth_write', REPORT_AUTH_USER, array(REPORT_AUTH_USER, REPORT_AUTH_MOD, REPORT_AUTH_ADMIN)); + report_auth_select('auth_view', REPORT_AUTH_MOD); + report_auth_select('auth_notify', REPORT_AUTH_MOD); + report_auth_select('auth_delete', REPORT_AUTH_CONFIRM, array(REPORT_AUTH_MOD, REPORT_AUTH_CONFIRM, REPORT_AUTH_ADMIN)); + + print_page('report_module_edit_body.tpl'); + break; + + default: + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['admin'] . $return_links['index']); + break; + } +} +else +{ + switch ($mode) + { + case '': + $report_modules = report_modules(); + + $template->assign_vars(array( + 'L_REPORTS_TITLE' => $lang['REPORTS'] . ': ' . $lang['MODULES_REASONS'], + 'L_REPORTS_EXPLAIN' => $lang['REPORT_ADMIN_EXPLAIN'], + + 'L_REPORT_COUNT' => $lang['REPORTS'], + 'L_INSTALL' => $lang['INSTALL2']) + ); + + $report_counts = report_counts_obtain(); + $report_reason_counts = report_reason_counts_obtain(); + + // + // Display installed modules + // + $template->assign_block_vars('installed_modules', array()); + foreach (array_keys($report_modules) as $report_module_id) + { + $report_module =& $report_modules[$report_module_id]; + $module_info = $report_module->info(); + + $template->assign_block_vars('installed_modules.modules', array( + 'L_REASONS' => sprintf($lang['REASONS'], $report_reason_counts[$report_module->id]), + + 'MODULE_TITLE' => $module_info['title'], + 'MODULE_EXPLAIN' => $module_info['explain'], + 'REPORT_COUNT' => $report_counts[$report_module->id], + + 'U_EDIT' => append_sid("admin_reports.php?mode=edit&" . POST_CAT_URL . '=' . $report_module->id), + 'U_REASONS' => append_sid("admin_reports.php?mode=reasons&" . POST_CAT_URL . '=' . $report_module->id), + 'U_MOVE_UP' => append_sid("admin_reports.php?mode=up&" . POST_CAT_URL . '=' . $report_module->id), + 'U_MOVE_DOWN' => append_sid("admin_reports.php?mode=down&" . POST_CAT_URL . '=' . $report_module->id), + 'U_SYNC' => append_sid("admin_reports.php?mode=sync&" . POST_CAT_URL . '=' . $report_module->id), + 'U_UNINSTALL' => append_sid("admin_reports.php?mode=uninstall&" . POST_CAT_URL . '=' . $report_module->id)) + ); + + // + // Display sync option if available + // + if (method_exists($report_module, 'sync')) + { + $template->assign_block_vars('installed_modules.modules.switch_sync', array()); + } + } + + if (empty($report_modules)) + { + $template->assign_block_vars('installed_modules.switch_no_modules', array()); + } + + $report_modules_inactive = report_modules_inactive(); + + // + // Display inactive modules + // + $template->assign_block_vars('inactive_modules', array()); + foreach (array_keys($report_modules_inactive) as $key) + { + $report_module =& $report_modules_inactive[$key]; + $module_info = $report_module->info(); + + $template->assign_block_vars('inactive_modules.modules', array( + 'MODULE_TITLE' => $module_info['title'], + 'MODULE_EXPLAIN' => $module_info['explain'], + 'REPORT_COUNT' => '-', + + 'U_INSTALL' => append_sid("admin_reports.php?mode=install&module=" . $report_module->data['module_name'])) + ); + } + + if (empty($report_modules_inactive)) + { + $template->assign_block_vars('inactive_modules.switch_no_modules', array()); + } + + print_page('report_modules_body.tpl'); + break; + + default: + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['admin'] . $return_links['index']); + break; + } +} \ No newline at end of file diff --git a/upload/admin/admin_smilies.php b/upload/admin/admin_smilies.php new file mode 100644 index 000000000..8fe2beac3 --- /dev/null +++ b/upload/admin/admin_smilies.php @@ -0,0 +1,474 @@ +update('smile_replacements'); } +register_shutdown_function('update_smilies'); + +require('./pagestart.php'); +// ACP Header - END + +// +// Check to see what mode we should operate in. +// +if( isset($_POST['mode']) || isset($_GET['mode']) ) +{ + $mode = ( isset($_POST['mode']) ) ? $_POST['mode'] : $_GET['mode']; + $mode = htmlspecialchars($mode); +} +else +{ + $mode = ""; +} + +$delimeter = '=+:'; + +// +// Read a listing of uploaded smilies for use in the add or edit smliey code... +// +$dir = @opendir(BB_ROOT . $bb_cfg['smilies_path']); + +while($file = @readdir($dir)) +{ + if( !@is_dir(phpbb_realpath(BB_ROOT . $bb_cfg['smilies_path'] . '/' . $file)) ) + { + $img_size = @getimagesize(BB_ROOT . $bb_cfg['smilies_path'] . '/' . $file); + + if( $img_size[0] && $img_size[1] ) + { + $smiley_images[] = $file; + } + else if( preg_match('/.pak$/i', $file) ) + { + $smiley_paks[] = $file; + } + } +} + +@closedir($dir); + +// +// Select main mode +// +if( isset($_GET['import_pack']) || isset($_POST['import_pack']) ) +{ + // + // Import a list a "Smiley Pack" + // + $smile_pak = ( isset($_POST['smile_pak']) ) ? $_POST['smile_pak'] : $_GET['smile_pak']; + $clear_current = ( isset($_POST['clear_current']) ) ? $_POST['clear_current'] : $_GET['clear_current']; + $replace_existing = ( isset($_POST['replace']) ) ? $_POST['replace'] : $_GET['replace']; + + if ( !empty($smile_pak) ) + { + // + // The user has already selected a smile_pak file.. Import it. + // + if( !empty($clear_current) ) + { + $sql = "DELETE + FROM " . BB_SMILIES; + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't delete current smilies", "", __LINE__, __FILE__, $sql); + } + } + else + { + $sql = "SELECT code + FROM ". BB_SMILIES; + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't get current smilies", "", __LINE__, __FILE__, $sql); + } + + $cur_smilies = DB()->sql_fetchrowset($result); + + for( $i = 0; $i < count($cur_smilies); $i++ ) + { + $k = $cur_smilies[$i]['code']; + $smiles[$k] = 1; + } + } + + $fcontents = @file(BB_ROOT . $bb_cfg['smilies_path'] . '/'. $smile_pak); + + if( empty($fcontents) ) + { + message_die(GENERAL_ERROR, "Couldn't read smiley pak file", "", __LINE__, __FILE__, $sql); + } + + for( $i = 0; $i < count($fcontents); $i++ ) + { + $smile_data = explode($delimeter, trim(addslashes($fcontents[$i]))); + + for( $j = 2; $j < count($smile_data); $j++) + { + // + // Replace > and < with the proper html_entities for matching. + // + $smile_data[$j] = str_replace("<", "<", $smile_data[$j]); + $smile_data[$j] = str_replace(">", ">", $smile_data[$j]); + $k = $smile_data[$j]; + + if( $smiles[$k] == 1 ) + { + if( !empty($replace_existing) ) + { + $sql = "UPDATE " . BB_SMILIES . " + SET smile_url = '" . str_replace("\'", "''", $smile_data[0]) . "', emoticon = '" . str_replace("\'", "''", $smile_data[1]) . "' + WHERE code = '" . str_replace("\'", "''", $smile_data[$j]) . "'"; + } + else + { + $sql = ''; + } + } + else + { + $sql = "INSERT INTO " . BB_SMILIES . " (code, smile_url, emoticon) + VALUES('" . str_replace("\'", "''", $smile_data[$j]) . "', '" . str_replace("\'", "''", $smile_data[0]) . "', '" . str_replace("\'", "''", $smile_data[1]) . "')"; + } + + if( $sql != '' ) + { + $result = DB()->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't update smilies!", "", __LINE__, __FILE__, $sql); + } + } + } + } + + $message = $lang['SMILEY_IMPORT_SUCCESS'] . "

" . sprintf($lang['CLICK_RETURN_SMILEADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + + } + else + { + // + // Display the script to get the smile_pak cfg file... + // + $smile_paks_select = ""; + + $hidden_vars = ""; + + $template->assign_vars(array( + 'TPL_SMILE_IMPORT' => true, + + "L_SMILEY_EXPLAIN" => $lang['SMILEY_IMPORT_INST'], + "L_SELECT_LBL" => $lang['CHOOSE_SMILE_PAK'], + "L_CONFLICTS" => $lang['SMILE_CONFLICTS'], + "L_DEL_EXISTING" => $lang['DEL_EXISTING_SMILEYS'], + + "S_SMILEY_ACTION" => append_sid("admin_smilies.php"), + "S_SMILE_SELECT" => $smile_paks_select, + "S_HIDDEN_FIELDS" => $hidden_vars) + ); + } +} +else if( isset($_POST['export_pack']) || isset($_GET['export_pack']) ) +{ + // + // Export our smiley config as a smiley pak... + // + if ( $_GET['export_pack'] == "send" ) + { + $sql = "SELECT * + FROM " . BB_SMILIES; + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not get smiley list", "", __LINE__, __FILE__, $sql); + } + + $resultset = DB()->sql_fetchrowset($result); + + $smile_pak = ""; + for($i = 0; $i < count($resultset); $i++ ) + { + $smile_pak .= $resultset[$i]['smile_url'] . $delimeter; + $smile_pak .= $resultset[$i]['emoticon'] . $delimeter; + $smile_pak .= $resultset[$i]['code'] . "\n"; + } + + header("Content-Type: text/x-delimtext; name=\"smiles.pak\""); + header("Content-disposition: attachment; filename=smiles.pak"); + + echo $smile_pak; + + exit; + } + + $message = sprintf($lang['EXPORT_SMILES'], "", "") . "

" . sprintf($lang['CLICK_RETURN_SMILEADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + +} +else if( isset($_POST['add']) || isset($_GET['add']) ) +{ + // + // Admin has selected to add a smiley. + // + $filename_list = ""; + for( $i = 0; $i < count($smiley_images); $i++ ) + { + $filename_list .= ''; + } + + $s_hidden_fields = ''; + + $template->assign_vars(array( + 'TPL_SMILE_EDIT' => true, + + "L_SMILEY_EXPLAIN" => $lang['SMILE_DESC'], + "L_SMILEY_EMOTION" => $lang['SMILEY_EMOT'], + + "SMILEY_IMG" => BB_ROOT . $bb_cfg['smilies_path'] . '/' . $smiley_images[0], + + "S_SMILEY_ACTION" => append_sid("admin_smilies.php"), + "S_HIDDEN_FIELDS" => $s_hidden_fields, + "S_FILENAME_OPTIONS" => $filename_list, + "S_SMILEY_BASEDIR" => BB_ROOT . $bb_cfg['smilies_path']) + ); +} +else if ( $mode != "" ) +{ + switch( $mode ) + { + case 'delete': + // + // Admin has selected to delete a smiley. + // + + $smiley_id = ( !empty($_POST['id']) ) ? $_POST['id'] : $_GET['id']; + $smiley_id = intval($smiley_id); + + $sql = "DELETE FROM " . BB_SMILIES . " + WHERE smilies_id = " . $smiley_id; + $result = DB()->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't delete smiley", "", __LINE__, __FILE__, $sql); + } + + $message = $lang['SMILEY_DEL_SUCCESS'] . "

" . sprintf($lang['CLICK_RETURN_SMILEADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + break; + + case 'edit': + // + // Admin has selected to edit a smiley. + // + + $smiley_id = ( !empty($_POST['id']) ) ? $_POST['id'] : $_GET['id']; + $smiley_id = intval($smiley_id); + + $sql = "SELECT * + FROM " . BB_SMILIES . " + WHERE smilies_id = " . $smiley_id; + $result = DB()->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, 'Could not obtain emoticon information', "", __LINE__, __FILE__, $sql); + } + $smile_data = DB()->sql_fetchrow($result); + + $filename_list = ""; + for( $i = 0; $i < count($smiley_images); $i++ ) + { + if( $smiley_images[$i] == $smile_data['smile_url'] ) + { + $smiley_selected = "selected=\"selected\""; + $smiley_edit_img = $smiley_images[$i]; + } + else + { + $smiley_selected = ""; + } + + $filename_list .= ''; + } + + $s_hidden_fields = ''; + + $template->assign_vars(array( + 'TPL_SMILE_EDIT' => true, + + "SMILEY_CODE" => $smile_data['code'], + "SMILEY_EMOTICON" => $smile_data['emoticon'], + + "L_SMILEY_EXPLAIN" => $lang['SMILE_DESC'], + "L_SMILEY_EMOTION" => $lang['SMILEY_EMOT'], + + "SMILEY_IMG" => BB_ROOT . $bb_cfg['smilies_path'] . '/' . $smiley_edit_img, + + "S_SMILEY_ACTION" => append_sid("admin_smilies.php"), + "S_HIDDEN_FIELDS" => $s_hidden_fields, + "S_FILENAME_OPTIONS" => $filename_list, + "S_SMILEY_BASEDIR" => BB_ROOT . $bb_cfg['smilies_path']) + ); + + break; + + case "save": + // + // Admin has submitted changes while editing a smiley. + // + + // + // Get the submitted data, being careful to ensure that we only + // accept the data we are looking for. + // + $smile_code = ( isset($_POST['smile_code']) ) ? trim($_POST['smile_code']) : trim($_GET['smile_code']); + $smile_url = ( isset($_POST['smile_url']) ) ? trim($_POST['smile_url']) : trim($_GET['smile_url']); + $smile_url = phpbb_ltrim(basename($smile_url), "'"); + $smile_emotion = ( isset($_POST['smile_emotion']) ) ? trim($_POST['smile_emotion']) : trim($_GET['smile_emotion']); + $smile_id = ( isset($_POST['smile_id']) ) ? intval($_POST['smile_id']) : intval($_GET['smile_id']); + + // If no code was entered complain ... + if ($smile_code == '' || $smile_url == '') + { + message_die(GENERAL_MESSAGE, $lang['FIELDS_EMPTY']); + } + + // + // Convert < and > to proper htmlentities for parsing. + // + $smile_code = str_replace('<', '<', $smile_code); + $smile_code = str_replace('>', '>', $smile_code); + + // + // Proceed with updating the smiley table. + // + $sql = "UPDATE " . BB_SMILIES . " + SET code = '" . str_replace("\'", "''", $smile_code) . "', smile_url = '" . str_replace("\'", "''", $smile_url) . "', emoticon = '" . str_replace("\'", "''", $smile_emotion) . "' + WHERE smilies_id = $smile_id"; + if( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Couldn't update smilies info", "", __LINE__, __FILE__, $sql); + } + + $message = $lang['SMILEY_EDIT_SUCCESS'] . "

" . sprintf($lang['CLICK_RETURN_SMILEADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + break; + + case "savenew": + // + // Admin has submitted changes while adding a new smiley. + // + + // + // Get the submitted data being careful to ensure the the data + // we recieve and process is only the data we are looking for. + // + $smile_code = ( isset($_POST['smile_code']) ) ? $_POST['smile_code'] : $_GET['smile_code']; + $smile_url = ( isset($_POST['smile_url']) ) ? $_POST['smile_url'] : $_GET['smile_url']; + $smile_url = phpbb_ltrim(basename($smile_url), "'"); + $smile_emotion = ( isset($_POST['smile_emotion']) ) ? $_POST['smile_emotion'] : $_GET['smile_emotion']; + $smile_code = trim($smile_code); + $smile_url = trim($smile_url); + $smile_emotion = trim($smile_emotion); + + // If no code was entered complain ... + if ($smile_code == '' || $smile_url == '') + { + message_die(GENERAL_MESSAGE, $lang['FIELDS_EMPTY']); + } + + // + // Convert < and > to proper htmlentities for parsing. + // + $smile_code = str_replace('<', '<', $smile_code); + $smile_code = str_replace('>', '>', $smile_code); + + // + // Save the data to the smiley table. + // + $sql = "INSERT INTO " . BB_SMILIES . " (code, smile_url, emoticon) + VALUES ('" . str_replace("\'", "''", $smile_code) . "', '" . str_replace("\'", "''", $smile_url) . "', '" . str_replace("\'", "''", $smile_emotion) . "')"; + $result = DB()->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't insert new smiley", "", __LINE__, __FILE__, $sql); + } + + $message = $lang['SMILEY_ADD_SUCCESS'] . "

" . sprintf($lang['CLICK_RETURN_SMILEADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + break; + } +} +else +{ + + // + // This is the main display of the page before the admin has selected + // any options. + // + $sql = "SELECT * + FROM " . BB_SMILIES; + $result = DB()->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't obtain smileys from database", "", __LINE__, __FILE__, $sql); + } + + $smilies = DB()->sql_fetchrowset($result); + + $template->assign_vars(array( + 'TPL_SMILE_MAIN' => true, + + "L_SMILEY_TEXT" => $lang['SMILE_DESC'], + "L_SMILEY_ADD" => $lang['SMILE_ADD'], + "L_EMOT" => $lang['EMOTION'], + "L_IMPORT_PACK" => $lang['IMPORT_SMILE_PACK'], + "L_EXPORT_PACK" => $lang['EXPORT_SMILE_PACK'], + + "S_HIDDEN_FIELDS" => @$s_hidden_fields, + "S_SMILEY_ACTION" => append_sid("admin_smilies.php")) + ); + + // + // Loop throuh the rows of smilies setting block vars for the template. + // + for($i = 0; $i < count($smilies); $i++) + { + // + // Replace htmlentites for < and > with actual character. + // + $smilies[$i]['code'] = str_replace('<', '<', $smilies[$i]['code']); + $smilies[$i]['code'] = str_replace('>', '>', $smilies[$i]['code']); + + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars("smiles", array( + "ROW_CLASS" => $row_class, + + "SMILEY_IMG" => BB_ROOT . $bb_cfg['smilies_path'] . '/' . $smilies[$i]['smile_url'], + "CODE" => $smilies[$i]['code'], + "EMOT" => $smilies[$i]['emoticon'], + + "U_SMILEY_EDIT" => append_sid("admin_smilies.php?mode=edit&id=" . $smilies[$i]['smilies_id']), + "U_SMILEY_DELETE" => append_sid("admin_smilies.php?mode=delete&id=" . $smilies[$i]['smilies_id'])) + ); + } +} + +print_page('admin_smilies.tpl', 'admin'); diff --git a/upload/admin/admin_topic_templates.php b/upload/admin/admin_topic_templates.php new file mode 100644 index 000000000..90c1ebf58 --- /dev/null +++ b/upload/admin/admin_topic_templates.php @@ -0,0 +1,89 @@ +fetch_rowset(" + SELECT f.forum_id, f.forum_parent, f.topic_tpl_id, f.forum_name + FROM ". BB_CATEGORIES ." c, ". BB_FORUMS ." f + WHERE f.cat_id = c.cat_id + ORDER BY c.cat_order, f.forum_order +"); + +$tpl_ary = array(); +$available_tpl_id = array(0); +$tpl_select = array($lang['TPL_NONE'] => 0); + +$sql = "SELECT * FROM ". BB_TOPIC_TPL ." ORDER BY tpl_name"; + +foreach (DB()->fetch_rowset($sql) as $row) +{ + $tpl_ary[$row['tpl_id']] = $row; + $available_tpl_id[] = $row['tpl_id']; + + $name = isset($lang[strtoupper('TPL_'. $row['tpl_name'])]) ? $lang[strtoupper('TPL_'. $row['tpl_name'])] : $row['tpl_desc']; + $tpl_select[$name] = $row['tpl_id']; +} + +if (isset($_POST['submit']) && @is_array($_POST['forum_tpl'])) +{ + $cur_val = $new_val = array(); + + foreach ($forums as $forum) + { + $cur_val["{$forum['forum_id']}"] = (int) $forum['topic_tpl_id']; + } + foreach ($_POST['forum_tpl'] as $forum_id => $tpl_id) + { + if (isset($cur_val["$forum_id"]) && in_array($tpl_id, $available_tpl_id)) + { + $new_val["$forum_id"] = (int) $tpl_id; + } + } + if ($new_settings = array_diff_assoc($new_val, $cur_val)) + { + foreach ($new_settings as $forum_id => $tpl_id) + { + DB()->query(" + UPDATE ". BB_FORUMS ." SET + topic_tpl_id = ". (int) $tpl_id ." + WHERE forum_id = ". (int) $forum_id ." + "); + } + } + + $message = $lang['CONFIG_UPD'] .'

'; + $message .= sprintf($lang['RETURN_CONFIG'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $message); +} + +foreach ($forums as $i => $forum) +{ + $template->assign_block_vars('forum', array( + 'ROW_CLASS' => !($i % 2) ? 'row4' : 'row5', + 'SF_PAD' => ($forum['forum_parent']) ? 'padding-left: 20px;' : '', + 'TPL_SELECT' => build_select("forum_tpl[{$forum['forum_id']}]", $tpl_select, $forum['topic_tpl_id']), + 'FORUM_CLASS' => ($forum['forum_parent']) ? 'gen' : 'gen', + 'FORUM_STYLE' => ($forum['topic_tpl_id']) ? 'font-weight: bold;' : '', + 'FORUM_ID' => $forum['forum_id'], + 'FORUM_NAME' => htmlCHR($forum['forum_name']), + )); +} + +$template->assign_vars(array( + 'L_ADMIN_TITLE' => $lang['RELEASE_TEMPLATES'], + 'L_ADMIN_TEXT' => $lang['RELEASE_EXP'], + 'S_ACTION' => append_sid("admin_topic_templates.php"), +)); + +print_page('admin_topic_templates.tpl', 'admin'); diff --git a/upload/admin/admin_ug_auth.php b/upload/admin/admin_ug_auth.php new file mode 100644 index 000000000..a5ab72903 --- /dev/null +++ b/upload/admin/admin_ug_auth.php @@ -0,0 +1,476 @@ +fetch_row($sql)) + { + $group_id = $row['group_id']; + } + else + { + $group_id = create_user_group($user_id); + } + + if (!$group_id || !$user_id || is_null($this_user_level)) + { + trigger_error('data missing', E_USER_ERROR); + } + + // Make user an admin (if already user) + if (@$_POST['userlevel'] === 'admin') + { + if ($userdata['user_id'] == $user_id || $user_id == ANONYMOUS || $user_id == BOT_UID) + { + bb_die("Couldn't update admin status"); + } + + DB()->query("UPDATE ". BB_USERS ." SET user_level = ". ADMIN ." WHERE user_id = $user_id LIMIT 1"); + + // Delete any entries in auth_access, they are not required if user is becoming an admin + delete_permissions($group_id, $user_id); + + $message = $lang['AUTH_UPDATED'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_USERAUTH'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); + } + // Make admin a user (if already admin) + else if (@$_POST['userlevel'] === 'user') + { + // ignore if you're trying to change yourself from an admin to user! + if ($userdata['user_id'] == $user_id) + { + bb_die("Couldn't update admin status

Couldn't change yourself from an admin to user"); + } + // Update users level, reset to USER + DB()->query("UPDATE ". BB_USERS ." SET user_level = ". USER ." WHERE user_id = $user_id LIMIT 1"); + + delete_permissions($group_id, $user_id); + + $message = $lang['AUTH_UPDATED'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_USERAUTH'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); + } + + // + // Submit new USER permissions + // + $auth = array(); + + if (is_array(@$_POST['auth'])) + { + array_deep($_POST['auth'], 'intval'); + + foreach ($_POST['auth'] as $f_id => $bf_ary) + { + if (array_sum($bf_ary)) + { + $auth[$f_id] = bit2dec(array_keys($bf_ary, 1)); + } + } + } + + delete_permissions($group_id, null, $cat_id); + store_permissions($group_id, $auth); + + update_user_level($user_id); + + $l_auth_return = ($mode == 'user') ? $lang['CLICK_RETURN_USERAUTH'] : $lang['CLICK_RETURN_GROUPAUTH']; + $message = $lang['AUTH_UPDATED'] .'

'; + $message .= sprintf($l_auth_return, '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); +} +// +// Submit new GROUP permissions +// +else if ($submit && $mode == 'group' && is_array(@$_POST['auth'])) +{ + if (!$group_data = get_group_data($group_id)) + { + bb_die($lang['GROUP_NOT_EXIST']); + } + + $auth = array(); + array_deep($_POST['auth'], 'intval'); + + foreach ($_POST['auth'] as $f_id => $bf_ary) + { + if (array_sum($bf_ary)) + { + $auth[$f_id] = bit2dec(array_keys($bf_ary, 1)); + } + } + + delete_permissions($group_id, null, $cat_id); + store_permissions($group_id, $auth); + + update_user_level('all'); + + $l_auth_return = $lang['CLICK_RETURN_GROUPAUTH']; + $message = $lang['AUTH_UPDATED'] .'

'; + $message .= sprintf($l_auth_return, '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + bb_die($message); +} + +// +// Front end (changing permissions) +// +if ($mode == 'user' && (!empty($_POST['username']) || $user_id)) +{ + $page_cfg['quirks_mode'] = true; + + if (!empty($_POST['username'])) + { + $this_userdata = get_userdata($_POST['username'], true); + $user_id = $this_userdata['user_id']; + } + else + { + $this_userdata = get_userdata($user_id); + } + if (!$this_userdata) + { + bb_die($lang['NO_SUCH_USER']); + } + + if (!$forums = $datastore->get('cat_forums')) + { + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); + } + $base_url = basename(__FILE__) ."?mode=user&u=$user_id"; + + $ug_data = $this_userdata; + $ug_data['session_logged_in'] = 1; + + $u_access = auth(AUTH_ALL, AUTH_LIST_ALL, $ug_data, array(), UG_PERM_USER_ONLY); + $g_access = auth(AUTH_ALL, AUTH_LIST_ALL, $ug_data, array(), UG_PERM_GROUP_ONLY); + + foreach ($forums['c'] as $c_id => $c_data) + { + $template->assign_block_vars('c', array( + 'CAT_ID' => $c_id, + 'CAT_TITLE' => $forums['cat_title_html'][$c_id], + 'CAT_HREF' => "$base_url&c=$c_id", + )); + + if (!$c =& $_REQUEST['c'] OR !in_array($c, array('all', $c_id))) + { + continue; + } + + foreach ($c_data['forums'] as $f_id) + { + $f_data = $forums['f'][$f_id]; + $auth_mod = ($u_access[$f_id]['auth_mod'] || $g_access[$f_id]['auth_mod']); + $disabled = $g_access[$f_id]['auth_mod']; + + $template->assign_block_vars('c.f', array( + 'DISABLED' => $disabled, + 'FORUM_ID' => $f_id, + 'FORUM_NAME' => str_short($forums['forum_name_html'][$f_id], $max_forum_name_length), + 'SF_SPACER' => ($f_data['forum_parent']) ? HTML_SF_SPACER : '', + 'IS_MODERATOR' => (bool) $auth_mod, + 'MOD_STATUS' => ($auth_mod) ? $lang['MODERATOR'] : $lang['NO'], + 'MOD_CLASS' => ($auth_mod) ? (($disabled) ? 'yesDisabled' : 'yesMOD') : 'noMOD', + 'AUTH_MOD_VAL' => ($auth_mod) ? 1 : 0, + )); + + foreach ($forum_auth_fields as $auth_type) + { + $bf_num = $bf['forum_perm'][$auth_type]; + $f_perm = $f_data[$auth_type]; + $auth_via_acl = ($u_access[$f_id][$auth_type] || $g_access[$f_id][$auth_type]); + + if ($f_perm == AUTH_ACL) + { + $disabled = ($auth_mod || $g_access[$f_id][$auth_type]); + $perm_sign = ($auth_via_acl || $auth_mod) ? $yes_sign : $no_sign; + $acl_class = ($auth_via_acl || $auth_mod) ? 'yes' : 'no'; + } + else + { + $disabled = true; + $perm_sign = ($auth_via_acl) ? $yes_sign : $no_sign; + $acl_class = ($auth_via_acl) ? 'yes' : 'no'; + } + + $template->assign_block_vars('c.f.acl', array( + 'DISABLED' => $disabled, + 'PERM_SIGN' => $perm_sign, + 'ACL_CLASS' => $acl_class, + 'FORUM_ID' => $f_id, + 'ACL_TYPE_BF' => $bf_num, + 'ACL_VAL' => ($auth_via_acl) ? 1 : 0, + )); + } + } + } + + $template->assign_vars(array( + 'AUTH_MOD_BF' => AUTH_MOD, + )); + + $s_column_span = 2; + + foreach ($forum_auth_fields as $auth_type) + { + $template->assign_block_vars('acltype', array( + 'ACL_TYPE_NAME' => preg_replace("#(.{5})#u", "\\1
", $lang[strtoupper($auth_type)]), + 'ACL_TYPE_BF' => $bf['forum_perm'][$auth_type], + )); + $s_column_span++; + } + + unset($forums, $u_access, $g_access); + $datastore->rm('cat_forums'); + + $s_hidden_fields = ' + + + '; + + $s_user_type = ($this_userdata['user_level'] == ADMIN) ? ' + + ' : ' + + '; + + $template->assign_block_vars('switch_user_auth', array()); + + $template->assign_vars(array( + 'TPL_AUTH_UG_MAIN' => true, + + 'USER_OR_GROUPNAME' => $this_userdata['username'], + 'USER_LEVEL' => $lang['USER_LEVEL'] .' : '. $s_user_type, + 'USER_GROUP_MEMBERSHIPS' => $lang['GROUP_MEMBERSHIPS'], + )); + + $template->assign_vars(array( + 'T_USER_OR_GROUPNAME' => $lang['USERNAME'], + 'T_AUTH_TITLE' => $lang['AUTH_CONTROL_USER'], + 'T_AUTH_EXPLAIN' => $lang['USER_AUTH_EXPLAIN'], + + 'S_COLUMN_SPAN' => $s_column_span, + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); +} +else if ($mode == 'group' && $group_id) +{ + $page_cfg['quirks_mode'] = true; + + if (!$group_data = get_group_data($group_id)) + { + bb_die($lang['GROUP_NOT_EXIST']); + } + + if (!$forums = $datastore->get('cat_forums')) + { + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); + } + $base_url = basename(__FILE__) ."?mode=group&g=$group_id"; + + $ug_data = array('group_id' => $group_id); + $u_access = auth(AUTH_ALL, AUTH_LIST_ALL, $ug_data); + + foreach ($forums['c'] as $c_id => $c_data) + { + $template->assign_block_vars('c', array( + 'CAT_ID' => $c_id, + 'CAT_TITLE' => $forums['cat_title_html'][$c_id], + 'CAT_HREF' => "$base_url&c=$c_id", + )); + + if (!$c =& $_REQUEST['c'] OR !in_array($c, array('all', $c_id)) OR empty($c_data['forums'])) + { + continue; + } + + foreach ($c_data['forums'] as $f_id) + { + $f_data = $forums['f'][$f_id]; + $auth_mod = $u_access[$f_id]['auth_mod']; + + $template->assign_block_vars('c.f', array( + 'DISABLED' => false, + 'FORUM_ID' => $f_id, + 'FORUM_NAME' => str_short($forums['forum_name_html'][$f_id], $max_forum_name_length), + 'SF_SPACER' => ($f_data['forum_parent']) ? HTML_SF_SPACER : '', + 'IS_MODERATOR' => (bool) $auth_mod, + 'MOD_STATUS' => ($auth_mod) ? $lang['MODERATOR'] : $lang['NO'], + 'MOD_CLASS' => ($auth_mod) ? 'yesMOD' : 'noMOD', + 'AUTH_MOD_VAL' => ($auth_mod) ? 1 : 0, + )); + + foreach ($forum_auth_fields as $auth_type) + { + $bf_num = $bf['forum_perm'][$auth_type]; + $f_perm = $f_data[$auth_type]; + $auth_via_acl = $u_access[$f_id][$auth_type]; + + if ($f_perm == AUTH_ACL) + { + $disabled = $auth_mod; + $perm_sign = ($auth_via_acl || $auth_mod) ? $yes_sign : $no_sign; + $acl_class = ($auth_via_acl || $auth_mod) ? 'yes' : 'no'; + } + else + { + $disabled = true; + $perm_sign = ($auth_via_acl) ? $yes_sign : $no_sign; + $acl_class = ($auth_via_acl) ? 'yes' : 'no'; + } + + $template->assign_block_vars('c.f.acl', array( + 'DISABLED' => $disabled, + 'PERM_SIGN' => $perm_sign, + 'ACL_CLASS' => $acl_class, + 'FORUM_ID' => $f_id, + 'ACL_TYPE_BF' => $bf_num, + 'ACL_VAL' => ($auth_via_acl) ? 1 : 0, + )); + } + } + } + + $template->assign_vars(array( + 'AUTH_MOD_BF' => AUTH_MOD, + )); + + $s_column_span = 2; + + foreach ($forum_auth_fields as $auth_type) + { + $template->assign_block_vars('acltype', array( + 'ACL_TYPE_NAME' => preg_replace("#(.{5})#u", "\\1
", $lang[strtoupper($auth_type)]), + 'ACL_TYPE_BF' => $bf['forum_perm'][$auth_type], + )); + $s_column_span++; + } + + unset($forums, $ug_data, $u_access); + $datastore->rm('cat_forums'); + + $s_hidden_fields = ' + + + '; + + $template->assign_vars(array( + 'TPL_AUTH_UG_MAIN' => true, + + 'T_USER_OR_GROUPNAME' => $lang['GROUP_NAME'], + 'USER_LEVEL' => false, + 'T_AUTH_TITLE' => $lang['AUTH_CONTROL_GROUP'], + 'T_AUTH_EXPLAIN' => $lang['GROUP_AUTH_EXPLAIN'], + 'USER_OR_GROUPNAME' => htmlCHR($group_data['group_name']), + 'S_COLUMN_SPAN' => $s_column_span, + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); +} +else +{ + // Select a user/group + if ($mode == 'user') + { + $template->assign_vars(array( + 'TPL_SELECT_USER' => true, + 'U_SEARCH_USER' => BB_ROOT ."search.php?mode=searchuser", + )); + } + else + { + $template->assign_vars(array( + 'TPL_SELECT_GROUP' => true, + 'S_GROUP_SELECT' => get_select('groups'), + )); + } + + $s_hidden_fields = ''; + + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); +} + +$template->assign_vars(array( + 'YES_SIGN' => $yes_sign, + 'NO_SIGN' => $no_sign, + 'T_MOD_YES' => $lang['MODERATOR'], + 'T_MOD_NO' => $lang['NO'], + 'S_AUTH_ACTION' => append_sid("admin_ug_auth.php"), + 'SELECTED_CAT' => !empty($_REQUEST['c']) ? $_REQUEST['c'] : '', + 'U_ALL_FORUMS' => !empty($base_url) ? "$base_url&c=all" : '', +)); + +print_page('admin_ug_auth.tpl', 'admin'); diff --git a/upload/admin/admin_user_ban.php b/upload/admin/admin_user_ban.php new file mode 100644 index 000000000..67a42b7a2 --- /dev/null +++ b/upload/admin/admin_user_ban.php @@ -0,0 +1,403 @@ +sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Couldn't obtain banlist information", "", __LINE__, __FILE__, $sql); + } + + $current_banlist = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + $kill_session_sql = ''; + for($i = 0; $i < count($user_list); $i++) + { + $in_banlist = false; + for($j = 0; $j < count($current_banlist); $j++) + { + if ( $user_list[$i] == $current_banlist[$j]['ban_userid'] ) + { + $in_banlist = true; + } + } + + if ( !$in_banlist ) + { + $kill_session_sql .= ( ( $kill_session_sql != '' ) ? ' OR ' : '' ) . "session_user_id = " . $user_list[$i]; + + $sql = "INSERT INTO " . BB_BANLIST . " (ban_userid) + VALUES (" . $user_list[$i] . ")"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't insert ban_userid info into database", "", __LINE__, __FILE__, $sql); + } + } + } + + for($i = 0; $i < count($ip_list); $i++) + { + $in_banlist = false; + for($j = 0; $j < count($current_banlist); $j++) + { + if ( $ip_list[$i] == $current_banlist[$j]['ban_ip'] ) + { + $in_banlist = true; + } + } + + if ( !$in_banlist ) + { + if ( preg_match('/(ff\.)|(\.ff)/is', chunk_split($ip_list[$i], 2, '.')) ) + { + $kill_ip_sql = "session_ip LIKE '" . str_replace('.', '', preg_replace('/(ff\.)|(\.ff)/is', '%', chunk_split($ip_list[$i], 2, "."))) . "'"; + } + else + { + $kill_ip_sql = "session_ip = '" . $ip_list[$i] . "'"; + } + + $kill_session_sql .= ( ( $kill_session_sql != '' ) ? ' OR ' : '' ) . $kill_ip_sql; + + $sql = "INSERT INTO " . BB_BANLIST . " (ban_ip) + VALUES ('" . $ip_list[$i] . "')"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't insert ban_ip info into database", "", __LINE__, __FILE__, $sql); + } + } + } + + // + // Now we'll delete all entries from the session table with any of the banned + // user or IP info just entered into the ban table ... this will force a session + // initialisation resulting in an instant ban + // + if ( $kill_session_sql != '' ) + { + $sql = "DELETE FROM " . BB_SESSIONS . " + WHERE $kill_session_sql"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't delete banned sessions from database", "", __LINE__, __FILE__, $sql); + } + } + + for($i = 0; $i < count($email_list); $i++) + { + $in_banlist = false; + for($j = 0; $j < count($current_banlist); $j++) + { + if ( $email_list[$i] == $current_banlist[$j]['ban_email'] ) + { + $in_banlist = true; + } + } + + if ( !$in_banlist ) + { + $sql = "INSERT INTO " . BB_BANLIST . " (ban_email) + VALUES ('" . str_replace("\'", "''", $email_list[$i]) . "')"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't insert ban_email info into database", "", __LINE__, __FILE__, $sql); + } + } + } + + $where_sql = ''; + + if ( isset($_POST['unban_user']) ) + { + $user_list = $_POST['unban_user']; + + for($i = 0; $i < count($user_list); $i++) + { + if ( $user_list[$i] != -1 ) + { + $where_sql .= ( ( $where_sql != '' ) ? ', ' : '' ) . intval($user_list[$i]); + } + } + } + + if ( isset($_POST['unban_ip']) ) + { + $ip_list = $_POST['unban_ip']; + + for($i = 0; $i < count($ip_list); $i++) + { + if ( $ip_list[$i] != -1 ) + { + $where_sql .= ( ( $where_sql != '' ) ? ', ' : '' ) . str_replace("\'", "''", $ip_list[$i]); + } + } + } + + if ( isset($_POST['unban_email']) ) + { + $email_list = $_POST['unban_email']; + + for($i = 0; $i < count($email_list); $i++) + { + if ( $email_list[$i] != -1 ) + { + $where_sql .= ( ( $where_sql != '' ) ? ', ' : '' ) . str_replace("\'", "''", $email_list[$i]); + } + } + } + + if ( $where_sql != '' ) + { + $sql = "DELETE FROM " . BB_BANLIST . " + WHERE ban_id IN ($where_sql)"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't delete ban info from database", "", __LINE__, __FILE__, $sql); + } + } + + $message = $lang['BAN_UPDATE_SUCESSFUL'] . '

' . sprintf($lang['CLICK_RETURN_BANADMIN'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $message); + +} +else +{ + $template->assign_vars(array( + 'L_BAN_TITLE' => $lang['BAN_CONTROL'], + 'L_IP_OR_HOSTNAME' => $lang['IP_HOSTNAME'], + + 'S_BANLIST_ACTION' => append_sid("admin_user_ban.php")) + ); + + $template->assign_vars(array( + 'L_BAN_USER' => $lang['BAN_USERNAME'], + 'L_BAN_USER_EXPLAIN' => $lang['BAN_USERNAME_EXPLAIN']) + ); + + $userban_count = 0; + $ipban_count = 0; + $emailban_count = 0; + + $sql = "SELECT b.ban_id, u.user_id, u.username + FROM " . BB_BANLIST . " b, " . BB_USERS . " u + WHERE u.user_id = b.ban_userid + AND b.ban_userid <> 0 + AND u.user_id <> " . ANONYMOUS . " + ORDER BY u.username ASC"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select current user_id ban list', '', __LINE__, __FILE__, $sql); + } + + $user_list = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + $select_userlist = ''; + for($i = 0; $i < count($user_list); $i++) + { + $select_userlist .= ''; + $userban_count++; + } + + if( $select_userlist == '' ) + { + $select_userlist = ''; + } + + $select_userlist = ''; + + $sql = " + SELECT ban_id, ban_ip, ban_email + FROM ". BB_BANLIST ." + ORDER BY ban_ip + "; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select current ip ban list', '', __LINE__, __FILE__, $sql); + } + + $banlist = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + $select_iplist = ''; + $select_emaillist = ''; + + for($i = 0; $i < count($banlist); $i++) + { + $ban_id = $banlist[$i]['ban_id']; + + if ( !empty($banlist[$i]['ban_ip']) ) + { + $ban_ip = str_replace('255', '*', decode_ip($banlist[$i]['ban_ip'])); + $select_iplist .= ''; + $ipban_count++; + } + else if ( !empty($banlist[$i]['ban_email']) ) + { + $ban_email = $banlist[$i]['ban_email']; + $select_emaillist .= ''; + $emailban_count++; + } + } + + if ( $select_iplist == '' ) + { + $select_iplist = ''; + } + + if ( $select_emaillist == '' ) + { + $select_emaillist = ''; + } + + $select_iplist = ''; + $select_emaillist = ''; + + $template->assign_vars(array( + 'L_UNBAN_USER' => $lang['UNBAN_USERNAME'], + 'L_UNBAN_USER_EXPLAIN' => $lang['UNBAN_USERNAME_EXPLAIN'], + + 'U_SEARCH_USER' => append_sid("./../search.php?mode=searchuser"), + 'S_UNBAN_USERLIST_SELECT' => $select_userlist, + 'S_UNBAN_IPLIST_SELECT' => $select_iplist, + 'S_UNBAN_EMAILLIST_SELECT' => $select_emaillist, + 'S_BAN_ACTION' => append_sid("admin_user_ban.php")) + ); +} + +print_page('admin_user_ban.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_user_search.php b/upload/admin/admin_user_search.php new file mode 100644 index 000000000..7cb8d908c --- /dev/null +++ b/upload/admin/admin_user_search.php @@ -0,0 +1,1344 @@ +sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not select group data', '', __LINE__, __FILE__, $sql); + } + + $group_list = ''; + + if(DB()->num_rows($result) != 0) + { + $template->assign_block_vars('groups_exist', array()); + + while($row = DB()->sql_fetchrow($result)) + { + $group_list .= ''; + } + } + + + $sql = "SELECT * FROM " . BB_RANKS . " + WHERE rank_special = 1 + ORDER BY rank_title"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain ranks data', '', __LINE__, __FILE__, $sql); + } + $rank_select_box = ''; + if(DB()->num_rows($result) != 0) + { + $template->assign_block_vars('ranks_exist', array()); + while( $row = DB()->sql_fetchrow($result) ) + { + $rank = $row['rank_title']; + $rank_id = $row['rank_id']; + $rank_select_box .= ''; + } + } + + + $language_list = language_select('', 'language_type'); + $timezone_list = tz_select('', 'timezone_type'); + + $sql = "SELECT f.forum_id, f.forum_name, f.forum_parent, c.cat_id, c.cat_title + FROM ( ". BB_FORUMS ." AS f INNER JOIN ". BB_CATEGORIES ." AS c ON c.cat_id = f.cat_id ) + ORDER BY c.cat_order, f.forum_order ASC"; + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not select forum data', '', __LINE__, __FILE__, $sql); + } + + $forums = array(); + + if(DB()->num_rows($result) != 0) + { + $template->assign_block_vars('forums_exist', array()); + + $last_cat_id = -1; + + $forums_list = ''; + + while($row = DB()->sql_fetchrow($result)) + { + if($row['cat_id'] != $last_cat_id) + { + $forums_list .= ''; + $last_cat_id = $row['cat_id']; + } + + $forums_list .= ''; + } + } + + $styles_list = $bb_cfg['tpl_name']; + + $lastvisited = array(1, 7, 14, 30, 60, 120, 365, 500, 730, 1000); + $lastvisited_list = ''; + + foreach($lastvisited as $days) + { + $lastvisited_list .= ''; + } + + $template->assign_vars(array( + 'TPL_ADMIN_USER_SEARCH_MAIN' => true, + + 'L_USER_SEARCH' => $lang['SEARCH_USERS_ADVANCED'], + 'L_SEARCH_EXPLAIN' => $lang['SEARCH_USERS_EXPLAIN'], + 'L_USERNAME_EXPLAIN' => $lang['SEARCH_USERNAME_EXPLAIN'], + 'L_EMAIL' => $lang['EMAIL_ADDRESS'], + 'L_EMAIL_EXPLAIN' => $lang['SEARCH_EMAIL_EXPLAIN'], + 'L_IP' => $lang['IP_ADDRESS'], + 'L_IP_EXPLAIN' => $lang['SEARCH_IP_EXPLAIN'], + 'L_USERS_JOINED' => $lang['SEARCH_USERS_JOINED'], + 'L_REGEX' => $lang['REGULAR_EXPRESSION'], + 'L_JOIN_DATE_EXPLAIN' => $lang['SEARCH_USERS_JOINED_EXPLAIN'], + 'L_SEARCH_USERS_GROUPS_EXPLAIN' => $lang['SEARCH_USERS_GROUPS_EXPLAIN'], + 'L_ADMINS' => $lang['ADMINISTRATORS'], + 'L_POSTCOUNT_EXPLAIN' => $lang['SEARCH_USERS_POSTCOUNT_EXPLAIN'], + 'L_GREATERTHAN' => $lang['GREATER_THAN'], + 'L_LESSERTHAN' => $lang['LESS_THAN'], + 'L_USERFIELD_EXPLAIN' => $lang['SEARCH_USERS_USERFIELD_EXPLAIN'], + 'L_LASTVISITED' => $lang['SEARCH_USERS_LASTVISITED'], + 'L_LASTVISITED_EXPLAIN' => $lang['SEARCH_USERS_LASTVISITED_EXPLAIN'], + 'L_LANGUAGE' => $lang['BOARD_LANG'], + 'L_LANGUAGE_EXPLAIN' => $lang['SEARCH_USERS_LANGUAGE_EXPLAIN'], + 'L_TIMEZONE_EXPLAIN' => $lang['SEARCH_USERS_TIMEZONE_EXPLAIN'], + 'L_STYLE' => $lang['BOARD_STYLE'], + 'L_STYLE_EXPLAIN' => $lang['SEARCH_USERS_STYLE_EXPLAIN'], + 'L_MODERATORS_OF_EXPLAIN' => $lang['SEARCH_USERS_MODERATORS_EXPLAIN'], + 'L_MISC_EXPLAIN' => $lang['SEARCH_USERS_MISC_EXPLAIN'], + + 'YEAR' => date("Y"), + 'MONTH' => date("m"), + 'DAY' => date("d"), + 'GROUP_LIST' => $group_list, + 'RANK_SELECT_BOX' => $rank_select_box, + 'LANGUAGE_LIST' => $language_list, + 'TIMEZONE_LIST' => $timezone_list, + 'FORUMS_LIST' => $forums_list, + 'STYLE_LIST' => $styles_list, + 'LASTVISITED_LIST' => $lastvisited_list, + + 'S_SEARCH_ACTION' => append_sid("admin_user_search.php") + )); +} +else +{ + $mode = ''; + + // validate mode + if(isset($_POST['search_username'])||isset($_GET['search_username'])) + { + $mode = 'search_username'; + } + else if(isset($_POST['search_email'])||isset($_GET['search_email'])) + { + $mode = 'search_email'; + } + else if(isset($_POST['search_ip'])||isset($_GET['search_ip'])) + { + $mode = 'search_ip'; + } + else if(isset($_POST['search_joindate'])||isset($_GET['search_joindate'])) + { + $mode = 'search_joindate'; + } + else if(isset($_POST['search_group'])||isset($_GET['search_group'])) + { + $mode = 'search_group'; + } + else if(isset($_POST['search_rank'])||isset($_GET['search_rank'])) + { + $mode = 'search_rank'; + } + else if(isset($_POST['search_postcount'])||isset($_GET['search_postcount'])) + { + $mode = 'search_postcount'; + } + else if(isset($_POST['search_userfield'])||isset($_GET['search_userfield'])) + { + $mode = 'search_userfield'; + } + else if(isset($_POST['search_lastvisited'])||isset($_GET['search_lastvisited'])) + { + $mode = 'search_lastvisited'; + } + else if(isset($_POST['search_language'])||isset($_GET['search_language'])) + { + $mode = 'search_language'; + } + else if(isset($_POST['search_timezone'])||isset($_GET['search_timezone'])) + { + $mode = 'search_timezone'; + } + else if(isset($_POST['search_style'])||isset($_GET['search_style'])) + { + $mode = 'search_style'; + } + else if(isset($_POST['search_moderators'])||isset($_GET['search_moderators'])) + { + $mode = 'search_moderators'; + } + else if(isset($_POST['search_misc'])||isset($_GET['search_misc'])) + { + $mode = 'search_misc'; + } + + // validate fields (that they exist) + switch($mode) + { + case 'search_username': + $username = ( isset($_GET['username']) ) ? $_GET['username'] : $_POST['username']; + $regex = ( @$_POST['search_username_regex'] ) ? true : ( @$_GET['regex'] ) ? true : false; + + if(!$username) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_USERNAME']); + } + + break; + case 'search_email': + $email = ( isset($_GET['email']) ) ? $_GET['email'] : $_POST['email']; + $regex = ( @$_POST['search_email_regex'] ) ? true : ( @$_GET['regex'] ) ? true : false; + + if(!$email) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_EMAIL']); + } + + break; + case 'search_ip': + $ip_address = ( isset($_POST['ip_address'] ) ) ? $_POST['ip_address'] : $_GET['ip_address']; + + if(!$ip_address) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_IP']); + } + break; + case 'search_joindate': + $date_type = ( isset($_POST['date_type'] ) ) ? $_POST['date_type'] : $_GET['date_type']; + $date_day = ( isset($_POST['date_day'] ) ) ? $_POST['date_day'] : $_GET['date_day']; + $date_month = ( isset($_POST['date_month'] ) ) ? $_POST['date_month'] : $_GET['date_month']; + $date_year = ( isset($_POST['date_year'] ) ) ? $_POST['date_year'] : $_GET['date_year']; + + if(!$date_type || !$date_day || !$date_month || !$date_year) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_DATE']); + } + break; + case 'search_group': + $group_id = ( isset($_POST['group_id'] ) ) ? $_POST['group_id'] : $_GET['group_id']; + if(!$group_id) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_GROUP']); + } + break; + case 'search_rank': + $rank_id = ( isset($_POST['rank_id'] ) ) ? $_POST['rank_id'] : $_GET['rank_id']; + if(!$rank_id) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_RANK']); + } + break; + case 'search_postcount': + $postcount_type = ( isset($_POST['postcount_type'] ) ) ? $_POST['postcount_type'] : $_GET['postcount_type']; + $postcount_value = ( isset($_POST['postcount_value'] ) ) ? $_POST['postcount_value'] : $_GET['postcount_value']; + + if(!$postcount_type || ( !$postcount_value && $postcount_value != 0)) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_POSTCOUNT']); + } + break; + case 'search_userfield': + $userfield_type = ( isset($_POST['userfield_type'] ) ) ? $_POST['userfield_type'] : $_GET['userfield_type']; + $userfield_value = ( isset($_POST['userfield_value'] ) ) ? $_POST['userfield_value'] : $_GET['userfield_value']; + $regex = ( @$_POST['search_userfield_regex'] ) ? true : ( @$_GET['regex'] ) ? true : false; + + if(!$userfield_type || !$userfield_value) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_USERFIELD']); + } + + break; + case 'search_lastvisited': + $lastvisited_days = ( isset($_POST['lastvisited_days'] ) ) ? $_POST['lastvisited_days'] : $_GET['lastvisited_days']; + $lastvisited_type = ( isset($_POST['lastvisited_type'] ) ) ? $_POST['lastvisited_type'] : $_GET['lastvisited_type']; + + if(!$lastvisited_days || !$lastvisited_type) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_LASTVISITED']); + } + + break; + case 'search_language': + $language_type = ( isset($_POST['language_type'] ) ) ? $_POST['language_type'] : $_GET['language_type']; + + if(!$language_type) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_LANGUAGE']); + } + + break; + case 'search_timezone': + $timezone_type = ( isset($_POST['timezone_type'] ) ) ? $_POST['timezone_type'] : $_GET['timezone_type']; + + if(!$timezone_type && $timezone_type != 0) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_TIMEZONE']); + } + + break; + case 'search_style': + $style_type = ( isset($_POST['style_type'] ) ) ? $_POST['style_type'] : $_GET['style_type']; + + if(!$style_type) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_STYLE']); + } + + break; + case 'search_moderators': + $moderators_forum = ( isset($_POST['moderators_forum'] ) ) ? $_POST['moderators_forum'] : $_GET['moderators_forum']; + + if(!$moderators_forum) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_MODERATORS']); + } + + break; + case 'search_misc': + default: + $misc = ( isset($_POST['misc'] ) ) ? $_POST['misc'] : $_GET['misc']; + if(!$misc) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID']); + } + } + + $base_url = "admin_user_search.php?dosearch=true"; + + $select_sql = "SELECT u.user_id, u.username, u.user_email, u.user_posts, u.user_regdate, u.user_level, u.user_active, u.user_lastvisit + FROM ".BB_USERS." AS u"; + + $lower_b = 'LOWER('; + $lower_e = ')'; + if(@$regex) + { + switch(SQL_LAYER) + { + case 'postgres': + $op = '~'; + break; + case 'oracle': + // Oracle uses a different syntax, we'll handle that a little later + break; + case 'mysql': + case 'mysql4': + $op = 'REGEXP'; + break; + default: + message_die(GENERAL_MESSAGE, $lang['SEARCH_NO_REGEXP']); + } + + $lower_b = ''; + $lower_e = ''; + } + + // validate data & prepare sql + switch($mode) + { + case 'search_username': + $base_url .= "&search_username=true&username=".rawurlencode(stripslashes($username)); + + $text = sprintf($lang['SEARCH_FOR_USERNAME'], strip_tags(htmlspecialchars(stripslashes($username)))); + + if(!$regex) + { + $username = preg_replace('/\*/', '%', trim(strip_tags(strtolower($username)))); + + if(strstr($username, '%')) + { + $op = 'LIKE'; + } + else + { + $op = '='; + } + } + else + { + $username = preg_replace('/\\\\\\\(? ".ANONYMOUS; + + $select_sql .= " WHERE REGEXP_LIKE(u.username, '".str_replace("\'", "''", $username)."') + AND u.user_id <> ".ANONYMOUS; + } + else + { + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE {$lower_b}username{$lower_e} $op '".str_replace("\'", "''", $username)."' + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE {$lower_b}u.username{$lower_e} $op '".str_replace("\'", "''", $username)."' + AND u.user_id <> ".ANONYMOUS; + } + break; + case 'search_email': + $base_url .= "&search_email=true&email=".rawurlencode(stripslashes($email)); + + $text = sprintf($lang['SEARCH_FOR_EMAIL'], strip_tags(htmlspecialchars(stripslashes($email)))); + + if(!$regex) + { + $email = preg_replace('/\*/', '%', trim(strip_tags(strtolower($email)))); + + if(strstr($email, '%')) + { + $op = 'LIKE'; + } + else + { + $op = '='; + } + } + else + { + $email = preg_replace('/\\\\\\\(? ".ANONYMOUS; + + $select_sql .= " WHERE REGEXP_LIKE(u.user_email, '".str_replace("\'", "''", $email)."') + AND u.user_id <> ".ANONYMOUS; + } + else + { + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE {$lower_b}user_email{$lower_e} $op '".str_replace("\'", "''", $email)."' + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE {$lower_b}u.user_email{$lower_e} $op '".str_replace("\'", "''", $email)."' + AND u.user_id <> ".ANONYMOUS; + } + break; + case 'search_ip': + $base_url .= "&search_ip=true&ip_address=".rawurlencode(stripslashes($ip_address)); + + // Remove any whitespace + $ip_address = trim($ip_address); + + $text = sprintf($lang['SEARCH_FOR_IP'], strip_tags(htmlspecialchars(stripslashes($ip_address)))); + + unset($users); + $users = array(); + + // Let's see if they entered a full valid IPv4 address + if( preg_match('/^([0-9]{1,2}|[0-2][0-9]{0,2})(\.([0-9]{1,2}|[0-2][0-9]{0,2})){3}$/', $ip_address) ) + { + // Encode the ip into hexademicals + $ip = encode_ip($ip_address); + + // Because we will be deleting based on IP's, we will store the encoded IP alone + $users[] = $ip; + } + // We will also support wildcards, is this an xxx.xxx.* address? + else if( preg_match('/^([0-9]{1,2}|[0-2][0-9]{0,2})(\.([0-9]{1,2}|[0-2][0-9]{0,2})){0,2}\.\*/', $ip_address) ) + { + // Alright, now we do the ugly part, converting them to encoded ips + // We need to deal with the three ways it can be done + // xxx.* + // xxx.xxx.* + // xxx.xxx.xxx.* + + // First we will split the IP into its quads + $ip_split = explode('.', $ip_address); + + // Now we'll work with which type of wildcard we have + switch( count($ip_split) ) + { + // xxx.xxx.xxx.* + case 4: + // We will encode the ip into hexademical quads + $users[] = encode_ip($ip_split[0].".".$ip_split[1].".".$ip_split[2].".255"); + break; + // xxx.xxx.* + case 3: + // We will encode the ip into hexademical quads again.. + $users[] = encode_ip($ip_split[0].".".$ip_split[1].".255.255"); + break; + // xxx.* + case 2: + // We will encode the ip into hexademical quads again again.... + $users[] = encode_ip($ip_split[0].".255.255.255"); + break; + } + } + // Lastly, let's see if they have a range in the last quad, like xxx.xxx.xxx.xxx - xxx.xxx.xxx.yyy + else if( preg_match('/^([0-9]{1,2}|[0-2][0-9]{0,2})(\.([0-9]{1,2}|[0-2][0-9]{0,2})){3}(\s)*-(\s)*([0-9]{1,2}|[0-2][0-9]{0,2})(\.([0-9]{1,2}|[0-2][0-9]{0,2})){3}$/', $ip_address) ) + { + // We will split the two ranges + $range = preg_split('/[-\s]+/', $ip_address); + + // This is where break the start and end ips into quads + $start_range = explode('.', $range[0]); + $end_range = explode('.', $range[1]); + + // Confirm if we are in the same subnet or the last quad in the beginning range is greater than the last in the ending range + if( ($start_range[0].$start_range[1].$start_range[2] != $end_range[0].$end_range[1].$end_range[2]) || ($start_range[3] > $end_range[3]) ) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_IP']); + } + + // Ok, we need to store each IP in the range.. + for( $i = $start_range[3]; $i <= $end_range[3]; $i++ ) + { + // let's put it in the big array.. + $users[] = encode_ip($start_range[0].".".$start_range[1 ].".".$start_range[2].".".$i); + } + } + // This is not a valid IP based on what we want.. + else + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_IP']); + } + + $ip_in_sql = ''; + $ip_like_sql = ''; + $ip_like_sql_flylast = ''; + $ip_like_sql_flyreg = ''; + + foreach($users as $address) + { + // Is this IP a range? + if( preg_match('/(ff){1,3}$/i', $address) ) + { + // num.xxx.xxx.xxx + if( preg_match('/[0-9a-f]{2}ffffff/i', $address) ) + { + $ip_start = substr($address, 0, 2); + } + // num.num.xxx.xxx + else if( preg_match('/[0-9a-f]{4}ffff/i', $address) ) + { + $ip_start = substr($address, 0, 4); + + } + // num.num.num.xxx + else if( preg_match('/[0-9a-f]{6}ff/i', $address) ) + { + $ip_start = substr($address, 0, 6); + } + + $ip_like_sql_flylast = $ip_like_sql . ( $ip_like_sql != '' ) ? " OR user_last_ip LIKE '".$ip_start."%'" : "user_last_ip LIKE '".$ip_start."%'"; + $ip_like_sql_flyreg = $ip_like_sql . ( $ip_like_sql != '' ) ? " OR user_reg_ip LIKE '".$ip_start."%'" : "user_reg_ip LIKE '".$ip_start."%'"; + $ip_like_sql .= ( $ip_like_sql != '' ) ? " OR poster_ip LIKE '".$ip_start."%'" : "poster_ip LIKE '".$ip_start."%'"; + } + else + { + $ip_in_sql .= ( $ip_in_sql == '' ) ? "'$address'" : ", '$address'"; + } + } + + $where_sql = ''; + $where_sql .= ( $ip_in_sql != '' ) ? "poster_ip IN ($ip_in_sql)": ""; + $where_sql .= ( $ip_like_sql != '' ) ? ( $where_sql != "" ) ? " OR $ip_like_sql" : "$ip_like_sql": ""; + + if (!$where_sql) bb_die('invalid request'); + + // start search + $no_result_search = false; + $ip_users_sql = ''; + $sql = "SELECT poster_id + FROM ".BB_POSTS." + WHERE poster_id <> ".ANONYMOUS." + AND ($where_sql) + GROUP BY poster_id"; + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not count users", '', __LINE__, __FILE__, $sql); + } + + if(DB()->num_rows($result)==0) + { + $no_result_search = true; + // message_die(GENERAL_MESSAGE, $lang['SEARCH_NO_RESULTS']); + } + else + { + $total_pages['total'] = DB()->num_rows($result); + + $total_sql = NULL; + + $ip_users_sql = ''; + + while($row = DB()->sql_fetchrow($result)) + { + $ip_users_sql .= ( $ip_users_sql == '' ) ? $row['poster_id'] : ', '.$row['poster_id']; + } + } + + // fly_indiz addon [START] + // user last ip + $where_sql = ''; + $where_sql .= ( $ip_in_sql != '' ) ? "user_last_ip IN ($ip_in_sql)": ""; + $where_sql .= ( $ip_like_sql_flylast != '' ) ? ( $where_sql != "" ) ? " OR $ip_like_sql_flylast" : "$ip_like_sql_flylast": ""; + $sql = "SELECT user_id + FROM ".BB_USERS." + WHERE user_id <> ".ANONYMOUS." + AND ($where_sql) + GROUP BY user_id"; + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not count users", '', __LINE__, __FILE__, $sql); + } + if(DB()->num_rows($result)!=0) + { + if ($no_result_search == true) $no_result_search = false; + $total_pages['total'] = DB()->num_rows($result); + $total_sql = NULL; + while($row = DB()->sql_fetchrow($result)) + { + $ip_users_sql .= ( $ip_users_sql == '' ) ? $row['user_id'] : ', '.$row['user_id']; + } + } + // user reg ip + $where_sql = ''; + $where_sql .= ( $ip_in_sql != '' ) ? "user_reg_ip IN ($ip_in_sql)": ""; + $where_sql .= ( $ip_like_sql_flyreg != '' ) ? ( $where_sql != "" ) ? " OR $ip_like_sql_flyreg" : "$ip_like_sql_flyreg": ""; + $sql = "SELECT user_id + FROM ".BB_USERS." + WHERE user_id <> ".ANONYMOUS." + AND ($where_sql) + GROUP BY user_id"; + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not count users", '', __LINE__, __FILE__, $sql); + } + if(DB()->num_rows($result)!=0) + { + if ($no_result_search == true) $no_result_search = false; + $total_pages['total'] = DB()->num_rows($result); + $total_sql = NULL; + while($row = DB()->sql_fetchrow($result)) + { + $ip_users_sql .= ( $ip_users_sql == '' ) ? $row['user_id'] : ', '.$row['user_id']; + } + } + if ($no_result_search == true) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_NO_RESULTS']); + } + // fly_indiz addon [END] + + $select_sql .= " WHERE u.user_id IN ($ip_users_sql)"; + + break; + case 'search_joindate': + $base_url .= "&search_joindate=true&date_type=".rawurlencode($date_type)."&date_day=".rawurlencode($date_day)."&date_month=".rawurlencode($date_month)."&date_year=".rawurlencode(stripslashes($date_year)); + + $date_type = trim(strtolower($date_type)); + + if($date_type != 'before' && $date_type != 'after') + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_DATE']); + } + + $date_day = intval($date_day); + + if( !preg_match('/^([1-9]|[0-2][0-9]|3[0-1])$/', $date_day) ) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_DAY']); + } + + $date_month = intval($date_month); + + if( !preg_match('/^(0?[1-9]|1[0-2])$/', $date_month) ) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_MONTH']); + } + + $date_year = intval($date_year); + + if( !preg_match('/^(20[0-9]{2}|19[0-9]{2})$/', $date_year) ) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_YEAR']); + } + + $text = sprintf($lang['SEARCH_FOR_DATE'], strip_tags(htmlspecialchars(stripslashes($date_type))), $date_year, $date_month, $date_day); + + $time = mktime(0,0,0,$date_month, $date_day, $date_year); + + if($date_type == 'before') + { + $arg = '<'; + } + else + { + $arg = '>'; + } + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_regdate $arg $time + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_regdate $arg $time + AND u.user_id <> ".ANONYMOUS; + + break; + case 'search_group': + $group_id = intval($group_id); + + $base_url .= "&search_group=true&group_id=".rawurlencode($group_id); + + if(!$group_id) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_GROUP']); + } + + $sql = "SELECT group_name + FROM ".BB_GROUPS." + WHERE group_id = $group_id + AND group_single_user = 0"; + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not select group data', '', __LINE__, __FILE__, $sql); + } + + if(DB()->num_rows($result)==0) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_GROUP']); + } + + $group_name = DB()->sql_fetchrow($result); + + $text = sprintf($lang['SEARCH_FOR_GROUP'], strip_tags(htmlspecialchars($group_name['group_name']))); + + $total_sql .= "SELECT COUNT(u.user_id) AS total + FROM ".BB_USERS." AS u, ".BB_USER_GROUP." AS ug + WHERE u.user_id = ug.user_id + AND ug.group_id = $group_id + AND u.user_id <> ".ANONYMOUS; + + $select_sql .= ", ".BB_USER_GROUP." AS ug + WHERE u.user_id = ug.user_id + AND ug.group_id = $group_id + AND u.user_id <> ".ANONYMOUS; + + break; + case 'search_rank': + $rank_id = intval($rank_id); + + $base_url .= "&search_rank=true&rank_id=".rawurlencode($rank_id); + + if(!$rank_id) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_RANK']); + } + + $sql = "SELECT rank_title + FROM ".BB_RANKS." + WHERE rank_id = $rank_id + AND rank_special = 1"; + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not select rank data', '', __LINE__, __FILE__, $sql); + } + + if(DB()->num_rows($result)==0) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_RANK']); + } + + $rank_title = DB()->sql_fetchrow($result); + + $text = sprintf($lang['SEARCH_FOR_RANK'], strip_tags(htmlspecialchars($rank_title['rank_title']))); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_rank = $rank_id + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_rank = $rank_id + AND u.user_id <> ".ANONYMOUS; + + break; + case 'search_postcount': + $postcount_type = trim(strtolower($postcount_type)); + $postcount_value = trim(strtolower($postcount_value)); + + $base_url .= "&search_postcount=true&postcount_type=".rawurlencode($postcount_type)."&postcount_value=".rawurlencode(stripslashes($postcount_value)); + + switch($postcount_type) + { + case 'greater': + $postcount_value = intval($postcount_value); + + $text = sprintf($lang['SEARCH_FOR_POSTCOUNT_GREATER'], $postcount_value); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_posts > $postcount_value + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_posts > $postcount_value + AND u.user_id <> ".ANONYMOUS; + break; + case 'lesser': + $postcount_value = intval($postcount_value); + + $text = sprintf($lang['SEARCH_FOR_POSTCOUNT_LESSER'], $postcount_value); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_posts < $postcount_value + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_posts < $postcount_value + AND u.user_id <> ".ANONYMOUS; + break; + case 'equals': + // looking for a - + if(strstr($postcount_value, '-')) + { + $range = preg_split('/[-\s]+/', $postcount_value); + + $range_begin = intval($range[0]); + $range_end = intval($range[1]); + + if($range_begin > $range_end) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_POSTCOUNT']); + } + + $text = sprintf($lang['SEARCH_FOR_POSTCOUNT_RANGE'], $range_begin, $range_end); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_posts >= $range_begin + AND user_posts <= $range_end + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_posts >= $range_begin + AND u.user_posts <= $range_end + AND u.user_id <> ".ANONYMOUS; + } + else + { + $postcount_value = intval($postcount_value); + + $text = sprintf($lang['SEARCH_FOR_POSTCOUNT_EQUALS'], $postcount_value); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_posts = $postcount_value + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_posts = $postcount_value + AND u.user_id <> ".ANONYMOUS; + } + break; + default: + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID']); + } + + break; + case 'search_userfield': + $base_url .= "&search_userfield=true&userfield_type=".rawurlencode($userfield_type)."&userfield_value=".rawurlencode(stripslashes($userfield_value)); + + $text = strip_tags(htmlspecialchars(stripslashes($userfield_value))); + + if(!$regex) + { + $userfield_value = preg_replace('/\*/', '%', trim(strip_tags(strtolower($userfield_value)))); + + if(strstr($userfield_value, '%')) + { + $op = 'LIKE'; + } + else + { + $op = '='; + } + } + else + { + $userfield_value = preg_replace('/\\\\\\\(? ".ANONYMOUS; + + $select_sql .= " WHERE REGEXP_LIKE(u.$field, '".str_replace("\'", "''", $userfield_value)."') + AND u.user_id <> ".ANONYMOUS; + } + else + { + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE {$lower_b}$field{$lower_e} $op '".str_replace("\'", "''", $userfield_value)."' + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE {$lower_b}u.$field{$lower_e} $op '".str_replace("\'", "''", $userfield_value)."' + AND u.user_id <> ".ANONYMOUS; + } + + break; + case 'search_lastvisited': + $lastvisited_type = trim(strtolower($lastvisited_type)); + $lastvisited_days = intval($lastvisited_days); + + $base_url .= "&search_lastvisited=true&lastvisited_type=".rawurlencode(stripslashes($lastvisited_type))."&lastvisited_days=".rawurlencode($lastvisited_days); + + $lastvisited_seconds = ( time() - ( ( ( $lastvisited_days * 24 ) * 60 ) * 60 ) ); + + switch($lastvisited_type) + { + case 'in': + $text = sprintf($lang['SEARCH_FOR_LASTVISITED_INTHELAST'], $lastvisited_days, ( ( $lastvisited_days > 1 ) ? $lang['DAYS'] : $lang['DAY'] ) ); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_lastvisit >= $lastvisited_seconds + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_lastvisit >= $lastvisited_seconds + AND u.user_id <> ".ANONYMOUS; + break; + case 'after': + $text = sprintf($lang['SEARCH_FOR_LASTVISITED_AFTERTHELAST'], $lastvisited_days, ( ( $lastvisited_days > 1 ) ? $lang['DAYS'] : $lang['DAY'] )); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_lastvisit < $lastvisited_seconds + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_lastvisit < $lastvisited_seconds + AND u.user_id <> ".ANONYMOUS; + + break; + default: + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_LASTVISITED']); + } + + break; + case 'search_language': + $base_url .= "&search_language=true&language_type=".rawurlencode(stripslashes($language_type)); + + $language_type = trim(strtolower(stripslashes($language_type))); + + if($language_type == '') + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_LANGUAGE']); + } + + $text = sprintf($lang['SEARCH_FOR_LANGUAGE'], strip_tags(htmlspecialchars($language_type))); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_lang = '".str_replace("\'", "''", $language_type)."' + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_lang = '".str_replace("\'", "''", $language_type)."' + AND u.user_id <> ".ANONYMOUS; + + break; + case 'search_timezone': + $base_url .= "&search_timezone=true&timezone_type=".rawurlencode(stripslashes($timezone_type)); + $text = sprintf($lang['SEARCH_FOR_TIMEZONE'], strip_tags(htmlspecialchars(stripslashes($timezone_type)))); + + $timezone_type = intval($timezone_type); + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_timezone = $timezone_type + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_timezone = $timezone_type + AND u.user_id <> ".ANONYMOUS; + + break; + case 'search_style': + message_die(GENERAL_MESSAGE, 'Disabled'); + break; + case 'search_moderators': + $base_url .= "&search_moderators=true&moderators_forum=".rawurlencode(stripslashes($moderators_forum)); + $moderators_forum = intval($moderators_forum); + + $sql = "SELECT forum_name + FROM ".BB_FORUMS." + WHERE forum_id = ".$moderators_forum; + + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not select forum data', '', __LINE__, __FILE__, $sql); + } + + if(DB()->num_rows($result)==0) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID_MODERATORS']); + } + + $forum_name = DB()->sql_fetchrow($result); + + $text = sprintf($lang['SEARCH_FOR_MODERATORS'], htmlCHR($forum_name['forum_name'])); + + $total_sql .= "SELECT COUNT(DISTINCT u.user_id) AS total + FROM ".BB_USERS." AS u, ".BB_GROUPS." AS g, ".BB_USER_GROUP." AS ug, ".BB_AUTH_ACCESS." AS aa + WHERE u.user_id = ug.user_id + AND ug.group_id = g.group_id + AND g.group_id = aa.group_id + AND aa.forum_id = ". $moderators_forum ." + AND aa.forum_perm & ". BF_AUTH_MOD ." + AND u.user_id <> ".ANONYMOUS; + + $select_sql .= ", ".BB_GROUPS." AS g, ".BB_USER_GROUP." AS ug, ".BB_AUTH_ACCESS." AS aa + WHERE u.user_id = ug.user_id + AND ug.group_id = g.group_id + AND g.group_id = aa.group_id + AND aa.forum_id = ". $moderators_forum ." + AND aa.forum_perm & ". BF_AUTH_MOD ." + AND u.user_id <> ".ANONYMOUS." + GROUP BY u.user_id, u.username, u.user_email, u.user_posts, u.user_regdate, u.user_level, u.user_active, u.user_lastvisit"; + break; + case 'search_misc': + default: + $misc = trim(strtolower($misc)); + + $base_url .= "&search_misc=true&misc=".rawurlencode(stripslashes($misc)); + + switch($misc) + { + case 'admins': + $text = $lang['SEARCH_FOR_ADMINS']; + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_level = ".ADMIN." + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_level = ".ADMIN." + AND u.user_id <> ".ANONYMOUS; + break; + case 'mods': + $text = $lang['SEARCH_FOR_MODS']; + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_level = ".MOD." + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_level = ".MOD." + AND u.user_id <> ".ANONYMOUS; + break; + case 'banned': + $text = $lang['SEARCH_FOR_BANNED']; + + $total_sql .= "SELECT COUNT(u.user_id) AS total + FROM ".BB_USERS." AS u, ".BB_BANLIST." AS b + WHERE u.user_id = b.ban_userid + AND u.user_id <> ".ANONYMOUS; + + $select_sql .= ", ".BB_BANLIST." AS b + WHERE u.user_id = b.ban_userid + AND u.user_id <> ".ANONYMOUS; + + break; + case 'disabled': + $text = $lang['SEARCH_FOR_DISABLED']; + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_active = 0 + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_active = 0 + AND u.user_id <> ".ANONYMOUS; + + break; + case 'disabled_pms': + $text = $lang['SEARCH_FOR_DISABLED_PMS']; + + $total_sql .= "SELECT COUNT(user_id) AS total + FROM ".BB_USERS." + WHERE user_allow_pm = 0 + AND user_id <> ".ANONYMOUS; + + $select_sql .= " WHERE u.user_allow_pm = 0 + AND u.user_id <> ".ANONYMOUS; + + break; + default: + message_die(GENERAL_MESSAGE, $lang['SEARCH_INVALID']); + } + } + + if(@$regex) + { + $base_url .= '®ex=1'; + } + + $select_sql .= " ORDER BY "; + + switch(strtolower(@$_GET['sort'])) + { + case 'regdate': + $sort = 'regdate'; + + $select_sql .= "u.user_regdate"; + break; + case 'posts': + $sort = 'posts'; + + $select_sql .= "u.user_posts"; + break; + case 'user_email': + $sort = 'user_email'; + + $select_sql .= "u.user_email"; + break; + case 'lastvisit': + $sort = 'lastvisit'; + + $select_sql .= "u.user_lastvisit"; + break; + case 'username': + default: + $sort = 'username'; + + $select_sql .= "u.username"; + } + + switch(@$_GET['order']) + { + case 'DESC': + $order = "DESC"; + $o_order = "ASC"; + break; + case 'DESC': + default: + $o_order = "DESC"; + $order = "ASC"; + } + + $select_sql .= " $order"; + + $page = ( isset($_GET['page']) ) ? intval($_GET['page']) : intval(trim(@$_POST['page'])); + + if($page < 1) + { + $page = 1; + } + + if($page == 1) + { + $offset = 0; + } + else + { + $offset = ( ($page - 1) * $bb_cfg['topics_per_page']); + } + + $limit = "LIMIT $offset, ".$bb_cfg['topics_per_page']; + + $select_sql .= " $limit"; + + if(!is_null($total_sql)) + { + if(!$result = DB()->sql_query($total_sql)) + { + message_die(GENERAL_ERROR, "Could not count users", '', __LINE__, __FILE__, $total_sql); + } + + $total_pages = DB()->sql_fetchrow($result); + + if($total_pages['total'] == 0) + { + message_die(GENERAL_MESSAGE, $lang['SEARCH_NO_RESULTS']); + } + } + $num_pages = ceil( ( $total_pages['total'] / $bb_cfg['topics_per_page'] ) ); + + $pagination = ''; + + if($page > 1) + { + $pagination .= ''.$lang['PREVIOUS'].''; + } + + if($page < $num_pages) + { + $pagination .= ( $pagination == '' ) ? ''.$lang['NEXT'].'' : ' | '.$lang['NEXT'].''; + } + + if($num_pages > 2) + { + $pagination .= '   '; + } + + $template->assign_vars(array( + 'TPL_ADMIN_USER_SEARCH_RESULTS' => true, + + 'L_USER_SEARCH' => $lang['SEARCH_USERS_ADVANCED'], + 'L_EMAIL' => $lang['EMAIL_ADDRESS'], + 'L_JOINDATE' => $lang['JOINED'], + 'L_LASTVISIT' => $lang['LAST_VISIT'], + + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], $page, $num_pages), + 'PAGINATION' => $pagination, + 'NEW_SEARCH' => sprintf($lang['SEARCH_USERS_NEW'],$text, $total_pages['total'],append_sid("admin_user_search.php")), + + 'U_USERNAME' => ( ( $sort == 'username' ) ? append_sid("$base_url&sort=$sort&order=$o_order") : append_sid("$base_url&sort=username&order=$order") ), + 'U_EMAIL' => ( ( $sort == 'user_email' ) ? append_sid("$base_url&sort=$sort&order=$o_order") : append_sid("$base_url&sort=user_email&order=$order") ), + 'U_POSTS' => ( ( $sort == 'posts' ) ? append_sid("$base_url&sort=$sort&order=$o_order") : append_sid("$base_url&sort=posts&order=$order") ), + 'U_JOINDATE' => ( ( $sort == 'regdate' ) ? append_sid("$base_url&sort=$sort&order=$o_order") : append_sid("$base_url&sort=regdate&order=$order") ), + 'U_LASTVISIT' => ( ( $sort == 'lastvisit' ) ? append_sid("$base_url&sort=$sort&order=$o_order") : append_sid("$base_url&sort=lastvisit&order=$order") ), + + 'S_POST_ACTION' => append_sid("$base_url&sort=$sort&order=$order") + )); + + if(!$result = DB()->sql_query($select_sql)) + { + message_die(GENERAL_ERROR, "Could not select user data", '', __LINE__, __FILE__, $select_sql); + } + + $rowset = DB()->sql_fetchrowset($result); + + $users_sql = ''; + + foreach($rowset as $array) + { + $users_sql .= ( $users_sql == '' ) ? $array['user_id'] : ', '.$array['user_id']; + } + + $sql = "SELECT ban_userid AS user_id + FROM ".BB_BANLIST." + WHERE ban_userid IN ($users_sql)"; + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not select banned data", '', __LINE__, __FILE__, $sql); + } + + unset($banned); + + $banned = array(); + + while($row = DB()->sql_fetchrow($result)) + { + $banned[$row['user_id']] = true; + } + + for($i = 0; $i < count($rowset); $i++) + { + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars('userrow', array( + 'ROW_CLASS' => $row_class, + 'USERNAME' => $rowset[$i]['username'], + 'EMAIL' => $rowset[$i]['user_email'], + 'JOINDATE' => bb_date($rowset[$i]['user_regdate']), + 'LASTVISIT' => bb_date($rowset[$i]['user_lastvisit']), + 'POSTS' => $rowset[$i]['user_posts'], + 'BAN' => ( ( !isset($banned[$rowset[$i]['user_id']]) ) ? $lang['NOT_BANNED'] : $lang['BANNED'] ), + 'ABLED' => ( ( $rowset[$i]['user_active'] ) ? $lang['ENABLED'] : $lang['DISABLED'] ), + + 'U_VIEWPROFILE' => append_sid("../profile.php?mode=viewprofile&".POST_USERS_URL."=".$rowset[$i]['user_id']), + 'U_VIEWPOSTS' => append_sid("../search.php?search_author=1&uid={$rowset[$i]['user_id']}"), + 'U_MANAGE' => append_sid("admin_users.php?mode=edit&".POST_USERS_URL."=".$rowset[$i]['user_id']), + 'U_PERMISSIONS' => append_sid("admin_ug_auth.php?mode=user&".POST_USERS_URL."=".$rowset[$i]['user_id']), + )); + } +} + +print_page('admin_user_search.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_users.php b/upload/admin/admin_users.php new file mode 100644 index 000000000..1f4a067eb --- /dev/null +++ b/upload/admin/admin_users.php @@ -0,0 +1,970 @@ +#'); +$html_entities_replace = array('<', '>'); + +$message = $error_msg = $username_sql = $signature_bbcode_uid = ''; +$group_moderator = $mark_list = array(); + +$mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : ''; + +function return_msg_ua ($status_msg) +{ + global $lang; + + $message = $status_msg; + + $message .= '

'; + $message .= sprintf($lang['CLICK_RETURN_USERADMIN'], '', ''); + $message .= '

'; + $message .= sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + return $message; +} + +// +// Begin program +// +if ( $mode == 'edit' || $mode == 'save' && ( isset($_POST['username']) || isset($_GET[POST_USERS_URL]) || isset( $_POST[POST_USERS_URL]) ) ) +{ + attachment_quota_settings('user', @$_POST['submit'], $mode); + + // + // Ok, the profile has been modified and submitted, let's update + // + if ( ( $mode == 'save' && isset( $_POST['submit'] ) ) || isset( $_POST['avatargallery'] ) || isset( $_POST['submitavatar'] ) || isset( $_POST['cancelavatar'] ) ) + { + $user_id = (int) $_POST['id']; + + if (!$this_userdata = get_userdata($user_id)) + { + message_die(GENERAL_MESSAGE, $lang['NO_USER_ID_SPECIFIED']); + } + + if ($userdata['user_id'] != $user_id) + { + if (!empty($_POST['deleteuser'])) + { + delete_user_sessions($user_id); + user_delete($user_id, !empty($_POST['delete_user_posts'])); + + if ($this_userdata['user_level'] == MOD) + { + $datastore->update('moderators'); + } + + message_die(GENERAL_MESSAGE, return_msg_ua($lang['USER_DELETED'])); + } + else if (!empty($_POST['delete_user_posts'])) + { + post_delete('user', $user_id); + message_die(GENERAL_MESSAGE, return_msg_ua('User posts were deleted')); + } + } + + $username = ( !empty($_POST['username']) ) ? clean_username($_POST['username']) : ''; + $email = ( !empty($_POST['email']) ) ? trim(strip_tags(htmlspecialchars( $_POST['email'] ) )) : ''; + + $password = ( !empty($_POST['password']) ) ? trim(strip_tags(htmlspecialchars( $_POST['password'] ) )) : ''; + $password_confirm = ( !empty($_POST['password_confirm']) ) ? trim(strip_tags(htmlspecialchars( $_POST['password_confirm'] ) )) : ''; + + $icq = ( !empty($_POST['icq']) ) ? trim(strip_tags( $_POST['icq'] ) ) : ''; + + $website = ( !empty($_POST['website']) ) ? trim(strip_tags( $_POST['website'] ) ) : ''; + $location = ( !empty($_POST['location']) ) ? trim(strip_tags( $_POST['location'] ) ) : ''; + $occupation = ( !empty($_POST['occupation']) ) ? trim(strip_tags( $_POST['occupation'] ) ) : ''; + $interests = ( !empty($_POST['interests']) ) ? trim(strip_tags( $_POST['interests'] ) ) : ''; + $signature = ( !empty($_POST['signature']) ) ? trim(str_replace('
', "\n", $_POST['signature'] ) ) : ''; + + validate_optional_fields($icq, $website, $location, $occupation, $interests, $signature); + + $allowviewonline = ( isset( $_POST['hideonline']) ) ? ( ( $_POST['hideonline'] ) ? 0 : TRUE ) : TRUE; + $notifyreply = ( isset( $_POST['notifyreply']) ) ? ( ( $_POST['notifyreply'] ) ? TRUE : 0 ) : 0; + $notifypm = ( isset( $_POST['notifypm']) ) ? ( ( $_POST['notifypm'] ) ? TRUE : 0 ) : TRUE; + $viewemail = (int) !empty($_POST['viewemail']); + $attachsig = (int) !empty($_POST['attachsig']); + + $user_lang = ( $_POST['language'] != $bb_cfg['board_lang'] ) ? $_POST['language'] : ''; + $user_timezone = ( isset($_POST['timezone']) ) ? str_replace(',', '.', doubleval($_POST['timezone'])) : $bb_cfg['board_timezone']; + + $user_flag = (@$_POST['user_flag'] && $_POST['user_flag'] != 'blank.gif') ? $_POST['user_flag'] : ''; + + $user_template = ( @$_POST['template'] ) ? $_POST['template'] : @$bb_cfg['board_template']; + $user_dateformat = (!empty($_POST['dateformat']) && $_POST['dateformat'] != $bb_cfg['board_dateformat']) ? $_POST['dateformat'] : ''; + + $user_avatar_local = ( isset( $_POST['avatarselect'] ) && !empty($_POST['submitavatar'] ) && $bb_cfg['allow_avatar_local'] ) ? $_POST['avatarselect'] : ( ( isset( $_POST['avatarlocal'] ) ) ? $_POST['avatarlocal'] : '' ); + $user_avatar_category = ( isset($_POST['avatarcatname']) && $bb_cfg['allow_avatar_local'] ) ? htmlspecialchars($_POST['avatarcatname']) : '' ; + + $user_avatar_remoteurl = ( !empty($_POST['avatarremoteurl']) ) ? trim( $_POST['avatarremoteurl'] ) : ''; + $user_avatar_url = ( !empty($_POST['avatarurl']) ) ? trim( $_POST['avatarurl'] ) : ''; + $user_avatar_loc = ( @$_FILES['avatar']['tmp_name'] != "none") ? $_FILES['avatar']['tmp_name'] : ''; + $user_avatar_name = ( !empty($_FILES['avatar']['name']) ) ? $_FILES['avatar']['name'] : ''; + $user_avatar_size = ( !empty($_FILES['avatar']['size']) ) ? $_FILES['avatar']['size'] : 0; + $user_avatar_filetype = ( !empty($_FILES['avatar']['type']) ) ? $_FILES['avatar']['type'] : ''; + + $user_avatar = ( empty($user_avatar_loc) ) ? $this_userdata['user_avatar'] : ''; + $user_avatar_type = ( empty($user_avatar_loc) ) ? $this_userdata['user_avatar_type'] : ''; + + $user_status = ( !empty($_POST['user_status']) ) ? intval( $_POST['user_status'] ) : 0; + $user_allowpm = ( !empty($_POST['user_allowpm']) ) ? intval( $_POST['user_allowpm'] ) : 0; + $user_rank = ( !empty($_POST['user_rank']) ) ? intval( $_POST['user_rank'] ) : 0; + $user_allowavatar = ( !empty($_POST['user_allowavatar']) ) ? intval( $_POST['user_allowavatar'] ) : 0; + + if( isset( $_POST['avatargallery'] ) || isset( $_POST['submitavatar'] ) || isset( $_POST['cancelavatar'] ) ) + { + $username = stripslashes($username); + $email = stripslashes($email); + $password = ''; + $password_confirm = ''; + + $icq = stripslashes($icq); + + $website = htmlspecialchars(stripslashes($website)); + $location = htmlspecialchars(stripslashes($location)); + $occupation = htmlspecialchars(stripslashes($occupation)); + $interests = htmlspecialchars(stripslashes($interests)); + $signature = htmlspecialchars(stripslashes($signature)); + + $user_lang = stripslashes($user_lang); + $user_dateformat = htmlspecialchars(stripslashes($user_dateformat)); + + if ( !isset($_POST['cancelavatar'])) + { + $user_avatar = $user_avatar_category . '/' . $user_avatar_local; + $user_avatar_type = USER_AVATAR_GALLERY; + } + } + } + + if( isset( $_POST['submit'] ) ) + { + include(INC_DIR . 'ucp/usercp_avatar.php'); + + $error = FALSE; + + if (stripslashes($username) != $this_userdata['username']) + { + unset($rename_user); + + if ( stripslashes(strtolower($username)) != strtolower($this_userdata['username']) ) + { + $result = validate_username($username); + if ( $result['error'] ) + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $result['error_msg']; + } + else if ( strtolower(str_replace("\\'", "''", $username)) == strtolower($userdata['username']) ) + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['USERNAME_TAKEN']; + } + } + + if (!$error) + { + $username_sql = "username = '" . str_replace("\\'", "''", $username) . "', "; + $rename_user = $username; // Used for renaming usergroup + } + } + + $passwd_sql = ''; + if( !empty($password) && !empty($password_confirm) ) + { + // + // Awww, the user wants to change their password, isn't that cute.. + // + if($password != $password_confirm) + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['PASSWORD_MISMATCH']; + } + else + { + $password = md5($password); + $passwd_sql = "user_password = '$password', "; + } + } + else if( $password && !$password_confirm ) + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['PASSWORD_MISMATCH']; + } + else if( !$password && $password_confirm ) + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['PASSWORD_MISMATCH']; + } + + if ($signature != '') + { + $sig_length_check = preg_replace('/(\[.*?)(=.*?)\]/is', '\\1]', stripslashes($signature)); + $signature_bbcode_uid = ($bb_cfg['allow_bbcode']) ? make_bbcode_uid() : ''; + $signature = prepare_message($signature, $bb_cfg['allow_bbcode'], $bb_cfg['allow_smilies'], $signature_bbcode_uid); + + if ( strlen($sig_length_check) > $bb_cfg['max_sig_chars'] ) + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['SIGNATURE_TOO_LONG']; + } + } + + // + // Avatar stuff + // + $avatar_sql = ""; + if( isset($_POST['avatardel']) ) + { + if( $this_userdata['user_avatar_type'] == USER_AVATAR_UPLOAD && $this_userdata['user_avatar'] != "" ) + { + if( @file_exists(@phpbb_realpath('./../' . $bb_cfg['avatar_path'] . "/" . $this_userdata['user_avatar'])) ) + { + @unlink('./../' . $bb_cfg['avatar_path'] . "/" . $this_userdata['user_avatar']); + } + } + $avatar_sql = ", user_avatar = '', user_avatar_type = " . USER_AVATAR_NONE; + } + else if( ( $user_avatar_loc != "" || !empty($user_avatar_url) ) && !$error ) + { + // + // Only allow one type of upload, either a + // filename or a URL + // + if( !empty($user_avatar_loc) && !empty($user_avatar_url) ) + { + $error = TRUE; + if( isset($error_msg) ) + { + $error_msg .= "
"; + } + $error_msg .= $lang['ONLY_ONE_AVATAR']; + } + + if( $user_avatar_loc != "" ) + { + if( file_exists(@phpbb_realpath($user_avatar_loc)) && preg_match("/\.(gif|jpg|png)$/", $user_avatar_name) ) + { + if( $user_avatar_size <= $bb_cfg['avatar_filesize'] && $user_avatar_size > 0) + { + $error_type = false; + + // + // Opera appends the image name after the type, not big, not clever! + // + preg_match("'image\/[x\-]*([a-z]+)'", $user_avatar_filetype, $user_avatar_filetype); + $user_avatar_filetype = $user_avatar_filetype[1]; + + switch( $user_avatar_filetype ) + { + case "jpeg": + case "pjpeg": + case "jpg": + $imgtype = '.jpg'; + break; + case "gif": + $imgtype = '.gif'; + break; + case "png": + $imgtype = '.png'; + break; + default: + $error = true; + $error_msg = (!empty($error_msg)) ? $error_msg . "
" . $lang['AVATAR_FILETYPE'] : $lang['AVATAR_FILETYPE']; + break; + } + + if( !$error ) + { + list($width, $height) = @getimagesize($user_avatar_loc); + + if( $width <= $bb_cfg['avatar_max_width'] && $height <= $bb_cfg['avatar_max_height'] ) + { + $user_id = $this_userdata['user_id']; + + $avatar_filename = $user_id . $imgtype; + + if( $this_userdata['user_avatar_type'] == USER_AVATAR_UPLOAD && $this_userdata['user_avatar'] != "" ) + { + if( @file_exists(@phpbb_realpath("./../" . $bb_cfg['avatar_path'] . "/" . $this_userdata['user_avatar'])) ) + { + @unlink("./../" . $bb_cfg['avatar_path'] . "/". $this_userdata['user_avatar']); + } + } + @copy($user_avatar_loc, "./../" . $bb_cfg['avatar_path'] . "/$avatar_filename"); + + $avatar_sql = ", user_avatar = '$avatar_filename', user_avatar_type = " . USER_AVATAR_UPLOAD; + } + else + { + $l_avatar_size = sprintf($lang['AVATAR_IMAGESIZE'], $bb_cfg['avatar_max_width'], $bb_cfg['avatar_max_height']); + + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $l_avatar_size : $l_avatar_size; + } + } + } + else + { + $l_avatar_size = sprintf($lang['AVATAR_FILESIZE'], round($bb_cfg['avatar_filesize'] / 1024)); + + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $l_avatar_size : $l_avatar_size; + } + } + else + { + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $lang['AVATAR_FILETYPE'] : $lang['AVATAR_FILETYPE']; + } + } + else if( !empty($user_avatar_url) ) + { + // + // First check what port we should connect + // to, look for a :[xxxx]/ or, if that doesn't + // exist assume port 80 (http) + // + preg_match("/^(http:\/\/)?([\w\-\.]+)\:?([0-9]*)\/(.*)$/", $user_avatar_url, $url_ary); + + if( !empty($url_ary[4]) ) + { + $port = (!empty($url_ary[3])) ? $url_ary[3] : 80; + + $fsock = @fsockopen($url_ary[2], $port, $errno, $errstr); + if( $fsock ) + { + $base_get = "/" . $url_ary[4]; + + // + // Uses HTTP 1.1, could use HTTP 1.0 ... + // + @fputs($fsock, "GET $base_get HTTP/1.1\r\n"); + @fputs($fsock, "HOST: " . $url_ary[2] . "\r\n"); + @fputs($fsock, "Connection: close\r\n\r\n"); + + $avatar_data = ''; + while( !@feof($fsock) ) + { + $avatar_data .= @fread($fsock, $bb_cfg['avatar_filesize']); + } + @fclose($fsock); + + if( preg_match("/Content-Length\: ([0-9]+)[^\/ ][\s]+/i", $avatar_data, $file_data1) && preg_match("/Content-Type\: image\/[x\-]*([a-z]+)[\s]+/i", $avatar_data, $file_data2) ) + { + $file_size = $file_data1[1]; + $file_type = $file_data2[1]; + + switch( $file_type ) + { + case "jpeg": + case "pjpeg": + case "jpg": + $imgtype = '.jpg'; + break; + case "gif": + $imgtype = '.gif'; + break; + case "png": + $imgtype = '.png'; + break; + default: + $error = true; + $error_msg = (!empty($error_msg)) ? $error_msg . "
" . $lang['AVATAR_FILETYPE'] : $lang['AVATAR_FILETYPE']; + break; + } + + if( !$error && $file_size > 0 && $file_size < $bb_cfg['avatar_filesize'] ) + { + $avatar_data = substr($avatar_data, strlen($avatar_data) - $file_size, $file_size); + + $tmp_filename = tempnam ("/tmp", $this_userdata['user_id'] . "-"); + $fptr = @fopen($tmp_filename, "wb"); + $bytes_written = @fwrite($fptr, $avatar_data, $file_size); + @fclose($fptr); + + if( $bytes_written == $file_size ) + { + list($width, $height) = @getimagesize($tmp_filename); + + if( $width <= $bb_cfg['avatar_max_width'] && $height <= $bb_cfg['avatar_max_height'] ) + { + $user_id = $this_userdata['user_id']; + + $avatar_filename = $user_id . $imgtype; + + if( $this_userdata['user_avatar_type'] == USER_AVATAR_UPLOAD && $this_userdata['user_avatar'] != "") + { + if( file_exists(@phpbb_realpath("./../" . $bb_cfg['avatar_path'] . "/" . $this_userdata['user_avatar'])) ) + { + @unlink("./../" . $bb_cfg['avatar_path'] . "/" . $this_userdata['user_avatar']); + } + } + @copy($tmp_filename, "./../" . $bb_cfg['avatar_path'] . "/$avatar_filename"); + @unlink($tmp_filename); + + $avatar_sql = ", user_avatar = '$avatar_filename', user_avatar_type = " . USER_AVATAR_UPLOAD; + } + else + { + $l_avatar_size = sprintf($lang['AVATAR_IMAGESIZE'], $bb_cfg['avatar_max_width'], $bb_cfg['avatar_max_height']); + + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $l_avatar_size : $l_avatar_size; + } + } + else + { + // + // Error writing file + // + @unlink($tmp_filename); + message_die(GENERAL_ERROR, "Could not write avatar file to local storage. Please contact the board administrator with this message", "", __LINE__, __FILE__); + } + } + } + else + { + // + // No data + // + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $lang['FILE_NO_DATA'] : $lang['FILE_NO_DATA']; + } + } + else + { + // + // No connection + // + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $lang['NO_CONNECTION_URL'] : $lang['NO_CONNECTION_URL']; + } + } + else + { + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $lang['INCOMPLETE_URL'] : $lang['INCOMPLETE_URL']; + } + } + else if( !empty($user_avatar_name) ) + { + $l_avatar_size = sprintf($lang['AVATAR_FILESIZE'], round($bb_cfg['avatar_filesize'] / 1024)); + + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $l_avatar_size : $l_avatar_size; + } + } + else if( $user_avatar_remoteurl != "" && $avatar_sql == "" && !$error ) + { + if( !preg_match("#^http:\/\/#i", $user_avatar_remoteurl) ) + { + $user_avatar_remoteurl = "http://" . $user_avatar_remoteurl; + } + + if( preg_match("#^(http:\/\/[a-z0-9\-]+?\.([a-z0-9\-]+\.)*[a-z]+\/.*?\.(gif|jpg|png)$)#is", $user_avatar_remoteurl) ) + { + $avatar_sql = ", user_avatar = '" . str_replace("\'", "''", $user_avatar_remoteurl) . "', user_avatar_type = " . USER_AVATAR_REMOTE; + } + else + { + $error = true; + $error_msg = ( !empty($error_msg) ) ? $error_msg . "
" . $lang['WRONG_REMOTE_AVATAR_FORMAT'] : $lang['WRONG_REMOTE_AVATAR_FORMAT']; + } + } + else if( $user_avatar_local != "" && $avatar_sql == "" && !$error ) + { + $avatar_sql = ", user_avatar = '" . str_replace("\'", "''", phpbb_ltrim(basename($user_avatar_category), "'") . '/' . phpbb_ltrim(basename($user_avatar_local), "'")) . "', user_avatar_type = " . USER_AVATAR_GALLERY; + } + + // + // Update entry in DB + // + if( !$error ) + { + $update_user_opt = array( + 'viewemail', + 'attachsig', + ); + $user_opt = $this_userdata['user_opt']; + + foreach ($update_user_opt as $opt) + { + setbit($user_opt, $bf['user_opt'][$opt], !empty($_POST[$opt])); + } + + $sql = "UPDATE " . BB_USERS . " + SET " . $username_sql . $passwd_sql . " + user_email = '" . str_replace("\'", "''", $email) . "', + user_icq = '" . str_replace("\'", "''", $icq) . "', + user_website = '" . str_replace("\'", "''", $website) . "', + user_occ = '" . str_replace("\'", "''", $occupation) . "', + user_from = '" . str_replace("\'", "''", $location) . "', + user_from_flag = '$user_flag', + user_interests = '" . str_replace("\'", "''", $interests) . "', + user_sig = '" . str_replace("\'", "''", $signature) . "', + user_opt = $user_opt, + user_allow_viewonline = $allowviewonline, + user_notify = $notifyreply, + user_notify_pm = $notifypm, + user_sig_bbcode_uid = '$signature_bbcode_uid', + user_allowavatar = $user_allowavatar, + user_allow_pm = $user_allowpm, + user_lang = '" . str_replace("\'", "''", $user_lang) . "', + user_timezone = $user_timezone, + user_dateformat = '" . str_replace("\'", "''", $user_dateformat) . "', + user_active = $user_status, + user_rank = $user_rank" . $avatar_sql . ", + user_actkey = '' + WHERE user_id = $user_id"; + + if( $result = DB()->sql_query($sql) ) + { + // Delete user session, to prevent the user navigating the forum (if logged in) when disabled + if (!$user_status) + { + delete_user_sessions($user_id); + } + + $message .= $lang['ADMIN_USER_UPDATED']; + } + else + { + $error = TRUE; + $error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['ADMIN_USER_FAIL']; + } + + if ($this_userdata['user_level'] == MOD) + { + $datastore->update('moderators'); + } + + if ($this_userdata['user_active'] != $user_status) + { + $log_action_type = (!$user_status) ? 'adm_user_ban' : 'adm_user_unban'; + + $log_action->admin($log_action_type, array( + 'log_msg' => 'user: '. get_usernames_for_log($user_id), + )); + } + + $message .= '

' . sprintf($lang['CLICK_RETURN_USERADMIN'], '', '') . '

' . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $message); + } + else + { + $template->assign_vars(array('ERROR_MESSAGE' => $error_msg)); + + $username = htmlspecialchars(stripslashes($username)); + $email = stripslashes($email); + $password = ''; + $password_confirm = ''; + + $icq = stripslashes($icq); + + $website = htmlspecialchars(stripslashes($website)); + $location = htmlspecialchars(stripslashes($location)); + $occupation = htmlspecialchars(stripslashes($occupation)); + $interests = htmlspecialchars(stripslashes($interests)); + $signature = htmlspecialchars(stripslashes($signature)); + + $user_lang = stripslashes($user_lang); + $user_dateformat = htmlspecialchars(stripslashes($user_dateformat)); + } + } + else if( !isset( $_POST['submit'] ) && $mode != 'save' && !isset( $_POST['avatargallery'] ) && !isset( $_POST['submitavatar'] ) && !isset( $_POST['cancelavatar'] ) ) + { + if( isset( $_GET[POST_USERS_URL]) || isset( $_POST[POST_USERS_URL]) ) + { + $user_id = ( isset( $_POST[POST_USERS_URL]) ) ? intval( $_POST[POST_USERS_URL]) : intval( $_GET[POST_USERS_URL]); + $this_userdata = get_userdata($user_id); + if( !$this_userdata ) + { + message_die(GENERAL_MESSAGE, $lang['NO_USER_ID_SPECIFIED'] ); + } + } + else + { + $this_userdata = get_userdata($_POST['username'], true); + if( !$this_userdata ) + { + message_die(GENERAL_MESSAGE, $lang['NO_USER_ID_SPECIFIED'] ); + } + } + + // + // Now parse and display it as a template + // + $user_id = $this_userdata['user_id']; + $username = $this_userdata['username']; + $email = $this_userdata['user_email']; + $password = ''; + $password_confirm = ''; + + $icq = $this_userdata['user_icq']; + + $website = htmlspecialchars($this_userdata['user_website']); + $location = htmlspecialchars($this_userdata['user_from']); + $user_flag = htmlspecialchars($this_userdata['user_from_flag']); + + $occupation = htmlspecialchars($this_userdata['user_occ']); + $interests = htmlspecialchars($this_userdata['user_interests']); + + $signature = ($this_userdata['user_sig_bbcode_uid'] != '') ? preg_replace('#:' . $this_userdata['user_sig_bbcode_uid'] . '#si', '', $this_userdata['user_sig']) : $this_userdata['user_sig']; + $signature = preg_replace($html_entities_match, $html_entities_replace, $signature); + + $viewemail = bf($this_userdata['user_opt'], 'user_opt', 'viewemail'); + $notifypm = $this_userdata['user_notify_pm']; + $notifyreply = $this_userdata['user_notify']; + $attachsig = bf($this_userdata['user_opt'], 'user_opt', 'attachsig'); + $allowviewonline = $this_userdata['user_allow_viewonline']; + + $user_avatar = $this_userdata['user_avatar']; + $user_avatar_type = $this_userdata['user_avatar_type']; + $user_timezone = $this_userdata['user_timezone']; + + $user_lang = ($this_userdata['user_lang']) ? $this_userdata['user_lang'] : $bb_cfg['default_lang']; + $user_dateformat = ($this_userdata['user_dateformat']) ? $this_userdata['user_dateformat'] : $bb_cfg['default_dateformat']; + + $user_status = $this_userdata['user_active']; + $user_allowavatar = $this_userdata['user_allowavatar']; + $user_allowpm = $this_userdata['user_allow_pm']; + + $bbcode_status = ($bb_cfg['allow_bbcode']) ? $lang['BBCODE_IS_ON'] : $lang['BBCODE_IS_OFF']; + $smilies_status = ($bb_cfg['allow_smilies']) ? $lang['SMILIES_ARE_ON'] : $lang['SMILIES_ARE_OFF']; + } + + if( isset($_POST['avatargallery']) && !$error ) + { + if( !$error ) + { + $user_id = intval($_POST['id']); + + $dir = @opendir("../" . $bb_cfg['avatar_gallery_path']); + + $avatar_images = array(); + while( $file = @readdir($dir) ) + { + if( $file != "." && $file != ".." && !is_file(phpbb_realpath("./../" . $bb_cfg['avatar_gallery_path'] . "/" . $file)) && !is_link(phpbb_realpath("./../" . $bb_cfg['avatar_gallery_path'] . "/" . $file)) ) + { + $sub_dir = @opendir("../" . $bb_cfg['avatar_gallery_path'] . "/" . $file); + + $avatar_row_count = 0; + $avatar_col_count = 0; + + while( $sub_file = @readdir($sub_dir) ) + { + if( preg_match("/(\.gif$|\.png$|\.jpg)$/is", $sub_file) ) + { + $avatar_images[$file][$avatar_row_count][$avatar_col_count] = $sub_file; + + $avatar_col_count++; + if( $avatar_col_count == 5 ) + { + $avatar_row_count++; + $avatar_col_count = 0; + } + } + } + } + } + + @closedir($dir); + + if( isset($_POST['avatarcategory']) ) + { + $category = htmlspecialchars($_POST['avatarcategory']); + } + else + { + list($category, ) = each($avatar_images); + } + @reset($avatar_images); + + $s_categories = ""; + while( list($key) = each($avatar_images) ) + { + $selected = ( $key == $category ) ? "selected=\"selected\"" : ""; + if( count($avatar_images[$key]) ) + { + $s_categories .= ''; + } + } + + $s_colspan = 0; + for($i = 0; $i < count($avatar_images[$category]); $i++) + { + $template->assign_block_vars("avatar_row", array()); + + $s_colspan = max($s_colspan, count($avatar_images[$category][$i])); + + for($j = 0; $j < count($avatar_images[$category][$i]); $j++) + { + $template->assign_block_vars("avatar_row.avatar_column", array( + "AVATAR_IMAGE" => "../" . $bb_cfg['avatar_gallery_path'] . '/' . $category . '/' . $avatar_images[$category][$i][$j]) + ); + + $template->assign_block_vars("avatar_row.avatar_option_column", array( + "S_OPTIONS_AVATAR" => $avatar_images[$category][$i][$j]) + ); + } + } + + $s_hidden_fields = ''; + $s_hidden_fields .= ''; + + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + +// FLAGHACK-start + $s_hidden_fields .= ''; +// FLAGHACK-end + + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + $s_hidden_fields .= ''; + + $template->assign_vars(array( + 'TPL_ADMIN_USER_AVATAR_GALLERY' => true, + + "L_USER_EXPLAIN" => $lang['USER_ADMIN_EXPLAIN'], + + "S_OPTIONS_CATEGORIES" => $s_categories, + "S_COLSPAN" => $s_colspan, + "S_PROFILE_ACTION" => append_sid("admin_users.php?mode=$mode"), + "S_HIDDEN_FIELDS" => $s_hidden_fields) + ); + } + } + else + { + $s_hidden_fields = ''; + $s_hidden_fields .= ''; + + if( !empty($user_avatar_local) ) + { + $s_hidden_fields .= ''; + } + + if( $user_avatar_type ) + { + switch( $user_avatar_type ) + { + case USER_AVATAR_UPLOAD: + $avatar = ''; + break; + case USER_AVATAR_REMOTE: + $avatar = ''; + break; + case USER_AVATAR_GALLERY: + $avatar = ''; + break; + } + } + else + { + $avatar = ""; + } + + $sql = "SELECT * FROM " . BB_RANKS . " + WHERE rank_special = 1 + ORDER BY rank_title"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain ranks data', '', __LINE__, __FILE__, $sql); + } + + $rank_select_box = ''; + while( $row = DB()->sql_fetchrow($result) ) + { + $rank = $row['rank_title']; + $rank_id = $row['rank_id']; + + $selected = ( $this_userdata['user_rank'] == $rank_id ) ? ' selected="selected"' : ''; + $rank_select_box .= ''; + } + + // + // Let's do an overall check for settings/versions which would prevent + // us from doing file uploads.... + // + $ini_val = ( phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var'; + $form_enctype = ( !@$ini_val('file_uploads') || phpversion() == '4.0.4pl1' || !$bb_cfg['allow_avatar_upload'] || ( phpversion() < '4.0.3' && @$ini_val('open_basedir') != '' ) ) ? '' : 'enctype="multipart/form-data"'; + + // query to get the list of flags + $sql = "SELECT * + FROM " . BB_COUNTRIES . " + ORDER BY country_id"; + if(!$flags_result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't obtain flags information.", "", __LINE__, __FILE__, $sql); + } + $flag_row = DB()->sql_fetchrowset($flags_result); + $num_flags = DB()->num_rows($flags_result); + + // build the html select statement + if(!defined('COUNTRIES_LANG')) + { + include(LANG_DIR . "lang_countries.php"); + } + + $flag_start_image = 'blank.gif' ; + $selected = ( isset($user_flag) ) ? '' : HTML_SELECTED; + $flag_select = "'; + + $template->assign_vars(array( + 'TPL_ADMIN_USER_EDIT' => true, + + 'USERNAME' => $username, + 'EMAIL' => $email, + 'ICQ' => $icq, + 'OCCUPATION' => $occupation, + 'INTERESTS' => $interests, + 'LOCATION' => $location, + 'L_FLAG' => $lang['COUNTRY_FLAG'], + 'FLAG_SELECT' => $flag_select, + 'FLAG_START' => $flag_start_image, + + 'WEBSITE' => $website, + 'SIGNATURE' => str_replace('
', "\n", $signature), + 'VIEW_EMAIL_YES' => ($viewemail) ? 'checked="checked"' : '', + 'VIEW_EMAIL_NO' => (!$viewemail) ? 'checked="checked"' : '', + 'HIDE_USER_YES' => (!$allowviewonline) ? 'checked="checked"' : '', + 'HIDE_USER_NO' => ($allowviewonline) ? 'checked="checked"' : '', + 'NOTIFY_PM_YES' => ($notifypm) ? 'checked="checked"' : '', + 'NOTIFY_PM_NO' => (!$notifypm) ? 'checked="checked"' : '', + 'ALWAYS_ADD_SIGNATURE_YES' => ($attachsig) ? 'checked="checked"' : '', + 'ALWAYS_ADD_SIGNATURE_NO' => (!$attachsig) ? 'checked="checked"' : '', + 'NOTIFY_REPLY_YES' => ( $notifyreply ) ? 'checked="checked"' : '', + 'NOTIFY_REPLY_NO' => ( !$notifyreply ) ? 'checked="checked"' : '', + 'ADMIN_AVATAR' => $avatar, + 'LANGUAGE_SELECT' => language_select($user_lang), + 'TIMEZONE_SELECT' => tz_select($user_timezone), + 'STYLE_SELECT' => $bb_cfg['tpl_name'], + 'DATE_FORMAT' => $user_dateformat, + 'ALLOW_PM_YES' => ($user_allowpm) ? 'checked="checked"' : '', + 'ALLOW_PM_NO' => (!$user_allowpm) ? 'checked="checked"' : '', + 'ALLOW_AVATAR_YES' => ($user_allowavatar) ? 'checked="checked"' : '', + 'ALLOW_AVATAR_NO' => (!$user_allowavatar) ? 'checked="checked"' : '', + 'USER_ACTIVE_YES' => ($user_status) ? 'checked="checked"' : '', + 'USER_ACTIVE_NO' => (!$user_status) ? 'checked="checked"' : '', + 'RANK_SELECT_BOX' => $rank_select_box, + + 'L_USER_EXPLAIN' => $lang['USER_ADMIN_EXPLAIN'], + 'L_BOARD_LANGUAGE' => $lang['BOARD_LANG'], + 'L_ALWAYS_ADD_SIGNATURE' => $lang['ALWAYS_ADD_SIG'], + + 'L_SPECIAL' => $lang['USER_SPECIAL'], + 'L_SPECIAL_EXPLAIN' => $lang['USER_SPECIAL_EXPLAIN'], + 'L_USER_ACTIVE' => $lang['USER_STATUS'], + 'L_ALLOW_PM' => $lang['USER_ALLOWPM'], + 'L_ALLOW_AVATAR' => $lang['USER_ALLOWAVATAR'], + + 'L_AVATAR_EXP' => $lang['ADMIN_AVATAR_EXPLAIN'], + 'L_DELETE_AVATAR' => $lang['DELETE_IMAGE'], + 'L_AVATAR_GALLERY' => $lang['SELECT_FROM_GALLERY'], + 'L_SHOW_GALLERY' => $lang['VIEW_AVATAR_GALLERY'], + 'L_LINK_REMOTE_AVATAR' => $lang['LINK_REMOTE_AVATAR'], + + 'L_SIGNATURE_EXP' => sprintf($lang['SIGNATURE_EXPLAIN'], $bb_cfg['max_sig_chars'] ), + 'L_NOTIFY_ON_REPLY' => $lang['ALWAYS_NOTIFY'], + 'L_PROFILE_INFO_NOTICE' => $lang['PROFILE_INFO_WARN'], + 'S_FORM_ENCTYPE' => $form_enctype, + + 'BBCODE_STATUS' => sprintf(@$bbcode_status, '', ''), + 'SMILIES_STATUS' => @$smilies_status, + + 'L_DELETE_USER' => $lang['USER_DELETE'], + 'L_DELETE_USER_EXPLAIN' => $lang['USER_DELETE_EXPLAIN'], + 'L_SELECT_RANK' => $lang['RANK_TITLE'], + + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + 'S_PROFILE_ACTION' => append_sid("admin_users.php")) + ); + + if( file_exists(@phpbb_realpath('./../' . $bb_cfg['avatar_path'])) && ($bb_cfg['allow_avatar_upload'] == TRUE) ) + { + if ( $form_enctype != '' ) + { + $template->assign_block_vars('avatar_local_upload', array() ); + } + $template->assign_block_vars('avatar_remote_upload', array() ); + } + + if( file_exists(@phpbb_realpath('./../' . $bb_cfg['avatar_gallery_path'])) && ($bb_cfg['allow_avatar_local'] == TRUE) ) + { + $template->assign_block_vars('avatar_local_gallery', array() ); + } + + if( $bb_cfg['allow_avatar_remote'] == TRUE ) + { + $template->assign_block_vars('avatar_remote_link', array() ); + } + } +} +else +{ + // + // Default user selection box + // + $template->assign_vars(array( + 'TPL_ADMIN_USER_SELECT' => true, + + 'L_USER_EXPLAIN' => $lang['USER_ADMIN_EXPLAIN'], + + 'U_SEARCH_USER' => append_sid("./../search.php?mode=searchuser"), + + 'S_USER_ACTION' => append_sid("admin_users.php"), + 'S_USER_SELECT' => @$select_list) + ); +} + +print_page('admin_users.tpl', 'admin'); \ No newline at end of file diff --git a/upload/admin/admin_words.php b/upload/admin/admin_words.php new file mode 100644 index 000000000..bc6797486 --- /dev/null +++ b/upload/admin/admin_words.php @@ -0,0 +1,175 @@ +
($bb_cfg[\'use_word_censor\'] in config.php)'); +} + +$mode = request_var('mode', ''); +$mode = htmlspecialchars($mode); +// +// These could be entered via a form button +// +if( isset($_POST['add']) ) +{ + $mode = "add"; +} +else if( isset($_POST['save']) ) +{ + $mode = "save"; +} + +if( $mode != "" ) +{ + if( $mode == "edit" || $mode == "add" ) + { + $word_id = intval(request_var('id', 0)); + + $s_hidden_fields = $word = $replacement = ''; + + if( $mode == "edit" ) + { + if( $word_id ) + { + $sql = "SELECT * + FROM " . BB_WORDS . " + WHERE word_id = $word_id"; + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not query words table", "Error", __LINE__, __FILE__, $sql); + } + + $word_info = DB()->sql_fetchrow($result); + $s_hidden_fields .= ''; + $word = $word_info['word']; + $replacement = $word_info['replacement']; + } + else + { + message_die(GENERAL_MESSAGE, $lang['NO_WORD_SELECTED']); + } + } + + $template->assign_vars(array( + 'TPL_ADMIN_WORDS_EDIT' => true, + + "WORD" => $word, + "REPLACEMENT" => $replacement, + + "L_WORDS_TEXT" => $lang['WORDS_EXPLAIN'], + "L_WORD_CENSOR" => $lang['EDIT_WORD_CENSOR'], + + "S_WORDS_ACTION" => append_sid("admin_words.php"), + "S_HIDDEN_FIELDS" => $s_hidden_fields) + ); + } + else if( $mode == "save" ) + { + $word_id = intval(request_var('id', 0)); + $word = trim(request_var('word', "")); + $replacement = trim(request_var('replacement', "")); + + if($word == "" || $replacement == "") + { + message_die(GENERAL_MESSAGE, $lang['MUST_ENTER_WORD']); + } + + if( $word_id ) + { + $sql = "UPDATE " . BB_WORDS . " + SET word = '" . str_replace("\'", "''", $word) . "', replacement = '" . str_replace("\'", "''", $replacement) . "' + WHERE word_id = $word_id"; + $message = $lang['WORD_UPDATED']; + } + else + { + $sql = "INSERT INTO " . BB_WORDS . " (word, replacement) + VALUES ('" . str_replace("\'", "''", $word) . "', '" . str_replace("\'", "''", $replacement) . "')"; + $message = $lang['WORD_ADDED']; + } + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not insert data into words table", $lang['ERROR'], __LINE__, __FILE__, $sql); + } + + $message .= "

" . sprintf($lang['CLICK_RETURN_WORDADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + } + else if( $mode == "delete" ) + { + $word_id = intval(request_var('id', 0)); + + if( $word_id ) + { + $sql = "DELETE FROM " . BB_WORDS . " + WHERE word_id = $word_id"; + + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Could not remove data from words table", $lang['ERROR'], __LINE__, __FILE__, $sql); + } + + $message = $lang['WORD_REMOVED'] . "

" . sprintf($lang['CLICK_RETURN_WORDADMIN'], "", "") . "

" . sprintf($lang['CLICK_RETURN_ADMIN_INDEX'], "", ""); + + message_die(GENERAL_MESSAGE, $message); + } + else + { + message_die(GENERAL_MESSAGE, $lang['NO_WORD_SELECTED']); + } + } +} +else +{ + $sql = "SELECT * + FROM " . BB_WORDS . " + ORDER BY word"; + if( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not query words table", $lang['ERROR'], __LINE__, __FILE__, $sql); + } + + $word_rows = DB()->sql_fetchrowset($result); + $word_count = count($word_rows); + + $template->assign_vars(array( + 'TPL_ADMIN_WORDS_LIST' => true, + + "L_WORDS_TEXT" => $lang['WORDS_EXPLAIN'], + "L_ADD_WORD" => $lang['ADD_NEW_WORD'], + + "S_WORDS_ACTION" => append_sid("admin_words.php"), + "S_HIDDEN_FIELDS" => '') + ); + + for($i = 0; $i < $word_count; $i++) + { + $word = $word_rows[$i]['word']; + $replacement = $word_rows[$i]['replacement']; + $word_id = $word_rows[$i]['word_id']; + + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars("words", array( + "ROW_CLASS" => $row_class, + "WORD" => $word, + "REPLACEMENT" => $replacement, + + "U_WORD_EDIT" => append_sid("admin_words.php?mode=edit&id=$word_id"), + "U_WORD_DELETE" => append_sid("admin_words.php?mode=delete&id=$word_id")) + ); + } +} + +print_page('admin_words.tpl', 'admin'); diff --git a/upload/admin/admin_xs.php b/upload/admin/admin_xs.php new file mode 100644 index 000000000..4e4d6aa9a --- /dev/null +++ b/upload/admin/admin_xs.php @@ -0,0 +1,15 @@ +assign_vars(array( + 'TPL_ADMIN_NAVIGATE' => true, + + "L_FRAME_NO_SUPPORT" => $lang['IDX_BROWSER_NSP_FRAME'], + + "U_FORUM_INDEX" => append_sid("../index.php"), + "U_ADMIN_INDEX" => append_sid("index.php?pane=right")) + ); + + ksort($module); + + while( list($cat, $action_array) = each($module) ) + { + $cat = ( !empty($lang[strtoupper($cat)]) ) ? $lang[strtoupper($cat)] : preg_replace("/_/", " ", $cat); + + $template->assign_block_vars("catrow", array( + "ADMIN_CATEGORY" => $cat) + ); + + ksort($action_array); + + $row_count = 0; + while( list($action, $file) = each($action_array) ) + { + $row_class = !($row_count % 2) ? 'row1' : 'row2'; + + $action = ( !empty($lang[strtoupper($action)]) ) ? $lang[strtoupper($action)] : preg_replace("/_/", " ", $action); + + $template->assign_block_vars("catrow.modulerow", array( + "ROW_CLASS" => $row_class, + + "ADMIN_MODULE" => $action, + "U_ADMIN_MODULE" => append_sid($file)) + ); + $row_count++; + } + } +} +else if( isset($_GET['pane']) && $_GET['pane'] == 'right' ) +{ + $template->assign_vars(array( + 'TPL_ADMIN_MAIN' => true, + + "L_LAST_UPDATE" => $lang['LAST_UPDATED'], + "L_DB_SIZE" => $lang['DATABASE_SIZE']) + ); + + // + // Get forum statistics + // + $total_posts = get_db_stat('postcount'); + $total_users = get_db_stat('usercount'); + $total_topics = get_db_stat('topiccount'); + + $start_date = bb_date($bb_cfg['board_startdate']); + + $boarddays = ( time() - $bb_cfg['board_startdate'] ) / 86400; + + $posts_per_day = sprintf("%.2f", $total_posts / $boarddays); + $topics_per_day = sprintf("%.2f", $total_topics / $boarddays); + $users_per_day = sprintf("%.2f", $total_users / $boarddays); + + $avatar_dir_size = 0; + + if ($avatar_dir = @opendir(BB_ROOT . $bb_cfg['avatar_path'])) + { + while( $file = @readdir($avatar_dir) ) + { + if( $file != "." && $file != ".." ) + { + $avatar_dir_size += @filesize(BB_ROOT . $bb_cfg['avatar_path'] . "/" . $file); + } + } + @closedir($avatar_dir); + + // + // This bit of code translates the avatar directory size into human readable format + // Borrowed the code from the PHP.net annoted manual, origanally written by: + // Jesse (jesse@jess.on.ca) + // + if($avatar_dir_size >= 1048576) + { + $avatar_dir_size = round($avatar_dir_size / 1048576 * 100) / 100 . " MB"; + } + else if($avatar_dir_size >= 1024) + { + $avatar_dir_size = round($avatar_dir_size / 1024 * 100) / 100 . " KB"; + } + else + { + $avatar_dir_size = $avatar_dir_size . " Bytes"; + } + + } + else + { + // Couldn't open Avatar dir. + $avatar_dir_size = $lang['NOT_AVAILABLE']; + } + + if(intval($posts_per_day) > $total_posts) + { + $posts_per_day = $total_posts; + } + + if(intval($topics_per_day) > $total_topics) + { + $topics_per_day = $total_topics; + } + + if($users_per_day > $total_users) + { + $users_per_day = $total_users; + } + + // + // DB size ... MySQL only + // + // This code is heavily influenced by a similar routine + // in phpMyAdmin 2.2.0 + // + /* + if( preg_match("/^mysql/", SQL_LAYER) ) + { + $sql = "SELECT VERSION() AS mysql_version"; + if($result = DB()->sql_query($sql)) + { + $row = DB()->sql_fetchrow($result); + $version = $row['mysql_version']; + + if( preg_match("/^(3\.23|4\.|5\.)/", $version) ) + { + $db_name = ( preg_match("/^(3\.23\.[6-9])|(3\.23\.[1-9][1-9])|(4\.)|(5\.)/", $version) ) ? "`".DBNAME."`" : DBNAME; + + $sql = "SHOW TABLE STATUS FROM " . $db_name; + if($result = DB()->sql_query($sql)) + { + $tabledata_ary = DB()->sql_fetchrowset($result); + + $dbsize = 0; + for($i = 0; $i < count($tabledata_ary); $i++) + { + if( @$tabledata_ary[$i]['Type'] != "MRG_MyISAM" ) + { + $dbsize += $tabledata_ary[$i]['Data_length'] + $tabledata_ary[$i]['Index_length']; + } + } + } // Else we couldn't get the table status. + } + else + { + $dbsize = $lang['NOT_AVAILABLE']; + } + } + else + { + $dbsize = $lang['NOT_AVAILABLE']; + } + } + else if( preg_match("/^mssql/", SQL_LAYER) ) + { + $sql = "SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize + FROM sysfiles"; + if( $result = DB()->sql_query($sql) ) + { + $dbsize = ( $row = DB()->sql_fetchrow($result) ) ? intval($row['dbsize']) : $lang['NOT_AVAILABLE']; + } + else + { + $dbsize = $lang['NOT_AVAILABLE']; + } + } + else + { + $dbsize = $lang['NOT_AVAILABLE']; + } + */ + $dbsize = $lang['NOT_AVAILABLE']; + + if ( is_integer($dbsize) ) + { + if( $dbsize >= 1048576 ) + { + $dbsize = sprintf("%.2f MB", ( $dbsize / 1048576 )); + } + else if( $dbsize >= 1024 ) + { + $dbsize = sprintf("%.2f KB", ( $dbsize / 1024 )); + } + else + { + $dbsize = sprintf("%.2f Bytes", $dbsize); + } + } + + $template->assign_vars(array( + "NUMBER_OF_POSTS" => $total_posts, + "NUMBER_OF_TOPICS" => $total_topics, + "NUMBER_OF_USERS" => $total_users, + "START_DATE" => $start_date, + "POSTS_PER_DAY" => $posts_per_day, + "TOPICS_PER_DAY" => $topics_per_day, + "USERS_PER_DAY" => $users_per_day, + "AVATAR_DIR_SIZE" => $avatar_dir_size, + "DB_SIZE" => $dbsize, + "GZIP_COMPRESSION" => ( $bb_cfg['gzip_compress'] ) ? $lang['ON'] : $lang['OFF']) + ); + // + // End forum statistics + // + if (@$_GET['users_online']) + { + $template->assign_vars(array( + 'SHOW_USERS_ONLINE' => true, + )); + // + // Get users online information. + // + $sql = "SELECT u.user_id, u.username, s.session_time AS user_session_time, u.user_allow_viewonline, s.session_logged_in, s.session_ip, s.session_start + FROM " . BB_USERS . " u, " . BB_SESSIONS . " s + WHERE s.session_logged_in = 1 + AND u.user_id = s.session_user_id + AND u.user_id <> " . ANONYMOUS . " + AND s.session_time >= " . ( time() - 300 ) . " + ORDER BY s.session_ip ASC, s.session_time DESC"; + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't obtain regd user/online information.", "", __LINE__, __FILE__, $sql); + } + $onlinerow_reg = DB()->sql_fetchrowset($result); + + $sql = "SELECT session_logged_in, session_time, session_ip, session_start + FROM " . BB_SESSIONS . " + WHERE session_logged_in = 0 + AND session_time >= " . ( time() - 300 ) . " + ORDER BY session_ip ASC, session_time DESC"; + if(!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, "Couldn't obtain guest user/online information.", "", __LINE__, __FILE__, $sql); + } + $onlinerow_guest = DB()->sql_fetchrowset($result); + + $sql = "SELECT forum_name, forum_id + FROM " . BB_FORUMS; + if($forums_result = DB()->sql_query($sql)) + { + while($forumsrow = DB()->sql_fetchrow($forums_result)) + { + $forum_data[$forumsrow['forum_id']] = $forumsrow['forum_name']; + } + } + else + { + message_die(GENERAL_ERROR, "Couldn't obtain user/online forums information.", "", __LINE__, __FILE__, $sql); + } + + $reg_userid_ary = array(); + + if( count($onlinerow_reg) ) + { + $registered_users = 0; + + for($i=0, $cnt=count($onlinerow_reg); $i < $cnt; $i++) + { + if( !inarray($onlinerow_reg[$i]['user_id'], $reg_userid_ary) ) + { + $reg_userid_ary[] = $onlinerow_reg[$i]['user_id']; + + $username = $onlinerow_reg[$i]['username']; + + if( $onlinerow_reg[$i]['user_allow_viewonline'] ) + { + $registered_users++; + $hidden = FALSE; + } + else + { + @$hidden_users++; + $hidden = TRUE; + } + + $row_class = 'row1'; + + $reg_ip = decode_ip($onlinerow_reg[$i]['session_ip']); + + $template->assign_block_vars("reg_user_row", array( + "ROW_CLASS" => $row_class, + "USERNAME" => $username, + "STARTED" => bb_date($onlinerow_reg[$i]['session_start'], 'H:i'), + "LASTUPDATE" => bb_date($onlinerow_reg[$i]['user_session_time'], 'H:i'), + "IP_ADDRESS" => $reg_ip, + + "U_WHOIS_IP" => "http://www.dnsstuff.com/tools/whois/?ip=$reg_ip", + "U_USER_PROFILE" => append_sid("admin_users.php?mode=edit&" . POST_USERS_URL . "=" . $onlinerow_reg[$i]['user_id']), + )); + } + } + + } + else + { + $template->assign_vars(array( + "L_NO_REGISTERED_USERS_BROWSING" => $lang['NO_USERS_BROWSING']) + ); + } + + // + // Guest users + // + if( count($onlinerow_guest) ) + { + $guest_users = 0; + + for($i = 0; $i < count($onlinerow_guest); $i++) + { + $guest_userip_ary[] = $onlinerow_guest[$i]['session_ip']; + $guest_users++; + + $row_class = 'row2'; + + $guest_ip = decode_ip($onlinerow_guest[$i]['session_ip']); + + $template->assign_block_vars("guest_user_row", array( + "ROW_CLASS" => $row_class, + "USERNAME" => $lang['GUEST'], + "STARTED" => bb_date($onlinerow_guest[$i]['session_start'], 'H:i'), + "LASTUPDATE" => bb_date($onlinerow_guest[$i]['session_time'], 'H:i'), + "IP_ADDRESS" => $guest_ip, + + "U_WHOIS_IP" => "http://www.dnsstuff.com/tools/whois/?ip=$guest_ip", + )); + } + } + else + { + $template->assign_vars(array( + "L_NO_GUESTS_BROWSING" => $lang['NO_USERS_BROWSING']) + ); + } + } + else + { + $template->assign_vars(array( + 'USERS_ONLINE_HREF' => "index.php?pane=right&users_online=1&sid={$userdata['session_id']}", + )); + } + + $template->assign_vars(array( + 'U_CLEAR_DATASTORE' => "index.php?clear_datastore=1", + 'U_CLEAR_TPL_CACHE' => "xs_cache.php?clear=", + 'U_UPDATE_USER_LEVEL' => "index.php?update_user_level=1", + 'U_SYNC_TOPICS' => "index.php?sync_topics=1", + 'U_SYNC_USER_POSTS' => "index.php?sync_user_posts=1", + )); +} +else if (isset($_REQUEST['clear_datastore'])) +{ + $datastore->clean(); + bb_die($lang['DATASTORE_CLEARED']); +} +else if (isset($_REQUEST['update_user_level'])) +{ + require(INC_DIR .'functions_group.php'); + update_user_level('all'); + bb_die($lang['USER_LEVELS_UPDATED']); +} +else if (isset($_REQUEST['sync_topics'])) +{ + sync('topic', 'all'); + sync('forum', 'all'); + bb_die($lang['TOPICS_DATA_SYNCHRONIZED']); +} +else if (isset($_REQUEST['sync_user_posts'])) +{ + sync('user_posts', 'all'); + bb_die($lang['USER POSTS COUNT SYNCHRONIZED']); +} +else +{ + // + // Generate frameset + // + $template->assign_vars(array( + 'TPL_ADMIN_FRAMESET' => true, + 'S_FRAME_NAV' => "index.php?pane=left", + 'S_FRAME_MAIN' => "index.php?pane=right", + )); + send_no_cache_headers(); + print_page('index.tpl', 'admin', 'no_header'); +} + +print_page('index.tpl', 'admin'); + +// +// Functions +// +function inarray($needle, $haystack) +{ + for($i = 0; $i < sizeof($haystack); $i++ ) + { + if( $haystack[$i] == $needle ) + { + return true; + } + } + return false; +} diff --git a/upload/admin/pagestart.php b/upload/admin/pagestart.php new file mode 100644 index 000000000..30a7014e8 --- /dev/null +++ b/upload/admin/pagestart.php @@ -0,0 +1,26 @@ +session_start(); + +if (IS_GUEST) +{ + redirect("login.php?redirect=admin/index.php"); +} +if (!IS_ADMIN) +{ + message_die(GENERAL_MESSAGE, $lang['NOT_ADMIN']); +} +if (!$userdata['session_admin']) +{ + $redirect = url_arg($_SERVER['REQUEST_URI'], 'admin', 1); + redirect("login.php?redirect=$redirect"); +} diff --git a/upload/admin/xs_cache.php b/upload/admin/xs_cache.php new file mode 100644 index 000000000..175568c7f --- /dev/null +++ b/upload/admin/xs_cache.php @@ -0,0 +1,263 @@ +xs_version) || $template->xs_version !== 8) +{ + message_die(GENERAL_ERROR, isset($lang['XS_ERROR_NOT_INSTALLED']) ? $lang['XS_ERROR_NOT_INSTALLED'] : 'eXtreme Styles mod is not installed. You forgot to upload includes/template.php'); +} + +define('IN_XS', true); +include('xs_include.php'); + +$template->assign_block_vars('nav_left',array('ITEM' => '» ' . $lang['XS_MANAGE_CACHE'] . '')); + +$data = ''; + +$skip_files = array( + '.', + '..', + '.htaccess', + 'index.htm', + 'index.html', + 'index.php', + 'attach_config.php', + ); + +// +// clear cache +// +if(isset($_GET['clear']) && !defined('DEMO_MODE')) +{ + @set_time_limit(XS_MAX_TIMEOUT); + $clear = $_GET['clear']; + if(!$clear) + { + // clear all cache + $match = ''; + } + else + { + $match = XS_TPL_PREFIX . $clear . XS_SEPARATOR; + } + $match_len = strlen($match); + $style_len = strlen(STYLE_EXTENSION); + $backup_len = strlen(XS_BACKUP_EXT); + $dir = $template->cachedir; + $res = @opendir($dir); + if(!$res) + { + $data = $lang['XS_CACHE_NOWRITE']; + } + else + { + $num = 0; + $num_error = 0; + while(($file = readdir($res)) !== false) + { + $len = strlen($file); + // delete only files that match pattern, that aren't in exclusion list and that aren't downloaded styles. + if(substr($file, 0, $match_len) === $match && !in_array($file, $skip_files)) + if(substr($file, $len - $style_len) !== STYLE_EXTENSION && substr($file, $len - $backup_len) !== XS_BACKUP_EXT) + { + $res2 = @unlink($dir . $file); + if($res2) + { + $data .= str_replace('{FILE}', $file, $lang['XS_CACHE_LOG_DELETED']) . "
\n"; + $num ++; + } + elseif(@is_file($dir . $file)) + { + $data .= str_replace('{FILE}', $file, $lang['XS_CACHE_LOG_NODELETE']) . "
\n"; + $num_error ++; + } + } + } + closedir($res); + if(!$num && !$num_error) + { + if($clear) + { + $data .= str_replace('{TPL}', $clear, $lang['XS_CACHE_LOG_NOTHING']) . "
\n"; + } + else + { + $data .= $lang['XS_CACHE_LOG_NOTHING2'] . "
\n"; + } + } + else + { + $data .= str_replace('{NUM}', $num, $lang['XS_CACHE_LOG_COUNT']) . "
\n"; + if($num_error) + { + $data .= str_replace('{NUM}', $num_error, $lang['XS_CACHE_LOG_COUNT2']) . "
\n"; + } + } + } +} + + +// +// compile cache +// +if(isset($_GET['compile']) && !defined('DEMO_MODE')) +{ + $tpl = $_GET['compile']; + @set_time_limit(XS_MAX_TIMEOUT); + $num_errors = 0; + $num_compiled = 0; + if($tpl) + { + $dir = $template->tpldir . $tpl . '/'; + compile_cache($dir, '', $tpl); + } + else + { + $res = opendir('../templates'); + while(($file = readdir($res)) !== false) + { + if($file !== '.' && $file !== '..' && is_dir('../templates/'.$file) && @file_exists('../templates/'.$file.'/page_header.tpl')) + { + compile_cache('../templates/'.$file.'/', '', $file); + } + } + closedir($res); + } + $data .= str_replace('{NUM}', $num_compiled, $lang['XS_CACHE_LOG_COMPILED']) . "
\n"; + $data .= str_replace('{NUM}', $num_errors, $lang['XS_CACHE_LOG_ERRORS']) . "
\n"; +} + +function compile_cache($dir, $subdir, $tpl) +{ + global $data, $template, $num_errors, $num_compiled, $lang; + $str = $dir . $subdir; + $res = @opendir($dir . $subdir); + if(!$res) + { + $data .= str_replace('{DIR}', $dir.$subdir, $lang['XS_CACHE_LOG_NOACCESS']) . "
\n"; + $num_errors ++; + return; + } + while(($file = readdir($res)) !== false) + { + if(@is_dir($str . $file) && $file !== '.' && $file !== '..' && $file !== 'CVS') + { + compile_cache($dir, $subdir . $file . '/', $tpl); + } + elseif(substr($file, strlen($file) - 4) === '.tpl') + { + $res2 = $template->precompile($tpl, $subdir . $file); + if($res2) + { + $data .= str_replace('{FILE}', $dir.$subdir.$file, $lang['XS_CACHE_LOG_COMPILED2']) . "
\n"; + $num_compiled ++; + } + else + { + $data .= str_replace('{FILE}', $dir.$subdir.$file, $lang['XS_CACHE_LOG_NOCOMPILE']) . "
\n"; + $num_errors ++; + } + } + } + closedir($res); +} + +// +// get list of installed styles +// +$style_rowset = array( + 0 => array( + 'themes_id' => 1, + 'template_name' => 'default', + 'style_name' => 'default', + ), + 1 => array( + 'themes_id' => 2, + 'template_name' => $bb_cfg['tpl_name'], + 'style_name' => $bb_cfg['tpl_name'], + ), +); +$template->set_filenames(array('body' => XS_TPL_PATH . 'cache.tpl')); + +$prev_id = -1; +$prev_tpl = ''; +$style_names = array(); +$j = 0; +for($i=0; $i 0) + { + $str = implode('
', $style_names); + $str2 = urlencode($prev_tpl); + $row_class = $xs_row_class[$j % 2]; + $j++; + $template->assign_block_vars('styles', array( + 'ROW_CLASS' => $row_class, + 'TPL' => $prev_tpl, + 'STYLES' => $str, + 'U_CLEAR' => "xs_cache.php?clear={$str2}&sid={$userdata['session_id']}", + 'U_COMPILE' => "xs_cache.php?compile={$str2}&sid={$userdata['session_id']}", + ) + ); + } + $prev_id = $item['themes_id']; + $prev_tpl = $item['template_name']; + $style_names = array(htmlspecialchars($item['style_name'])); + } +} +if($prev_id > 0) +{ + $str = implode('
', $style_names); + $str2 = urlencode($prev_tpl); + $row_class = $xs_row_class[$j % 2]; + $j++; + $template->assign_block_vars('styles', array( + 'ROW_CLASS' => $row_class, + 'TPL' => $prev_tpl, + 'STYLES' => $str, + 'U_CLEAR' => "xs_cache.php?clear={$str2}&sid={$userdata['session_id']}", + 'U_COMPILE' => "xs_cache.php?compile={$str2}&sid={$userdata['session_id']}", + ) + ); +} + +$template->assign_vars(array( + 'U_CLEAR_ALL' => "xs_cache.php?clear=&sid={$userdata['session_id']}", + 'U_COMPILE_ALL' => "xs_cache.php?compile=&sid={$userdata['session_id']}", + 'RESULT' => '

' . $data + ) +); + +$template->pparse('body'); +xs_exit(); \ No newline at end of file diff --git a/upload/admin/xs_config.php b/upload/admin/xs_config.php new file mode 100644 index 000000000..0d2033102 --- /dev/null +++ b/upload/admin/xs_config.php @@ -0,0 +1,138 @@ +xs_version) || $template->xs_version !== 8) +{ + message_die(GENERAL_ERROR, isset($lang['XS_ERROR_NOT_INSTALLED']) ? $lang['XS_ERROR_NOT_INSTALLED'] : 'eXtreme Styles mod is not installed. You forgot to upload includes/template.php'); +} + +define('IN_XS', true); +include('xs_include.php'); + +$template->assign_block_vars('nav_left',array('ITEM' => '» ' . $lang['XS_CONFIGURATION'] . '')); + +$lang['XS_CONFIG_UPDATED_EXPLAIN'] = str_replace('{URL}', append_sid('xs_config.php'), $lang['XS_CONFIG_UPDATED_EXPLAIN']); +$lang['XS_CONFIG_TITLE'] = str_replace('{VERSION}', $template->xs_versiontxt, $lang['XS_CONFIG_TITLE']); +$lang['XS_CONFIG_WARNING_EXPLAIN'] = str_replace('{URL}', append_sid('xs_chmod.php'), $lang['XS_CONFIG_WARNING_EXPLAIN']); +$lang['XS_CONFIG_BACK'] = str_replace('{URL}', append_sid('xs_config.php'), $lang['XS_CONFIG_BACK']); + +// +// Updating configuration +// +if(isset($_POST['submit']) && !defined('DEMO_MODE')) +{ + $vars = array('xs_use_cache', 'xs_auto_compile', 'xs_auto_recompile', 'xs_php', 'xs_add_comments', 'xs_shownav'); + // checking navigation config + $shownav = 0; + for($i=0; $iassign_block_vars('left_refresh', array( + 'ACTION' => append_sid('index.php?pane=left') + )); + } + $_POST['xs_shownav'] = $shownav; + // checking submitted data + $update_time = false; + foreach($vars as $var) + { + if (!isset($_POST[$var])) continue; + + $new[$var] = trim($_POST[$var]); + if(($var == 'xs_auto_recompile') && !$new['xs_auto_compile']) + { + $new[$var] = 0; + } + if($bb_cfg[$var] !== $new[$var]) + { + bb_update_config(array($var => $new[$var])); + $bb_cfg[$var] = $new[$var]; + } + } + if($update_time) + { + $bb_cfg['xs_template_time'] = time() + 10; // set time 10 seconds in future in case if some tpl file would be compiled right now with current settings + bb_update_config(array('xs_template_time' => $bb_cfg['xs_template_time'])); + } + $template->assign_block_vars('switch_updated', array()); + $template->load_config($template->root, false); +} + +$template->assign_vars(array( + 'XS_USE_CACHE_0' => $bb_cfg['xs_use_cache'] ? '' : ' checked="checked"', + 'XS_USE_CACHE_1' => $bb_cfg['xs_use_cache'] ? ' checked="checked"' : '', + 'XS_AUTO_COMPILE_0' => $bb_cfg['xs_auto_compile'] ? '' : ' checked="checked"', + 'XS_AUTO_COMPILE_1' => $bb_cfg['xs_auto_compile'] ? ' checked="checked"' : '', + 'XS_AUTO_RECOMPILE_0' => $bb_cfg['xs_auto_recompile'] ? '' : ' checked="checked"', + 'XS_AUTO_RECOMPILE_1' => $bb_cfg['xs_auto_recompile'] ? ' checked="checked"' : '', + 'XS_PHP' => htmlspecialchars($bb_cfg['xs_php']), + 'XS_ADD_COMMENTS_0' => $bb_cfg['xs_add_comments'] ? '' : ' checked="checked"', + 'XS_ADD_COMMENTS_1' => $bb_cfg['xs_add_comments'] ? ' checked="checked"' : '', + 'FORM_ACTION' => append_sid('xs_config.php'), + )); + +for($i=0; $iassign_block_vars('shownav', array( + 'NUM' => $i, + 'LABEL' => $lang['XS_CONFIG_SHOWNAV'][$i], + 'CHECKED' => (($bb_cfg['xs_shownav'] & $num) > 0) ? 'checked="checked"' : '' + )); + } +} + +// test cache +$tpl_filename = $template->make_filename('_xs_test.tpl'); +$cache_filename = $template->make_filename_cache($tpl_filename); +$str = ''; +if(!xs_check_cache($cache_filename)) +{ + $template->assign_block_vars('switch_xs_warning', array()); +} +@unlink($cache_filename); +$debug_data = $str; +$template->assign_vars(array( + 'XS_DEBUG_HDR1' => sprintf($lang['XS_CHECK_HDR'], '_xs_test.tpl'), + 'XS_DEBUG_FILENAME1' => $tpl_filename, + 'XS_DEBUG_FILENAME2' => $cache_filename, + 'XS_DEBUG_DATA' => $debug_data, + )); + +$template->set_filenames(array('body' => XS_TPL_PATH . 'config.tpl')); +$template->pparse('body'); +xs_exit(); \ No newline at end of file diff --git a/upload/admin/xs_frameset.php b/upload/admin/xs_frameset.php new file mode 100644 index 000000000..1d7731011 --- /dev/null +++ b/upload/admin/xs_frameset.php @@ -0,0 +1,95 @@ +xs_version) || $template->xs_version !== 8) +{ + message_die(GENERAL_ERROR, isset($lang['XS_ERROR_NOT_INSTALLED']) ? $lang['XS_ERROR_NOT_INSTALLED'] : 'eXtreme Styles mod is not installed. You forgot to upload includes/template.php'); +} + +define('IN_XS', true); +define('NO_XS_HEADER', true); +include('xs_include.php'); + +$action = isset($_GET['action']) ? $_GET['action'] : ''; +$get_data = array(); +foreach($_GET as $var => $value) +{ + if($var !== 'action' && $var !== 'sid') + { + $get_data[] = $var . '=' . urlencode(stripslashes($value)); + } +} + +// check for style download command +if(isset($_POST['action']) && $_POST['action'] === 'web') +{ + $action = 'import'; + $get_data[] = 'get_remote=' . urlencode(stripslashes($_POST['source'])); + if(isset($_POST['return'])) + { + $get_data[] = 'return=' . urlencode(stripslashes($_POST['return'])); + } +} + +$get_data = count($get_data) ? 'php?' . implode('&', $get_data) : 'php'; + +$content_url = array( + 'config' => append_sid('xs_config.'.$get_data), + 'install' => append_sid('xs_install.'.$get_data), + 'uninstall' => append_sid('xs_uninstall.'.$get_data), + 'default' => append_sid('xs_styles.'.$get_data), + 'cache' => append_sid('xs_cache.'.$get_data), + 'import' => append_sid('xs_import.'.$get_data), + 'export' => append_sid('xs_export.'.$get_data), + 'clone' => append_sid('xs_clone.'.$get_data), + 'download' => append_sid('xs_download.'.$get_data), + 'edittpl' => append_sid('xs_edit.'.$get_data), + 'editdb' => append_sid('xs_edit_data.'.$get_data), + 'exportdb' => append_sid('xs_export_data.'.$get_data), + 'updates' => append_sid('xs_update.'.$get_data), + 'portal' => append_sid('xs_portal.'.$get_data), + 'style_config' => append_sid('xs_style_config.'.$get_data), + ); + +if(isset($content_url[$action])) +{ + $content = $content_url[$action]; +} +else +{ + $content = append_sid('xs_index.'.$get_data); +} + +$template->set_filenames(array('body' => XS_TPL_PATH . 'frameset.tpl')); +$template->assign_vars(array( + 'FRAME_TOP' => append_sid('xs_frame_top.php'), + 'FRAME_MAIN' => $content, + )); + +$template->pparse('body'); +xs_exit(); \ No newline at end of file diff --git a/upload/admin/xs_include.php b/upload/admin/xs_include.php new file mode 100644 index 000000000..9f25df27f --- /dev/null +++ b/upload/admin/xs_include.php @@ -0,0 +1,331 @@ + 0 && isset($xs_shownav_action[$i])) + { + $module[$module_name][$lang['XS_CONFIG_SHOWNAV'][$i]] = 'xs_frameset.php'.'?action=' . $xs_shownav_action[$i]; + } + } + // add menu for style configuration + foreach($bb_cfg as $var => $value) + { + if(substr($var, 0, 9) === 'xs_style_') + { + $str = substr($var, 9); + $module['Template_Config'][$str] = 'xs_frameset.php'.'?action=style_config&tpl='.urlencode($str); + } + } +} + + +if(!empty($setmodules)) +{ + if(@function_exists('jr_admin_get_module_list')) + { + $tmp_mod = $module; + global $module; + $module = $tmp_mod; + xs_admin_override(true); + } + return; +} + +// +// Global defines for eXtreme Styles mod administration panel +// +define('STYLE_HEADER_START', 'xs_style_01'); +define('STYLE_HEADER_END', ''); +define('STYLE_HEADER_VERSION', '1'); +define('STYLE_EXTENSION', '.style'); +define('XS_MAX_ITEMS_PER_STYLE', 32); +define('XS_FTP_LOCAL', 'no_ftp'); +define('XS_UPDATE_STYLE', 1); +define('XS_UPDATE_MOD', 2); +define('XS_UPDATE_PHPBB', 3); +define('XS_TPL_PATH', TEMPLATES_DIR .'xs_mod/tpl/'); +define('XS_BACKUP_PREFIX', 'backup.'); +define('XS_BACKUP_EXT', '.backup'); +define('XS_MAX_TIMEOUT', 600); // maximum timeout for downloads/import/installation + +$xs_row_class = array('row1', 'row2'); + +$template_dir = 'templates/'; + +$template->assign_vars(array( + 'XS_PATH' => TEMPLATES_DIR .'xs_mod/', + 'XS_UL' => '', + 'XS_UL2' => '
', + 'XS_LI' => '', + 'XS_LI2' => '', + 'S_HIDDEN_FIELDS' => '', + )); + +if(!defined('NO_XS_HEADER')) +{ + $template->set_filenames(array( + 'xs_header' => XS_TPL_PATH . 'xs_header.tpl', + 'xs_footer' => XS_TPL_PATH . 'xs_footer.tpl', + )); + $template->preparse = 'xs_header'; + $template->postparse = 'xs_footer'; + $template->assign_block_vars('nav_left',array('ITEM' => '' . $lang['XS_MENU'] . '')); +} + +// check if cache is writable +function xs_check_cache($filename) +{ + // check if filename is valid + global $str, $template, $lang; + if(substr($filename, 0, strlen($template->cachedir)) !== $template->cachedir) + { + $str .= $lang['XS_CHECK_FILENAME'] . "
\n"; + return false; + } + else + { + // try to open file + $file = @fopen($filename, 'w'); + if(!$file) + { + $str .= sprintf($lang['XS_CHECK_OPENFILE1'], $filename) . "
\n"; + // try to create directories + $dir = substr($filename, strlen($template->cachedir), strlen($filename)); + $dirs = explode('/', $dir); + $path = $template->cachedir; + @umask(0); + if(!@is_dir($path)) + { + $str .= sprintf($lang['XS_CHECK_NODIR'], $path) . "
\n"; + if(!@mkdir($path)) + { + $str .= sprintf($lang['XS_CHECK_NODIR2'], $path) . "
\n"; + return false; + } + else + { + $str .= sprintf($lang['XS_CHECK_CREATEDDIR'], $path) . "
\n"; + @chmod($path, 0777); + } + } + else + { + $str .= sprintf($lang['XS_CHECK_DIR'] , $path) . "
\n"; + } + if(count($dirs) > 0) + for($i=0; $i0) + { + $path .= '/'; + } + $path .= $dirs[$i]; + if(!@is_dir($path)) + { + $str .= sprintf($lang['XS_CHECK_NODIR'], $path) . "
\n"; + if(!@mkdir($path)) + { + $str .= sprintf($lang['XS_CHECK_NODIR2'], $path) . "
\n"; + return false; + } + else + { + $str .= sprintf($lang['XS_CHECK_CREATEDDIR'], $path) . "
\n"; + @chmod($path, 0777); + } + } + else + { + $str .= sprintf($lang['XS_CHECK_DIR'] , $path) . "
\n"; + } + } + // try to open file again after directories were created + $file = @fopen($filename, 'w'); + } + if(!$file) + { + $str .= sprintf($lang['XS_CHECK_OPENFILE2'], $filename) . "
\n"; + return false; + } + $str .= sprintf($lang['XS_CHECK_OK'], $filename) . "
\n"; + fputs($file, ' '); + fclose($file); + @chmod($filename, 0777); + return true; + } +} + +// show error and exit +function xs_error($error, $line = 0, $file = '') +{ + global $template, $lang; + if($line || $file) + { + $error = basename($file) . '(' . $line . '): ' . $error; + } + $template->set_filenames(array('errormsg' => XS_TPL_PATH . 'message.tpl')); + $template->assign_vars(array( + 'MESSAGE_TITLE' => $lang['ERROR'], + 'MESSAGE_TEXT' => $error + )); + $template->pparse('errormsg'); + xs_exit(); +} + +// show message and exit +function xs_message($title, $message) +{ + global $template; + $template->set_filenames(array('msg' => XS_TPL_PATH . 'message.tpl')); + $template->assign_vars(array( + 'MESSAGE_TITLE' => $title, + 'MESSAGE_TEXT' => $message + )); + $template->pparse('msg'); + xs_exit(); +} + +// strip slashes for sql +function xs_sql($sql, $strip = false) +{ + if($strip) + { + $sql = stripslashes($sql); + } + return str_replace('\\\'', '\'\'', addslashes($sql)); +} + +// clean template name +function xs_tpl_name($name) +{ + return str_replace(array('\\', '/', "'", '"'), array('','','',''), $name); +} + +// close database and maybe do some other stuff +function xs_exit() +{ + require(PAGE_FOOTER); +} + +// check directory name/filename +function xs_fix_dir($dir) +{ + $dir = str_replace('\\', '/', $dir); + $dir = str_replace('../', './', $dir); + while(strlen($dir > 1) && substr($dir, strlen($dir) - 2) === '..') + { + $dir = substr($dir, 0, strlen($dir) - 1); + } + return $dir; +} \ No newline at end of file diff --git a/upload/admin/xs_index.php b/upload/admin/xs_index.php new file mode 100644 index 000000000..67ea449b9 --- /dev/null +++ b/upload/admin/xs_index.php @@ -0,0 +1,61 @@ +xs_version) || $template->xs_version !== 8) +{ + message_die(GENERAL_ERROR, isset($lang['XS_ERROR_NOT_INSTALLED']) ? $lang['XS_ERROR_NOT_INSTALLED'] : 'eXtreme Styles mod is not installed. You forgot to upload includes/template.php'); +} + +define('IN_XS', true); +include('xs_include.php'); + +if(isset($_GET['showwarning'])) +{ + $msg = str_replace('{URL}', append_sid('xs_index.php'), $lang['XS_MAIN_COMMENT3']); + xs_message($lang['INFORMATION'], $msg); +} + +$template->assign_vars(array( + 'U_CONFIG' => append_sid('xs_config.php'), + 'U_DEFAULT_STYLE' => append_sid('xs_styles.php'), + 'U_MANAGE_CACHE' => append_sid('xs_cache.php'), + 'U_IMPORT_STYLES' => append_sid('xs_import.php'), + 'U_EXPORT_STYLES' => append_sid('xs_export.php'), + 'U_CLONE_STYLE' => append_sid('xs_clone.php'), + 'U_DOWNLOAD_STYLES' => append_sid('xs_download.php'), + 'U_INSTALL_STYLES' => append_sid('xs_install.php'), + 'U_UNINSTALL_STYLES' => append_sid('xs_uninstall.php'), + 'U_EDIT_STYLES' => append_sid('xs_edit.php'), + 'U_EDIT_STYLES_DATA' => append_sid('xs_edit_data.php'), + 'U_EXPORT_DATA' => append_sid('xs_export_data.php'), + 'U_UPDATES' => append_sid('xs_update.php'), + )); + +$template->set_filenames(array('body' => XS_TPL_PATH . 'index.tpl')); +$template->pparse('body'); +xs_exit(); \ No newline at end of file diff --git a/upload/ajax.php b/upload/ajax.php new file mode 100644 index 000000000..3beee530d --- /dev/null +++ b/upload/ajax.php @@ -0,0 +1,310 @@ +init(); + +// Handle "board disabled via ON/OFF trigger" +if (file_exists(BB_DISABLED)) +{ + $ajax->ajax_die($bb_cfg['board_disabled_msg']); +} + +// Load actions required modules +switch ($ajax->action) +{ + case 'view_post': + case 'view_message': + require(INC_DIR .'bbcode.php'); + break; + + case 'view_torrent': + case 'mod_action': + case 'change_tor_status': + require(INC_DIR .'functions_torrent.php'); + break; + + case 'change_torrent': + require(BB_ROOT .'attach_mod/attachment_mod.php'); + require(INC_DIR .'functions_torrent.php'); + break; + + case 'user_register': + require(INC_DIR .'functions_validate.php'); + break; +} + +// position in $ajax->valid_actions['xxx'] +define('AJAX_AUTH', 0); // 'guest', 'user', 'mod', 'admin' + +$user->session_start(); +$ajax->exec(); + +// +// Ajax +// +class ajax_common +{ + var $request = array(); + var $response = array(); + + var $valid_actions = array( + // ACTION NAME AJAX_AUTH + 'edit_user_profile' => array('admin'), + + 'change_torrent' => array('mod'), + 'change_tor_status' => array('mod'), + 'mod_action' => array('mod'), + + 'view_post' => array('guest'), + 'view_message' => array('guest'), + 'view_torrent' => array('guest'), + 'user_register' => array('guest'), + ); + + var $action = null; + + /** + * Constructor + */ + function ajax_common () + { + ob_start(array(&$this, 'ob_handler')); + header('Content-Type: text/plain'); + } + + /** + * Perform action + */ + function exec () + { + global $lang; + + // Exit if we already have errors + if (!empty($this->response['error_code'])) + { + $this->send(); + } + + // Check that requested action is valid + $action = $this->action; + + if (!$action || !is_string($action)) + { + $this->ajax_die('no action specified'); + } + else if (!$action_params =& $this->valid_actions[$action]) + { + $this->ajax_die('invalid action: '. $action); + } + + // Auth check + switch ($action_params[AJAX_AUTH]) + { + // GUEST + case 'guest': + break; + + // USER + case 'user': + if (IS_GUEST) + { + $this->ajax_die($lang['NEED_TO_LOGIN_FIRST']); + } + break; + + // MOD + case 'mod': + if (!(IS_MOD || IS_ADMIN)) + { + $this->ajax_die($lang['ONLY_FOR_MOD']); + } + $this->check_admin_session(); + break; + + // ADMIN + case 'admin': + if (!IS_ADMIN) + { + $this->ajax_die($lang['ONLY_FOR_ADMIN']); + } + $this->check_admin_session(); + break; + + default: + trigger_error("invalid auth type for $action", E_USER_ERROR); + } + + // Run action + $this->$action(); + + // Send output + $this->send(); + } + + /** + * Exit on error + */ + function ajax_die ($error_msg, $error_code = E_AJAX_GENERAL_ERROR) + { + $this->response['error_code'] = $error_code; + $this->response['error_msg'] = $error_msg; + + $this->send(); + } + + /** + * Initialization + */ + function init () + { + $this->request = $_POST; + + $this->action =& $this->request['action']; + } + + /** + * Send data + */ + function send () + { + $this->response['action'] = $this->action; + + if (DBG_USER && SQL_DEBUG && !empty($_COOKIE['sql_log'])) + { + $this->response['sql_log'] = get_sql_log(); + } + + // sending output will be handled by $this->ob_handler() + exit(); + } + + /** + * OB Handler + */ + function ob_handler ($contents) + { + if (DBG_USER) + { + if ($contents) + { + $this->response['raw_output'] = $contents; + } + } + + + $response_js = bb_json_encode($this->response); + + if (GZIP_OUTPUT_ALLOWED && !defined('NO_GZIP')) + { + if (UA_GZIP_SUPPORTED && strlen($response_js) > 2000) + { + header('Content-Encoding: gzip'); + $response_js = gzencode($response_js, 1); + } + } + + return $response_js; + } + + /** + * Admin session + */ + function check_admin_session () + { + global $user; + + if (!$user->data['session_admin']) + { + if (empty($this->request['user_password'])) + { + $this->prompt_for_password(); + } + else + { + $login_args = array( + 'login_username' => $user->data['username'], + 'login_password' => $_POST['user_password'], + ); + if (!$user->login($login_args, true)) + { + $this->ajax_die('Wrong password'); + } + } + } + } + + /** + * Prompt for password + */ + function prompt_for_password () + { + $this->response['prompt_password'] = 1; + $this->send(); + } + + /** + * Verify mod rights + */ + function verify_mod_rights ($forum_id) + { + global $userdata, $lang; + + $is_auth = auth(AUTH_MOD, $forum_id, $userdata); + + if (!$is_auth['auth_mod']) + { + $this->ajax_die($lang['ONLY_FOR_MOD']); + } + } + + function edit_user_profile () + { + require(AJAX_DIR .'edit_user_profile.php'); + } + + function view_post () + { + require(AJAX_DIR .'view_post.php'); + } + + function view_message () + { + global $lang; + + $message = (string) $this->request['message']; + if(!trim($message)) $this->ajax_die($lang['EMPTY_MESSAGE']); + $message = bbcode2html(DB()->escape($message)); + $message = str_replace('\n', '
', $message); + $this->response['html'] = $message; + } + + function change_tor_status () + { + require(AJAX_DIR .'change_tor_status.php'); + } + + function change_torrent () + { + require(AJAX_DIR .'change_torrent.php'); + } + + function view_torrent () + { + require(AJAX_DIR .'view_torrent.php'); + } + + function user_register() + { + require(AJAX_DIR .'user_register.php'); + } + + function mod_action() + { + require(AJAX_DIR .'mod_action.php'); + } + +} diff --git a/upload/ajax/change_tor_status.php b/upload/ajax/change_tor_status.php new file mode 100644 index 000000000..e0d5f9057 --- /dev/null +++ b/upload/ajax/change_tor_status.php @@ -0,0 +1,77 @@ +request['attach_id'])) +{ + $this->ajax_die('empty attach_id'); +} +if (!isset($this->request['status'])) +{ + $this->ajax_die('empty tor_status'); +} +$attach_id = (int) $this->request['attach_id']; +$new_status = (int) $this->request['status']; + +// Валидность статуса +if (!isset($lang['tor_status'][$new_status])) +{ + $this->ajax_die("Такого статуса не существует: $new_status"); +} + +$tor = DB()->fetch_row(" + SELECT + tor.forum_id, tor.topic_id, tor.tor_status, tor.checked_time, tor.checked_user_id, f.cat_id + FROM ". BB_BT_TORRENTS ." tor + INNER JOIN ". BB_FORUMS ." f ON(f.forum_id = tor.forum_id) + WHERE tor.attach_id = $attach_id + LIMIT 1 +"); +if (!$tor) $this->ajax_die('torrent not found'); + +// Тот же статус +if ($tor['tor_status'] == $new_status) +{ + $this->ajax_die('Раздача имеет тот же статус'); +} +// Запрет на изменение/присвоение CH-статуса модератором +if ($new_status == TOR_CLOSED_CPHOLD && !(IS_ADMIN || IS_CP_HOLDER)) +{ + $this->ajax_die('Изменение статуса невозможно'); +} + +// Права на изменение статуса +if ($tor['tor_status'] == TOR_CLOSED_CPHOLD) +{ + if (!(IS_ADMIN || IS_CP_HOLDER)) + { + $this->verify_mod_rights($tor['forum_id']); + } + DB()->query("UPDATE ". BB_TOPICS ." SET topic_status = ". TOPIC_UNLOCKED ." WHERE topic_id = {$tor['topic_id']} LIMIT 1"); + $new_status = TOR_NOT_APPROVED; +} +else +{ + $this->verify_mod_rights($tor['forum_id']); +} + +// Подтверждение изменения статуса, выставленного другим модератором +if ($tor['tor_status'] != TOR_NOT_APPROVED && $tor['checked_user_id'] != $userdata['user_id'] && $tor['checked_time'] + 2*3600 > TIMENOW) +{ + if (empty($this->request['confirmed'])) + { + $msg = "Раздача имеет статус: {$lang['tor_status'][$tor['tor_status']]}\n\n"; + $msg .= ($username = get_username($tor['checked_user_id'])) ? "Статус изменен: ". html_entity_decode($username) .", ". delta_time($tor['checked_time']) ." назад\n\n" : ""; + $msg .= "Продолжить?"; + $this->prompt_for_confirm($msg); + } +} + +change_tor_status($attach_id, $new_status); + +$this->response['attach_id'] = $attach_id; +$this->response['status'] = $bb_cfg['tor_icons'][$new_status] .' '. $lang['tor_status'][$new_status]; \ No newline at end of file diff --git a/upload/ajax/change_torrent.php b/upload/ajax/change_torrent.php new file mode 100644 index 000000000..1dc9623b9 --- /dev/null +++ b/upload/ajax/change_torrent.php @@ -0,0 +1,87 @@ +request['attach_id'])) +{ + $this->ajax_die('empty attach_id'); +} +if (!isset($this->request['type'])) +{ + $this->ajax_die('type'); +} +$attach_id = (int) $this->request['attach_id']; +$type = (string) $this->request['type']; + +$torrent = DB()->fetch_row(" + SELECT + a.post_id, d.physical_filename, d.extension, d.tracker_status, + t.topic_first_post_id, + p.poster_id, p.topic_id, p.forum_id, + f.allow_reg_tracker + FROM + ". BB_ATTACHMENTS ." a, + ". BB_ATTACHMENTS_DESC ." d, + ". BB_POSTS ." p, + ". BB_TOPICS ." t, + ". BB_FORUMS ." f + WHERE + a.attach_id = $attach_id + AND d.attach_id = $attach_id + AND p.post_id = a.post_id + AND t.topic_id = p.topic_id + AND f.forum_id = p.forum_id + LIMIT 1 + "); + +if (!$torrent) $this->ajax_die('Invalid attach_id'); +$title = $url = ''; +switch($type) +{ case 'set_gold'; + case 'set_silver'; + case 'unset_silver_gold'; + if ($type == 'set_silver') + { + $tor_type = TOR_TYPE_SILVER; + } + elseif ($type == 'set_gold') + { + $tor_type = TOR_TYPE_GOLD; + } + else + { + $tor_type = 0; + } + change_tor_type($attach_id, $tor_type); + $title = 'Тип торрента изменён'; + $url = make_url(TOPIC_URL . $torrent['topic_id']); + break; + + case 'reg'; + tracker_register($attach_id); + $url = (TOPIC_URL . $torrent['topic_id']); + break; + + case 'unreg'; + tracker_unregister($attach_id); + $url = (TOPIC_URL . $torrent['topic_id']); + break; + + case 'del_torrent'; + delete_torrent($attach_id); + $url = make_url(TOPIC_URL . $torrent['topic_id']); + break; + + case 'del_torrent_move_topic'; + delete_torrent($attach_id); + $url = make_url("modcp.php?t={$torrent['topic_id']}&mode=move&sid={$userdata['session_id']}"); + break; } + + + +$this->response['url'] = $url; +$this->response['title'] = $title; \ No newline at end of file diff --git a/upload/ajax/edit_user_profile.php b/upload/ajax/edit_user_profile.php new file mode 100644 index 000000000..a04d126e9 --- /dev/null +++ b/upload/ajax/edit_user_profile.php @@ -0,0 +1,76 @@ +request['user_id']) OR !$profiledata = get_userdata($user_id)) +{ + $this->ajax_die('invalid user_id'); +} +if (!$field = (string) $this->request['field']) +{ + $this->ajax_die('invalid profile field'); +} + +$table = BB_USERS; +$value = (string) $this->request['value']; + +switch ($field) +{ + case 'user_regdate': + case 'user_lastvisit': + $tz = TIMENOW + (3600 * $bb_cfg['board_timezone']); + if (($value = strtotime($value, $tz)) < $bb_cfg['board_startdate'] OR $value > TIMENOW) + { + $this->ajax_die('invalid date: '. $this->request['value']); + } + $this->response['new_value'] = bb_date($value); + break; + + case 'ignore_srv_load': + $value = ($this->request['value']) ? 0 : 1; + $this->response['new_value'] = ($profiledata['user_level'] != USER || $value) ? $lang['NO'] : $lang['YES']; + break; + + case 'u_up_total': + case 'u_down_total': + case 'u_up_release': + case 'u_up_bonus': + if (!IS_SUPER_ADMIN) + { + $this->ajax_die($lang['ONLY_FOR_SUPER_ADMIN']); + } + + $table = BB_BT_USERS; + $value = (float) str_replace(',', '.', $this->request['value']); + + foreach (array('KB'=>1,'MB'=>2,'GB'=>3,'TB'=>4) as $s => $m) + { + if (strpos($this->request['value'], $s) !== false) + { + $value *= pow(1024, $m); + break; + } + } + $value = sprintf('%.0f', $value); + $this->response['new_value'] = humn_size($value, null, null, ' '); + + if (!$btu = get_bt_userdata($user_id)) + { + require(INC_DIR .'functions_torrent.php'); + generate_passkey($user_id, true); + $btu = get_bt_userdata($user_id); + } + $btu[$field] = $value; + $this->response['update_ids']['u_ratio'] = (string) get_bt_ratio($btu); + break; + + default: + $this->ajax_die("invalid profile field: $field"); +} + +$value_sql = DB()->escape($value, true); +DB()->query("UPDATE $table SET $field = $value_sql WHERE user_id = $user_id LIMIT 1"); + +$this->response['edit_id'] = $this->request['edit_id']; \ No newline at end of file diff --git a/upload/ajax/html/jumpbox_guest.html b/upload/ajax/html/jumpbox_guest.html new file mode 100644 index 000000000..2050de135 --- /dev/null +++ b/upload/ajax/html/jumpbox_guest.html @@ -0,0 +1,9 @@ + + diff --git a/upload/ajax/html/jumpbox_user.html b/upload/ajax/html/jumpbox_user.html new file mode 100644 index 000000000..2050de135 --- /dev/null +++ b/upload/ajax/html/jumpbox_user.html @@ -0,0 +1,9 @@ + + diff --git a/upload/ajax/mod_action.php b/upload/ajax/mod_action.php new file mode 100644 index 000000000..4048d5fab --- /dev/null +++ b/upload/ajax/mod_action.php @@ -0,0 +1,54 @@ +request['mode']; + +switch ($mode) +{ + case 'tor_status': + $topics = (string) $this->request['topic_ids']; + $status = (int) $this->request['status']; + + // Валидность статуса + if (!isset($lang['tor_status'][$status])) + { + $this->ajax_die("Такого статуса не существует: $new_status"); + } + + $topic_ids = DB()->fetch_rowset("SELECT attach_id FROM ". BB_BT_TORRENTS ." WHERE topic_id IN($topics)", 'attach_id'); + + foreach($topic_ids as $attach_id) + { + change_tor_status($attach_id, $status); + } + $this->response['status'] = $bb_cfg['tor_icons'][$status]; + $this->response['topics'] = explode(',', $topics); + break; + + case 'edit_topic_title': + $topic_id = (int) $this->request['topic_id']; + $topic_title = (string) $this->request['topic_title']; + $new_title = clean_topic_title($topic_title); + + if (!$topic_id) $this->ajax_die('invalid topic_id (empty)'); + if ($new_title == '') $this->ajax_die('Вы должны указать заголовок сообщения'); + + if (!$t_data = DB()->fetch_row("SELECT forum_id FROM ". BB_TOPICS ." WHERE topic_id = $topic_id LIMIT 1")) + { + $this->ajax_die('invalid topic_id (not found in db)'); + } + $this->verify_mod_rights($t_data['forum_id']); + + $topic_title_sql = DB()->escape($new_title); + + DB()->query("UPDATE ". BB_TOPICS ." SET topic_title = '$topic_title_sql' WHERE topic_id = $topic_id LIMIT 1"); + + $this->response['topic_id'] = $topic_id; + $this->response['topic_title'] = $new_title; + break; +} diff --git a/upload/ajax/user_register.php b/upload/ajax/user_register.php new file mode 100644 index 000000000..17c84ad2d --- /dev/null +++ b/upload/ajax/user_register.php @@ -0,0 +1,58 @@ +request['mode']; + +$html = ''; +switch($mode) +{ + case 'check_name': + $username = clean_username($this->request['username']); + + if (empty($username)) + { + $html = ' Вы должны выбрать имя'; + } + else if($err = validate_username($username)) + { + $html = ' '. $err .''; + } + break; + case 'check_email': + $email = (string) $this->request['email']; + + if (empty($email)) + { + $html = ' Вы должны указать e-mail'; + } + else if($err = validate_email($email)) + { + $html = ' '. $err .''; + } + break; + case 'check_pass': + $pass = (string) $this->request['pass']; + $pass_confirm = (string) $this->request['pass_confirm']; + if (empty($pass) || empty($pass_confirm)) + { + $html = ' Поля для ввода пароля не должны быть пустыми!'; + } + else + { + if ($pass != $pass_confirm) + { + $html = ' Введённые пароли не совпадают'; + } + else + { + $html = ' Пароли совпадают, можете продолжить регистрацию.'; + } + } + break; +} + +$this->response['html'] = $html; +$this->response['mode'] = $mode; \ No newline at end of file diff --git a/upload/ajax/view_post.php b/upload/ajax/view_post.php new file mode 100644 index 000000000..7e4ff07bc --- /dev/null +++ b/upload/ajax/view_post.php @@ -0,0 +1,54 @@ +request['post_id']; +$topic_id = (int) @$this->request['topic_id']; + +if (!$post_id) +{ + $post_id = DB()->fetch_row("SELECT topic_first_post_id FROM ". BB_TOPICS ." WHERE topic_id = $topic_id", 'topic_first_post_id'); +} + +$sql = " + SELECT + p.*, + h.post_html, IF(h.post_html IS NULL, pt.post_text, NULL) AS post_text, + pt.post_subject, pt.bbcode_uid, + f.auth_read + FROM ". BB_POSTS ." p + INNER JOIN ". BB_POSTS_TEXT ." pt ON(pt.post_id = p.post_id) + LEFT JOIN ". BB_POSTS_HTML ." h ON(h.post_id = pt.post_id) + INNER JOIN ". BB_FORUMS ." f ON(f.forum_id = p.forum_id) + WHERE + p.post_id = $post_id + LIMIT 1 +"; + +if (!$post_data = DB()->fetch_row($sql)) +{ + $this->ajax_die($lang['TOPIC_POST_NOT_EXIST']); +} + +// Auth check +if ($post_data['auth_read'] == AUTH_REG) +{ + if (IS_GUEST) + { + $this->ajax_die($lang['NEED_TO_LOGIN_FIRST']); + } +} +else if ($post_data['auth_read'] != AUTH_ALL) +{ + $is_auth = auth(AUTH_READ, $post_data['forum_id'], $user->data, $post_data); + if (!$is_auth['auth_read']) + { + $this->ajax_die($lang['TOPIC_POST_NOT_EXIST']); + } +} + +$this->response['post_id'] = $post_id; +$this->response['topic_id'] = $topic_id; +$this->response['post_html'] = get_parsed_post($post_data); \ No newline at end of file diff --git a/upload/ajax/view_torrent.php b/upload/ajax/view_torrent.php new file mode 100644 index 000000000..60a68317c --- /dev/null +++ b/upload/ajax/view_torrent.php @@ -0,0 +1,170 @@ +request['attach_id'])) +{ + $this->ajax_die('empty attach_id'); +} +$attach_id = (int) $this->request['attach_id']; + +$torrent = DB()->fetch_row("SELECT at.attach_id, at.physical_filename + FROM ". BB_ATTACHMENTS_DESC ." at + WHERE at.attach_id = $attach_id + LIMIT 1"); +if(!$torrent) $this->ajax_die('empty attach_id'); +$filename = get_attachments_dir() .'/'. $torrent['physical_filename']; + +if (($file_contents = @file_get_contents($filename)) === false) +{ + if(IS_AM) + { + $this->ajax_die('torrent not found on disk: '. htmlCHR($filename)); + } + else + { + $this->ajax_die('файл временно не доступен'); + } + +} + +// Построение списка +$tor_filelist = build_tor_filelist($file_contents); + +function build_tor_filelist ($file_contents) +{ + if (!$tor = bdecode($file_contents)) + { + return 'invalid torrent file'; + } + + $torrent = new torrent($tor); + + return $torrent->get_filelist(); +} + +class torrent +{ + var $tor_decoded = array(); + var $files_ary = array('/' => ''); + var $multiple = null; + var $root_dir = ''; + var $files_html = ''; + + function torrent ($decoded_file_contents) + { + $this->tor_decoded = $decoded_file_contents; + } + + function get_filelist () + { + $this->build_filelist_array(); + + if ($this->multiple) + { + if ($this->files_ary['/'] !== '') + { + $this->files_ary = array_merge($this->files_ary, $this->files_ary['/']); + unset($this->files_ary['/']); + } + $filelist = $this->build_filelist_html(); + return "
{$this->root_dir}
$filelist"; + } + else + { + return join('', $this->files_ary['/']); + } + } + + function build_filelist_array () + { + $info = $this->tor_decoded['info']; + + if (isset($info['name.utf-8'])) + { + $info['name'] =& $info['name.utf-8']; + } + + if (isset($info['files']) && is_array($info['files'])) + { + $this->root_dir = isset($info['name']) ? '../'. clean_tor_dirname($info['name']) : '...'; + $this->multiple = true; + + foreach ($info['files'] as $f) + { + if (isset($f['path.utf-8'])) + { + $f['path'] =& $f['path.utf-8']; + } + if (!isset($f['path']) || !is_array($f['path'])) + { + continue; + } + array_deep($f['path'], 'clean_tor_dirname'); + + $length = isset($f['length']) ? (int) $f['length'] : 0; + $subdir_count = count($f['path']) - 1; + + if ($subdir_count > 0) + { + $name = array_pop($f['path']); + $cur_files_ary =& $this->files_ary; + + for ($i=0,$j=1; $i < $subdir_count; $i++,$j++) + { + $subdir = $f['path'][$i]; + + if (!isset($cur_files_ary[$subdir])) + { + $cur_files_ary[$subdir] = array(); + } + $cur_files_ary =& $cur_files_ary[$subdir]; + + if ($j == $subdir_count) + { + if (is_string($cur_files_ary)) + { + $this->ajax_die('Error: cannot build filelist [string]'); + } + $cur_files_ary[] = $this->build_file_item($name, $length); + } + } + } + else + { + $name = $f['path'][0]; + $this->files_ary['/'][] = $this->build_file_item($name, $length); + } + } + } + else + { + $this->multiple = false; + $name = isset($info['name']) ? clean_tor_dirname($info['name']) : ''; + $length = isset($info['length']) ? (int) $info['length'] : 0; + + $this->files_ary['/'][] = $this->build_file_item($name, $length); + } + } + + function build_file_item ($name, $length) + { + return "$name $length"; + } + + function build_filelist_html () + { + global $html; + return $html->array2html($this->files_ary); + } +} + +function clean_tor_dirname ($dirname) +{ + return str_replace(array('[', ']', '<', '>', "'"), array('[', ']', '<', '>', '''), $dirname); +} + +$this->response['html'] = $tor_filelist; + diff --git a/upload/attach_mod/.htaccess b/upload/attach_mod/.htaccess new file mode 100644 index 000000000..baa56e5a3 --- /dev/null +++ b/upload/attach_mod/.htaccess @@ -0,0 +1,2 @@ +order allow,deny +deny from all \ No newline at end of file diff --git a/upload/attach_mod/attachment_mod.php b/upload/attach_mod/attachment_mod.php new file mode 100644 index 000000000..d68b19806 --- /dev/null +++ b/upload/attach_mod/attachment_mod.php @@ -0,0 +1,115 @@ +sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query attachment information', '', __LINE__, __FILE__, $sql); + } + + while ($row = DB()->sql_fetchrow($result)) + { + $attach_config[$row['config_name']] = trim($row['config_value']); + } + + // We assign the original default board language here, because it gets overwritten later with the users default language + $attach_config['board_lang'] = trim($bb_cfg['default_lang']); + + return $attach_config; +} + +// Get Attachment Config +$attach_config = array(); + +if (!($attach_config = CACHE('bb_cache')->get('attach_config'))) +{ + $attach_config = get_config(); + CACHE('bb_cache')->set('attach_config', $attach_config, 86400); +} + +// Please do not change the include-order, it is valuable for proper execution. +// Functions for displaying Attachment Things +include(BB_ROOT .'attach_mod/displaying.php'); +// Posting Attachments Class (HAVE TO BE BEFORE PM) +include(BB_ROOT .'attach_mod/posting_attachments.php'); + +if (!intval($attach_config['allow_ftp_upload'])) +{ + $upload_dir = $attach_config['upload_dir']; +} +else +{ + $upload_dir = $attach_config['download_path']; +} \ No newline at end of file diff --git a/upload/attach_mod/displaying.php b/upload/attach_mod/displaying.php new file mode 100644 index 000000000..4b26d4111 --- /dev/null +++ b/upload/attach_mod/displaying.php @@ -0,0 +1,490 @@ +update('attach_extensions'); //get_extension_informations() + $extension_informations = get_extension_informations(); + } + $allowed_extensions = array(); + + for ($i = 0, $size = sizeof($extension_informations); $i < $size; $i++) + { + $extension = strtolower(trim($extension_informations[$i]['extension'])); + $allowed_extensions[] = $extension; + $display_categories[$extension] = intval($extension_informations[$i]['cat_id']); + $download_modes[$extension] = intval($extension_informations[$i]['download_mode']); + $upload_icons[$extension] = trim($extension_informations[$i]['upload_icon']); + } +} + +/** +* Writing Data into plain Template Vars +*/ +function init_display_template($template_var, $replacement, $filename = 'viewtopic_attach.tpl') +{ + global $template; + + // This function is adapted from the old template class + // I wish i had the functions from the 3.x one. :D (This class rocks, can't await to use it in Mods) + + // Handle Attachment Informations + if (!isset($template->uncompiled_code[$template_var]) && empty($template->uncompiled_code[$template_var])) + { + // If we don't have a file assigned to this handle, die. + if (!isset($template->files[$template_var])) + { + die("Template->loadfile(): No file specified for handle $template_var"); + } + + $filename_2 = $template->files[$template_var]; + + $str = implode('', @file($filename_2)); + if (empty($str)) + { + die("Template->loadfile(): File $filename_2 for handle $template_var is empty"); + } + + $template->uncompiled_code[$template_var] = $str; + } + + $complete_filename = $filename; + if (substr($complete_filename, 0, 1) != '/') + { + $complete_filename = $template->root . '/' . $complete_filename; + } + + if (!file_exists($complete_filename)) + { + die("Template->make_filename(): Error - file $complete_filename does not exist"); + } + + $content = implode('', file($complete_filename)); + if (empty($content)) + { + die('Template->loadfile(): File ' . $complete_filename . ' is empty'); + } + + // replace $replacement with uncompiled code in $filename + $template->uncompiled_code[$template_var] = str_replace($replacement, $content, $template->uncompiled_code[$template_var]); +} + +/** +* Display Attachments in Posts +*/ +function display_post_attachments($post_id, $switch_attachment) +{ + global $attach_config, $is_auth; + + if (intval($switch_attachment) == 0 || intval($attach_config['disable_mod'])) + { + return; + } + + if ($is_auth['auth_download'] && $is_auth['auth_view']) + { + display_attachments($post_id); + } + else + { + // Display Notice (attachment there but not having permissions to view it) + // Not included because this would mean template and language file changes (at this stage this is not a wise step. ;)) + } +} + +/** +* Initializes some templating variables for displaying Attachments in Posts +*/ +function init_display_post_attachments($switch_attachment) +{ + global $attach_config, $is_auth, $template, $lang, $postrow, $total_posts, $attachments, $forum_row, $t_data; + + if (empty($t_data) && !empty($forum_row)) + { + $switch_attachment = $forum_row['topic_attachment']; + } + + if (intval($switch_attachment) == 0 || intval($attach_config['disable_mod']) || (!($is_auth['auth_download'] && $is_auth['auth_view']))) + { + init_display_template('body', '{postrow.ATTACHMENTS}', 'viewtopic_attach_guest.tpl'); + return; + } + + $post_id_array = array(); + + for ($i = 0; $i < $total_posts; $i++) + { + if ($postrow[$i]['post_attachment'] == 1) + { + $post_id_array[] = (int) $postrow[$i]['post_id']; + } + } + + if (sizeof($post_id_array) == 0) + { + return; + } + + $rows = get_attachments_from_post($post_id_array); + $num_rows = sizeof($rows); + + if ($num_rows == 0) + { + return; + } + + @reset($attachments); + + for ($i = 0; $i < $num_rows; $i++) + { + $attachments['_' . $rows[$i]['post_id']][] = $rows[$i]; + //bt + if ($rows[$i]['tracker_status']) + { + if (defined('TORRENT_POST')) + { + message_die(GENERAL_ERROR, 'Multiple registered torrents in one topic

first torrent found in post_id = '. TORRENT_POST .'
current post_id = '. $rows[$i]['post_id'] .'

attachments info:
'. print_r($rows, TRUE) .'
'); + } + define('TORRENT_POST', $rows[$i]['post_id']); + } + //bt end + } + + init_display_template('body', '{postrow.ATTACHMENTS}'); + + init_complete_extensions_data(); + + $template->assign_vars(array( + 'L_POSTED_ATTACHMENTS' => $lang['POSTED_ATTACHMENTS'], + 'L_KILOBYTE' => $lang['KB']) + ); +} + +/** +* END ATTACHMENT DISPLAY IN POSTS +*/ + +/** +* Assign Variables and Definitions based on the fetched Attachments - internal +* used by all displaying functions, the Data was collected before, it's only dependend on the template used. :) +* before this function is usable, init_display_attachments have to be called for specific pages (pm, posting, review etc...) +*/ +function display_attachments($post_id) +{ + global $template, $upload_dir, $userdata, $allowed_extensions, $display_categories, $download_modes, $lang, $attachments, $upload_icons, $attach_config; + + $num_attachments = @sizeof($attachments['_' . $post_id]); + + if ($num_attachments == 0) + { + return; + } + + $template->assign_block_vars('postrow.attach', array()); + + for ($i = 0; $i < $num_attachments; $i++) + { + // Some basic things... + $filename = $upload_dir . '/' . basename($attachments['_' . $post_id][$i]['physical_filename']); + $thumbnail_filename = $upload_dir . '/' . THUMB_DIR . '/t_' . basename($attachments['_' . $post_id][$i]['physical_filename']); + + $upload_image = ''; + + if ($attach_config['upload_img'] && empty($upload_icons[$attachments['_' . $post_id][$i]['extension']])) + { + $upload_image = ''; + } + else if (trim($upload_icons[$attachments['_' . $post_id][$i]['extension']]) != '') + { + $upload_image = ''; + } + + $filesize = $attachments['_' . $post_id][$i]['filesize']; + $size_lang = ($filesize >= 1048576) ? $lang['MB'] : ( ($filesize >= 1024) ? $lang['KB'] : $lang['BYTES'] ); + if ($filesize >= 1048576) + { + $filesize = (round((round($filesize / 1048576 * 100) / 100), 2)); + } + else if ($filesize >= 1024) + { + $filesize = (round((round($filesize / 1024 * 100) / 100), 2)); + } + + $display_name = htmlspecialchars($attachments['_' . $post_id][$i]['real_filename']); + $comment = htmlspecialchars($attachments['_' . $post_id][$i]['comment']); + $comment = str_replace("\n", '
', $comment); + + $denied = false; + + // Admin is allowed to view forbidden Attachments, but the error-message is displayed too to inform the Admin + if (!in_array($attachments['_' . $post_id][$i]['extension'], $allowed_extensions)) + { + $denied = true; + + $template->assign_block_vars('postrow.attach.denyrow', array( + 'L_DENIED' => sprintf($lang['EXTENSION_DISABLED_AFTER_POSTING'], $attachments['_' . $post_id][$i]['extension'])) + ); + } + + if (!$denied || IS_ADMIN) + { + // Some basic Template Vars + $template->assign_vars(array( + 'L_DESCRIPTION' => $lang['DESCRIPTION'], + 'L_DOWNLOAD' => $lang['DOWNLOAD'], + 'L_FILENAME' => $lang['FILE_NAME'], + 'L_FILESIZE' => $lang['FILESIZE']) + ); + + // define category + $image = FALSE; + $stream = FALSE; + $swf = FALSE; + $thumbnail = FALSE; + $link = FALSE; + + if (@intval($display_categories[$attachments['_' . $post_id][$i]['extension']]) == STREAM_CAT) + { + $stream = TRUE; + } + else if (@intval($display_categories[$attachments['_' . $post_id][$i]['extension']]) == SWF_CAT) + { + $swf = TRUE; + } + else if (@intval($display_categories[$attachments['_' . $post_id][$i]['extension']]) == IMAGE_CAT && intval($attach_config['img_display_inlined'])) + { + if (intval($attach_config['img_link_width']) != 0 || intval($attach_config['img_link_height']) != 0) + { + list($width, $height) = image_getdimension($filename); + + if ($width == 0 && $height == 0) + { + $image = TRUE; + } + else + { + if ($width <= intval($attach_config['img_link_width']) && $height <= intval($attach_config['img_link_height'])) + { + $image = TRUE; + } + } + } + else + { + $image = TRUE; + } + } + + if (@intval($display_categories[$attachments['_' . $post_id][$i]['extension']]) == IMAGE_CAT && $attachments['_' . $post_id][$i]['thumbnail'] == 1) + { + $thumbnail = TRUE; + $image = FALSE; + } + + if (!$image && !$stream && !$swf && !$thumbnail) + { + $link = TRUE; + } + + if ($image) + { + // Images + // NOTE: If you want to use the download.php everytime an image is displayed inlined, replace the + // Section between BEGIN and END with (Without the // of course): + // $img_source = append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id']); + // $download_link = TRUE; + // + // + if (intval($attach_config['allow_ftp_upload']) && trim($attach_config['download_path']) == '') + { + $img_source = append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id']); + $download_link = TRUE; + } + else + { + // Check if we can reach the file or if it is stored outside of the webroot + if ($attach_config['upload_dir'][0] == '/' || ( $attach_config['upload_dir'][0] != '/' && $attach_config['upload_dir'][1] == ':')) + { + $img_source = append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id']); + $download_link = TRUE; + } + else + { + // BEGIN + $img_source = $filename; + $download_link = FALSE; + // END + } + } + + $template->assign_block_vars('postrow.attach.cat_images', array( + 'DOWNLOAD_NAME' => $display_name, + 'S_UPLOAD_IMAGE' => $upload_image, + + 'IMG_SRC' => $img_source, + 'FILESIZE' => $filesize, + 'SIZE_VAR' => $size_lang, + 'COMMENT' => $comment, + )); + + // Directly Viewed Image ... update the download count + if (!$download_link) + { + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . ' + SET download_count = download_count + 1 + WHERE attach_id = ' . (int) $attachments['_' . $post_id][$i]['attach_id']; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t update attachment download count.', '', __LINE__, __FILE__, $sql); + } + } + } + + if ($thumbnail) + { + // Images, but display Thumbnail + // NOTE: If you want to use the download.php everytime an thumnmail is displayed inlined, replace the + // Section between BEGIN and END with (Without the // of course): + // $thumb_source = append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id'] . '&thumb=1'); + // + if (intval($attach_config['allow_ftp_upload']) && trim($attach_config['download_path']) == '') + { + $thumb_source = append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id'] . '&thumb=1'); + } + else + { + // Check if we can reach the file or if it is stored outside of the webroot + if ($attach_config['upload_dir'][0] == '/' || ( $attach_config['upload_dir'][0] != '/' && $attach_config['upload_dir'][1] == ':')) + { + $thumb_source = append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id'] . '&thumb=1'); + } + else + { + // BEGIN + $thumb_source = $thumbnail_filename; + // END + } + } + + $template->assign_block_vars('postrow.attach.cat_thumb_images', array( + 'DOWNLOAD_NAME' => $display_name, + 'S_UPLOAD_IMAGE' => $upload_image, + + 'IMG_SRC' => append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id']), + 'IMG_THUMB_SRC' => $thumb_source, + 'FILESIZE' => $filesize, + 'SIZE_VAR' => $size_lang, + 'COMMENT' => $comment, + )); + } + + if ($stream) + { + // Streams + $template->assign_block_vars('postrow.attach.cat_stream', array( + 'U_DOWNLOAD_LINK' => $filename, + 'S_UPLOAD_IMAGE' => $upload_image, + + 'DOWNLOAD_NAME' => $display_name, + 'FILESIZE' => $filesize, + 'SIZE_VAR' => $size_lang, + 'COMMENT' => $comment, + 'DOWNLOAD_COUNT' => sprintf($lang['DOWNLOAD_NUMBER'], $attachments['_' . $post_id][$i]['download_count'])) + ); + + // Viewed/Heared File ... update the download count (download.php is not called here) + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . ' + SET download_count = download_count + 1 + WHERE attach_id = ' . (int) $attachments['_' . $post_id][$i]['attach_id']; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t update attachment download count', '', __LINE__, __FILE__, $sql); + } + } + + if ($swf) + { + // Macromedia Flash Files + list($width, $height) = swf_getdimension($filename); + + $template->assign_block_vars('postrow.attach.cat_swf', array( + 'U_DOWNLOAD_LINK' => $filename, + 'S_UPLOAD_IMAGE' => $upload_image, + + 'DOWNLOAD_NAME' => $display_name, + 'FILESIZE' => $filesize, + 'SIZE_VAR' => $size_lang, + 'COMMENT' => $comment, + 'DOWNLOAD_COUNT' => sprintf($lang['DOWNLOAD_NUMBER'], $attachments['_' . $post_id][$i]['download_count']), + 'WIDTH' => $width, + 'HEIGHT' => $height) + ); + + // Viewed/Heared File ... update the download count (download.php is not called here) + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . ' + SET download_count = download_count + 1 + WHERE attach_id = ' . (int) $attachments['_' . $post_id][$i]['attach_id']; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t update attachment download count', '', __LINE__, __FILE__, $sql); + } + } + + //bt + if ($link && ($attachments['_'. $post_id][$i]['extension'] === TORRENT_EXT)) + { + include(BB_ROOT .'attach_mod/displaying_torrent.php'); + } + else if ($link) + //bt end + { + $target_blank = ( (@intval($display_categories[$attachments['_' . $post_id][$i]['extension']]) == IMAGE_CAT) ) ? 'target="_blank"' : ''; + + // display attachment + $template->assign_block_vars('postrow.attach.attachrow', array( + 'U_DOWNLOAD_LINK' => append_sid(BB_ROOT . 'download.php?id=' . $attachments['_' . $post_id][$i]['attach_id']), + 'S_UPLOAD_IMAGE' => $upload_image, + + 'DOWNLOAD_NAME' => $display_name, + 'FILESIZE' => $filesize, + 'SIZE_VAR' => $size_lang, + 'COMMENT' => $comment, + 'TARGET_BLANK' => $target_blank, + + 'DOWNLOAD_COUNT' => sprintf($lang['DOWNLOAD_NUMBER'], $attachments['_' . $post_id][$i]['download_count']), + )); + } + } + } +} \ No newline at end of file diff --git a/upload/attach_mod/displaying_torrent.php b/upload/attach_mod/displaying_torrent.php new file mode 100644 index 000000000..917e58555 --- /dev/null +++ b/upload/attach_mod/displaying_torrent.php @@ -0,0 +1,640 @@ +'; + +$peers_cnt = $seed_count = 0; +$seeders = $leechers = ''; +$tor_info = array(); + +$template->assign_vars(array( + 'SEED_COUNT' => false, + 'LEECH_COUNT' => false, + 'TOR_SPEED_UP' => false, + 'TOR_SPEED_DOWN' => false, + 'SHOW_RATIO_WARN' => false, +)); + +// Define show peers mode (count only || user names with complete % || full details) +$cfg_sp_mode = $bb_cfg['bt_show_peers_mode']; +$get_sp_mode = (isset($_GET['spmode'])) ? $_GET['spmode'] : ''; + +$s_mode = 'count'; + +if ($cfg_sp_mode == SHOW_PEERS_NAMES) +{ + $s_mode = 'names'; +} +else if ($cfg_sp_mode == SHOW_PEERS_FULL) +{ + $s_mode = 'full'; +} + +if ($bb_cfg['bt_allow_spmode_change']) +{ + if ($get_sp_mode == 'names') + { + $s_mode = 'names'; + } + else if ($get_sp_mode == 'full') + { + $s_mode = 'full'; + } +} + +$bt_topic_id = $t_data['topic_id']; +$bt_user_id = $userdata['user_id']; +$attach_id = $attachments['_'. $post_id][$i]['attach_id']; +$tracker_status = $attachments['_'. $post_id][$i]['tracker_status']; +$download_count = $attachments['_'. $post_id][$i]['download_count']; +$tor_file_size = humn_size($attachments['_'. $post_id][$i]['filesize']); +$tor_file_time = bb_date($attachments['_'. $post_id][$i]['filetime']); + +$tor_reged = (bool) $tracker_status; +$show_peers = (bool) $bb_cfg['bt_show_peers']; + +$locked = ($t_data['forum_status'] == FORUM_LOCKED || $t_data['topic_status'] == TOPIC_LOCKED); +$tor_auth = ($bt_user_id != ANONYMOUS && (($bt_user_id == $poster_id && !$locked) || $is_auth['auth_mod'])); + +$tor_auth_reg = ($tor_auth && $t_data['allow_reg_tracker'] && $post_id == $t_data['topic_first_post_id']); +$tor_auth_del = ($tor_auth && $tor_reged); + +$tracker_link = ($tor_reged) ? $lang['BT_REG_YES'] : $lang['BT_REG_NO']; + +$download_link = append_sid("download.php?id=$attach_id"); +$description = ($comment) ? $comment : preg_replace("#.torrent$#i", '', $display_name); + +if ($tor_auth_reg || $tor_auth_del) +{ + $reg_tor_url = ''. $lang['BT_REG_ON_TRACKER'] .''; + $unreg_tor_url = ''. $lang['BT_UNREG_FROM_TRACKER'] .''; + + $tracker_link = ($tor_reged) ? $unreg_tor_url : $reg_tor_url; +} + +if (!$tor_reged) +{ + $template->assign_block_vars('postrow.attach.tor_not_reged', array( + 'DOWNLOAD_NAME' => $display_name, + 'TRACKER_LINK' => $tracker_link, + 'ATTACH_ID' => $attach_id, + + 'S_UPLOAD_IMAGE' => $upload_image, + 'U_DOWNLOAD_LINK' => $download_link, + 'FILESIZE' => $tor_file_size, + + 'DOWNLOAD_COUNT' => sprintf($lang['DOWNLOAD_NUMBER'], $download_count), + 'POSTED_TIME' => $tor_file_time, + )); + + if ($comment) + { + $template->assign_block_vars('postrow.attach.tor_not_reged.comment', array('COMMENT' => $comment)); + } +} +else +{ + $sql = "SELECT * + FROM ". BB_BT_TORRENTS ." + WHERE attach_id = $attach_id + LIMIT 1"; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not obtain torrent information', '', __LINE__, __FILE__, $sql); + } + $tor_info = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); +} + +if ($tor_reged && !$tor_info) +{ + DB()->query("UPDATE ". BB_ATTACHMENTS_DESC ." SET tracker_status = 0 WHERE attach_id = $attach_id"); + + bb_die('Torrent status fixed'); +} + +if ($tor_auth) +{ + $template->assign_vars(array( + 'TOR_CONTROLS' => true, + 'TOR_ACTION' => "torrent.php", + + //torrent status mod + 'TOR_STATUS' => "torstatus.php", + //end torrent status mod + + 'TOR_ATTACH_ID' => $attach_id, + )); + + if ($t_data['self_moderated'] || $is_auth['auth_mod']) + { + $template->assign_vars(array('AUTH_MOVE' => true)); + } +} + +if ($tor_reged && $tor_info) +{ + $tor_size = ($tor_info['size']) ? $tor_info['size'] : 0; + $tor_id = $tor_info['topic_id']; + $tor_type = $tor_info['tor_type']; + + // Magnet link + $passkey = DB()->fetch_row("SELECT auth_key FROM ". BB_BT_USERS ." WHERE user_id = ". (int) $bt_user_id ." LIMIT 1"); + $tor_magnet = create_magnet($tor_info['info_hash'], $passkey['auth_key'], $userdata['session_logged_in']); + + // ratio limits + $min_ratio_dl = $bb_cfg['bt_min_ratio_allow_dl_tor']; + $min_ratio_warn = $bb_cfg['bt_min_ratio_warning']; + $dl_allowed = true; + $user_ratio = 0; + + if (($min_ratio_dl || $min_ratio_warn) && $bt_user_id != $poster_id) + { + $sql = "SELECT u.*, dl.user_status + FROM ". BB_BT_USERS ." u + LEFT JOIN ". BB_BT_DLSTATUS ." dl ON dl.user_id = $bt_user_id AND dl.topic_id = $bt_topic_id + WHERE u.user_id = $bt_user_id + LIMIT 1"; + } + else + { + $sql = "SELECT user_status + FROM ". BB_BT_DLSTATUS ." + WHERE user_id = $bt_user_id + AND topic_id = $bt_topic_id + LIMIT 1"; + } + + $bt_userdata = DB()->fetch_row($sql); + + $user_status = isset($bt_userdata['user_status']) ? $bt_userdata['user_status'] : null; + + if (($min_ratio_dl || $min_ratio_warn) && $user_status != DL_STATUS_COMPLETE && $bt_user_id != $poster_id && $tor_type != TOR_TYPE_GOLD) + { + if (($user_ratio = get_bt_ratio($bt_userdata)) !== null) + { + $dl_allowed = ($user_ratio > $min_ratio_dl); + } + + if (isset($user_ratio) && isset($min_ratio_warn) && $user_ratio < $min_ratio_warn && TR_RATING_LIMITS) + { + $template->assign_vars(array( + 'SHOW_RATIO_WARN' => true, + 'RATIO_WARN_MSG' => sprintf($lang['BT_RATIO_WARNING_MSG'], $min_ratio_warn, $bb_cfg['bt_ratio_warning_url_help']), + )); + } + } + + if (!$dl_allowed) + { + $template->assign_block_vars('postrow.attach.tor_reged', array()); + $template->assign_vars(array( + 'TOR_BLOCKED' => true, + 'TOR_BLOCKED_MSG' => sprintf($lang['BT_LOW_RATIO_FOR_DL'], round($user_ratio, 2), "search.php?dlu=$bt_user_id&dlc=1"), + )); + } + else + { + //torrent status mod + $cuid = $tor_info['checked_user_id']; + //end torrent status mod + $template->assign_block_vars('postrow.attach.tor_reged', array( + 'DOWNLOAD_NAME' => $display_name, + 'TRACKER_LINK' => $tracker_link, + 'ATTACH_ID' => $attach_id, + 'TOR_FROZEN' => ($tor_info['tor_status'] == TOR_STATUS_FROZEN || $tor_info['tor_status'] == 3 || $tor_info['tor_status'] == 4 || $tor_info['tor_status'] == 7), + 'TOR_SILVER_GOLD' => $tor_type, + + // torrent status mod + 'TOR_STATUS_TEXT' => $lang['tor_status'][$tor_info['tor_status']], + 'TOR_STATUS_ICON' => $bb_cfg['tor_icons'][$tor_info['tor_status']], + 'TOR_STATUS_BY' => $cuid ? (' ·  ' . get_username($cuid) . '  ·  '. delta_time($tor_info['checked_time']) .' назад') : '', + 'TOR_STATUS_SELECT' => build_select('', array_flip($bb_cfg['change_tor_status_select']), TOR_APPROVED), + //end torrent status mod + + 'S_UPLOAD_IMAGE' => $upload_image, + 'U_DOWNLOAD_LINK' => $download_link, + 'DL_LINK_CLASS' => (isset($bt_userdata['user_status'])) ? $dl_link_css[$bt_userdata['user_status']] : 'genmed', + 'DL_TITLE_CLASS' => (isset($bt_userdata['user_status'])) ? $dl_status_css[$bt_userdata['user_status']] : 'gen', + 'FILESIZE' => $tor_file_size, + + 'MAGNET' => $tor_magnet, + + 'DOWNLOAD_COUNT' => sprintf($lang['DOWNLOAD_NUMBER'], $download_count), + 'REGED_TIME' => bb_date($tor_info['reg_time']), + 'REGED_DELTA' => delta_time($tor_info['reg_time']), + + 'TORRENT_SIZE' => humn_size($tor_size), + 'COMPLETED' => sprintf($lang['DOWNLOAD_NUMBER'], $tor_info['complete_count']), + )); + + if ($comment) + { + $template->assign_block_vars('postrow.attach.tor_reged.comment', array('COMMENT' => $comment)); + } + } + + if ($bb_cfg['show_tor_info_in_dl_list']) + { + $template->assign_vars(array( + 'SHOW_DL_LIST' => true, + 'SHOW_DL_LIST_TOR_INFO' => true, + + 'TOR_SIZE' => humn_size($tor_size), + 'TOR_LONGEVITY' => delta_time($tor_info['reg_time']), + 'TOR_COMPLETED' => declension($tor_info['complete_count'], 'times'), + )); + } + + // Show peers + if ($show_peers) + { + // Sorting order in full mode + if ($s_mode == 'full') + { + $full_mode_order = 'tr.remain'; + $full_mode_sort_dir = 'ASC'; + + if (isset($_REQUEST['psortasc'])) + { + $full_mode_sort_dir = 'ASC'; + } + else if (isset($_REQUEST['psortdesc'])) + { + $full_mode_sort_dir = 'DESC'; + } + + if (isset($_REQUEST['porder'])) + { + $peer_orders = array( + 'name' => 'u.username', + 'ip' => 'tr.ip', + 'port' => 'tr.port', + 'compl' => 'tr.remain', + 'cup' => 'tr.uploaded', + 'cdown' => 'tr.downloaded', + 'sup' => 'tr.speed_up', + 'sdown' => 'tr.speed_down', + 'time' => 'tr.update_time', + ); + + foreach ($peer_orders as $get_key => $order_by_value) + { + if ($_REQUEST['porder'] == $get_key) + { + $full_mode_order = $order_by_value; + break; + } + } + } + } + // SQL for each mode + if ($s_mode == 'count') + { + $sql = "SELECT seeders, leechers, speed_up, speed_down + FROM ". BB_BT_TRACKER_SNAP ." + WHERE topic_id = $tor_id + LIMIT 1"; + } + else if ($s_mode == 'names') + { + $sql = "SELECT tr.user_id, tr.ip, tr.port, tr.remain, tr.seeder, u.username + FROM ". BB_BT_TRACKER ." tr, ". BB_USERS ." u + WHERE tr.topic_id = $tor_id + AND u.user_id = tr.user_id + GROUP BY tr.ip, tr.user_id, tr.port, tr.seeder + ORDER BY u.username + LIMIT $show_peers_limit"; + } + else + { + $sql = "SELECT + tr.user_id, tr.ip, tr.port, tr.uploaded, tr.downloaded, tr.remain, + tr.seeder, tr.releaser, tr.speed_up, tr.speed_down, tr.update_time, + u.username + FROM ". BB_BT_TRACKER ." tr + LEFT JOIN ". BB_USERS ." u ON u.user_id = tr.user_id + WHERE tr.topic_id = $tor_id + GROUP BY tr.ip, tr.user_id, tr.port, tr.seeder + ORDER BY $full_mode_order $full_mode_sort_dir + LIMIT $show_peers_limit"; + } + + // Build peers table + if ($peers = DB()->fetch_rowset($sql)) + { + $peers_cnt = count($peers); + + $cnt = $tr = $sp_up = $sp_down = $sp_up_tot = $sp_down_tot = array(); + $cnt['s'] = $tr['s'] = $sp_up['s'] = $sp_down['s'] = $sp_up_tot['s'] = $sp_down_tot['s'] = 0; + $cnt['l'] = $tr['l'] = $sp_up['l'] = $sp_down['l'] = $sp_up_tot['l'] = $sp_down_tot['l'] = 0; + + $max_up = $max_down = $max_sp_up = $max_sp_down = array(); + $max_up['s'] = $max_down['s'] = $max_sp_up['s'] = $max_sp_down['s'] = 0; + $max_up['l'] = $max_down['l'] = $max_sp_up['l'] = $max_sp_down['l'] = 0; + $max_up_id['s'] = $max_down_id['s'] = $max_sp_up_id['s'] = $max_sp_down_id['s'] = ($peers_cnt + 1); + $max_up_id['l'] = $max_down_id['l'] = $max_sp_up_id['l'] = $max_sp_down_id['l'] = ($peers_cnt + 1); + + if ($s_mode == 'full') + { + foreach ($peers as $pid => $peer) + { + $x = ($peer['seeder']) ? 's' : 'l'; + $cnt[$x]++; + $sp_up_tot[$x] += $peer['speed_up']; + $sp_down_tot[$x] += $peer['speed_down']; + + $guest = ($peer['user_id'] == ANONYMOUS || is_null($peer['username'])); + $p_max_up = $peer['uploaded']; + $p_max_down = $peer['downloaded']; + + if ($p_max_up > $max_up[$x]) + { + $max_up[$x] = $p_max_up; + $max_up_id[$x] = $pid; + } + if ($peer['speed_up'] > $max_sp_up[$x]) + { + $max_sp_up[$x] = $peer['speed_up']; + $max_sp_up_id[$x] = $pid; + } + if ($p_max_down > $max_down[$x]) + { + $max_down[$x] = $p_max_down; + $max_down_id[$x] = $pid; + } + if ($peer['speed_down'] > $max_sp_down[$x]) + { + $max_sp_down[$x] = $peer['speed_down']; + $max_sp_down_id[$x] = $pid; + } + } + $max_down_id['s'] = $max_sp_down_id['s'] = ($peers_cnt + 1); + + if ($cnt['s'] == 1) + { + $max_up_id['s'] = $max_sp_up_id['s'] = ($peers_cnt + 1); + } + if ($cnt['l'] == 1) + { + $max_up_id['l'] = $max_down_id['l'] = $max_sp_up_id['l'] = $max_sp_down_id['l'] = ($peers_cnt + 1); + } + } + + if ($s_mode == 'count') + { + $tmp = array(); + $tmp[0]['seeder'] = $tmp[0]['username'] = $tmp[1]['username'] = 0; + $tmp[1]['seeder'] = 1; + $tmp[0]['username'] = (int) @$peers[0]['leechers']; + $tmp[1]['username'] = (int) @$peers[0]['seeders']; + $tor_speed_up = (int) @$peers[0]['speed_up']; + $tor_speed_down = (int) @$peers[0]['speed_down']; + $peers = $tmp; + + $template->assign_vars(array( + 'TOR_SPEED_UP' => ($tor_speed_up) ? humn_size($tor_speed_up, 0, 'KB') .'/s' : '0 KB/s', + 'TOR_SPEED_DOWN' => ($tor_speed_down) ? humn_size($tor_speed_down, 0, 'KB') .'/s' : '0 KB/s', + )); + } + + foreach ($peers as $pid => $peer) + { + $u_prof_href = ($s_mode == 'count') ? '#' : append_sid("profile.php?mode=viewprofile&u=". $peer['user_id']) .'#torrent'; + + // Full details mode + if ($s_mode == 'full') + { + $ip = bt_show_ip($peer['ip']); + $port = bt_show_port($peer['port']); + $guest = ($peer['user_id'] == ANONYMOUS || is_null($peer['username'])); + + if (isset($peer['user_id']) && $guest) + { + $peer['username'] = 'Guest'; + } + // peer max/current up/down + $p_max_up = $peer['uploaded']; + $p_max_down = $peer['downloaded']; + $p_cur_up = $peer['uploaded']; + $p_cur_down = $peer['downloaded']; + + if ($peer['seeder']) + { + $x = 's'; + $x_row = 'srow'; + $x_full = 'sfull'; + $link_class = 'seedmed'; + + if (!defined('SEEDER_EXIST')) + { + define('SEEDER_EXIST', true); + $seed_order_action = append_sid("viewtopic.php?". POST_TOPIC_URL ."=$bt_topic_id&spmode=full") .'#seeders'; + + $template->assign_block_vars("$x_full", array( + 'SEED_ORD_ACT' => $seed_order_action, + 'SEEDERS_UP_TOT' => humn_size($sp_up_tot[$x], 0, 'KB') .'/s' + )); + + if ($ip) + { + $template->assign_block_vars("$x_full.iphead", array()); + } + if ($port !== false) + { + $template->assign_block_vars("$x_full.porthead", array()); + } + } + $compl_perc = ($tor_size) ? round(($p_max_up / $tor_size), 1) : 0; + } + else + { + $x = 'l'; + $x_row = 'lrow'; + $x_full = 'lfull'; + $link_class = 'leechmed'; + + if (!defined('LEECHER_EXIST')) + { + define('LEECHER_EXIST', true); + $leech_order_action = append_sid("viewtopic.php?". POST_TOPIC_URL ."=$bt_topic_id&spmode=full") .'#leechers'; + + $template->assign_block_vars("$x_full", array( + 'LEECH_ORD_ACT' => $leech_order_action, + 'LEECHERS_UP_TOT' => humn_size($sp_up_tot[$x], 0, 'KB') .'/s', + 'LEECHERS_DOWN_TOT' => humn_size($sp_down_tot[$x], 0, 'KB') .'/s' + )); + + if ($ip) + { + $template->assign_block_vars("$x_full.iphead", array()); + } + if ($port !== false) + { + $template->assign_block_vars("$x_full.porthead", array()); + } + } + $compl_size = ($peer['remain'] && $tor_size && $tor_size > $peer['remain']) ? ($tor_size - $peer['remain']) : 0; + $compl_perc = ($compl_size) ? floor($compl_size * 100 / $tor_size) : 0; + } + + $rel_sign = (!$guest && $peer['releaser']) ? ' ® ' : ''; + $name = ''. wbr($peer['username']) .''. $rel_sign; + $up_tot = ($p_max_up) ? humn_size($p_max_up) : '-'; + $down_tot = ($p_max_down) ? humn_size($p_max_down) : '-'; + $up_ratio = ($p_max_down) ? round(($p_max_up / $p_max_down), 2) : ''; + $sp_up = ($peer['speed_up']) ? humn_size($peer['speed_up'], 0, 'KB') .'/s' : '-'; + $sp_down = ($peer['speed_down']) ? humn_size($peer['speed_down'], 0, 'KB') .'/s' : '-'; + + $bgr_class = (!($tr[$x] % 2)) ? $bgr_class_1 : $bgr_class_2; + $row_bgr = ($change_peers_bgr_over) ? " class=\"$bgr_class\" onmouseover=\"this.className='$bgr_class_over';\" onmouseout=\"this.className='$bgr_class';\"" : ''; + $tr[$x]++; + + $template->assign_block_vars("$x_full.$x_row", array( + 'ROW_BGR' => $row_bgr, + 'NAME' => ($peer['update_time']) ? $name : "$name", + 'COMPL_PRC' => $compl_perc, + 'UP_TOTAL' => ($max_up_id[$x] == $pid) ? "$up_tot" : $up_tot, + 'DOWN_TOTAL' => ($max_down_id[$x] == $pid) ? "$down_tot" : $down_tot, + 'SPEED_UP' => ($max_sp_up_id[$x] == $pid) ? "$sp_up" : $sp_up, + 'SPEED_DOWN' => ($max_sp_down_id[$x] == $pid) ? "$sp_down" : $sp_down, + 'UPD_EXP_TIME' => ($peer['update_time']) ? "upd: ". bb_date($peer['update_time'], 'd-M-y H:i') : "stopped", + 'TOR_RATIO' => ($up_ratio) ? "UL/DL ratio: $up_ratio" : '', + )); + + if ($ip) + { + $template->assign_block_vars("$x_full.$x_row.ip", array('IP' => $ip)); + } + if ($port !== false) + { + $template->assign_block_vars("$x_full.$x_row.port", array('PORT' => $port)); + } + } + // Count only & only names modes + else + { + if ($peer['seeder']) + { + $seeders .= ''. $peer['username'] .', '; + $seed_count = $peer['username']; + } + else + { + $compl_size = (@$peer['remain'] && $tor_size && $tor_size > $peer['remain']) ? ($tor_size - $peer['remain']) : 0; + $compl_perc = ($compl_size) ? floor($compl_size * 100 / $tor_size) : 0; + + $leechers .= ''. $peer['username'] .''; + $leechers .= ($s_mode == 'names') ? ' ['. $compl_perc .'%]' : ''; + $leechers .= ', '; + $leech_count = $peer['username']; + } + } + } + + if ($s_mode != 'full' && $seeders) + { + $seeders[strlen($seeders)-9] = ' '; + $template->assign_vars(array( + 'SEED_LIST' => $seeders, + 'SEED_COUNT' => ($seed_count) ? $seed_count : 0, + )); + } + if ($s_mode != 'full' && $leechers) + { + $leechers[strlen($leechers)-9] = ' '; + $template->assign_vars(array( + 'LEECH_LIST' => $leechers, + 'LEECH_COUNT' => ($leech_count) ? $leech_count : 0, + )); + } + } + unset($peers); + + if ($s_mode == 'full' && (defined('SEEDER_EXIST') || defined('LEECHER_EXIST'))) + { + $name_opt = ''; + $seed_compl_opt = ''; + $leech_compl_opt = ''; + + $up_down_speed_opt = ' + + + + + '; + + $ip_opt = ($ip) ? '' : ''; + $port_opt = ($port !== false) ? '' : ''; + + if ($cnt['s'] > 2) + { + $seed_order_select = $name_opt . $seed_compl_opt . $up_down_speed_opt . $ip_opt . $port_opt; + $template->assign_block_vars('sfull.sorder', array('SEED_ORDER_SELECT' => '')); + } + if ($cnt['l'] > 2) + { + $leech_order_select = $name_opt . $leech_compl_opt . $up_down_speed_opt . $ip_opt . $port_opt; + $template->assign_block_vars('lfull.lorder', array('LEECH_ORDER_SELECT' => '')); + } + } + + // Show "seeder last seen info" + if (($s_mode == 'count' && !$seed_count) || (!$seeders && !defined('SEEDER_EXIST'))) + { + $last_seen_time = ($tor_info['seeder_last_seen']) ? delta_time($tor_info['seeder_last_seen']) : $lang['NEVER']; + + $template->assign_vars(array( + 'SEEDER_LAST_SEEN' => sprintf($lang['SEEDER_LAST_SEEN'], $last_seen_time), + )); + } + } + + $template->assign_block_vars('tor_title', array('U_DOWNLOAD_LINK' => $download_link)); + + if ($peers_cnt > $max_peers_before_overflow && $s_mode == 'full') + { + $template->assign_vars(array('PEERS_DIV_STYLE' => $peers_div_style_overflow)); + $template->assign_vars(array('PEERS_OVERFLOW' => true)); + } + else + { + $template->assign_vars(array('PEERS_DIV_STYLE' => $peers_div_style_normal)); + } +} + +if ($bb_cfg['bt_allow_spmode_change'] && $s_mode != 'full') +{ + $template->assign_vars(array( + 'PEERS_FULL_LINK' => true, + 'SPMODE_FULL_HREF' => append_sid("viewtopic.php?". POST_TOPIC_URL ."=$bt_topic_id&spmode=full") .'#seeders', + )); +} + +$template->assign_vars(array( + 'SHOW_DL_LIST_LINK' => (($bb_cfg['bt_show_dl_list'] || $bb_cfg['allow_dl_list_names_mode']) && $t_data['topic_dl_type'] == TOPIC_DL_TYPE_DL), + 'SHOW_TOR_ACT' => ($tor_reged && $show_peers), + 'S_MODE_COUNT' => ($s_mode == 'count'), + 'S_MODE_NAMES' => ($s_mode == 'names'), + 'S_MODE_FULL' => ($s_mode == 'full'), + 'PEER_EXIST' => ($seeders || $leechers || defined('SEEDER_EXIST') || defined('LEECHER_EXIST')), + 'SEED_EXIST' => ($seeders || defined('SEEDER_EXIST')), + 'LEECH_EXIST' => ($leechers || defined('LEECHER_EXIST')), + 'TOR_HELP_LINKS' => $bb_cfg['tor_help_links'], +)); \ No newline at end of file diff --git a/upload/attach_mod/includes/.htaccess b/upload/attach_mod/includes/.htaccess new file mode 100644 index 000000000..baa56e5a3 --- /dev/null +++ b/upload/attach_mod/includes/.htaccess @@ -0,0 +1,2 @@ +order allow,deny +deny from all \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_admin.php b/upload/attach_mod/includes/functions_admin.php new file mode 100644 index 000000000..63355c7e4 --- /dev/null +++ b/upload/attach_mod/includes/functions_admin.php @@ -0,0 +1,415 @@ +sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Entry', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) == 0) + { + $sql_ary = array( + 'user_id' => (int) $id, + 'group_id' => 0, + 'quota_type' => (int) $quota_type, + 'quota_limit_id'=> (int) $quota_limit_id + ); + + $sql = 'INSERT INTO ' . BB_QUOTA . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + } + else + { + $sql = 'UPDATE ' . BB_QUOTA . " + SET quota_limit_id = $quota_limit_id + WHERE user_id = $id + AND quota_type = $quota_type"; + } + DB()->sql_freeresult($result); + } + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to update quota Settings', '', __LINE__, __FILE__, $sql); + } + + } + else if ($mode == 'group') + { + if (!$quota_limit_id) + { + $sql = 'DELETE FROM ' . BB_QUOTA . " + WHERE group_id = $id + AND quota_type = $quota_type"; + + if( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Unable to delete quota Settings', '', __LINE__, __FILE__, $sql); + } + } + else + { + // Check if user is already entered + $sql = 'SELECT group_id + FROM ' . BB_QUOTA . " + WHERE group_id = $id + AND quota_type = $quota_type"; + + if( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Entry', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) == 0) + { + $sql = 'INSERT INTO ' . BB_QUOTA . " (user_id, group_id, quota_type, quota_limit_id) + VALUES (0, $id, $quota_type, $quota_limit_id)"; + } + else + { + $sql = 'UPDATE ' . BB_QUOTA . " SET quota_limit_id = $quota_limit_id + WHERE group_id = $id AND quota_type = $quota_type"; + } + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Unable to update quota Settings', '', __LINE__, __FILE__, $sql); + } + } + } +} + +/** +* sort multi-dimensional Array +*/ +function sort_multi_array ($sort_array, $key, $sort_order, $pre_string_sort = 0) +{ + $last_element = sizeof($sort_array) - 1; + + if (!$pre_string_sort) + { + $string_sort = (!is_numeric(@$sort_array[$last_element-1][$key]) ) ? true : false; + } + else + { + $string_sort = $pre_string_sort; + } + + for ($i = 0; $i < $last_element; $i++) + { + $num_iterations = $last_element - $i; + + for ($j = 0; $j < $num_iterations; $j++) + { + $next = 0; + + // do checks based on key + $switch = false; + if (!$string_sort) + { + if (($sort_order == 'DESC' && intval(@$sort_array[$j][$key]) < intval(@$sort_array[$j + 1][$key])) || ($sort_order == 'ASC' && intval(@$sort_array[$j][$key]) > intval(@$sort_array[$j + 1][$key]))) + { + $switch = true; + } + } + else + { + if (($sort_order == 'DESC' && strcasecmp(@$sort_array[$j][$key], @$sort_array[$j + 1][$key]) < 0) || ($sort_order == 'ASC' && strcasecmp(@$sort_array[$j][$key], @$sort_array[$j + 1][$key]) > 0)) + { + $switch = true; + } + } + + if ($switch) + { + $temp = $sort_array[$j]; + $sort_array[$j] = $sort_array[$j + 1]; + $sort_array[$j + 1] = $temp; + } + } + } + + return $sort_array; +} + +/** +* Returns the filesize of the upload directory in human readable format +*/ +function get_formatted_dirsize() +{ + global $attach_config, $upload_dir, $lang; + + $upload_dir_size = 0; + + if (!intval($attach_config['allow_ftp_upload'])) + { + if ($dirname = @opendir($upload_dir)) + { + while ($file = @readdir($dirname)) + { + if ($file != 'index.php' && $file != '.htaccess' && !is_dir($upload_dir . '/' . $file) && !is_link($upload_dir . '/' . $file)) + { + $upload_dir_size += @filesize($upload_dir . '/' . $file); + } + } + @closedir($dirname); + } + else + { + $upload_dir_size = $lang['NOT_AVAILABLE']; + return $upload_dir_size; + } + } + else + { + $conn_id = attach_init_ftp(); + + $file_listing = array(); + + $file_listing = @ftp_rawlist($conn_id, ''); + + if (!$file_listing) + { + $upload_dir_size = $lang['NOT_AVAILABLE']; + return $upload_dir_size; + } + + for ($i = 0; $i < count($file_listing); $i++) + { + if (preg_match("/([-d])[rwxst-]{9}.* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)/", $file_listing[$i], $regs)) + { + if ($regs[1] == 'd') + { + $dirinfo[0] = 1; // Directory == 1 + } + $dirinfo[1] = $regs[2]; // Size + $dirinfo[2] = $regs[3]; // Date + $dirinfo[3] = $regs[4]; // Filename + $dirinfo[4] = $regs[5]; // Time + } + + if ($dirinfo[0] != 1 && $dirinfo[4] != 'index.php' && $dirinfo[4] != '.htaccess') + { + $upload_dir_size += $dirinfo[1]; + } + } + + @ftp_quit($conn_id); + } + + if ($upload_dir_size >= 1048576) + { + $upload_dir_size = round($upload_dir_size / 1048576 * 100) / 100 . ' ' . $lang['MB']; + } + else if ($upload_dir_size >= 1024) + { + $upload_dir_size = round($upload_dir_size / 1024 * 100) / 100 . ' ' . $lang['KB']; + } + else + { + $upload_dir_size = $upload_dir_size . ' ' . $lang['BYTES']; + } + + return $upload_dir_size; +} + +/* +* Build SQL-Statement for the search feature +*/ +function search_attachments($order_by, &$total_rows) +{ + global $lang; + + $where_sql = array(); + + // Get submitted Vars + $search_vars = array('search_keyword_fname', 'search_keyword_comment', 'search_author', 'search_size_smaller', 'search_size_greater', 'search_count_smaller', 'search_count_greater', 'search_days_greater', 'search_forum', 'search_cat'); + + for ($i = 0; $i < sizeof($search_vars); $i++) + { + $$search_vars[$i] = get_var($search_vars[$i], ''); + } + + // Author name search + if ($search_author != '') + { + // Bring in line with 2.0.x expected username + $search_author = addslashes(html_entity_decode($search_author)); + $search_author = stripslashes(clean_username($search_author)); + + // Prepare for directly going into sql query + $search_author = str_replace('*', '%', attach_mod_sql_escape($search_author)); + + // We need the post_id's, because we want to query the Attachment Table + $sql = 'SELECT user_id + FROM ' . BB_USERS . " + WHERE username LIKE '$search_author'"; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t obtain list of matching users (searching for: ' . $search_author . ')', '', __LINE__, __FILE__, $sql); + } + + $matching_userids = ''; + if ( $row = DB()->sql_fetchrow($result) ) + { + do + { + $matching_userids .= (($matching_userids != '') ? ', ' : '') . intval($row['user_id']); + } + while ($row = DB()->sql_fetchrow($result)); + + DB()->sql_freeresult($result); + } + else + { + message_die(GENERAL_MESSAGE, $lang['NO_ATTACH_SEARCH_MATCH']); + } + + $where_sql[] = ' (t.user_id_1 IN (' . $matching_userids . ')) '; + } + + // Search Keyword + if ($search_keyword_fname != '') + { + $match_word = str_replace('*', '%', $search_keyword_fname); + $where_sql[] = " (a.real_filename LIKE '" . attach_mod_sql_escape($match_word) . "') "; + } + + if ($search_keyword_comment != '') + { + $match_word = str_replace('*', '%', $search_keyword_comment); + $where_sql[] = " (a.comment LIKE '" . attach_mod_sql_escape($match_word) . "') "; + } + + // Search Download Count + if ($search_count_smaller != '' || $search_count_greater != '') + { + if ($search_count_smaller != '') + { + $where_sql[] = ' (a.download_count < ' . (int) $search_count_smaller . ') '; + } + else if ($search_count_greater != '') + { + $where_sql[] = ' (a.download_count > ' . (int) $search_count_greater . ') '; + } + } + + // Search Filesize + if ($search_size_smaller != '' || $search_size_greater != '') + { + if ($search_size_smaller != '') + { + $where_sql[] = ' (a.filesize < ' . (int) $search_size_smaller . ') '; + } + else if ($search_size_greater != '') + { + $where_sql[] = ' (a.filesize > ' . (int) $search_size_greater . ') '; + } + } + + // Search Attachment Time + if ($search_days_greater != '') + { + $where_sql[] = ' (a.filetime < ' . ( time() - ((int) $search_days_greater * 86400)) . ') '; + } + + // Search Forum + if ($search_forum) + { + $where_sql[] = ' (p.forum_id = ' . intval($search_forum) . ') '; + } + + // Search Cat... nope... sorry :( + + $sql = 'SELECT a.*, t.post_id, p.post_time, p.topic_id + FROM ' . BB_ATTACHMENTS . ' t, ' . BB_ATTACHMENTS_DESC . ' a, ' . BB_POSTS . ' p WHERE '; + + if (sizeof($where_sql) > 0) + { + $sql .= implode('AND', $where_sql) . ' AND '; + } + + $sql .= 't.post_id = p.post_id AND a.attach_id = t.attach_id '; + + $total_rows_sql = $sql; + + $sql .= $order_by; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attachments', '', __LINE__, __FILE__, $sql); + } + + $attachments = DB()->sql_fetchrowset($result); + $num_attach = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_attach == 0) + { + message_die(GENERAL_MESSAGE, $lang['NO_ATTACH_SEARCH_MATCH']); + } + + if (!($result = DB()->sql_query($total_rows_sql))) + { + message_die(GENERAL_ERROR, 'Could not query attachments', '', __LINE__, __FILE__, $sql); + } + + $total_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + return $attachments; +} + +/** +* perform LIMIT statement on arrays +*/ +function limit_array($array, $start, $pagelimit) +{ + // array from start - start+pagelimit + $limit = (sizeof($array) < ($start + $pagelimit)) ? sizeof($array) : $start + $pagelimit; + + $limit_array = array(); + + for ($i = $start; $i < $limit; $i++) + { + $limit_array[] = $array[$i]; + } + + return $limit_array; +} \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_attach.php b/upload/attach_mod/includes/functions_attach.php new file mode 100644 index 000000000..291816e30 --- /dev/null +++ b/upload/attach_mod/includes/functions_attach.php @@ -0,0 +1,892 @@ + 4096) + { + return; + } + else if ($number < $base) + { + return $chars[$number]; + } + + $hexval = ''; + + while ($number > 0) + { + $remainder = $number%$base; + + if ($remainder < $base) + { + $hexval = $chars[$remainder] . $hexval; + } + + $number = floor($number/$base); + } + + return $hexval; +} + +/** +* base64todec function +*/ +function base64_unpack($string) +{ + $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-'; + $base = strlen($chars); + + $length = strlen($string); + $number = 0; + + for($i = 1; $i <= $length; $i++) + { + $pos = $length - $i; + $operand = strpos($chars, substr($string,$pos,1)); + $exponent = pow($base, $i-1); + $decValue = $operand * $exponent; + $number += $decValue; + } + + return $number; +} + +/** +* Per Forum based Extension Group Permissions (Encode Number) -> Theoretically up to 158 Forums saveable. :) +* We are using a base of 64, but splitting it to one-char and two-char numbers. :) +*/ +function auth_pack($auth_array) +{ + $one_char_encoding = '#'; + $two_char_encoding = '.'; + $one_char = $two_char = false; + $auth_cache = ''; + + for ($i = 0; $i < sizeof($auth_array); $i++) + { + $val = base64_pack(intval($auth_array[$i])); + if (strlen($val) == 1 && !$one_char) + { + $auth_cache .= $one_char_encoding; + $one_char = true; + } + else if (strlen($val) == 2 && !$two_char) + { + $auth_cache .= $two_char_encoding; + $two_char = true; + } + + $auth_cache .= $val; + } + + return $auth_cache; +} + +/** +* Reverse the auth_pack process +*/ +function auth_unpack($auth_cache) +{ + $one_char_encoding = '#'; + $two_char_encoding = '.'; + + $auth = array(); + $auth_len = 1; + + for ($pos = 0; $pos < strlen($auth_cache); $pos += $auth_len) + { + $forum_auth = substr($auth_cache, $pos, 1); + if ($forum_auth == $one_char_encoding) + { + $auth_len = 1; + continue; + } + else if ($forum_auth == $two_char_encoding) + { + $auth_len = 2; + $pos--; + continue; + } + + $forum_auth = substr($auth_cache, $pos, $auth_len); + $forum_id = base64_unpack($forum_auth); + $auth[] = intval($forum_id); + } + return $auth; +} + +/** +* Used for determining if Forum ID is authed, please use this Function on all Posting Screens +*/ +function is_forum_authed($auth_cache, $check_forum_id) +{ + $one_char_encoding = '#'; + $two_char_encoding = '.'; + + if (trim($auth_cache) == '') + { + return true; + } + + $auth = array(); + $auth_len = 1; + + for ($pos = 0; $pos < strlen($auth_cache); $pos+=$auth_len) + { + $forum_auth = substr($auth_cache, $pos, 1); + if ($forum_auth == $one_char_encoding) + { + $auth_len = 1; + continue; + } + else if ($forum_auth == $two_char_encoding) + { + $auth_len = 2; + $pos--; + continue; + } + + $forum_auth = substr($auth_cache, $pos, $auth_len); + $forum_id = (int) base64_unpack($forum_auth); + if ($forum_id == $check_forum_id) + { + return true; + } + } + return false; +} + +/** +* Init FTP Session +*/ +function attach_init_ftp($mode = false) +{ + global $lang, $attach_config; + + $server = (trim($attach_config['ftp_server']) == '') ? 'localhost' : trim($attach_config['ftp_server']); + + $ftp_path = ($mode == MODE_THUMBNAIL) ? trim($attach_config['ftp_path']) . '/' . THUMB_DIR : trim($attach_config['ftp_path']); + + $conn_id = @ftp_connect($server); + + if (!$conn_id) + { + message_die(GENERAL_ERROR, sprintf($lang['FTP_ERROR_CONNECT'], $server)); + } + + $login_result = @ftp_login($conn_id, $attach_config['ftp_user'], $attach_config['ftp_pass']); + + if (!$login_result) + { + message_die(GENERAL_ERROR, sprintf($lang['FTP_ERROR_LOGIN'], $attach_config['ftp_user'])); + } + + if (!@ftp_pasv($conn_id, intval($attach_config['ftp_pasv_mode']))) + { + message_die(GENERAL_ERROR, $lang['FTP_ERROR_PASV_MODE']); + } + + $result = @ftp_chdir($conn_id, $ftp_path); + + if (!$result) + { + message_die(GENERAL_ERROR, sprintf($lang['FTP_ERROR_PATH'], $ftp_path)); + } + + return $conn_id; +} + +/** +* Deletes an Attachment +*/ +function unlink_attach($filename, $mode = false) +{ + global $upload_dir, $attach_config, $lang; + + $filename = basename($filename); + + if (!intval($attach_config['allow_ftp_upload'])) + { + if ($mode == MODE_THUMBNAIL) + { + $filename = $upload_dir . '/' . THUMB_DIR . '/t_' . $filename; + } + else + { + $filename = $upload_dir . '/' . $filename; + } + + $deleted = @unlink($filename); + + } + else + { + $conn_id = attach_init_ftp($mode); + + if ($mode == MODE_THUMBNAIL) + { + $filename = 't_' . $filename; + } + + $res = @ftp_delete($conn_id, $filename); + if (!$res) + { + return $deleted; + } + + @ftp_quit($conn_id); + + $deleted = true; + } + + return $deleted; +} + +/** +* FTP File to Location +*/ +function ftp_file($source_file, $dest_file, $mimetype, $disable_error_mode = false) +{ + global $attach_config, $lang, $error, $error_msg; + + $conn_id = attach_init_ftp(); + + // Binary or Ascii ? + $mode = FTP_BINARY; + if (preg_match("/text/i", $mimetype) || preg_match("/html/i", $mimetype)) + { + $mode = FTP_ASCII; + } + + $res = @ftp_put($conn_id, $dest_file, $source_file, $mode); + + if (!$res && !$disable_error_mode) + { + $error = true; + if (!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg = sprintf($lang['FTP_ERROR_UPLOAD'], $attach_config['ftp_path']) . '
'; + @ftp_quit($conn_id); + return false; + } + + if (!$res) + { + return false; + } + + @ftp_site($conn_id, 'CHMOD 0644 ' . $dest_file); + @ftp_quit($conn_id); + return true; +} + +/** +* Check if Attachment exist +*/ +function attachment_exists($filename) +{ + global $upload_dir, $attach_config; + + $filename = basename($filename); + + if (!intval($attach_config['allow_ftp_upload'])) + { + if (!@file_exists(@amod_realpath($upload_dir . '/' . $filename))) + { + return false; + } + else + { + return true; + } + } + else + { + $found = false; + + $conn_id = attach_init_ftp(); + + $file_listing = array(); + + $file_listing = @ftp_rawlist($conn_id, $filename); + + for ($i = 0, $size = sizeof($file_listing); $i < $size; $i++) + { + if (preg_match("/([-d])[rwxst-]{9}.* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)/", $file_listing[$i], $regs)) + { + if ($regs[1] == 'd') + { + $dirinfo[0] = 1; // Directory == 1 + } + $dirinfo[1] = $regs[2]; // Size + $dirinfo[2] = $regs[3]; // Date + $dirinfo[3] = $regs[4]; // Filename + $dirinfo[4] = $regs[5]; // Time + } + + if ($dirinfo[0] != 1 && $dirinfo[4] == $filename) + { + $found = true; + } + } + + @ftp_quit($conn_id); + + return $found; + } +} + +/** +* Check if Thumbnail exist +*/ +function thumbnail_exists($filename) +{ + global $upload_dir, $attach_config; + + $filename = basename($filename); + + if (!intval($attach_config['allow_ftp_upload'])) + { + if (!@file_exists(@amod_realpath($upload_dir . '/' . THUMB_DIR . '/t_' . $filename))) + { + return false; + } + else + { + return true; + } + } + else + { + $found = false; + + $conn_id = attach_init_ftp(MODE_THUMBNAIL); + + $file_listing = array(); + + $filename = 't_' . $filename; + $file_listing = @ftp_rawlist($conn_id, $filename); + + for ($i = 0, $size = sizeof($file_listing); $i < $size; $i++) + { + if (preg_match("/([-d])[rwxst-]{9}.* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)/", $file_listing[$i], $regs)) + { + if ($regs[1] == 'd') + { + $dirinfo[0] = 1; // Directory == 1 + } + $dirinfo[1] = $regs[2]; // Size + $dirinfo[2] = $regs[3]; // Date + $dirinfo[3] = $regs[4]; // Filename + $dirinfo[4] = $regs[5]; // Time + } + + if ($dirinfo[0] != 1 && $dirinfo[4] == $filename) + { + $found = true; + } + } + + @ftp_quit($conn_id); + + return $found; + } +} + +/** +* Physical Filename stored already ? +*/ +function physical_filename_already_stored($filename) +{ + if ($filename == '') + { + return false; + } + + $filename = basename($filename); + + $sql = 'SELECT attach_id + FROM ' . BB_ATTACHMENTS_DESC . " + WHERE physical_filename = '" . attach_mod_sql_escape($filename) . "' + LIMIT 1"; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get attachment information for filename: ' . htmlspecialchars($filename), '', __LINE__, __FILE__, $sql); + } + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + return ($num_rows == 0) ? false : true; +} + +/** +* get all attachments from a post (could be an post array too) +*/ +function get_attachments_from_post($post_id_array) +{ + global $attach_config; + + $attachments = array(); + + if (!is_array($post_id_array)) + { + if (empty($post_id_array)) + { + return $attachments; + } + + $post_id = intval($post_id_array); + + $post_id_array = array(); + $post_id_array[] = $post_id; + } + + $post_id_array = implode(', ', array_map('intval', $post_id_array)); + + if ($post_id_array == '') + { + return $attachments; + } + + $display_order = (intval($attach_config['display_order']) == 0) ? 'DESC' : 'ASC'; + + $sql = 'SELECT a.post_id, d.* + FROM ' . BB_ATTACHMENTS . ' a, ' . BB_ATTACHMENTS_DESC . " d + WHERE a.post_id IN ($post_id_array) + AND a.attach_id = d.attach_id + ORDER BY d.filetime $display_order"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Attachment Informations for post number ' . $post_id_array, '', __LINE__, __FILE__, $sql); + } + + $num_rows = DB()->num_rows($result); + $attachments = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + if ($num_rows == 0) + { + return array(); + } + + return $attachments; +} + +/** +* Count Filesize of Attachments in Database based on the attachment id +*/ +function get_total_attach_filesize($attach_ids) +{ + if (!is_array($attach_ids) || !sizeof($attach_ids)) + { + return 0; + } + + $attach_ids = implode(', ', array_map('intval', $attach_ids)); + + if (!$attach_ids) + { + return 0; + } + + $sql = 'SELECT filesize + FROM ' . BB_ATTACHMENTS_DESC . " + WHERE attach_id IN ($attach_ids)"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query Total Filesize', '', __LINE__, __FILE__, $sql); + } + + $total_filesize = 0; + + while ($row = DB()->sql_fetchrow($result)) + { + $total_filesize += (int) $row['filesize']; + } + DB()->sql_freeresult($result); + + return $total_filesize; +} + +/** +* Get allowed Extensions and their respective Values +*/ +function get_extension_informations() +{ + return $GLOBALS['datastore']->get('attach_extensions'); +} + +// +// Sync Topic +// +function attachment_sync_topic ($topics) +{ + if (is_array($topics)) + { + $topics = join(',', $topics); + } + $posts_without_attach = $topics_without_attach = array(); + + // Check orphan post_attachment markers + $sql = "SELECT p.post_id + FROM ". BB_POSTS ." p + LEFT JOIN ". BB_ATTACHMENTS ." a USING(post_id) + WHERE p.topic_id IN($topics) + AND p.post_attachment = 1 + AND a.post_id IS NULL"; + + if ($rowset = DB()->fetch_rowset($sql)) + { + foreach ($rowset as $row) + { + $posts_without_attach[] = $row['post_id']; + } + if ($posts_sql = join(',', $posts_without_attach)) + { + DB()->query("UPDATE ". BB_POSTS ." SET post_attachment = 0 WHERE post_id IN($posts_sql)"); + } + } + + // Update missing topic_attachment markers + DB()->query(" + UPDATE ". BB_TOPICS ." t, ". BB_POSTS ." p SET + t.topic_attachment = 1 + WHERE p.topic_id IN($topics) + AND p.post_attachment = 1 + AND p.topic_id = t.topic_id + "); + + // Fix orphan topic_attachment markers + $sql = "SELECT t.topic_id + FROM ". BB_POSTS ." p, ". BB_TOPICS ." t + WHERE t.topic_id = p.topic_id + AND t.topic_id IN($topics) + AND t.topic_attachment = 1 + GROUP BY p.topic_id + HAVING SUM(p.post_attachment) = 0"; + + if ($rowset = DB()->fetch_rowset($sql)) + { + foreach ($rowset as $row) + { + $topics_without_attach[] = $row['topic_id']; + } + if ($topics_sql = join(',', $topics_without_attach)) + { + DB()->query("UPDATE ". BB_TOPICS ." SET topic_attachment = 0 WHERE topic_id IN($topics_sql)"); + } + } +} + +/** +* Get Extension +*/ +function get_extension($filename) +{ + if (!stristr($filename, '.')) + { + return ''; + } + $extension = strrchr(strtolower($filename), '.'); + $extension[0] = ' '; + $extension = strtolower(trim($extension)); + if (is_array($extension)) + { + return ''; + } + else + { + return $extension; + } +} + +/** +* Delete Extension +*/ +function delete_extension($filename) +{ + return substr($filename, 0, strrpos(strtolower(trim($filename)), '.')); +} + +/** +* Check if a user is within Group +*/ +function user_in_group($user_id, $group_id) +{ + $user_id = (int) $user_id; + $group_id = (int) $group_id; + + if (!$user_id || !$group_id) + { + return false; + } + + $sql = 'SELECT u.group_id + FROM ' . BB_USER_GROUP . ' u, ' . BB_GROUPS . " g + WHERE g.group_single_user = 0 + AND u.group_id = g.group_id + AND u.user_id = $user_id + AND g.group_id = $group_id + LIMIT 1"; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get User Group', '', __LINE__, __FILE__, $sql); + } + + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_rows == 0) + { + return false; + } + + return true; +} + +/** +* Realpath replacement for attachment mod +*/ +function amod_realpath($path) +{ + return (function_exists('realpath')) ? realpath($path) : $path; +} + +/** +* _set_var +* +* Set variable, used by {@link get_var the get_var function} +* +* @private +*/ +function _set_var(&$result, $var, $type, $multibyte = false) +{ + settype($var, $type); + $result = $var; + + if ($type == 'string') + { + $result = trim(str_replace(array("\r\n", "\r", '\xFF'), array("\n", "\n", ' '), $result)); + // 2.0.x is doing addslashes on all variables + $result = stripslashes($result); + if ($multibyte) + { + $result = preg_replace('#&(\#[0-9]+;)#', '&\1', $result); + } + } +} + +/** +* get_var +* +* Used to get passed variable +*/ +function get_var($var_name, $default, $multibyte = false) +{ + $request_var = (isset($_POST[$var_name])) ? $_POST : $_GET; + + if (!isset($request_var[$var_name]) || (is_array($request_var[$var_name]) && !is_array($default)) || (is_array($default) && !is_array($request_var[$var_name]))) + { + return (is_array($default)) ? array() : $default; + } + + $var = $request_var[$var_name]; + + if (!is_array($default)) + { + $type = gettype($default); + } + else + { + list($key_type, $type) = each($default); + $type = gettype($type); + $key_type = gettype($key_type); + } + + if (is_array($var)) + { + $_var = $var; + $var = array(); + + foreach ($_var as $k => $v) + { + if (is_array($v)) + { + foreach ($v as $_k => $_v) + { + _set_var($k, $k, $key_type); + _set_var($_k, $_k, $key_type); + _set_var($var[$k][$_k], $_v, $type, $multibyte); + } + } + else + { + _set_var($k, $k, $key_type); + _set_var($var[$k], $v, $type, $multibyte); + } + } + } + else + { + _set_var($var, $var, $type, $multibyte); + } + + return $var; +} + +/** +* Escaping SQL +*/ +function attach_mod_sql_escape($text) +{ + switch (SQL_LAYER) + { + case 'postgresql': + return pg_escape_string($text); + break; + + case 'mysql': + case 'mysql4': + if (function_exists('mysql_real_escape_string')) + { + return DB()->escape_string($text); + } + else + { + return str_replace("'", "''", str_replace('\\', '\\\\', $text)); + } + break; + + default: + return str_replace("'", "''", str_replace('\\', '\\\\', $text)); + break; + } +} + +/** +* Build sql statement from array for insert/update/select statements +* +* Idea for this from Ikonboard +* Possible query values: INSERT, INSERT_SELECT, MULTI_INSERT, UPDATE, SELECT +*/ +function attach_mod_sql_build_array($query, $assoc_ary = false) +{ + if (!is_array($assoc_ary)) + { + return false; + } + + $fields = array(); + $values = array(); + if ($query == 'INSERT' || $query == 'INSERT_SELECT') + { + foreach ($assoc_ary as $key => $var) + { + $fields[] = $key; + + if (is_null($var)) + { + $values[] = 'NULL'; + } + else if (is_string($var)) + { + $values[] = "'" . attach_mod_sql_escape($var) . "'"; + } + else if (is_array($var) && is_string($var[0])) + { + $values[] = $var[0]; + } + else + { + $values[] = (is_bool($var)) ? intval($var) : $var; + } + } + + $query = ($query == 'INSERT') ? ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')' : ' (' . implode(', ', $fields) . ') SELECT ' . implode(', ', $values) . ' '; + } + else if ($query == 'MULTI_INSERT') + { + $ary = array(); + foreach ($assoc_ary as $id => $sql_ary) + { + $values = array(); + foreach ($sql_ary as $key => $var) + { + if (is_null($var)) + { + $values[] = 'NULL'; + } + elseif (is_string($var)) + { + $values[] = "'" . attach_mod_sql_escape($var) . "'"; + } + else + { + $values[] = (is_bool($var)) ? intval($var) : $var; + } + } + $ary[] = '(' . implode(', ', $values) . ')'; + } + + $query = ' (' . implode(', ', array_keys($assoc_ary[0])) . ') VALUES ' . implode(', ', $ary); + } + else if ($query == 'UPDATE' || $query == 'SELECT') + { + $values = array(); + foreach ($assoc_ary as $key => $var) + { + if (is_null($var)) + { + $values[] = "$key = NULL"; + } + elseif (is_string($var)) + { + $values[] = "$key = '" . attach_mod_sql_escape($var) . "'"; + } + else + { + $values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var"; + } + } + $query = implode(($query == 'UPDATE') ? ', ' : ' AND ', $values); + } + + return $query; +} \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_delete.php b/upload/attach_mod/includes/functions_delete.php new file mode 100644 index 000000000..4a6d9e9a3 --- /dev/null +++ b/upload/attach_mod/includes/functions_delete.php @@ -0,0 +1,309 @@ +sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select ids', '', __LINE__, __FILE__, $sql); + } + + $num_post_list = DB()->num_rows($result); + + if ($num_post_list == 0) + { + DB()->sql_freeresult($result); + return; + } + + while ($row = DB()->sql_fetchrow($result)) + { + $post_id_array[] = intval($row[$p_id]); + } + DB()->sql_freeresult($result); + } + + if (!is_array($post_id_array)) + { + if (trim($post_id_array) == '') + { + return; + } + + if (strstr($post_id_array, ', ')) + { + $post_id_array = explode(', ', $post_id_array); + } + else if (strstr($post_id_array, ',')) + { + $post_id_array = explode(',', $post_id_array); + } + else + { + $post_id = intval($post_id_array); + + $post_id_array = array(); + $post_id_array[] = $post_id; + } + } + + if (!sizeof($post_id_array)) + { + return; + } + + // First of all, determine the post id and attach_id + if ($attach_id_array === 0) + { + $attach_id_array = array(); + + // Get the attach_ids to fill the array + $whereclause = 'WHERE post_id IN (' . implode(', ', $post_id_array) . ')'; + + $sql = 'SELECT attach_id + FROM ' . BB_ATTACHMENTS . " $whereclause + GROUP BY attach_id"; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select Attachment Ids', '', __LINE__, __FILE__, $sql); + } + + $num_attach_list = DB()->num_rows($result); + + if ($num_attach_list == 0) + { + DB()->sql_freeresult($result); + return; + } + + while ($row = DB()->sql_fetchrow($result)) + { + $attach_id_array[] = (int) $row['attach_id']; + } + DB()->sql_freeresult($result); + } + + if (!is_array($attach_id_array)) + { + if (strstr($attach_id_array, ', ')) + { + $attach_id_array = explode(', ', $attach_id_array); + } + else if (strstr($attach_id_array, ',')) + { + $attach_id_array = explode(',', $attach_id_array); + } + else + { + $attach_id = intval($attach_id_array); + + $attach_id_array = array(); + $attach_id_array[] = $attach_id; + } + } + + if (!sizeof($attach_id_array)) + { + return; + } + + $sql_id = 'post_id'; + + if (sizeof($post_id_array) && sizeof($attach_id_array)) + { + $sql = 'DELETE FROM ' . BB_ATTACHMENTS . ' + WHERE attach_id IN (' . implode(', ', $attach_id_array) . ") + AND $sql_id IN (" . implode(', ', $post_id_array) . ')'; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, $lang['ERROR_DELETED_ATTACHMENTS'], '', __LINE__, __FILE__, $sql); + } + + //bt + if ($sql_id == 'post_id') + { + // XBTT + if($bb_cfg['announce_type'] == 'xbt') + { + $sql = "INSERT INTO ". BB_BT_TORRENTS ."_del (topic_id, info_hash) + SELECT topic_id, info_hash + FROM ". BB_BT_TORRENTS ." + WHERE attach_id IN(". implode(',', $attach_id_array) .") ON DUPLICATE KEY UPDATE is_del=1"; + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, $lang['Error_deleted_attachments'], '', __LINE__, __FILE__, $sql); + } + } + // XBTT END. + + $sql = "SELECT topic_id + FROM ". BB_BT_TORRENTS ." + WHERE attach_id IN(". implode(',', $attach_id_array) .")"; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, $lang['ERROR_DELETED_ATTACHMENTS'], '', __LINE__, __FILE__, $sql); + } + + $torrents_sql = array(); + + while ($row = DB()->sql_fetchrow($result)) + { + $torrents_sql[] = $row['topic_id']; + } + + if ($torrents_sql = implode(',', $torrents_sql)) + { + // Remove peers from tracker + $sql = "DELETE FROM ". BB_BT_TRACKER ." + WHERE topic_id IN($torrents_sql)"; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not delete peers', '', __LINE__, __FILE__, $sql); + } + } + // Delete torrents + $sql = "DELETE FROM ". BB_BT_TORRENTS ." + WHERE attach_id IN(". implode(',', $attach_id_array) .")"; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, $lang['ERROR_DELETED_ATTACHMENTS'], '', __LINE__, __FILE__, $sql); + } + } + //bt end + + for ($i = 0; $i < sizeof($attach_id_array); $i++) + { + $sql = 'SELECT attach_id + FROM ' . BB_ATTACHMENTS . ' + WHERE attach_id = ' . (int) $attach_id_array[$i]; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select Attachment Ids', '', __LINE__, __FILE__, $sql); + } + + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_rows == 0) + { + $sql = 'SELECT attach_id, physical_filename, thumbnail + FROM ' . BB_ATTACHMENTS_DESC . ' + WHERE attach_id = ' . (int) $attach_id_array[$i]; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attach description table', '', __LINE__, __FILE__, $sql); + } + $num_rows = DB()->num_rows($result); + + if ($num_rows != 0) + { + $num_attach = $num_rows; + $attachments = DB()->sql_fetchrowset($result); + DB()->sql_freeresult($result); + + // delete attachments + for ($j = 0; $j < $num_attach; $j++) + { + unlink_attach($attachments[$j]['physical_filename']); + + if (intval($attachments[$j]['thumbnail']) == 1) + { + unlink_attach($attachments[$j]['physical_filename'], MODE_THUMBNAIL); + } + + $sql = 'DELETE FROM ' . BB_ATTACHMENTS_DESC . ' + WHERE attach_id = ' . (int) $attachments[$j]['attach_id']; + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, $lang['ERROR_DELETED_ATTACHMENTS'], '', __LINE__, __FILE__, $sql); + } + } + } + else + { + DB()->sql_freeresult($result); + } + } + } + } + + // Now Sync the Topic/PM + if (sizeof($post_id_array)) + { + $sql = 'SELECT topic_id + FROM ' . BB_POSTS . ' + WHERE post_id IN (' . implode(', ', $post_id_array) . ') + GROUP BY topic_id'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t select Topic ID', '', __LINE__, __FILE__, $sql); + } + + while ($row = DB()->sql_fetchrow($result)) + { + attachment_sync_topic($row['topic_id']); + } + DB()->sql_freeresult($result); + } +} \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_filetypes.php b/upload/attach_mod/includes/functions_filetypes.php new file mode 100644 index 000000000..9c42cdd5f --- /dev/null +++ b/upload/attach_mod/includes/functions_filetypes.php @@ -0,0 +1,410 @@ += 4294967294) + { + $value -= 4294967296; + } + + return $value; +} + +/** +* Read Word (2 Bytes) from File - Note: It's an Intel Word +*/ +function read_word($fp) +{ + $data = fread($fp, 2); + + $value = ord($data[1]) * 256 + ord($data[0]); + + return $value; +} + +/** +* Read Byte +*/ +function read_byte($fp) +{ + $data = fread($fp, 1); + + $value = ord($data); + + return $value; +} + +/** +* Get Image Dimensions +*/ +function image_getdimension($file) +{ + + $size = @getimagesize($file); + + if ($size[0] != 0 || $size[1] != 0) + { + return $size; + } + + // Try to get the Dimension manually, depending on the mimetype + $fp = @fopen($file, 'rb'); + if (!$fp) + { + return $size; + } + + $error = FALSE; + + // BMP - IMAGE + + $tmp_str = fread($fp, 2); + if ($tmp_str == 'BM') + { + $length = read_longint($fp); + + if ($length <= 6) + { + $error = true; + } + + if (!$error) + { + $i = read_longint($fp); + if ( $i != 0) + { + $error = true; + } + } + + if (!$error) + { + $i = read_longint($fp); + + if ($i != 0x3E && $i != 0x76 && $i != 0x436 && $i != 0x36) + { + $error = true; + } + } + + if (!$error) + { + $tmp_str = fread($fp, 4); + $width = read_longint($fp); + $height = read_longint($fp); + + if ($width > 3000 || $height > 3000) + { + $error = true; + } + } + } + else + { + $error = true; + } + + if (!$error) + { + fclose($fp); + return array( + $width, + $height, + 6 + ); + } + + $error = false; + fclose($fp); + + // GIF - IMAGE + + $fp = @fopen($file, 'rb'); + + $tmp_str = fread($fp, 3); + + if ($tmp_str == 'GIF') + { + $tmp_str = fread($fp, 3); + $width = read_word($fp); + $height = read_word($fp); + + $info_byte = fread($fp, 1); + $info_byte = ord($info_byte); + if (($info_byte & 0x80) != 0x80 && ($info_byte & 0x80) != 0) + { + $error = true; + } + + if (!$error) + { + if (($info_byte & 8) != 0) + { + $error = true; + } + + } + } + else + { + $error = true; + } + + if (!$error) + { + fclose($fp); + return array( + $width, + $height, + 1 + ); + } + + $error = false; + fclose($fp); + + // JPG - IMAGE + $fp = @fopen($file, 'rb'); + + $tmp_str = fread($fp, 4); + $w1 = read_word($fp); + + if (intval($w1) < 16) + { + $error = true; + } + + if (!$error) + { + $tmp_str = fread($fp, 4); + if ($tmp_str == 'JFIF') + { + $o_byte = fread($fp, 1); + if (intval($o_byte) != 0) + { + $error = true; + } + + if (!$error) + { + $str = fread($fp, 2); + $b = read_byte($fp); + + if ($b != 0 && $b != 1 && $b != 2) + { + $error = true; + } + } + + if (!$error) + { + $width = read_word($fp); + $height = read_word($fp); + + if ($width <= 0 || $height <= 0) + { + $error = true; + } + } + } + } + else + { + $error = true; + } + + if (!$error) + { + fclose($fp); + return array( + $width, + $height, + 2 + ); + } + + $error = false; + fclose($fp); + + // PCX - IMAGE + + $fp = @fopen($file, 'rb'); + + $tmp_str = fread($fp, 3); + + if ((ord($tmp_str[0]) == 10) && (ord($tmp_str[1]) == 0 || ord($tmp_str[1]) == 2 || ord($tmp_str[1]) == 3 || ord($tmp_str[1]) == 4 || ord($tmp_str[1]) == 5) && (ord($tmp_str[2]) == 1)) + { + $b = fread($fp, 1); + + if (ord($b) != 1 && ord($b) != 2 && ord($b) != 4 && ord($b) != 8 && ord($b) != 24) + { + $error = true; + } + + if (!$error) + { + $xmin = read_word($fp); + $ymin = read_word($fp); + $xmax = read_word($fp); + $ymax = read_word($fp); + $tmp_str = fread($fp, 52); + + $b = fread($fp, 1); + if ($b != 0) + { + $error = true; + } + } + + if (!$error) + { + $width = $xmax - $xmin + 1; + $height = $ymax - $ymin + 1; + } + } + else + { + $error = true; + } + + if (!$error) + { + fclose($fp); + return array( + $width, + $height, + 7 + ); + } + + fclose($fp); + + return $size; +} + +/** +* Flash MX Support +* Routines and Methods are from PhpAdsNew (www.sourceforge.net/projects/phpadsnew) +*/ + +/** +*/ +define('swf_tag_compressed', chr(0x43).chr(0x57).chr(0x53)); +define('swf_tag_identify', chr(0x46).chr(0x57).chr(0x53)); + +/** +* Get flash bits +*/ +function swf_bits($buffer, $pos, $count) +{ + $result = 0; + + for ($loop = $pos; $loop < $pos + $count; $loop++) + { + $result = $result + ((((ord($buffer[(int)($loop / 8)])) >> (7 - ($loop % 8))) & 0x01) << ($count - ($loop - $pos) - 1)); + } + + return $result; +} + +/** +* decompress flash contents +*/ +function swf_decompress($buffer) +{ + if ((function_exists('gzuncompress')) && (substr($buffer, 0, 3) == swf_tag_compressed) && (ord(substr($buffer, 3, 1)) >= 6) ) + { + // Only decompress relevant Informations + $output = 'F'; + $output .= substr ($buffer, 1, 7); + $output .= gzuncompress (substr ($buffer, 8)); + + return $output; + } + else + { + return $buffer; + } +} + +/** +* Get flash dimension +*/ +function swf_getdimension($file) +{ + $size = @getimagesize($file); + + if ($size[0] != 0 || $size[1] != 0) + { + return $size; + } + + // Try to get the Dimension manually + $fp = @fopen($file, 'rb'); + if (!$fp) + { + return $size; + } + + $error = false; + + // SWF - FLASH FILE + $fp = @fopen($file, 'rb'); + + // Decompress if file is a Flash MX compressed file + $buffer = fread($fp, 1024); + + if (substr($buffer, 0, 3) == swf_tag_identify || substr($buffer, 0, 3) == swf_tag_compressed) + { + if (substr($buffer, 0, 3) == swf_tag_compressed) + { + fclose($fp); + $fp = @fopen($file, 'rb'); + $buffer = fread($fp, filesize($file)); + $buffer = swf_decompress($buffer); + } + + // Get size of rect structure + $bits = swf_bits ($buffer, 64, 5); + + // Get rect + $width = (int)(swf_bits ($buffer, 69 + $bits, $bits) - swf_bits ($buffer, 69, $bits)) / 20; + $height = (int)(swf_bits ($buffer, 69 + (3 * $bits), $bits) - swf_bits ($buffer, 69 + (2 * $bits), $bits)) / 20; + } + else + { + $error = true; + } + + if (!$error) + { + fclose($fp); + return array( + $width, + $height, + 2 + ); + } + + fclose($fp); + + return $size; +} \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_includes.php b/upload/attach_mod/includes/functions_includes.php new file mode 100644 index 000000000..c7fbde396 --- /dev/null +++ b/upload/attach_mod/includes/functions_includes.php @@ -0,0 +1,472 @@ +Rules)'; +// $s_auth_can .= ( ( $is_auth['auth_attachments'] ) ? $rules_link . ' ' . $lang['RULES_ATTACH_CAN'] : $lang['RULES_ATTACH_CANNOT'] ) . '
'; + $s_auth_can .= (($is_auth['auth_attachments']) ? $lang['RULES_ATTACH_CAN'] : $lang['RULES_ATTACH_CANNOT'] ) . '
'; + + $s_auth_can .= (($is_auth['auth_download']) ? $lang['RULES_DOWNLOAD_CAN'] : $lang['RULES_DOWNLOAD_CANNOT'] ) . '
'; +} + +/** +* Called from admin_users.php and admin_groups.php in order to process Quota Settings (admin/admin_users.php:admin/admin_groups.php) +*/ +function attachment_quota_settings($admin_mode, $submit = false, $mode) +{ + global $template, $lang, $attach_config; + + if (!intval($attach_config['allow_ftp_upload'])) + { + if ($attach_config['upload_dir'][0] == '/' || ($attach_config['upload_dir'][0] != '/' && $attach_config['upload_dir'][1] == ':')) + { + $upload_dir = $attach_config['upload_dir']; + } + else + { + $upload_dir = BB_ROOT . $attach_config['upload_dir']; + } + } + else + { + $upload_dir = $attach_config['download_path']; + } + + include(BB_ROOT .'attach_mod/includes/functions_selects.php'); + if (!function_exists("process_quota_settings")) + include(BB_ROOT . 'attach_mod/includes/functions_admin.php'); + + $user_id = 0; + + if ($admin_mode == 'user') + { + // We overwrite submit here... to be sure + $submit = (isset($_POST['submit'])) ? true : false; + + if (!$submit && $mode != 'save') + { + $user_id = get_var(POST_USERS_URL, 0); + $u_name = get_var('username', ''); + + if (!$user_id && !$u_name) + { + message_die(GENERAL_MESSAGE, $lang['NO_USER_ID_SPECIFIED'] ); + } + + if ($user_id) + { + $this_userdata['user_id'] = $user_id; + } + else + { + // Get userdata is handling the sanitizing of username + $this_userdata = get_userdata($_POST['username'], true); + } + + $user_id = (int) $this_userdata['user_id']; + } + else + { + $user_id = get_var('id', 0); + + if (!$user_id) + { + message_die(GENERAL_MESSAGE, $lang['NO_USER_ID_SPECIFIED'] ); + } + } + } + + if ($admin_mode == 'user' && !$submit && $mode != 'save') + { + // Show the contents + $sql = 'SELECT quota_limit_id, quota_type FROM ' . BB_QUOTA . ' + WHERE user_id = ' . (int) $user_id; + + if( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Unable to get Quota Settings', '', __LINE__, __FILE__, $sql); + } + + $pm_quota = $upload_quota = 0; + + if ($row = DB()->sql_fetchrow($result)) + { + do + { + if ($row['quota_type'] == QUOTA_UPLOAD_LIMIT) + { + $upload_quota = $row['quota_limit_id']; + } + else if ($row['quota_type'] == QUOTA_PM_LIMIT) + { + $pm_quota = $row['quota_limit_id']; + } + } + while ($row = DB()->sql_fetchrow($result)); + } + else + { + // Set Default Quota Limit + $upload_quota = $attach_config['default_upload_quota']; + $pm_quota = $attach_config['default_pm_quota']; + + } + DB()->sql_freeresult($result); + + $template->assign_vars(array( + 'S_SELECT_UPLOAD_QUOTA' => quota_limit_select('user_upload_quota', $upload_quota), + 'S_SELECT_PM_QUOTA' => quota_limit_select('user_pm_quota', $pm_quota), + )); + } + + if ($admin_mode == 'user' && $submit && @$_POST['deleteuser']) + { + process_quota_settings($admin_mode, $user_id, QUOTA_UPLOAD_LIMIT, 0); + process_quota_settings($admin_mode, $user_id, QUOTA_PM_LIMIT, 0); + } + else if ($admin_mode == 'user' && $submit && $mode == 'save') + { + // Get the contents + $upload_quota = get_var('user_upload_quota', 0); + $pm_quota = get_var('user_pm_quota', 0); + + process_quota_settings($admin_mode, $user_id, QUOTA_UPLOAD_LIMIT, $upload_quota); + process_quota_settings($admin_mode, $user_id, QUOTA_PM_LIMIT, $pm_quota); + } + + if ($admin_mode == 'group' && $mode == 'newgroup') + { + return; + } + + if ($admin_mode == 'group' && !$submit && isset($_POST['edit'])) + { + // Get group id again, we do not trust phpBB here, Mods may be installed ;) + $group_id = get_var(POST_GROUPS_URL, 0); + + // Show the contents + $sql = 'SELECT quota_limit_id, quota_type FROM ' . BB_QUOTA . ' + WHERE group_id = ' . (int) $group_id; + + if( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Unable to get Quota Settings', '', __LINE__, __FILE__, $sql); + } + + $pm_quota = $upload_quota = 0; + + if ($row = DB()->sql_fetchrow($result)) + { + do + { + if ($row['quota_type'] == QUOTA_UPLOAD_LIMIT) + { + $upload_quota = $row['quota_limit_id']; + } + else if ($row['quota_type'] == QUOTA_PM_LIMIT) + { + $pm_quota = $row['quota_limit_id']; + } + } + while ($row = DB()->sql_fetchrow($result)); + } + else + { + // Set Default Quota Limit + $upload_quota = $attach_config['default_upload_quota']; + $pm_quota = $attach_config['default_pm_quota']; + } + DB()->sql_freeresult($result); + + $template->assign_vars(array( + 'S_SELECT_UPLOAD_QUOTA' => quota_limit_select('group_upload_quota', $upload_quota), + 'S_SELECT_PM_QUOTA' => quota_limit_select('group_pm_quota', $pm_quota), + )); + } + + if ($admin_mode == 'group' && $submit && isset($_POST['group_delete'])) + { + $group_id = get_var(POST_GROUPS_URL, 0); + + process_quota_settings($admin_mode, $group_id, QUOTA_UPLOAD_LIMIT, 0); + process_quota_settings($admin_mode, $group_id, QUOTA_PM_LIMIT, 0); + } + else if ($admin_mode == 'group' && $submit) + { + $group_id = get_var(POST_GROUPS_URL, 0); + + // Get the contents + $upload_quota = get_var('group_upload_quota', 0); + $pm_quota = get_var('group_pm_quota', 0); + + process_quota_settings($admin_mode, $group_id, QUOTA_UPLOAD_LIMIT, $upload_quota); + process_quota_settings($admin_mode, $group_id, QUOTA_PM_LIMIT, $pm_quota); + } + +} + +/** +* Called from usercp_viewprofile, displays the User Upload Quota Box, Upload Stats and a Link to the User Attachment Control Panel +* Groups are able to be grabbed, but it's not used within the Attachment Mod. ;) +* (includes/usercp_viewprofile.php) +*/ +function display_upload_attach_box_limits($user_id, $group_id = 0) +{ + global $attach_config, $bb_cfg, $lang, $template, $userdata, $profiledata; + + if (intval($attach_config['disable_mod'])) + { + return; + } + + if (!IS_ADMIN && $userdata['user_id'] != $user_id) + { + return; + } + + if (!$user_id) + { + return; + } + + // Return if the user is not within the to be listed Group + if ($group_id) + { + if (!user_in_group($user_id, $group_id)) + { + return; + } + } + + $user_id = (int) $user_id; + $group_id = (int) $group_id; + + $attachments = new attach_posting(); + $attachments->page = 0; + + // Get the assigned Quota Limit. For Groups, we are directly getting the value, because this Quota can change from user to user. + if ($group_id) + { + $sql = 'SELECT l.quota_limit + FROM ' . BB_QUOTA . ' q, ' . BB_QUOTA_LIMITS . ' l + WHERE q.group_id = ' . (int) $group_id . ' + AND q.quota_type = ' . QUOTA_UPLOAD_LIMIT . ' + AND q.quota_limit_id = l.quota_limit_id + LIMIT 1'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Group Quota', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) > 0) + { + $row = DB()->sql_fetchrow($result); + $attach_config['upload_filesize_limit'] = intval($row['quota_limit']); + DB()->sql_freeresult($result); + } + else + { + DB()->sql_freeresult($result); + + // Set Default Quota Limit + $quota_id = intval($attach_config['default_upload_quota']); + + if ($quota_id == 0) + { + $attach_config['upload_filesize_limit'] = $attach_config['attachment_quota']; + } + else + { + $sql = 'SELECT quota_limit + FROM ' . BB_QUOTA_LIMITS . ' + WHERE quota_limit_id = ' . (int) $quota_id . ' + LIMIT 1'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get Quota Limit', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) > 0) + { + $row = DB()->sql_fetchrow($result); + $attach_config['upload_filesize_limit'] = $row['quota_limit']; + } + else + { + $attach_config['upload_filesize_limit'] = $attach_config['attachment_quota']; + } + DB()->sql_freeresult($result); + } + } + } + else + { + if (is_array($profiledata)) + { + $attachments->get_quota_limits($profiledata, $user_id); + } + else + { + $attachments->get_quota_limits($userdata, $user_id); + } + } + + if (!$attach_config['upload_filesize_limit']) + { + $upload_filesize_limit = $attach_config['attachment_quota']; + } + else + { + $upload_filesize_limit = $attach_config['upload_filesize_limit']; + } + + if ($upload_filesize_limit == 0) + { + $user_quota = $lang['UNLIMITED']; + } + else + { + $size_lang = ($upload_filesize_limit >= 1048576) ? $lang['MB'] : ( ($upload_filesize_limit >= 1024) ? $lang['KB'] : $lang['BYTES'] ); + + if ($upload_filesize_limit >= 1048576) + { + $user_quota = (round($upload_filesize_limit / 1048576 * 100) / 100) . ' ' . $size_lang; + } + else if ($upload_filesize_limit >= 1024) + { + $user_quota = (round($upload_filesize_limit / 1024 * 100) / 100) . ' ' . $size_lang; + } + else + { + $user_quota = ($upload_filesize_limit) . ' ' . $size_lang; + } + } + + // Get all attach_id's the specific user posted, but only uploads to the board and not Private Messages + $sql = 'SELECT attach_id + FROM ' . BB_ATTACHMENTS . ' + WHERE user_id_1 = ' . (int) $user_id . ' + GROUP BY attach_id'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attachments', '', __LINE__, __FILE__, $sql); + } + + $attach_ids = DB()->sql_fetchrowset($result); + $num_attach_ids = DB()->num_rows($result); + DB()->sql_freeresult($result); + $attach_id = array(); + + for ($j = 0; $j < $num_attach_ids; $j++) + { + $attach_id[] = intval($attach_ids[$j]['attach_id']); + } + + $upload_filesize = (sizeof($attach_id) > 0) ? get_total_attach_filesize($attach_id) : 0; + + $size_lang = ($upload_filesize >= 1048576) ? $lang['MB'] : ( ($upload_filesize >= 1024) ? $lang['KB'] : $lang['BYTES'] ); + + if ($upload_filesize >= 1048576) + { + $user_uploaded = (round($upload_filesize / 1048576 * 100) / 100) . ' ' . $size_lang; + } + else if ($upload_filesize >= 1024) + { + $user_uploaded = (round($upload_filesize / 1024 * 100) / 100) . ' ' . $size_lang; + } + else + { + $user_uploaded = ($upload_filesize) . ' ' . $size_lang; + } + + $upload_limit_pct = ( $upload_filesize_limit > 0 ) ? round(( $upload_filesize / $upload_filesize_limit ) * 100) : 0; + $upload_limit_img_length = ( $upload_filesize_limit > 0 ) ? round(( $upload_filesize / $upload_filesize_limit ) * $bb_cfg['privmsg_graphic_length']) : 0; + if ($upload_limit_pct > 100) + { + $upload_limit_img_length = $bb_cfg['privmsg_graphic_length']; + } + $upload_limit_remain = ( $upload_filesize_limit > 0 ) ? $upload_filesize_limit - $upload_filesize : 100; + + $l_box_size_status = sprintf($lang['UPLOAD_PERCENT_PROFILE'], $upload_limit_pct); + + $template->assign_block_vars('switch_upload_limits', array()); + + $template->assign_vars(array( + 'L_UACP' => $lang['UACP'], + 'U_UACP' => BB_ROOT ."profile.php?mode=attachcp&u=$user_id&sid={$userdata['session_id']}", + 'UPLOADED' => sprintf($lang['USER_UPLOADED_PROFILE'], $user_uploaded), + 'QUOTA' => sprintf($lang['USER_QUOTA_PROFILE'], $user_quota), + 'UPLOAD_LIMIT_IMG_WIDTH' => $upload_limit_img_length, + 'UPLOAD_LIMIT_PERCENT' => $upload_limit_pct, + 'PERCENT_FULL' => $l_box_size_status, + )); +} + +/** +* Prune Attachments (includes/prune.php) +*/ +function prune_attachments($sql_post) +{ + delete_attachment($sql_post); +} \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_selects.php b/upload/attach_mod/includes/functions_selects.php new file mode 100644 index 000000000..5e3d45783 --- /dev/null +++ b/upload/attach_mod/includes/functions_selects.php @@ -0,0 +1,266 @@ +sql_query($sql))) + { + message_die(GENERAL_ERROR, "Couldn't query Extension Groups Table", "", __LINE__, __FILE__, $sql); + } + + $group_select = ''; + + return $group_select; +} + +/** +* select download mode +*/ +function download_select($select_name, $group_id = 0) +{ + global $types_download, $modes_download; + + if ($group_id) + { + $sql = 'SELECT download_mode + FROM ' . BB_EXTENSION_GROUPS . ' + WHERE group_id = ' . (int) $group_id; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, "Couldn't query Extension Groups Table", "", __LINE__, __FILE__, $sql); + } + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + if (!isset($row['download_mode'])) + { + return ''; + } + + $download_mode = $row['download_mode']; + } + + $group_select = ''; + + return $group_select; +} + +/** +* select category types +*/ +function category_select($select_name, $group_id = 0) +{ + global $types_category, $modes_category; + + $sql = 'SELECT group_id, cat_id + FROM ' . BB_EXTENSION_GROUPS; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Couldn't select Category", "", __LINE__, __FILE__, $sql); + } + + $rows = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + $type_category = 0; + + if ($num_rows > 0) + { + for ($i = 0; $i < $num_rows; $i++) + { + if ($group_id == $rows[$i]['group_id']) + { + $category_type = $rows[$i]['cat_id']; + } + } + } + + $types = array(NONE_CAT); + $modes = array('none'); + + for ($i = 0; $i < sizeof($types_category); $i++) + { + $types[] = $types_category[$i]; + $modes[] = $modes_category[$i]; + } + + $group_select = ''; + + return $group_select; +} + +/** +* Select size mode +*/ +function size_select($select_name, $size_compare) +{ + global $lang; + + $size_types_text = array($lang['BYTES'], $lang['KB'], $lang['MB']); + $size_types = array('b', 'kb', 'mb'); + + $select_field = ''; + + return $select_field; +} + +/** +* select quota limit +*/ +function quota_limit_select($select_name, $default_quota = 0) +{ + global $lang; + + $sql = 'SELECT quota_limit_id, quota_desc + FROM ' . BB_QUOTA_LIMITS . ' + ORDER BY quota_limit ASC'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Couldn't query Quota Limits Table", "", __LINE__, __FILE__, $sql); + } + + $quota_select = ''; + + return $quota_select; +} + +/** +* select default quota limit +*/ +function default_quota_limit_select($select_name, $default_quota = 0) +{ + global $lang; + + $sql = 'SELECT quota_limit_id, quota_desc + FROM ' . BB_QUOTA_LIMITS . ' + ORDER BY quota_limit ASC'; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Couldn't query Quota Limits Table", "", __LINE__, __FILE__, $sql); + } + + $quota_select = ''; + + return $quota_select; +} \ No newline at end of file diff --git a/upload/attach_mod/includes/functions_thumbs.php b/upload/attach_mod/includes/functions_thumbs.php new file mode 100644 index 000000000..f8771741c --- /dev/null +++ b/upload/attach_mod/includes/functions_thumbs.php @@ -0,0 +1,247 @@ + $height) + { + return array( + round($width * ($max_width / $width)), + round($height * ($max_width / $width)) + ); + } + else + { + return array( + round($width * ($max_width / $height)), + round($height * ($max_width / $height)) + ); + } +} + +/** +* Check if imagick is present +*/ +function is_imagick() +{ + global $imagick, $attach_config; + + if ($attach_config['img_imagick'] != '') + { + $imagick = $attach_config['img_imagick']; + return true; + } + else + { + return false; + } +} + +/** +* Get supported image types +*/ +function get_supported_image_types($type) +{ + if (@extension_loaded('gd')) + { + $format = imagetypes(); + $new_type = 0; + + switch ($type) + { + case 1: + $new_type = ($format & IMG_GIF) ? IMG_GIF : 0; + break; + case 2: + case 9: + case 10: + case 11: + case 12: + $new_type = ($format & IMG_JPG) ? IMG_JPG : 0; + break; + case 3: + $new_type = ($format & IMG_PNG) ? IMG_PNG : 0; + break; + case 6: + case 15: + $new_type = ($format & IMG_WBMP) ? IMG_WBMP : 0; + break; + } + + return array( + 'gd' => ($new_type) ? true : false, + 'format' => $new_type, + 'version' => (function_exists('imagecreatetruecolor')) ? 2 : 1 + ); + } + + return array('gd' => false); +} + +/** +* Create thumbnail +*/ +function create_thumbnail($source, $new_file, $mimetype) +{ + global $attach_config, $imagick; + + $source = amod_realpath($source); + $min_filesize = (int) $attach_config['img_min_thumb_filesize']; + $img_filesize = (@file_exists($source)) ? @filesize($source) : false; + + if (!$img_filesize || $img_filesize <= $min_filesize) + { + return false; + } + + list($width, $height, $type, ) = getimagesize($source); + + if (!$width || !$height) + { + return false; + } + + list($new_width, $new_height) = get_img_size_format($width, $height); + + $tmp_path = $old_file = ''; + + if (intval($attach_config['allow_ftp_upload'])) + { + $old_file = $new_file; + + $tmp_path = explode('/', $source); + $tmp_path[count($tmp_path)-1] = ''; + $tmp_path = implode('/', $tmp_path); + + if ($tmp_path == '') + { + $tmp_path = '/tmp'; + } + + $value = trim($tmp_path); + + if ($value[strlen($value)-1] == '/') + { + $value[strlen($value)-1] = ' '; + } + + // + $new_file = tempnam(trim($value), 't00000'); + + // We remove it now because it gets created again later + @unlink($new_file); + } + + $used_imagick = false; + + if (is_imagick()) + { + passthru($imagick . ' -quality 85 -antialias -sample ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $new_file) . '"'); + if (@file_exists($new_file)) + { + $used_imagick = true; + } + } + + if (!$used_imagick) + { + $type = get_supported_image_types($type); + + if ($type['gd']) + { + switch ($type['format']) + { + case IMG_GIF: + $image = imagecreatefromgif($source); + break; + case IMG_JPG: + $image = imagecreatefromjpeg($source); + break; + case IMG_PNG: + $image = imagecreatefrompng($source); + break; + case IMG_WBMP: + $image = imagecreatefromwbmp($source); + break; + } + + if ($type['version'] == 1 || !$attach_config['use_gd2']) + { + $new_image = imagecreate($new_width, $new_height); + imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + } + else + { + $new_image = imagecreatetruecolor($new_width, $new_height); + imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + } + + switch ($type['format']) + { + case IMG_GIF: + imagegif($new_image, $new_file); + break; + case IMG_JPG: + imagejpeg($new_image, $new_file, 90); + break; + case IMG_PNG: + imagepng($new_image, $new_file); + break; + case IMG_WBMP: + imagewbmp($new_image, $new_file); + break; + } + + imagedestroy($new_image); + } + } + + if (!@file_exists($new_file)) + { + return false; + } + + if (intval($attach_config['allow_ftp_upload'])) + { + $result = ftp_file($new_file, $old_file, $mimetype, true); // True for disable error-mode + @unlink($new_file); + + if (!$result) + { + return false; + } + } + else + { + @chmod($new_file, 0664); + } + + return true; +} \ No newline at end of file diff --git a/upload/attach_mod/posting_attachments.php b/upload/attach_mod/posting_attachments.php new file mode 100644 index 000000000..2320db08b --- /dev/null +++ b/upload/attach_mod/posting_attachments.php @@ -0,0 +1,1460 @@ +add_attachment_body = get_var('add_attachment_body', 0); + $this->posted_attachments_body = get_var('posted_attachments_body', 0); + + $this->file_comment = get_var('filecomment', ''); + $this->attachment_id_list = get_var('attach_id_list', array(0)); + $this->attachment_comment_list = get_var('comment_list', array('')); + $this->attachment_filesize_list = get_var('filesize_list', array(0)); + $this->attachment_filetime_list = get_var('filetime_list', array(0)); + $this->attachment_filename_list = get_var('filename_list', array('')); + $this->attachment_extension_list = get_var('extension_list', array('')); + $this->attachment_mimetype_list = get_var('mimetype_list', array('')); + + $this->filename = (isset($_FILES['fileupload']) && isset($_FILES['fileupload']['name']) && $_FILES['fileupload']['name'] != 'none') ? trim(stripslashes($_FILES['fileupload']['name'])) : ''; + + $this->attachment_list = get_var('attachment_list', array('')); + $this->attachment_thumbnail_list = get_var('attach_thumbnail_list', array(0)); + } + + /** + * Get Quota Limits + */ + function get_quota_limits($userdata_quota, $user_id = 0) + { + global $attach_config; + + // + // Define Filesize Limits (Prepare Quota Settings) + // Priority: User, Group, Management + // + // This method is somewhat query intensive, but i think because this one is only executed while attaching a file, + // it does not make much sense to come up with an new db-entry. + // Maybe i will change this in a future version, where you are able to disable the User Quota Feature at all (using + // Default Limits for all Users/Groups) + // + + // Change this to 'group;user' if you want to have first priority on group quota settings. +// $priority = 'group;user'; + $priority = 'user;group'; + + if (IS_ADMIN) + { + $attach_config['pm_filesize_limit'] = 0; // Unlimited + $attach_config['upload_filesize_limit'] = 0; // Unlimited + return; + } + + $quota_type = QUOTA_UPLOAD_LIMIT; + $limit_type = 'upload_filesize_limit'; + $default = 'attachment_quota'; + + if (!$user_id) + { + $user_id = intval($userdata_quota['user_id']); + } + + $priority = explode(';', $priority); + $found = false; + + for ($i = 0; $i < sizeof($priority); $i++) + { + if (($priority[$i] == 'group') && (!$found)) + { + // Get Group Quota, if we find one, we have our quota + $sql = 'SELECT u.group_id + FROM ' . BB_USER_GROUP . ' u, ' . BB_GROUPS . ' g + WHERE g.group_single_user = 0 + AND u.user_pending = 0 + AND u.group_id = g.group_id + AND u.user_id = ' . $user_id; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get User Group', '', __LINE__, __FILE__, $sql); + } + + $rows = DB()->sql_fetchrowset($result); + $num_rows = DB()->num_rows($result); + DB()->sql_freeresult($result); + + if ($num_rows > 0) + { + $group_id = array(); + + for ($j = 0; $j < $num_rows; $j++) + { + $group_id[] = (int) $rows[$j]['group_id']; + } + + $sql = 'SELECT l.quota_limit + FROM ' . BB_QUOTA . ' q, ' . BB_QUOTA_LIMITS . ' l + WHERE q.group_id IN (' . implode(', ', $group_id) . ') + AND q.group_id <> 0 + AND q.quota_type = ' . $quota_type . ' + AND q.quota_limit_id = l.quota_limit_id + ORDER BY l.quota_limit DESC + LIMIT 1'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get Group Quota', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) > 0) + { + $row = DB()->sql_fetchrow($result); + $attach_config[$limit_type] = $row['quota_limit']; + $found = TRUE; + } + DB()->sql_freeresult($result); + } + } + + if ($priority[$i] == 'user' && !$found) + { + // Get User Quota, if the user is not in a group or the group has no quotas + $sql = 'SELECT l.quota_limit + FROM ' . BB_QUOTA . ' q, ' . BB_QUOTA_LIMITS . ' l + WHERE q.user_id = ' . $user_id . ' + AND q.user_id <> 0 + AND q.quota_type = ' . $quota_type . ' + AND q.quota_limit_id = l.quota_limit_id + LIMIT 1'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get User Quota', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) > 0) + { + $row = DB()->sql_fetchrow($result); + $attach_config[$limit_type] = $row['quota_limit']; + $found = TRUE; + } + DB()->sql_freeresult($result); + } + } + + if (!$found) + { + // Set Default Quota Limit + $quota_id = ($quota_type == QUOTA_UPLOAD_LIMIT) ? $attach_config['default_upload_quota'] : $attach_config['default_pm_quota']; + + if ($quota_id == 0) + { + $attach_config[$limit_type] = $attach_config[$default]; + } + else + { + $sql = 'SELECT quota_limit + FROM ' . BB_QUOTA_LIMITS . ' + WHERE quota_limit_id = ' . (int) $quota_id . ' + LIMIT 1'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get Default Quota Limit', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) > 0) + { + $row = DB()->sql_fetchrow($result); + $attach_config[$limit_type] = $row['quota_limit']; + } + else + { + $attach_config[$limit_type] = $attach_config[$default]; + } + DB()->sql_freeresult($result); + } + } + + // Never exceed the complete Attachment Upload Quota + if ($quota_type == QUOTA_UPLOAD_LIMIT) + { + if ($attach_config[$limit_type] > $attach_config[$default]) + { + $attach_config[$limit_type] = $attach_config[$default]; + } + } + } + + /** + * Handle all modes... (intern) + * @private + */ + function handle_attachments($mode) + { + global $is_auth, $attach_config, $refresh, $post_id, $submit, $preview, $error, $error_msg, $lang, $template, $userdata; + + // + // ok, what shall we do ;) + // + + if (IS_ADMIN) + { + $max_attachments = ADMIN_MAX_ATTACHMENTS; + } + else + { + $max_attachments = intval($attach_config['max_attachments']); + } + + $sql_id = 'post_id'; + + // nothing, if the user is not authorized or attachment mod disabled + if (intval($attach_config['disable_mod']) || !$is_auth['auth_attachments']) + { + return false; + } + + // Init Vars + $attachments = array(); + + if (!$refresh) + { + $add = (isset($_POST['add_attachment'])) ? TRUE : FALSE; + $delete = (isset($_POST['del_attachment'])) ? TRUE : FALSE; + $edit = ( isset($_POST['edit_comment']) ) ? TRUE : FALSE; + $update_attachment = ( isset($_POST['update_attachment']) ) ? TRUE : FALSE; + $del_thumbnail = ( isset($_POST['del_thumbnail']) ) ? TRUE : FALSE; + + $add_attachment_box = (!empty($_POST['add_attachment_box'])) ? TRUE : FALSE; + $posted_attachments_box = (!empty($_POST['posted_attachments_box'])) ? TRUE : FALSE; + + $refresh = $add || $delete || $edit || $del_thumbnail || $update_attachment || $add_attachment_box || $posted_attachments_box; + } + + // Get Attachments + $attachments = get_attachments_from_post($post_id); + + $auth = ($is_auth['auth_edit'] || $is_auth['auth_mod']) ? TRUE : FALSE; + + if (!$submit && $mode == 'editpost' && $auth) + { + if (!$refresh && !$preview && !$error && !isset($_POST['del_poll_option'])) + { + for ($i = 0; $i < sizeof($attachments); $i++) + { + $this->attachment_list[] = $attachments[$i]['physical_filename']; + $this->attachment_comment_list[] = $attachments[$i]['comment']; + $this->attachment_filename_list[] = $attachments[$i]['real_filename']; + $this->attachment_extension_list[] = $attachments[$i]['extension']; + $this->attachment_mimetype_list[] = $attachments[$i]['mimetype']; + $this->attachment_filesize_list[] = $attachments[$i]['filesize']; + $this->attachment_filetime_list[] = $attachments[$i]['filetime']; + $this->attachment_id_list[] = $attachments[$i]['attach_id']; + $this->attachment_thumbnail_list[] = $attachments[$i]['thumbnail']; + } + } + } + + $this->num_attachments = sizeof($this->attachment_list); + + if ($submit && $mode != 'vote') + { + if ($mode == 'newtopic' || $mode == 'reply' || $mode == 'editpost') + { + if ($this->filename != '') + { + if ($this->num_attachments < intval($max_attachments)) + { + $this->upload_attachment($this->page); + + if (!$error && $this->post_attach) + { + array_unshift($this->attachment_list, $this->attach_filename); + array_unshift($this->attachment_comment_list, $this->file_comment); + array_unshift($this->attachment_filename_list, $this->filename); + array_unshift($this->attachment_extension_list, $this->extension); + array_unshift($this->attachment_mimetype_list, $this->type); + array_unshift($this->attachment_filesize_list, $this->filesize); + array_unshift($this->attachment_filetime_list, $this->filetime); + array_unshift($this->attachment_id_list, '0'); + array_unshift($this->attachment_thumbnail_list, $this->thumbnail); + + $this->file_comment = ''; + + // This Variable is set to FALSE here, because the Attachment Mod enter Attachments into the + // Database in two modes, one if the id_list is 0 and the second one if post_attach is true + // Since post_attach is automatically switched to true if an Attachment got added to the filesystem, + // but we are assigning an id of 0 here, we have to reset the post_attach variable to FALSE. + // + // This is very relevant, because it could happen that the post got not submitted, but we do not + // know this circumstance here. We could be at the posting page or we could be redirected to the entered + // post. :) + $this->post_attach = FALSE; + } + } + else + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['TOO_MANY_ATTACHMENTS'], intval($max_attachments)); + } + } + } + } + + if ($preview || $refresh || $error) + { + $delete_attachment = ( isset($_POST['del_attachment']) ) ? TRUE : FALSE; + $delete_thumbnail = (isset($_POST['del_thumbnail'])) ? TRUE : FALSE; + + $add_attachment = (isset($_POST['add_attachment'])) ? TRUE : FALSE; + $edit_attachment = (isset($_POST['edit_comment'])) ? TRUE : FALSE; + $update_attachment = (isset($_POST['update_attachment']) ) ? TRUE : FALSE; + + // Perform actions on temporary attachments + if ($delete_attachment || $delete_thumbnail) + { + // store old values + $actual_id_list = get_var('attach_id_list', array(0)); + $actual_comment_list = get_var('comment_list', array('')); + $actual_filename_list = get_var('filename_list', array('')); + $actual_extension_list = get_var('extension_list', array('')); + $actual_mimetype_list = get_var('mimetype_list', array('')); + $actual_filesize_list = get_var('filesize_list', array(0)); + $actual_filetime_list = get_var('filetime_list', array(0)); + + $actual_list = get_var('attachment_list', array('')); + $actual_thumbnail_list = get_var('attach_thumbnail_list', array(0)); + + // clean values + $this->attachment_list = array(); + $this->attachment_comment_list = array(); + $this->attachment_filename_list = array(); + $this->attachment_extension_list = array(); + $this->attachment_mimetype_list = array(); + $this->attachment_filesize_list = array(); + $this->attachment_filetime_list = array(); + $this->attachment_id_list = array(); + $this->attachment_thumbnail_list = array(); + + // restore values :) + if (isset($_POST['attachment_list'])) + { + for ($i = 0; $i < sizeof($actual_list); $i++) + { + $restore = FALSE; + $del_thumb = FALSE; + + if ($delete_thumbnail) + { + if ( !isset($_POST['del_thumbnail'][$actual_list[$i]]) ) + { + $restore = TRUE; + } + else + { + $del_thumb = TRUE; + } + } + if ( $delete_attachment ) + { + if ( !isset($_POST['del_attachment'][$actual_list[$i]]) ) + { + $restore = TRUE; + } + } + + if ( $restore ) + { + $this->attachment_list[] = $actual_list[$i]; + $this->attachment_comment_list[] = $actual_comment_list[$i]; + $this->attachment_filename_list[] = $actual_filename_list[$i]; + $this->attachment_extension_list[] = $actual_extension_list[$i]; + $this->attachment_mimetype_list[] = $actual_mimetype_list[$i]; + $this->attachment_filesize_list[] = $actual_filesize_list[$i]; + $this->attachment_filetime_list[] = $actual_filetime_list[$i]; + $this->attachment_id_list[] = $actual_id_list[$i]; + $this->attachment_thumbnail_list[] = $actual_thumbnail_list[$i]; + } + else if (!$del_thumb) + { + // delete selected attachment + if ($actual_id_list[$i] == '0' ) + { + unlink_attach($actual_list[$i]); + + if ($actual_thumbnail_list[$i] == 1) + { + unlink_attach($actual_list[$i], MODE_THUMBNAIL); + } + } + else + { + delete_attachment($post_id, $actual_id_list[$i], $this->page); + } + } + else if ($del_thumb) + { + // delete selected thumbnail + $this->attachment_list[] = $actual_list[$i]; + $this->attachment_comment_list[] = $actual_comment_list[$i]; + $this->attachment_filename_list[] = $actual_filename_list[$i]; + $this->attachment_extension_list[] = $actual_extension_list[$i]; + $this->attachment_mimetype_list[] = $actual_mimetype_list[$i]; + $this->attachment_filesize_list[] = $actual_filesize_list[$i]; + $this->attachment_filetime_list[] = $actual_filetime_list[$i]; + $this->attachment_id_list[] = $actual_id_list[$i]; + $this->attachment_thumbnail_list[] = 0; + + if ($actual_id_list[$i] == 0) + { + unlink_attach($actual_list[$i], MODE_THUMBNAIL); + } + else + { + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . ' + SET thumbnail = 0 + WHERE attach_id = ' . (int) $actual_id_list[$i]; + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to update ' . BB_ATTACHMENTS_DESC . ' Table.', '', __LINE__, __FILE__, $sql); + } + } + } + } + } + } + else if ($edit_attachment || $update_attachment || $add_attachment || $preview) + { + if ($edit_attachment) + { + $actual_comment_list = get_var('comment_list', array('')); + + $this->attachment_comment_list = array(); + + for ($i = 0; $i < sizeof($this->attachment_list); $i++) + { + $this->attachment_comment_list[$i] = $actual_comment_list[$i]; + } + } + + if ($update_attachment) + { + if ($this->filename == '') + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= $lang['ERROR_EMPTY_ADD_ATTACHBOX']; + } + + $this->upload_attachment($this->page); + + if (!$error) + { + $actual_list = get_var('attachment_list', array('')); + $actual_id_list = get_var('attach_id_list', array(0)); + + $attachment_id = 0; + $actual_element = 0; + + for ($i = 0; $i < sizeof($actual_id_list); $i++) + { + if (isset($_POST['update_attachment'][$actual_id_list[$i]])) + { + $attachment_id = intval($actual_id_list[$i]); + $actual_element = $i; + } + } + + // Get current informations to delete the Old Attachment + $sql = 'SELECT physical_filename, comment, thumbnail + FROM ' . BB_ATTACHMENTS_DESC . ' + WHERE attach_id = ' . (int) $attachment_id; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to select old Attachment Entry.', '', __LINE__, __FILE__, $sql); + } + + if (DB()->num_rows($result) != 1) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= $lang['ERROR_MISSING_OLD_ENTRY']; + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $comment = (trim($this->file_comment) == '') ? trim($row['comment']) : trim($this->file_comment); + + // Update Entry + $sql_ary = array( + 'physical_filename' => (string) basename($this->attach_filename), + 'real_filename' => (string) basename($this->filename), + 'comment' => (string) $comment, + 'extension' => (string) strtolower($this->extension), + 'mimetype' => (string) strtolower($this->type), + 'filesize' => (int) $this->filesize, + 'filetime' => (int) $this->filetime, + 'thumbnail' => (int) $this->thumbnail + ); + + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . ' SET ' . attach_mod_sql_build_array('UPDATE', $sql_ary) . ' + WHERE attach_id = ' . (int) $attachment_id; + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to update the Attachment.', '', __LINE__, __FILE__, $sql); + } + + // Delete the Old Attachment + unlink_attach($row['physical_filename']); + + if (intval($row['thumbnail']) == 1) + { + unlink_attach($row['physical_filename'], MODE_THUMBNAIL); + } + + //bt + if ($this->attachment_extension_list[$actual_element] === TORRENT_EXT && $attachments[$actual_element]['tracker_status']) + { + include(INC_DIR .'functions_torrent.php'); + tracker_unregister($attachment_id); + } + //bt end + + // Make sure it is displayed + $this->attachment_list[$actual_element] = $this->attach_filename; + $this->attachment_comment_list[$actual_element] = $comment; + $this->attachment_filename_list[$actual_element] = $this->filename; + $this->attachment_extension_list[$actual_element] = $this->extension; + $this->attachment_mimetype_list[$actual_element] = $this->type; + $this->attachment_filesize_list[$actual_element] = $this->filesize; + $this->attachment_filetime_list[$actual_element] = $this->filetime; + $this->attachment_id_list[$actual_element] = $actual_id_list[$actual_element]; + $this->attachment_thumbnail_list[$actual_element] = $this->thumbnail; + $this->file_comment = ''; + + } + } + + if (($add_attachment || $preview) && $this->filename != '') + { + if ($this->num_attachments < intval($max_attachments)) + { + $this->upload_attachment($this->page); + + if (!$error) + { + array_unshift($this->attachment_list, $this->attach_filename); + array_unshift($this->attachment_comment_list, $this->file_comment); + array_unshift($this->attachment_filename_list, $this->filename); + array_unshift($this->attachment_extension_list, $this->extension); + array_unshift($this->attachment_mimetype_list, $this->type); + array_unshift($this->attachment_filesize_list, $this->filesize); + array_unshift($this->attachment_filetime_list, $this->filetime); + array_unshift($this->attachment_id_list, '0'); + array_unshift($this->attachment_thumbnail_list, $this->thumbnail); + + $this->file_comment = ''; + } + } + else + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['TOO_MANY_ATTACHMENTS'], intval($max_attachments)); + } + } + } + } + + return TRUE; + } + + /** + * Basic Insert Attachment Handling for all Message Types + */ + function do_insert_attachment($mode, $message_type, $message_id) + { + global $upload_dir; + + if (intval($message_id) < 0) + { + return FALSE; + } + + global $post_info, $userdata; + + $post_id = (int) $message_id; + $user_id_1 = (isset($post_info['poster_id'])) ? (int) $post_info['poster_id'] : 0; + + if (!$user_id_1) + { + $user_id_1 = (int) $userdata['user_id']; + } + + if ($mode == 'attach_list') + { + for ($i = 0; $i < sizeof($this->attachment_list); $i++) + { + if ($this->attachment_id_list[$i]) + { + // update entry in db if attachment already stored in db and filespace + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . " + SET comment = '" . @attach_mod_sql_escape($this->attachment_comment_list[$i]) . "' + WHERE attach_id = " . $this->attachment_id_list[$i]; + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to update the File Comment.', '', __LINE__, __FILE__, $sql); + } + } + else + { + if (empty($this->attachment_mimetype_list[$i]) && $this->attachment_extension_list[$i] === TORRENT_EXT) + { + $this->attachment_mimetype_list[$i] = 'application/x-bittorrent'; + } + + // insert attachment into db + $sql_ary = array( + 'physical_filename' => (string) basename($this->attachment_list[$i]), + 'real_filename' => (string) basename($this->attachment_filename_list[$i]), + 'comment' => (string) @$this->attachment_comment_list[$i], + 'extension' => (string) strtolower($this->attachment_extension_list[$i]), + 'mimetype' => (string) strtolower($this->attachment_mimetype_list[$i]), + 'filesize' => (int) $this->attachment_filesize_list[$i], + 'filetime' => (int) $this->attachment_filetime_list[$i], + 'thumbnail' => (int) $this->attachment_thumbnail_list[$i] + ); + + $sql = 'INSERT INTO ' . BB_ATTACHMENTS_DESC . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t store Attachment.
Your ' . $message_type . ' has been stored.', '', __LINE__, __FILE__, $sql); + } + + $attach_id = DB()->sql_nextid(); + + //bt + if ($this->attachment_extension_list[$i] === TORRENT_EXT && !defined('TORRENT_ATTACH_ID')) + { + define('TORRENT_ATTACH_ID', $attach_id); + } + //bt end + + $sql_ary = array( + 'attach_id' => (int) $attach_id, + 'post_id' => (int) $post_id, + 'user_id_1' => (int) $user_id_1, + ); + + $sql = 'INSERT INTO ' . BB_ATTACHMENTS . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + + if ( !(DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Couldn\'t store Attachment.
Your ' . $message_type . ' has been stored.', '', __LINE__, __FILE__, $sql); + } + } + } + + return TRUE; + } + + if ($mode == 'last_attachment') + { + if ($this->post_attach && !isset($_POST['update_attachment'])) + { + // insert attachment into db, here the user submited it directly + $sql_ary = array( + 'physical_filename' => (string) basename($this->attach_filename), + 'real_filename' => (string) basename($this->filename), + 'comment' => (string) $this->file_comment, + 'extension' => (string) strtolower($this->extension), + 'mimetype' => (string) strtolower($this->type), + 'filesize' => (int) $this->filesize, + 'filetime' => (int) $this->filetime, + 'thumbnail' => (int) $this->thumbnail + ); + + $sql = 'INSERT INTO ' . BB_ATTACHMENTS_DESC . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + + // Inform the user that his post has been created, but nothing is attached + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t store Attachment.
Your ' . $message_type . ' has been stored.', '', __LINE__, __FILE__, $sql); + } + + $attach_id = DB()->sql_nextid(); + + $sql_ary = array( + 'attach_id' => (int) $attach_id, + 'post_id' => (int) $post_id, + 'user_id_1' => (int) $user_id_1, + ); + + $sql = 'INSERT INTO ' . BB_ATTACHMENTS . ' ' . attach_mod_sql_build_array('INSERT', $sql_ary); + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t store Attachment.
Your ' . $message_type . ' has been stored.', '', __LINE__, __FILE__, $sql); + } + } + } + } + + /** + * Attachment Mod entry switch/output (intern) + * @private + */ + function display_attachment_bodies() + { + global $attach_config, $is_auth, $lang, $mode, $template, $upload_dir, $userdata, $forum_id; + + // Choose what to display + $value_add = $value_posted = 0; + + $this->add_attachment_body = 1; + $this->posted_attachments_body = 1; + + $s_hidden = ''; + $s_hidden .= ''; + + $u_rules_id = $forum_id; + + $template->assign_vars(array( + 'L_ADD_ATTACHMENT_TITLE' => $lang['ADD_ATTACHMENT_TITLE'], + 'L_POSTED_ATTACHMENTS' => $lang['POSTED_ATTACHMENTS'], + 'L_FILE_NAME' => $lang['FILE_NAME'], + 'L_FILE_COMMENT' => $lang['FILE_COMMENT'], + 'RULES' => ''. $lang['ALLOWED_EXTENSIONS_AND_SIZES'] .'', + + 'ADD_ATTACH_HIDDEN_FIELDS' => $s_hidden, + )); + + $attachments = array(); + + if (sizeof($this->attachment_list) > 0) + { + $hidden = ''; + for ($i = 0; $i < sizeof($this->attachment_list); $i++) + { + $hidden .= ''; + $hidden .= ''; + $hidden .= ''; + $hidden .= ''; + $hidden .= ''; + $hidden .= ''; + $hidden .= ''; + $hidden .= ''; + + if (!$this->posted_attachments_body || sizeof($this->attachment_list) == 0) + { + $hidden .= ''; + } + } + $template->assign_var('POSTED_ATTACHMENTS_HIDDEN_FIELDS', $hidden); + } + + if ($this->add_attachment_body) + { + $template->assign_vars(array( + 'TPL_ADD_ATTACHMENT' => true, + 'L_ADD_ATTACH_TITLE' => $lang['ADD_ATTACHMENT_TITLE'], + 'L_ADD_ATTACH_EXPLAIN' => $lang['ADD_ATTACHMENT_EXPLAIN'], + 'L_ADD_ATTACHMENT' => $lang['ADD_ATTACHMENT'], + + 'FILE_COMMENT' => htmlspecialchars($this->file_comment), + 'FILESIZE' => $attach_config['max_filesize'], + 'FILENAME' => htmlspecialchars($this->filename), + + 'S_FORM_ENCTYPE' => 'enctype="multipart/form-data"', + )); + } + + if ($this->posted_attachments_body && sizeof($this->attachment_list) > 0) + { + $template->assign_vars(array( + 'TPL_POSTED_ATTACHMENTS' => true, + 'L_POSTED_ATTACHMENTS' => $lang['POSTED_ATTACHMENTS'], + 'L_UPDATE_COMMENT' => $lang['UPDATE_COMMENT'], + 'L_UPLOAD_NEW_VERSION' => $lang['UPLOAD_NEW_VERSION'], + 'L_DELETE_ATTACHMENT' => $lang['DELETE_ATTACHMENT'], + 'L_DELETE_THUMBNAIL' => $lang['DELETE_THUMBNAIL'], + )); + + for ($i = 0; $i < sizeof($this->attachment_list); $i++) + { + if (@$this->attachment_id_list[$i] == 0) + { + $download_link = $upload_dir . '/' . basename($this->attachment_list[$i]); + } + else + { + $download_link = append_sid(BB_ROOT . 'download.php?id=' . $this->attachment_id_list[$i]); + } + + $template->assign_block_vars('attach_row', array( + 'FILE_NAME' => @htmlspecialchars($this->attachment_filename_list[$i]), + 'ATTACH_FILENAME' => @$this->attachment_list[$i], + 'FILE_COMMENT' => @htmlspecialchars($this->attachment_comment_list[$i]), + 'ATTACH_ID' => @$this->attachment_id_list[$i], + + 'U_VIEW_ATTACHMENT' => $download_link) + ); + + // Thumbnail there ? And is the User Admin or Mod ? Then present the 'Delete Thumbnail' Button + if (@intval($this->attachment_thumbnail_list[$i]) == 1 && ((isset($is_auth['auth_mod']) && $is_auth['auth_mod']) || IS_ADMIN)) + { + $template->assign_block_vars('attach_row.switch_thumbnail', array()); + } + + if (@$this->attachment_id_list[$i]) + { + $template->assign_block_vars('attach_row.switch_update_attachment', array()); + } + } + } + + $template->assign_var('ATTACHBOX'); + } + + /** + * Upload an Attachment to Filespace (intern) + */ + function upload_attachment() + { + global $error, $error_msg, $lang, $attach_config, $userdata, $upload_dir, $forum_id; + + $this->post_attach = ($this->filename != '') ? TRUE : FALSE; + + if ($this->post_attach) + { +// $r_file = trim(basename(htmlspecialchars($this->filename))); + $r_file = trim(basename($this->filename)); + $file = $_FILES['fileupload']['tmp_name']; + $this->type = $_FILES['fileupload']['type']; + + if (isset($_FILES['fileupload']['size']) && $_FILES['fileupload']['size'] == 0) + { + message_die(GENERAL_ERROR, 'Tried to upload empty file'); + } + + // Opera add the name to the mime type + $this->type = (strstr($this->type, '; name')) ? str_replace(strstr($this->type, '; name'), '', $this->type) : $this->type; + $this->type = strtolower($this->type); + $this->extension = strtolower(get_extension($this->filename)); + + $this->filesize = @filesize($file); + $this->filesize = intval($this->filesize); + + $sql = 'SELECT g.allow_group, g.max_filesize, g.cat_id, g.forum_permissions + FROM ' . BB_EXTENSION_GROUPS . ' g, ' . BB_EXTENSIONS . " e + WHERE g.group_id = e.group_id + AND e.extension = '" . attach_mod_sql_escape($this->extension) . "' + LIMIT 1"; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not query Extensions.', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $allowed_filesize = ($row['max_filesize']) ? $row['max_filesize'] : $attach_config['max_filesize']; + $cat_id = intval($row['cat_id']); + $auth_cache = trim($row['forum_permissions']); + + // check Filename + if (preg_match("#[\\/:*?\"<>|]#i", $this->filename)) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['INVALID_FILENAME'], htmlspecialchars($this->filename)); + } + + // check php upload-size + if (!$error && $file == 'none') + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $ini_val = ( phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var'; + + $max_size = @$ini_val('upload_max_filesize'); + + if ($max_size == '') + { + $error_msg .= $lang['ATTACHMENT_PHP_SIZE_NA']; + } + else + { + $error_msg .= sprintf($lang['ATTACHMENT_PHP_SIZE_OVERRUN'], $max_size); + } + } + + // Check Extension + if (!$error && intval($row['allow_group']) == 0) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['DISALLOWED_EXTENSION'], htmlspecialchars($this->extension)); + } + + // Check Forum Permissions + if (!$error && !IS_ADMIN && !is_forum_authed($auth_cache, $forum_id) && trim($auth_cache) != '') + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['DISALLOWED_EXTENSION_WITHIN_FORUM'], htmlspecialchars($this->extension)); + } + + //bt + // Check if user can post torrent + global $post_data; + + if (!$error && $this->extension === TORRENT_EXT && !$post_data['first_post']) + { + $error = TRUE; + if (!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= $lang['ALLOWED_ONLY_1ST_POST_ATTACH']; + } + //bt end + + // Upload File + + $this->thumbnail = 0; + + if (!$error) + { + // + // Prepare Values + $this->filetime = time(); + + $this->filename = $r_file; + + // physical filename + //$this->attach_filename = strtolower($this->filename); + $this->attach_filename = $this->filename; + + //bt + if (FILENAME_CRYPTIC) + { + $this->attach_filename = make_rand_str(FILENAME_CRYPTIC_LENGTH); + } + else if (FILENAME_TRANSLITERATE) + { + $this->attach_filename = transliterate($this->attach_filename); + } + else + { // original + $this->attach_filename = html_entity_decode(trim(stripslashes($this->attach_filename))); + $this->attach_filename = delete_extension($this->attach_filename); + $this->attach_filename = str_replace(array(' ','-'), array('_','_'), $this->attach_filename); + $this->attach_filename = str_replace('__', '_', $this->attach_filename); + $this->attach_filename = str_replace(array(',', '.', '!', '?', 'ь', 'Ь', 'ц', 'Ц', 'д', 'Д', ';', ':', '@', "'", '"', '&'), array('', '', '', '', 'ue', 'ue', 'oe', 'oe', 'ae', 'ae', '', '', '', '', '', 'and'), $this->attach_filename); + $this->attach_filename = str_replace(array('$', 'Я', '>','<','§','%','=','/','(',')','#','*','+',"\\",'{','}','[',']'), array('dollar', 'ss','greater','lower','paragraph','percent','equal','','','','','','','','','','',''), $this->attach_filename); + // Remove non-latin characters + $this->attach_filename = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e", "chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)", $this->attach_filename); + $this->attach_filename = rawurlencode($this->attach_filename); + $this->attach_filename = preg_replace("/(%[0-9A-F]{1,2})/i", '', $this->attach_filename); + $this->attach_filename = trim($this->attach_filename); + } + $this->attach_filename = str_replace(array('&','&',' '), '_', $this->attach_filename); + $this->attach_filename = str_replace('php', '_php_', $this->attach_filename); + $this->attach_filename = substr(trim($this->attach_filename), 0, FILENAME_MAX_LENGTH); + + for ($i=0, $max_try=5; $i <= $max_try; $i++) + { + $fn_prefix = make_rand_str(FILENAME_PREFIX_LENGTH) .'_'; + $new_physical_filename = clean_filename($fn_prefix . $this->attach_filename); + + if (!physical_filename_already_stored($new_physical_filename)) + { + break; + } + if ($i == $max_try) + { + message_die(GENERAL_ERROR, 'Could not create filename for attachment', '', __LINE__, __FILE__); + } + } + $this->attach_filename = $new_physical_filename; + + // Do we have to create a thumbnail ? + if ($cat_id == IMAGE_CAT && intval($attach_config['img_create_thumbnail'])) + { + $this->thumbnail = 1; + } + } + + if ($error) + { + $this->post_attach = FALSE; + return; + } + + // Upload Attachment + if (!$error) + { + if (!(intval($attach_config['allow_ftp_upload']))) + { + // Descide the Upload method + $ini_val = ( phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var'; + + $safe_mode = @$ini_val('safe_mode'); + + if (@$ini_val('open_basedir')) + { + if ( @phpversion() < '4.0.3' ) + { + $upload_mode = 'copy'; + } + else + { + $upload_mode = 'move'; + } + } + else if ( @$ini_val('safe_mode') ) + { + $upload_mode = 'move'; + } + else + { + $upload_mode = 'copy'; + } + } + else + { + $upload_mode = 'ftp'; + } + + // Ok, upload the Attachment + if (!$error) + { + $this->move_uploaded_attachment($upload_mode, $file); + } + } + + // Now, check filesize parameters + if (!$error) + { + if ($upload_mode != 'ftp' && !$this->filesize) + { + $this->filesize = intval(@filesize($upload_dir . '/' . $this->attach_filename)); + } + } + + // Check Image Size, if it's an image + if (!$error && !IS_ADMIN && $cat_id == IMAGE_CAT) + { + list($width, $height) = image_getdimension($upload_dir . '/' . $this->attach_filename); + + if ($width != 0 && $height != 0 && intval($attach_config['img_max_width']) != 0 && intval($attach_config['img_max_height']) != 0) + { + if ($width > intval($attach_config['img_max_width']) || $height > intval($attach_config['img_max_height'])) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['ERROR_IMAGESIZE'], intval($attach_config['img_max_width']), intval($attach_config['img_max_height'])); + } + } + } + + // check Filesize + if (!$error && $allowed_filesize != 0 && $this->filesize > $allowed_filesize && !(IS_ADMIN || IS_MOD || IS_GROUP_MEMBER)) + { + $size_lang = ($allowed_filesize >= 1048576) ? $lang['MB'] : ( ($allowed_filesize >= 1024) ? $lang['KB'] : $lang['BYTES'] ); + + if ($allowed_filesize >= 1048576) + { + $allowed_filesize = round($allowed_filesize / 1048576 * 100) / 100; + } + else if($allowed_filesize >= 1024) + { + $allowed_filesize = round($allowed_filesize / 1024 * 100) / 100; + } + + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['ATTACHMENT_TOO_BIG'], $allowed_filesize, $size_lang); + } + + // Check our complete quota + if ($attach_config['attachment_quota']) + { + $sql = 'SELECT sum(filesize) as total FROM ' . BB_ATTACHMENTS_DESC; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not query total filesize', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $total_filesize = $row['total']; + + if (($total_filesize + $this->filesize) > $attach_config['attachment_quota']) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= $lang['ATTACH_QUOTA_REACHED']; + } + + } + + $this->get_quota_limits($userdata); + + // Check our user quota + if ($attach_config['upload_filesize_limit']) + { + $sql = 'SELECT attach_id + FROM ' . BB_ATTACHMENTS . ' + WHERE user_id_1 = ' . (int) $userdata['user_id'] . ' + GROUP BY attach_id'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Couldn\'t query attachments', '', __LINE__, __FILE__, $sql); + } + + $attach_ids = DB()->sql_fetchrowset($result); + $num_attach_ids = DB()->num_rows($result); + DB()->sql_freeresult($result); + + $attach_id = array(); + + for ($i = 0; $i < $num_attach_ids; $i++) + { + $attach_id[] = intval($attach_ids[$i]['attach_id']); + } + + if ($num_attach_ids > 0) + { + // Now get the total filesize + $sql = 'SELECT sum(filesize) as total + FROM ' . BB_ATTACHMENTS_DESC . ' + WHERE attach_id IN (' . implode(', ', $attach_id) . ')'; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not query total filesize', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + $total_filesize = $row['total']; + } + else + { + $total_filesize = 0; + } + + if (($total_filesize + $this->filesize) > $attach_config['upload_filesize_limit']) + { + $upload_filesize_limit = $attach_config['upload_filesize_limit']; + $size_lang = ($upload_filesize_limit >= 1048576) ? $lang['MB'] : ( ($upload_filesize_limit >= 1024) ? $lang['KB'] : $lang['BYTES'] ); + + if ($upload_filesize_limit >= 1048576) + { + $upload_filesize_limit = round($upload_filesize_limit / 1048576 * 100) / 100; + } + else if($upload_filesize_limit >= 1024) + { + $upload_filesize_limit = round($upload_filesize_limit / 1024 * 100) / 100; + } + + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['USER_UPLOAD_QUOTA_REACHED'], $upload_filesize_limit, $size_lang); + } + } + + if ($error) + { + unlink_attach($this->attach_filename); + unlink_attach($this->attach_filename, MODE_THUMBNAIL); + $this->post_attach = FALSE; + } + } + } + + // Copy the temporary attachment to the right location (copy, move_uploaded_file or ftp) + function move_uploaded_attachment($upload_mode, $file) + { + global $error, $error_msg, $lang, $upload_dir; + + if (!is_uploaded_file($file)) + { + message_die(GENERAL_ERROR, 'Unable to upload file. The given source has not been uploaded.', __LINE__, __FILE__); + } + + switch ($upload_mode) + { + case 'copy': + + if (!@copy($file, $upload_dir . '/' . basename($this->attach_filename))) + { + if (!@move_uploaded_file($file, $upload_dir . '/' . basename($this->attach_filename))) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['GENERAL_UPLOAD_ERROR'], './' . $upload_dir . '/' . $this->attach_filename); + return; + } + } + @chmod($upload_dir . '/' . basename($this->attach_filename), 0666); + + break; + + case 'move': + + if (!@move_uploaded_file($file, $upload_dir . '/' . basename($this->attach_filename))) + { + if (!@copy($file, $upload_dir . '/' . basename($this->attach_filename))) + { + $error = TRUE; + if(!empty($error_msg)) + { + $error_msg .= '
'; + } + $error_msg .= sprintf($lang['GENERAL_UPLOAD_ERROR'], './' . $upload_dir . '/' . $this->attach_filename); + return; + } + } + @chmod($upload_dir . '/' . $this->attach_filename, 0666); + + break; + + case 'ftp': + ftp_file($file, basename($this->attach_filename), $this->type); + break; + } + + if (!$error && $this->thumbnail == 1) + { + if ($upload_mode == 'ftp') + { + $source = $file; + $dest_file = THUMB_DIR . '/t_' . basename($this->attach_filename); + } + else + { + $source = $upload_dir . '/' . basename($this->attach_filename); + $dest_file = amod_realpath($upload_dir); + $dest_file .= '/' . THUMB_DIR . '/t_' . basename($this->attach_filename); + } + + if (!create_thumbnail($source, $dest_file, $this->type)) + { + if (!$file || !create_thumbnail($file, $dest_file, $this->type)) + { + $this->thumbnail = 0; + } + } + } + } +} + +/** +* @package attachment_mod +* Attachment posting +*/ +class attach_posting extends attach_parent +{ + /** + * Constructor + */ + function attach_posting() + { + $this->attach_parent(); + $this->page = 0; + } + + /** + * Insert an Attachment into a Post (this is the second function called from posting.php) + */ + function insert_attachment($post_id) + { + global $is_auth, $mode, $userdata, $error, $error_msg; + + // Insert Attachment ? + if (!empty($post_id) && ($mode == 'newtopic' || $mode == 'reply' || $mode == 'editpost') && $is_auth['auth_attachments']) + { + $this->do_insert_attachment('attach_list', 'post', $post_id); + $this->do_insert_attachment('last_attachment', 'post', $post_id); + + if ((sizeof($this->attachment_list) > 0 || $this->post_attach) && !isset($_POST['update_attachment'])) + { + $sql = 'UPDATE ' . BB_POSTS . ' + SET post_attachment = 1 + WHERE post_id = ' . (int) $post_id; + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to update Posts Table.', '', __LINE__, __FILE__, $sql); + } + + $sql = 'SELECT topic_id + FROM ' . BB_POSTS . ' + WHERE post_id = ' . (int) $post_id; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to select Posts Table.', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + DB()->sql_freeresult($result); + + $sql = 'UPDATE ' . BB_TOPICS . ' + SET topic_attachment = 1 + WHERE topic_id = ' . (int) $row['topic_id']; + + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Unable to update Topics Table.', '', __LINE__, __FILE__, $sql); + } + } + } + } + + /** + * Handle Attachments (Add/Delete/Edit/Show) - This is the first function called from every message handler + */ + function posting_attachment_mod() + { + global $mode, $confirm, $is_auth, $post_id, $delete, $refresh; + + if (!$refresh) + { + $add_attachment_box = (!empty($_POST['add_attachment_box'])) ? TRUE : FALSE; + $posted_attachments_box = (!empty($_POST['posted_attachments_box'])) ? TRUE : FALSE; + + $refresh = $add_attachment_box || $posted_attachments_box; + } + + // Choose what to display + $result = $this->handle_attachments($mode); + + if ($result === false) + { + return; + } + + if ($confirm && ($delete || $mode == 'delete' || $mode == 'editpost') && ($is_auth['auth_delete'] || $is_auth['auth_mod'])) + { + if ($post_id) + { + delete_attachment($post_id); + } + } + + $this->display_attachment_bodies(); + } + +} + +/** +* Entry Point +*/ +function execute_posting_attachment_handling() +{ + global $attachment_mod; + + $attachment_mod['posting'] = new attach_posting(); + $attachment_mod['posting']->posting_attachment_mod(); +} \ No newline at end of file diff --git a/upload/bt/announce.php b/upload/bt/announce.php new file mode 100644 index 000000000..25b949875 --- /dev/null +++ b/upload/bt/announce.php @@ -0,0 +1,194 @@ + 0xFFFF) +{ + msg_die('Invalid port'); +} +if (!isset($uploaded) || $uploaded < 0 || $uploaded > $max_up_down_val || $uploaded == 1844674407370) +{ + msg_die('Invalid uploaded value'); +} +if (!isset($downloaded) || $downloaded < 0 || $downloaded > $max_up_down_val || $downloaded == 1844674407370) +{ + msg_die('Invalid downloaded value'); +} +if (!isset($left) || $left < 0 || $left > $max_left_val) +{ + msg_die('Invalid left value'); +} +if (!verify_id($passkey, BT_AUTH_KEY_LENGTH)) +{ + msg_die('Invalid passkey'); +} + +// IP +$ip = $_SERVER['REMOTE_ADDR']; + +if (!$bb_cfg['ignore_reported_ip'] && isset($_GET['ip']) && $ip !== $_GET['ip']) +{ + if (!$bb_cfg['verify_reported_ip']) + { + $ip = $_GET['ip']; + } + else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) + { + foreach ($matches[0] as $x_ip) + { + if ($x_ip === $_GET['ip']) + { + if (!$bb_cfg['allow_internal_ip'] && preg_match("#^(10|172\.16|192\.168)\.#", $x_ip)) + { + break; + } + $ip = $x_ip; + break; + } + } + } +} +// Check that IP format is valid +if (!verify_ip($ip)) +{ + msg_die("Invalid IP: $ip"); +} +// Convert IP to HEX format +$ip_sql = encode_ip($ip); + +// Peer unique id +$peer_hash = md5( + rtrim($info_hash, ' ') . $passkey . $ip . $port +); + +// Get cached peer info from previous announce (last peer info) +$lp_info = CACHE('tr_cache')->get(PEER_HASH_PREFIX . $peer_hash); + +if (DBG_LOG) dbg_log(' ', '$lp_info-get_from-CACHE-'. ($lp_info ? 'hit' : 'miss')); + +// Drop fast announce +if ($lp_info && (!isset($event) || $event !== 'stopped')) +{ + drop_fast_announce($lp_info); +} + +// Functions +function drop_fast_announce ($lp_info) +{ + global $announce_interval; + + if ($lp_info['update_time'] < (TIMENOW - $announce_interval + 60)) + { + return; // if announce interval correct + } + + if (DBG_LOG) dbg_log(' ', 'drop_fast_announce-'. (!empty(DB()) ? 'DB' : 'CACHE')); + + $new_ann_intrv = $lp_info['update_time'] + $announce_interval - TIMENOW; + + dummy_exit($new_ann_intrv); +} + +function msg_die ($msg) +{ + if (DBG_LOG) dbg_log(' ', '!die-'. clean_filename($msg)); + + $output = bencode(array( +# 'interval' => (int) 1800, + 'min interval' => (int) 1800, +# 'peers' => (string) DUMMY_PEER, + 'failure reason' => (string) $msg, + 'warning message' => (string) $msg, + )); + + die($output); +} + +# $agent = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '-'; +# bb_log("$agent | ". str_compact($peer_id) ."\n", 'agent'); + +// Start announcer +define('TR_ROOT', './'); +require(TR_ROOT .'includes/init_tr.php'); +require(TR_ROOT .'includes/tr_announcer.php'); +exit; \ No newline at end of file diff --git a/upload/bt/includes/.htaccess b/upload/bt/includes/.htaccess new file mode 100644 index 000000000..a42f56b15 --- /dev/null +++ b/upload/bt/includes/.htaccess @@ -0,0 +1,3 @@ +Order Deny,Allow +Deny from all +Allow from local. \ No newline at end of file diff --git a/upload/bt/includes/init_tr.php b/upload/bt/includes/init_tr.php new file mode 100644 index 000000000..394872a12 --- /dev/null +++ b/upload/bt/includes/init_tr.php @@ -0,0 +1,559 @@ +num_queries : '-'; + $sql_inittime = !empty($DBS) ? DB()->sql_inittime : ' -- '; + $sql_timetotal = !empty($DBS) ? DB()->sql_timetotal : ' -- '; + $sql_init_perc = !empty($DBS) ? round($sql_inittime*100/$gen_time) : ' - '; + $sql_total_perc = !empty($DBS) ? round($sql_timetotal*100/$gen_time) : ' - '; + + $str = array(); + $str[] = substr(time(), -4, 4); + $str[] = sprintf('%.4f', $gen_time); + $str[] = sprintf('%.4f'. LOG_SEPR .'%02d%%', $sql_inittime, $sql_init_perc); + $str[] = sprintf('%.4f'. LOG_SEPR .'%02d%%', $sql_timetotal, $sql_total_perc); + $str[] = $num_queries; + $str[] = sprintf('%.1f', LOADAVG); + $str = join(LOG_SEPR, $str) . LOG_LF; + dbg_log($str, '!!gentime'); + } +/**!/ + bb_log("##\n". ob_get_contents() ."\n##", 'tr_output_'. date('m-d_H')); +#*/ + + exit; +} + +function silent_exit () +{ + while (@ob_end_clean()); + + tracker_exit(); +} + +function error_exit ($msg = '') +{ + if (DBG_LOG) dbg_log(' ', '!err-'. clean_filename($msg)); + + if (!DEBUG) + { + silent_exit(); + } + + echo bencode(array('failure reason' => str_compact($msg))); + + tracker_exit(); +} + +function browser_redirect () +{ + if (empty($_SERVER['HTTP_USER_AGENT'])) return; + + $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); + + $browser_ids = array( + 'amaya', + 'crawler', + 'dillo', + 'elinks', + 'gecko', + 'googlebot', + 'ibrowse', + 'icab', + 'konqueror', + 'lynx', + 'mozilla', + 'msie', + 'msnbot', + 'netpositive', + 'omniweb', + 'opera', + 'safari', + 'slurp', + 'w3m', + 'wget', + ); + + foreach ($browser_ids as $browser) + { + if (strpos($user_agent, $browser) !== false) + { + if (DBG_LOG) + { + dbg_log(' ', "redirect/$browser"); + + dbg_log( + TIMENOW . LOG_SEPR . + encode_ip($_SERVER['REMOTE_ADDR']) . LOG_SEPR . + $_SERVER['REMOTE_ADDR'] . LOG_SEPR . + $_SERVER['QUERY_STRING'] . LOG_SEPR . + $_SERVER['HTTP_USER_AGENT'] . LOG_SEPR . + LOG_LF, + "redirect/$browser.q.log" + ); + } + + header('Location: '. $GLOBALS['tr_cfg']['browser_redirect_url']); + tracker_exit(); + } + } +} + +// Database +class sql_db +{ + var $link = null; + var $result = null; + var $selected_db = null; + + var $pconnect = false; + var $locked = false; + + var $num_queries = 0; + var $sql_starttime = 0; + var $sql_inittime = 0; + var $sql_timetotal = 0; + + var $dbg = array(); + var $dbg_id = 0; + var $dbg_user = false; + var $cur_query = null; + + /** + * Constructor + */ + function sql_db ($cfg) + { + $this->dbg_user = (SQL_DEBUG && $cfg['dbg_user']); + $this->pconnect = $cfg['persist']; + + // Connect to server + $this->link = @$this->connect($cfg); + + // Select database + $this->selected_db = @$this->select_db($cfg); + + // Set charset + if ($cfg['charset'] && !@$this->sql_query("SET NAMES {$cfg['charset']}")) + { + error_exit("Could not set MySQL charset '{$cfg['charset']}'"); + } + + $this->num_queries = 0; + $this->sql_inittime = $this->sql_timetotal; + } + + /** + * Open connection + */ + function connect ($cfg) + { + $this->cur_query = 'connect'; + $this->debug('start'); + + $connect_type = ($this->pconnect) ? 'mysql_pconnect' : 'mysql_connect'; + + if (!$link = $connect_type($cfg['dbhost'], $cfg['dbuser'], $cfg['dbpasswd'])) + { + $this->log_error(); + } + + register_shutdown_function(array(&$this, 'sql_close')); + + $this->debug('end'); + $this->cur_query = null; + + if (DBG_LOG) dbg_log(' ', 'DB-connect'. ($link ? '' : '-FAIL')); + + if (!$link) + { + dummy_exit(1200); + } + + return $link; + } + + /** + * Select database + */ + function select_db ($cfg) + { + $this->cur_query = 'select db'; + $this->debug('start'); + + if (!mysql_select_db($cfg['dbname'], $this->link)) + { + $this->log_error(); + error_exit("Could not select database '{$cfg['dbname']}'"); + } + + $this->debug('end'); + $this->cur_query = null; + + return $cfg['dbname']; + } + + /** + * Base query method + */ + function sql_query ($query, $type = 'buffered') + { + $this->cur_query = $query; + $this->debug('start'); + + $query_function = ($type === 'unbuffered') ? 'mysql_unbuffered_query' : 'mysql_query'; + + if (!$this->result = $query_function($query, $this->link)) + { + $this->log_error(); + } + + $this->debug('end'); + $this->cur_query = null; + + $this->num_queries++; + + return $this->result; + } + + /** + * Execute query WRAPPER (with error handling) + */ + function query ($query, $err_msg = '') + { + if (!$result = $this->sql_query($query)) + { + $this->trigger_error($err_msg); + } + + return $result; + } + + /** + * Return number of rows + */ + function num_rows ($result = false) + { + $num_rows = false; + + if ($result OR $result = $this->result) + { + $num_rows = is_resource($result) ? mysql_num_rows($result) : false; + } + + return $num_rows; + } + + /** + * Return number of affected rows + */ + function affected_rows () + { + return (is_resource($this->link)) ? mysql_affected_rows($this->link) : -1; + } + + /** + * Fetch current row + */ + function sql_fetchrow ($result, $result_type = MYSQL_ASSOC) + { + return (is_resource($result)) ? mysql_fetch_array($result, $result_type) : false; + } + + /** + * Alias of sql_fetchrow() + */ + function fetch_next ($result, $result_type = MYSQL_ASSOC) + { + return $this->sql_fetchrow($result, $result_type); + } + + /** + * Fetch row WRAPPER (with error handling) + */ + function fetch_row ($query, $err_msg = '') + { + if (!$result = $this->sql_query($query)) + { + $this->trigger_error($err_msg); + } + + return $this->sql_fetchrow($result); + } + + /** + * Fetch all rows + */ + function sql_fetchrowset ($result, $result_type = MYSQL_ASSOC) + { + $rowset = array(); + + while ($row = mysql_fetch_array($result, $result_type)) + { + $rowset[] = $row; + } + + return $rowset; + } + + /** + * Fetch all rows WRAPPER (with error handling) + */ + function fetch_rowset ($query, $err_msg = '') + { + if (!$result = $this->sql_query($query, 'buffered')) + { + $this->trigger_error($err_msg); + } + + return $this->sql_fetchrowset($result); + } + + /** + * Escape string used in sql query + */ + function escape ($v, $check_type = false) + { + if (!$check_type) + { + return mysql_real_escape_string($v); + } + + switch (true) + { + case is_string ($v): return "'". mysql_real_escape_string($v) ."'"; + case is_int ($v): return "$v"; + case is_bool ($v): return ($v) ? '1' : '0'; + case is_float ($v): return "'$v'"; + case is_null ($v): return 'NULL'; + } + // if $v has unsuitable type + $this->trigger_error(__FUNCTION__ .' - wrong params'); + } + + /** + * Return sql error array + */ + function sql_error () + { + $return_ary = array( + 'code' => '', + 'message' => 'not connected', + ); + + if (is_resource($this->link)) + { + $return_ary = array( + 'code' => mysql_errno($this->link), + 'message' => mysql_error($this->link), + ); + } + + return $return_ary; + } + + /** + * Close sql connection + */ + function sql_close () + { + if (is_resource($this->link)) + { + mysql_close($this->link); + } + + $this->link = $this->selected_db = null; + + if (DBG_LOG) dbg_log(str_repeat(' ', $this->num_queries), 'DB-num_queries'); + } + + /** + * Get info about last query + */ + function query_info () + { + $info = array(); + + if ($num = $this->num_rows($this->result)) + { + $info[] = "$num rows"; + } + + if (is_resource($this->link) AND $ext = mysql_info($this->link)) + { + $info[] = "$ext"; + } + else if (!$num && ($aff = $this->affected_rows($this->result) AND $aff != -1)) + { + $info[] = "$aff rows"; + } + + return join(', ', $info); + } + + /** + * Store debug info + */ + function debug ($mode) + { + if (!SQL_DEBUG) return; + + if ($mode == 'start') + { + if (SQL_CALC_QUERY_TIME || DBG_LOG || SQL_LOG_SLOW_QUERIES) + { + $this->sql_starttime = utime(); + } + } + else if ($mode == 'end') + { + if (SQL_CALC_QUERY_TIME || DBG_LOG || SQL_LOG_SLOW_QUERIES) + { + $cur_query_time = utime() - $this->sql_starttime; + $this->sql_timetotal += $cur_query_time; + + if (SQL_LOG_SLOW_QUERIES && $cur_query_time > SQL_SLOW_QUERY_TIME) + { + $msg = date('m-d H:i:s') . LOG_SEPR; + $msg .= sprintf('%03d', round($cur_query_time)); + $msg .= defined('LOADAVG') ? LOG_SEPR . sprintf('%.1f', LOADAVG) : ''; + $msg .= LOG_SEPR . str_compact($this->cur_query); + $msg .= LOG_SEPR .' # '. $this->query_info(); + $msg .= LOG_SEPR . $this->debug_find_source(); + bb_log($msg . LOG_LF, 'sql_slow_tr'); + } + } + } + return; + } + + /** + * Trigger error + */ + function trigger_error ($msg = '') + { + if (error_reporting()) + { + if (!$msg) $msg = 'DB Error'; + + if (DEBUG === true) + { + $err = $this->sql_error(); + $msg .= trim(sprintf(' #%06d %s', $err['code'], $err['message'])); + } + else + { + $msg .= " [". $this->debug_find_source() ."]"; + } + + error_exit($msg); + } + } + + /** + * Find caller source + */ + function debug_find_source () + { + $source = ''; + $backtrace = debug_backtrace(); + + foreach ($backtrace as $trace) + { + if ($trace['file'] !== __FILE__) + { + $source = str_replace(BB_PATH . DIR_SEPR, '', $trace['file']) .'('. $trace['line'] .')'; + break; + } + } + + return $source; + } + + /** + * Log error + */ + function log_error () + { + if (!SQL_LOG_ERRORS) return; + if (!error_reporting()) return; + + $msg = array(); + $err = $this->sql_error(); + $msg[] = str_compact(sprintf('#%06d %s', $err['code'], $err['message'])); + $msg[] = ''; + $msg[] = str_compact($this->cur_query); + $msg[] = ''; + $msg[] = 'Source : '. $this->debug_find_source(); + $msg[] = 'IP : '. @$_SERVER['REMOTE_ADDR']; + $msg[] = 'Date : '. date('Y-m-d H:i:s'); + $msg[] = 'Agent : '. @$_SERVER['HTTP_USER_AGENT']; + $msg[] = 'Req_URI : '. @$_SERVER['REQUEST_URI']; + $msg[] = 'Referer : '. @$_SERVER['HTTP_REFERER']; + $msg[] = 'Method : '. @$_SERVER['REQUEST_METHOD']; + $msg[] = 'Request : '. trim(print_r($_REQUEST, true)) . str_repeat('_', 78) . LOG_LF; + $msg[] = ''; + bb_log($msg, 'sql_error_tr'); + } +} + +// Make the database connection +function db_init () +{ + if (defined('SQL_LAYER')) + { + return; + } + define('SQL_LAYER', 'mysql'); + + DB() = new sql_db(array( + 'dbms' => DBMS, + 'dbhost' => DBHOST, + 'dbname' => DBNAME, + 'dbuser' => DBUSER, + 'dbpasswd' => DBPASSWD, + 'charset' => DBCHARSET, + 'collation' => DBCOLLATION, + 'persist' => PCONNECT, + 'dbg_user' => false, + )); +} + +##### LOG ##### // User req (by passkey) +if ($log_passkey && isset($log_passkey[$_GET[$passkey_key]])) +{ + bb_log( + md5($_GET['info_hash']) . LOG_SEPR . + date('His') . LOG_SEPR . + TIMENOW . LOG_SEPR . + $_SERVER['QUERY_STRING'] . LOG_SEPR . + $_SERVER['REMOTE_ADDR'] . LOG_SEPR . + @$_SERVER['HTTP_X_FORWARDED_FOR'] . LOG_SEPR . + @$_SERVER['HTTP_USER_AGENT'] . LOG_SEPR . + LOG_LF, + 'passkey_'. $log_passkey[$_GET[$passkey_key]] + ); +} +### LOG END ### \ No newline at end of file diff --git a/upload/bt/includes/tr_announcer.php b/upload/bt/includes/tr_announcer.php new file mode 100644 index 000000000..f55607c18 --- /dev/null +++ b/upload/bt/includes/tr_announcer.php @@ -0,0 +1,248 @@ +rm(PEER_HASH_PREFIX . $peer_hash); + if (DBG_LOG) dbg_log(' ', 'stopped'); +} + +// Get last peer info from DB +if (!CACHE('tr_cache')->used && !$lp_info) +{ + $lp_info = DB()->fetch_row(" + SELECT * FROM ". BB_BT_TRACKER ." WHERE peer_hash = '$peer_hash' LIMIT 1 + "); + + if (DBG_LOG) dbg_log(' ', '$lp_info-get_from-DB-'. ($lp_info ? 'hit' : 'miss')); +} + +if ($lp_info) +{ + if (!$stopped) + { + drop_fast_announce($lp_info); + } + + $user_id = $lp_info['user_id']; + $topic_id = $lp_info['topic_id']; + $releaser = $lp_info['releaser']; + $tor_type = $lp_info['tor_type']; +} +else +{ + // Verify if torrent registered on tracker and user authorized + $info_hash_sql = rtrim(DB()->escape($info_hash), ' '); + $passkey_sql = DB()->escape($passkey); + + $sql = " + SELECT tor.topic_id, tor.poster_id, tor.tor_type, u.* + FROM ". BB_BT_TORRENTS ." tor + LEFT JOIN ". BB_BT_USERS ." u ON u.auth_key = '$passkey_sql' + WHERE tor.info_hash = '$info_hash_sql' + LIMIT 1 + "; + + $row = DB()->fetch_row($sql); + + if (empty($row['topic_id'])) + { + msg_die('Torrent not registered, info_hash = ' . bin2hex($info_hash_sql)); + } + if (empty($row['user_id'])) + { + msg_die('Please LOG IN and REDOWNLOAD this torrent (user not found)'); + } + + $user_id = $row['user_id']; + $topic_id = $row['topic_id']; + $releaser = (int) ($user_id == $row['poster_id']); + $tor_type = $row['tor_type']; + + // Ratio limits + if ((TR_RATING_LIMITS || $tr_cfg['limit_concurrent_ips']) && !$stopped) + { + $user_ratio = ($row['u_down_total'] && $row['u_down_total'] > MIN_DL_FOR_RATIO) ? ($row['u_up_total'] + $row['u_up_release'] + $row['u_up_bonus']) / $row['u_down_total'] : 1; + require(TR_ROOT .'includes/tr_ratio.php'); + } +} + +// Up/Down speed +$speed_up = $speed_down = 0; + +if ($lp_info && $lp_info['update_time'] < TIMENOW) +{ + if ($uploaded > $lp_info['uploaded']) + { + $speed_up = ceil(($uploaded - $lp_info['uploaded']) / (TIMENOW - $lp_info['update_time'])); + } + if ($downloaded > $lp_info['downloaded']) + { + $speed_down = ceil(($downloaded - $lp_info['downloaded']) / (TIMENOW - $lp_info['update_time'])); + } +} + +// Up/Down addition +$up_add = ($lp_info && $uploaded > $lp_info['uploaded']) ? $uploaded - $lp_info['uploaded'] : 0; +$down_add = ($lp_info && $downloaded > $lp_info['downloaded']) ? $downloaded - $lp_info['downloaded'] : 0; + +// Gold/Silver releases +if ($bb_cfg['gold_silver_enabled'] && $down_add) +{ + if ($tor_type == TOR_TYPE_GOLD) + { + $down_add = 0; + } + // Silver releases + else if ($tor_type == TOR_TYPE_SILVER) + { + $down_add = ceil($down_add/2); + } +} + +// Insert/update peer info +$peer_info_updated = false; +$update_time = ($stopped) ? 0 : TIMENOW; + +if ($lp_info) +{ + $sql = "UPDATE ". BB_BT_TRACKER ." SET update_time = $update_time"; + + $sql .= ", seeder = $seeder"; + $sql .= ($releaser != $lp_info['releaser']) ? ", releaser = $releaser" : ''; + + $sql .= ($tor_type != $lp_info['tor_type']) ? ", tor_type = $tor_type" : ''; + + $sql .= ($uploaded != $lp_info['uploaded']) ? ", uploaded = $uploaded" : ''; + $sql .= ($downloaded != $lp_info['downloaded']) ? ", downloaded = $downloaded" : ''; + $sql .= ", remain = $left"; + + $sql .= ($up_add) ? ", up_add = up_add + $up_add" : ''; + $sql .= ($down_add) ? ", down_add = down_add + $down_add" : ''; + + $sql .= ", speed_up = $speed_up"; + $sql .= ", speed_down = $speed_down"; + + $sql .= " WHERE peer_hash = '$peer_hash'"; + $sql .= " LIMIT 1"; + + DB()->query($sql); + + $peer_info_updated = DB()->affected_rows(); + + if (DBG_LOG) dbg_log(' ', 'this_peer-update'. ($peer_info_updated ? '' : '-FAIL')); +} + +if (!$lp_info || !$peer_info_updated) +{ + $columns = 'peer_hash, topic_id, user_id, ip, port, seeder, releaser, tor_type, uploaded, downloaded, remain, speed_up, speed_down, up_add, down_add, update_time'; + $values = "'$peer_hash', $topic_id, $user_id, '$ip_sql', $port, $seeder, $releaser, $tor_type, $uploaded, $downloaded, $left, $speed_up, $speed_down, $up_add, $down_add, $update_time"; + + DB()->query("REPLACE INTO ". BB_BT_TRACKER ." ($columns) VALUES ($values)"); + + if (DBG_LOG) dbg_log(' ', 'this_peer-insert'); +} + +// Exit if stopped +if ($stopped) +{ + silent_exit(); +} + +// Store peer info in cache +$lp_info = array( + 'downloaded' => (float) $downloaded, + 'releaser' => (int) $releaser, + 'seeder' => (int) $seeder, + 'topic_id' => (int) $topic_id, + 'update_time' => (int) TIMENOW, + 'uploaded' => (float) $uploaded, + 'user_id' => (int) $user_id, + 'tor_type' => (int) $tor_type, +); + +$lp_info_cached = CACHE('tr_cache')->set(PEER_HASH_PREFIX . $peer_hash, $lp_info, PEER_HASH_EXPIRE); + +if (DBG_LOG && !$lp_info_cached) dbg_log(' ', '$lp_info-caching-FAIL'); + +// Get cached output +$output = CACHE('tr_cache')->get(PEERS_LIST_PREFIX . $topic_id); + +if (DBG_LOG) dbg_log(' ', '$output-get_from-CACHE-'. ($output !== false ? 'hit' : 'miss')); + +if (!$output) +{ + // Retrieve peers + $numwant = (int) $tr_cfg['numwant']; + $compact_mode = ($tr_cfg['compact_mode'] || !empty($compact)); + + $rowset = DB()->fetch_rowset(" + SELECT ip, port + FROM ". BB_BT_TRACKER ." + WHERE topic_id = $topic_id + ORDER BY RAND() + LIMIT $numwant + "); + + if ($compact_mode) + { + $peers = ''; + + foreach ($rowset as $peer) + { + $peers .= pack('Nn', ip2long(decode_ip($peer['ip'])), $peer['port']); + } + } + else + { + $peers = array(); + + foreach ($rowset as $peer) + { + $peers[] = array( + 'ip' => decode_ip($peer['ip']), + 'port' => intval($peer['port']), + ); + } + } + + $seeders = 0; + $leechers = 0; + + if ($tr_cfg['scrape']) + { + $row = DB()->fetch_row(" + SELECT seeders, leechers + FROM ". BB_BT_TRACKER_SNAP ." + WHERE topic_id = $topic_id + LIMIT 1 + "); + + $seeders = $row['seeders']; + $leechers = $row['leechers']; + } + + $output = array( + 'interval' => (int) $announce_interval, + 'min interval' => (int) $announce_interval, + 'peers' => $peers, + 'complete' => (int) $seeders, + 'incomplete' => (int) $leechers, + ); + + $peers_list_cached = CACHE('tr_cache')->set(PEERS_LIST_PREFIX . $topic_id, $output, PEERS_LIST_EXPIRE); + + if (DBG_LOG && !$peers_list_cached) dbg_log(' ', '$output-caching-FAIL'); +} + +// Return data to client +echo bencode($output); + +tracker_exit(); diff --git a/upload/bt/includes/tr_ratio.php b/upload/bt/includes/tr_ratio.php new file mode 100644 index 000000000..4cc148f54 --- /dev/null +++ b/upload/bt/includes/tr_ratio.php @@ -0,0 +1,76 @@ + $limit) + { + if ($user_ratio < $ratio) + { + $tr_cfg['limit_active_tor'] = 1; + $tr_cfg['limit_leech_count'] = $limit; + $rating_msg = " (ratio < $ratio)"; + break; + } + } +} + +// Limit active torrents +if (!isset($bb_cfg['unlimited_users'][$user_id]) && $tr_cfg['limit_active_tor'] && (($tr_cfg['limit_seed_count'] && $seeder) || ($tr_cfg['limit_leech_count'] && !$seeder))) +{ + $sql = "SELECT COUNT(DISTINCT topic_id) AS active_torrents + FROM ". BB_BT_TRACKER ." + WHERE user_id = $user_id + AND seeder = $seeder + AND topic_id != $topic_id"; + + if (!$seeder && $tr_cfg['leech_expire_factor'] && $user_ratio < 0.5) + { + $sql .= " AND update_time > ". (TIMENOW - 60*$tr_cfg['leech_expire_factor']); + } + $sql .= " GROUP BY user_id"; + + if ($row = DB()->fetch_row($sql)) + { + if ($seeder && $tr_cfg['limit_seed_count'] && $row['active_torrents'] >= $tr_cfg['limit_seed_count']) + { + msg_die('Only '. $tr_cfg['limit_seed_count'] .' torrent(s) allowed for seeding'); + } + else if (!$seeder && $tr_cfg['limit_leech_count'] && $row['active_torrents'] >= $tr_cfg['limit_leech_count']) + { + msg_die('Only '. $tr_cfg['limit_leech_count'] .' torrent(s) allowed for leeching'. $rating_msg); + } + } +} + +// Limit concurrent IPs +if ($tr_cfg['limit_concurrent_ips'] && (($tr_cfg['limit_seed_ips'] && $seeder) || ($tr_cfg['limit_leech_ips'] && !$seeder))) +{ + $sql = "SELECT COUNT(DISTINCT ip) AS ips + FROM ". BB_BT_TRACKER ." + WHERE topic_id = $topic_id + AND user_id = $user_id + AND seeder = $seeder + AND ip != '$ip_sql'"; + + if (!$seeder && $tr_cfg['leech_expire_factor']) + { + $sql .= " AND update_time > ". (TIMENOW - 60*$tr_cfg['leech_expire_factor']); + } + $sql .= " GROUP BY topic_id"; + + if ($row = DB()->fetch_row($sql)) + { + if ($seeder && $tr_cfg['limit_seed_ips'] && $row['ips'] >= $tr_cfg['limit_seed_ips']) + { + msg_die('You can seed only from '. $tr_cfg['limit_seed_ips'] ." IP's"); + } + else if (!$seeder && $tr_cfg['limit_leech_ips'] && $row['ips'] >= $tr_cfg['limit_leech_ips']) + { + msg_die('You can leech only from '. $tr_cfg['limit_leech_ips'] ." IP's"); + } + } +} \ No newline at end of file diff --git a/upload/bt/includes/tr_scraper.php b/upload/bt/includes/tr_scraper.php new file mode 100644 index 000000000..bc8776e67 --- /dev/null +++ b/upload/bt/includes/tr_scraper.php @@ -0,0 +1,25 @@ +escape($info_hash), ' '); + +$row = DB()->fetch_row(" + SELECT tor.complete_count, snap.seeders, snap.leechers + FROM ". BB_BT_TORRENTS ." tor + LEFT JOIN ". BB_BT_TRACKER_SNAP ." snap ON (snap.topic_id = tor.topic_id) + WHERE tor.info_hash = '$info_hash_sql' + LIMIT 1 +"); + +$output['files'][$info_hash] = array( + 'complete' => (int) $row['seeders'], + 'downloaded' => (int) $row['complete_count'], + 'incomplete' => (int) $row['leechers'], +); + +echo bencode($output); + +tracker_exit(); \ No newline at end of file diff --git a/upload/bt/index.php b/upload/bt/index.php new file mode 100644 index 000000000..7e44c5d1d --- /dev/null +++ b/upload/bt/index.php @@ -0,0 +1,3 @@ + (int) 1800, + 'failure reason' => (string) $msg, + 'warning message' => (string) $msg, + )); + + die($output); +} + +define('TR_ROOT', './'); +require(TR_ROOT .'includes/init_tr.php'); +require(TR_ROOT .'includes/tr_scraper.php'); +exit; \ No newline at end of file diff --git a/upload/callseed.php b/upload/callseed.php new file mode 100644 index 000000000..ea492b690 --- /dev/null +++ b/upload/callseed.php @@ -0,0 +1,182 @@ +session_start(); + +require(INC_DIR .'bbcode.php'); +require(LANG_DIR .'lang_callseed.php'); + +function topic_info($topic_id) +{ + $sql = " SELECT tor.poster_id, tor.forum_id, tor.attach_id, t.topic_title, f.forum_name + FROM ". BB_BT_TORRENTS ." tor , ". BB_TOPICS ." t, ". BB_FORUMS ." f + WHERE tor.topic_id = $topic_id + AND t.topic_id = tor.topic_id + AND f.forum_id = tor.forum_id + LIMIT 1"; + $row = DB()->fetch_row($sql); + + $t = array( + "topic_title" => $row['topic_title'], + "forum_title" => $row['forum_name'], + "attach_id" => $row['attach_id'], + "topic_poster" => $row['poster_id'] + ); + + return $t; +} + +function send_pm($topic_id, $t_info, $to_user_id) +{ + global $userdata, $lang, $msg_error; + + $sql = "UPDATE ". BB_BT_TORRENTS ." SET call_seed_time=". TIMENOW ." WHERE topic_id = $topic_id"; + if (!DB()->sql_query($sql)) { + $msg_error = "TIME"; + return; + } + + $subj = sprintf ($lang['CALLSEED_SUBJ'], $t_info['topic_title']); + $text = sprintf ($lang['CALLSEED_TEXT'], $topic_id, $t_info['forum_title'], $t_info['topic_title'], $t_info['attach_id']); + $subj = DB()->escape($subj); + $text = DB()->escape($text); + + $sql = "INSERT INTO ". BB_PRIVMSGS ." (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip) + VALUES (". PRIVMSGS_NEW_MAIL .",'$subj',{$userdata['user_id']},$to_user_id,". TIMENOW .",'". USER_IP ."')"; + if (!DB()->sql_query($sql)) { + $msg_error = "MSG"; + return; + } + + $id = DB()->sql_nextid(); + + $sql = "INSERT INTO ". BB_PRIVMSGS_TEXT ." VALUES($id, '". make_bbcode_uid() ."', '$text')"; + if (!DB()->sql_query($sql)) { + $msg_error = "MSG_TEXT"; + return; + } + + $sql = "UPDATE ". BB_USERS ." SET + user_new_privmsg = user_new_privmsg + 1, + user_last_privmsg = ". TIMENOW .", + user_newest_pm_id = $id + WHERE user_id = $to_user_id"; + if (!DB()->sql_query($sql)) { + $msg_error = "POPUP"; + return; + } +} + + $u_id = array(); + $topic_id = request_var('t', 0); + $t_info = topic_info($topic_id); + $msg_error = "OK"; + + $sql = "SELECT call_seed_time FROM ". BB_BT_TORRENTS ." WHERE topic_id = $topic_id LIMIT 1"; + if($row = DB()->fetch_row($sql)) + { + $pr_time = $row['call_seed_time']; + $pause = 86400; //1 day + $cp = TIMENOW - $pr_time; + $pcp = $pause - $cp; + if($cp <= $pause) + { + $cur_pause_hour = floor($pcp/3600); + $cur_pause_min = floor($pcp/60)/*-($cur_pause_hour*60)*/; + $msg_error = "SPAM"; + } + } + else + { + message_die(GENERAL_ERROR, 'Topic does not callseed time', '', __LINE__, __FILE__); + } + + // check have_seed + if ($msg_error == "OK") + { + $sql = "SELECT seeders, leechers FROM ". BB_BT_TRACKER_SNAP ." WHERE topic_id = $topic_id LIMIT 1"; + $row = DB()->fetch_row($sql); + if ($row['seeders'] > 2) + #if ( !in_array($userdata['user_level'], array(ADMIN, MOD)) ) + { + $seeders = $row['seeders']; + $leechers = $row['leechers']; + $msg_error = "HAVE_SEED"; + } + } + + $sql = "SELECT user_id FROM ". BB_BT_DLSTATUS ." WHERE topic_id = $topic_id"; + /*$row = DB()->fetch_rowset($sql);*/ + foreach(DB()->fetch_rowset($sql) as $row) + { + $u_id[] = $row['user_id']; + } + if (!in_array($t_info['topic_poster'], $u_id)) + { + $u_id[] = $t_info['topic_poster']; + } + array_unique($u_id); + + foreach($u_id as $i=>$user_id) + { + if ($msg_error != "OK") break; + + send_pm($topic_id, $t_info, $user_id); + } + + $msg = ''; + meta_refresh("viewtopic.php?t=$topic_id", 8); + $return_to = sprintf ($lang['CALLSEED_RETURN'], $topic_id); + + switch($msg_error) { + case "OK": + $msg .= $lang['CALLSEED_MSG_OK']; + break; + case "SPAM": + $msg .= sprintf ($lang['CALLSEED_MSG_SPAM'], $cur_pause_hour, $cur_pause_min); + break; + case "MSG": + $msg .= $lang['CALLSEED_MSG_MSG']; + break; + case "MSG_TEXT": + $msg .= $lang['CALLSEED_MSG_MSG_TEXT']; + break; + case "POPUP": + $msg .= $lang['CALLSEED_MSG_POPUP']; + break; + case "TIME": + $msg .= $lang['CALLSEED_MSG_TIME']; + break; + case "HAVE_SEED": + $msg .= sprintf ($lang['CALLSEED_HAVE_SEED'], $seeders, $leechers); + break; + } + +$msg .= $return_to; +message_die(GENERAL_MESSAGE, $msg); \ No newline at end of file diff --git a/upload/common.php b/upload/common.php new file mode 100644 index 000000000..91891eed7 --- /dev/null +++ b/upload/common.php @@ -0,0 +1,1277 @@ + $srv_cfg + var $srv = array(); // $srv_name => $db_obj + var $alias = array(); // $srv_alias => $srv_name + + var $log_file = 'sql_queries'; + var $log_counter = 0; + var $num_queries = 0; + var $sql_inittime = 0; + var $sql_timetotal = 0; + + function DBS ($cfg) + { + $this->cfg = $cfg['db']; + $this->alias = $cfg['db_alias']; + + foreach ($this->cfg as $srv_name => $srv_cfg) + { + $this->srv[$srv_name] = null; + } + } + + // / $srv_name + function get_db_obj ($srv_name_or_alias = 'db1') + { + $srv_name = $this->get_srv_name($srv_name_or_alias); + + if (!is_object($this->srv[$srv_name])) + { + $this->srv[$srv_name] = new sql_db($this->cfg[$srv_name]); + $this->srv[$srv_name]->db_server = $srv_name; + } + return $this->srv[$srv_name]; + } + + // + function get_srv_name ($name) + { + if (isset($this->alias[$name])) + { + $srv_name = $this->alias[$name]; + } + else if (isset($this->cfg[$name])) + { + $srv_name = $name; + } + else + { + $srv_name = 'db1'; + } + return $srv_name; + } +} + +$DBS = new DBS($bb_cfg); + +function DB ($db_alias = 'db1') +{ + global $DBS; + return $DBS->get_db_obj($db_alias); +} + +// Cache +define('PEER_HASH_PREFIX', 'peer_'); +define('PEERS_LIST_PREFIX', 'peers_list_'); + +define('PEER_HASH_EXPIRE', round($bb_cfg['announce_interval'] * (0.85*$tr_cfg['expire_factor']))); // sec +define('PEERS_LIST_EXPIRE', round($bb_cfg['announce_interval'] * 0.7)); // sec + +class CACHES +{ + var $cfg = array(); // + var $obj = array(); // - + var $ref = array(); // $obj (_ => _) + + function CACHES ($cfg) + { + $this->cfg = $cfg['cache']; + $this->obj['__stub'] = new cache_common(); + } + + function get_cache_obj ($cache_name) + { + if (!isset($this->ref[$cache_name])) + { + if (!$engine_cfg =& $this->cfg['engines'][$cache_name]) + { + $this->ref[$cache_name] =& $this->obj['__stub']; + } + else + { + $cache_type =& $engine_cfg[0]; + $cache_cfg =& $engine_cfg[1]; + + switch ($cache_type) + { + case 'cache_memcache': + if (!$mc_name =& $cache_cfg[0]) + { + trigger_error("empty mc_name for $cache_name cache", E_USER_ERROR); + } + if (!$mc_cfg =& $this->cfg['memcache'][$mc_name]) + { + trigger_error("mc_cfg for $cache_name not found", E_USER_ERROR); + } + if (!isset($this->obj[$mc_name])) + { + $servers = (array) $mc_cfg[0]; + $pconnect = $mc_cfg[1]; + $con_required = $mc_cfg[2]; + + $this->obj[$mc_name] = new cache_memcache(array( + 'mc_name' => $mc_name, + 'mc_class' => $this->cfg['mc_class'], // $bb_cfg['cache']['mc_class'] + 'servers' => $servers, + 'pconnect' => $pconnect, // $bb_cfg['cache']['pconnect'] + 'con_required' => $con_required, + )); + } + $this->ref[$cache_name] =& $this->obj[$mc_name]; + break; + + case 'cache_sqlite': + if (!isset($this->obj[$cache_name])) + { + $cache_cfg['pconnect'] = $this->cfg['pconnect']; + $cache_cfg['db_file_path'] = $this->get_db_path($cache_name, $cache_cfg, '_cache.sqlite.db'); + + $this->obj[$cache_name] = new cache_sqlite($cache_cfg); + } + $this->ref[$cache_name] =& $this->obj[$cache_name]; + break; + + case 'db_sqlite': + if (!isset($this->obj[$cache_name])) + { + $cache_cfg['pconnect'] = $this->cfg['pconnect']; + $cache_cfg['db_file_path'] = $this->get_db_path($cache_name, $cache_cfg, '.sqlite.db'); + $cache_cfg['table_name'] = $cache_name; + $cache_cfg['table_schema'] = $this->get_table_schema($cache_cfg); + + $this->obj[$cache_name] = new sqlite_common($cache_cfg); + } + $this->ref[$cache_name] =& $this->obj[$cache_name]; + break; + + case 'filecache': + if (!isset($this->obj[$cache_name])) + { + $this->obj[$cache_name] = new cache_file($this->cfg['db_dir'] . $cache_name .'/'); + } + $this->ref[$cache_name] =& $this->obj[$cache_name]; + break; + + default: + trigger_error("invalid cache_type: $cache_type", E_USER_ERROR); + } + } + } + + return $this->ref[$cache_name]; + } + + function get_db_path ($name, $cfg, $ext) + { + if (!empty($cfg['shard_type']) && $cfg['shard_type'] != 'none') + { + return $this->cfg['db_dir'] . $name .'_*'. $ext; + } + else + { + return $this->cfg['db_dir'] . $name . $ext; + } + } + + function get_table_schema ($cfg) + { + return "CREATE TABLE {$cfg['table_name']} ( {$cfg['columns']} )"; + } +} + +$CACHES = new CACHES($bb_cfg); + +function CACHE ($cache_name) +{ + global $CACHES; + return $CACHES->get_cache_obj($cache_name); +} + +class cache_common +{ + var $used = false; + /** + * Returns value of variable + */ + function get ($key, $get_miss_key_callback = '', $prefix = '', $ttl = 604800) + { + if ($get_miss_key_callback) return $get_miss_key_callback($key); + return is_array($key) ? array() : false; + } + /** + * Store value of variable + */ + function set ($key, $value, $ttl = 604800, $prefix = '') + { + return false; + } + /** + * Remove variable + */ + function rm ($key, $prefix = '') + { + return false; + } +} + +class cache_memcache extends cache_common +{ + var $cfg = array( + 'mc_class' => 'class_name', // $bb_cfg['cache']['mc_class'] + ); + var $used = true; + var $db = null; + + function cache_memcache ($cfg) + { + $this->cfg = array_merge($this->cfg, $cfg); + $this->db = new $this->cfg['mc_class']($this->cfg); + } + + function get ($key, $get_miss_key_callback = '', $prefix = '', $ttl = 604800) + { + if (empty($key)) + { + return is_array($key) ? array() : false; + } + $cached_items = array(); + $prefix_len = strlen($prefix); + $key_ary = (array) $key; + $key_get = array(); + + foreach ($key_ary as $k) + { + $key_get[] = $prefix . $k; + } + + // get available items + foreach ($this->db->get($key_get) as $k => $v) + { + $cached_items[substr($k, $prefix_len)] = $v; + } + + // get miss items + if ($get_miss_key_callback AND $miss_key = array_diff($key_ary, array_keys($cached_items))) + { + foreach ($get_miss_key_callback($miss_key) as $k => $v) + { + $this->set($prefix.$k, $v, $ttl); + $cached_items[$k] = $v; + } + } + // return + if (is_array($key)) + { + return $cached_items; + } + else + { + return isset($cached_items[$key]) ? $cached_items[$key] : false; + } + } + + function set ($key, $value, $ttl = 604800, $prefix = '') + { + return $this->db->set($prefix.$key, $value, $ttl); + } + + function rm ($key, $prefix = '') + { + return $this->db->rm($prefix.$key); + } +} + +class memcache_common extends cache_dbg_common +{ + var $cfg = array( + 'mc_name' => null, // $bb_cfg['cache']['memcache'][ key ] + 'servers' => array('host:port'), // $bb_cfg['cache']['memcache'][ val ] + 'pconnect' => false, // $bb_cfg['cache']['pconnect'] + 'con_required' => false, + 'log_name' => 'memcache', + ); + var $engine = 'Memcache'; + var $mc = null; + + function memcache_common ($cfg = array()) + { + $this->mc = new Memcache(); + + $this->cfg = array_merge($this->cfg, $cfg); + $this->dbg_enabled = sql_dbg_enabled(); + + $this->init(); + } + + function init () + { + $this->cur_query = ($this->dbg_enabled) ? "addServer(". join(", ", (array)$this->cfg['servers']) .", ". (int) $this->cfg['pconnect'] .", ". (int) $this->cfg['con_required'] .")" : ''; + $this->debug('start'); + + foreach ($this->cfg['servers'] as $srv) + { + list($host, $port) = explode(':', $srv); + $this->mc->addServer($host, $port, $this->cfg['pconnect']); + } + $this->mc->setCompressThreshold(5000); + + $this->debug('stop'); + } + + function get ($key) + { + $this->cur_query = ($this->dbg_enabled) ? "get(". join(", ", (array)$key) .")" : ''; + $this->debug('start'); + + $result = $this->mc->get($key); + + if (!is_array($result)) + { + // + $result = array(); + } + + $this->debug('stop'); + return $result; + } + + function set ($key, $value, $ttl = 604800, $flag = 0) + { + $this->cur_query = ($this->dbg_enabled) ? "set($key, ". str_compact(print_r($value, true)) .")" : ''; + $this->debug('start'); + + $result = $this->mc->set($key, $value, $flag, $ttl); + + $this->debug('stop'); + return $result; + } + + function rm ($key) + { + $this->cur_query = ($this->dbg_enabled) ? "rm('$key')" : ''; + $this->debug('start'); + + $result = $this->mc->delete($key, 0); + + $this->debug('stop'); + return $result; + } +} + +class memcached_common extends cache_dbg_common +{ + var $cfg = array( + 'mc_name' => null, // $bb_cfg['cache']['memcache'][ key ] + 'servers' => array('host:port'), // $bb_cfg['cache']['memcache'][ val ] + 'pconnect' => false, // $bb_cfg['cache']['pconnect'] + 'con_required' => false, + 'log_name' => 'memcached', + ); + var $engine = 'Memcached'; + var $mc = null; + + function memcached_common ($cfg = array()) + { + $this->cfg = array_merge($this->cfg, $cfg); + $this->dbg_enabled = sql_dbg_enabled(); + + $persistent_id = ($this->cfg['pconnect']) ? $this->cfg['mc_name'] : ''; + + if ($this->dbg_enabled) + { + $pconnect = ($this->cfg['pconnect']) ? 'pcon' : 'not_pcon'; + $con_req = ($this->cfg['con_required']) ? 'req' : 'not_req'; + $this->engine .= "($persistent_id), $pconnect, $con_req"; + } + + $this->mc = new Memcached($persistent_id); + + $this->init(); + } + + function init () + { + if (!count($this->mc->getServerList())) + { + $this->cur_query = ($this->dbg_enabled) ? "addServer(". join(", ", (array)$this->cfg['servers']) .")" : ''; + $this->debug('start'); + + foreach ($this->cfg['servers'] as $srv) + { + list($host, $port) = explode(':', $srv); + $this->mc->addServer($host, $port); + } + + $this->debug('stop'); + } + } + + function get ($key) + { + $this->cur_query = ($this->dbg_enabled) ? "get(". join(", ", (array)$key) .")" : ''; + $this->debug('start'); + + $result = $this->mc->getMulti((array)$key); + + if (!is_array($result)) + { + $res_code = $this->mc->getResultCode(); + $res_msg = $this->mc->getResultMessage(); + $err_txt = "Memcached({$this->cfg['mc_name']})::get failed [$res_code, $res_msg]"; + + if ($this->cfg['con_required']) + { + trigger_error($err_txt, E_USER_ERROR); + } + else + { + bb_log(join(" ", array(date('d-m H:i:s'), $err_txt))."\n", 'mc_err'); + } + $result = array(); + } + + $this->debug('stop'); + return $result; + } + + function set ($key, $value, $ttl = 604800, $flag = 0) + { + $this->cur_query = ($this->dbg_enabled) ? "set($key, ". str_compact(print_r($value, true)) .")" : ''; + $this->debug('start'); + + $result = $this->mc->set($key, $value, $ttl); + + $this->debug('stop'); + return $result; + } + + function rm ($key) + { + $this->cur_query = ($this->dbg_enabled) ? "rm('$key')" : ''; + $this->debug('start'); + + $result = $this->mc->delete($key, 0); + + $this->debug('stop'); + return $result; + } +} + +class cache_sqlite extends cache_common +{ + var $used = true; + var $db = null; + var $cfg = array( + 'db_file_path' => '/path/to/cache.db.sqlite', + 'table_name' => 'cache', + 'table_schema' => 'CREATE TABLE cache ( + cache_name VARCHAR(255), + cache_expire_time INT, + cache_value TEXT, + PRIMARY KEY (cache_name) + )', + 'pconnect' => true, + 'con_required' => true, + 'log_name' => 'CACHE', + ); + + function cache_sqlite ($cfg) + { + $this->cfg = array_merge($this->cfg, $cfg); + $this->db = new sqlite_common($this->cfg); + } + + function get ($key, $get_miss_key_callback = '', $prefix = '', $ttl = 604800) + { + if (empty($key)) + { + return is_array($key) ? array() : false; + } + $this->db->shard($prefix.$key); + $cached_items = array(); + $prefix_len = strlen($prefix); + $prefix_sql = sqlite_escape_string($prefix); + + $key_ary = $key_sql = (array) $key; + array_deep($key_sql, 'sqlite_escape_string'); + + // get available items + $rowset = $this->db->fetch_rowset(" + SELECT cache_name, cache_value + FROM ". $this->cfg['table_name'] ." + WHERE cache_name IN('$prefix_sql". join("','$prefix_sql", $key_sql) ."') AND cache_expire_time > ". TIMENOW ." + LIMIT ". count($key) ." + "); + + $this->db->debug('start', 'unserialize()'); + foreach ($rowset as $row) + { + $cached_items[substr($row['cache_name'], $prefix_len)] = unserialize($row['cache_value']); + } + $this->db->debug('stop'); + + // get miss items + if ($get_miss_key_callback AND $miss_key = array_diff($key_ary, array_keys($cached_items))) + { + foreach ($get_miss_key_callback($miss_key) as $k => $v) + { + $this->set($prefix.$k, $v, $ttl); + $cached_items[$k] = $v; + } + } + // return + if (is_array($key)) + { + return $cached_items; + } + else + { + return isset($cached_items[$key]) ? $cached_items[$key] : false; + } + } + + function set ($key, $value, $ttl = 604800, $prefix = '') + { + $this->db->shard($prefix.$key); + $key_sql = sqlite_escape_string($prefix.$key); + $expire = TIMENOW + $ttl; + $value_sql = sqlite_escape_string(serialize($value)); + + $result = $this->db->query("REPLACE INTO ". $this->cfg['table_name'] ." (cache_name, cache_expire_time, cache_value) VALUES ('$key_sql', $expire, '$value_sql')"); + return (bool) $result; + } + + function rm ($key, $prefix = '') + { + $this->db->shard($prefix.$key); + $result = $this->db->query("DELETE FROM ". $this->cfg['table_name'] ." WHERE cache_name = '". sqlite_escape_string($prefix.$key) ."'"); + return (bool) $result; + } + + function gc ($expire_time = TIMENOW) + { + $result = $this->db->query("DELETE FROM ". $this->cfg['table_name'] ." WHERE cache_expire_time < $expire_time"); + return ($result) ? sqlite_changes($this->db->dbh) : 0; + } +} + +class sqlite_common extends cache_dbg_common +{ + var $cfg = array( + 'db_file_path' => 'sqlite.db', + 'table_name' => 'table_name', + 'table_schema' => 'CREATE TABLE table_name (...)', + 'pconnect' => true, + 'con_required' => true, + 'log_name' => 'SQLite', + 'shard_type' => 'none', # none, string, int ( ) + 'shard_val' => 0, # string - . , int - ( ) + ); + var $engine = 'SQLite DB'; + var $dbh = null; + var $connected = false; + var $shard_val = false; + + var $table_create_attempts = 0; + + function sqlite_common ($cfg) + { + $this->cfg = array_merge($this->cfg, $cfg); + $this->dbg_enabled = sql_dbg_enabled(); + } + + function connect () + { + $this->cur_query = ($this->dbg_enabled) ? ($this->cfg['pconnect'] ? 'p' : '') .'connect to: '. $this->cfg['db_file_path'] : 'connect'; + $this->debug('start'); + + $connect_type = ($this->cfg['pconnect']) ? 'sqlite_popen' : 'sqlite_open'; + + if ($this->cfg['shard_type'] != 'none' && $this->shard_val === false) + { + trigger_error("cannot shard: shard_val not defined for {$this->cfg['db_file_path']}", E_USER_ERROR); + } + + if (@$this->dbh = $connect_type($this->cfg['db_file_path'], 0666, $sqlite_error)) + { + $this->connected = true; + } + + if (!$this->connected && $this->cfg['con_required']) + { + trigger_error($sqlite_error, E_USER_ERROR); + } + + $this->debug('stop'); + $this->cur_query = null; + } + + function create_table () + { + $this->table_create_attempts++; + return sqlite_query($this->dbh, $this->cfg['table_schema']); + } + + function shard ($key) + { + $type = $this->cfg['shard_type']; + + if ($type == 'none') return; + if (is_array($key)) trigger_error('cannot shard: $key is array', E_USER_ERROR); + + // define shard_val + if ($type == 'string') + { + $shard_val = substr($key, 0, $this->cfg['shard_val']); + } + else + { + $shard_val = $key % $this->cfg['shard_val']; + } + // + if ($this->shard_val !== false) + { + if ($shard_val != $this->shard_val) + { + trigger_error("shard cannot be reassigned. [{$this->shard_val}, $shard_val, $key]", E_USER_ERROR); + } + else + { + return; + } + } + $this->shard_val = $shard_val; + $this->cfg['db_file_path'] = str_replace('*', $shard_val, $this->cfg['db_file_path']); + } + + function query ($query) + { + if (!$this->connected) $this->connect(); + + $this->cur_query = $query; + $this->debug('start'); + + if (!$result = @sqlite_unbuffered_query($this->dbh, $query, SQLITE_ASSOC)) + { + if (!$this->table_create_attempts && !sqlite_num_rows(sqlite_query($this->dbh, "PRAGMA table_info({$this->cfg['table_name']})"))) + { + if ($this->create_table()) + { + $result = sqlite_unbuffered_query($this->dbh, $query, SQLITE_ASSOC); + } + } + if (!$result) + { + $this->trigger_error($this->get_error_msg()); + } + } + + $this->debug('stop'); + $this->cur_query = null; + + $this->num_queries++; + + return $result; + } + + function fetch_row ($query) + { + $result = $this->query($query); + return is_resource($result) ? sqlite_fetch_array($result, SQLITE_ASSOC) : false; + } + + function fetch_rowset ($query) + { + $result = $this->query($query); + return is_resource($result) ? sqlite_fetch_all($result, SQLITE_ASSOC) : array(); + } + + function changes () + { + return is_resource($this->dbh) ? sqlite_changes($this->dbh) : 0; + } + + function escape ($str) + { + return sqlite_escape_string($str); + } + + function get_error_msg () + { + return 'SQLite error #'. ($err_code = sqlite_last_error($this->dbh)) .': '. sqlite_error_string($err_code); + } + + function trigger_error ($msg = 'DB Error') + { + if (error_reporting()) trigger_error($msg, E_USER_ERROR); + } +} + +class cache_dbg_common +{ + var $num_queries = 0; + var $sql_starttime = 0; + var $sql_inittime = 0; + var $sql_timetotal = 0; + var $cur_query_time = 0; + + var $dbg = array(); + var $dbg_id = 0; + var $dbg_enabled = false; + var $cur_query = null; + + function debug ($mode, $cur_query = null) + { + if (!$this->dbg_enabled) return; + + $id =& $this->dbg_id; + $dbg =& $this->dbg[$id]; + + if ($mode == 'start') + { + $this->sql_starttime = utime(); + + $dbg['sql'] = isset($cur_query) ? short_query($cur_query) : short_query($this->cur_query); + $dbg['src'] = $this->debug_find_source(); + $dbg['file'] = $this->debug_find_source('file'); + $dbg['line'] = $this->debug_find_source('line'); + $dbg['time'] = ''; + } + else if ($mode == 'stop') + { + $this->cur_query_time = utime() - $this->sql_starttime; + $this->sql_timetotal += $this->cur_query_time; + $dbg['time'] = $this->cur_query_time; + $id++; + } + } + + function debug_find_source ($mode = '') + { + foreach (debug_backtrace() as $trace) + { + if ($trace['file'] !== __FILE__) + { + switch ($mode) + { + case 'file': return $trace['file']; + case 'line': return $trace['line']; + default: return hide_bb_path($trace['file']) .'('. $trace['line'] .')'; + } + } + } + return 'src not found'; + } +} + +function sql_dbg_enabled () +{ + return (SQL_DEBUG && DBG_USER && !empty($_COOKIE['sql_log'])); +} + +function short_query ($sql, $esc_html = false) +{ + $max_len = 2500; + $sql = str_compact($sql); + + if (empty($_COOKIE['sql_log_full'])) + { + if (strlen($sql) > $max_len) + { + $sql = substr($sql, 0, $max_len-500) .' [...cut...] '. substr($sql, -480); + } + } + + return ($esc_html) ? htmlCHR($sql, true) : $sql; +} + +class cache_file extends cache_common +{ + var $used = true; + + var $dir = null; + + function cache_file ($dir) + { + $this->dir = $dir; + } + + function get ($name) + { + $filename = $this->dir . clean_filename($name) . '.php'; + + if(file_exists($filename)) + { + require($filename); + } + + return (!empty($filecache['value'])) ? $filecache['value'] : false; + } + + function set ($name, $value, $ttl = 86400) + { + if (!function_exists('var_export')) + { + return false; + } + + $filename = $this->dir . clean_filename($name) . '.php'; + $expire = TIMENOW + $ttl; + $cache_data = array( + 'expire' => $expire, + 'value' => $value, + ); + + $filecache = "'; + + return (bool) file_write($filecache, $filename, false, true, true); + } + + function rm ($name) + { + $filename = $this->dir . clean_filename($name) . '.php'; + if (file_exists($filename)) + { + return (bool) unlink($filename); + } + return false; + } + + function gc ($expire_time = TIMENOW) + { + $dir = $this->dir; + + if (is_dir($dir)) + { + if ($dh = opendir($dir)) + { + while (($file = readdir($dh)) !== false) + { + if ($file != "." && $file != "..") + { + $filename = $dir . $file; + + require($filename); + + if(!empty($filecache['expire']) && ($filecache['expire'] < $expire_time)) + { + unlink($filename); + } + } + } + closedir($dh); + } + } + + return; + } +} + +// Functions +function utime () +{ + return array_sum(explode(' ', microtime())); +} + +function bb_log ($msg, $file_name) +{ + if (is_array($msg)) + { + $msg = join(LOG_LF, $msg); + } + $file_name .= (LOG_EXT) ? '.'. LOG_EXT : ''; + return file_write($msg, LOG_DIR . $file_name); +} + +function file_write ($str, $file, $max_size = LOG_MAX_SIZE, $lock = true, $replace_content = false) +{ + $bytes_written = false; + + if ($max_size && @filesize($file) >= $max_size) + { + $old_name = $file; $ext = ''; + if (preg_match('#^(.+)(\.[^\\/]+)$#', $file, $matches)) + { + $old_name = $matches[1]; $ext = $matches[2]; + } + $new_name = $old_name .'_[old]_'. date('Y-m-d_H-i-s_') . getmypid() . $ext; + clearstatcache(); + if (@file_exists($file) && @filesize($file) >= $max_size && !@file_exists($new_name)) + { + @rename($file, $new_name); + } + } + if (!$fp = @fopen($file, 'ab')) + { + if ($dir_created = bb_mkdir(dirname($file))) + { + $fp = @fopen($file, 'ab'); + } + } + if ($fp) + { + if ($lock) + { + @flock($fp, LOCK_EX); + } + if ($replace_content) + { + @ftruncate($fp, 0); + @fseek($fp, 0, SEEK_SET); + } + $bytes_written = @fwrite($fp, $str); + @fclose($fp); + } + + return $bytes_written; +} + +function bb_mkdir ($path, $mode = 0777) +{ + $old_um = umask(0); + $dir = mkdir_rec($path, $mode); + umask($old_um); + return $dir; +} + +function mkdir_rec ($path, $mode) +{ + if (is_dir($path)) + { + return ($path !== '.' && $path !== '..') ? is_writable($path) : false; + } + else + { + return (mkdir_rec(dirname($path), $mode)) ? @mkdir($path, $mode) : false; + } +} + +function verify_id ($id, $length) +{ + return (preg_match('#^[a-zA-Z0-9]{'. $length .'}$#', $id) && is_string($id)); +} + +function clean_filename ($fname) +{ + static $s = array('\\', '/', ':', '*', '?', '"', '<', '>', '|', ' '); + return str_replace($s, '_', str_compact($fname)); +} + +function encode_ip ($dotquad_ip) +{ + $ip_sep = explode('.', $dotquad_ip); + if (count($ip_sep) == 4) + { + return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]); + } + + $ip_sep = explode(':', preg_replace('/(^:)|(:$)/', '', $dotquad_ip)); + $res = ''; + foreach ($ip_sep as $x) + { + $res .= sprintf('%0'. ($x == '' ? (9 - count($ip_sep)) * 4 : 4) .'s', $x); + } + return $res; +} + +function decode_ip ($int_ip) +{ + $int_ip = trim($int_ip); + + if (strlen($int_ip) == 32) + { + $int_ip = substr(chunk_split($int_ip, 4, ':'), 0, 39); + $int_ip = ':'. implode(':', array_map("hexhex", explode(':',$int_ip))) .':'; + preg_match_all("/(:0)+/", $int_ip, $zeros); + if (count($zeros[0]) > 0) + { + $match = ''; + foreach($zeros[0] as $zero) + if (strlen($zero) > strlen($match)) + $match = $zero; + $int_ip = preg_replace('/'. $match .'/', ':', $int_ip, 1); + } + return preg_replace('/(^:([^:]))|(([^:]):$)/', '$2$4', $int_ip); + } + if (strlen($int_ip) !== 8) $int_ip = '00000000'; + $hexipbang = explode('.', chunk_split($int_ip, 2, '.')); + return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]); +} + +function hexhex ($value) +{ + return dechex(hexdec($value)); +} + +function verify_ip ($ip) +{ + return preg_match('#^(\d{1,3}\.){3}\d{1,3}$#', $ip); +} + +function str_compact ($str) +{ + return preg_replace('#\s+#', ' ', trim($str)); +} + +function make_rand_str ($len = 10) +{ + $str = ''; + while (strlen($str) < $len) + { + $str .= str_shuffle(preg_replace('#[^0-9a-zA-Z]#', '', crypt(uniqid(mt_rand(), true)))); + } + return substr($str, 0, $len); +} + +// bencode: based on OpenTracker [http://whitsoftdev.com/opentracker] +function bencode ($var) +{ + if (is_string($var)) + { + return strlen($var) .':'. $var; + } + else if (is_int($var)) + { + return 'i'. $var .'e'; + } + else if (is_float($var)) + { + return 'i'. sprintf('%.0f', $var) .'e'; + } + else if (is_array($var)) + { + if (count($var) == 0) + { + return 'de'; + } + else + { + $assoc = false; + + foreach ($var as $key => $val) + { + if (!is_int($key)) + { + $assoc = true; + break; + } + } + + if ($assoc) + { + ksort($var, SORT_REGULAR); + $ret = 'd'; + + foreach ($var as $key => $val) + { + $ret .= bencode($key) . bencode($val); + } + return $ret .'e'; + } + else + { + $ret = 'l'; + + foreach ($var as $val) + { + $ret .= bencode($val); + } + return $ret .'e'; + } + } + } + else + { + trigger_error('bencode error: wrong data type', E_USER_ERROR); + } +} + +function array_deep (&$var, $fn, $one_dimensional = false, $array_only = false) +{ + if (is_array($var)) + { + foreach ($var as $k => $v) + { + if (is_array($v)) + { + if ($one_dimensional) + { + unset($var[$k]); + } + else if ($array_only) + { + $var[$k] = $fn($v); + } + else + { + array_deep($var[$k], $fn); + } + } + else if (!$array_only) + { + $var[$k] = $fn($v); + } + } + } + else if (!$array_only) + { + $var = $fn($var); + } +} + +function hide_bb_path ($path) +{ + return ltrim(str_replace(BB_PATH, '', $path), '/\\'); +} + +function tr_drop_request ($drop_type) +{ + if (DBG_LOG) dbg_log(' ', "request-dropped-$drop_type"); + dummy_exit(mt_rand(300, 900)); +} + +function get_loadavg () +{ + if (is_callable('sys_getloadavg')) + { + $loadavg = join(' ', sys_getloadavg()); + } + else if (strpos(PHP_OS, 'Linux') !== false) + { + $loadavg = @file_get_contents('/proc/loadavg'); + } + + return !empty($loadavg) ? $loadavg : 0; +} + +function sys ($param) +{ + switch ($param) + { + case 'la': + return function_exists('sys_getloadavg') ? join(' ', sys_getloadavg()) : 0; + break; + case 'mem': + return function_exists('memory_get_usage') ? memory_get_usage() : 0; + break; + case 'mem_peak': + return function_exists('memory_get_peak_usage') ? memory_get_peak_usage() : 0; + break; + default: + trigger_error("invalid param: $param", E_USER_ERROR); + } +} + +function ver_compare ($version1, $operator, $version2) +{ + return version_compare($version1, $version2, $operator); +} + +// Board init +if (defined('IN_PHPBB')) +{ + require(INC_DIR .'init_bb.php'); +} +// Tracker init +else if (defined('IN_TRACKER')) +{ + define('DUMMY_PEER', pack('Nn', ip2long($_SERVER['REMOTE_ADDR']), !empty($_GET['port']) ? intval($_GET['port']) : mt_rand(1000, 65000))); + + function dummy_exit ($interval = 1800) + { + $output = bencode(array( + 'interval' => (int) $interval, + 'min interval' => (int) $interval, + 'peers' => (string) DUMMY_PEER, + )); + + die($output); + } + + header('Content-Type: text/plain'); + header('Pragma: no-cache'); + + if (STRIP_SLASHES) + { + array_deep($_GET, 'stripslashes'); + array_deep($_POST, 'stripslashes'); + } + + if (!defined('IN_ADMIN')) + { + // Exit if tracker is disabled via ON/OFF trigger + if (file_exists(BB_DISABLED)) + { + dummy_exit(mt_rand(1200, 2400)); # die('d14:failure reason20:temporarily disablede'); + } + + // Limit server load + if ($bb_cfg['max_srv_load'] || $bb_cfg['tr_working_second']) + { + if ((!empty($_GET['uploaded']) || !empty($_GET['downloaded'])) && (!isset($_GET['event']) || $_GET['event'] === 'started')) + { + if ($bb_cfg['tr_working_second'] && (TIMENOW % $bb_cfg['tr_working_second'])) + { + tr_drop_request('wrk_sec'); + } + else if ($bb_cfg['max_srv_load'] && LOADAVG) + { + if (LOADAVG > $bb_cfg['max_srv_load']) + { + tr_drop_request('load'); + } + } + } + } + } +} diff --git a/upload/config.php b/upload/config.php new file mode 100644 index 000000000..3e53f7ad9 --- /dev/null +++ b/upload/config.php @@ -0,0 +1,547 @@ + 'srv_name' +); + +// http://www.php.net/manual/en/mysql.constants.php#mysql.client-flags +define('DBFLAGS', NULL); // Flags: MYSQL_CLIENT_COMPRESS - Compress MySQL +define('DBMS', 'mysql'); +define('DBCOLLATION', ''); +define('PCONNECT', false); + +// Cache +$bb_cfg['cache']['pconnect'] = false; +$bb_cfg['cache']['db_dir'] = realpath(BB_ROOT) .'/cache/filecache/'; + +$bb_cfg['cache']['memcache'] = array( + // cache + 'mc_bb_core' => array('localhost:11211', false, false), + // datastore + 'ds_bb_core' => array('localhost:11211', false, false), +); + +$bb_cfg['cache']['mc_class'] = 'memcache_common'; // memcache_common, memcached_common + +# name => array( (string) type, (array) cfg ) + +$bb_cfg['cache']['engines'] = array( + 'bb_cache' => array('filecache', array()), + 'tr_cache' => array('filecache', array()), + 'session_cache' => array('filecache', array()), + + 'bb_cap_sid' => array('cache_sqlite', array()), + 'bb_login_err' => array('cache_sqlite', array()), +); + +// Datastore +$bb_cfg['datastore_type'] = 'filecache'; // Available datastore types: mysql, sqlite, memcache, filecache + +$bb_cfg['datastore']['sqlite'] = array( + 'db_file_path' => $bb_cfg['cache']['db_dir'] . '/bb_datastore.sqlite.db', + 'pconnect' => false, +); +$bb_cfg['datastore']['mc']['srv_all'] = array( + 'ds_bb_core', +); +$bb_cfg['datastore']['mc']['srv_loc'] = 'undefined'; // должен быть определен в node_config.php +// создание конфига кешей +foreach ($bb_cfg['datastore']['mc']['srv_all'] as $ds_srv) +{ + $bb_cfg['cache']['engines'][$ds_srv] = array('cache_memcache', array($ds_srv)); +} + +// Tracker +$bb_cfg['announce_type'] = 'xbt'; // Тип анонсера, xbt или php +$bb_cfg['announce_interval'] = 2400; // Announce interval (default: 1800) +$bb_cfg['passkey_key'] = 'uk'; // Passkey key name in GET request +$bb_cfg['ignore_reported_ip'] = false; // Ignore IP reported by client +$bb_cfg['verify_reported_ip'] = true; // Verify IP reported by client against $_SERVER['HTTP_X_FORWARDED_FOR'] +$bb_cfg['allow_internal_ip'] = false; // Allow internal IP (10.xx.. etc.) + +$bb_cfg['how_to_download_url_help'] = 'viewtopic.php?t=1'; // URL help link for "How to Download?" +$bb_cfg['what_is_torrent_url_help'] = 'viewtopic.php?t=2'; // URL help link for "What is Bittorrent?" +$bb_cfg['ratio_url_help'] = 'viewtopic.php?t=3'; // URL help link for Ratio. + +//$bb_cfg['bt_ratio_warning_msg'] = '$bb_cfg[\'bt_ratio_warning_msg\']'; /* Перемещено в "attach_mod\displaying_torrent.php" */ + +$bb_cfg['bt_min_ratio_allow_dl_tor'] = 0; // 0 - disable +$bb_cfg['bt_min_ratio_warning'] = 0; // 0 - disable +$bb_cfg['bt_ratio_warning_url_help'] = $bb_cfg['ratio_url_help']; // URL help link, for limit end. +$bb_cfg['bt_min_ratio_dl_button'] = 0; // 0 - disable + +$tr_cfg = array( + 'autoclean' => true, + 'off' => false, + 'off_reason' => 'temporarily disabled', + 'numwant' => 50, + 'update_dlstat' => true, + 'expire_factor' => 2.5, + 'compact_mode' => true, + 'upd_user_up_down_stat' => true, + 'browser_redirect_url' => '', + 'scrape' => true, + 'limit_active_tor' => true, + 'limit_seed_count' => 0, + 'limit_leech_count' => 8, + 'leech_expire_factor' => 60, + 'limit_concurrent_ips' => false, + 'limit_seed_ips' => 0, + 'limit_leech_ips' => 2, +); + +$bb_cfg['show_dl_status_in_search'] = true; +$bb_cfg['show_dl_status_in_forum'] = true; + +$bb_cfg['show_tor_info_in_dl_list'] = true; // http://trac.torrentpier.com/trac/changeset/377 +$bb_cfg['allow_dl_list_names_mode'] = true; + +// Torrents +$bb_cfg['torrent_sign'] = ''; // e.g. "[yoursite.com]" +$bb_cfg['tor_help_links'] = ''; + +// Days to keep torrent registered, if: +$bb_cfg['seeder_last_seen_days_keep'] = 20; +$bb_cfg['seeder_never_seen_days_keep'] = 5; + +// Ratio limits +define('TR_RATING_LIMITS', true); // ON/OFF +define('MIN_DL_FOR_RATIO', 5368709120); // in bytes, 0 - disable + +// Don't change the order of ratios (from 0 to 1) +// rating < 0.4 -- allow only 1 torrent for leeching +// rating < 0.5 -- only 2 +// rating < 0.6 -- only 3 +// rating > 0.6 -- depend on your tracker config limits (in "ACP - Tracker Config - Limits") +$rating_limits = array( + '0.4' => 1, + '0.5' => 2, + '0.6' => 3, +); + +// Seeding torrents limit +$bb_cfg['max_seeding_torrents'] = 0; // 0 - unlimited +$bb_cfg['min_up_speed_per_torrent'] = 500; // bytes +$bb_cfg['too_many_seeding_redirect_url'] = 'viewtopic.php?t=TOPIC_ID'; + +// DL-Status +$bb_cfg['dl_will_days_keep'] = 60; // days to keep user's dlstatus records +$bb_cfg['dl_down_days_keep'] = 30; +$bb_cfg['dl_complete_days_keep'] = 180; +$bb_cfg['dl_cancel_days_keep'] = 30; + +// Tor-Stats +$bb_cfg['torstat_days_keep'] = 60; // days to keep user's per-torrent stats + +// Tor-Help +$bb_cfg['torhelp_enabled'] = true; // find dead torrents (without seeder) that user might help seeding + +$page_cfg['show_torhelp'] = array( +# BB_SCRIPT => true + 'index' => true, + 'tracker' => true, +); + +// Path (trailing slash '/' at the end: XX_PATH - without, XX_DIR - with) +define('DIR_SEPR', DIRECTORY_SEPARATOR); + +define('BB_PATH', realpath(BB_ROOT) ); // absolute pathname to the forum root +define('ADMIN_DIR', BB_PATH .'/admin/' ); +define('CACHE_DIR', BB_PATH .'/cache/' ); +define('CFG_DIR', BB_PATH .'/config/' ); +define('DEV_DIR', BB_PATH .'/develop/' ); +define('INC_DIR', BB_PATH .'/includes/' ); +define('LANG_ROOT_DIR', BB_PATH .'/language/' ); +define('LOG_DIR', BB_PATH .'/log/' ); +define('TEMPLATES_DIR', BB_PATH .'/templates/'); +define('TRIGGERS_DIR', BB_PATH .'/triggers/' ); + +// Language +setlocale(LC_ALL, 'ru_RU.UTF-8'); +setlocale(LC_NUMERIC, 'C'); +$bb_cfg['default_lang_dir'] = LANG_ROOT_DIR .'lang_russian/'; + +// Templates +define('ADMIN_TPL_DIR', TEMPLATES_DIR .'/admin/'); + +$bb_cfg['tpl_name'] = 'default'; +$bb_cfg['stylesheet'] = 'main.css'; +$bb_cfg['theme_css'] = 'theme_default.css'; + +$bb_cfg['show_sidebar1_on_every_page'] = false; +$bb_cfg['show_sidebar2_on_every_page'] = false; + +$bb_cfg['sidebar1_static_content_path'] = BB_PATH .'/misc/html/sidebar1.html'; # +$bb_cfg['sidebar2_static_content_path'] = ''; + +$page_cfg['show_sidebar1'] = array( +# BB_SCRIPT => true + 'index' => true, +); +$page_cfg['show_sidebar2'] = array( +# BB_SCRIPT => true + 'index' => false, +); + +$bb_cfg['topic_tpl']['overall_header'] = TEMPLATES_DIR .'topic_tpl_overall_header.html'; +$bb_cfg['topic_tpl']['rules_video'] = TEMPLATES_DIR .'topic_tpl_rules_video.html'; + +// Cookie +$bb_cfg['cookie_domain'] = ''; # '.yourdomain.com' +$bb_cfg['cookie_path'] = '/forum/'; # '/forum/' +$bb_cfg['cookie_secure'] = (!empty($_SERVER['HTTPS']) ? 1 : 0); # 0 +$bb_cfg['cookie_prefix'] = 'bb_'; # 'bb_' + +define('COOKIE_DBG', 'bb_dbg'); // debug cookie name + +// Server +$bb_cfg['server_name'] = $_SERVER['SERVER_NAME']; // The domain name from which this board runs +$bb_cfg['server_port'] = $_SERVER['SERVER_PORT']; // The port your server is running on +$bb_cfg['script_path'] = '/forum/'; // The path where FORUM is located relative to the domain name +$bb_cfg['sitename'] = 'TorrentPier II - Torrent Tracker'; // Name of your site + +// Server load +$bb_cfg['max_srv_load'] = 0; // 0 - disable +$bb_cfg['tr_working_second'] = 0; // 0 - disable + +// Backup +$bb_cfg['db_backup_shell_cmd'] = ''; // '/path/to/db_backup.sh 2>&1' +$bb_cfg['site_backup_shell_cmd'] = ''; + +// GZip +$bb_cfg['gzip_compress'] = false; // compress output +$bb_cfg['gzip_force'] = false; // always compress (don't check client compatibility) + +// Sessions +$bb_cfg['session_update_intrv'] = 180; // sec + +$bb_cfg['user_session_duration'] = 1800; // sec +$bb_cfg['admin_session_duration'] = 6*3600; // sec +$bb_cfg['user_session_gc_ttl'] = 1800; // number of seconds that a staled session entry may remain in sessions table +$bb_cfg['session_cache_gc_ttl'] = 1200; // sec +$bb_cfg['max_reg_users_online'] = 0; // 0 - unlimited +$bb_cfg['max_last_visit_days'] = 14; // days +$bb_cfg['last_visit_update_intrv'] = 3600; // sec + +// Registration +$bb_cfg['new_user_reg_disabled'] = false; // Disable new user registrations +$bb_cfg['unique_ip'] = false; // Deny registration of several accounts by one ip +$bb_cfg['new_user_reg_restricted'] = false; +$bb_cfg['reg_email_activation'] = false; + + +// Email +$bb_cfg['emailer_disabled'] = false; + +$bb_cfg['topic_notify_enabled'] = true; +$bb_cfg['pm_notify_enabled'] = true; +$bb_cfg['groupcp_send_email'] = true; +$bb_cfg['email_change_disabled'] = false; // disable changing email by user + +$bb_cfg['tech_admin_email'] = 'admin@' . $bb_cfg['server_name']; // email for sending error reports +$bb_cfg['abuse_email'] = 'abuse@' . $bb_cfg['server_name']; +$bb_cfg['email_default_charset'] = 'UTF-8'; + +// AJAX +define('AJAX_HTML_DIR', BB_ROOT .'ajax/html/'); +define('AJAX_DIR', BB_ROOT .'ajax/'); + +// Debug +define('DEBUG', false); // !!! "DEBUG" should be ALWAYS DISABLED on production environment !!! +define('DBG_LOG', false); +define('DBG_TIME', true); // false, true или рабочая секудна (при 3 - запись в лог будет только если текущее время кратно 3) +define('DBG_LOG_GENTIME', true); +define('DBG_LOG_ERRORS', true); +define('PROFILER', false); // Profiler extension name, or FALSE to disable (supported: 'dbg') + +define('SQL_DEBUG', true); +define('SQL_LOG_ERRORS', true); // all SQL_xxx options enabled only if SQL_DEBUG == TRUE +define('SQL_CALC_QUERY_TIME', true); // for stats +define('SQL_LOG_SLOW_QUERIES', true); +define('SQL_SLOW_QUERY_TIME', 10); // sec +define('SQL_PREPEND_SRC_COMM', false); // prepend source file(line) comment to sql query + + +// Special users +$bb_cfg['dbg_users'] = array( +# user_id => 'name', + 2 => 'admin', +); + +$bb_cfg['unlimited_users'] = array( +# user_id => 'name', + 2 => 'admin', +); + +$bb_cfg['super_admins'] = array( +# user_id => 'name', + 2 => 'admin', +); + +$bb_cfg['no_form_token_users'] = array( +# user_id => 'name', + 2 => 'admin', +); + +// Log options +define('LOG_EXT', 'log'); +define('LOG_SEPR', ' | '); +define('LOG_LF', "\n"); +define('LOG_MAX_SIZE', 1048576); // bytes + +// Log request +$log_ip_req = array( +# '127.0.0.1' => 'user1', // CLIENT_IP => 'name' +# '7f000001' => 'user2', // USER_IP => 'name' +); + +$log_passkey = array( +# 'passkey' => 'log_filename', +); + +// Log response +$log_ip_resp = array( +# '127.0.0.1' => 'user1', // CLIENT_IP => 'name' +# '7f000001' => 'user2', // USER_IP => 'name' +); + +// Error reporting +if (DEBUG) +{ + error_reporting(E_ALL); + ini_set('display_errors', 1); + ini_set('log_errors', 0); +} +else +{ + error_reporting(E_ALL); # E_ALL & ~E_NOTICE + ini_set('display_errors', 0); + ini_set('log_errors', 1); +} +ini_set('error_log', LOG_DIR .'php_err.log'); + +// Disable magic_quotes_runtime +@set_magic_quotes_runtime(0); +ini_set("magic_quotes_runtime", 0); +define('STRIP_SLASHES', get_magic_quotes_gpc()); +if (STRIP_SLASHES) die('set magic_quotes off'); + +// Triggers +define('BB_ENABLED', TRIGGERS_DIR .'$on'); +define('BB_DISABLED', TRIGGERS_DIR .'$off'); +define('CRON_ALLOWED', TRIGGERS_DIR .'cron_allowed'); +define('CRON_RUNNING', TRIGGERS_DIR .'cron_running'); + +// Cron +// старт производится из cron.php +$bb_cfg['cron_check_interval'] = 45; // sec + +// News +$bb_cfg['show_latest_news'] = true; +$bb_cfg['latest_news_count'] = 5; +$bb_cfg['latest_news_forum_id'] = '1'; // (string) 1,2,3... + +// Subforums +$bb_cfg['sf_on_first_page_only'] = true; +$bb_cfg['sf_check_view_permissions'] = false; + +// Forums +$bb_cfg['allowed_topics_per_page'] = array(50, 100, 150, 200, 250, 300); + +// Topics +$bb_cfg['show_quick_reply'] = true; +$bb_cfg['show_rank_text'] = false; +$bb_cfg['show_rank_image'] = true; +$bb_cfg['show_poster_joined'] = true; +$bb_cfg['show_poster_posts'] = true; +$bb_cfg['show_poster_from'] = true; +$bb_cfg['show_poster_flag'] = true; +$bb_cfg['show_bot_nick'] = false; +$bb_cfg['text_buttons'] = true; // replace EDIT, QUOTE... images with text links +$bb_cfg['parse_ed2k_links'] = true; // make ed2k links clickable +$bb_cfg['post_date_format'] = 'd-M-Y H:i'; +$bb_cfg['ext_link_new_win'] = true; // open external links in new window + +$bb_cfg['topic_moved_days_keep'] = 7; // remove topic moved links after xx days (or FALSE to disable) + +$bb_cfg['allowed_posts_per_page'] = array(15, 30, 50, 100); + +// Posts +$bb_cfg['use_posts_cache'] = true; // if you switch from ON to OFF, you need to TRUNCATE `bb_posts_html` table +$bb_cfg['posts_cache_days_keep'] = 14; +$bb_cfg['max_post_length'] = 120000; // bytes + +// Search +$bb_cfg['search_engine_type'] = 'sphinx'; // none, mysql, sphinx +$bb_cfg['sphinx_topic_titles_host'] = '127.0.0.1'; +$bb_cfg['sphinx_topic_titles_port'] = 3312; +$bb_cfg['disable_ft_search_in_posts'] = false; // disable searching in post bodies +$bb_cfg['disable_search_for_guest'] = true; +$bb_cfg['allow_search_in_bool_mode'] = true; +$bb_cfg['max_search_words_per_post'] = 200; +$bb_cfg['search_min_word_len'] = 3; +$bb_cfg['search_max_word_len'] = 35; +$bb_cfg['limit_max_search_results'] = false; +$bb_cfg['search_help_url'] = ''; +$bb_cfg['search_match_help_topic_id'] = 0; +$bb_cfg['tidy_cfg'] = array( +# 'hide-comments' => false, +# 'indent' => true, +# 'indent-spaces' => 1, +); +$bb_cfg['spam_filter_file_path'] = ''; //BB_PATH .'/misc/spam_filter_words.txt'; + +// Posting +$bb_cfg['show_virtual_keyboard'] = true; +$bb_cfg['prevent_multiposting'] = true; // replace "reply" with "edit last msg" if user (not admin or mod) is last topic poster +$bb_cfg['max_smilies'] = 10; // Максимальное число смайлов в посте (0 - без ограничения) + +// Actions log +$bb_cfg['log_days_keep'] = 90; + +// Users +$bb_cfg['user_not_activated_days_keep'] = 7; // "not activated" == "not finished registration" +$bb_cfg['user_not_active_days_keep'] = 180; // inactive users but only with no posts + +// GroupCP +$bb_cfg['groupcp_members_per_page'] = 300; + +// Ads +$bb_cfg['show_ads'] = false; +$bb_cfg['show_ads_users'] = array( +# user_id => 'name', + 2 => 'admin', +); + +// block_type => [block_id => block_desc] +$bb_cfg['ad_blocks'] = array( + 'trans' => array( + 100 => 'сквозная сверху', + ), + 'index' => array( + 200 => 'главная, под новостями', + ), +); + +// Misc +define('BOT_UID', -746); + +define('LOADAVG', function_exists('get_loadavg') ? get_loadavg() : 0); +define('MEM_USAGE', function_exists('memory_get_usage')); + +$bb_cfg['mem_on_start'] = (MEM_USAGE) ? memory_get_usage() : 0; + +$bb_cfg['translate_dates'] = true; // in displaying time +$bb_cfg['use_word_censor'] = true; + +$bb_cfg['last_visit_date_format'] = 'd-M H:i'; +$bb_cfg['last_post_date_format'] = 'd-M-y H:i'; + +$bb_cfg['allow_change'] = array( + 'language' => true, + 'dateformat' => true, +); + +define('GZIP_OUTPUT_ALLOWED', (extension_loaded('zlib') && !ini_get('zlib.output_compression'))); + +$banned_user_agents = array( +// Download Master +# 'download', +# 'master', +// Others +# 'wget', +); + +$bb_cfg['porno_forums'] = ''; // (string) 1,2,3.. +$bb_cfg['porno_forums_screenshots_topic_id'] = 52267; +$bb_cfg['trash_forum_id'] = 0; // (int) 27 + +$bb_cfg['first_logon_redirect_url'] = 'index.php'; +$bb_cfg['faq_url'] = 'faq.php'; +$bb_cfg['terms_and_conditions_url'] = 'index.php'; + +$bb_cfg['user_agreement_url'] = "misc.php?do=info&show=user_agreement"; +$bb_cfg['copyright_holders_url'] = "misc.php?do=info&show=copyright_holders"; +$bb_cfg['advert_url'] = "misc.php?do=info&show=advert"; + +$bb_cfg['html_path'] = BB_PATH .'/misc/html/'; # +$bb_cfg['user_agreement_html_path'] = $bb_cfg['html_path'] .'user_agreement.html'; # +$bb_cfg['copyright_holders_html_path'] = $bb_cfg['html_path'] .'copyright_holders.html'; # +$bb_cfg['advert_html_path'] = $bb_cfg['html_path'] .'advert.html'; # + + +// Captcha +$bb_cfg['captcha']['name'] = 'torrentpier.me'; +$bb_cfg['captcha']['disabled'] = false; +$bb_cfg['captcha']['secret_key'] = 'secret_key'; +$bb_cfg['captcha']['img_path'] = "./images/captcha/"; # without '/' diff --git a/upload/config/.htaccess b/upload/config/.htaccess new file mode 100644 index 000000000..baa56e5a3 --- /dev/null +++ b/upload/config/.htaccess @@ -0,0 +1,2 @@ +order allow,deny +deny from all \ No newline at end of file diff --git a/upload/config/cron_cfg.php b/upload/config/cron_cfg.php new file mode 100644 index 000000000..582714f73 --- /dev/null +++ b/upload/config/cron_cfg.php @@ -0,0 +1,12 @@ +. | +// +------------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +------------------------------------------------------------------------+ +// +// $Id: Timer.php,v 1.16 2006/03/01 13:41:39 matthias Exp $ +// + +/** + * Provides timing and profiling information. + * + * Example 1: Automatic profiling start, stop, and output. + * + * + * setMarker('Marker 1'); + * ?> + * + * + * Example 2: Manual profiling start, stop, and output. + * + * + * start(); + * $timer->setMarker('Marker 1'); + * $timer->stop(); + * + * $timer->display(); // to output html formated + * // AND/OR : + * $profiling = $timer->getProfiling(); // get the profiler info as an associative array + * ?> + * + * + * @author Sebastian Bergmann + * @author Ludovico Magnocavallo + * @copyright Copyright © 2002-2005 Sebastian Bergmann + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + */ +class Benchmark_Timer { + /** + * Contains the markers. + * + * @var array + * @access private + */ + var $markers = array(); + var $memory = array(); + + var $name_counter = array(); + + /** + * Auto-start and stop timer. + * + * @var boolean + * @access private + */ + var $auto = FALSE; + + /** + * Max marker name length for non-html output. + * + * @var integer + * @access private + */ + var $maxStringLength = 0; + + var $startTime = 0; + + /** + * Constructor. + * + * @param boolean $auto + * @access public + */ + function Benchmark_Timer($auto = FALSE) { + $this->auto = $auto; + $this->startTime = $this->_getMicrotime(); + + if ($this->auto) { + $this->start(); + } + } + + /** + * Destructor. + * + * @access private + */ + function _Benchmark_Timer() { + if ($this->auto) { + $this->stop(); + $this->display(); + } + } + + /** + * Set "Start" marker. + * + * @see setMarker(), stop() + * @access public + */ + function start() { + $this->setMarker('Start'); + } + + /** + * Set "Stop" marker. + * + * @see setMarker(), start() + * @access public + */ + function stop() { + $this->setMarker('Stop'); + } + + /** + * Set marker. + * + * @param string $name Name of the marker to be set. + * @see start(), stop() + * @access public + */ + function setMarker($name = '') { + if (!$name) { + $trace = debug_backtrace(); + $name = $GLOBALS['timer_markers'] .': '. hide_bb_path($trace[0]['file']) .'('. $trace[0]['line'] .')'; + } + if ($name != 'Start' && $name != 'Stop') { + $GLOBALS['timer_markers']++; + } + if (isset($this->markers[$name])) { + $name .= ' ['. @++$this->name_counter[$name] .']'; + } + $this->markers[$name] = $this->_getMicrotime(); + $this->memory[$name] = sys('mem'); + } + + /** + * Returns the time elapsed betweens two markers. + * + * @param string $start start marker, defaults to "Start" + * @param string $end end marker, defaults to "Stop" + * @return double $time_elapsed time elapsed between $start and $end + * @access public + */ + function timeElapsed($start = 'Start', $end = 'Stop') { + if ($end == 'Stop' && !isset($this->markers['Stop'])) { + $this->markers['Stop'] = $this->_getMicrotime(); + } + + if (extension_loaded('bcmath')) { + return bcsub($this->markers[$end], $this->markers[$start], 6); + } else { + return $this->markers[$end] - $this->markers[$start]; + } + } + + /** + * Returns profiling information. + * + * $profiling[x]['name'] = name of marker x + * $profiling[x]['time'] = time index of marker x + * $profiling[x]['diff'] = execution time from marker x-1 to this marker x + * $profiling[x]['total'] = total execution time up to marker x + * + * @return array + * @access public + */ + function getProfiling() { + $i = $total = 0; + $result = array(); + $temp = reset($this->markers); + $mem_before = 0; + $this->maxStringLength = 0; + + foreach ($this->markers as $marker => $time) { + if (extension_loaded('bcmath')) { + $diff = bcsub($time, $temp, 6); + $total = bcadd($total, $diff, 6); + } else { + $diff = $time - $temp; + $total = $total + $diff; + } + + $result[$i]['name'] = $marker; + $result[$i]['time'] = $time; + $result[$i]['diff'] = $diff; + $result[$i]['total'] = $total; + $result[$i]['mem'] = $this->memory[$marker]; + $result[$i]['mem_diff'] = $this->memory[$marker] - $mem_before; + + $this->maxStringLength = (strlen($marker) > $this->maxStringLength ? strlen($marker) + 1 : $this->maxStringLength); + + $temp = $time; + $mem_before = $this->memory[$marker]; + $i++; + } + + $result[0]['diff'] = '-'; + $result[0]['total'] = '-'; + $this->maxStringLength = (strlen('total') > $this->maxStringLength ? strlen('total') : $this->maxStringLength); + $this->maxStringLength += 2; + + return $result; + } + + /** + * Return formatted profiling information. + * + * @param boolean $showTotal Optionnaly includes total in output, default no + * @param string $format output format (auto, plain or html), default auto + * @return string + * @see getProfiling() + * @access public + */ + function getOutput($showTotal = FALSE, $format = 'auto') { + if ($format == 'auto') { + $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } + + $total = $this->TimeElapsed(); + $result = $this->getProfiling(); + $dashes = ''; + + if ($format == 'html') { + $out = ' +

+ + + '."\n"; + $out .= ' + + + + + + + + '. ($showTotal ? ' + + + ' : '') + ."\n"; + } else { + $dashes = $out = str_pad("\n", + $this->maxStringLength + ($showTotal ? 70 : 45), '-', STR_PAD_LEFT); + $out .= str_pad('marker', $this->maxStringLength) . + str_pad("time index", 22) . + str_pad("ex time", 16) . + str_pad("perct ", 8) . + ($showTotal ? ' '.str_pad("elapsed", 16)."perct" : '')."\n" . + $dashes; + } + + foreach ($result as $k => $v) { + $perc = (($v['diff'] * 100) / $total); + $tperc = (($v['total'] * 100) / $total); + + if ($format == 'html') { + $out .= ' + + + + + + + + '. ($showTotal ? ' + + + ' : '') + ."\n"; + } else { + $out .= str_pad($v['name'], $this->maxStringLength, ' ') . + str_pad($v['time'], 22) . + str_pad($v['diff'], 14) . + str_pad(number_format($perc, 2, '.', '')."%",8, ' ', STR_PAD_LEFT) . + ($showTotal ? ' '. + str_pad($v['total'], 14) . + str_pad(number_format($tperc, 2, '.', '')."%", + 8, ' ', STR_PAD_LEFT) : ''). + "\n"; + } + + $out .= $dashes; + } + + if ($format == 'html') { + $out .= " + + + + + + + + ". ($showTotal ? " + + + " : '') + ." + \n"; + $out .= "
 time idxex time%memmem +-elapsed%
'. $v['name'] .''. number_format($v['time'] - $this->startTime, 6) .''. number_format($v['diff'], 6) .''. number_format($perc, 2) .'%'. humn_size($v['mem'], 2, '', ' ') .''. (($v['mem_diff'] > 0) ? '+' : '-') . humn_size(abs($v['mem_diff']), 2, '', ' ') .''. number_format($v['total'], 6) .''. number_format($tperc, 2, '.', '') .'%
total-". number_format($total, 6) ."100.00%". humn_size(sys('mem_peak'), 2, '', ' ') ."---


\n"; + } else { + $out .= str_pad('total', $this->maxStringLength); + $out .= str_pad('-', 22); + $out .= str_pad($total, 15); + $out .= "100.00%\n"; + $out .= $dashes; + } + + return $out; + } + + /** + * Prints the information returned by getOutput(). + * + * @param boolean $showTotal Optionnaly includes total in output, default no + * @param string $format output format (auto, plain or html), default auto + * @see getOutput() + * @access public + */ + function display($showTotal = FALSE, $format = 'html') { + print $this->getOutput($showTotal, $format); + } + + /** + * Wrapper for microtime(). + * + * @return float + * @access private + * @since 1.3.0 + */ + function _getMicrotime() { + $microtime = explode(' ', microtime()); + return $microtime[1] . substr($microtime[0], 1); + } +} diff --git a/upload/develop/dbg_config.php b/upload/develop/dbg_config.php new file mode 100644 index 000000000..ef3be8899 --- /dev/null +++ b/upload/develop/dbg_config.php @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/upload/develop/error_handler.php b/upload/develop/error_handler.php new file mode 100644 index 000000000..e25fd5033 --- /dev/null +++ b/upload/develop/error_handler.php @@ -0,0 +1,107 @@ + 'Notice', + E_RECOVERABLE_ERROR => 'Recoverable Error', + E_STRICT => 'Strict', + E_USER_ERROR => 'Error', + E_USER_NOTICE => 'Notice', + E_USER_WARNING => 'Warning', + E_WARNING => 'Warning', + ); + + var $err_Stack = array(); + var $err_HtmlOut = ''; + + function bb_error_handler ($errNo = null, $errMsg = null, $file = null, $line = null, $context = null) + { + if (!($errNo & error_reporting())) return; + + $critical_error = ($errNo & E_USER_ERROR); +# $critical_error = true; + + if ($critical_error) + { + $info = array(); + if (is_array($arr = @unserialize($errMsg))) + { + foreach ($arr as $k => $v) + { + $info[$k] = $v; + } + } + $trace = $full_trace = debug_backtrace(); + array_shift($trace); + + if (isset($trace[1]['function']) && $trace[1]['function'] === 'sql_trigger_error') + { + array_shift($trace); + array_shift($trace); + } + $file = $trace[0]['file']; + $line = $trace[0]['line']; + } + + $id = md5($file . $errNo . $errMsg); + if (!isset($this->errStack[$id])) + { + $this->errStack[$id] = array( + 'file' => $file, + 'line' => $line, + 'errNo' => $errNo, + 'errMsg' => $errMsg, + ); + if (preg_match('#(.*)\((\d+)\).*eval.*#', $file, $m)) + { + $src_file = $m[1]; + $src_line = $m[2]; + } + else + { + $src_file = $file; + $src_line = $line; + } + $this->err_HtmlOut .= '' + ."\n" + .'' + . $this->errType[$errNo] .':' + ."\n" + .'' + . htmlCHR($errMsg) + . (($critical_error) ? "
\n\n" : "
\n") + . str_replace(BB_PATH . DIRECTORY_SEPARATOR, '', $file) ."($line)" + ."\n" + ."\n"; + } + + if ($critical_error) + { + require(DEV_DIR .'error_report.php'); + exit; + } + } + + function get_errors () + { + if ($this->err_HtmlOut) + { + return "\n". $this->err_HtmlOut ."
doubleClick the filename to open in Editor
\n"; + } + return ''; + } + + function get_clean_errors () + { + $ret = $this->get_errors(); + $this->err_HtmlOut = ''; + return $ret; + } +} + +$errHandler = new bb_error_handler; +set_error_handler(array(&$errHandler, 'bb_error_handler')); + diff --git a/upload/develop/error_report.php b/upload/develop/error_report.php new file mode 100644 index 000000000..c4a329a63 --- /dev/null +++ b/upload/develop/error_report.php @@ -0,0 +1,234 @@ +get_clean_errors(); + +$showSourceUri = BB_ROOT .'develop/show_source.php'; +$showSourcePrev = 15; +$showSourceNext = 15; +?> + + + +
+
+ +errType[$errNo]; ?>: '; + } + function fontEnd() + { + return ''; + } + + if (count($info)) + { + foreach ($info as $k => $v) + { + echo "$k: $v
\n"; + } + } + else + { + echo "$errMsg
\n"; + } + echo "
\n"; + + if (count($trace)) + { + echo 'Trace: ' . count($trace) . " "; + echo '[show details] '; + echo '[hide details]'; + + echo "
\n"; + echo "
\n"; + + echo '
    '; + $currentParam = -1; + + foreach ($trace as $k => $v) + { + $currentParam++; + + echo '
  • '; + + if (isset($v['class'])) + { + echo ''; + echo $v['class']; + echo "."; + } + else + { + echo ''; + } + + echo $v['function']; + echo ''; + echo " ("; + + $sep = ''; + $v['args'] = (array) @$v['args']; + foreach ($v['args'] as $arg) { + + $currentParam++; + + echo $sep; + $sep = ', '; + $color = '#404040'; + + switch (true) { + + case is_bool($arg): + $param = 'TRUE'; + $string = $param; + break; + + case is_int($arg): + case is_float($arg): + $param = $arg; + $string = $arg; + $color = $c['number']; + break; + + case is_null($arg): + $param = 'NULL'; + $string = $param; + break; + + case is_string($arg): + $param = $arg; + $string = 'string[' . strlen($arg) . ']'; + break; + + case is_array($arg): + ob_start(); + print_r($arg); + $param = ob_get_contents(); + ob_end_clean(); + $string = 'array[' . count($arg) . ']'; + break; + + case is_object($arg): + ob_start(); + print_r($arg); + $param = ob_get_contents(); + ob_end_clean(); + $string = 'object: ' . get_class($arg); + break; + + case is_resource($arg): + $param = 'resource: ' . get_resource_type($arg); + $string = 'resource'; + break; + + default: + $param = 'unknown'; + $string = $param; + break; + } + + echo ''; + echo $string; + echo ''; + echo ''; + } + + echo ")"; + echo "
    \n"; + + if (!isset($v['file'])) { + $v['file'] = 'unknown'; + } + if (!isset($v['line'])) { + $v['line'] = 'unknown'; + } + + $v['line'] = @$v['line']; + echo ''; + + echo '
  • '; + } + + echo '
'; + + } else { + echo 'File: '; + echo basename($file); + echo ' (' . $line . ') '; + echo dirname($file); + } + +?> + +[hide param]'; ?> +
+ +Trick: click on a function's argument to see it fully
+Trick: click on a function to see the file & line
+Trick: click on the file name to see the source code
+ +
\ No newline at end of file diff --git a/upload/develop/functions_debug.php b/upload/develop/functions_debug.php new file mode 100644 index 000000000..69422fe36 --- /dev/null +++ b/upload/develop/functions_debug.php @@ -0,0 +1,102 @@ +', $data); + $count = count($data); + + //count which lines to display + $start = $line - $prev; + if ($start < 1) + { + $start = 0; + } + $end = $line + $next; + if ($end > $count) + { + $end = $count + 1; + } + + //color for numbering lines + $highlight_default = ini_get('highlight.default'); + + echo '
'; + echo ''; + echo '
'; + + for ($x = $start+1; $x <= $end+1; $x++) + { + $class = ($line == $x) ? 'lineNum lineErr' : 'lineNum'; + echo "
 "; + echo ''; + echo ($x); + echo ' '; + echo "
\n"; + } + echo '
'; + + while ($start <= $end) + { + if ($line == $start+1) + { + echo '
 '; + } + else + { + echo '
 '; + } + echo @$data[$start]; + echo "
\n"; + $start++; + } + echo '
'; + + if ($add_view_full_link && ($prev != 10000 || $next != 10000)) + { + echo '
'; + echo 'View Full Source'; + } + return ob_get_clean(); +} diff --git a/upload/develop/init_debug.php b/upload/develop/init_debug.php new file mode 100644 index 000000000..56c55c9d9 --- /dev/null +++ b/upload/develop/init_debug.php @@ -0,0 +1,41 @@ +start(); +# $GLOBALS['timer']->setMarker(); // empty setMarker() will point to "source(line)" +# $GLOBALS['timer']->setMarker('Marker 1'); +# $GLOBALS['timer']->setMarker('Marker 1 End'); +# $GLOBALS['timer']->stop(); +# $GLOBALS['timer']->display(); die; + +// +// Error handler +// +require(DEV_DIR .'error_handler.php'); + +// +// OB conveyer +// +function prepend_debug_info ($contents) +{ + global $errHandler; + + if ($errors = $errHandler->get_clean_errors()) + { + $contents = file_get_contents(DEV_DIR .'dbg_header.php') . $errors . $contents; + } + + return $contents; +} + +ob_start('prepend_debug_info'); diff --git a/upload/develop/memcached_stub.php b/upload/develop/memcached_stub.php new file mode 100644 index 000000000..1909dfc70 --- /dev/null +++ b/upload/develop/memcached_stub.php @@ -0,0 +1,154 @@ +
'. basename(__FILE__)); + +require('./dbg_config.php'); + +$interpreter = $bb_cfg['dbg']['interpreter']; +$prog_path = $_GET['prog']; +$prog_args = $_GET['args']; + +$command = "$interpreter $prog_path $prog_args"; +exec($command); +echo ''; +exit; + diff --git a/upload/develop/profiler/example.txt b/upload/develop/profiler/example.txt new file mode 100644 index 000000000..9ffbcaf07 --- /dev/null +++ b/upload/develop/profiler/example.txt @@ -0,0 +1,9 @@ +print_profile_data($min_time); +?> + +$min_time - ("0.01" - , "0.01%" - ) + diff --git a/upload/develop/profiler/profiler.css b/upload/develop/profiler/profiler.css new file mode 100644 index 000000000..cb690d1a4 --- /dev/null +++ b/upload/develop/profiler/profiler.css @@ -0,0 +1,119 @@ +#profContainer { + background-color: #F5F5F5; +} +.profTable { + background: #D3D3D3; + width: 100%; + margin-bottom: 6px; +} +.profHead { + color: #000000; + background: #F5F5F5; + font-size: 11px; + text-align: center; +} +.profFile { + color: #F5F5F5; + background: #71869F; + font-size: 13px; + text-align: left; + letter-spacing: 1px; + padding: 3px 4px 4px 12px; +} +.profFunc { + color: #2C2C2C; + font-size: 13px; + background: #ECECEA; + padding: 1px 4px 1px 3px; + white-space: nowrap; + font-family: "Courier New", Courier, monospace; +} +.funcTime { + padding: 1px 3px 1px 3px; + text-align: center; +} +.funcName { + padding: 1px 4px 1px 6px; + font-size: 14px; + font-weight: bold; +} +.profFoot { + color: #000000; + background: #D1D7DC; + font-size: 11px; + text-align: left; +} +.profTD { + font-size: 11px; +} +.profRow1 { + background: #F4F4F4; +} +.profRow2 { + background: #F4F4F4; +} +.perc { + padding: 2px 4px 2px 6px; + text-align: right; + color: #000000; +} +.high1 { + color: #BB0000; +} +.high3 { + font-size: 11px; + color: #EA0000; + font-weight: bold; +} +.high5 { + font-size: 11px; + color: #FF0000; + font-weight: bold; +} +.time { + padding: 2px 4px 2px 4px; + text-align: center; + color: #285C30; + font-weight: bold; +} +.avg { + padding: 2px 2px 2px 4px; + font-size: 10px; + font-style: normal; + text-align: center; + letter-spacing: -1px; + color: #336633; +} +.hits { + font-size: 10px; + padding: 2px 4px 2px 4px; + text-align: center; + font-style: normal; +} +.line { + font-size: 10px; + padding: 2px 4px 2px 6px; + text-align: right; +} +.scr { + padding: 2px 4px 2px 4px; + font-size: 11px; + text-align: left; + width: 100%; +} +.srcOpen .srcOpen:link, .srcOpen:visited { + color: #000099; +} +font { + font-size: 11px; +} +.warningBox1 { + color: darkred; + border: 1px solid #B22222; + padding: 12px; +} +.files { + font-size: 12px; + background: #FBFBFB; + font-family: Courier, monospace; +} diff --git a/upload/develop/profiler/profiler.php b/upload/develop/profiler/profiler.php new file mode 100644 index 000000000..a594399c1 --- /dev/null +++ b/upload/develop/profiler/profiler.php @@ -0,0 +1,35 @@ + + '. file_get_contents(dirname(__FILE__) .'/profiler.css') .' + + '."\n"; + + if (!extension_loaded($extension_name)) + { + echo ' +
+ Cannot load '. $extension_name .' extension. Please check your PHP configuration. +
+ '; + } + + $profiler_module_name = dirname(__FILE__) .'/profiler_'. basename($extension_name) .'.php'; + + if (include($profiler_module_name)) + { + $profiler_class_name = "profiler_{$extension_name}"; + $profiler_obj = new $profiler_class_name(); + return $profiler_obj; + } + else + { + trigger_error("Unsupported profiler extension: $extension_name", E_USER_ERROR); + } + } +} diff --git a/upload/develop/profiler/profiler_dbg.php b/upload/develop/profiler/profiler_dbg.php new file mode 100644 index 000000000..898051eb0 --- /dev/null +++ b/upload/develop/profiler/profiler_dbg.php @@ -0,0 +1,377 @@ + array(), + 'line_no' => array(), + 'hit_count' => array(), + 'tm_max' => array(), + 'tm_min' => array(), + 'tm_sum' => array(), + ); + + + --------------------------------------------------- + get all modules name + --------------------------------------------------- + int dbg_get_all_module_names(array &$results); + + return int: count of $results + + $results = array( + 'mod_no' => array(), + 'mod_name' => array(), + ); + + + --------------------------------------------------- + get module name + --------------------------------------------------- + int dbg_get_module_name(int $mod_no, string &$results); + + return int: 0 - error + 1 - success + + $results = module name + + + --------------------------------------------------- + get all context (function name) for given module + --------------------------------------------------- + int dbg_get_all_contexts(int $mod_no, array &$results); + + if $mod_no = 0 it returns all contexts + + return int: count of $results + + $results = array( + 'ctx_no' => array(), + 'mod_no' => array(), + 'ctx_name' => array(), + ); + + + --------------------------------------------------- + get context name + --------------------------------------------------- + int dbg_get_context_name(int $ctx_no, string &$function_name); + + return int: 0 - error + 1 - success + + $function_name = function name + + + --------------------------------------------------- + get all source lines for given module + --------------------------------------------------- + int dbg_get_all_source_lines(int $mod_no, array &$results); + + if $mod_no = 0 it returns all source lines for all contexts + + return int: count of $results + + $results = array( + 'ctx_no' => array(), + 'mod_no' => array(), + 'line_no' => array(), + ); + + + --------------------------------------------------- + get context id for given module and line + --------------------------------------------------- + int dbg_get_source_context(int $mod_no, int $line_no, int &$ctx_no); + + return int: 0 - error + 1 - success + + $ctx_no = function name + +*/ + +############################################################################## + +class profiler_dbg extends profiler +{ + var $min_time = 0; + var $total_time = 0; + + // $min_time - ( %) + // + function print_profile_data ($min_time = 0) + { + // Get all profiling data + dbg_get_profiler_results (&$results); # prn($results); + dbg_get_all_module_names (&$modules); + dbg_get_all_contexts (0, &$context); + dbg_get_all_source_lines (0, &$lines); + + $this->total_time = array_sum($results['tm_sum']); + $this->min_time = strpos($min_time, '%') ? $this->total_time * floatval($min_time)/100 : floatval($min_time); + $percent = ($this->total_time) ? 100/$this->total_time : 0; + + $module_names = $context_names = $context_lines = $profile = array(); + + // Module names + foreach ($modules['mod_no'] as $id => $module_no) + { + $module_names[$module_no] = $modules['mod_name'][$id]; + + $profile[$module_no]['time'] = 0; + $profile[$module_no]['.'] = array(); + } + + // Context names + foreach ($context['mod_no'] as $id => $context_no) + { + $module_no = $context['ctx_no'][$id]; + $ctx_name = $context['ctx_name'][$id]; + + $context_names[$context_no] = ($ctx_name) ? "$ctx_name()" : 'GLOBAL'; + + $profile[$module_no]['.'][$context_no]['time'] = 0; + $profile[$module_no]['.'][$context_no]['.'] = array(); + } + + // Context lines + foreach ($lines['line_no'] as $id => $line_no) + { + $module_no = $lines['mod_no'][$id]; + + $context_lines[$module_no][$line_no] = $lines['ctx_no'][$id]; + } + + // Build profiling data + foreach ($results['line_no'] as $id => $line_no) + { + $module_no = $results['mod_no'][$id]; + $context_no = $context_lines[$module_no][$line_no]; + + $profile[$module_no]['time'] += $results['tm_sum'][$id]; + $profile[$module_no]['.'][$context_no]['time'] += $results['tm_sum'][$id]; + + if ($results['tm_sum'][$id] < $this->min_time) + { + continue; + } + + $profile[$module_no]['.'][$context_no]['.'][$line_no] = array( + 'time' => $results['tm_sum'][$id], + 'hits' => $results['hit_count'][$id], + ); + } + + // Sort profiling data: modules, contexts and lines + uasort($profile, array(__CLASS__, 'sort_by_time_desc')); + + foreach ($profile as $module_no => $context) + { + uasort($profile[$module_no]['.'], array(__CLASS__, 'sort_by_time_desc')); + + foreach ($context['.'] as $context_no => $lines) + { + uasort($profile[$module_no]['.'][$context_no]['.'], array(__CLASS__, 'sort_by_time_desc')); + } + } + + // Display profiling data + $colspan = 6; + $row_class = 'profRow1'; + + // Replacements for cleaning highlighted code + $highlight_replacements = array( + '' => '', + '' => '', + ' ' => ' ', + '><?php' => '>', + '?><' => '<', + '><?<' => '><', + '>php ' => '>', + ); + + echo ' +
+ + + '; + // Modules + foreach ($profile as $module_no => $context) + { + $module_path = $module_names[$module_no]; + $module_name = basename($module_path); + $module_src = is_file($module_path) ? file($module_path) : array(); + $module_time = sprintf('%.4f', $context['time']); + $module_perc = sprintf('%.1f', $context['time']*$percent); + + if ($module_time < $this->min_time) + { + continue; + } + + echo ' + +
+ + + + + + + + + + + + + + + + '."\n"; + + // Context + foreach ($context['.'] as $context_no => $lines) + { + $context_name = $context_names[$context_no]; + $context_time = $this->get_ms($lines['time']); + $context_perc = sprintf('%.2f', $lines['time']*$percent); + $row_class = ($row_class == 'profRow1') ? 'profRow2' : 'profRow1'; + + if ($lines['time'] < $this->min_time) + { + continue; + } + + echo ' + + + + + + '; + + // Lines + foreach ($lines['.'] as $line_no => $data) + { + $line_perc = $data['time']*$percent; + $line_perc = ($line_perc > 0.05) ? sprintf('%.1f', $line_perc) : ''; + $line_hits = ($data['hits'] != 1) ? $data['hits'] : ''; + $line_link = '". $line_no .''; + $line_time_sum = $this->get_ms($data['time']); + $line_time_avg = ($line_hits) ? $this->get_ms($data['time']/$line_hits, 3) : ''; + + $perc_class = 'perc'; + if ($line_perc > 5) $perc_class .= ' high5'; + else if ($line_perc > 3) $perc_class .= ' high3'; + else if ($line_perc > 1) $perc_class .= ' high1'; + + if ($line_src =& $module_src[$line_no-1]) + { + $line_src = preg_replace('#\s+#', ' ', trim($line_src)); + $line_src = highlight_string(" + + + + + + + + '."\n"; + } // Lines + } // Context + } // Modules + + echo ' +
' . "[ $module_perc%, $module_time sec. ] :: $module_name " . '
  %   time   avg   hits  line  source
'. "$context_perc%" .''. "$context_time ms" .''. $context_name .'
'. $line_perc .''. $line_time_sum .''. $line_time_avg .''. $line_hits .''. $line_link .''. $line_src .'
+ + + + +
+
[ '. count($modules['mod_name']) .' files, '. sprintf('%.3f', $this->total_time) .' sec. ]
+
'. join('
', $modules['mod_name']) .'
+
+
+
+ '; + } + + function get_ms ($time, $precision = 2) + { + return ($time < 0.001) ? round($time*1000, $precision) : round($time*1000, 0); + } + + static function sort_by_time_desc ($a, $b) + { + if ($a['time'] == $b['time']) return 0; + return ($a['time'] > $b['time']) ? -1 : 1; + } +} + + + + diff --git a/upload/develop/show_source.php b/upload/develop/show_source.php new file mode 100644 index 000000000..498bd4c9f --- /dev/null +++ b/upload/develop/show_source.php @@ -0,0 +1,19 @@ +
'. basename(__FILE__)); + +define('IN_PHPBB', true); +define('BB_ROOT', './../'); + +require('./dbg_config.php'); +require('./functions_debug.php'); + +$file = @$_GET['file']; +$line = @$_GET['line']; +$prev = @$_GET['prev'] ? $_GET['prev'] : 15; +$next = @$_GET['next'] ? $_GET['next'] : 15; + +require('./dbg_header.php'); +echo showSource($file, $line, $prev, $next); + diff --git a/upload/develop/source/Date_DeltaRussian.rar b/upload/develop/source/Date_DeltaRussian.rar new file mode 100644 index 0000000000000000000000000000000000000000..8ebac0b3ef8630ff37e443ba375807b9b652d628 GIT binary patch literal 1250 zcmV<81ReWQVR9iF2LL{!IAkyL+|O2&B(k zG+5-v2*RFpg@?W5l34!36`t?rHt2`1L_ryEEvD=U4bo($@g8)gJ0POK6PT7b#p$$IUl2sNF-sG4`S;dZgxj{$?#`aQpEs!{OmJhfVZC z9RCINMyF;HYDVUo3Rb3a4@7ka*qX(OAN^JI6P%c^WdLJ=``QlSsuXnJpGzJ_Qzw=> zn$7&-eiW{-;vtHien2#LmYUXX4{^K`BrTA_?}#@#{vVCUN&r`O{Hc^_?7%ieq6MRd zovQ3MQNE?w>kf?aZ=%oF2wm13FLppZbmhJaqf5#Ex(^h^4G*Kmjn17UIs1<5EKvm) z9?6_tO9&zJjRp$SlZk0uX4t`vix}G>;Ptj4-4cPG;=c`C>$F%&KF5KEBV5{K%+7Sc z&-GbL+{i15z}?748!EGk5n7HjQ6W31fi)KGkG+68J*M8cfU)6$ZRlbY`Kl}2Rv%o# zD&0vjGOm*0WU%g6?N^RN07ZEhiW zpw=Z^zpt6Gj_IkjEfs&$i|&do>u$k)DK!gQ{>t=Fa62J( zG0x1zD9Fyr^vGHM%7kq>s6gR0%1$3I-qB%hmB7OvAb2>jtU8P7>%J6%j2=2O@Ee6i zAyT3|0(xee2GJ(B;t6pV7*bF;PsE?BR$W@9dOJ2jx2a%tZ*6q!QFck$DhkS+a6V0y zLl6zc+9Q@SSL}S8a?UNdUi)br%Y^C=ZXYLz7N7Tp z<&k|-7Je>9H(_))D)%9pO-T^#W1=omjO64lK=n! literal 0 HcmV?d00001 diff --git a/upload/develop/source/Globals.zip b/upload/develop/source/Globals.zip new file mode 100644 index 0000000000000000000000000000000000000000..ff39836d4690409a48f86233c3f9550eb427659a GIT binary patch literal 3175 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 U0002Lh-dbx|J1}idjLQO0C_%?-~a#s literal 0 HcmV?d00001 diff --git a/upload/develop/source/js-sprintf.rar b/upload/develop/source/js-sprintf.rar new file mode 100644 index 0000000000000000000000000000000000000000..f7f86f3ed29d87f8f06437b3e5745bd32363d79e GIT binary patch literal 4248 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 y695W;&|mpe|NYDT$N9g~<^LT*esession_start(); + +// Check if user logged in +if (!$userdata['session_logged_in']) +{ + redirect("login.php?redirect=$redirect_type&$redirect"); +} + +if ($bb_cfg['bt_min_ratio_dl_button'] && $btu = get_bt_userdata($user->id)) +{ + if (($user_ratio = get_bt_ratio($btu)) < $bb_cfg['bt_min_ratio_dl_button']) + { + bb_die($lang['BT_LOW_RATIO_FUNC']); + } +} + +// Check if user did not confirm +if (@$_POST['cancel']) +{ + redirect("$redirect_type?$redirect"); +} + +// +// Delete DL-list +// +if ($mode == 'dl_delete' && $topic_id) +{ + if (!IS_ADMIN) + { + $sql = "SELECT forum_id + FROM ". BB_TOPICS ." + WHERE topic_id = $topic_id + LIMIT 1"; + + if (!$row = DB()->sql_fetchrow(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not obtain forum_id for this topic', '', __LINE__, __FILE__, $sql); + } + + $is_auth = auth(AUTH_ALL, $row['forum_id'], $userdata); + + if (!$is_auth['auth_mod']) + { + message_die(GENERAL_MESSAGE, $lang['NOT_MODERATOR'], $lang['NOT_AUTHORISED']); + } + } + + if (!$confirmed) + { + $hidden_fields = array( + 't' => $topic_id, + 'mode' => 'dl_delete', + ); + + print_confirmation(array( + 'QUESTION' => $lang['DL_LIST_DEL_CONFIRM'], + 'FORM_ACTION' => "dl_list.php", + 'HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + )); + } + + clear_dl_list($topic_id); + redirect("$redirect_type?$redirect"); +} + +// +// Update DL status +// + +$req_topics_ary = $topics_ary = array(); + +// Get topics selected by user +if ($mode == 'set_topics_dl_status') +{ + if (!isset($_POST['dl_topics_id_list']) || !is_array($_POST['dl_topics_id_list'])) + { + message_die(GENERAL_MESSAGE, $lang['NONE_SELECTED']); + } + + foreach ($_POST['dl_topics_id_list'] as $topic_id) + { + $req_topics_ary[] = (int) $topic_id; + } +} +else if ($mode == 'set_dl_status') +{ + $req_topics_ary[] = (int) $topic_id; +} + +// Get existing topics +if ($req_topics_sql = join(',', $req_topics_ary)) +{ + $sql = "SELECT topic_id FROM ". BB_TOPICS ." WHERE topic_id IN($req_topics_sql)"; + + foreach (DB()->fetch_rowset($sql) as $row) + { + $topics_ary[] = $row['topic_id']; + } +} + +if ($topics_ary && ($mode == 'set_dl_status' || $mode == 'set_topics_dl_status')) +{ + $new_dlstatus_ary = array(); + + foreach ($topics_ary as $topic_id) + { + $new_dlstatus_ary[] = array( + 'user_id' => (int) $user->id, + 'topic_id' => (int) $topic_id, + 'user_status' => (int) $new_dl_status, + ); + } + $new_dlstatus_sql = DB()->build_array('MULTI_INSERT', $new_dlstatus_ary); + + if($bb_cfg['announce_type'] == 'xbt') + { + DB()->query("REPLACE INTO ". BB_BT_DLSTATUS_MAIN ." $new_dlstatus_sql"); + } + else + { + DB()->query("REPLACE INTO ". BB_BT_DLSTATUS_NEW ." $new_dlstatus_sql"); + } + + DB()->query(" + DELETE FROM ". BB_BT_DLSTATUS_MAIN ." + WHERE user_id = {$user->id} + AND topic_id IN(". join(',', $topics_ary) .") + "); + + redirect("$redirect_type?$redirect"); +} + +redirect("index.php"); \ No newline at end of file diff --git a/upload/download.php b/upload/download.php new file mode 100644 index 000000000..75a5079ad --- /dev/null +++ b/upload/download.php @@ -0,0 +1,377 @@ +enqueue(array( + 'attach_extensions', +)); + +$download_id = request_var('id', 0); +$thumbnail = request_var('thumb', 0); + +// Send file to browser +function send_file_to_browser($attachment, $upload_dir) +{ + global $lang, $attach_config; + + $filename = ($upload_dir == '') ? $attachment['physical_filename'] : $upload_dir . '/' . $attachment['physical_filename']; + + $gotit = false; + + if (!intval($attach_config['allow_ftp_upload'])) + { + if (@!file_exists(@amod_realpath($filename))) + { + message_die(GENERAL_ERROR, $lang['ERROR_NO_ATTACHMENT'] . "

404 File Not Found: The File " . $filename . " does not exist."); + } + else + { + $gotit = true; + } + } + + // + // Determine the Browser the User is using, because of some nasty incompatibilities. + // Most of the methods used in this function are from phpMyAdmin. :) + // + if (!empty($_SERVER['HTTP_USER_AGENT'])) + { + $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT']; + } + else if (!isset($HTTP_USER_AGENT)) + { + $HTTP_USER_AGENT = ''; + } + + if (preg_match('/Opera(\/| )([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version)) + { + $browser_version = $log_version[2]; + $browser_agent = 'opera'; + } + else if (preg_match('/MSIE ([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version)) + { + $browser_version = $log_version[1]; + $browser_agent = 'ie'; + } + else if (preg_match('/OmniWeb\/([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version)) + { + $browser_version = $log_version[1]; + $browser_agent = 'omniweb'; + } + else if (preg_match('/Netscape([0-9]{1})/', $HTTP_USER_AGENT, $log_version)) + { + $browser_version = $log_version[1]; + $browser_agent = 'netscape'; + } + else if (preg_match('/Mozilla\/([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version)) + { + $browser_version = $log_version[1]; + $browser_agent = 'mozilla'; + } + else if (preg_match('/Konqueror\/([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version)) + { + $browser_version = $log_version[1]; + $browser_agent = 'konqueror'; + } + else + { + $browser_version = 0; + $browser_agent = 'other'; + } + + // Correct the mime type - we force application/octetstream for all files, except images + // Please do not change this, it is a security precaution + if (!strstr($attachment['mimetype'], 'image')) + { + $attachment['mimetype'] = ($browser_agent == 'ie' || $browser_agent == 'opera') ? 'application/octetstream' : 'application/octet-stream'; + } + + //bt + global $userdata; + + if (!(isset($_GET['original']) && !IS_USER)) + { + include(INC_DIR .'functions_torrent.php'); + send_torrent_with_passkey($filename); + } + //bt end + + // Now the tricky part... let's dance +// @ob_end_clean(); +// @ini_set('zlib.output_compression', 'Off'); + header('Pragma: public'); +// header('Content-Transfer-Encoding: none'); + +//$real_filename = html_entity_decode(basename($attachment['real_filename'])); + $real_filename = clean_filename(basename($attachment['real_filename'])); + $mimetype = "{$attachment['mimetype']};"; + $charset = (@$lang['CONTENT_ENCODING']) ? "charset={$lang['CONTENT_ENCODING']};" : ''; + + // Send out the Headers + header("Content-Type: $mimetype $charset name=\"$real_filename\""); + header("Content-Disposition: inline; filename=\"$real_filename\""); + + unset($real_filename); + // + // Now send the File Contents to the Browser + // + if ($gotit) + { + $size = @filesize($filename); + if ($size) + { + header("Content-length: $size"); + } + readfile($filename); + } + else if (!$gotit && intval($attach_config['allow_ftp_upload'])) + { + $conn_id = attach_init_ftp(); + + $ini_val = ( @phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var'; + + $tmp_path = ( !@$ini_val('safe_mode') ) ? '/tmp' : $upload_dir; + $tmp_filename = @tempnam($tmp_path, 't0000'); + + @unlink($tmp_filename); + + $mode = FTP_BINARY; + if ( (preg_match("/text/i", $attachment['mimetype'])) || (preg_match("/html/i", $attachment['mimetype'])) ) + { + $mode = FTP_ASCII; + } + + $result = @ftp_get($conn_id, $tmp_filename, $filename, $mode); + + if (!$result) + { + message_die(GENERAL_ERROR, $lang['ERROR_NO_ATTACHMENT'] . "

404 File Not Found: The File " . $filename . " does not exist."); + } + + @ftp_quit($conn_id); + + $size = @filesize($tmp_filename); + if ($size) + { + header("Content-length: $size"); + } + readfile($tmp_filename); + @unlink($tmp_filename); + } + else + { + message_die(GENERAL_ERROR, $lang['ERROR_NO_ATTACHMENT'] . "

404 File Not Found: The File " . $filename . " does not exist."); + } + + exit; +} +// +// End Functions +// + +// +// Start Session Management +// +$user->session_start(); + +if (!$download_id) +{ + message_die(GENERAL_ERROR, $lang['NO_ATTACHMENT_SELECTED']); +} + +if ($attach_config['disable_mod'] && !IS_ADMIN) +{ + message_die(GENERAL_MESSAGE, $lang['ATTACHMENT_FEATURE_DISABLED']); +} + +$sql = 'SELECT * + FROM ' . BB_ATTACHMENTS_DESC . ' + WHERE attach_id = ' . (int) $download_id; + +if (!($result = DB()->sql_query($sql))) +{ + message_die(GENERAL_ERROR, 'Could not query attachment informations', '', __LINE__, __FILE__, $sql); +} + +if (!($attachment = DB()->sql_fetchrow($result))) +{ + message_die(GENERAL_MESSAGE, $lang['ERROR_NO_ATTACHMENT']); +} + +$attachment['physical_filename'] = basename($attachment['physical_filename']); + +DB()->sql_freeresult($result); + +// get forum_id for attachment authorization or private message authorization +$authorised = false; + +$sql = 'SELECT * + FROM ' . BB_ATTACHMENTS . ' + WHERE attach_id = ' . (int) $attachment['attach_id']; + +if (!($result = DB()->sql_query($sql))) +{ + message_die(GENERAL_ERROR, 'Could not query attachment informations', '', __LINE__, __FILE__, $sql); +} + +$auth_pages = DB()->sql_fetchrowset($result); +$num_auth_pages = DB()->num_rows($result); + +for ($i = 0; $i < $num_auth_pages && $authorised == false; $i++) +{ + $auth_pages[$i]['post_id'] = intval($auth_pages[$i]['post_id']); + + if ($auth_pages[$i]['post_id'] != 0) + { + $sql = 'SELECT forum_id + FROM ' . BB_POSTS . ' + WHERE post_id = ' . (int) $auth_pages[$i]['post_id']; + + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query post information', '', __LINE__, __FILE__, $sql); + } + + $row = DB()->sql_fetchrow($result); + + $forum_id = $row['forum_id']; + + $is_auth = array(); + $is_auth = auth(AUTH_ALL, $forum_id, $userdata); + + if ($is_auth['auth_download']) + { + $authorised = TRUE; + } + } +} + + +if (!$authorised) +{ + message_die(GENERAL_MESSAGE, $lang['SORRY_AUTH_VIEW_ATTACH']); +} + +$datastore->rm('cat_forums'); + +// +// Get Information on currently allowed Extensions +// +$rows = get_extension_informations(); +$num_rows = count($rows); + +for ($i = 0; $i < $num_rows; $i++) +{ + $extension = strtolower(trim($rows[$i]['extension'])); + $allowed_extensions[] = $extension; + $download_mode[$extension] = $rows[$i]['download_mode']; +} + +// disallowed ? +if (!in_array($attachment['extension'], $allowed_extensions) && !IS_ADMIN) +{ + message_die(GENERAL_MESSAGE, sprintf($lang['EXTENSION_DISABLED_AFTER_POSTING'], $attachment['extension'])); +} + +$download_mode = intval($download_mode[$attachment['extension']]); + +if ($thumbnail) +{ + $attachment['physical_filename'] = THUMB_DIR . '/t_' . $attachment['physical_filename']; +} + +// Update download count +if (!$thumbnail) +{ + $sql = 'UPDATE ' . BB_ATTACHMENTS_DESC . ' + SET download_count = download_count + 1 + WHERE attach_id = ' . (int) $attachment['attach_id']; + + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Couldn\'t update attachment download count', '', __LINE__, __FILE__, $sql); + } +} + +// Determine the 'presenting'-method +if ($download_mode == PHYSICAL_LINK) +{ + $server_protocol = ($bb_cfg['cookie_secure']) ? 'https://' : 'http://'; + $server_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($bb_cfg['server_name'])); + $server_port = ($bb_cfg['server_port'] <> 80) ? ':' . trim($bb_cfg['server_port']) : ''; + $script_name = preg_replace('/^\/?(.*?)\/?$/', '/\1', trim($bb_cfg['script_path'])); + + if ($script_name[strlen($script_name)] != '/') + { + $script_name .= '/'; + } + + if (intval($attach_config['allow_ftp_upload'])) + { + if (trim($attach_config['download_path']) == '') + { + message_die(GENERAL_ERROR, 'Physical Download not possible with the current Attachment Setting'); + } + + $url = trim($attach_config['download_path']) . '/' . $attachment['physical_filename']; + $redirect_path = $url; + } + else + { + $url = $upload_dir . '/' . $attachment['physical_filename']; +// $url = preg_replace('/^\/?(.*?\/)?$/', '\1', trim($url)); + $redirect_path = $server_protocol . $server_name . $server_port . $script_name . $url; + } + + // Redirect via an HTML form for PITA webservers + if (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) + { + header('Refresh: 0; URL=' . $redirect_path); + echo 'Redirect
If your browser does not support meta redirection please click HERE to be redirected
'; + exit; + } + + // Behave as per HTTP/1.1 spec for others + header('Location: ' . $redirect_path); + exit; +} +else +{ + if (intval($attach_config['allow_ftp_upload'])) + { + // We do not need a download path, we are not downloading physically + send_file_to_browser($attachment, ''); + exit; + } + else + { + send_file_to_browser($attachment, $upload_dir); + exit; + } +} \ No newline at end of file diff --git a/upload/faq.php b/upload/faq.php new file mode 100644 index 000000000..5f91d932e --- /dev/null +++ b/upload/faq.php @@ -0,0 +1,110 @@ +session_start(); + +// Set vars to prevent naughtiness +$faq = array(); +// +// Load the appropriate faq file +// +$mode = request_var('mode', ''); +if(!empty($mode)) +{ + switch($mode) + { + case 'bbcode': + $lang_file = 'lang_bbcode'; + $l_title = $lang['BBCODE_GUIDE']; + break; + default: + $lang_file = 'lang_faq'; + $l_title = $lang['FAQ']; + break; + } +} +else +{ + $lang_file = 'lang_faq'; + $l_title = $lang['FAQ']; +} +include(LANG_ROOT_DIR ."lang_{$bb_cfg['default_lang']}/$lang_file.php"); +include(LANG_ROOT_DIR ."lang_{$bb_cfg['default_lang']}/lang_faq_attach.php"); + +// +// Pull the array data from the lang pack +// +$j = 0; +$counter = 0; +$counter_2 = 0; +$faq_block = array(); +$faq_block_titles = array(); + +for($i = 0; $i < count($faq); $i++) +{ + if( $faq[$i][0] != '--' ) + { + $faq_block[$j][$counter]['id'] = $counter_2; + $faq_block[$j][$counter]['question'] = $faq[$i][0]; + $faq_block[$j][$counter]['answer'] = $faq[$i][1]; + + $counter++; + $counter_2++; + } + else + { + $j = ( $counter != 0 ) ? $j + 1 : 0; + + $faq_block_titles[$j] = $faq[$i][1]; + + $counter = 0; + } +} + +// +// Lets build a page ... +// +$template->assign_vars(array( + 'PAGE_TITLE' => $l_title, + 'L_FAQ_TITLE' => $l_title, +)); + +for($i = 0; $i < count($faq_block); $i++) +{ + if( count($faq_block[$i]) ) + { + $template->assign_block_vars('faq_block', array( + 'BLOCK_TITLE' => $faq_block_titles[$i]) + ); + $template->assign_block_vars('faq_block_link', array( + 'BLOCK_TITLE' => $faq_block_titles[$i]) + ); + + for($j = 0; $j < count($faq_block[$i]); $j++) + { + $row_class = !($j % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars('faq_block.faq_row', array( + 'ROW_CLASS' => $row_class, + 'FAQ_QUESTION' => $faq_block[$i][$j]['question'], + 'FAQ_ANSWER' => $faq_block[$i][$j]['answer'], + + 'U_FAQ_ID' => $faq_block[$i][$j]['id']) + ); + + $template->assign_block_vars('faq_block_link.faq_row_link', array( + 'ROW_CLASS' => $row_class, + 'FAQ_LINK' => $faq_block[$i][$j]['question'], + + 'U_FAQ_LINK' => '#' . $faq_block[$i][$j]['id']) + ); + } + } +} + +print_page('faq.tpl'); \ No newline at end of file diff --git a/upload/favicon.ico b/upload/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..73131f1b9c2304e8218e3d63be5c26ef082f6115 GIT binary patch literal 7718 zcmeHMZBSI#8Gd$QWtW9z`C4E>SP*gHA|Kl|YSoBF2?7dRBto`L!L8Al7Q=Ru+E(Mn zL}P7;ZB5cfqERzOsxfvZZQ9N>YE!2_61CGbX=dtF#}86S2dJrz@z?Ep&bepz0S_SUiRhKi=#>3?oA!QP7d9WFee5ae@ey|3Ot*jf_65i4FqXM`ITSD(yek|RlgMN#BhFeIVO&F9`iPiP>AN@Zo&Gpd16!BL1uuM zb6CicVDYtcSe^!K8-d9|Aaw&!K=mT3yPpI~$glh%P)_BJ?>`FDGbUJ`C;e6+=>_^O zdMM1xfaMh+nc1sU-$VRvAcxvBsdSQgHv_Y_1M|rW$)846Nj8&g9`&)kk&MiJW;ot- zAh$0Ud1OT|x=_k&ryI&k3d+emuT)`H?<}|ux!^uL1xlZSvLj_EC#xd!lGXhT_}Xj0 zg8e|_Tfif40`0#87WdA>qbGqUKO$~V4Qlt*;=z4&Xx!h3&bK@8)Vu5O)Sm*_M7H7d zMr^%E_saW4`0=(4==sqGgns`6^j%tk=ZN3_=Ky|sDu7@7Er4e~T#si+zxN*j9J&<1 zuAlc{_p3cPyz2#QIUd40Z@h%RzV}PK_CYW9{^fQ2`qTlu^XX9>`}t1 zhOZ6b%c~=}a^(tc+_)jX-HCEy25vh8^vIzfhV>4x0-dY7?*QLg@o;z7?eUm~u5K&o z9}2{J2BEL7n;jdvHGSiQG2y=M$M|^am(Pm{Gi3ahxiKM6>YKkB6P$89O|xQxMe3K$ zlqk$|67mYAKdMZS`lT)j%QqhnV=J*8-1;A07|sJzlaTF`q&I{R>xVTEEd~v}xlHkB8}54@KxZjH#){ zuZs>;O&vQwLQY3T4L(kv1*AyVIv9nR&JdZ;(fVLeXpH;>Vs6-gBH!0oy;596{2l1& z+KY>lVvo<}iY|shKOQ+hQTnyQIz?LqVRjq<5iUDR1YJrd#!k$`@&7)E)8EH>lbmN z=tpUEk!XHakB_exjH%y+KFHpW_4@ITiK%xf{$1*8V?s@b_I=fJwAQ!Q(_iEus=SFe z*SCuCbgjAlia=8Yt({%5E(VxxbvrsAz5{epMo9QSa;@7gvL*yKoq-T*)$&vqRcpAb z<*D)HNa*rZP@bByk@f{BH)XkMCgr4gl$%cdE*X`TxW6s_aoPb7uu+P@X!Qtb%e>_gf`U4iI-l;W_G(oxsu~ zz?!#H(0QEpL3;1U`j3Go%1KvJZn=tVE!lVe*oE~}K265*(JjX|;m~Ctoyq}?@n~snX=!e0 zX=!RB-Zx`mw6sw0Ux}7=)e1iQz9?8Mcne#m-wcZcpHNgZdGh3(L_!W#1lTU&1A>pw zV@On&FZY{yRUYOGJ}#Gm^OJa09wg5exem^ocvT(*-#R6Of%CLP&q&L#84NboG?&G1 z^SLY12%J}DD#>YCvlrA&H&7Gj+kI}2rywnr^M1ctKXn;fyAhu{M~rV8Elvu>S3^3|MgFc`REs=-F-K{$Rjfq4INgWYc6(TR=ljOM(*w8E7# zp7%ufYELQSQ}UzqXK@Inyi1LCeY*G_jpt30*W&yA{!-b06tDGXaf$bn6k~wIP+(7%{R@#$h>yIR| zY+75C(Y|>FmDRgwKYLFV8V}O@pVkD;M}bXefx3M)==fC!z4Jr(ZJ*dT{_xy!41IPE z@?Ac1edL}$nEbR-#z#FyCT{SJik62lLJ5I91I^OU}rcWM+Os0^gX*rLCicu%GTw)g)8IH4VSIZmemnWKP^{+W1(HwNqbKk4{^0ssI2 literal 0 HcmV?d00001 diff --git a/upload/files/.htaccess b/upload/files/.htaccess new file mode 100644 index 000000000..34ed2a11e --- /dev/null +++ b/upload/files/.htaccess @@ -0,0 +1,3 @@ +php_flag engine off +RemoveHandler .php .php5 .php4 .php3 .phtml .pl .asp +AddType text/plain .php .php .htm .html .phtml .pl .asp \ No newline at end of file diff --git a/upload/files/thumbs/.htaccess b/upload/files/thumbs/.htaccess new file mode 100644 index 000000000..34ed2a11e --- /dev/null +++ b/upload/files/thumbs/.htaccess @@ -0,0 +1,3 @@ +php_flag engine off +RemoveHandler .php .php5 .php4 .php3 .phtml .pl .asp +AddType text/plain .php .php .htm .html .phtml .pl .asp \ No newline at end of file diff --git a/upload/gallery.php b/upload/gallery.php new file mode 100644 index 000000000..5a2dc415c --- /dev/null +++ b/upload/gallery.php @@ -0,0 +1,216 @@ +session_start(array('req_login' => true)); + +require(LANG_DIR ."lang_gallery.php"); + +$go = isset($_GET['go']) ? $_GET['go'] : ''; +$max_size = $bb_cfg['pic_max_size']; +$dir = $bb_cfg['pic_dir']; +$url = make_url('/'); + +$msg = ''; +$links_all = $thumbs_all = array(); + +// DON'T CHANGE THIS FILE TYPEs +$allowed_ext = array('jpeg', 'jpg', 'png', 'gif'); + +function create_thumb ($dir, $name, $att) +{ + $infile = $dir . $name . $att; + if ($att == ".jpg" || $att == ".jpeg") + $im = imagecreatefromjpeg($infile); + elseif ($att == ".png") + $im = imagecreatefrompng($infile); + elseif ($att == ".gif") + $im = imagecreatefromgif($infile); + + $oh = imagesy($im); + $ow = imagesx($im); + $r = $oh/$ow; + $newh = 200; + $neww = $newh/$r; + $outfile = $dir ."thumb_". $name . $att; + $im1 = imagecreatetruecolor($neww,$newh); + imagecopyresampled($im1, $im, 0, 0, 0, 0, $neww, $newh, imagesx($im), imagesy($im)); + imagejpeg($im1, $outfile, 75); + imagedestroy($im); + imagedestroy($im1); +} + +function paste_links($links, $thumbs = '') +{ + global $links_all, $thumbs_all, $lang; + + if (is_array($links)) + { + $link = implode(' ', $links); + $img = '[img]'. implode('[/img] [img]', $links) .'[/img]'; + + if ($thumbs) + { + $thumb = ''; + for ($i = 0; $i < count($links); $i++) + { + $thumb .= '[url='.$links[$i].'][img]'. $thumbs[$i] .'[/img][/url]'; + } + } + } + else + { + $link = trim($links); + $img = '[img]'. $links .'[/img]'; + + $thumb = '[url='.$link.'][img]'. $thumbs .'[/img][/url]'; + } + $spoiler = '[spoiler="'. $lang['GALLERY_SCREENSHOTS'] .'"]' . $img . '[/spoiler]'; + + $text = (!is_array($links)) ? '
'. $link .'
' : ''; + $text .= (!is_array($links)) ? '
'. $lang['GALLERY_YOUR_IMAGE'] .'' : ''; + $text .= '

'. $lang['GALLERY_LINK_URL'] .':

'; + $text .= '

'. $lang['GALLERY_TAG_SCREEN'] .':

'; + if ($thumbs) + { + $text .='

'. $lang['GALLERY_TAG_SCREEN_THUMB'] .':

'; + } + $text .= (!is_array($links)) ? '

'. $lang['GALLERY_TAG_POSTER_RIGHT'] .':

' : ''; + $text .= '

'. $lang['GALLERY_TAG_SPOILER'] .':

'; + + $links_all[] = $links; + $thumbs ? ($thumbs_all[] = $thumbs) : null; + + return $text; +} + +function upload_file ($files_ary, $idx) +{ + global $max_size, $allowed_ext, $create_thumb, $dir, $url, $lang; + + if (empty($files_ary)) + message_die(GENERAL_ERROR, "

". $lang['GALLERY_FILE_NOT_UPLOADED'] ."



". $lang['GALLERY_BACK'] ."


"); + if ($files_ary['size'][$idx] > $max_size) + message_die(GENERAL_ERROR, "

". $lang['GALLERY_IMAGE_OVERLOAD'] ."



". $lang['GALLERY_BACK'] ."


"); + + $name = strtolower($files_ary['name'][$idx]); + $ext = substr(strrchr($name, '.'), 1); + + $allow = in_array($ext, $allowed_ext); + $att = '.'. $ext; + + $thumb = false; + + if ($allow) + { + $name = md5_file($files_ary['tmp_name'][$idx]); + + if (file_exists($dir . $name . $att)) + { + if ($create_thumb && !file_exists($dir .'thumb_'. $name . $att)) + { + create_thumb($dir, $name, $att); + $thumb = $url . $dir ."thumb_". $name . $att; + } + $msg = '
'. $lang['GALLERY_FILE_EXIST'] . paste_links($url . $dir . $name . $att, $thumb) .''; + } + else + { + if (copy($files_ary['tmp_name'][$idx], $dir.$name.$att)) + { + if ($create_thumb) + { + create_thumb($dir, $name, $att); + $thumb = $url . $dir ."thumb_". $name . $att; + } + $msg = '
'. $lang['GALLERY_UPLOAD_SUCCESSFUL'] . paste_links($url . $dir . $name . $att, $thumb) .''; + } + else $msg = "
". $lang['GALLERY_UPLOAD_FAILED'] .""; + } + if (IS_ADMIN) + { + $msg .= "

"; + $msg .= "". $lang['GALLERY_DEL_LINK'] .":    "; + $msg .= "".$url."gallery.php?go=delete&fn=".$name.$att.""; + } + } + else $msg = "
". $lang['GALLERY_INVALID_TYPE'] .""; + + return $msg; +} + +if ($go == 'upload') +{ + @ini_set("memory_limit", "512M"); + + $create_thumb = (isset($_POST['create_thumb'])) ? true : false; + + for ($i = 0; $i < count($_FILES['imgfile']['name']); $i++) + { + $msg .= upload_file ($_FILES['imgfile'], $i); + } + + if (count($_FILES['imgfile']['name']) > 1) + { + $msg .= '
'. paste_links ($links_all, $thumbs_all); + } +} + +if ($go == 'delete' && IS_ADMIN && !empty($_GET['fn'])) +{ + global $lang; + + $fn = clean_filename($_GET['fn']); + + $pic = $dir . $fn; + $prev = $dir ."thumb_". $fn; + if (!is_file($pic)) message_die(GENERAL_ERROR, $lang['GALLERY_FILE_NOT_EXIST']); + + if (unlink($pic)) + { + @unlink($prev); + message_die(GENERAL_MESSAGE, "

". $lang['GALLERY_FILE_DELETE'] ."


". $lang['GALLERY_BACK'] ."
"); + } + else + message_die(GENERAL_ERROR, "

". $lang['GALLERY_FAILURE'] ."


". $lang['GALLERY_BACK'] ."
"); +} + +$template->assign_vars(array( + 'MSG' => $msg, + 'MAX_SIZE' => humn_size($max_size), + 'MAX_SIZE_HINT' => $lang['GALLERY_MAX_FILE_SIZE'], + 'CREATE_THUMB' => $lang['GALLERY_CREATE_THUMB'], + 'UPLOAD' => $lang['GALLERY_UPLOAD_IMAGE'], + 'MORE' => $lang['GALLERY_MORE_LINK'], +)); + +print_page('gallery.tpl'); \ No newline at end of file diff --git a/upload/groupcp.php b/upload/groupcp.php new file mode 100644 index 000000000..e7b5ed511 --- /dev/null +++ b/upload/groupcp.php @@ -0,0 +1,719 @@ +' : ''; + break; + case USER_AVATAR_REMOTE: + $poster_avatar = ( $bb_cfg['allow_avatar_remote'] ) ? '' : ''; + break; + case USER_AVATAR_GALLERY: + $poster_avatar = ( $bb_cfg['allow_avatar_local'] ) ? '' : ''; + break; + } + } + + if ( bf($row['user_opt'], 'user_opt', 'viewemail') || $group_mod ) + { + $email_uri = ( $bb_cfg['board_email_form'] ) ? "profile.php?mode=email&u={$row['user_id']}" : 'mailto:' . $row['user_email']; + + $email_img = '' . $lang['SEND_EMAIL'] . ''; + $email = '' . $lang['SEND_EMAIL'] . ''; + } + else + { + $email_img = ' '; + $email = ' '; + } + + $temp_url = "profile.php?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']; + $profile_img = '' . $lang['READ_PROFILE'] . ''; + $profile = '' . $lang['READ_PROFILE'] . ''; + + $temp_url = "privmsg.php?mode=post&" . POST_USERS_URL . "=" . $row['user_id']; + $pm_img = '' . $lang['SEND_PRIVATE_MESSAGE'] . ''; + $pm = '' . $lang['SEND_PRIVATE_MESSAGE'] . ''; + + $www_img = ( $row['user_website'] ) ? '' . $lang['VISIT_WEBSITE'] . '' : ''; + $www = ( $row['user_website'] ) ? '' . $lang['VISIT_WEBSITE'] . '' : ''; + + if ( !empty($row['user_icq']) ) + { + $icq_status_img = ''; + $icq_img = '' . $lang['ICQ'] . ''; + $icq = '' . $lang['ICQ'] . ''; + } + else + { + $icq_status_img = ''; + $icq_img = ''; + $icq = ''; + } + + $temp_url = "search.php?search_author=1&uid={$row['user_id']}"; + $search_img = '' . sprintf($lang['SEARCH_USER_POSTS'], $row['username']) . ''; + $search = '' . sprintf($lang['SEARCH_USER_POSTS'], $row['username']) . ''; + + return; +} +// +// -------------------------- + +$user->session_start(array('req_login' => true)); + +$group_id = isset($_REQUEST[POST_GROUPS_URL]) ? intval($_REQUEST[POST_GROUPS_URL]) : null; +$start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; +$per_page = $bb_cfg['groupcp_members_per_page']; + +$group_info = array(); +$is_moderator = false; + +if ($group_id) +{ + if (!$group_info = get_group_data($group_id)) + { + bb_die($lang['GROUP_NOT_EXIST']); + } + if (!$group_info['group_id'] || !$group_info['group_moderator'] || !$group_info['moderator_name']) + { + bb_die("Invalid group data [group_id: $group_id]"); + } + $is_moderator = ($userdata['user_id'] == $group_info['group_moderator'] || IS_ADMIN); +} + +if (!$group_id) +{ + // Show the main screen where the user can select a group. + $groups = array(); + $pending = 10; + $member = 20; + + $sql = " + SELECT + g.group_name, g.group_description, g.group_id, g.group_type, + IF(ug.user_id IS NOT NULL, IF(ug.user_pending = 1, $pending, $member), 0) AS membership, + g.group_moderator, u.username AS moderator_name, + IF(g.group_moderator = ug.user_id, 1, 0) AS is_group_mod + FROM + ". BB_GROUPS ." g + LEFT JOIN + ". BB_USER_GROUP ." ug ON + ug.group_id = g.group_id + AND ug.user_id = ". $userdata['user_id'] ." + LEFT JOIN + ". BB_USERS ." u ON g.group_moderator = u.user_id + WHERE + g.group_single_user = 0 + ORDER BY + is_group_mod DESC, + membership DESC, + g.group_type ASC, + g.group_name ASC + "; + + foreach (DB()->fetch_rowset($sql) as $row) + { + if ($row['is_group_mod']) + { + $type = 'mod'; + } + else if ($row['membership'] == $member) + { + $type = 'member'; + } + else if ($row['membership'] == $pending) + { + $type = 'pending'; + } + else if ($row['group_type'] == GROUP_OPEN) + { + $type = 'open'; + } + else if ($row['group_type'] == GROUP_CLOSED) + { + $type = 'closed'; + } + else if ($row['group_type'] == GROUP_HIDDEN && IS_ADMIN) + { + $type = 'hidden'; + } + else + { + continue; + } + $groups[$type][$row['group_name']] = $row['group_id']; + } + + if ($groups) + { + $s_hidden_fields = ''; + + foreach ($groups as $type => $grp) + { + $template->assign_block_vars('groups', array( + 'MEMBERSHIP' => $lang['GROUP_MEMBER_' . strtoupper($type)], + 'GROUP_SELECT' => build_select(POST_GROUPS_URL, $grp), + )); + } + + $template->assign_vars(array( + 'SELECT_GROUP' => true, + 'PAGE_TITLE' => $lang['GROUP_CONTROL_PANEL'], + 'S_USERGROUP_ACTION' => "groupcp.php", + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); + } + else + { + bb_die($lang['NO_GROUPS_EXIST']); + } +} +else if (!empty($_POST['groupstatus'])) +{ + if (!$is_moderator) + { + bb_die($lang['NOT_GROUP_MODERATOR']); + } + + $new_group_type = (int) $_POST['group_type']; + + if (!in_array($new_group_type, array(GROUP_OPEN, GROUP_CLOSED, GROUP_HIDDEN), true)) + { + bb_die("Invalid group type: $new_group_type"); + } + + DB()->query(" + UPDATE ". BB_GROUPS ." SET + group_type = $new_group_type + WHERE group_id = $group_id + AND group_single_user = 0 + LIMIT 1 + "); + + $message = $lang['GROUP_TYPE_UPDATED'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_GROUP'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_INDEX'], '', ''); + + bb_die($message); +} +else if (@$_POST['joingroup']) +{ + if ($group_info['group_type'] != GROUP_OPEN) + { + bb_die($lang['THIS_CLOSED_GROUP']); + } + + $sql = "SELECT g.group_id, g.group_name, ug.user_id, u.user_email, u.username, u.user_lang + FROM ". BB_GROUPS ." g + LEFT JOIN ". BB_USERS ." u ON(u.user_id = g.group_moderator) + LEFT JOIN ". BB_USER_GROUP ." ug ON(ug.group_id = g.group_id AND ug.user_id = {$userdata['user_id']}) + WHERE g.group_id = $group_id + AND group_single_user = 0 + AND g.group_type = ". GROUP_OPEN ." + LIMIT 1"; + + $row = $moderator = DB()->fetch_row($sql); + + if (!$row['group_id']) + { + bb_die($lang['NO_GROUPS_EXIST']); + } + if ($row['user_id']) + { + bb_die($lang['ALREADY_MEMBER_GROUP']); + } + + add_user_into_group($group_id, $userdata['user_id'], 1); + + if ($bb_cfg['groupcp_send_email']) + { + include(BB_ROOT .'includes/emailer.class.php'); + $emailer = new emailer($bb_cfg['smtp_delivery']); + + $emailer->from($bb_cfg['board_email']); + $emailer->replyto($bb_cfg['board_email']); + + $emailer->use_template('group_request', $moderator['user_lang']); + $emailer->email_address($moderator['user_email']); + $emailer->set_subject($lang['GROUP_REQUEST']); + + $emailer->assign_vars(array( + 'USER' => $userdata['username'], + 'SITENAME' => $bb_cfg['sitename'], + 'GROUP_MODERATOR' => $moderator['username'], + 'EMAIL_SIG' => ($bb_cfg['board_email_sig']) ? str_replace('
', "\n", "-- \n" . $bb_cfg['board_email_sig']) : '', + 'U_GROUPCP' => make_url(GROUP_URL . $group_id), + )); + $emailer->send(); + $emailer->reset(); + } + + $message = $lang['GROUP_JOINED'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_GROUP'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_INDEX'], '', ''); + + bb_die($message); +} +else if (!empty($_POST['unsub']) || !empty($_POST['unsubpending'])) +{ + delete_user_group($group_id, $userdata['user_id']); + + $message = $lang['UNSUB_SUCCESS'] .'

'; + $message .= sprintf($lang['CLICK_RETURN_GROUP'], '', '') .'

'; + $message .= sprintf($lang['CLICK_RETURN_INDEX'], '', ''); + + bb_die($message); +} +else +{ + // Handle Additions, removals, approvals and denials + $group_moderator = $group_info['group_moderator']; + + if (!empty($_POST['add']) || !empty($_POST['remove']) || !empty($_POST['approve']) || !empty($_POST['deny'])) + { + if (!$is_moderator) + { + bb_die($lang['NOT_GROUP_MODERATOR']); + } + + if (!empty($_POST['add'])) + { + if (!$row = get_userdata(@$_POST['username'], true)) + { + bb_die($lang['COULD_NOT_ADD_USER']); + } + + add_user_into_group($group_id, $row['user_id']); + + if ($bb_cfg['groupcp_send_email']) + { + require(BB_ROOT .'includes/emailer.class.php'); + $emailer = new emailer($bb_cfg['smtp_delivery']); + + $emailer->from($bb_cfg['board_email']); + $emailer->replyto($bb_cfg['board_email']); + + $emailer->use_template('group_added', $row['user_lang']); + $emailer->email_address($row['user_email']); + $emailer->set_subject($lang['GROUP_ADDED']); + + $emailer->assign_vars(array( + 'SITENAME' => $bb_cfg['sitename'], + 'GROUP_NAME' => $group_info['group_name'], + 'EMAIL_SIG' => ($bb_cfg['board_email_sig']) ? str_replace('
', "\n", "-- \n". $bb_cfg['board_email_sig']) : '', + 'U_GROUPCP' => make_url(GROUP_URL . $group_id), + )); + $emailer->send(); + $emailer->reset(); + } + } + else + { + if (((!empty($_POST['approve']) || !empty($_POST['deny'])) && !empty($_POST['pending_members'])) || (!empty($_POST['remove']) && !empty($_POST['members']))) + { + $members = (!empty($_POST['approve']) || !empty($_POST['deny'])) ? $_POST['pending_members'] : $_POST['members']; + + $sql_in = array(); + foreach ($members as $members_id) + { + $sql_in[] = (int) $members_id; + } + if (!$sql_in = join(',', $sql_in)) + { + bb_die($lang['NONE_SELECTED']); + } + + if (!empty($_POST['approve'])) + { + DB()->query(" + UPDATE ". BB_USER_GROUP ." SET + user_pending = 0 + WHERE user_id IN($sql_in) + AND group_id = $group_id + "); + + update_user_level($sql_in); + } + else if (!empty($_POST['deny']) || !empty($_POST['remove'])) + { + DB()->query(" + DELETE FROM ". BB_USER_GROUP ." + WHERE user_id IN($sql_in) + AND group_id = $group_id + "); + + if (!empty($_POST['remove'])) + { + update_user_level($sql_in); + } + } + // Email users when they are approved + if (!empty($_POST['approve']) && $bb_cfg['groupcp_send_email']) + { + $sql_select = "SELECT user_email + FROM ". BB_USERS ." + WHERE user_id IN($sql_in)"; + + if (!$result = DB()->sql_query($sql_select)) + { + message_die(GENERAL_ERROR, 'Could not get user email information', '', __LINE__, __FILE__, $sql); + } + + $bcc_list = array(); + while ($row = DB()->sql_fetchrow($result)) + { + $bcc_list[] = $row['user_email']; + } + + $group_name = $group_info['group_name']; + + require(INC_DIR .'emailer.class.php'); + $emailer = new emailer($bb_cfg['smtp_delivery']); + + $emailer->from($bb_cfg['board_email']); + $emailer->replyto($bb_cfg['board_email']); + + for ($i=0, $cnt=count($bcc_list); $i < $cnt; $i++) + { + $emailer->bcc($bcc_list[$i]); + } + + $emailer->use_template('group_approved'); + $emailer->set_subject($lang['GROUP_APPROVED']); + + $emailer->assign_vars(array( + 'SITENAME' => $bb_cfg['sitename'], + 'GROUP_NAME' => $group_name, + 'EMAIL_SIG' => ($bb_cfg['board_email_sig']) ? str_replace('
', "\n", "-- \n". $bb_cfg['board_email_sig']) : '', + 'U_GROUPCP' => make_url(GROUP_URL . $group_id), + )); + $emailer->send(); + $emailer->reset(); + } + } + } + } + // END approve or deny + + // Get moderator details for this group + $group_moderator = DB()->fetch_row(" + SELECT * + FROM ". BB_USERS ." + WHERE user_id = ". $group_info['group_moderator'] ." + "); + + // Get user information for this group + $members_count = $modgroup_pending_count = 0; + + // Members + $group_members = DB()->fetch_rowset(" + SELECT u.username, u.user_id, u.user_opt, u.user_posts, u.user_regdate, u.user_from, u.user_website, u.user_email, u.user_icq, ug.user_pending + FROM ". BB_USER_GROUP ." ug, ". BB_USERS ." u + WHERE ug.group_id = $group_id + AND ug.user_pending = 0 + AND ug.user_id <> ". $group_moderator['user_id'] ." + AND u.user_id = ug.user_id + ORDER BY u.username + LIMIT $start, ". ($per_page + 1) ." + "); + $members_count = count($group_members); + + if ($members_count == $per_page + 1) + { + array_pop($group_members); + } + + if ($members_count > $per_page) + { + $items_count = $start + ($per_page * 2); + $pages = '?'; + } + else + { + $items_count = $start + $members_count; + $pages = (!$members_count) ? 1 : ceil($items_count / $per_page); + } + + $template->assign_vars(array( + 'PAGINATION' => generate_pagination(GROUP_URL . $group_id, $items_count, $per_page, $start), + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], floor($start / $per_page) + 1, $pages), + )); + + // Pending + if ($is_moderator) + { + $modgroup_pending_list = DB()->fetch_rowset(" + SELECT u.username, u.user_id, u.user_opt, u.user_posts, u.user_regdate, u.user_from, u.user_website, u.user_email, u.user_icq + FROM ". BB_USER_GROUP ." ug, ". BB_USERS ." u + WHERE ug.group_id = $group_id + AND ug.user_pending = 1 + AND u.user_id = ug.user_id + ORDER BY u.username + LIMIT 200 + "); + $modgroup_pending_count = count($modgroup_pending_list); + } + + // Current user membership + $is_group_member = $is_group_pending_member = false; + + $sql = "SELECT user_pending + FROM ". BB_USER_GROUP ." + WHERE group_id = $group_id + AND user_id = ". $userdata['user_id'] ." + LIMIT 1"; + + if ($row = DB()->fetch_row($sql)) + { + if ($row['user_pending'] == 0) + { + $is_group_member = true; + } + else + { + $is_group_pending_member = true; + } + } + + if ($userdata['user_id'] == $group_moderator['user_id']) + { + $group_details = $lang['ARE_GROUP_MODERATOR']; + $s_hidden_fields = ''; + } + else if ($is_group_member || $is_group_pending_member) + { + $template->assign_vars(array( + 'SHOW_UNSUBSCRIBE_CONTROLS' => true, + 'CONTROL_NAME' => ($is_group_member) ? 'unsub' : 'unsubpending', + )); + $group_details = ($is_group_pending_member) ? $lang['PENDING_THIS_GROUP'] : $lang['MEMBER_THIS_GROUP']; + $s_hidden_fields = ''; + } + else if (IS_GUEST) + { + $group_details = $lang['LOGIN_TO_JOIN']; + $s_hidden_fields = ''; + } + else + { + if ($group_info['group_type'] == GROUP_OPEN) + { + $template->assign_var('SHOW_SUBSCRIBE_CONTROLS'); + + $group_details = $lang['THIS_OPEN_GROUP']; + $s_hidden_fields = ''; + } + else if ($group_info['group_type'] == GROUP_CLOSED) + { + $group_details = $lang['THIS_CLOSED_GROUP']; + $s_hidden_fields = ''; + } + else if ($group_info['group_type'] == GROUP_HIDDEN) + { + $group_details = $lang['THIS_HIDDEN_GROUP']; + $s_hidden_fields = ''; + } + } + + // Add the moderator + $username = $group_moderator['username']; + $user_id = $group_moderator['user_id']; + + generate_user_info($group_moderator, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $poster_avatar, $profile_img, $profile, $search_img, $search, $pm_img, $pm, $email_img, $email, $www_img, $www, $icq_status_img, $icq_img, $icq); + + $template->assign_vars(array( + 'GROUP_INFO' => true, + 'PAGE_TITLE' => $lang['GROUP_CONTROL_PANEL'], + + 'GROUP_NAME' => htmlCHR($group_info['group_name']), + 'GROUP_DESCRIPTION' => $group_info['group_description'], + 'GROUP_DETAILS' => $group_details, + 'MOD_USERNAME' => $username, + 'MOD_FROM' => $from, + 'MOD_JOINED' => $joined, + 'MOD_POSTS' => $posts, + 'MOD_AVATAR_IMG' => $poster_avatar, + 'MOD_PROFILE_IMG' => $profile_img, + 'MOD_PROFILE' => $profile, + 'MOD_SEARCH_IMG' => $search_img, + 'MOD_SEARCH' => $search, + 'MOD_PM_IMG' => $pm_img, + 'MOD_PM' => $pm, + 'MOD_EMAIL_IMG' => $email_img, + 'MOD_EMAIL' => $email, + 'MOD_WWW_IMG' => $www_img, + 'MOD_WWW' => $www, + 'MOD_ICQ_STATUS_IMG' => $icq_status_img, + 'MOD_ICQ_IMG' => $icq_img, + 'MOD_ICQ' => $icq, + + 'U_MOD_VIEWPROFILE' => "profile.php?mode=viewprofile&" . POST_USERS_URL . "=$user_id", + 'U_SEARCH_USER' => "search.php?mode=searchuser", + + 'S_GROUP_OPEN_TYPE' => GROUP_OPEN, + 'S_GROUP_CLOSED_TYPE' => GROUP_CLOSED, + 'S_GROUP_HIDDEN_TYPE' => GROUP_HIDDEN, + 'S_GROUP_OPEN_CHECKED' => ($group_info['group_type'] == GROUP_OPEN) ? ' checked="checked"' : '', + 'S_GROUP_CLOSED_CHECKED' => ($group_info['group_type'] == GROUP_CLOSED) ? ' checked="checked"' : '', + 'S_GROUP_HIDDEN_CHECKED' => ($group_info['group_type'] == GROUP_HIDDEN) ? ' checked="checked"' : '', + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + 'S_MODE_SELECT' => $select_sort_mode, + 'S_ORDER_SELECT' => $select_sort_order, + 'S_GROUPCP_ACTION' => "groupcp.php?" . POST_GROUPS_URL . "=$group_id", + )); + + // Dump out the remaining users + foreach ($group_members as $i => $member) + { + $username = $member['username']; + $user_id = $member['user_id']; + + generate_user_info($member, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $poster_avatar, $profile_img, $profile, $search_img, $search, $pm_img, $pm, $email_img, $email, $www_img, $www, $icq_status_img, $icq_img, $icq); + + if ($group_info['group_type'] != GROUP_HIDDEN || $is_group_member || $is_moderator) + { + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars('member', array( + 'ROW_CLASS' => $row_class, + 'USERNAME' => $username, + 'FROM' => $from, + 'JOINED' => $joined, + 'POSTS' => $posts, + 'USER_ID' => $user_id, + 'AVATAR_IMG' => $poster_avatar, + 'PROFILE_IMG' => $profile_img, + 'PROFILE' => $profile, + 'SEARCH_IMG' => $search_img, + 'SEARCH' => $search, + 'PM_IMG' => $pm_img, + 'PM' => $pm, + 'EMAIL_IMG' => $email_img, + 'EMAIL' => $email, + 'WWW_IMG' => $www_img, + 'WWW' => $www, + 'ICQ_STATUS_IMG' => $icq_status_img, + 'ICQ_IMG' => $icq_img, + 'ICQ' => $icq, + + 'U_VIEWPROFILE' => "profile.php?mode=viewprofile&" . POST_USERS_URL . "=$user_id", + )); + + if ($is_moderator) + { + $template->assign_block_vars('member.switch_mod_option', array()); + } + } + } + + // No group members + if (!$members_count) + { + $template->assign_block_vars('switch_no_members', array()); + } + + // No group members + if ($group_info['group_type'] == GROUP_HIDDEN && !$is_group_member && !$is_moderator) + { + $template->assign_block_vars('switch_hidden_group', array()); + } + + // + // We've displayed the members who belong to the group, now we + // do that pending memebers... + // + if ($is_moderator && $modgroup_pending_list) + { + foreach ($modgroup_pending_list as $i => $member) + { + $username = $member['username']; + $user_id = $member['user_id']; + + generate_user_info($member, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $poster_avatar, $profile_img, $profile, $search_img, $search, $pm_img, $pm, $email_img, $email, $www_img, $www, $icq_status_img, $icq_img, $icq); + + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $user_select = ''; + + $template->assign_block_vars('pending', array( + 'ROW_CLASS' => $row_class, + 'USERNAME' => $username, + 'FROM' => $from, + 'JOINED' => $joined, + 'POSTS' => $posts, + 'USER_ID' => $user_id, + 'AVATAR_IMG' => $poster_avatar, + 'PROFILE_IMG' => $profile_img, + 'PROFILE' => $profile, + 'SEARCH_IMG' => $search_img, + 'SEARCH' => $search, + 'PM_IMG' => $pm_img, + 'PM' => $pm, + 'EMAIL_IMG' => $email_img, + 'EMAIL' => $email, + 'WWW_IMG' => $www_img, + 'WWW' => $www, + 'ICQ_STATUS_IMG' => $icq_status_img, + 'ICQ_IMG' => $icq_img, + 'ICQ' => $icq, + + 'U_VIEWPROFILE' => "profile.php?mode=viewprofile&". POST_USERS_URL ."=$user_id", + )); + } + + $template->assign_vars(array( + 'PENDING_USERS' => true, + )); + } + + if ($is_moderator) + { + $template->assign_block_vars('switch_mod_option', array()); + $template->assign_block_vars('switch_add_member', array()); + } +} + +print_page('groupcp.tpl'); \ No newline at end of file diff --git a/upload/images/Thumbs.db b/upload/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..7f6da5c7971eabefb8ecc56687f2b2b5ba6b3ef6 GIT binary patch literal 22528 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 literal 0 HcmV?d00001 diff --git a/upload/images/avatars/gallery/noavatar.png b/upload/images/avatars/gallery/noavatar.png new file mode 100644 index 0000000000000000000000000000000000000000..e6025d259584a219e933e11fde950a3d78a1e6e5 GIT binary patch literal 14362 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
  • l$}#x5NczfA<7UCjMX#{8e6Cs6+krvh)W3X zpx)(qJC?MuY7_xt0BeyAkU+%}LOoWG)TMaju7+HB zdCMgZN)v%L%H(*Kx7oiIQKSq3un`qhSY_V6LJUUE$pZe_Ie}#~IqPTk{Lnq)Ft|1X zt<~auNAkB`Nq4I=;&9W`fQ;cDkWvZQNHti^f>T)@kQG2}3|C|+LlxeaR!>7=Odi21 zmR-e#l2ui5Gs$Lm$d4C*+^(vgYN{fRvV0^}ed0psqIM)(%_GI~A@&{GJT;t!nJB^{ z#;+V{pE|M-5C}AJC|j5;*5(!Ypi02TN{#y0KCmSAh3(*yQv0eDA4;_i^dJ$#;cRQf zQ6$Npj6bSZq7jjWKaqiHWD*q44~)Cp7Grb1IgID&6lb*^pnZt>IzmcAiQ0J@-%^Ea zIn|CI6SU))CWZ?y==jPz!^>(fbQm0Dkn1!6HfM&ZW!ghoV?;~I2R#q%`3&rP^cGVo zda4R+C#oHnCoE?f81nkAhLI30XV@{zeshgdGvlu#vfsf-~kk66oa)!02!D5r?USk`!6e*xH;b(p4Rs+iU|t5w3}tpxG+%HpSaCdzH!O-x=#0) zlzKf@RwfYKNW;BrU9b~-%kx*pgZGZV{uB*5Rg z!^RV4^Pch@|KXxf&gQz~N>_u|vD`Ga?~wuTUKCR^+1h=Z72LrK+rj;nVcY)LxtXZ;{BTZ}DdhrG3~={?*wb6V1qE)YQ&u|aU)c6O z7H}!fe4C0Pqul!Zxf><^rQ4&*mtIeM=bOQ|oenuHy3cD+WU5j(M($Y@%h8!Hz(;O2 z@tC48eLYY(W7D`NUx~X%heUa4r=XBtp85W+1u=i|h>1|r0p)!sRlK|#^o>?fuS4fR z0shsSOl0$wRlJ5iX%vx|Ej4P8lxPHB>6U$wsrC)BT zQ&zhgl3W%SGt>dN(#hI*qZw2ivS(%PG@W(Vg2)@q5Rw3V>yr0n3+w(RF>kdrY$mGj zT@>?bQ^Rhmg(a!X6Z`(-MVCymn|QQBnU9Fqo55e{X!!lNT<`l=nQo=3?Ns%jJl|{o zojarY@AaQvr&?QfvPGt9t(7qYPOrdvPY_T$wnBKTt>I8a zDUzcN_e{tk3`+>aLU#R-WvF#aKCmSAnKhrTbadSHI(2k7i0$+GFbp>n}n}O~TX3N}q9^p_-bR2ZGtGb=P zeW(`())jMnZ97q|TQUtmnwO)Cg^VQ2E-wU#6*3JOtS1DjLN=X-jV|yXFS;azeNpIx zypEP8?07rDjR-*WwH=Xuw2O+m)b!uwX>fdIcn^mZ3N%*!~HzH83F({EJxcK zfSWE`tTV2UCmJG&S6s=~KaQe_oE4dy48JR2B5TIj{A2x!RDreLbWeIpJ5+!-*D3Ei zY%Ipyhs+$cSTg6%j4!#Whbz>Nov_iQzJ7nz`)*eCY)?NvdW(&YH)!6qAO-*{CiA0W zA-Rv|KOaG=HqZ3T{VNbytPGd-(*t?xI;=yi^hMTn#P4P^eSyrB?)VH&D%A@Hb0;%o z>r2WCaWvCOTMm4FGx%}HZN&fu2bXHbvT8Cb>PH*Fx18#3t|U5nD<0zu)R(t2xwumW zYnJ$HH<{?0mwdWeMl@z{pr)=50Yyr$*Sj79a5^NPRR>Bu;DRC|cvD?uJ5eosk`r|? zi!t%tE8fp#h_Re+hEi>ujFH+-@!IZQ6MHvR?4|=ED*7)?LnmLna;fb{-*BJ+n0Vda zoGpifD6pv;|; zJ83rEbYQm@7SJqRW+bFnEtXTOA>sE{Y#;zEMr3S&JpMDWOw(NpVrqssx#9i&OU5k5 z>FBxm|g`XA47TcF9UgK&fs~coU z4(g_J&%Ng(;&@$(<3$V{saK7JeBWVXB4NMQO25P@25lu?)eqv|bU|5U8IIoXhAMgQ zf-z&pVd#6}pgF+W`M-T+*RX>^~s)lA@Gz8qnaB4;e%BS(!Tfks3wRVZa; z830`FgkbZk*ERRyl&uQfwBw;lYa?}*~BzL6#$xY5|ISKUrk$uT94 z4yHpCVq_9@QWQDHYF8BsZuK$=Qp5&E&pW98Q3bYoIs}0fB59hT;#J|o_!_<$=PCAE zKdO_VAFOp%?_Lx+UKjbJ%g*U=SQsAA-+VFY0l=#}A!OV)yC9zkohYfsn4#Ze0qT}g z0vXwMia4+5TQwPU&KcwD*ykmT<5;8gpC$$-rF7`=KvB9|-V8_f{( z07@R?-@HTQQ1~}427kxAosMaNM3f!X5wPlv6)hhZ6|}Ebw)yP#^ekF&`a(9{W$|cbVk!$$6PIQtFzC1`)NYWfw4u72EPkDXz-#vEwcWnphV>&m^cWquj6bd zPF$p+Gd46@EMCW7q9f?8|JR@YH=j;P#WcyAL{&g{VU@4-Tcm?iB$u z#zRUkQ(`GwA3?E!|9*E>1&I*ECW9nkUX!U{3mFQMHhP_bscFyr(99Kzxa zpE(?2Cz8(ghtv=8GlcE2{nbAiYW4Ehvs>5z4QopDKRHS%- zr4{hSn#vN#{DfrH^(GZuYXd`=R3BiPB$~9eSo8oZsQMHxh12?P9@hLVUjx4~;?x z7#nxcaWBx(nTJ^qG^*p{B-|tT%ZqBKh%0^O+9r%5iXuIA`qbHr7cX4R3DQ%|610oX zMLAKJQ_cPaP5l2J+{j{#6+kb8|1!MBmQFyih!YzW8yOhbRCF8`EIQgHqUaTJW5eUa9m4u?XE-J$ zySK@k2Z?kVK0Pv7!<5bA#HB|*6O4;rUFn>xc6yGj{I4|}A&-0(Ds?||sS;elz~G*3 RRm-(t)z#IZtSl@H)&R)PHJ|_h literal 0 HcmV?d00001 diff --git a/upload/images/icon_disk_gray.gif b/upload/images/icon_disk_gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..10fec33d325174085fd1657c7f780b268ba95832 GIT binary patch literal 313 zcmZ?wbhEHb6k`x$IKsei=FFLyGiO#;S9f)F?b)+u<;s5CIf_vVc|TfJl&?46NG}6l?-B=VeUc zIMA%XsBpeyE{pRag98u$A5c*KSm7hrvOuUpcmu=9rJEEjSyVQy5V$F87QadkZc%#+fsP znJpO8?3o!{Y#bQb*m+y0*cr~}vYoo3cEMVP^&8i&sNA`ZU3h2M?z*Yl*&~)64r7|X f&4cqGE1w-#SPQEWmjFK}CyNP(K!69MB7-#m4)1IV literal 0 HcmV?d00001 diff --git a/upload/images/icon_dn.gif b/upload/images/icon_dn.gif new file mode 100644 index 0000000000000000000000000000000000000000..957bfaaf1f65ea73ef51e33991c6eef956a5cfaf GIT binary patch literal 811 zcmV+`1JwLSNk%w1VHN-u0Oo%HaeBw*>HqWd^Y8NYnW5OFsjZZq-Qwo|%gf7$ljz~$ z;hCGjnWE(Q`u|&Gw33<9k(HUn#l`;q|I*d*&eHSd=H`ctk=We%ZgjZm>FK@0_44%p zi(-yzY&Xmyej-zy%9~(3m9!545e`sP} zEHvU+r%MKNfD>2r=hCfE*jFNSNB-!ih9dLM-8?B8iVQasoKu(`3aID<5JgdEg*K z2o&6in1s*)R*eGy9BysM!Quj29Xe2$_(MWR2?q#W4T? literal 0 HcmV?d00001 diff --git a/upload/images/logo/Thumbs.db b/upload/images/logo/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..67c874b507487fb5454edecdeea5021289345d3c GIT binary patch literal 5632 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 literal 0 HcmV?d00001 diff --git a/upload/images/logo/logo.gif b/upload/images/logo/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8811a0d8885290815269e1af4532247262c4e0de GIT binary patch literal 8259 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 D$9RoM literal 0 HcmV?d00001 diff --git a/upload/images/logo/logo.png b/upload/images/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff577a82bdf5fb7da691e7b2db4abefd5dcff5a GIT binary patch literal 43705 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%0AM?rowjS>Q!pRM>Gcdw6EYet{w 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 ReDUwRQ+%&b@zyl>{{WQ`nWX># literal 0 HcmV?d00001 diff --git a/upload/images/magnet.png b/upload/images/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..a667d4da0d35c7032298fb9f97126919ada77187 GIT binary patch literal 2210 zcmV;T2wnGyP)U&djzoy;%As?|k!J z<~;BFoaem^+p}~G@(^ThAmGv2?;3=FOQ(R0?x*Obgcl$VCSvrw%o!%>**uf)vd$Wv z54vnLAinW5GV9ml!kM!u%#?6^;uPi^^T?!<&~cqZ{+|38rWZDab+$2L;C9vw#R13*Ed`SZf)Jx1@2wNJ)B07d* z{Pu~w_xkv}^YeM1{Xl1I_7edI0b8E5#M>)|*s5r%1LXN#-X)+4)q-e6;5VZXj!nWa z=#h@wSis{w7q+>qkufDjJy(&o0hlT_n~4 z?RXO?QkYMidr1P~VC1SW=mnBA3+T6`ET}Wxr!9zjX{>gGM18|uugu@I`o6$*cM2g& zS4GT~&sd%A!IpS}!Sgzcsf9!c8V1R=WJgqtBH$!4`p%?^v;d5*87BvcTaEi@dvzS! z^f@eh;YZl;&_hoQ_V@ld5W(ktKloo@8JW)TWFpRDQnivDAvcysNLc-JCK+fRM6?C5 zxZbh82DGq8ba4f&oFQ<{Y2xG;)*$)Jljx5}5jYN3jE=6of8D+BghQd7PP?rM(Mfc^ zC7F(dOgx`X(H2R8xwL>Cf!>pb%uA^$ueSjVw9uMuqcBxRzBuPrnl*-ia>}y6i8rm? zMt&dz_n9pi?CXQuauk3c1juGG*67IMjrn46<%L}S5IIrdPbJc8d&1Zejlxu*p%Bbu zQgWfnmlt;+Qf*W}4shyUwUdR4^ZmJI@ItlezEf=04A*O}ikT!b!EpBLo6&#&I_Qpz zg~${*(HM#J;4^oB>dt(jxH(@c?$v4iAzeq0+*23^jBHFPi;)85L|z+IxzU~vEwIx*`U2n(N?*XljZU(+H`H1Cid?CYiZ)t z)VEE;n3v9IS|ADm=Yg@v?nK&65f~kBRT}BgIb)Va*Ctt#%o`a&tG^$bN_xQ7`3%wc z)Si9&w;ue*M-@qR*bY%C2=MXvxHx?D=ywy**hkU{gOeC(v6GZyH9>jE7C>cQ%Jh)< zRFT3N&MES*>F8*VlUUqEi!k~4<0vg(4ztx%3>ZXdz0uh9=I%dkc=^}AInW?wQx0R_ z{=dCSdHgHG&>@|d0r73A^qkiYHd_6BBoyOH2rAO*~lY5S@N zqpNDBcj_?pCxo>YLU)g0`di!A7>{oLy>6L10^e5@$?7FHCs!z-MWs@WLfs;=kjq!v zrJ;iB>~(!c{P@g!Et+(v@spZ;Qcj^AiR79(jhapa&*a0vZ=)HsQnFJ z)&^7xQGQG1Ubijs?WxSA3zM^bqAcRYqPyPCXb8tO)fu_)(Bd}sk9`?Vq8~=PNdrQl zC>!X_-a&wya>deQquHETC>qicS;u3M$o~hHoz>uM51YeG;jH(7XTyqRHJAi^B)twN zB4e-v=h8U1K-;3eY`Qm{{wg&9y*@vGkbvc|iduahrP(sbsjKX&nM-y}%VaN^EoFF;}5zJ&MNej!T_B+uxfuL$>uu+jU>kId68SV@3NlN1yAB zwzNeDlZN(1ZQR{;csv1~%wP%S>hRF85>kWaW`{&1OQRf(J~(`|G@UDMvrV%^z>sF> z9Hva8YnXncfsA&lO3ixfvCQzH>Y208#|<-;PNh}n$>sB^7ITv4#e4zNh0=4WMEw04 z4eVF8#7{I=Ul}?zEjT9sMY&QvboAfjKV7kO%W!&o}9RJFgU(^DvvD{t7g^$HnM zsRY=q4)j-#qC&Q|BSO<2JDbb@u<1D4MhTck88q7Nlx12wb?*2Ls@d!&|4!&P`}VR Ix-wV;07#=c7ytkO literal 0 HcmV?d00001 diff --git a/upload/images/pic_loading.gif b/upload/images/pic_loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..01e61866d5b73102822c2b25accbd0d470546ee3 GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`<;O|NnnwRka^KegubvPMJDQLrdG))$R7}+ncv+F*Ud7==@u`q-Vg)2-K_iPs+I{HL)Z$MWH;i zBts!FE3qOcKQTowGcPTlLGdRGCl^qa4#*aeBNbh%&Z$LlLqv$@-~j~( zK`x&I4Ih#N-J6-5wmjVyU^+v=W|e7ZO5ir_7fSmUr%y3hA+~PO!hXkWf%D3a4BR#W z<_7FGoGc9ne35JxTD+X?%8J-5PXPK*`SS#gTOuA>Tt@;#ICYn_8@@Mg}KBp^Oec1wD&))Kc z+MAX$v(%_$^TufM^K@giGzb!`4GL433`LGQtY~(YV_PGBEW5jD4x^&elLUK)#_de| zCMdf$SyVX%Ml>Yv&RtZ-Eu^$i;pL&l35^MDyrFK(B#Z7y@+~cRt@%0ae*;!)Kz;+p z-UIxI#Y7K=h~OCiC#Hx^G&=SI_w8KbxWGHnwnjuLG~1-bwL literal 0 HcmV?d00001 diff --git a/upload/images/smiles/aa.gif b/upload/images/smiles/aa.gif new file mode 100644 index 0000000000000000000000000000000000000000..48c3c88cea23170a8e46dc2404c6711918033d08 GIT binary patch literal 7746 zcmeI0X;f2Z0)}r02?+_Bgn$Hsgs=q^ObA*eR0)f0ieVMC7Q!Nn2vLe`Dx45vz!(uJ z0NcdSOyT2Nx*T`@yw4|7|y``d4Jp=&wbAOz29qV zzsqzxQw`Vv%+LTo4?4@orL(>2W>uz}?G^#&=)}~^d%f+&xt!Qw3!go>n4q0v@z~Jt zU}46|5Lfx)WOUCB3esarxa%i7RYz*E4~iAKJDbAX;3I!he)Kh}>#}@^ zlic{^RBEE{HMW8n0DilHzE^;_%#xdE$36TSRdGu0Fayu9p$dQQ3TIN!AC-SljvBa$ z8U6wLs1hYCR=Ar9Px6yH?nUu(*%`D4mU}|JE(LL~5ZRlD_#qh{=mF<~C^)4l2imtrfC{t7P2E zRz=2{W!jzW4iMdDbM``|cBUhAF91ietynL9%UmNxtsWQtY31>0Pp{Sp_C zO4W7?*WQO4r)@op*naPW%QyN8uDmaaX&Fv0rl$ePuLpr zOHDL5zy>d;pnM07wV2TahmZAE`4+Fs*$xd1SNgnkHqT-ayF4Jl4gzEV9Dsd`oh{|f ze&b#PZfrK~bJ>K6HK!^$N^KO&yW-sy{G#*{zeND=n zE#*BkJ8DeTHP;(|OsS#dpUFQqgL+Df^a0m1UdYVO9%JEmoF&f`JZ3ezl>!#*g{r76 zzcq!EgwfhMemnvZ=6l$$hIz2$e37gYrSaBn{;5~14F$ zv#~r~r`#gm37K766-{o?lZaOX@9uOhajWvV3g#>9zr`!9Ve24>Aot4+-UzF+7@Y%x zULiZt@e=Sk5T*SRvRj4X+nR!NZEnYz1UZ$?X|d`@=-2O81`UoVWGfxRn-EC04B&nu zvc15yMUZ3m#fS>)=$Da%l>>W_HaIdSCH(^V3G^k3Gm-nL%BWwquxksp7T9qb)kjA| zn_}S-wV7pZ617Fb>roU9`4j5)a2$~btGfj2H0)Epqoq$@R9lPLhk{64a{U$@AqIE~cMx_xl zF|ZgRgim9)Weaaka2g}Q_H(nEB`}S3B$Yy|hJH?|3n*T84h-ITLyXcxgc3h`$A6kj?>T5HZzHp9z8qvWSiTgf0yM4 z>jwHIU~KL<=fz!Pl=?I|$f+DqWy-fDbSra}bsVbkrBx8bB_mKRFl#r4 z$RPVPr)W~I@iVD`J=rePwvU0k2_6;9pPD<=Og9af23jx#`9K8%mtj>bP^U$VwNqZq z2Tv>ocKVvw|G#2Oy2yuT~r%} zjIlKeol2$}_f;D9+PbilRr;Ae&2^_}a08TbXB752%^T^t|o%Swkx10#MfBU7lEAlY}v}4Gw8&yy^&S z0n9P;GP?W>ieD>V-**I=Wm4R`fHt+5&UZf|tUfjky_;;hP8F4=MXG;l2_5Mw^=)xd zHw#BrfAu{Lwb(-#%g%Zw9FCK|O`X;69gh9MSD(GZ`g(^q>yIn%v)=J9vab6Z>lM-Y zR*BbZfxUKbT)Q{E*`NN?d&t_o@xL=Yt%RfTe|2v(UiKpLk%qlG#9sc+CqexWgUI0E z*x2G6GKmaDj%mW01qtM-0$NprS4os)!6rqqY%LRw8Esw=(_NHGqW;dQP7XY~-uEUjeiF+h+g( literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ab.gif b/upload/images/smiles/ab.gif new file mode 100644 index 0000000000000000000000000000000000000000..48c8611541b3db97ae0aa75a611b24be5dbf37a0 GIT binary patch literal 2180 zcmeIy>rY#C7{Kx0xwJiPPw6QfwlgW^bYThzO~Wd(f$TuRp+O}XOO`lHORNJ|#>J6> z2}yfOZ)0`T)UdkjQniVhkyMO?%w*7V$>NKSm833RQo5Sdge+`ST_);kTQ>ED@Ak^L z-+%D?Jm2Rz_{z(*`?MsWK#~X2Nt#g+=>)wMm2QNnjZ`Xmg-oZ@sSq`ytKW)Adk)j< zLDK6PU0B<8jkw#^FvrFOljMw@H9E&#CzJXR7Bd_jtz7wH^S1XQ8YS3 z27RPMhx*Q2t~jvJWzsWBOuGo5$28?6To#>c0QWhF%N9H~O*nfo?~FkNOa7!=3* z^nG1@#}$UbV~W9{avI2gMMc+u8dPR2vI7RZhekDP9*LJIdHFvR06F5}M&Ni(N@ zUvP19b(!1r%%^HfQU!zXYB*0Wp;)3WxVE%>2SN*iJO5P4|;Wrage9!^??zyRapO$lN zZ?pS{vHVY12q~;QJInmgVrwd(XKObbS+uC=i2v0NT5U!%n5EtK9PQi7^|YCPZ>AD@ R;$3>$%%f}kf4DPse*%NmfZPB8 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ac.gif b/upload/images/smiles/ac.gif new file mode 100644 index 0000000000000000000000000000000000000000..7442ceab44edfc3765d4e53992b18fdbd8d9c8d1 GIT binary patch literal 2152 zcmeIyUu;@c9Ki8&x%@d7Zp$s)b+?1nOWP^!x{3?B&Q1loI!lPT$z0Y4mp~(#WVWR< z4U$O0pcH6_6N9NF)<7LuoQ5pT(r6!QDJ^NHAuUxjXmP`YXk(hCHcgync%g2(7~{(x zjM;fSPv?Bj_xz4^KihuTL;?yFMW9rqHEQBkPF^a|n`vreb2A!tY-i=gS@Kq1ZZ{t( zl}cttzMi5s(o{BctvEv#i-mkXw?0p1qj)BrDohiW6Lfxx=sN+!gWRCUln%q_+xE>2 zm5bpP13dK{IWYw77ELaf$;F9mHr>a-*f~5iMGl$UO$I6-C#D1V;3?HcMqW%&aR+xk zM*7X%+%y>rpWC=b%?Dx7W1b2UF+UM@5Ho%l4-lJKxrKpI2TV`E;2=I^QV05AY{D}e zgqJ<|YyhS&li)wU6eZE~T`wH()G}QM+f*pR9$0a^>8SZt%jtf)*G_9KHd8;XwApNJ zX9ivw=p8uIW;=Vj?d(u9Q2fHhmVh3#mM>X;P9V7L)Vtino)Pab;u{%t1;#w1Z(Vrv z4J0(i6L&T4-{1JSm^W6#uY0n&`iXAkGyEEFQ%lFA91Pb4NgR`$EeXU-QGs7?-SV}&0Ji(=cmEX zoOAB0j>RJeV*;6oaAb^uwrZR!=*+{$NJRTh#CU*Evl~t~ANDZ5M5In3?evAN0K~<^ zA8P;HYAP_z1l4e!iOhAPzLVj4iXj??Ip|~yR!hQ)mAGt$00c-t?OiK9;_;2Ry?&qf z!uh}$5)Awa<^L;`=Uymx1qvhq%Be3?=~=48!b0j}jf}@S&1Y5xWhE9V847_PDoQNU z+8V|s4hiw9pSKpa375(UlJ9|P&dpNuS=tv3JH1NNkRxn-UUHKE6W+SoiYi!C`yL%f1rT1 z@0RbF{J0p}X2YqlY^`I4OJW_t$Bhx0l5uua<7_o^0mV)=laXW%Cy{Z;XzQ(G&PfL2O0< literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ad.gif b/upload/images/smiles/ad.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea194fefbf90dedcb6f6641fe1c193798fec146b GIT binary patch literal 2113 zcmeIyeM}Q)0LSs?xtI3ZUdsWe7C7;WGooVG2{L7DYkBE(!{y@3W}IfNSrwvyA_U2T zYp+z%1RXPGkd3XNESYfxsW#3Sb61p@IV-IbSZ5eCvr~c$NoJ;TvMVpXZ2Ql@mhA4o z`|I*~zR&NCmF8v3tu&xP1Owv{)|f$!huH@qW_*17K|d2YOW*5ZM*P~Mb?lg5+kB*| zcpXt?%O3L4&5hMVUD}bcdyz=EC-_}YGuhuC8W|f4d#SOYwyMY&^mq9iiBKrm-$sR6 z$qL)Do*sWu0a5R=wmQg7E9j;QqQ8S`ZE`ghW4?OnyDiv3TMM+_I?~25k@NI^8#WST z&h96Ct#rssx7ATQHyP@8lA$)LbwA~AB8oYptr}~tCK{`$x?g49p-cN)SC@Ab(^x^UfOA-kMl; zenMJW!uA#uf2qSg~|!p%X1jl3`IJMAi#^DTFqj`3}@`Z z9FG@3co8aPuP&U)$CL8YUWj4Wd#TxEBClGCUg+!X>76xC#V2Io;jZ4_plpGfS5S9; zxO-QYrMRc@eVcCPM3-8REnTmxYsdwNrVw3y^%9?=-1{nKFp8>})L=qD7{K=;*Gg`d zbz3_RmYCCOwSz!(AW+GyxXA*XPWfEHU-tnFQxb_sg`@B4G`V{Q&R7Hik5A4N+F|(P z8eI40F}KkqJ3y(7s}2|jO=z6zg~aRzw)~S#xef_d;!#F9=IE4-bIQguWmB^-r`;of(-Sa~ONS^R@~Dc0a^(t2NG1|VpNL;rpjJ?W9ykoa z9VnS7G`(R@XjYP5z3B2EUziN=m?&ZFu_hV6N9*xK?Ky$7CoFzXleN9CS>$VDH58Ld zxdjKRWH7feuLhs{%?7RA4$yN)vNsOLU9et?VP=uUodGLKCb3y7*HbNdN+tb)n>hLP zVK)(kM7_Ugm5hw2u@1e@C9#0<4{nM zt3yK*4nO_sd#IEk5>FJ$POt#VkHeyNcP;HUvyB*E; z^bKC7ystgiiO0@m*kzo>=s@K(W-vh)p)zkcZ2-_w@X_ql(H$q>qW0-t-?7nP8Q>K$ zNtQkkSn1=bd8;`$i{{s^YQpjxM%_>mr%o;qmZwq^c`SJr~>fzWg6u?Hf>;X5_W z;lCOXr!R_M0D=hcixYuhw*tc#qax_--vdAEx9eRopIVO3vJ{ic5giW8 PE^cyE|4-zpL|*v|>+4Sz literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ae.gif b/upload/images/smiles/ae.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2ae75a1c9720586426590f8ebdd2056d8152c78 GIT binary patch literal 495 zcmZ?wbhEHb6k-r!c*?-=|Nn;@7f!60(NK|Lk>DZl;>CjnGb%CyI97BBT-YG+;)KMB z6#@$yIBwjyP>^6Sqe9@t1&RMRBtBe__;5nv!48251so3^+{g%!IIu$C{{w{=2LyIZ z;Q0UH!-S566%zy;31|5)6kT)6FE*_X$z|O(J#&XC(fPrT|>tV);0UBaG z%?m%=F_q!>NRgT7qao^^oUt=OY37bSYi`EqSongfH0`*cm{Wflc^8Pl1OH VpZ$p^=|^J}XP@gR5@KPn1^`=@t5yI2 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/af.gif b/upload/images/smiles/af.gif new file mode 100644 index 0000000000000000000000000000000000000000..6218414ce24f1f78e689ad01cd676c6d48788b12 GIT binary patch literal 7094 zcmeI0Z%`9=9>#Z*P532QVSx>-G};XU28@_eYNIlB4WJRD7bsL>p-q%1Y5kKZ45U|P zb^`%I4M$q>;40I^7Nwj=J?c3vwW`-g}69ah~?D;Vp>Mn{Jy zd+@9Mc)4CaGBVU^LfRR0dXO-vL3^9ET$g^@j!yOyW<$oF0?=avqg~io7gnsqT~%PT z9i15>%zAlSv-zw8KsIQ&8@K6^p*GNIMa}w*)+)@?j*kovI;?s_0om=q%m!-oG(Oac zJ4~oS1-hybQ?YE13Nh(qZRNne2T(ZHx(5ja0%z?22|ykP00C&E4Ul^fTo08GqY32@ zc@r^@pt`d_X(tFhWSv0ec3>Vw^=A=PCu9id)YG7#3jqKOw*o^y5E&3v-AfHyY`aX z&Ez^mg>EmobKib4zf?~ubY)`l(bP&(Qc+Qn`ux7#`?l|UKDA>1uGIbI$s{Dcfh<6w zE=U^U7&!=EG%5zinKn8lMbR1?l$N86HQSdDv z7-B(D!5;*!1^JW-$JsnGT;wEsmw4QD5!f5<+}CL!7Oy8O{oapjqgL}VVwIMH!!vVs z6PJDNMhA=_EvvK^R`e5b*k_;bU_NMlRG%t=dO2Kf3?wNYJe5of@FO|JIlYe2~SwsF7+z25*M^q`Q^Qeg{Hwv#}d=l+$mOh;A1ihe83PeSV# zUivrdRcV^&U3ZX1Ut+9OqFKjqd1PbHa|V{8juoBKv2vEiYR(*u@Y^&Ng=m!2BFP~d z?mxc1>P{5Gysa|-yY=ig*5hPuw+BMl+`=;h+H(VSjS-TA z%84usB2?9@eU~o^^N>fjo$}Le%Q*&y??&SO5ru#wOF;`yI!j+S$$ni&8qK zy)a9_%N9-H@4&W~go9s*moDj z^?O(p`TmFQxR1M|$ft9i>^fmogWQ|!XGbNj2%^wZ=Uzfr9(-|%FlD{GFe;%#tEgd} zZ|rJ{_j`|8!;lyv<9;`byTkYab@9L~ZY9W<_wa?xCWwX4FD#MoXJBruZBuHYI;#85 z1mWj*XlZLre0UlE3Y~R<&&E)~>yN)}7Pjc1S;)i+=9XD_*en6Mn2X%s#`z#kzx!eF zAWf@(bk}^4rqcWI)B8u)#VYK^=ETC=Z>HLA^A*U`5(x z*^FyPU*yJ}$|k3U7s(f`=}|PeGhd2%VY#f5z-IH5KcB|ERYWGEoSUXRw4YUTP>_tP z2$F*A2ormYMv)}-Mx|}z9Yy4@iq6&A81FYl#4hBLMCE_yzAe^^LhW?6tIunvw~NSk zP~3CENRRS%P_f*aShA!@>C$>2n282mZ_?SdOJWHva5>%dfJGqjl5k({*5#WiHB@Ni zgi8}}lk-VmSVGQIgiq_HKASBf*J)3E!lMaFHEaQ##zn>AY@aJz5CNoe(cOg+nst7n z*}`_LvFFOgzK`5?cK8;w@P)xGujLj@N`$@Qb1=S)ivhnf-|`;s3?1iPSKUAWMg74~ zj&FSBJ#*BHe`nu19B*Rp4mWSAP?x*2Z}xDe(CZhTl|MDtS#9be`k7z#>uH4a4s*cR$HYOKc+rI@% zWJJ`{&(KY}@qt4rn`ch#{8x*RNYOVIX=$B$X(~hh!909@__vQAYY~-y{IX-=n(bYu zQV(%ei=GHClkvZz`<^^3-~EXyr#i`DCqj*%eDgyhuXJom9BTZQm~_SaF;8nPG$(uk zKIb~ne1`w|>BMzw6N4@xn$`wi(>T;1WCLh3y)ub`%L@7^%(9no9*9*bXI&?KD&?8( zgrwp)>E6&LmI*jAu2g(d8+4t9--I?X);|(?{4(F|O-%7O2npwn%%yNiJ_@I4!b_UYQYcGD!4750Pi!A;EdhtNC+9$a(H;6f( z|2_^sf5Ww}a#nMNk6<-evTvyx7HIF>NZ*_2m7hx8D)y7;29i3&AblDK{( wxELesU2B7L*hW@dUT6;6vC?0sjPxE04aVGV&NmIWWd3d3TZ#PB?Zs>U2mMV66951J literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ag.gif b/upload/images/smiles/ag.gif new file mode 100644 index 0000000000000000000000000000000000000000..08fd2f99141100b4c165fff461790f89b5e72ce1 GIT binary patch literal 1339 zcmZ?wbhEHb6k!ly_-@YNU?TAUnZl)a|AFA$r%%6b$^3t$P?>78aAxhosg;?b3b~;i z&-RJ@x+gQSHTBuEN7oke+`D({(z#>jW^&9e<+yg~)T=`xy_p=T0WwP)dET9qxOMH) zrA;E=uE}ic<%#tWIkr@!GSenEfMe;*##`$I*7XV;n#hspBXRB8xmU+TmUaq!Iww(@ zYEc+#@a~e#qiq7~YFTF13hbN6F*BECS0_iN2S;h53BxED4FTGOfZ~5{Ki808XU70n zBRvCVMxZT|j@KF$92wcy&=NZd~CMTvwb_)}YQ)Uj#OVs!{ zLMAL)b$54=x`sf2q>-H5|Nu zY=*tO*ut-D7kKI%#n~7d4_#_Bw5`~tBg(|XW5=1dp|FwV9;bNJ0*fCCjT~HR3Jwb# z7alv_xlCKZ;={wkj4Xl+v&|(0K%v2k78>87p>eR8Ls-bcQ0Yjgu%cUt!h{cuO{`iL z85bCo4l}Xv^W`N79(HYH*imocYS{ivzbVv&%j6S|Y|n5lD*u-+Dj!Viv2f+9W+4Gzst Qyc4)!p&`u8#=>9?0LPaPc>n+a literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ah.gif b/upload/images/smiles/ah.gif new file mode 100644 index 0000000000000000000000000000000000000000..caf8d5b38def49d5b9eeecbe837e46643fde56f4 GIT binary patch literal 6786 zcmeHLe^3)=-hX!UYZDS!LV$pQZXjwziUFZbmEsZt1Vo!Cw9tx^C|J@H8!D(+ZFd9V zmr_Bchpp5EL?d=Mpm&b7trr3!Ql&sGMaQGTderlJzLa_#rC#?U6E&JXy3e*i!^Kcg5PiQ)n@TP>n4qxv+Ax{6I*7Tp{lr%q)S zW=C5N?4$;ixoOCRC6sE;9v!`EsVThKE1bH_9q8>E9=<$!N-#AnD$qp^4)jnbbh;Gb z<;w$^xUkx!qbwN{gCgp5233$jb)`_*>cPR@LOo7(sirFNOqGD@RgL!wDSH}qAeZV% zDahpBunVYW-9(}MMwf8hB(XONsMB)lw3=$hPgHU#OZGsUfGW>yB)L>|Hr1r3?2#0i zF-YB>^AZpX0Q`yS#>`>~2dfXzUdZVcf{DxXe zTxdTdRvr2S2 zT5_{M(pYDjvP2FPa3`|m)QOC7i-^ilHdmt6d0f33p$_Cxk6@0{Z`#3OsaGJ!V7hq zva+{@y;iUQh<~6nvVawYy0&p$Hh}yDG;EQo#oS)R@~U-gHquJHUW%09IWm~W%HNh! zD?3|CV|q&6zpWZM=SvsLFeH2gwr~TKFUqvEc9I6Y7Kpb)^cDxV zT~*Y1c=4V$v|J+qNdMgiUhLOD_@(!~gbS(-22#RJ{vhzeWx?mhB4&=Q z&JEl2)safBNTTks4jfMQJe;dEKe-2$Z%!UO7q!>=5p!x0U zg&P|%fE!>sagzXzg@YTk1P$i#*KAXZ%Cbc{p*?HN)cItG2^Q-c0)RLwCFOW;x#!1zhLe7NA*xo017& zWU~1psoD}(%E8P=l%PK>}udx|2RkA+8d?5zvse3_oq ze^yuN_vTpi`CwKuwkYf3#XjSoEehESH&edr7}epAn~@B7iV(cT0ntO5K5MpN$|4ij z6WOLxgZ5I`fDGkSHvmS&Q)TKtb5@ck3d27?FFFILP8u+x6cuxD@9H3BDL;5+%E|EA zK|gdt{;l2F92fA;+j-}DzH;|^B3>bDx?3zArKpBoE3FRdEQf*i;-oB?*n=(O%q#*0CRyetsBtYAQ*CIACoekjJY#4F^B zchf(3n#>1J#RT5*p>QY4yfN1QP-`_oKhQ)D2UFZsp=Se@?Q8McJRjY3m;xT`D zBAWh&KhpB76EpGm-6X%;%`YnI_u9O53XJ^v=}$^~lqMqYOu*{NcBWT=r_%O1BYG$u z_LsE~oRCl(5l4RVkG1O;nTCXA;x`27G|YjnDbK*{^NYj$K@M>+H0?djqF!NWPajmzpgo0( zL{>46M(^Bg&6?ZZFsZY49|U(9&8<&sB)4CRTX(#&cKa=E=|dow7+5%|2XC(pa1Eb`9M)w3nSL`04vLxQ|Ak(P2#KA=! z0HFiT4BYH#K5_j)=p=4{BtJ$qf|C!bTIG-=LhE_ra8EP^5XnQ3mlJI$i>rqW~gO_ThE zr|E0^r<0_fZH!~F4m@yS$fCq7HFCaY>FV1pI(r_r8f z^J9jzroj8B_G_tt$f*KfJg5RowV}k%sQ~S+3iPZ^+mUup1$Mbq;Fo5mb<@mL2wkTf z;<3*G!-LN0oL?p0Ba)IIS7}zqx%teWhX@XB9WQ)ZBi63TJ1cmjrCpgwF9dOr3>_1O zuybawkbC_8@*Rt6biepuBQ2S1g&_R6^rzGrBy)tZOpI|s_C20+&tH#SZX=5LIaS{RCCsP@$BHGMg7{SEg-J^iY`jN2eLxu3YKs9`V4vfZg_Vo6*{ZTaQfYI*Px>g$x^B#pH&X zjT|>wUtiqk;iLUUv?yexn78^KUUy0kn5RU=Tht(aG zVELA|$oP2225^WunC@brb{cg3<=gFXj-w>_6HSew4;}xt>JF8N_9r7gN|oh^^ag3`&SE?KZhyWj~8XJFuqj18xl*(&C*pT{H>WdpL}YK zBek$)-ukjd*!{EGpah^jr?UJm%wx3+)pQj$f&G=5(Z+tdm<&Y+?c}VJ^ zZ4>2>qx`;yDSzjpM!7myWVHsdu6}5}S`u-G@@G=*j2rcuja$En8)YFpEFZu=zBhIl z%9@Nc28#)#OVV->e<$>)Gu6V!fW3mZ6o=?@`SdUXrH5W>%@*@!+~}sGc9SD#4@A;e z5mlOeyvU9QF5t)Ek4v?wk4d!y^$`v;-Cwd4RO942E+S5%$5*#~ffF9NCvC^Zu?y96 zo}r&_$(sM^Di~^+lfHg#{2>->kNdLrJC?_1m*_35hnzo+t?qk{h!xB382|SExZ8hA z#2K?hQk7U4HQH~o(q~M5ge%1|omQ0Z{F$i|l{F8Td{3d=+_BzX{7j5URyKyFm2#gu zjoAn&wv6qIWM7x{8KF6dyR)SE9vJ6_=L=i#mZXEVG$RvP0-#-P1u+t<18*lGP?o^+ zH@Zx|gu4oO6JP#rElWz6m3A13JypV3=rd5oaE4dSoSG-;iLY}}CuuPIA>L1lZ7$Ma zJW3jF(>D3$ibhdY8}RgSnhVTPt?)#hsn?$F}UOXunZHJ>`Gfm?-`dAqBS z`c^aJ4zp4CH`AQ5#uqnqW^TQNCT*|R-CS> z_`7S>>&}$=di#f-G=MvO-y%WsZUY>gx>q2J?p8qa{Q2{J zQo%^-F)W+Qlnvp~VR7_shq@0VJ_WpWujNZB1kQ#)(skwBch&VPtPe4BurcOtL*Qy0 z?W%3n9<)=U2vS>5J6 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ai.gif b/upload/images/smiles/ai.gif new file mode 100644 index 0000000000000000000000000000000000000000..d47a4c361083dc6f9d65e1b968efe51e04c559b8 GIT binary patch literal 3478 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 IQSkDA0o67fh5!Hn literal 0 HcmV?d00001 diff --git a/upload/images/smiles/al.gif b/upload/images/smiles/al.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ed13acb15fe70650dedb66847305c6e6cd3116d GIT binary patch literal 3730 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 WIS-ds*DwTK>ng394!M`qv*y3O?|{kx literal 0 HcmV?d00001 diff --git a/upload/images/smiles/am.gif b/upload/images/smiles/am.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddd745af7f09d04841cd3b5ae004b3e6ce91a7bc GIT binary patch literal 16001 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 D)l?r( literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ao.gif b/upload/images/smiles/ao.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c0e3e145a0f1edff32f5cca688379c9c79e2a81 GIT binary patch literal 2571 zcmd^=eM}Q)9LJyM?&w`#fa{A|u+xK~pdwbom`=B~3i$XsoGj5~E_7Qr8ebM2Oj+Vq z?yj#;N`V$Cs4dcnZXwJeCT26GD09ogluhR9!ju`NE+LF8Ted%BcVGg#{pEjV?H~Q; ze!u7U``qXGcKwFJm8(oTpaUaHFfqaya_PV0x()y)hM5TfM$T*g9@34DkB|0i$NRN^ z4C*S(Yr?_9dtagM^=U1yFcT9KVSmNFm}a2AZ!k>t2dR;f;qd|O&`^B1n>H8e1_!E^2f@=d+n(5ly^X)8V0mhv`VLGUB4chbiBFMaN;H|Fq_ekB%I* zowg}PE@(!-(t7q%<)&QlgnZH_z zLT1Z5?^(>udb8;OlbfR#9!SeKziWAWAM<(zW3(JJ?PIb`;*X)iwC_#xp_~Kdi$L06 z1PlNKvPBT$%Le3qD`Gj`W_LJU?y71}jknfUSMQ^kwF{RlS-4t9`Q{`htyv_M8kQy{ z&hai-{M<7bNn&!TL9j=MBT^JCwB z2Y*h^Nz%AgtFVFIi`T|rYNpDqSV@i!{&pKmvb9<4nBk`vb`N&$w1!H1`S(WCH>zt5 zoGtOsm-FkhJW-aMS3+&hFd-Jdl_87fwQ`^DOLCSNQm)2{^r?tm#SxstPy{y0h7;rHH)5vwL*lI2xLGCQ1P^shuQ0^+9jd%N%{s7OFB8ow1KPs%fJSIps^_^4080?@le=-Cj{FP@TN8nm-tUc z(i`!v*6x|zB!C2Jpb{n<7rL?2`f^@0Q{YyCYqRymSfonHV^{^=Ij=B1fp|UPBIeSN_1ar%tstadW4p=dTbe?vs z=++nZ*Rpme=?%rWTRHpnufcL>#+Q=xt)1;fm4#$V%NphI6)Tjg6sfuIYba5&DX64? zK{bito`3<(#4wYB_Yn%*0}5T!6h7(d0o@`6N}%v*tY?aX0HHtDEkY0&bU|=CMqbKR z2na@dMn~=l2Of?+olAqYK{J8IOa|K%y2$8y8XfSX{BvQnYp95-Ee}d-r|*@ zf@m1xstj#z>F-k)b!z?py#-U(blQSnp8yMJT*l9^K(WE@OP^JO#-dh-?8Uq>74a@m z;;BW|o%9b+{x0=}WKN*~W;s;L(^eS`kD%$JuPq!Mb@N zuxe{~64dzu^+%eUJuR%0&)1SfppjpymSPy$OfQop7ql?z3v*JB&rzixpNikh4<~1) z7+4(Sk)3r3e|@}*m9wCMYXA;0u&RUpTD}RLU}ps9@qsrHGYvIhO}gmqnkhhwL4#Zci^kyMlf8pL_04 z=l_{!p7-bVeShEY&zh9vm{`3Z@B`nX;ORKcMiV(&#Z*7_cv$iD>C?wf+S*WBoU>}Y zlf2(UO%Ev^k0{2+oeu^T&JNeo@ldF)6FF+HppZo;Rgr>lxL z<-g73Z^D{*e6XEtEW#WXJZ~K~JUlcs)ZgA**HMEHw-B8*xW$;$)WCPvU_(uKv$blt zgX(B+>~AKmrI@7b?3Ja|x*gS3<)_wSE4loEwoRsD@vo)&9rH1hc|?H0n(L|(4K znyQHL9;(@h=WS9>4=OrZ8itzjs?tqE?NnV=9-ptODSf-Mk?L!}YVxrW2Q}D1^|eq= z=SXQzge9N2-%nMQzU^ov+nX)p_s5-`WOFHQ;q_H{bY~smuu>gHe58}K6e)Y^aAT3S zu9&RKBU+5a@MY?91J%Ogb){585!v5FSb4>GA7v>bn=N!*vBK$~_&k**pX#xaRwF&q zN!67yHF?BvC)IAm8(eP{E5NJg|4D(sryg%6ZG0;+UYisZsS-i1&jvnGs&n?{ZQn&_ z71Qx~`}MnMX8->Ek?-%`xjSq3`;q(iY>(Vi6bb?#A?Pts3nJXV;yz9QdjdkF3QenE zFT;GpGMG@%Rpx~zm*fsuuT+r|@$LFT8j-%KJs!gwDiMtIS4^lvlFQ`@y6D&e&MNjv zRqV`eEo9-KplIe42$JytmC>70vqWA5No3xJ{%~fn#=q{dBFgEA_gK1$Vylw^s*VW$bZE@EpB&I5hdo8} ziS$mLo%8gKDw(J@Gan$bAeV*nd968iTX&|m0)Ndf zO7n;C_ol8SN~j0*yATgkntKfq{gTzZVQ+(pw$dj-PM4v}9V0rZm>e*F%> z#T)B+mV-NX|GwwfHZ=#rGOu3te0v&_Kv-6U`LX=$Ce-&Jjiu!P2!CsS{Se17%6c|O0~uzQQ=%n!rDULGGaVVN19+%>SYh$R0)%$YDxB$P8H z*Z}t{fD?2ZB*A3x(r>r~n!5?WFU3M^b~lYd5`9$E=*$V?me!p{Ppw{m=UAd1SvDVG*h_nIT73_G+_=@ zElz(3wQvihnv%|S(P(8Ge8_QI#kPM1`7h4?PFHsx5HWJbq|&hnD&3IH27$btf_~4c zGuknG`8>r35pBz~w!Khvwql~!9N#Bd$VhvpBU2m@vUnXG)9RxitB{JG5j#T_ zpk%JYBKI%g1l^>=i$P$GC(!Kx#}kt?nA|a=q*>jy5EJM%5)agy3?w?10N5v>7fT}` zLcFUhiqh)E1|EjPb@cM{8#~t_8d(HzahB$h-WV1eS!qiY1)JJvmj6L#ENcigVT*Y(}EI*eNyxuSmxA@24GQofi5Ivb zF8Rn=@)gYB7PhW;Qs^qf(OI|=ZF6vwzlkk9?#PX?QYy?LNz+6?>^>tGvi?(vi;hjL<#+&p(`EoI@BXp zfrmGr;r8GE_2sn-!HmWnB$7j#5WAT0e>h7bwwP2FJS5iMDeCDe#z792o8KPZ&8A7z4p;Z zqU-RAQ={~>1Eb)~BilaHCscTE4!PHTMbw)HDGZp)(5Eq81; zlWkz|)Y`qJ;Pj1!ZB-@P8<%kE>_vO8=b9I$aH4a+g>YtT;976>-_t8JsV9;yee*lt zl8Nv3estX?UU^P*F>_c_zoua1D=kxdiSyfa_aQQWC!3x2?&f-(ao2Lw-)ZN-2D>iF zS@u8YlJt+niMGI5u}3<`&II8lJ5&A0&ggq?J5v!M)ja4A4311cFlGly)u2~a>A$Nxvi54YvNC8F3bKm1qN*S--$0^(SZ1{cI)Eb$%>UFA^^>SJAk zHxk$!9bl_}IN^4&+aI#v-gSfJ^k~5hYzq9Ar;hzv>bE+(?(WUyXhiz7bt>8 zJ!_e-F3`Vmfub{oN$Oe;c+9K^7+1x|305A@VC8$ zrnxWvS+zcOONy&@p`sOckx|`g4)P(DDn?+Ep_Qn6sK z`ilj#Leh^qU#^Nvsul-o3JlI}DY;6?+L*I*+6&{3=6sTPzC=j}C6pz|=o79?Er7I> z$`zv^-acx4OLhg+-?vO-&I_W5bPHg=6c}Q}1J}`Rb#))L9JDRKG5tahE?^||* zXS)SK0O-MQ!!i{YVP8muYECPe&* z%l@(2`{yCyhb$bzpVv#3uJU(o$CY5+PO6pT{)~Evch;N75;vz@{+Z~Cg^e$VL_u-S zo6Y*R^A!=-UfLGXy@!O9g;5jcc=3i3R*Eb$e>1R?XUa~}3=IIv~ am2IBllRr1qps6vOtz3#oIJGOSul!&7MZGBi literal 0 HcmV?d00001 diff --git a/upload/images/smiles/aq.gif b/upload/images/smiles/aq.gif new file mode 100644 index 0000000000000000000000000000000000000000..93109f2fdc69df08bff82d88d42fe9a82ce044c1 GIT binary patch literal 24889 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

  • 1R6xi zQ;`e>RbG^MAOkRw5i5_gaLj!)-E;7`_R+2JB(WSs;ynT={fxW-AoXXmK-$i#HdFZ2 z3p8zKv%UgrV<>TC6q!4tH!_eXp$C|Ma1@j5Hjtp_U`jqX7aY?{`ZhOP-vsT;1)9Y4 z@@-98=|?p5_aQ&Zh(<8$j~(;nKV202GY<@u4wE@BMo*vS2WcYsr&}{pZ-QG|X#MH+ zt5M}9Db)M=e3$E}bmLRBt4wX&zX8vrbJ#y{b$gdx*E8Az7bcgw} zryyrqwCSDO{m*ZVIn}wi>8;<>NBQ%nm=0tT{Br;aNA|bmP=G|1G$1J}DovfoBfY7wM@R!IjMK(S<{%Eojwy!ym!2vHQ`f|__)>UT9B|iBGVIP!b7wSln-C1 zZgIh(A>jEDp)HLX7>bEcJQFQC3q?!AGr|O^_^7m0UYJ~xnmT|_NnlY%HiQiHIL}n1 zFytb@XBL9?IPz>OBoM~jy{oo9g8EU%y*)-qqAYcy0$)Y zGq;mDv|j?{L$(T#rql-^GxFBY?E?}h*1^KWwHVx@>)@T~@a(jfXpqzArE8WBxEHmW z6j-=}Pq6|0t*06Ew*}uOIhJ#HTz#6lzcFN>zg@c>IAgmSoh&!&2oxPFBZJwASe-z% zAhYGgwVXik46z~Z^<7;LR#d3k_T9Aa^?F-I91>*u!&IAc`TkLoU1dYTxAkOBt;oR_ zM;{Ezkv4tl_xvHj%IOQr6|9TpTRUZbntO~{;uOI?DXC|Y`f_D>$r)> z4(_j>zc4fD4AL;1_bADhKtPg@|A;BL+5sPo=-6z$qpcVwDi52wr%6*z0EcFr>B zzJ(r;4R2Q88a}(b%V!p6pf z2|*31`GtkKAjh~|E-WZ7ha)eQovW&?D;L)UR1MMT+Qt}G`R9SA>KYo)r;ZSNrj8FF zolgb%e4wa)`0W=&+m+7A`58S{`i1o3_EN=H=&{nH&DV283r`Vst=~QcJbE3EW(o+M z{bGc+CS_o7lsXv)vFmC$p|%qi_?$QAWg?i6MM1!Py5Kt(1FL?}@K&nZ8(psAPgoLR zv55hgUCbK(+Ur7u$4_-Vss@WA4_Si`dXs{VGfToV4k^IK0GLm!LM^YY=hjM5W@j(k z(g@OV6%;~_M^2X>W4iR_viXMLU!gN4%(sW?)>hk;mHaWBFWd0i{esb<((`2ZJsN|C zf{N`TV{?oxV(;bt;$ZlXj>6Y{Q~t0J`ls+2ik6NBDT;j5@C~M(EC`M)%~i)JR^Y36 zY3b1Ua%Fw3LekLO%*v9+4Ewz6uV$ai8!_}KZ(q7A975{N08+JWk~w0KC?-v+;UeHr zQ?3(>CQ6g6nQ{t7fX0R$$h#}W+VtzDiF?c)!1||e_G7sUWenyqu7@lzXj+)hSqkUE zQr!?+BX)70Gv0Qclh0Z-pRbh&Mtx3FO|F_cP+?By;?xUOtKM05X@I%YzrXC+njMl` zRVKg#$@R>0QRnmR?Y4(Nuwpujm}h?L5MqQwT4#3jz?$yrS*X4(c_A47&ARSyS0-(L z|2j;=M};mD6i|DPqGH{fQNgc)?&UIv!-k{G_)S`|deerv_yd(yxXk<;x3=$wV)+IY zw0{XBH2yn19FEM(3Wo{<(qd4o7aMss^#P5l_6}Av)GAU9 zm6VEKSI{;BtCm_cG-Y77`Vr_dXlTk$#vn9>@ZuqQvI&FG6r&>wsX8=;qL5GGf`sXT zjJIO}AdD211j4ZE^?)v;oT)ApNee)2%%xETuVK_@4x7k&Lc!Mbxr zHg|(dI4qQsH}b$rqhKj{ompn+)<@~ItIO`I+vDT7i$M0J``x`z z1Bm7z%!sd#o&s_Tf!lk8b5&6MZ7#F-jt)l}J<6J|+P0H?|L4!Q(5C7=(8B)(J5pCR literal 0 HcmV?d00001 diff --git a/upload/images/smiles/ar.gif b/upload/images/smiles/ar.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7bd8e03aea6af4f018560e93d51f6182e45febd GIT binary patch literal 7840 zcmeI0`&Scp8i&6#nM@|h1OkZ|Flx9+qasbH)ks+zE?PvE4MGjw7EgjuWz`DS9_`k; zxsZ?`SAlXVxD%8k)-DCw%2gU73dqICdRPms3)CXgYSFf~)zm6esIk~arT_+TYI*2En>#h$QmZ}#yf&T%me6N&t;)Uj{(^Wwv~ z$;nAKZ{LZG4A06kCP!jQpZB{` z%^n*Yz0(Iub|I!L(cnOTlM(at^BZj9SuBi+ zlOpl**Rb0I{9U_}BO@dGO0d`CvAR6=z(Aj+l3S9BwB})zYP|YQBvmQO+Jz;_@YZr} z$?I%OC2z2mPZIcFJ)S=^qt?a7ga*sj1^A075cwXS_kF^WUQOQiiXh>2L2&Xu7utNSQk~U zm0?r{ciGP36vW`Xq*M{c79TSr^rsUI25{!Dh0cCn#pBktFvM+fWVag^dq5Zl2;c$k zEMYASYxHRuhYW`F%-kucg>YeEex7^=D?E!ea|WxE6Ut)PxW1b;ocV zi$#a$ukaogc(v_y`|jHX8(dY8dhzm!<<{Z2u7h+B#pT?9_6X`=gs&)fhoyr}3-C!a zw-u}Mo}rRFwF-3e(nZANaJxo>qImL$HNh~)S-42W-b-9jahCBE4TN;LcK#~YBW0p{ zhuAD(bVMv6HCgoZ=TzUz>aH^~F)#hfJb_7%ySOO0Zr`ZaA)JMQ#Rl^z<*0NnNy>kk zWGA4b50OL=@Cj;9l7#ye!kPnfXtE(yyU%1f9U(!3!sTX2s;1C|M9O3vIDju~%Ky&k zO1t*D=rlN$@Z_E4RwBMGkv_gF+&!TZ-t}amdaDRZG*H}m0mCZJ$8|41xtHH# zUUrtkT~rn)vr1L!7aNeBx#o6C22Fr0G_M{`W1u{L-tX^)Sn@gI#6P)IKuaQw4DLXb z1a411{9C!*KvHUmIRnX~!gC=)Bt*B_aZF2tbq1q8BU29NWM`*mW#r`N7m!m~R$f+` z_3)}2ADPM8IWyU7Ka<_PB(@Qx)i#sz>2>e#h#lpXu=>#EkUTEjX8b~XkNC_4C46enfPbjOZQCeICYYSu=m*DnXUssMGn8>OG`K0mF^8IE+&(%jTM3$lD11wVFwc>?v1E&kiodS7EmhC6CJ0nN7FDssJ@ z7K9XRuT5x$?*#1scnvotr&{T*dyW#?o( zzgZp=o2wyzG$jb0JN0*wS0HXhRr*r-$y`%q1%_0gEPek(Lt`4y(TiZv2Iz3rSxv_| zxT~qR?}AZ1cL^L$b~xGLb0H&jEImg6R@bL=HvFdll)u8U=@ltu|siKzC#;IHRSOwA2+pS6x@-`Ukv`gFYkoXI5V>a6qUPFg&a(;s6FY7s(w$)5|mCB!d<64dhP`T(@ zp48bCa+677__hg52I`fzxiPq%F)12;Qh zSkbc(l*4{4REA^a z{It%176_LtlMyoInKW~b{^5qqSDT*e1&v3IiCkU~$V#Bj1xi%RS+J#7u115%q`pF)2W zq$qiujM@QDoWJiileLS>Y*pIZ)nli;sMtGB|c!&mn;Zh)!Lb^0( zbo^B;ns{oXlb>&5y^EkBUkLFel1-m|1ha}Oks<=pvsQ$*#15}Wf+?-OnRu!|8;bJZ zx=5LfQR(Ify1r~E9EBLpQGUYh3Uj|VbAgZOmTDBjf@$BdBqj}{X9hC-#I|Pg!}dp_ zc7a{g)*gP$S@&-j7e%X!=Jpn(SsI$AdW)Kw7N}X=1>5x&&748lzPM-t;-MQuvmnXl zqOqyyK8(LqC4G;R4LSGCOR>JEe3mROxMVMRBt$=5TvW8eKL*_4gijY2wL64U5UCe* z-&cVbt2atmLWRilWpcT>6dl$4B?ks#PVM`q8q&x0$4|HF-_y{GYQZ_;cuPxr<41iLtT_%L VJA~{IvO~y^X_6g6wiog<{{UW0^ltzF literal 0 HcmV?d00001 diff --git a/upload/images/smiles/as.gif b/upload/images/smiles/as.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4a46bd853287587907c9344c6ed17670d0aa945 GIT binary patch literal 3519 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/at.gif b/upload/images/smiles/at.gif new file mode 100644 index 0000000000000000000000000000000000000000..ebb95fc459d1569517e15c3ac94584b2f2b5391e GIT binary patch literal 10653 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/au.gif b/upload/images/smiles/au.gif new file mode 100644 index 0000000000000000000000000000000000000000..869fc834dd91e54ba04328635faabe117cb5314d GIT binary patch literal 13693 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/av.gif b/upload/images/smiles/av.gif new file mode 100644 index 0000000000000000000000000000000000000000..38a9afd8cc626565e333fbf879b6ffa6365f3c61 GIT binary patch literal 7883 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/aw.gif b/upload/images/smiles/aw.gif new file mode 100644 index 0000000000000000000000000000000000000000..c86e2aaa6a2eb6636bdc3f14a4554b5678a319de GIT binary patch literal 9079 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/az.gif b/upload/images/smiles/az.gif new file mode 100644 index 0000000000000000000000000000000000000000..311829e155b337a6e17080b4f6be6c01d44b3380 GIT binary patch literal 24043 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 z

    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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bc.gif b/upload/images/smiles/bc.gif new file mode 100644 index 0000000000000000000000000000000000000000..083af3f681011289f56bee14da7917a4fb767326 GIT binary patch literal 12550 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 J123Vs{tvhJ#uWen literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bd.gif b/upload/images/smiles/bd.gif new file mode 100644 index 0000000000000000000000000000000000000000..381f5cde08c832a6b109d91482c9d2355265f5a8 GIT binary patch literal 7949 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/be.gif b/upload/images/smiles/be.gif new file mode 100644 index 0000000000000000000000000000000000000000..4835b1598420a3e50303db44056fb44c1c59db2f GIT binary patch literal 981 zcmdUs-%C?r7{}jt=f~dMQP1?4i-w+sfsw3H7V8%sOKm}fkY1JGq#?spRL1Z^aA)W2 zY&)IVMj>7d+=UlOP4YraNMgkZFLtqV&@PsaSYV(sD98)#I0(Jz59oPsKYZWk`F?KS zX}4asGr#}}5OB@(zB&bVH*4G~7KR7?dMrXhw)d&m`Se|3i(Wo%H^{8 zMS3e`*i0JIspM|X7#8iZ=VPg9lv|*uhw;q>w380bLRY&sXGqb`)mq_VS= z^DY|bLN0srih{OQ4axvYFEE9qAwG^5R+!nSn2Mr>FdcBLt_#%!F9 zEA*^~ayhIkVKgUFsX1mjfU=7W_|M0*ue;aQdH+^RN85R`1%v82roDz%$EdS!knJ5~ zTbyqDAlvA6yUqPWkB54P`pxc<1r)(CGfI8wW3RuE<630lk$1rRn%k@%g7`=Y)!Rk-gj5g8s3F1a8 zYu$MfdC;QqsO|l21pzG})CaWs2>>tvc@YMJ0m-M~J%<#jQpZYEwMs!w^zl&e$xoC3 zA3DkrDyJ)PwG#k(0mchJf{sFG_w@vNEY~9&q&!%cKmv literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bf.gif b/upload/images/smiles/bf.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7faaf72728b72ba9fd03b8cfad1a42d79b84ac6 GIT binary patch literal 4976 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 Kl^ELNy#EDX6mJ~> literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bg.gif b/upload/images/smiles/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..59153be71f521595d56261e004a5ed3c55b6282f GIT binary patch literal 6510 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 B*N^}J literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bh.gif b/upload/images/smiles/bh.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d679573a2d1b31e1c02e36a7e86e2386d591038 GIT binary patch literal 16159 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bi.gif b/upload/images/smiles/bi.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b887f00cc6de82b904ee6385bbd013fdbf3fb30 GIT binary patch literal 5460 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%0A^eNFO@ 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bk.gif b/upload/images/smiles/bk.gif new file mode 100644 index 0000000000000000000000000000000000000000..16fbe8e1e6de5e49c6d6d44b6b882eb8af3d2117 GIT binary patch literal 2824 zcmd6pdsLI>9mjuf-Xy$02mu2G3^Wl`U`S)Z4wbravzET|fL%AYsRw8|mE%;jMexEo z;Y~vBHy{!eBvEp_tRi!AncF-Blqgh+fUL%q0qu~XGGx|S>nVGZsOWa~&;DB8zn@D! z&*%Gnp10pwpRzhX1|ndR2I6GS{G?!he*TGz|HQ?bpAgLT^K5nHk4E@UM)~^-QztKR zXZm^5J-o?_+`=6GL>p(s#+sRXG&0yb-Nl`poERN-jh^Ss%*_?OFX*o$2K#$z*{gRGoE~l5|C+l_+XXGsSKmG~l{WoU)3`G8#ftgSaOl*&Z>^$4=0*J-(?+=uHGqG85GIdxT(FfyMO!er{;m; zz(vf^_*kA8^58cG+{DbO;^sw3Vg3=Kybfz7Jtpvi{D3Lb*N<4v=8HQ7>C&JjukTyA z{~O_DBN4RklgGw)&slSQxDv39b;fra5o9+yt{WW-{L#lm==ca7hLJK#DN`$?8Vw0X zDP=P04LUtl;TiDZs{>-t008#@#6hi9X=O4!M$)9zVc$xPwq7nZnY;si{a!t!9shnv zMpIRFjrnk`rS6CY&Dd~Mie@}vx1F#yoV1-)G?6Vftl?NI_FL@Y@0>x6{p(^CGw*CO7*bQA88>+S}?Go;UTvZ za^wUy*5jN37Du>3?zhhO-q=L7FO$8J%RMk4XuKr7_jL8xgSVEL! zuO5v3BDx&ZEg5CSfD;iQPW|N5NDPRsqSVbGmihzH@m<;VXuyZ{50YBMnZ1y(wEWM$ zof)6)V=&9CIZNy}43vJ`rZfjoSWb{YBpy$fv1`lTEQtB+3dLlxczFYPX)0nvRBH8w zsjT3o%VPy8#V}400qd22u#`+^D1|{w?oG`KM-tMGvSR^DcU0tRXx=<|ET;ndlnwr=qNF>6NVkZe zS~uPLJIC8VB5NFt&Wzon97uE7eyuw2yUhcV3JhmOB*X?`*Q6iVw#DR9Gz#~L<|HZy z@?=;2e@3k@CsxL!%OWG!wREkW8pId^acs)$-*N>Dtr7riV1W<979#-?H8@c6N)l)) zsa8SLsj4Vrm6@j0Xe|nr!gkbKN1py-1M#fCR-jg4C6V!OQL1Mht|Ea%?Oja)R&OS8 zLrwjO!$g3psop}qRA>t`EPb`mlq9WEVIncL+@cksMr)8uWyh`FMu~Da+QM0H{BMm` zi>cWr?1+L{Z^WQchO?@U*^eD#5D<3e2(+R}{A=$V` z3ph70s3?g)ZKt<%X7n9`?CqQLlf)a}iLa(v^S~iFNpN`9VqyA^?eXDp45Q=KByR4o zKb#PzCA?l0n}(q^iLlJ=qV%ujzsy!Gcy-}G)_-{A;pdB*EEv`P^OpgMO21O7P$?A# ztxf|b-9j8yFPE77)wh7ugRcgw@jeAegwKJZdSeLhKmbuFyM}6NhCB}el*!9~8N2Du zB*J%haCpcQ$-sbblofcGxDk&EjN;~oS#22#e6*;{Dqv8wz}G@~rQ=EpUH|kxo>kJy zShD8A7j2z*vSOLRJdnr6A%x2k@I(V3_YYbFE#U&Gh7rKyi8`$gDmciPDiDcO!CVeM oMN*t5V@79oh9A!!d)`(R3DFR=E6`I{SVvh{T=v5aIRaSwFDFZoR{#J2 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bl.gif b/upload/images/smiles/bl.gif new file mode 100644 index 0000000000000000000000000000000000000000..a55908452e884d59763167e797c6bad789106ff6 GIT binary patch literal 3591 zcmeH}drVVj7{lU5FnaPZsa0-aT%nFzg!W`BntD6_ZnwjY`-6{2g#$_>Cmi@tZ{`>Og zP$dHsfCmLnJyLnR;PIg3DSg~huTyNR+gqHQ_^@B%X(b*HNpdqJ zx4Oi`PI14D=WY=Udmj#ay`FP~$K&qryEHU3*yrrJ)lTGPN^Ld8R=vtuhv#SFbp_ba zX@R#-oVOD1?{}_GBl=Dgs+HmvGjFh2&`^jM=g9}{y!;H@uHg+1_6;=)3Ud>N`y`$& zvAs@1=3=Lq>tAp8-=hyzLx?fWyIoPhO2 zt<>sD^ai7eEG;WHS5%syrJ_n(v(H>rf1tJ$Ha3(Bh}1}#EOIU(u<3)DlKE5l@#(YP zWd@(rM#m)0K{y-)XRzOki9Q)3UW8zv7huSg&}rh3hM>jst~5g6Lb{eu2&xrH5;2J0 z8y>-V(`SlmnaPM7bv6EpOh`h(fE7E9*X-xBqamBmI_ePj{5L{)}ki9aU+Q>Vh7@ zv9#2TJ6aZNlCv=T;|Qo@GTxh;*3%BHjKL)RDOG1D%APKqygTh{#nKAFcL%>m3fv}? zrC6lyu36m^iLz2m30Ya0H!f;u!ZbO;M~)A;fDITlIgwfkbXtJvb)-QFmD&n(X_cv3 zGg_MSYH64ngF2vt2t-TCGSZ+!EtM7e5(Ds8b9~hT5CS0m02Zo-qxbC5`7WAbKG;EHUZ~+ESCrP+4v! zp|$Fz#OARI8($Sz=NGu+xxh+VU3?Fzlz-Txj&*4BFJqvmo zPKmzKY#H{inC|PWX5;|ptvT6>N^G!$h)#vcwTfwys{bkI7=M=cTcW&s+wr=C@gX;J?UAriVS^W@1v@mK7u6Vn_DHm~UR@C27`L4R^9+ zSGT8gHHq;i5RpAeR7&*gi0>u$L%PIlyN%AsR0t~SD?*2yn@RN PFbN7MYDN;BffxS;mdRS< literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bm.gif b/upload/images/smiles/bm.gif new file mode 100644 index 0000000000000000000000000000000000000000..0586ca939f3be21bc5dc98f67995e6009770719e GIT binary patch literal 6513 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 l;cdhk|J3qqhp{4= literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bo.gif b/upload/images/smiles/bo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef20b4087645f18d106027ccac7a89f850fb617f GIT binary patch literal 6267 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 Fe*$wvpPK*x literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bp.gif b/upload/images/smiles/bp.gif new file mode 100644 index 0000000000000000000000000000000000000000..b938e7e2e69cf775d3f4932763bd5821bcef4e6c GIT binary patch literal 7576 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bq.gif b/upload/images/smiles/bq.gif new file mode 100644 index 0000000000000000000000000000000000000000..40b9ce651d8479000134a049e27c6e1e8c57bead GIT binary patch literal 3939 zcmeH}eNsjPfFawV;*;L z`Q>--`8=QJ`#jqc;vyo`1A#Y~rGZQ_@6jw@v>tmzJ~Q~@6mL+C-kZP|78f7R@RfPH z?~dV%W8mQ=eenh_J5@N-k4;V8uypAAEp?A(_z!RKZnU7cEZE(@I4Z&>i`MEb2RY+pRrYQojIf{uJtpU2J53>ws97qys$K(*QAf0@#((5Vh| zOi%vGGZFlW7R;(g)!E!J6Sqr>8jf?7S^R$LFmA}>8S?STe*Eq=+|r@#?=oC#!O|0P zEs?1wGL`wM`g~k_T+pHA&scGNzA!71IW>sqr!ptH@P&I;Es;*-iM7YMdLrFg$GvF4 zmHFb?2^{=)kKZG9($-x&w?vD#hJ}REAo4c9e+XhTf0lLd2tOl_ADwj~{Rm%p;>3v% z$dLx?Vz{M9kD9<~LksK$(=4znQ%9$x?E{tdJ-wC@nB#NG=^eDQbFjCk z#kx0`SMBuM_nYvct`B?Hg?QoB6PFB3&)6wwhz2{ecWv?Pzi>wF8YD(qpzpd^?%uI~ z1!0ZiOL1=Xu?fTHOz+X1lZ^9z>0Cc#LzFmYe4SKETeeHs9Wggj3VTOxNaRlgI>*J| z=U6P~WB*!$KxjVO}6NZ8Xo~y&Tk*vu0 z2&30tM0%Ya`)YTZNGZ#y0-@$b16CCH>`CJQfM6%~ z^FI&j2@CG;koyFjjA*ouJ8~jkI?1n0*yT@m6$pjNO$wOR7xlFuVQ{laWGl^bsx(}H z0S7=QOXEhCM#7L6DqfSru#8bkNTg3H_~aOuI+i9clpqW_!(GN=xg#>$L6-38Qa|@p zsnw^-G}`hCoxbvPm7%((wywUxXliU~Zc#E?3(ZZ`J6jp&I@|mDFAThM@wENbTMycZH2x@Q*Nj=Dzs=lsMa%GIbJTiT~cmWEtdL#i(w?8o9Ua!3F3tJfscV9N; z(`Q#t*N{F5kn0cwhQ;RTG)V8~dEodYA%xjN1f^F+tV@$Q+P%WI#8O^~dOjbud*x^M zDl|3B?p01CfX=_k7cD+yZZvoSwXVeiwiMloSd$tfI;kAnAu94-uO8kvxzAKuRcZt5b`@R$& zD#AG2h@5Cb_RLo&(>Fet-U=0AE0PpxGtqu(JTjXunt3C>m=Wg)6@84Y-Q%+Vm*ao4 z_ztrfiHjL`wo^{2(FW&K@vL?P`hYrHn{4?=>nH|p_{dDlGr!8u7 z$gG)noDnhEiN{p)x^>yKtshcOKt~=s!8y!=LPNiK`J=VVw#EcS4ChIU*&e7cx!~}e zrx1qOoO3(M)7K3z5NbX}Xf9xVaob1!SM=`g z!x3UB{BAL_p}1QUE1gh_A_G*Xlc^>=l=PQf&?w9dd@26hyxjENM$c_aO=w2BOHF9W zLJ!?PG?unEDI@6SbYB4t^Y&0MGmP(tDSY;IogFBwv~^+1yGva-e>rrX@BH$Sc~LF| z)4e=?^&ll6ez4lIYO)w@9tu$FM|#92fZkhxloh<2sjSdQC25t>A@rX5mpks%ipTl6@QIQ=NDptOPDXJxU$R+Y_k~r3D90-IG+#fi&hWXvV5_9)}C&z-S@jC&S+iJFE`0H}tXZ8~TMG?+n&8lg%sE zsLq5+R}cG2`I2*# z8*Uqz2p57RWef(ndKnuT5JN()T>g@?rt=WYa+deYOe}lkBm1e0esXQVzZe&435}c= zDx#>oti+%r$3@c*;{A#2&;Ofgp(Nh`X(7m9&;VnGN!`#;4YJhx8;s@yrEk>N7@NS( bl7S}ss_|1?*>;BiQCuNE4e0;xfZp^^UR6%3 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/br.gif b/upload/images/smiles/br.gif new file mode 100644 index 0000000000000000000000000000000000000000..3618ebeb31d9054fa0feda94ee6b95275cbead43 GIT binary patch literal 4644 zcmeI#ZA=q)90&0KU9au6R5+y8L+d=SYQb77AsYfNS005krs_24rU3#|bSk(IAO=&e z4^Z0DhoQ6rORH(d%tT;_Qx^uvqb{gyL#zf7mg?Nb9C6N>MMjGcb8nYrzGz?Gi{9Pm zzWM#W|J1aUm^E3801iA1Kt^NJ9wKW!K0Q7C#4UW{=6O8h)8oX{AYPai?X;JA+W959 z@opDyauC1Yi{~nYPez50hJ}+;k0z(4?sxG$=lR1!mqth3!%p6K8#Xl9>pW62Xh%m| zuzg$5ye-5&1!~b`*$a@VA$-R={_yZ%-g>kok8CsY+>Ka$A?kJyjW%MgGTu-N-&u+l z?2t`f!rg6rSG~r#5B2ooEf#EYNa(Vc4W8udauJsfvuJYdrC4JrGFXpxx%llyG*5wc zS;rqHMF)3D4;Ds%us;wE7f?XreM9f(1nj3uidLyL+VTnw z&>7Tv+GMoqt1VU?u-E89=0}TRSiEL_NUfU1T^zqEFe+A>$Yp&(NjPuEAodF&AeAGj z#R)mW1`Ni)<#`bVPQ%nUTK?L%`UdQ`E(gfM`7m>W^POtp;xsmN^VZFv$gqVIzkRRf zrXbMImo7gA!rd92ojcbi@ZL`vyDr_F2!gQ;B3p`l1^>>H7dM%msfUAC&RleK_OLjp zys7z@6R9v9M-l_4%fNOO{-wDiP)X$k#iLo79d$}1hFzeb$1>tf{g`C8j8+khG>+?C zvg?O9Ac}0gCp#U?43>v0O1TNT`Z(H6-s6vAup1RPAkq9EFkY#L=s@vfSB7R*% z(~0(Sfs!-}e6qwy|J~*#kaAIq_1o*D5@M|qH88FYjWB`|mPuDDHjwZ(VKpIcYdoG;w}qLGv}n_i|0|;Ii^UP%^;5_=mRI` zZp7{!hhYxVm2Or#=yKkY^AYgT>`n&zO%#hMp1GHHF?MWCl*OUt&Jjp z*<+jGG%YVVrB0c=N4Jd0ORvs!kbD>E&!<11uX{e3{`vVI%+Fa>7GMJoV9ji$rAmql z4yNX!GzIA)HX^Dt=&MkxfjyT3wNNdf4Hk$h^UVwXtNSeeMN`mK>J7#!li6YhfU35t zW>){PI@_^o=f@U@(_yQv`_y){#`#%ObIa$gXWGtwaZWe;hra6JALag0?ynlYTI{bH c{wnOR!v8}RW{O{3ZL^19|55E<9M$6f0;6BtH2?qr literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bs.gif b/upload/images/smiles/bs.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc05134e3820c7d549755ebed468a909bea45ca1 GIT binary patch literal 2993 zcmeI!{Z~`>9S895_uf2Qk`OK-K)@)M2#P$WRJ)YYF5yAIFi&uGvNL-I6%eW@uvx}V zJtw&#gam?Mag?^40+ln01u31u#ulxSI-#0B|uk6`eArOH@9#~%_K7ab(p&Q;i&vEqZ+sodSo zrHlq$?pzEIQsu$dWqhlW>CB)9ho zb2CM4r?HM^%}l>=aa?4`XY@7T4Z3_=3s(A)wC6NqxI;K(!d9omMJlYJlsDXf4H~fK z(|C^w?`YAPim{;vtV_pRwu_fP7j+nLTbB_0Z~sEqx%*RJ{9&>}l^P!_MIrUHq2Gk1 zDLL^ z->8+Owo+H6uY}cAM$%NHGoC$DUk4j&n7+v|ad9zE`7R&YivKYd^H^DJB+wMCKE z#A!mkUf2?)69gt8kjEPt3l;7N6lj^x>=_6QEexudxK zg;MXt+r$7v+W?V-NFG5P;_&}*sVE(ngv)+q-Ipib*(qlS2w4O!7eW#W6B8Zk;>kEa zuV9%-YF20&;oGifn``Amq2vL^_IydM(`-X(BB})JqIP z+DA$GAiW`1A?hXF%A|d|2`l*hh7bkR)7JeZZ~{?2J%3-Jbo{^1=6WyRS^3KUdt7co zrPe>r{46&pKwP3xn=g=zOBK_lfQAv*aZ}~yKA~7DSK^ZGpVfs%G+HOS-7tPG7{~Ez zF^|IFncs%Vvc6vJ=W^MV;d0UZ0IfuzlSR0}f>JEht+4Mq6Xa&mK1R~ANkY5_pxfmA zkdHS_-XjLO1~ySz?2zG14IP?4JLcUa^S9h0H{ZVnmuZrx=eqw1YCo*cwZK5EJ?pK4 zZjF8`TPg}7gC<~j@C(RZ$ z9Va01yj6}~txkF~l7rj#aasI&qSOp_CTXZGqc$qy(S~tu6ojNsYcNzPtBq%98|a*-GfF28 z+}I`~otnpRh91WG?8+6(hZ{7Pfo>X_-90n(#q?i1-FpKNi)${LJBuOf$n1rZBNj5~ zdcOw9d|DGW8o2dPTXCS*&%f&Z60o+TZ|p&L_2j0KW-&r)u>XU^3_gr90F2k*<%=6EpHO=~HSLMawdvQVpgS_x7jL*! zR{l8shv_x{6VchyBeQ*g4bQtexa@Cl4!Ap5eOwX;FCHi{6EO;`K*(gYsw5*HBU`go zBK3ZG6eH^SLp0K#bG>w{5DHg8%`2`ZifRLP9HO6E_< i#wZ1FK?*; literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bt.gif b/upload/images/smiles/bt.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cba890fa38f804c38c01bf7b7b21676f2f28fe2 GIT binary patch literal 7287 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bu.gif b/upload/images/smiles/bu.gif new file mode 100644 index 0000000000000000000000000000000000000000..831019e6d0e2fd624dfb4b948dabd09829b4e20e GIT binary patch literal 17671 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 literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bv.gif b/upload/images/smiles/bv.gif new file mode 100644 index 0000000000000000000000000000000000000000..93b62618b25f09d95f25a323458fa31d13b1326f GIT binary patch literal 18507 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 MDK2UVJXu}zU%x2_$N&HU literal 0 HcmV?d00001 diff --git a/upload/images/smiles/bw.gif b/upload/images/smiles/bw.gif new file mode 100644 index 0000000000000000000000000000000000000000..c565a9b68b04b471a615126ec4817f1e533317ad GIT binary patch literal 4198 zcmeH~eNYqm9fvo`Zn6nUSVF`A;Vwi#JP;9);>(o~0tQPhQlvS1$AA@uo-aVp6MUIT zNPtA8CWxNs$(x8EFTNoHDkcaVZ^noad+{o7LOnbwLhJZ8(%nrY;!Qi#aqd6=&FpVC z^L)N9&u>+DSm3gFXMh9rk$~w@p1>c8kKjyCProp6C-t1^AzpF*-ls0Yuz_**sfr-``6qw z*4n%Dh-o~SZ0shN@!KlhAaKA)2KRV*)QbzK?qeq(?`OGGgln7;8jmMH2pL2~B=SA4 zQWe=!x!#_UaWXl`;y+BBC|4ceEOd)Vn~2L$&T-jRsxF2Y*>gYQi=M^t_1q<&Gd&}V zg*pnsZ&L=JO2pByF*FcB0jK~OMdPCFKd9yK6+xspsxOioQMSZs=_{fH2;gmeeKi39uXA63gg>`l==)#8%#91wq;hCNOJU;qM0=m)4;X|kA0C${md z$zUIc05nuGS*shEPsjfm6+dVVZPA<1N>e+wEH5;af3>=L{n@`&ecko=*My9!BBU-C z8aV^(fi6}L)?RkTKW=^p0e$scz~N2sub_S62W#simgk54X{v%AQPKRH)>alQsp*7X zUgUF{VzD2}%`?Xy zip5@ZxCBo<6idB2=87ftPzJN1v7=Lqrrzpb)p_T%%fx!Md zWN??42h>P}h~J{wXFkqmx%f_wr6<)Agai=HSr7?iDB&j{pe}z*nOyaXy>*32k~OjA6s2F1zw#%T$}AE_S=WzZl?-lv^g}UGM)7fB*$5h+DlW?qL=4) z38pIY)>O32K=P`!Li!1X6zm&5VSxAsD4x%^@?TAR-h?48l+q z=bgk+5rJ6X8j9P*AICL3hb_Oy8VbF&9$fx+- z$0}>iLEt}!FlrH8-q6^p)1doPyUERBAtgGTvsD@i5M=vdge~RqGpG@(fxY5^xZp;J z$r3AzPRjW6{WjF9eFt@NDnI6{dX13m=&*zvo2Ent<*Hw$v?ner5@gaKN=u}T2G}LU zhDww=3L}@OlA!1gk_rd~B!b)-C|i$#D=I9;!NrAO%&JSy;><)SuQGL`g_nrIY%A+C zcB8Ov`!^W-o9tcggf_<=d=ne$kQ zGSb$-;U~!`o^tx1U2pG8ug1_sXGUXa03u38LCPiMk_fwqMa!tk&B&TtMbAdHHk4edBx1q6O?AcMQTJSb?d4P}ie(Oz@> zt1|+@;7b^W5I+B?KsLB)c9$g<#Vg;LvuhvFEps;G2Eiu0))0lxSs87v5+qxU+B}Q#>HUH8f8+eg&pGGOpx*LJpIu@uj*a(-@Hu|#VePJ)v1B|Z=mXCG zS+*Z=zHM9YJq7+xoYo=oi>@9Gp#WVxrRK#$DyS;JeAc{qDyypqGpnam-SF1xDSfkg z>SwQ>bLi@+du#Qa{-sxsmD2m$3~Ks{EUVCD#VBy)v*^s>yewSxtu~XLm6gK5A>Q1`HI<)9~FYIK0-H~&jAMWb4+FtHOiT)1>(Kf1>Eit`{H0l!VLgbZeVLwm<{lu?WSnT{S*X!Lmf^t6*p_|2!$ zyWh4{)k;5P*ypp)*uK+2?P^h)N2Orj${|kzCZG`e}CupFsL6! Y{NCtrfW!T3Ub!PuD(-r)9EG#uKYaCSa{vGU literal 0 HcmV?d00001 diff --git a/upload/images/smiles/smileys.pak b/upload/images/smiles/smileys.pak new file mode 100644 index 000000000..7b5d676af --- /dev/null +++ b/upload/images/smiles/smileys.pak @@ -0,0 +1,49 @@ +aa.gif=+:aa=+::aa: +ab.gif=+:ab=+::ab: +ac.gif=+:ac=+::ac: +ad.gif=+:ad=+::ad: +ae.gif=+:ae=+::ae: +af.gif=+:af=+::af: +ag.gif=+:ag=+::ag: +ah.gif=+:ah=+::ah: +ai.gif=+:ai=+::ai: +aj.gif=+:aj=+::aj: +ak.gif=+:ak=+::ak: +al.gif=+:al=+::al: +am.gif=+:am=+::am: +an.gif=+:an=+::an: +ao.gif=+:ao=+::ao: +ap.gif=+:ap=+::ap: +aq.gif=+:aq=+::aq: +ar.gif=+:ar=+::ar: +as.gif=+:as=+::as: +at.gif=+:at=+::at: +au.gif=+:au=+::au: +av.gif=+:av=+::av: +aw.gif=+:aw=+::aw: +ax.gif=+:ax=+::ax: +ay.gif=+:ay=+::ay: +az.gif=+:az=+::az: +ba.gif=+:ba=+::ba: +bb.gif=+:bb=+::bb: +bc.gif=+:bc=+::bc: +bd.gif=+:bd=+::bd: +be.gif=+:be=+::be: +bf.gif=+:bf=+::bf: +bg.gif=+:bg=+::bg: +bh.gif=+:bh=+::bh: +bi.gif=+:bi=+::bi: +bj.gif=+:bj=+::bj: +bk.gif=+:bk=+::bk: +bl.gif=+:bl=+::bl: +bm.gif=+:bm=+::bm: +bn.gif=+:bn=+::bn: +bo.gif=+:bo=+::bo: +bp.gif=+:bp=+::bp: +bq.gif=+:bq=+::bq: +br.gif=+:br=+::br: +bs.gif=+:bs=+::bs: +bt.gif=+:bt=+::bt: +bu.gif=+:bu=+::bu: +bv.gif=+:bv=+::bv: +bw.gif=+:bw=+::bw: diff --git a/upload/images/spacer.gif b/upload/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/upload/images/tor_gold.gif b/upload/images/tor_gold.gif new file mode 100644 index 0000000000000000000000000000000000000000..c735646e0df9eac72a45f09ead74663b539321a8 GIT binary patch literal 1053 zcmZ?wbhEHb6kyyg2V@g4>uYVUTiS<@gm^IhX)Kp2PppM_Hzvhc6JPK zHPSO+W(2xi@h1x>D+4=&4#*cEZ!)l%9cV7_(2;6wK6ueWLu5*e>ZODLujN;@H#uzJ zTI{nt+)ANjYx^h3Jw9p|-xc2GU7r2;#g-Te7Hme@z>H%2WFaHK;gz@;Qg&e!Zmzzbkmhx@8(IjRgT0i&3^04eFU6Xyw56)EaTUna; z5!ttl42%qXK*+%6eV{qOLV>Tp?cf0gAF=+^DjNeTCvNt`M?Xw$+U++or?bc9Rr@7}xkNNKx(B$qL!1hU7=-y=2M#Y(u;F1l zslM``k5$At+7CJQeqHwM_MZN9zsYi3H@;bg@hXTDBj&&hkR(@y%?(Oq-?wDGU1 zV5tmls0eUlW-P90&uel*HJ$4s9yr{npd;0P^dN($h|m5_)N)F{`XoPQKOz8Y??JBruds113hIVIL;_< z3aD_K9`ZWS@`Mv_bXI7$=;ZF$Vxu)>n|M79B<9ARe|dGQ2$tgn*4(z5D*qv^ zI?N*gYAAYgf~QYla#B#4e#G%$rG^84(5uia1(7LNm9KNg^-T^gUiiDEXmV=d!_}ff SGw$!$wO94__9{>qS_1$#j5H(w literal 0 HcmV?d00001 diff --git a/upload/images/tor_silver.gif b/upload/images/tor_silver.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7c9d4f7cbb83f6589771eae7108218fe43dac08 GIT binary patch literal 721 zcmZ?wbhEHb6ky5!!`?-b$J39ur8tEA@ zGXez_f3k40GO#h|fE0kVGcaps?7Fj#!G_&wLee3_CHL;KvoQM1ShN{n7NRcmfm1c2=TLaG0Y(jN+so3#Yli zSoNOrvANs{mVN3y4{R|+D>DNV0~gS0ki)r*7ffJOxL2guQRR5A|4ZoP6`YQpne$#X zW?Ia7S&%z3S(@jh!=ARI6ObIv2(+3HY_)mDstX$mwm3d*Zm<$KWEy$7bjop$#}+dZ zXRQ-{J}J(ceS_^`g;$?!CuWI8r05*tf4oA|si!X;>* zN1??q<4m7I0Ut|OQu^GCs7-6L4!j7kDXB7#*z;MDAzl4JZq9!G1qGX3e5NTWGa_OH z6g@oP7}3d4yY-Ka;rNsZLdOmk?~Zw)>2Sk$iRPlERuyZxcI)q&dFjHD=feGbJ-kf7 zm_~|Hn9uYwcCj7cZBmqrQDDi+zc=-I#+?V5(&dX*wd9@ivRcON@78;^f8TxaGYVoy zN<=sjMu6gl8|)!nV7$C@==gSR#?^*`=M~Z4YrPLtPN+;;YH1LC$}sc<3t!&luig&@ zBGMcyRgj{G6>frd1{=_X4eZS(jZC*oB%Cg!o>ngvJrVKpB`?paoJUVNp1M3WdLp%> Ky>Ai&gEau$Fz=QC literal 0 HcmV?d00001 diff --git a/upload/images/user_offline.gif b/upload/images/user_offline.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3cd05b2dcb5ac97898af10612fdd103f1fe686e GIT binary patch literal 347 zcmZ?wbhEHb6krfwxT?i)?AWoTOP4NMv?wnxPfJT{{rdG&r%qkCaN)FR)5^=stE#Hj zu3Z}!7w7Nq-`CeSd-m*At5$vc_^7U~uBfP}v9WR9ym<>2ENE+MTd`tAdwcux<;&C4 z)02~vOG--2%*=;*j{tW8kpcOf0Q&$+RzxDRW>ZpXn zD;XsxOYQ1D{v=3sLfq1TEENF(8J&cT*nED;#wg8X^+b)do=hzPHW6kX-kdz=fRxgT p*`d|7^$Mz*((<7*TV-XG6jfICFl=UE37s@$nwp$43yULzH2`eXbz%Sj literal 0 HcmV?d00001 diff --git a/upload/images/user_online.gif b/upload/images/user_online.gif new file mode 100644 index 0000000000000000000000000000000000000000..606eab7cfcb942511c2b853bfc91dde96a61662d GIT binary patch literal 711 zcmZ?wbhEHb6krfwxXQpV^X&io|NqUJ`TxwBe_J2@pZzbbq5kHC{;%C#FD6a=o}ImG z?^B_&(v#U)7yA1?_4a&9OjuP^czx!Kf9YvwCQtfdY@9xQ+MoWuFYRq_e0+K`($7{` zJ(xP>hq-xfe%_U^u-Q{4|12%J)!6Xt@IO0?xiWfF#Ap8hq}nBve%e^3k zoA=T`{SW^I{{R24_@CR)H6+;CF~HSG&w!bcfq_BsCkv|)gFS-|kPY;t00RSC;eq)H z9+e3$voGYI6k(bd;IQPR2m@2Znkl=sq;2J0_gR`DYTQn&pT9QT z=zW}-`04_q`;R_5o$8q^{?97SR7F)?)2cD8tGg#!tzQkvc#vZ_7&yTW0vXT9values), new GenericClass):new Instance of GenericClass + * + * With a decoded JSON object You could convert them + * into a new instance of your Generic Class. + * Example: + * class MyClass { + * var $param = "somevalue"; + * function MyClass($somevar) { + * $this->somevar = $somevar; + * }; + * function getVar = function(){ + * return $this->somevar; + * }; + * }; + * + * $instance = new MyClass("example"); + * $encoded = FastJSON::encode($instance); + * // {"param":"somevalue"} + * + * $decoded = FastJSON::decode($encoded); + * // $decoded instanceof Object => true + * // $decoded instanceof MyClass => false + * + * $decoded = FastJSON::convert($decoded, new MyClass("example")); + * // $decoded instanceof Object => true + * // $decoded instanceof MyClass => true + * + * $decoded->getVar(); // example + * + * --------------------------------------- + * + * @author Andrea Giammarchi + * @site http://www.devpro.it/ + * @version 0.4 [fixed string convertion problems, add stdClass optional convertion instead of associative array (used by default)] + * @requires anything + * @compatibility PHP >= 4 + * @license + * --------------------------------------- + * + * Copyright (c) 2006 - 2007 Andrea Giammarchi + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated + * documentation files (the "Software"), + * to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * _______________________________________ + */ +class FastJSON { + + // public methods + + /** + * public static method + * + * FastJSON::convert(params:* [, result:Instance]):* + * + * @param * String or Object + * @param Instance optional new generic class instance if first + * parameter is an object. + * @return * time() value or new Instance with object parameters. + * + * @note please read Special FastJSON::convert method Informations + */ + function convert($params, $result = null){ + switch(gettype($params)){ + case 'array': + $tmp = array(); + foreach($params as $key => $value) { + if(($value = FastJSON::encode($value)) !== '') + array_push($tmp, FastJSON::encode(strval($key)).':'.$value); + }; + $result = '{'.implode(',', $tmp).'}'; + break; + case 'boolean': + $result = $params ? 'true' : 'false'; + break; + case 'double': + case 'float': + case 'integer': + $result = $result !== null ? strftime('%Y-%m-%dT%H:%M:%S', $params) : strval($params); + break; + case 'NULL': + $result = 'null'; + break; + case 'string': + $i = create_function('&$e, $p, $l', 'return intval(substr($e, $p, $l));'); + if(preg_match('/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $params)) + $result = mktime($i($params, 11, 2), $i($params, 14, 2), $i($params, 17, 2), $i($params, 5, 2), $i($params, 9, 2), $i($params, 0, 4)); + break; + case 'object': + $tmp = array(); + if(is_object($result)) { + foreach($params as $key => $value) + $result->$key = $value; + } else { + $result = get_object_vars($params); + foreach($result as $key => $value) { + if(($value = FastJSON::encode($value)) !== '') + array_push($tmp, FastJSON::encode($key).':'.$value); + }; + $result = '{'.implode(',', $tmp).'}'; + } + break; + } + return $result; + } + + /** + * public method + * + * FastJSON::decode(params:String[, useStdClass:Boolean]):* + * + * @param String valid JSON encoded string + * @param Bolean uses stdClass instead of associative array if params contains objects (default false) + * @return * converted variable or null + * is params is not a JSON compatible string. + * @note This method works in an optimist way. If JSON string is not valid + * the code execution will die using exit. + * This is probably not so good but JSON is often used combined with + * XMLHttpRequest then I suppose that's better more protection than + * just some WARNING. + * With every kind of valid JSON string the old error_reporting level + * and the old error_handler will be restored. + * + * @example + * FastJSON::decode('{"param":"value"}'); // associative array + * FastJSON::decode('{"param":"value"}', true); // stdClass + * FastJSON::decode('["one",two,true,false,null,{},[1,2]]'); // array + */ + function decode($encode, $stdClass = false){ + $pos = 0; + $slen = is_string($encode) ? strlen($encode) : null; + if($slen !== null) { + $error = error_reporting(0); + set_error_handler(array('FastJSON', '__exit')); + $result = FastJSON::__decode($encode, $pos, $slen, $stdClass); + error_reporting($error); + restore_error_handler(); + } + else + $result = null; + return $result; + } + + /** + * public method + * + * FastJSON::encode(params:*):String + * + * @param * Array, Boolean, Float, Int, Object, String or NULL variable. + * @return String JSON genric object rappresentation + * or empty string if param is not compatible. + * + * @example + * FastJSON::encode(array(1,"two")); // '[1,"two"]' + * + * $obj = new MyClass(); + * obj->param = "value"; + * obj->param2 = "value2"; + * FastJSON::encode(obj); // '{"param":"value","param2":"value2"}' + */ + function encode($decode){ + $result = ''; + switch(gettype($decode)){ + case 'array': + if(!count($decode) || array_keys($decode) === range(0, count($decode) - 1)) { + $keys = array(); + foreach($decode as $value) { + if(($value = FastJSON::encode($value)) !== '') + array_push($keys, $value); + } + $result = '['.implode(',', $keys).']'; + } + else + $result = FastJSON::convert($decode); + break; + case 'string': + $replacement = FastJSON::__getStaticReplacement(); + $result = '"'.str_replace($replacement['find'], $replacement['replace'], $decode).'"'; + break; + default: + if(!is_callable($decode)) + $result = FastJSON::convert($decode); + break; + } + return $result; + } + + // private methods, uncommented, sorry + function __getStaticReplacement(){ + static $replacement = array('find'=>array(), 'replace'=>array()); + if($replacement['find'] == array()) { + foreach(array_merge(range(0, 7), array(11), range(14, 31)) as $v) { + $replacement['find'][] = chr($v); + $replacement['replace'][] = "\\u00".sprintf("%02x", $v); + } + $replacement['find'] = array_merge(array(chr(0x5c), chr(0x2F), chr(0x22), chr(0x0d), chr(0x0c), chr(0x0a), chr(0x09), chr(0x08)), $replacement['find']); + $replacement['replace'] = array_merge(array('\\\\', '\\/', '\\"', '\r', '\f', '\n', '\t', '\b'), $replacement['replace']); + } + return $replacement; + } + function __decode(&$encode, &$pos, &$slen, &$stdClass){ + switch($encode{$pos}) { + case 't': + $result = true; + $pos += 4; + break; + case 'f': + $result = false; + $pos += 5; + break; + case 'n': + $result = null; + $pos += 4; + break; + case '[': + $result = array(); + ++$pos; + while($encode{$pos} !== ']') { + array_push($result, FastJSON::__decode($encode, $pos, $slen, $stdClass)); + if($encode{$pos} === ',') + ++$pos; + } + ++$pos; + break; + case '{': + $result = $stdClass ? new stdClass : array(); + ++$pos; + while($encode{$pos} !== '}') { + $tmp = FastJSON::__decodeString($encode, $pos); + ++$pos; + if($stdClass) + $result->$tmp = FastJSON::__decode($encode, $pos, $slen, $stdClass); + else + $result[$tmp] = FastJSON::__decode($encode, $pos, $slen, $stdClass); + if($encode{$pos} === ',') + ++$pos; + } + ++$pos; + break; + case '"': + switch($encode{++$pos}) { + case '"': + $result = ""; + break; + default: + $result = FastJSON::__decodeString($encode, $pos); + break; + } + ++$pos; + break; + default: + $tmp = ''; + preg_replace('/^(\-)?([0-9]+)(\.[0-9]+)?([eE]\+[0-9]+)?/e', '$tmp = "\\1\\2\\3\\4"', substr($encode, $pos)); + if($tmp !== '') { + $pos += strlen($tmp); + $nint = intval($tmp); + $nfloat = floatval($tmp); + $result = $nfloat == $nint ? $nint : $nfloat; + } + break; + } + return $result; + } + function __decodeString(&$encode, &$pos) { + $replacement = FastJSON::__getStaticReplacement(); + $endString = FastJSON::__endString($encode, $pos, $pos); + $result = str_replace($replacement['replace'], $replacement['find'], substr($encode, $pos, $endString)); + $pos += $endString; + return $result; + } + function __endString(&$encode, $position, &$pos) { + do { + $position = strpos($encode, '"', $position + 1); + }while($position !== false && FastJSON::__slashedChar($encode, $position - 1)); + if($position === false) + trigger_error('', E_USER_WARNING); + return $position - $pos; + } + function __exit($str, $a, $b) { + exit($a.'FATAL: FastJSON decode method failure [malicious or incorrect JSON string]'); + } + function __slashedChar(&$encode, $position) { + $pos = 0; + while($encode{$position--} === '\\') + $pos++; + return $pos % 2; + } +} + +?> diff --git a/upload/includes/bbcode.php b/upload/includes/bbcode.php new file mode 100644 index 000000000..a9876d348 --- /dev/null +++ b/upload/includes/bbcode.php @@ -0,0 +1,1014 @@ +enqueue(array( + 'smile_replacements', +)); + +$page_cfg['include_bbcode_js'] = true; + +// +// BBCode templates +// +function get_bbcode_tpl () +{ +$bbcode_tpl = array(); +// Quote +/* +

    +
    Цитата:
    +
    +*/ +$bbcode_tpl['quote_open'] = << +
    +HTML; + +/* +
    +
    \\1 писал(а):
    +
    +*/ +$bbcode_tpl['quote_username_open'] = << +
    +HTML; + +$bbcode_tpl['quote_close'] = << +
    +HTML; + +// Code +$bbcode_tpl['code_open'] = << +
    Код:
    +
    +HTML; + +$bbcode_tpl['code_close'] = << +
    +HTML; + +// Spoiler +/* +
    +
    скрытый текст
    +
    +*/ +$bbcode_tpl['spoiler_open'] = << +
    +HTML; + +/* +
    +
    \\1
    +
    +*/ +$bbcode_tpl['spoiler_title_open'] = << +
    +

    \\1

    +HTML; + +$bbcode_tpl['spoiler_close'] = << +
    +HTML; + +// Image +$bbcode_tpl['img'] = ' '; + +$bbcode_tpl['img_aligned'] = << +HTML; + +// HR +$bbcode_tpl['hr'] = <<- +HTML; + +array_deep($bbcode_tpl, 'bbcode_tpl_compact'); +return $bbcode_tpl; +} + +function bbcode_tpl_compact ($text) +{ + $text = str_compact($text); + $text = str_replace('> <', '><', $text); + return $text; +} + +// prepare a posted message for entry into the database +function prepare_message ($message) +{ + $message = bbcode::clean_up($message); + $message = htmlCHR($message, false, ENT_NOQUOTES); + return $message; +} + +// +// post_html_cache +// +function update_post_html_cache ($post_id, $post_text) +{ + if (CACHE('bb_post_html')->used) + { + $post_html = bbcode2html($post_text); + CACHE('bb_post_html')->set($post_id, $post_html, 86400, 'p_html_'); + } +} + +function rm_post_html_cache ($post_id) +{ + CACHE('bb_post_html')->rm("p_html_{$post_id}"); +} + +// $post_ids - array or int +function get_posts_html ($post_ids) +{ + if (!$post_ids_csv = get_id_csv($post_ids)) + { + return is_array($post_ids) ? array() : ''; + } + + return CACHE('bb_post_html')->get($post_ids, 'get_posts_html_items', 'p_html_', 86400); +} + +// $post_ids - array +function get_posts_html_items ($post_ids) +{ + if (!$post_ids_csv = get_id_csv($post_ids)) return array(); + + $items = array_fill_keys( (array)$post_ids, null ); + + $sql = "SELECT post_id, post_text FROM ". BB_POSTS_TEXT ." WHERE post_id IN($post_ids_csv) ORDER BY NULL"; + + foreach (DB('pt')->fetch_rowset($sql) as $row) + { + $items[$row['post_id']] = bbcode2html($row['post_text']); + } + + return is_array($post_ids) ? $items : $items[$post_ids]; +} + +// $post_ids - array or int +function get_posts_text ($post_ids) +{ + global $bb_cfg; + + if (!$post_ids_csv = get_id_csv($post_ids)) + { + return is_array($post_ids) ? array() : ''; + } + + $posts_text = array(); + + $sql = "SELECT post_id, post_text FROM ". BB_POSTS_TEXT ." WHERE post_id IN($post_ids_csv) ORDER BY NULL"; + + foreach (DB('pt')->fetch_rowset($sql) as $row) + { + $posts_text[$row['post_id']] = $row['post_text']; + } + + return is_array($post_ids) ? $posts_text : $posts_text[$post_ids]; +} + +// Fill smiley templates (or just the variables) with smileys +// Either in a window or inline +function generate_smilies($mode) +{ + global $bb_cfg, $template, $lang, $images; + global $user; + + $inline_columns = 4; + $inline_rows = 7; + $window_columns = 8; + + if ($mode == 'window') + { + $user->session_start(); + } + + if (!$sql = CACHE('bb_cache')->get('smilies')) + { + $sql = DB()->fetch_rowset("SELECT emoticon, code, smile_url FROM ". BB_SMILIES ." ORDER BY smilies_id"); + CACHE('bb_cache')->set('smilies', $sql); + } + if ($sql) + { + $num_smilies = 0; + $rowset = array(); + foreach ($sql as $row) + { + if (empty($rowset[$row['smile_url']])) + { + $rowset[$row['smile_url']]['code'] = str_replace("'", "\\'", str_replace('\\', '\\\\', $row['code'])); + $rowset[$row['smile_url']]['emoticon'] = $row['emoticon']; + $num_smilies++; + } + } + + if ($num_smilies) + { + $smilies_count = ($mode == 'inline') ? min(19, $num_smilies) : $num_smilies; + $smilies_split_row = ($mode == 'inline') ? $inline_columns - 1 : $window_columns - 1; + + $s_colspan = 0; + $row = 0; + $col = 0; + + while (list($smile_url, $data) = @each($rowset)) + { + if (!$col) + { + $template->assign_block_vars('smilies_row', array()); + } + + $template->assign_block_vars('smilies_row.smilies_col', array( + 'SMILEY_CODE' => $data['code'], + 'SMILEY_IMG' => $bb_cfg['smilies_path'] . '/' . $smile_url, + 'SMILEY_DESC' => $data['emoticon']) + ); + + $s_colspan = max($s_colspan, $col + 1); + + if ($col == $smilies_split_row) + { + if ($mode == 'inline' && $row == $inline_rows - 1) + { + break; + } + $col = 0; + $row++; + } + else + { + $col++; + } + } + + if ($mode == 'inline' && $num_smilies > $inline_rows * $inline_columns) + { + $template->assign_block_vars('switch_smilies_extra', array()); + + $template->assign_vars(array( + 'L_MORE_SMILIES' => $lang['MORE_EMOTICONS'], + 'U_MORE_SMILIES' => append_sid("posting.php?mode=smilies")) + ); + } + + $template->assign_vars(array( + 'PAGE_TITLE' => $lang['EMOTICONS'], + 'L_EMOTICONS' => $lang['EMOTICONS'], + 'S_SMILIES_COLSPAN' => $s_colspan, + )); + } + } + + if ($mode == 'window') + { + print_page('posting_smilies.tpl', 'simple'); + } +} + +// some functions from vB +// ############################################################################# +/** +* Strips away [quote] tags and their contents from the specified string +* +* @param string Text to be stripped of quote tags +* +* @return string +*/ +function strip_quotes ($text) +{ + $lowertext = strtolower($text); + + // find all [quote tags + $start_pos = array(); + $curpos = 0; + do + { + $pos = strpos($lowertext, '[quote', $curpos); + if ($pos !== false) + { + $start_pos["$pos"] = 'start'; + $curpos = $pos + 6; + } + } + while ($pos !== false); + + if (sizeof($start_pos) == 0) + { + return $text; + } + + // find all [/quote] tags + $end_pos = array(); + $curpos = 0; + do + { + $pos = strpos($lowertext, '[/quote', $curpos); + if ($pos !== false) + { + $end_pos["$pos"] = 'end'; + $curpos = $pos + 8; + } + } + while ($pos !== false); + + if (sizeof($end_pos) == 0) + { + return $text; + } + + // merge them together and sort based on position in string + $pos_list = $start_pos + $end_pos; + ksort($pos_list); + + do + { + // build a stack that represents when a quote tag is opened + // and add non-quote text to the new string + $stack = array(); + $newtext = '[...] '; + $substr_pos = 0; + foreach ($pos_list AS $pos => $type) + { + $stacksize = sizeof($stack); + if ($type == 'start') + { + // empty stack, so add from the last close tag or the beginning of the string + if ($stacksize == 0) + { + $newtext .= substr($text, $substr_pos, $pos - $substr_pos); + } + array_push($stack, $pos); + } + else + { + // pop off the latest opened tag + if ($stacksize) + { + array_pop($stack); + $substr_pos = $pos + 8; + } + } + } + + // add any trailing text + $newtext .= substr($text, $substr_pos); + + // check to see if there's a stack remaining, remove those points + // as key points, and repeat. Allows emulation of a non-greedy-type + // recursion. + if ($stack) + { + foreach ($stack AS $pos) + { + unset($pos_list["$pos"]); + } + } + } + while ($stack); + + return $newtext; +} + +// ############################################################################# +/** +* Strips away bbcode from a given string, leaving plain text +* +* @param string Text to be stripped of bbcode tags +* @param boolean If true, strip away quote tags AND their contents +* @param boolean If true, use the fast-and-dirty method rather than the shiny and nice method +* +* @return string +*/ +function strip_bbcode ($message, $stripquotes = true, $fast_and_dirty = false, $showlinks = true) +{ + $find = array(); + $replace = array(); + + if ($stripquotes) + { + // [quote=username] and [quote] + $message = strip_quotes($message); + } + + // a really quick and rather nasty way of removing bbcode + if ($fast_and_dirty) + { + // any old thing in square brackets + $find[] = '#\[.*/?\]#siU'; + $replace = ''; + + $message = preg_replace($find, $replace, $message); + } + // the preferable way to remove bbcode + else + { + // simple links + $find[] = '#\[(email|url)=("??)(.+)\\2\]\\3\[/\\1\]#siU'; + $replace[] = '\3'; + + // named links + $find[] = '#\[(email|url)=("??)(.+)\\2\](.+)\[/\\1\]#siU'; + $replace[] = ($showlinks ? '\4 (\3)' : '\4'); + + // smilies + $find[] = '#(?<=^|\W)(:\w+?:)(?=$|\W)#'; + $replace[] = ''; + + // replace + $message = preg_replace($find, $replace, $message); + + // strip out all other instances of [x]...[/x] + while (preg_match('#\[([a-z]+)\s*?(?:[^\]]*?)\](.*?)(\[/\1\])#is', $message, $m)) + { + $message = str_replace($m[0], $m[2], $message); + } + + $replace = array('[*]', '[hr]', '[br]'); + $message = str_replace($replace, ' ', $message); + } + + return $message; +} + +function extract_search_words ($text) +{ + global $bb_cfg; + + $max_words_count = $bb_cfg['max_search_words_per_post']; + $min_word_len = max(2, $bb_cfg['search_min_word_len'] - 1); + $max_word_len = $bb_cfg['search_max_word_len']; + + $text = ' ' . str_compact(strip_tags(strtolower($text))) . ' '; + $text = str_replace(array('[', ']'), array('[', ']'), $text); + + // HTML entities like   + $text = preg_replace('/(\w*?)&#?[0-9a-z]+;(\w*?)/i', '', $text); + // Remove URL's + $text = preg_replace('#\b[a-z0-9]+://[0-9a-z\.\-]+(/[0-9a-z\?\.%_\-\+=&/]+)?#', ' ', $text); + + $text = strip_bbcode($text); + + // Filter out characters like ^, $, &, change "it's" to "its" + $text = preg_replace('#\W#', ' ', $text); + + // short & long words + $text = preg_replace('#(?<=^|\s)(\S{1,'.$min_word_len.'}|\S{'.$max_word_len.',}|\W*)(?=$|\s)#', ' ', $text); + + $text = remove_stopwords($text); +# $text = replace_synonyms($text); + + // Trim 1+ spaces to one space and split this string into unique words + $text = array_unique(explode(' ', str_compact($text))); + + if (sizeof($text) > $max_words_count) + { +# shuffle($text); + $text = array_splice($text, 0, $max_words_count); + } + + return $text; +} + +function replace_synonyms ($text) +{ + static $syn_match = null, $syn_replace = null; + + if (is_null($syn_match)) + { + preg_match_all("#(\w+) (\w+)(\r?\n|$)#", @file_get_contents(LANG_DIR .'search_synonyms.txt'), $m); + + $syn_match = $m[2]; + $syn_replace = $m[1]; + + array_deep($syn_match, 'pad_with_space'); + array_deep($syn_replace, 'pad_with_space'); + } + + return ($syn_match && $syn_replace) ? str_replace($syn_match, $syn_replace, $text) : $text; +} + +function add_search_words ($post_id, $post_message, $post_title = '', $bbcode_uid = '', $only_return_words = false) +{ + $text = $post_title .' '. $post_message; + $text = strip_bbcode_uid($text, $bbcode_uid); + $words = ($text) ? extract_search_words($text) : array(); + + if ($only_return_words) + { + return join("\n", $words); + } + else + { + DB()->query("DELETE FROM ". BB_POSTS_SEARCH ." WHERE post_id = $post_id"); + + if ($words_sql = DB()->escape(join("\n", $words))) + { + DB()->query("REPLACE INTO ". BB_POSTS_SEARCH ." (post_id, search_words) VALUES ($post_id, '$words_sql')"); + } + } +} + +class bbcode +{ + var $tpl = array(); // шаблоны для замены тегов + var $smilies = null; + var $found_spam = null; // найденные спам "слова" + var $del_words = array(); // см. get_words_rate() + var $tidy_cfg = array( + 'drop-empty-paras' => false, + 'fix-uri' => false, + 'force-output' => true, + 'hide-comments' => true, + 'join-classes' => false, + 'join-styles' => false, + 'merge-divs' => false, +# 'merge-spans' => false, // нужно будет включить после обновления версии tidy + 'newline' => 'LF', + 'output-xhtml' => true, + 'preserve-entities' => true, + 'quiet' => true, + 'quote-ampersand' => false, + 'show-body-only' => true, + 'show-errors' => false, + 'show-warnings' => false, + 'wrap' => 0, + ); + var $block_tags = array( + 'align', + 'br', + 'clear', + 'hr', + 'list', + 'pre', + 'quote', + 'spoiler', + ); + var $preg = array(); + var $str = array(); + var $preg_search = array(); + var $preg_repl = array(); + var $str_search = array(); + var $str_repl = array(); + + /** + * Constructor + */ + function bbcode () + { + global $bb_cfg; + + $this->tpl = get_bbcode_tpl(); + + $this->init_replacements(); + + if ($bb_cfg['tidy_cfg']) + { + $this->tidy_cfg = array_merge($this->tidy_cfg, $bb_cfg['tidy_cfg']); + } + } + + /** + * init_replacements + */ + function init_replacements () + { + $tpl = $this->tpl; + $url_exp = '[\w\#$%&~/.\-;:=?@\[\]+]+?'; + $img_url_exp = 'http://[^\s\?&;:=\#\"<>]+?\.(jpg|jpeg|gif|png)'; + $email_exp = '[a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+'; + + $this->preg = array( + '#\[quote="(.+?)"\]#' => $tpl['quote_username_open'], + '#\[spoiler="(.+?)"\]#' => $tpl['spoiler_title_open'], + '#\[list=(a|A|i|I|1)\]#' => '
    '); + } + else if (node.nodeType == 3) + { + html.push('
    ', escapeHTML(node.nodeValue), + '
    '); + } + } + + // ******************************************************************************************** + + function addEvent(object, name, handler) + { + if (document.all) + object.attachEvent("on"+name, handler); + else + object.addEventListener(name, handler, false); + } + + function removeEvent(object, name, handler) + { + if (document.all) + object.detachEvent("on"+name, handler); + else + object.removeEventListener(name, handler, false); + } + + function cancelEvent(event) + { + if (document.all) + event.cancelBubble = true; + else + event.stopPropagation(); + } + + function onError(msg, href, lineNo) + { + var html = []; + + var lastSlash = href.lastIndexOf("/"); + var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1); + + html.push( + '', msg, '', + '' + ); + + logRow(html, "error"); + }; + + function onKeyDown(event) + { + if (event.keyCode == 123) + toggleConsole(); + else if ((event.keyCode == 108 || event.keyCode == 76) && event.shiftKey + && (event.metaKey || event.ctrlKey)) + focusCommandLine(); + else + return; + + cancelEvent(event); + } + + function onSplitterMouseDown(event) + { + if (isSafari || isOpera) + return; + + addEvent(document, "mousemove", onSplitterMouseMove); + addEvent(document, "mouseup", onSplitterMouseUp); + + for (var i = 0; i < frames.length; ++i) + { + addEvent(frames[i].document, "mousemove", onSplitterMouseMove); + addEvent(frames[i].document, "mouseup", onSplitterMouseUp); + } + } + + function onSplitterMouseMove(event) + { + var win = document.all + ? event.srcElement.ownerDocument.parentWindow + : event.target.ownerDocument.defaultView; + + var clientY = event.clientY; + if (win != win.parent) + clientY += win.frameElement ? win.frameElement.offsetTop : 0; + + var height = consoleFrame.offsetTop + consoleFrame.clientHeight; + var y = height - clientY; + + consoleFrame.style.height = y + "px"; + layout(); + } + + function onSplitterMouseUp(event) + { + removeEvent(document, "mousemove", onSplitterMouseMove); + removeEvent(document, "mouseup", onSplitterMouseUp); + + for (var i = 0; i < frames.length; ++i) + { + removeEvent(frames[i].document, "mousemove", onSplitterMouseMove); + removeEvent(frames[i].document, "mouseup", onSplitterMouseUp); + } + } + + function onCommandLineKeyDown(event) + { + if (event.keyCode == 13) + evalCommandLine(); + else if (event.keyCode == 27) + commandLine.value = ""; + } + + window.onerror = onError; + addEvent(document, isIE || isSafari ? "keydown" : "keypress", onKeyDown); + + if (document.documentElement.getAttribute("debug") == "true") + toggleConsole(true); +})(); +} diff --git a/upload/misc/js/firebug/firebugx.js b/upload/misc/js/firebug/firebugx.js new file mode 100644 index 000000000..343686250 --- /dev/null +++ b/upload/misc/js/firebug/firebugx.js @@ -0,0 +1,10 @@ + +if (!window.console || !console.firebug) +{ + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {} +} \ No newline at end of file diff --git a/upload/misc/js/firebug/infoIcon.png b/upload/misc/js/firebug/infoIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..da1e5334c19375c7855e04792661bf2cc15b7e14 GIT binary patch literal 524 zcmV+n0`vWeP)k!W#MOQK{ljl)GVz=%0?7rtE9wY7Lo;JgN;%aBBhkF zup$d#AvGJB@i#x7d!6%U9&aT1>bvKh+xgD9@4TZarC_79XA_3Y)u z4jj;IA&G`4T$SEtNOwJyD9b09DTwq1MCN*%!X+xO|0N{Rs4^;&b|i*sHEGPq;n|zOEfbH<6(;%L`k^mT)7z~ywlRx3h4?$ zl>}*o?-02Jb-IWCddBfMi57}>wIB`^Hlv*vh?pjx5|0aenzD001sDKWl9*QR=`djc O0000X+Z1;#G+8)`#`)nwDij+1|+};(+Jd*z{tojUrGNrgOti&26irp z_}33i3=gldFg&}%ydKD%4m4mlSOTPRRTp>8w%MHj-#%jkasQt=!|=bOgW><(yI^TB zesYWX|At9i|AA_qz?K0SLTh@t|9^bL1XtwZ!T_=ktQjT-!jEsTfHbZKahQM#GSy9g zGw=!jV;}@%)c=6I5d!peNPt)%qXt$R0@A3+&Ho=o(%2Y6D=A@WxvV2T-}@x_m?j12e;Kn75?FIa%Y*5~(_)p>;wfs>Yo>SSa9R12cEf^3|A z?HDV=w@(OLSFdJZ*t3U$;p|ydO|Ks_Gd#G$auApZ7BB&cJHLN2R-V|*!SL$`L^DVe z48y>e_e>0@wy}el)6tV$3kUcAYBiJJ3`|`A816m!$KYVc!0_$`6T_P)%nWzVvoQSm z#aIlqs1HRWRI?%|K>)EC$csSy9f(f>@eyb`{RmSF5MTfvB)oWs%O|`50000d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
    a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
    ";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
    t
    ";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="

    ";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, +""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
    ").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); + +// compressor [http://refresh-sf.com/yui/] + +// json [http://jollytoad.googlepages.com/json.js] +(function($){var m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},s={array:function(x){var a=["["],b,f,i,l=x.length,v;for(i=0;iul").hide()}return this.filter(":has(>ul)")},applyClasses:function(d,e){this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview",function(f){if(this==f.target){e.apply(a(this).next())}}).add(a("a",this)).hoverClass();if(!d.prerendered){this.filter(":has(>ul:hidden)").addClass(b.expandable).replaceClass(b.last,b.lastExpandable);this.not(":has(>ul:hidden)").addClass(b.collapsable).replaceClass(b.last,b.lastCollapsable);var c=this.find("div."+b.hitarea);if(!c.length){c=this.prepend('
    ').find("div."+b.hitarea)}c.removeClass().addClass(b.hitarea).each(function(){var f="";a.each(a(this).parent().attr("class").split(" "),function(){f+=this+"-hitarea "});a(this).addClass(f)})}this.find("div."+b.hitarea).click(e)},treeview:function(d){d=a.extend({cookieId:"treeview"},d);if(d.toggle){var i=d.toggle;d.toggle=function(){return i.apply(a(this).parent()[0],arguments)}}function c(l,n){function m(o){return function(){f.apply(a("div."+b.hitarea,l).filter(function(){return o?a(this).parent("."+o).length:true}));return false}}a("a:eq(0)",n).click(m(b.collapsable));a("a:eq(1)",n).click(m(b.expandable));a("a:eq(2)",n).click(m())}function f(){a(this).parent().find(">.hitarea").swapClass(b.collapsableHitarea,b.expandableHitarea).swapClass(b.lastCollapsableHitarea,b.lastExpandableHitarea).end().swapClass(b.collapsable,b.expandable).swapClass(b.lastCollapsable,b.lastExpandable).find(">ul").heightToggle(d.animated,d.toggle);if(d.unique){a(this).parent().siblings().find(">.hitarea").replaceClass(b.collapsableHitarea,b.expandableHitarea).replaceClass(b.lastCollapsableHitarea,b.lastExpandableHitarea).end().replaceClass(b.collapsable,b.expandable).replaceClass(b.lastCollapsable,b.lastExpandable).find(">ul").heightHide(d.animated,d.toggle)}}this.data("toggler",f);function k(){function m(n){return n?1:0}var l=[];j.each(function(n,o){l[n]=a(o).is(":has(>ul:visible)")?1:0});a.cookie(d.cookieId,l.join(""),d.cookieOptions)}function e(){var l=a.cookie(d.cookieId);if(l){var m=l.split("");j.each(function(n,o){a(o).find(">ul")[parseInt(m[n])?"show":"hide"]()})}}this.addClass("treeview");var j=this.find("li").prepareBranches(d);switch(d.persist){case"cookie":var h=d.toggle;d.toggle=function(){k();if(h){h.apply(this,arguments)}};e();break;case"location":var g=this.find("a").filter(function(){return this.href.toLowerCase()==location.href.toLowerCase()});if(g.length){g.addClass("selected").parents("ul, li").add(g.next()).show()}break}j.applyClasses(d,f);if(d.control){c(this,d.control);a(d.control).show()}return this}});a.treeview={};var b=(a.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"});a.fn.Treeview=a.fn.treeview})(jQuery); + +// scrollTo 1.4.2 [http://flesler.blogspot.com/2007/10/jqueryscrollto.html] +(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery); + +// TableSorter 2.0.3 [http://tablesorter.com] +(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:".",debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s)}else{alert(s)}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=""}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i  ')}table.config.headerList[index]=this});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders)}return $tableHeaders}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i1){arr=arr.concat(checkCellColSpan(table,headerArr,row++))}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell)}}}return arr}function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true}return false}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true}return false}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i");$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($("
    ").css("width",$(this).width()))});$(table).prepend(colgroup)}}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;ib)?1:0))}function sortTextDesc(a,b){return((ba)?1:0))}function sortNumeric(a,b){return a-b}function sortNumericDesc(a,b){return b-a}function getCachedSortType(parsers,i){return parsers[i].type}this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies){return}var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j0){$this.trigger("sorton",[config.sortList])}applyWidget(this)})};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;ij){k=1}else{if(l");for(var j=0;j","g"),"");e=a.trim(e.toLowerCase());return e};this.results=function(e){if(typeof k.noResults==="string"&&k.noResults!==""){if(e){a(k.noResults).hide()}else{a(k.noResults).show()}}return this};this.loader=function(e){if(typeof k.loader==="string"&&k.loader!==""){(e)?a(k.loader).show():a(k.loader).hide()}return this};this.test=function(m,l){for(var e=0;e>>(32-b))};var m=function(a,b){var c,lY4,lX8,lY8,lResult;lX8=(a&0x80000000);lY8=(b&0x80000000);c=(a&0x40000000);lY4=(b&0x40000000);lResult=(a&0x3FFFFFFF)+(b&0x3FFFFFFF);if(c&lY4){return(lResult^0x80000000^lX8^lY8)}if(c|lY4){if(lResult&0x40000000){return(lResult^0xC0000000^lX8^lY8)}else{return(lResult^0x40000000^lX8^lY8)}}else{return(lResult^lX8^lY8)}};var F=function(x,y,z){return(x&y)|((~x)&z)};var G=function(x,y,z){return(x&z)|(y&(~z))};var H=function(x,y,z){return(x^y^z)};var I=function(x,y,z){return(y^(x|(~z)))};var n=function(a,b,c,d,x,s,e){a=m(a,m(m(F(b,c,d),x),e));return m(l(a,s),b)};var o=function(a,b,c,d,x,s,e){a=m(a,m(m(G(b,c,d),x),e));return m(l(a,s),b)};var p=function(a,b,c,d,x,s,e){a=m(a,m(m(H(b,c,d),x),e));return m(l(a,s),b)};var q=function(a,b,c,d,x,s,e){a=m(a,m(m(I(b,c,d),x),e));return m(l(a,s),b)};var r=function(a){var b;var c=a.length;var d=c+8;var e=(d-(d%64))/64;var f=(e+1)*16;var g=Array(f-1);var h=0;var i=0;while(i>>29;return g};var t=function(a){var b="",WordToHexValue_temp="",lByte,lCount;for(lCount=0;lCount<=3;lCount++){lByte=(a>>>(lCount*8))&255;WordToHexValue_temp="0"+lByte.toString(16);b=b+WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2)}return b};var x=Array();var k,AA,BB,CC,DD,a,b,c,d;var u=7,S12=12,S13=17,S14=22;var v=5,S22=9,S23=14,S24=20;var w=4,S32=11,S33=16,S34=23;var A=6,S42=10,S43=15,S44=21;j=this.utf8_encode(j);x=r(j);a=0x67452301;b=0xEFCDAB89;c=0x98BADCFE;d=0x10325476;for(k=0;k127)&&(c<2048)){b[ac++]=String.fromCharCode((c>>6)|192);b[ac++]=String.fromCharCode((c&63)|128)}else{b[ac++]=String.fromCharCode((c>>12)|224);b[ac++]=String.fromCharCode(((c>>6)&63)|128);b[ac++]=String.fromCharCode((c&63)|128)}}return b.join('')}};window.$P=C()})(); + +// SWFObject 1.5.1 [http://blog.deconcept.com/swfobject/] +if(typeof deconcept=="undefined"){var deconcept={};}if(typeof deconcept.util=="undefined"){deconcept.util={};}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil={};}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params={};this.variables={};this.attributes=[];if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10]||"";},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15]||"";},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=[];var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject; diff --git a/upload/misc/js/main.js b/upload/misc/js/main.js new file mode 100644 index 000000000..b764e14d7 --- /dev/null +++ b/upload/misc/js/main.js @@ -0,0 +1,515 @@ +/** + * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ + * + * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + */ +if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject; + +// prototype $ +function $p() { + var elements = new Array(); + + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + + if (arguments.length == 1) + return element; + + elements.push(element); + } + + return elements; +} + +// from http://www.dustindiaz.com/rock-solid-addevent/ +function addEvent( obj, type, fn ) { + if (obj.addEventListener) { + obj.addEventListener( type, fn, false ); + EventCache.add(obj, type, fn); + } + else if (obj.attachEvent) { + obj["e"+type+fn] = fn; + obj[type+fn] = function() { obj["e"+type+fn]( window.event ); } + obj.attachEvent( "on"+type, obj[type+fn] ); + EventCache.add(obj, type, fn); + } + else { + obj["on"+type] = obj["e"+type+fn]; + } +} + +var EventCache = function(){ + var listEvents = []; + return { + listEvents : listEvents, + add : function(node, sEventName, fHandler){ + listEvents.push(arguments); + }, + flush : function(){ + var i, item; + for(i = listEvents.length - 1; i >= 0; i = i - 1){ + item = listEvents[i]; + if(item[0].removeEventListener){ + item[0].removeEventListener(item[1], item[2], item[3]); + }; + if(item[1].substring(0, 2) != "on"){ + item[1] = "on" + item[1]; + }; + if(item[0].detachEvent){ + item[0].detachEvent(item[1], item[2]); + }; + item[0][item[1]] = null; + }; + } + }; +}(); +if (document.all) { addEvent(window,'unload',EventCache.flush); } + +function imgFit (img, maxW) +{ + if (typeof(img.naturalHeight) == 'undefined') { + img.naturalHeight = img.height; + img.naturalWidth = img.width; + } +//alert(img.src+'\n\n'+'H: '+img.height+' natH: '+img.naturalHeight+'\n'+'W: '+img.width+' natW: '+img.naturalWidth+' maxW: '+maxW); + if (img.width > maxW) { + img.height = Math.round((maxW/img.width)*img.height); + img.width = maxW; + img.title = 'Click image to view full size'; + img.style.cursor = 'move'; + return false; + } + else if (img.width == maxW && img.width < img.naturalWidth) { + img.height = img.naturalHeight; + img.width = img.naturalWidth; + img.title = 'Click to fit in the browser window'; + return false; + } + else { + return true; + } +} + +function toggle_block (id) +{ + var el = document.getElementById(id); + el.style.display = (el.style.display == 'none') ? '' : 'none'; +} + +function toggle_disabled (id, val) +{ + document.getElementById(id).disabled = (val) ? 0 : 1; +} + +function rand (min, max) +{ + return min + Math.floor((max - min + 1) * Math.random()); +} + +// +// Cookie functions [based on ???] +// +/** + * name Name of the cookie + * value Value of the cookie + * [days] Number of days to remain active (default: end of current session) + * [path] Path where the cookie is valid (default: path of calling document) + * [domain] Domain where the cookie is valid + * (default: domain of calling document) + * [secure] Boolean value indicating if the cookie transmission requires a + * secure transmission + */ +function setCookie (name, value, days, path, domain, secure) +{ + if (days != 'SESSION') { + var date = new Date(); + days = days || 365; + date.setTime(date.getTime() + days*24*60*60*1000); + var expires = date.toGMTString(); + } else { + var expires = ''; + } + + document.cookie = + name +'='+ escape(value) + + ((expires) ? '; expires='+ expires : '') + + ((path) ? '; path='+ path : ((cookiePath) ? '; path='+ cookiePath : '')) + + ((domain) ? '; domain='+ domain : ((cookieDomain) ? '; domain='+ cookieDomain : '')) + + ((secure) ? '; secure' : ((cookieSecure) ? '; secure' : '')); +} + +/** + * Returns a string containing value of specified cookie, + * or null if cookie does not exist. + */ +function getCookie (name) +{ + var c, RE = new RegExp('(^|;)\\s*'+ name +'\\s*=\\s*([^\\s;]+)', 'g'); + return (c = RE.exec(document.cookie)) ? c[2] : null; +} + +/** + * name name of the cookie + * [path] path of the cookie (must be same as path used to create cookie) + * [domain] domain of the cookie (must be same as domain used to create cookie) + */ +function deleteCookie (name, path, domain) +{ + setCookie(name, '', -1, path, domain); +} + +// Simple Javascript Browser/OS detection (based on "Harald Hope, Tapio Markula, http://techpatterns.com ver 2.0.1") +var ua = navigator.userAgent; + +var os_win = ( navigator.appVersion.indexOf( 'Win' ) != -1 ); +var os_mac = ( navigator.appVersion.indexOf( 'Mac' ) != -1 ); +var os_lin = ( ua.indexOf( 'Linux' ) != -1 ); + +var is_opera = ( ua.indexOf( 'Opera' ) != -1 ); +var is_konq = ( ua.indexOf( 'Konqueror' ) != -1 ); +var is_saf = ( ua.indexOf( 'Safari' ) != -1 ); +var is_moz = ( ua.indexOf( 'Gecko' ) != -1 && !is_saf && !is_konq); +var is_ie = ( document.all && !is_opera ); +var is_ie4 = ( is_ie && !document.getElementById ); + +// ie5x tests only for functionality +// Opera will register true in this test if set to identify as IE 5 +var is_ie5x = ( document.all && document.getElementById ); +var os_ie5mac = ( os_mac && is_ie5x ); +var os_ie5xwin = ( os_win && is_ie5x ); + +// Copy text to clipboard. Originally got from decompiled `php_manual_en.chm`. +function ie_copyTextToClipboard (fromNode) +{ + var txt = document.body.createTextRange(); + txt.moveToElementText(fromNode); + return txt.execCommand("Copy"); +} + +// Clickable LABELs in IE +// based on http://web.tampabay.rr.com/bmerkey/examples/clickable-labels.html +function ie6_make_clickable_labels () +{ + var labels = document.getElementsByTagName("label"); + for (var i=0, len=labels.length; i'); + fixSqlLog(); + } + if (response.update_ids) { + for (id in response.update_ids) { + $('#'+id).html( response.update_ids[id] ); + } + } + if (response.prompt_password) { + var user_password = prompt('Please enter your password (for mod/admin session)', ''); + if (user_password) { + var req = ajax.request[action]; + req.user_password = user_password; + ajax.exec(req); + } + else { + ajax.clearActionState(action); + ajax.showErrorMsg('Wrong password'); + } + } + else if (response.prompt_confirm) { + if (window.confirm(response.confirm_msg)) { + var req = ajax.request[action]; + req.confirmed = 1; + ajax.exec(req); + } + else { + ajax.clearActionState(action); + } + } + else if (response.error_code) { + ajax.showErrorMsg(response.error_msg); + $('.loading-1').removeClass('loading-1').html('error'); + } + else { + ajax.callback[action](response); + ajax.clearActionState(action); + } + }, + + error: function(xml, desc) { + }, + + clearActionState: function(action){ + ajax.state[action] = ajax.request[action] = ''; + }, + + showErrorMsg: function(msg){ + alert(msg); + }, + + callInitFn: function(event) { + event.stopPropagation(); + var params = ajax.params[$(this).attr('id')]; + var action = params.action; + if (ajax.state[action] == 'readyToSubmit' || ajax.state[action] == 'error') { + return false; + } else { + ajax.state[action] = 'readyToSubmit'; + } + ajax.init[action](params); + }, + + setStatusBoxPosition: function($el) { + var newTop = $(document).scrollTop(); + var rCorner = $(document).scrollLeft() + $(window).width() - ($.browser.opera ? 14 : 8); + var newLeft = Math.max(0, rCorner - $el.width()); + $el.css({ top: newTop, left: newLeft }); + }, + + makeEditable: function(rootElementId, editableType) { + var $root = $('#'+rootElementId); + var $editable = $('.editable', $root); + var inputsHtml = $('#editable-tpl-'+editableType).html(); + $editable.hide().after(inputsHtml); + var $inputs = $('.editable-inputs', $root); + if (editableType == 'input' || editableType == 'textarea') { + $('.editable-value', $inputs).val( $.trim($editable.text()) ); + } + $('input.editable-submit', $inputs).click(function(){ + var params = ajax.params[rootElementId]; + var $val = $('.editable-value', '#'+rootElementId); + params.value = ($val.size() == 1) ? $val.val() : $val.filter('[checked]').val(); + params.submit = true; + ajax.init[params.action](params); + }); + $('input.editable-cancel', $inputs).click(function(){ + ajax.restoreEditable(rootElementId); + }); + $inputs.show().find('.editable-value').focus(); + $root.removeClass('editable-container'); + }, + + restoreEditable: function(rootElementId, newValue) { + var $root = $('#'+rootElementId); + var $editable = $('.editable', $root); + $('.editable-inputs', $root).remove(); + if (newValue) { + $editable.text(newValue); + } + $editable.show(); + ajax.clearActionState( ajax.params[rootElementId].action ); + ajax.params[rootElementId].submit = false; + $root.addClass('editable-container'); + } +}; + +$(document).ready(function(){ + // Setup ajax-loading box + $("#ajax-loading").ajaxStart(function(){ + $("#ajax-error").hide(); + $(this).show(); + ajax.setStatusBoxPosition($(this)); + }); + $("#ajax-loading").ajaxStop(function(){ $(this).hide(); }); + + // Setup ajax-error box + $("#ajax-error").ajaxError(function(req, xml){ + var status = xml.status; + var text = xml.statusText; + if (status == 200) { + status = ''; + text = 'invalid data format'; + } + $(this).html( + "Ajax error in: "+ ajax.url +"
    "+ status +" "+ text +"" + ).show(); + ajax.setStatusBoxPosition($(this)); + }); + + // Bind ajax events + $('var.ajax-params').each(function(){ + var params = $.evalJSON( $(this).html() ); + params.event = params.event || 'dblclick'; + ajax.params[params.id] = params; + $("#"+params.id).bind(params.event, ajax.callInitFn); + if (params.event == 'click' || params.event == 'dblclick') { + $("#"+params.id).addClass('editable-container'); + } + }); +}); diff --git a/upload/misc/js/source/jquery.js b/upload/misc/js/source/jquery.js new file mode 100644 index 000000000..462cde56c --- /dev/null +++ b/upload/misc/js/source/jquery.js @@ -0,0 +1,4376 @@ +/*! + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){ + +var + // Will speed up references to window, and allows munging its name. + window = this, + // Will speed up references to undefined, and allows munging its name. + undefined, + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + // Map over the $ in case of overwrite + _$ = window.$, + + jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem && elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem || [] ); + ret.context = document; + ret.selector = selector; + return ret; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.isArray( selector ) ? + selector : + jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3.2", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + Array.prototype.slice.call( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: [].push, + sort: [].sort, + splice: [].splice, + + find: function( selector ) { + if ( this.length === 1 ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + })), "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var html = this.outerHTML; + if ( !html ) { + var div = this.ownerDocument.createElement("div"); + div.appendChild( this.cloneNode(true) ); + html = div.innerHTML; + } + + return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; + } else + return this.cloneNode(true); + }); + + // Copy the events from the original to the clone + if ( events === true ) { + var orig = this.find("*").andSelf(), i = 0; + + ret.find("*").andSelf().each(function(){ + if ( this.nodeName !== orig[i].nodeName ) + return; + + var events = jQuery.data( orig[i], "events" ); + + for ( var type in events ) { + for ( var handler in events[ type ] ) { + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + } + } + + i++; + }); + } + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, + closer = 0; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { + jQuery.data(cur, "closest", closer); + return cur; + } + cur = cur.parentNode; + closer++; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), this.length > 1 || i > 0 ? + fragment.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && /\S/.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force, extra ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) + return; + + jQuery.each( which, function() { + if ( !extra ) + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + if ( extra === "margin" ) + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; + else + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + } + + if ( elem.offsetWidth !== 0 ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, Math.round(val)); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "
    ", "
    " ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and This is a p

    + * @before $.metadata.setType("elem", "script") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a nested script element + * + * @param String type The encoding type + * @param String name The name of the attribute to be used to get metadata (optional) + * @cat Plugins/Metadata + * @descr Sets the type of encoding to be used when loading metadata for the first time + * @type undefined + * @see metadata() + */ + +(function($) { + +$.extend({ + metadata : { + defaults : { + type: 'class', + name: 'metadata', + cre: /({.*})/, + single: 'metadata' + }, + setType: function( type, name ){ + this.defaults.type = type; + this.defaults.name = name; + }, + get: function( elem, opts ){ + var settings = $.extend({},this.defaults,opts); + // check for empty string in single property + if ( !settings.single.length ) settings.single = 'metadata'; + + var data = $.data(elem, settings.single); + // returned cached data if it already exists + if ( data ) return data; + + data = "{}"; + + if ( settings.type == "class" ) { + var m = settings.cre.exec( elem.className ); + if ( m ) + data = m[1]; + } else if ( settings.type == "elem" ) { + if( !elem.getElementsByTagName ) return; + var e = elem.getElementsByTagName(settings.name); + if ( e.length ) + data = $.trim(e[0].innerHTML); + } else if ( elem.getAttribute != undefined ) { + var attr = elem.getAttribute( settings.name ); + if ( attr ) + data = attr; + } + + if ( data.indexOf( '{' ) <0 ) + data = "{" + data + "}"; + + data = eval("(" + data + ")"); + + $.data( elem, settings.single, data ); + return data; + } + } +}); + +/** + * Returns the metadata object for the first member of the jQuery object. + * + * @name metadata + * @descr Returns element's metadata object + * @param Object opts An object contianing settings to override the defaults + * @type jQuery + * @cat Plugins/Metadata + */ +$.fn.metadata = function( opts ){ + return $.metadata.get( this[0], opts ); +}; + +})(jQuery); \ No newline at end of file diff --git a/upload/misc/js/source/sprintf.js b/upload/misc/js/source/sprintf.js new file mode 100644 index 000000000..93c22a1b9 --- /dev/null +++ b/upload/misc/js/source/sprintf.js @@ -0,0 +1,182 @@ +/* Copyright (c) 2005 Scott S. McCoy + * This was originally a non-object oriented interface + * Function printf(format_string,arguments...) + * Javascript emulation of the C printf function (modifiers and argument types + * "p" and "n" are not supported due to language restrictions) + * + * Copyright 2003 K&L Productions. All rights reserved + * http://www.klproductions.com + * + * Terms of use: This function can be used free of charge IF this header is not + * modified and remains with the function code. + * + * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility + * for anything. + ********************************************************************************/ + +String.prototype.sprintf = function () { + var fstring = this.toString(); + + var pad = function(str,ch,len) { var ps=''; + for(var i=0; i0?str+ps:ps+str; + }; + var processFlags = function(flags,width,rs,arg) { + var pn = function(flags,arg,rs) { + if(arg>=0) { + if(flags.indexOf(' ')>=0) { + rs = ' ' + rs; + } else if(flags.indexOf('+')>=0) { + rs = '+' + rs; + } + } else { + rs = '-' + rs; + } + return rs; + }; + var iWidth = parseInt(width,10); + if(width.charAt(0) == '0') { + var ec=0; + if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) { + ec++; + } + if(rs.length<(iWidth-ec)) { + rs = pad(rs,'0',rs.length-(iWidth-ec)); + } + return pn(flags,arg,rs); + } + rs = pn(flags,arg,rs); + if(rs.length=0) { + rs = rs.replace(/^(.*)(e.*)$/,'$1.$2'); + } + return processFlags(flags,width,rs,arg); + }; + converters.f = function(flags,width,precision,arg) { + iPrecision = parseInt(precision, 10); + if(isNaN(iPrecision)) { + iPrecision = 6; + } + rs = (Math.abs(arg)).toFixed(iPrecision); + if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) { + rs = rs + '.'; + } + return processFlags(flags,width,rs,arg); + }; + converters.G = function(flags,width,precision,arg) { + return (converters.g(flags,width,precision,arg)).toUpperCase(); + }; + converters.g = function(flags,width,precision,arg) { + iPrecision = parseInt(precision, 10); + absArg = Math.abs(arg); + rse = absArg.toExponential(); + rsf = absArg.toFixed(6); + if(!isNaN(iPrecision)) { + rsep = absArg.toExponential(iPrecision); + rse = rsep.length < rse.length ? rsep : rse; + rsfp = absArg.toFixed(iPrecision); + rsf = rsfp.length < rsf.length ? rsfp : rsf; + } + if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) { + rse = rse.replace(/^(.*)(e.*)$/,'$1.$2'); + } + if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) { + rsf = rsf + '.'; + } + rs = rse.length=0) { + rs='0'+rs; + } + return processFlags(flags,width,rs,arg); + }; + converters.X = function(flags,width,precision,arg) { + return (converters.x(flags,width,precision,arg)).toUpperCase(); + }; + converters.x = function(flags,width,precision,arg) { + var iPrecision=parseInt(precision, 10); + arg = Math.abs(arg); + var rs = Math.round(arg).toString(16); + if(rs.length=0) { + rs='0x'+rs; + } + return processFlags(flags,width,rs,arg); + }; + converters.s = function(flags,width,precision,arg) { + var iPrecision=parseInt(precision, 10); + var rs = arg; + if(rs.length > iPrecision) { + rs = rs.substring(0,iPrecision); + } + return processFlags(flags,width,rs,0); + }; + + farr = fstring.split('%'); + retstr = farr[0]; + fpRE = /^([-+ #]*)(?:(\d*)\$|)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/; + for(var i = 1; i', ''); + $message .= '

    '; + } + else if (count($req_topics) != 1) + { + $message .= sprintf($lang['CLICK_RETURN_MODCP'], '', ''); + $message .= '

    '; + } + + $message .= sprintf($lang['CLICK_RETURN_FORUM'], '', ''); + + return $message; +} + +function validate_topics ($forum_id, &$req_topics, &$topic_titles) +{ + $valid_topics = $valid_titles = array(); + + if ($topic_csv = get_id_csv($req_topics)) + { + $sql = "SELECT topic_id, topic_title FROM ". BB_TOPICS ." WHERE topic_id IN($topic_csv) AND forum_id = $forum_id"; + + foreach (DB()->fetch_rowset($sql) as $row) + { + $valid_topics[] = $row['topic_id']; + $valid_titles[] = $row['topic_title']; + } + } + + $req_topics = $valid_topics; + $topic_titles = $valid_titles; +} + +// Obtain initial vars +$forum_id = (int) @$_REQUEST['f']; +$topic_id = (int) @$_REQUEST['t']; +$post_id = (int) @$_REQUEST['p']; + +$start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; +$confirmed = isset($_POST['confirm']); + +$mode = $topic_title = ''; + +if (isset($_REQUEST['mode'])) +{ + $mode = (string) $_REQUEST['mode']; +} +else +{ + if (isset($_REQUEST['delete']) || @$_POST['mod_action'] === 'topic_delete') + { + $mode = 'delete'; + } + else if (isset($_REQUEST['move']) || @$_POST['mod_action'] === 'topic_move') + { + $mode = 'move'; + } + else if (isset($_REQUEST['lock']) || @$_POST['mod_action'] === 'topic_lock') + { + $mode = 'lock'; + } + else if (isset($_REQUEST['unlock']) || @$_POST['mod_action'] === 'topic_unlock') + { + $mode = 'unlock'; + } +} + +// Obtain relevant data +if ($topic_id) +{ + $sql = " + SELECT + f.forum_id, f.forum_name, f.forum_topics, f.self_moderated, + t.topic_first_post_id, t.topic_poster + FROM ". BB_TOPICS ." t, ". BB_FORUMS ." f + WHERE t.topic_id = $topic_id + AND f.forum_id = t.forum_id + LIMIT 1 + "; + + if (!$topic_row = DB()->fetch_row($sql)) + { + message_die(GENERAL_MESSAGE, 'Topic_post_not_exist'); + } + + $forum_id = $topic_row['forum_id']; + $forum_name = $topic_row['forum_name']; + $forum_topics = (!$topic_row['forum_topics']) ? 1 : $topic_row['forum_topics']; +} +else if ($forum_id) +{ + $sql = "SELECT forum_name, forum_topics FROM ". BB_FORUMS ." WHERE forum_id = $forum_id LIMIT 1"; + + if (!$topic_row = DB()->fetch_row($sql)) + { + message_die(GENERAL_MESSAGE, 'Forum_not_exist'); + } + + $forum_name = $topic_row['forum_name']; + $forum_topics = (!$topic_row['forum_topics']) ? 1 : $topic_row['forum_topics']; +} +else +{ + message_die(GENERAL_MESSAGE, 'Invalid request'); +} + +// Start session management +$user->session_start(array('req_login' => true)); + +// Check if user did or did not confirm. If they did not, forward them to the last page they were on +if (isset($_POST['cancel']) || IS_GUEST) +{ + $redirect = "index.php"; + + if ($topic_id || $forum_id) + { + $redirect = ($topic_id) ? TOPIC_URL . $topic_id : FORUM_URL . $forum_id; + } + redirect($redirect); +} + +// Start auth check +$is_auth = auth(AUTH_ALL, $forum_id, $userdata); +$is_moderator = (IS_MOD || IS_ADMIN); + +if ($mode == 'ip') +{ + // Moderator can view IP in all forums + $is_auth['auth_mod'] = $is_moderator; +} +else if ($mode == 'move' && !$is_auth['auth_mod']) +{ + // User can move his own topic if this forum is "self_moderated" + if ($topic_id && $topic_row['self_moderated'] && $topic_row['topic_poster'] == $userdata['user_id']) + { + $is_auth['auth_mod'] = true; + + $_POST['insert_bot_msg'] = 1; + unset($_POST['topic_id_list']); + unset($_POST['move_leave_shadow']); + } +} + +// Exit if user not authorized +if (!$is_auth['auth_mod']) +{ + message_die(GENERAL_MESSAGE, $lang['NOT_MODERATOR'], $lang['NOT_AUTHORISED']); +} + +// Redirect to login page if not admin session +if ($is_moderator && !$userdata['session_admin']) +{ + $redirect = isset($_POST['redirect']) ? $_POST['redirect'] : $_SERVER['REQUEST_URI']; + redirect("login.php?redirect=$redirect&admin=1"); +} + +// +// Get required vars +// +$req_topics = $topic_csv = $topic_titles = $hidden_fields = array(); + +switch ($mode) +{ + case 'delete': + case 'move': + case 'lock': + case 'unlock': + case 'set_download': + case 'unset_download': + + if (empty($_POST['topic_id_list']) && empty($topic_id)) + { + message_die(GENERAL_MESSAGE, $lang['NONE_SELECTED']); + } + + $req_topics = isset($_POST['topic_id_list']) ? $_POST['topic_id_list'] : $topic_id; + validate_topics($forum_id, &$req_topics, &$topic_titles); + + if (!$req_topics OR !$topic_csv = get_id_csv($req_topics)) + { + message_die(GENERAL_MESSAGE, $lang['NONE_SELECTED']); + } + + $hidden_fields = array( + 'sid' => $userdata['session_id'], + 'mode' => $mode, + 'f' => $forum_id, + 't' => $topic_id, + ); + foreach ($req_topics as $req_topic_id) + { + $hidden_fields['topic_id_list'][] = $req_topic_id; + } + + break; +} + +// +// Perform action or show confirm message +// +switch ($mode) +{ + case 'delete': + + if (!$is_auth['auth_delete']) + { + message_die(GENERAL_MESSAGE, sprintf($lang['SORRY_AUTH_DELETE'], $is_auth['auth_delete_type'])); + } + + if ($confirmed) + { + $result = topic_delete($req_topics, $forum_id); + + $msg = ($result) ? $lang['TOPICS_REMOVED'] : 'No topics were removed'; + message_die(GENERAL_MESSAGE, return_msg_mcp($msg)); + } + else + { + print_confirmation(array( + 'QUESTION' => $lang['CONFIRM_DELETE_TOPIC'], + 'ITEMS_LIST' => join("\n
  • \n
  • \n", $topic_titles), + 'FORM_ACTION' => "modcp.php", + 'HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + )); + } + break; + + case 'move': + + if ($confirmed) + { + $result = topic_move($req_topics, $_POST['new_forum'], $forum_id, isset($_POST['move_leave_shadow']), isset($_POST['insert_bot_msg'])); + + $msg = ($result) ? $lang['TOPICS_MOVED'] : $lang['NO_TOPICS_MOVED']; + message_die(GENERAL_MESSAGE, return_msg_mcp($msg)); + } + else + { + if (IS_ADMIN) + { + $forum_select_mode = 'admin'; + } + else + { + $not_auth_forums_csv = $user->get_not_auth_forums(AUTH_VIEW); + $forum_select_mode = explode(',', $not_auth_forums_csv); + } + + $forum_select = get_forum_select($forum_select_mode, 'new_forum', $forum_id); + + $template->assign_vars(array( + 'TPL_MODCP_MOVE' => true, + 'SHOW_LEAVESHADOW' => $is_moderator, + 'SHOW_BOT_OPTIONS' => $is_moderator, + 'L_LEAVE_MSG' => $lang['BOT_LEAVE_MSG_MOVED'], + + 'MESSAGE_TITLE' => $lang['CONFIRM'], + 'MESSAGE_TEXT' => $lang['CONFIRM_MOVE_TOPIC'], + 'TOPIC_TITLES' => join("\n
  • \n
  • \n", $topic_titles), + + 'L_LEAVESHADOW' => $lang['LEAVE_SHADOW_TOPIC'], + + 'S_FORUM_SELECT' => $forum_select, + 'S_MODCP_ACTION' => "modcp.php", + 'S_HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + )); + + $template->set_filenames(array('body' => 'modcp.tpl')); + } + break; + + case 'lock': + case 'unlock': + $lock = ($mode == 'lock'); + $new_topic_status = ($lock) ? TOPIC_LOCKED : TOPIC_UNLOCKED; + + $sql = " + SELECT topic_id, topic_title + FROM ". BB_TOPICS ." + WHERE topic_id IN($topic_csv) + AND forum_id = $forum_id + AND topic_status != ". TOPIC_MOVED ." + AND topic_status != $new_topic_status + "; + + $topic_csv = array(); + + foreach (DB()->fetch_rowset($sql) as $row) + { + $topic_csv[] = $row['topic_id']; + $log_topics[$row['topic_id']] = $row['topic_title']; + } + + if (!$topic_csv = get_id_csv($topic_csv)) + { + message_die(GENERAL_MESSAGE, $lang['NONE_SELECTED']); + } + + DB()->query(" + UPDATE ". BB_TOPICS ." SET + topic_status = $new_topic_status + WHERE topic_id IN($topic_csv) + "); + + // Log action + $type = ($lock) ? 'mod_topic_lock' : 'mod_topic_unlock'; + + foreach ($log_topics as $topic_id => $topic_title) + { + $log_action->mod($type, array( + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'topic_title' => $topic_title, + )); + } + + $msg = ($lock) ? $lang['TOPICS_LOCKED'] : $lang['TOPICS_UNLOCKED']; + message_die(GENERAL_MESSAGE, return_msg_mcp($msg)); + + break; + + // Set or unset topics DL-type + case 'set_download': + case 'unset_download': + $set_download = ($mode == 'set_download'); + $new_dl_type = ($set_download) ? TOPIC_DL_TYPE_DL : TOPIC_DL_TYPE_NORMAL; + + DB()->query(" + UPDATE ". BB_TOPICS ." SET + topic_dl_type = $new_dl_type + WHERE topic_id IN($topic_csv) + AND forum_id = $forum_id + AND topic_moved_id = 0 + "); + + if ($mode == 'unset_download') + { + clear_dl_list($topic_csv); + } + + $msg = ($set_download) ? $lang['TOPICS_DOWN_SETS'] : $lang['TOPICS_DOWN_UNSETS']; + message_die(GENERAL_MESSAGE, return_msg_mcp($msg)); + + break; + + case 'split': + //mpd + $delete_posts = isset($_POST['delete_posts']); + $split = (isset($_POST['split_type_all']) || isset($_POST['split_type_beyond'])); + $posts = (isset($_POST['post_id_list'])) ? $_POST['post_id_list'] : array(); + $start = /* (isset($_POST['start'])) ? intval($_POST['start']) : */ 0; + $topic_first_post_id = (isset($topic_row['topic_first_post_id'])) ? $topic_row['topic_first_post_id'] : ''; + + $post_id_sql = $req_post_id_sql = array(); + + if (($split || $delete_posts) && ($posts && $topic_id && $forum_id && $topic_first_post_id) && $confirmed) + { + foreach ($posts as $post_id) + { + if ($pid = intval($post_id)) + { + $req_post_id_sql[] = $pid; + } + } + if ($req_post_id_sql = join(',', $req_post_id_sql)) + { + $sql = "SELECT post_id + FROM ". BB_POSTS ." + WHERE post_id IN($req_post_id_sql) + AND post_id != $topic_first_post_id + AND topic_id = $topic_id + AND forum_id = $forum_id"; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not get post id information', '', __LINE__, __FILE__, $sql); + } + if ($rowset = DB()->sql_fetchrowset($result)) + { + foreach ($rowset as $rid => $row) + { + $post_id_sql[] = $row['post_id']; + } + $post_id_sql = join(',', $post_id_sql); + } + } + } + + if ($post_id_sql && $split) + //mpd end + { + $sql = "SELECT post_id, poster_id, topic_id, post_time + FROM " . BB_POSTS . " + WHERE post_id IN ($post_id_sql) + ORDER BY post_time ASC"; + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not get post information', '', __LINE__, __FILE__, $sql); + } + + if ($row = DB()->sql_fetchrow($result)) + { + $first_poster = $row['poster_id']; + $topic_id = $row['topic_id']; + $post_time = $row['post_time']; + + $user_id_sql = ''; + $post_id_sql = ''; + do + { + $user_id_sql .= (($user_id_sql != '') ? ', ' : '') . intval($row['poster_id']); + $post_id_sql .= (($post_id_sql != '') ? ', ' : '') . intval($row['post_id']);; + } + while ($row = DB()->sql_fetchrow($result)); + + $post_subject = trim(htmlspecialchars($_POST['subject'])); + if (empty($post_subject)) + { + message_die(GENERAL_MESSAGE, $lang['EMPTY_SUBJECT']); + } + + $new_forum_id = intval($_POST['new_forum_id']); + $topic_time = time(); + + $sql = 'SELECT forum_id FROM ' . BB_FORUMS . ' + WHERE forum_id = ' . $new_forum_id; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not select from forums table', '', __LINE__, __FILE__, $sql); + } + + if (!DB()->sql_fetchrow($result)) + { + message_die(GENERAL_MESSAGE, 'New forum does not exist'); + } + + DB()->sql_freeresult($result); + + $sql = "INSERT INTO " . BB_TOPICS . " (topic_title, topic_poster, topic_time, forum_id, topic_status, topic_type) + VALUES ('" . str_replace("\'", "''", $post_subject) . "', $first_poster, " . $topic_time . ", $new_forum_id, " . TOPIC_UNLOCKED . ", " . POST_NORMAL . ")"; + if (!(DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, 'Could not insert new topic', '', __LINE__, __FILE__, $sql); + } + + $new_topic_id = DB()->sql_nextid(); + + // Update topic watch table, switch users whose posts + // have moved, over to watching the new topic + $sql = "UPDATE " . BB_TOPICS_WATCH . " + SET topic_id = $new_topic_id + WHERE topic_id = $topic_id + AND user_id IN ($user_id_sql)"; + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not update topics watch table', '', __LINE__, __FILE__, $sql); + } + + $sql_where = (!empty($_POST['split_type_beyond'])) ? " post_time >= $post_time AND topic_id = $topic_id" : "post_id IN ($post_id_sql)"; + + $sql = "UPDATE " . BB_POSTS . " + SET topic_id = $new_topic_id, forum_id = $new_forum_id + WHERE $sql_where"; + if (!DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not update posts table', '', __LINE__, __FILE__, $sql); + } + + //bot + if (isset($_POST['after_split_to_old'])) + { + insert_post('after_split_to_old', $topic_id, $forum_id, '', $new_topic_id, trim($_POST['subject'])); + } + if (isset($_POST['after_split_to_new'])) + { + insert_post('after_split_to_new', $new_topic_id, $new_forum_id, $forum_id, $new_topic_id, '', $topic_id); + } + //bot end + + sync('topic', array($topic_id, $new_topic_id)); + sync('forum', array($forum_id, $new_forum_id)); + + //bot + $message = $lang['TOPIC_SPLIT'] .'

    '. $lang['TOPIC_SPLIT_OLD'] .''; + $message .= '  ::  '. $lang['TOPIC_SPLIT_NEW'] .''; + //bot end + + // Log action + $log_action->mod('mod_topic_split', array( + 'forum_id' => $forum_id, + 'forum_id_new' => $new_forum_id, + 'topic_id' => $topic_id, + 'topic_title' => get_topic_title($topic_id), + 'topic_id_new' => $new_topic_id, + 'topic_title_new' => htmlCHR($_POST['subject']), + )); + + message_die(GENERAL_MESSAGE, $message); + } + } + //mpd + else if ($post_id_sql && $delete_posts) + { + if (!$is_auth['auth_delete']) + { + message_die(GENERAL_MESSAGE, sprintf($lang['SORRY_AUTH_DELETE'], $is_auth['auth_delete_type'])); + } + + // Delete posts + $result = post_delete(explode(',', $post_id_sql)); + + $msg = ($result) ? $lang['DELETE_POSTS_SUCCESFULLY'] : 'No posts were removed'; + message_die(GENERAL_MESSAGE, return_msg_mcp($msg)); + } + //mpd end + else + { + $sql = "SELECT u.username, p.*, pt.post_text, pt.bbcode_uid, pt.post_subject, p.post_username + FROM " . BB_POSTS . " p, " . BB_USERS . " u, " . BB_POSTS_TEXT . " pt + WHERE p.topic_id = $topic_id + AND p.poster_id = u.user_id + AND p.post_id = pt.post_id + ORDER BY p.post_time ASC"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get topic/post information', '', __LINE__, __FILE__, $sql); + } + + $s_hidden_fields = ''; + + if( ( $total_posts = DB()->num_rows($result) ) > 0 ) + { + $postrow = DB()->sql_fetchrowset($result); + + $template->assign_vars(array( + 'FORUM_NAME' => htmlCHR($forum_name), + 'U_VIEW_FORUM' => FORUM_URL . $forum_id, + 'S_SPLIT_ACTION' => "modcp.php", + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + 'S_FORUM_SELECT' => get_forum_select('admin', 'new_forum_id', $forum_id), + )); + + for($i = 0; $i < $total_posts; $i++) + { + $post_id = $postrow[$i]['post_id']; + $poster_id = $postrow[$i]['poster_id']; + $poster = $postrow[$i]['username']; + + $post_date = bb_date($postrow[$i]['post_time']); + + $bbcode_uid = $postrow[$i]['bbcode_uid']; + $message = $postrow[$i]['post_text']; + $post_subject = ( isset($postrow[$i]['post_subject']) ) ? $postrow[$i]['post_subject'] : $topic_title; + + // + // If the board has HTML off but the post has HTML + // on then we process it, else leave it alone + // + $message = bbcode2html($message); + + $row_class = !($i % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars('postrow', array( + 'ROW_CLASS' => $row_class, + 'POSTER_NAME' => wbr($poster), + 'POST_DATE' => $post_date, + 'POST_SUBJECT' => $post_subject, + 'MESSAGE' => $message, + + 'CHECKBOX' => (defined('BEGIN_CHECKBOX')) ? TRUE : FALSE, + 'POST_ID' => $post_id, + 'ROW_ID' => $i, + 'CB_ID' => 'cb_'. $i + )); + + if ($post_id == $topic_first_post_id) + { + define('BEGIN_CHECKBOX', TRUE); + } + } + } + } + $template->set_filenames(array('body' => 'modcp_split.tpl')); + break; + + case 'ip': + $anon = ANONYMOUS; + + $rdns_ip_num = ( isset($_GET['rdns']) ) ? $_GET['rdns'] : ""; + + if ( !$post_id ) + { + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_POST']); + } + + // Look up relevent data for this post + $sql = "SELECT * + FROM " . BB_POSTS . " + WHERE post_id = $post_id + AND forum_id = $forum_id"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get poster IP information', '', __LINE__, __FILE__, $sql); + } + + if ( !($post_row = DB()->sql_fetchrow($result)) ) + { + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_POST']); + } + + $ip_this_post = decode_ip($post_row['poster_ip']); + $ip_this_post = ( $rdns_ip_num == $ip_this_post ) ? gethostbyaddr($ip_this_post) : $ip_this_post; + + $poster_id = $post_row['poster_id']; + + $template->assign_vars(array( + 'TPL_MODCP_IP' => true, + 'L_THIS_POST_IP' => $lang['THIS_POSTS_IP'], + 'L_OTHER_IPS' => $lang['OTHER_IP_THIS_USER'], + 'L_OTHER_USERS' => $lang['USERS_THIS_IP'], + 'IP' => $ip_this_post, + 'U_LOOKUP_IP' => "modcp.php?mode=ip&" . POST_POST_URL . "=$post_id&" . POST_TOPIC_URL . "=$topic_id&rdns=$ip_this_post&sid=" . $userdata['session_id']) + ); + + // + // Get other IP's this user has posted under + // + $where_sql = ($poster_id == $anon) ? "post_username = '{$post_row['post_username']}'" : "poster_id = $poster_id"; + + $sql = "SELECT poster_ip, COUNT(*) AS postings + FROM " . BB_POSTS . " + WHERE $where_sql + GROUP BY poster_ip + ORDER BY postings DESC + LIMIT 100"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get IP information for this user', '', __LINE__, __FILE__, $sql); + } + + if ( $row = DB()->sql_fetchrow($result) ) + { + $i = 0; + do + { + if ( $row['poster_ip'] == $post_row['poster_ip'] ) + { + $template->assign_vars(array( + 'POSTS' => $row['postings'], + )); + continue; + } + + $ip = decode_ip($row['poster_ip']); + $ip = ( $rdns_ip_num == $row['poster_ip'] || $rdns_ip_num == 'all') ? gethostbyaddr($ip) : $ip; + + $template->assign_block_vars('iprow', array( + 'ROW_CLASS' => !($i % 2) ? 'row4' : 'row5', + 'IP' => $ip, + 'POSTS' => $row['postings'], + 'U_LOOKUP_IP' => "modcp.php?mode=ip&" . POST_POST_URL . "=$post_id&" . POST_TOPIC_URL . "=$topic_id&rdns=" . $row['poster_ip'] . "&sid=" . $userdata['session_id'], + )); + + $i++; + } + while ( $row = DB()->sql_fetchrow($result) ); + } + + // + // Get other users who've posted under this IP + // + $sql = "SELECT + u.user_id, + IF(u.user_id = $anon, p.post_username, u.username) AS username, + COUNT(*) as postings + FROM " . BB_USERS ." u, " . BB_POSTS . " p + WHERE p.poster_id = u.user_id + AND p.poster_ip = '" . $post_row['poster_ip'] . "' + GROUP BY u.user_id, p.post_username + ORDER BY postings DESC + LIMIT 100"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not get posters information based on IP', '', __LINE__, __FILE__, $sql); + } + + if ( $row = DB()->sql_fetchrow($result) ) + { + $i = 0; + do + { + $id = $row['user_id']; + $username = (!$row['username']) ? $lang['GUEST'] : $row['username']; + + $template->assign_block_vars('userrow', array( + 'ROW_CLASS' => !($i % 2) ? 'row4' : 'row5', + 'USERNAME' => wbr($username), + 'POSTS' => $row['postings'], + 'L_SEARCH_POSTS' => $lang['SEARCH_USER_POSTS_SHORT'], + 'U_PROFILE' => ($id == ANONYMOUS) ? "modcp.php?mode=ip&p=$post_id&t=$topic_id" : PROFILE_URL . $id, + 'U_SEARCHPOSTS' => "search.php?search_author=1&uid=$id", + )); + + $i++; + } + while ( $row = DB()->sql_fetchrow($result) ); + } + + $template->set_filenames(array('body' => 'modcp.tpl')); + break; + + default: + bb_die('invalid action'); + break; +} + +$template->assign_vars(array('PAGE_TITLE' => $lang['MOD_CP'])); + +require(PAGE_HEADER); + +$template->pparse('body'); + +require(PAGE_FOOTER); \ No newline at end of file diff --git a/upload/opensearch_desc.xml b/upload/opensearch_desc.xml new file mode 100644 index 000000000..55481b783 --- /dev/null +++ b/upload/opensearch_desc.xml @@ -0,0 +1,8 @@ + + +TorrentPier (Forum) +TorrentPier (Forum) +UTF-8 +http://site.ru/favicon.ico + + \ No newline at end of file diff --git a/upload/opensearch_desc_bt.xml b/upload/opensearch_desc_bt.xml new file mode 100644 index 000000000..60651011e --- /dev/null +++ b/upload/opensearch_desc_bt.xml @@ -0,0 +1,8 @@ + + +TorrentPier (Tracker) +TorrentPier (Tracker) +UTF-8 +http://site.ru/favicon.ico + + \ No newline at end of file diff --git a/upload/pictures/.htaccess b/upload/pictures/.htaccess new file mode 100644 index 000000000..34ed2a11e --- /dev/null +++ b/upload/pictures/.htaccess @@ -0,0 +1,3 @@ +php_flag engine off +RemoveHandler .php .php5 .php4 .php3 .phtml .pl .asp +AddType text/plain .php .php .htm .html .phtml .pl .asp \ No newline at end of file diff --git a/upload/posting.php b/upload/posting.php new file mode 100644 index 000000000..e422d5682 --- /dev/null +++ b/upload/posting.php @@ -0,0 +1,1019 @@ +session_start(); + +// Quick Reply +$template->assign_vars(array( + 'L_FONT_SEL' => $lang['QR_FONT_SEL'], + 'L_FONT_COLOR_SEL' => $lang['QR_COLOR_SEL'], + 'L_FONT_SIZE_SEL' => $lang['QR_SIZE_SEL'], + 'L_STEEL_BLUE' => $lang['COLOR_STEEL_BLUE'], + 'L_COLOR_GRAY' => $lang['COLOR_GRAY'], + 'L_COLOR_DARK_GREEN' => $lang['COLOR_DARK_GREEN'], +)); + +// What auth type do we need to check? +$is_auth = array(); +switch ($mode) +{ + case 'newtopic': + if ($topic_type == POST_ANNOUNCE) + { + $is_auth_type = 'auth_announce'; + } + else if ($topic_type == POST_STICKY) + { + $is_auth_type = 'auth_sticky'; + } + else + { + $is_auth_type = 'auth_post'; + } + break; + case 'reply': + case 'quote': + $is_auth_type = 'auth_reply'; + break; + case 'editpost': + $is_auth_type = 'auth_edit'; + break; + case 'delete': + case 'poll_delete': + $is_auth_type = 'auth_delete'; + break; + case 'vote': + $is_auth_type = 'auth_vote'; + break; + default: + message_die(GENERAL_MESSAGE, $lang['NO_POST_MODE']); + break; +} + +// Here we do various lookups to find topic_id, forum_id, post_id etc. +// Doing it here prevents spoofing (eg. faking forum_id, topic_id or post_id +$error_msg = ''; +$post_data = array(); +switch ($mode) +{ + case 'newtopic': + if (!$forum_id) + { + message_die(GENERAL_MESSAGE, $lang['FORUM_NOT_EXIST']); + } + $sql = "SELECT * FROM ". BB_FORUMS ." WHERE forum_id = $forum_id LIMIT 1"; + break; + + case 'reply': + case 'vote': + if (!$topic_id) + { + message_die(GENERAL_MESSAGE, $lang['NO_TOPIC_ID']); + } + $sql = "SELECT f.*, t.* + FROM ". BB_FORUMS ." f, ". BB_TOPICS ." t + WHERE t.topic_id = $topic_id + AND f.forum_id = t.forum_id + LIMIT 1"; + break; + + case 'quote': + case 'editpost': + case 'delete': + case 'poll_delete': + if (!$post_id) + { + message_die(GENERAL_MESSAGE, $lang['NO_POST_ID']); + } + + $select_sql = 'SELECT f.*, t.*, p.*'; + $select_sql .= (!$submit) ? ', pt.*, u.username, u.user_id' : ''; + + $from_sql = "FROM ". BB_POSTS ." p, ". BB_TOPICS ." t, ". BB_FORUMS ." f"; + $from_sql .= (!$submit) ? ", " . BB_POSTS_TEXT . " pt, " . BB_USERS . " u" : ''; + + $where_sql = " + WHERE p.post_id = $post_id + AND t.topic_id = p.topic_id + AND f.forum_id = p.forum_id + "; + $where_sql .= (!$submit) ? " + AND pt.post_id = p.post_id + AND u.user_id = p.poster_id + " : ''; + + $sql = "$select_sql $from_sql $where_sql LIMIT 1"; + break; + + default: + message_die(GENERAL_MESSAGE, $lang['NO_VALID_MODE']); +} + +if ($post_info = DB()->fetch_row($sql)) +{ + $forum_id = $post_info['forum_id']; + $forum_name = $post_info['forum_name']; + + $is_auth = auth(AUTH_ALL, $forum_id, $userdata, $post_info); + + if ($post_info['forum_status'] == FORUM_LOCKED && !$is_auth['auth_mod']) + { + message_die(GENERAL_MESSAGE, $lang['FORUM_LOCKED']); + } + else if ($mode != 'newtopic' && $post_info['topic_status'] == TOPIC_LOCKED && !$is_auth['auth_mod']) + { + message_die(GENERAL_MESSAGE, $lang['TOPIC_LOCKED']); + } + + if ($mode == 'editpost' || $mode == 'delete' || $mode == 'poll_delete') + { + $topic_id = $post_info['topic_id']; + + $post_data['poster_post'] = ($post_info['poster_id'] == $userdata['user_id']); + $post_data['first_post'] = ($post_info['topic_first_post_id'] == $post_id); + $post_data['last_post'] = ($post_info['topic_last_post_id'] == $post_id); + $post_data['last_topic'] = ($post_info['forum_last_post_id'] == $post_id); + $post_data['has_poll'] = (bool) $post_info['topic_vote']; + $post_data['topic_type'] = $post_info['topic_type']; + $post_data['poster_id'] = $post_info['poster_id']; + + if ($post_data['first_post'] && $post_data['has_poll']) + { + $sql = "SELECT * + FROM ". BB_VOTE_DESC ." vd, ". BB_VOTE_RESULTS ." vr + WHERE vd.topic_id = $topic_id + AND vr.vote_id = vd.vote_id + ORDER BY vr.vote_option_id"; + + if (!$result = DB()->sql_query($sql)) + { + message_die(GENERAL_ERROR, 'Could not obtain vote data for this topic', '', __LINE__, __FILE__, $sql); + } + + $poll_options = array(); + $poll_results_sum = 0; + if ($row = DB()->sql_fetchrow($result)) + { + $poll_title = $row['vote_text']; + $poll_id = $row['vote_id']; + $poll_length = $row['vote_length'] / 86400; + + do + { + $poll_options[$row['vote_option_id']] = $row['vote_option_text']; + $poll_results_sum += $row['vote_result']; + } + while ($row = DB()->sql_fetchrow($result)); + } + $post_data['edit_poll'] = ((!$poll_results_sum || $is_auth['auth_mod']) && $post_data['first_post']); + } + else + { + $post_data['edit_poll'] = ($post_data['first_post'] && $is_auth['auth_pollcreate']); + } + + // Can this user edit/delete the post/poll? + if ($post_info['poster_id'] != $userdata['user_id'] && !$is_auth['auth_mod']) + { + $message = ($delete || $mode == 'delete') ? $lang['DELETE_OWN_POSTS'] : $lang['EDIT_OWN_POSTS']; + $message .= '

    '. sprintf($lang['CLICK_RETURN_TOPIC'], '', ''); + + message_die(GENERAL_MESSAGE, $message); + } + else if (!$post_data['last_post'] && !$is_auth['auth_mod'] && ($mode == 'delete' || $delete)) + { + message_die(GENERAL_MESSAGE, $lang['CANNOT_DELETE_REPLIED']); + } + else if (!$post_data['edit_poll'] && !$is_auth['auth_mod'] && ($mode == 'poll_delete' || $poll_delete)) + { + message_die(GENERAL_MESSAGE, $lang['CANNOT_DELETE_POLL']); + } + } + else + { + if ($mode == 'quote') + { + $topic_id = $post_info['topic_id']; + } + if ($mode == 'newtopic') + { + $post_data['topic_type'] = POST_NORMAL; + } + $post_data['first_post'] = ($mode == 'newtopic'); + $post_data['last_post'] = false; + $post_data['has_poll'] = false; + $post_data['edit_poll'] = false; + } + if ($mode == 'poll_delete' && !$poll_id) + { + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_POST']); + } +} +else +{ + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_POST']); +} + +// The user is not authed, if they're not logged in then redirect +// them, else show them an error message +if (!$is_auth[$is_auth_type]) +{ + if (!IS_GUEST) + { + message_die(GENERAL_MESSAGE, sprintf($lang['SORRY_'. strtoupper($is_auth_type)], $is_auth[$is_auth_type .'_type'])); + } + + switch ($mode) + { + case 'newtopic': + $redirect = "mode=newtopic&f=$forum_id"; + break; + case 'reply': + $redirect = "mode=reply&t=$topic_id"; + break; + case 'quote': + case 'editpost': + $redirect = "mode=quote&p=$post_id"; + break; + default: + $redirect = ''; + } + redirect("login.php?redirect=/posting.php?$redirect"); +} + +if ($mode == 'newtopic' && $topic_tpl && $post_info['topic_tpl_id']) +{ + require(INC_DIR .'topic_templates.php'); +} + +// BBCode +if (!$bb_cfg['allow_bbcode']) +{ + $bbcode_on = 0; +} +else +{ + $bbcode_on = ($submit || $refresh) ? (int) empty($_POST['disable_bbcode']) : $bb_cfg['allow_bbcode']; +} + +// Smilies +if (!$bb_cfg['allow_smilies']) +{ + $smilies_on = 0; +} +else +{ + $smilies_on = ($submit || $refresh) ? (int) empty($_POST['disable_smilies']) : $bb_cfg['allow_smilies']; +} + +// Notify +if ($submit || $refresh) +{ + $notify_user = (int) !empty($_POST['notify']); +} +else +{ + if (!IS_GUEST && $mode != 'newtopic' && !$userdata['user_notify']) + { + $notify_user = (int) DB()->fetch_row(" + SELECT topic_id + FROM ". BB_TOPICS_WATCH ." + WHERE topic_id = $topic_id + AND user_id = ". $userdata['user_id'] ." + "); + } + else + { + $notify_user = $userdata['user_notify']; + } +} + +$attach_sig = ($submit || $refresh) ? (int) !empty($_POST['attach_sig']) : bf($userdata['user_opt'], 'user_opt', 'attachsig'); +$update_post_time = !empty($_POST['update_post_time']); + +execute_posting_attachment_handling(); + +// если за время пока вы писали ответ, в топике появились новые сообщения, перед тем как ваше сообщение будет отправлено, выводится предупреждение с обзором этих сообщений +$topic_has_new_posts = false; + +if (!IS_GUEST && $mode != 'newtopic' && ($submit || $preview || $mode == 'quote' || $mode == 'reply') && isset($_COOKIE[COOKIE_TOPIC])) +{ + if ($topic_last_read = max(intval(@$tracking_topics[$topic_id]), intval(@$tracking_forums[$forum_id]))) + { + $sql = "SELECT p.*, pt.post_text, pt.bbcode_uid, u.username + FROM ". BB_POSTS ." p, ". BB_POSTS_TEXT ." pt, ". BB_USERS ." u + WHERE p.topic_id = ". (int) $topic_id ." + AND u.user_id = p.poster_id + AND pt.post_id = p.post_id + AND p.post_time > $topic_last_read + ORDER BY p.post_time + LIMIT ". $bb_cfg['posts_per_page']; + + if ($rowset = DB()->fetch_rowset($sql)) + { + $topic_has_new_posts = true; + + foreach ($rowset as $i => $row) + { + if ($row['poster_id'] == ANONYMOUS) + { + $new_post_username = (!$row['post_username']) ? $lang['GUEST'] : $row['post_username']; + } + else + { + $new_post_username = $row['username']; + } + + $template->assign_block_vars('new_posts', array( + 'ROW_CLASS' => !($i % 2) ? 'row1' : 'row2', + 'POSTER_NAME' => $new_post_username, + 'POSTER_NAME_JS' => addslashes($new_post_username), + 'POST_DATE' => bb_date($row['post_time'], $bb_cfg['post_date_format']), + 'MESSAGE' => get_parsed_post($row), + )); + } + $template->assign_vars(array( + 'TPL_SHOW_NEW_POSTS' => true, + )); + + set_tracks(COOKIE_TOPIC, $tracking_topics, $topic_id); + unset($rowset); + } + } +} + +// -------------------- +// What shall we do? +// +if ( ( $delete || $poll_delete || $mode == 'delete' ) && !$confirm ) +{ + if (isset($_POST['cancel'])) + { + redirect(POST_URL . "$post_id#$post_id"); + } + // + // Confirm deletion + // + $hidden_fields = array( + 'p' => $post_id, + 'mode' => ($delete || $mode == "delete") ? 'delete' : 'poll_delete', + ); + + print_confirmation(array( + 'QUESTION' => ($delete || $mode == 'delete') ? $lang['CONFIRM_DELETE'] : $lang['CONFIRM_DELETE_POLL'], + 'FORM_ACTION' => "posting.php", + 'HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + )); +} +else if ( $mode == 'vote' ) +{ + // + // Vote in a poll + // + if ( !empty($_POST['vote_id']) ) + { + $vote_option_id = intval($_POST['vote_id']); + + $sql = "SELECT vd.vote_id + FROM " . BB_VOTE_DESC . " vd, " . BB_VOTE_RESULTS . " vr + WHERE vd.topic_id = $topic_id + AND vr.vote_id = vd.vote_id + AND vr.vote_option_id = $vote_option_id + GROUP BY vd.vote_id"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain vote data for this topic', '', __LINE__, __FILE__, $sql); + } + + if ( $vote_info = DB()->sql_fetchrow($result) ) + { + $vote_id = $vote_info['vote_id']; + + $sql = "SELECT * + FROM " . BB_VOTE_USERS . " + WHERE vote_id = $vote_id + AND vote_user_id = " . $userdata['user_id']; + if ( !($result2 = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain user vote data for this topic', '', __LINE__, __FILE__, $sql); + } + + if ( !($row = DB()->sql_fetchrow($result2)) ) + { + $sql = "UPDATE " . BB_VOTE_RESULTS . " + SET vote_result = vote_result + 1 + WHERE vote_id = $vote_id + AND vote_option_id = $vote_option_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update poll result', '', __LINE__, __FILE__, $sql); + } + + $sql = "INSERT INTO " . BB_VOTE_USERS . " (vote_id, vote_user_id, vote_user_ip) + VALUES ($vote_id, " . $userdata['user_id'] . ", '". USER_IP ."')"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not insert user_id for poll", "", __LINE__, __FILE__, $sql); + } + + $message = $lang['VOTE_CAST']; + } + else + { + $message = $lang['ALREADY_VOTED']; + } + DB()->sql_freeresult($result2); + } + else + { + $message = $lang['NO_VOTE_OPTION']; + } + DB()->sql_freeresult($result); + + meta_refresh(append_sid("viewtopic.php?" . POST_TOPIC_URL . "=$topic_id")); + $message .= '

    ' . sprintf($lang['CLICK_RETURN_TOPIC'], '', ''); + message_die(GENERAL_MESSAGE, $message); + } + else + { + redirect(append_sid("viewtopic.php?" . POST_TOPIC_URL . "=$topic_id", true)); + } +} +//snp +// else if ( $submit || $confirm ) +else if ( ($submit || $confirm) && !$topic_has_new_posts ) +//snp end +{ + // + // Submit post/vote (newtopic, edit, reply, etc.) + // + $return_message = ''; + $return_meta = ''; + + switch ( $mode ) + { + case 'editpost': + case 'newtopic': + case 'reply': + $username = ( !empty($_POST['username']) ) ? $_POST['username'] : ''; + $subject = ( !empty($_POST['subject']) ) ? trim($_POST['subject']) : ''; + $message = ( !empty($_POST['message']) ) ? $_POST['message'] : ''; + $poll_title = ( isset($_POST['poll_title']) && $is_auth['auth_pollcreate'] ) ? $_POST['poll_title'] : ''; + $poll_options = ( isset($_POST['poll_option_text']) && $is_auth['auth_pollcreate'] ) ? $_POST['poll_option_text'] : ''; + $poll_length = ( isset($_POST['poll_length']) && $is_auth['auth_pollcreate'] ) ? $_POST['poll_length'] : ''; + $bbcode_uid = ''; + + prepare_post($mode, $post_data, $bbcode_on, $smilies_on, $error_msg, $username, $bbcode_uid, $subject, $message, $poll_title, $poll_options, $poll_length); + + if (!$error_msg) + { + $topic_type = ( isset($post_data['topic_type']) && $topic_type != $post_data['topic_type'] && !$is_auth['auth_sticky'] && !$is_auth['auth_announce'] ) ? $post_data['topic_type'] : $topic_type; + + submit_post($mode, $post_data, $return_message, $return_meta, $forum_id, $topic_id, $post_id, $poll_id, $topic_type, $bbcode_on, $smilies_on, $attach_sig, $bbcode_uid, str_replace("\'", "''", $username), str_replace("\'", "''", $subject), str_replace("\'", "''", $message), str_replace("\'", "''", $poll_title), $poll_options, $poll_length, $update_post_time); + } + break; + + case 'delete': + case 'poll_delete': + require_once(INC_DIR .'functions_admin.php'); + delete_post($mode, $post_data, $return_message, $return_meta, $forum_id, $topic_id, $post_id, $poll_id); + break; + } + + if (!$error_msg) + { + if (!in_array($mode, array('editpost', 'delete', 'poll_delete'))) + { + $user_id = ( $mode == 'reply' || $mode == 'newtopic' ) ? $userdata['user_id'] : $post_data['poster_id']; + update_post_stats($mode, $post_data, $forum_id, $topic_id, $post_id, $user_id); + } + $attachment_mod['posting']->insert_attachment($post_id); + + if (!$error_msg && $mode != 'poll_delete') + { + user_notification($mode, $post_data, $post_info['topic_title'], $forum_id, $topic_id, $post_id, $notify_user); + } + + if ($mode == 'newtopic' || $mode == 'reply') + { + set_tracks(COOKIE_TOPIC, $tracking_topics, $topic_id); + } + + $torrent_ext = (@$attachment_mod['posting']->extension === TORRENT_EXT || @$attachment_mod['posting']->attachment_extension_list[0] === TORRENT_EXT); + $torrent_attach = ($torrent_ext && defined('TORRENT_ATTACH_ID') && 1 == count($attachment_mod['posting']->attachment_list)); + + if ($torrent_attach && $bb_cfg['bt_newtopic_auto_reg'] && $mode == 'newtopic' && !$error_msg) + { + include(INC_DIR .'functions_torrent.php'); + tracker_register(TORRENT_ATTACH_ID, 'newtopic'); + } + + if ($mode == 'reply' && $post_info['topic_status'] == TOPIC_LOCKED) + { + $locked_warn = ' +
    + '. $lang['LOCKED_WARN'] .' +
    +


    + '; + $return_message = $locked_warn . $return_message; + } + + message_die(GENERAL_MESSAGE, $return_message); + } +} + +//snp +//if( $refresh || isset($_POST['del_poll_option']) || $error_msg != '' ) +if( $refresh || isset($_POST['del_poll_option']) || $error_msg || ($submit && $topic_has_new_posts) ) +//snp end +{ + $username = ( !empty($_POST['username']) ) ? htmlspecialchars(trim(stripslashes($_POST['username']))) : ''; + $subject = ( !empty($_POST['subject']) ) ? htmlspecialchars(trim(stripslashes($_POST['subject']))) : ''; + $message = ( !empty($_POST['message']) ) ? htmlspecialchars(trim(stripslashes($_POST['message']))) : ''; + + $poll_title = ( !empty($_POST['poll_title']) ) ? htmlspecialchars(trim(stripslashes($_POST['poll_title']))) : ''; + $poll_length = ( isset($_POST['poll_length']) ) ? max(0, intval($_POST['poll_length'])) : 0; + + $poll_options = array(); + if ( !empty($_POST['poll_option_text']) ) + { +# while( list($option_id, $option_text) = @each($_POST['poll_option_text']) ) + foreach ($_POST['poll_option_text'] as $option_id => $option_text) + { + if( isset($_POST['del_poll_option'][$option_id]) ) + { + unset($poll_options[$option_id]); + } + else if ( !empty($option_text) ) + { + $poll_options[$option_id] = htmlspecialchars(trim(stripslashes($option_text))); + } + } + } + + if ( $poll_add && !empty($_POST['add_poll_option_text']) ) + { + $poll_options[] = htmlspecialchars(trim(stripslashes($_POST['add_poll_option_text']))); + } + + if ($preview) + { + $preview_message = $msg_html = $msg_html_tidy = ''; + + $text = $message; + $text = htmlCHR($text, false, ENT_NOQUOTES); + $preview_message = bbcode2html($text); // создает объект $bbcode + + // ### DBG ### + if (0 && $user->id == 10838) + { + $text = $_POST['message']; + $text = htmlCHR($text, false, ENT_NOQUOTES); + $msg_html_tidy = $bbcode->bbcode2html($text, true); + + if (1 && !empty($_COOKIE['explain'])) + { + $msg_html = $bbcode->bbcode2html($text, false); + + $msg_html = html_compact($msg_html, true); + $msg_html_tidy = html_compact($msg_html_tidy, true); + $preview_message = html_compact($preview_message, true); + + file_write($msg_html, LOG_DIR.'before_tidy', false, true, true); + file_write($msg_html_tidy, LOG_DIR.'after_tidy', false, true, true); + } + $template->assign_vars(array( + 'MSG_HTML_TIDY' => $msg_html_tidy, + )); + } + if (IS_AM) + { + $template->assign_vars(array( + 'SPAM_WORD' => ($bbcode->found_spam) ? '
    '. htmlCHR(join("\n", $bbcode->found_spam)) .'
    ' : '', + )); + } + if (0 && $user->id == 10838) + { + $template->assign_vars(array( + 'PREVIEW_INPUT_SRC' => get_html_src($_POST['message']), + 'PREVIEW_HTML_SRC' => get_html_src($preview_message), + )); + } + // ### DBG ### + + $template->assign_vars(array( + 'TPL_PREVIEW_POST' => true, + 'PREVIEW_MSG' => $preview_message, + )); + + } +} +else +{ + // User default entry point + if ( $mode == 'newtopic' ) + { + $username = ($userdata['session_logged_in']) ? $userdata['username'] : ''; + $poll_title = ''; + $poll_length = ''; + $subject = ''; + $message = ''; + } + else if ( $mode == 'reply' ) + { + $username = ( $userdata['session_logged_in'] ) ? $userdata['username'] : ''; + $subject = ''; + $message = ''; + } + else if ( $mode == 'quote' || $mode == 'editpost' ) + { + $subject = ( $post_data['first_post'] ) ? $post_info['topic_title'] : $post_info['post_subject']; + $message = $post_info['post_text']; + + if ( $mode == 'editpost' ) + { + $attach_sig = $post_info['enable_sig']; + $bbcode_on = $post_info['enable_bbcode']; + $smilies_on = $post_info['enable_smilies']; + } + else + { + $attach_sig = bf($userdata['user_opt'], 'user_opt', 'attachsig'); + } + + if ( $post_info['bbcode_uid'] != '' ) + { + $message = preg_replace('/\:(([a-z0-9]:)?)' . $post_info['bbcode_uid'] . '/s', '', $message); + } + + $message = str_replace('<', '<', $message); + $message = str_replace('>', '>', $message); + $message = str_replace('
    ', "\n", $message); + + if ( $mode == 'quote' ) + { + if (!defined('WORD_LIST_OBTAINED')) + { + $orig_word = array(); + $replace_word = array(); + obtain_word_list($orig_word, $replace_word); + define('WORD_LIST_OBTAINED', TRUE); + } + + $msg_date = bb_date($postrow['post_time']); + + // Use trim to get rid of spaces placed there by MS-SQL 2000 + $quote_username = ( trim($post_info['post_username']) != '' ) ? $post_info['post_username'] : $post_info['username']; + $message = '[quote="' . $quote_username . '"]' . $message . '[/quote]'; + // hide user passkey + $message = preg_replace('#(?<=\?uk=)[a-zA-Z0-9]{10}(?=&)#', 'passkey', $message); + // hide sid + $message = preg_replace('#(?<=[\?&;]sid=)[a-zA-Z0-9]{12}#', 'sid', $message); + + if ( !empty($orig_word) ) + { + $subject = ( !empty($subject) ) ? preg_replace($orig_word, $replace_word, $subject) : ''; + $message = ( !empty($message) ) ? preg_replace($orig_word, $replace_word, $message) : ''; + } + + if ( !preg_match('/^Re:/', $subject) && strlen($subject) > 0 ) + { + $subject = 'Re: ' . $subject; + } + + $mode = 'reply'; + } + else + { + $username = ( $post_info['user_id'] == ANONYMOUS && !empty($post_info['post_username']) ) ? $post_info['post_username'] : ''; + } + } +} + +if ($error_msg) +{ + $template->assign_vars(array( + 'ERROR_MESSAGE' => $error_msg, + )); +} + +if (IS_GUEST || ($mode == 'editpost' && $post_info['poster_id'] == ANONYMOUS)) +{ + $template->assign_var('POSTING_USERNAME'); +} + +// +// Notify checkbox +// +if (!IS_GUEST) +{ + if ($mode != 'editpost' || ($mode == 'editpost' && $post_info['poster_id'] != ANONYMOUS)) + { + $template->assign_var('SHOW_NOTIFY_CHECKBOX'); + } +} + +// +// Topic type selection +// +$topic_type_toggle = ''; +if ( $mode == 'newtopic' || ( $mode == 'editpost' && $post_data['first_post'] ) ) +{ + $template->assign_block_vars('switch_type_toggle', array()); + + if( $is_auth['auth_sticky'] ) + { + $topic_type_toggle .= ' ' . $lang['POST_NORMAL'] . '  ' . $topic_type_toggle; + } +} +//bt +$topic_dl_type = (isset($post_info['topic_dl_type'])) ? $post_info['topic_dl_type'] : 0; + +if ($topic_dl_type || $post_info['allow_dl_topic'] || $is_auth['auth_mod']) +{ + if (!$topic_type_toggle) + { + $topic_type_toggle = $lang['POST_TOPIC_AS'] . ': '; + } + + $dl_ds = $dl_ch = $dl_hid = ''; + $dl_type_name = 'topic_dl_type'; + $dl_type_val = ($topic_dl_type) ? 1 : 0; + + if (!$post_info['allow_dl_topic'] && !$is_auth['auth_mod']) + { + $dl_ds = ' disabled="disabled" '; + $dl_hid = ''; + $dl_type_name = ''; + } + + $dl_ch = ($mode == 'editpost' && $post_data['first_post'] && $topic_dl_type) ? ' checked="checked" ' : ''; + + $topic_type_toggle .= ''; + $topic_type_toggle .= $dl_hid; +} +//bt end + +$hidden_form_fields = ''; + +switch( $mode ) +{ + case 'newtopic': + $page_title = $lang['POST_A_NEW_TOPIC']; + $hidden_form_fields .= ''; + break; + + case 'reply': + $page_title = $lang['POST_A_REPLY']; + $hidden_form_fields .= ''; + break; + + case 'editpost': + $page_title = $lang['EDIT_POST']; + $hidden_form_fields .= ''; + break; +} + +// Generate smilies listing for page output +generate_smilies('inline'); + +$template->set_filenames(array( + 'body' => 'posting.tpl', +)); + +$template->assign_vars(array( + 'FORUM_NAME' => htmlCHR($forum_name), + 'PAGE_TITLE' => $page_title, + 'POSTING_TYPE_TITLE' => $page_title, + 'POSTING_TOPIC_ID' => ($mode != 'newtopic') ? $topic_id : '', + 'POSTING_TOPIC_TITLE' => ($mode != 'newtopic') ? wbr($post_info['topic_title']) : '', + + 'SHOW_VIRTUAL_KEYBOARD' => $bb_cfg['show_virtual_keyboard'], + + 'U_VIEW_FORUM' => append_sid("viewforum.php?" . POST_FORUM_URL . "=$forum_id")) +); + +if ($mode == 'newtopic' || $post_data['first_post']) +{ + $template->assign_var('POSTING_SUBJECT'); +} + +// Update post time +if ($mode == 'editpost' && $post_data['last_post'] && !$post_data['first_post']) +{ + $template->assign_vars(array( + 'SHOW_UPDATE_POST_TIME' => ($is_auth['auth_mod'] || ($post_data['poster_post'] && $post_info['post_time'] + 3600*3 > TIMENOW)), + 'UPDATE_POST_TIME_CHECKED' => ($post_data['poster_post'] && ($post_info['post_time'] + 3600*2 > TIMENOW)), + )); +} + +// +// Output the data to the template +// +$bbcode_status = ($bb_cfg['allow_bbcode']) ? $lang['BBCODE_IS_ON'] : $lang['BBCODE_IS_OFF']; + +$template->assign_vars(array( + 'USERNAME' => @$username, + 'CAPTCHA_HTML' => (IS_GUEST) ? CAPTCHA()->get_html() : '', + 'SUBJECT' => $subject, + 'MESSAGE' => $message, + 'BBCODE_STATUS' => sprintf($bbcode_status, '', ''), + 'SMILIES_STATUS' => ($bb_cfg['allow_smilies']) ? $lang['SMILIES_ARE_ON'] : $lang['SMILIES_ARE_OFF'], + + 'L_SUBJECT' => $lang['SUBJECT'], + 'L_MESSAGE_BODY' => $lang['MESSAGE_BODY'], + 'L_CONFIRM_DELETE' => $lang['CONFIRM_DELETE'], + 'L_DISABLE_BBCODE' => $lang['DISABLE_BBCODE_POST'], + 'L_DISABLE_SMILIES' => $lang['DISABLE_SMILIES_POST'], + 'L_NOTIFY_ON_REPLY' => $lang['NOTIFY'], + 'L_DELETE_POST' => $lang['DELETE_POST'], + 'L_UPDATE_POST_TIME' => $lang['UPDATE_POST_TIME'], + + 'L_BBCODE_B_HELP' => $lang['BBCODE_B_HELP'], + 'L_BBCODE_I_HELP' => $lang['BBCODE_I_HELP'], + 'L_BBCODE_U_HELP' => $lang['BBCODE_U_HELP'], + 'L_BBCODE_Q_HELP' => $lang['BBCODE_Q_HELP'], + 'L_BBCODE_C_HELP' => $lang['BBCODE_C_HELP'], + 'L_BBCODE_L_HELP' => $lang['BBCODE_L_HELP'], + 'L_BBCODE_O_HELP' => $lang['BBCODE_O_HELP'], + 'L_BBCODE_P_HELP' => $lang['BBCODE_P_HELP'], + 'L_BBCODE_W_HELP' => $lang['BBCODE_W_HELP'], + 'L_BBCODE_A_HELP' => $lang['BBCODE_A_HELP'], + 'L_BBCODE_S_HELP' => $lang['BBCODE_S_HELP'], + 'L_BBCODE_F_HELP' => $lang['BBCODE_F_HELP'], + 'L_EMPTY_MESSAGE' => $lang['EMPTY_MESSAGE'], + + 'L_FONT_COLOR' => $lang['FONT_COLOR'], + 'L_COLOR_DEFAULT' => $lang['COLOR_DEFAULT'], + 'L_COLOR_DARK_RED' => $lang['COLOR_DARK_RED'], + 'L_COLOR_RED' => $lang['COLOR_RED'], + 'L_COLOR_ORANGE' => $lang['COLOR_ORANGE'], + 'L_COLOR_BROWN' => $lang['COLOR_BROWN'], + 'L_COLOR_YELLOW' => $lang['COLOR_YELLOW'], + 'L_COLOR_GREEN' => $lang['COLOR_GREEN'], + 'L_COLOR_OLIVE' => $lang['COLOR_OLIVE'], + 'L_COLOR_CYAN' => $lang['COLOR_CYAN'], + 'L_COLOR_BLUE' => $lang['COLOR_BLUE'], + 'L_COLOR_DARK_BLUE' => $lang['COLOR_DARK_BLUE'], + 'L_COLOR_INDIGO' => $lang['COLOR_INDIGO'], + 'L_COLOR_VIOLET' => $lang['COLOR_VIOLET'], + 'L_COLOR_WHITE' => $lang['COLOR_WHITE'], + 'L_COLOR_BLACK' => $lang['COLOR_BLACK'], + + 'L_FONT_SIZE' => $lang['FONT_SIZE'], + 'L_FONT_TINY' => $lang['FONT_TINY'], + 'L_FONT_SMALL' => $lang['FONT_SMALL'], + 'L_FONT_NORMAL' => $lang['FONT_NORMAL'], + 'L_FONT_LARGE' => $lang['FONT_LARGE'], + 'L_FONT_HUGE' => $lang['FONT_HUGE'], + + 'L_STYLES_TIP' => $lang['STYLES_TIP'], + + 'U_VIEWTOPIC' => ( $mode == 'reply' ) ? append_sid("viewtopic.php?" . POST_TOPIC_URL . "=$topic_id&postorder=desc") : '', + + 'S_BBCODE_CHECKED' => ( !$bbcode_on ) ? 'checked="checked"' : '', + 'S_SMILIES_CHECKED' => ( !$smilies_on ) ? 'checked="checked"' : '', + 'S_SIGNATURE_CHECKED' => ( $attach_sig ) ? 'checked="checked"' : '', + 'S_NOTIFY_CHECKED' => ( $notify_user ) ? 'checked="checked"' : '', + 'S_TYPE_TOGGLE' => $topic_type_toggle, + 'S_TOPIC_ID' => $topic_id, + 'S_POST_ACTION' => append_sid("posting.php"), + 'S_HIDDEN_FORM_FIELDS' => $hidden_form_fields) +); + +// Output the data to the template (for MAIL.RU Keyboard) +$template->assign_vars(array( + 'L_KB_TITLE' => $lang['KB_TITLE'], + 'L_LAYOUT' => $lang['KB_RUS_KEYLAYOUT'], + 'L_NONE' => $lang['KB_NONE'], + 'L_TRANSLIT' => $lang['KB_TRANSLIT'], + 'L_TRADITIONAL' => $lang['KB_TRADITIONAL'], + 'L_RULES' => $lang['KB_RULES'], + 'L_SHOW' => $lang['KB_SHOW'], + 'L_CLOSE' => $lang['KB_CLOSE'], + 'L_TRANSLIT_OPERA7' => $lang['KB_TRANSLIT_OPERA7'], + 'L_TRANSLIT_MOZILLA' => $lang['KB_TRANSLIT_MOZILLA'], + 'S_VISIBILITY_RULES' => 'position:absolute;visibility:hidden;', + 'S_VISIBILITY_KEYB' => 'position:absolute;visibility:hidden;', + 'S_VISIBILITY_OFF' => '') +); +// +// Poll entry switch/output +// +if( ( $mode == 'newtopic' || ( $mode == 'editpost' && $post_data['edit_poll']) ) && $is_auth['auth_pollcreate'] ) +{ + $template->assign_vars(array( + 'L_ADD_A_POLL' => $lang['ADD_POLL'], + 'L_ADD_POLL_EXPLAIN' => $lang['ADD_POLL_EXPLAIN'], + 'L_POLL_QUESTION' => $lang['POLL_QUESTION'], + 'L_POLL_OPTION' => $lang['POLL_OPTION'], + 'L_ADD_OPTION' => $lang['ADD_OPTION'], + 'L_POLL_LENGTH' => $lang['POLL_FOR'], + 'L_DAYS' => $lang['DAYS'], + 'L_POLL_LENGTH_EXPLAIN' => $lang['POLL_FOR_EXPLAIN'], + 'L_POLL_DELETE' => $lang['DELETE_POLL'], + + 'POLL_TITLE' => @$poll_title, + 'POLL_LENGTH' => @$poll_length) + ); + + if( $mode == 'editpost' && $post_data['edit_poll'] && $post_data['has_poll']) + { + $template->assign_block_vars('switch_poll_delete_toggle', array()); + } + + if( !empty($poll_options) ) + { + while( list($option_id, $option_text) = each($poll_options) ) + { + $template->assign_block_vars('poll_option_rows', array( + 'POLL_OPTION' => str_replace('"', '"', $option_text), + + 'S_POLL_OPTION_NUM' => $option_id) + ); + } + } + + $template->assign_var('POLLBOX'); +} + +// +// Topic review +// +if( $mode == 'reply' && $is_auth['auth_read'] ) +{ + topic_review($topic_id); +} + +require(PAGE_HEADER); + +$template->pparse('body'); + +require(PAGE_FOOTER); \ No newline at end of file diff --git a/upload/privmsg.php b/upload/privmsg.php new file mode 100644 index 000000000..ab40d8e18 --- /dev/null +++ b/upload/privmsg.php @@ -0,0 +1,1901 @@ +#', '#"#'); +$html_entities_replace = array('&', '<', '>', '"'); + +// +// Parameters +// +//$submit = ( isset($_POST['post']) ) ? TRUE : 0; +$submit = (bool) request_var('post', false); //test it! +$submit_search = ( isset($_POST['usersubmit']) ) ? TRUE : 0; +$submit_msgdays = ( isset($_POST['submit_msgdays']) ) ? TRUE : 0; +$cancel = ( isset($_POST['cancel']) ) ? TRUE : 0; +$preview = ( isset($_POST['preview']) ) ? TRUE : 0; +$confirmed = ( isset($_POST['confirm']) ) ? TRUE : 0; +$delete = ( isset($_POST['delete']) ) ? TRUE : 0; +$delete_all = ( isset($_POST['deleteall']) ) ? TRUE : 0; +$save = ( isset($_POST['save']) ) ? TRUE : 0; +$mode = isset($_REQUEST['mode']) ? (string) $_REQUEST['mode'] : ''; + +$refresh = $preview || $submit_search; + +$mark_list = ( !empty($_POST['mark']) ) ? $_POST['mark'] : 0; + +if ($folder =& $_REQUEST['folder']) +{ + if ($folder != 'inbox' && $folder != 'outbox' && $folder != 'sentbox' && $folder != 'savebox') + { + $folder = 'inbox'; + } +} +else +{ + $folder = 'inbox'; +} + +// Start session management +$user->session_start(array('req_login' => true)); + +if (IS_ADMIN || IS_MOD) +{ + $bb_cfg['max_inbox_privmsgs'] += 1000; + $bb_cfg['max_sentbox_privmsgs'] += 1000; + $bb_cfg['max_savebox_privmsgs'] += 1000; +} +else if (IS_GROUP_MEMBER) +{ + $bb_cfg['max_inbox_privmsgs'] += 200; + $bb_cfg['max_sentbox_privmsgs'] += 200; + $bb_cfg['max_savebox_privmsgs'] += 200; +} + +$template->assign_vars(array( + 'IN_PM' => true, + 'L_FONT_COLOR_SEL' => $lang['QR_COLOR_SEL'], + 'L_FONT_SEL' => $lang['QR_FONT_SEL'], + 'L_FONT_SIZE_SEL' => $lang['QR_SIZE_SEL'], + 'L_STEEL_BLUE' => $lang['COLOR_STEEL_BLUE'], + 'QUICK_REPLY' => ($bb_cfg['show_quick_reply'] && $folder == 'inbox' && $mode == 'read'), +)); + +// +// Cancel +// +if ( $cancel ) +{ + redirect(append_sid("privmsg.php?folder=$folder", true)); +} + +// +// Var definitions +// +$start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; + +if ( isset($_POST[POST_POST_URL]) || isset($_GET[POST_POST_URL]) ) +{ + $privmsg_id = ( isset($_POST[POST_POST_URL]) ) ? intval($_POST[POST_POST_URL]) : intval($_GET[POST_POST_URL]); +} +else +{ + $privmsg_id = ''; +} + +$error = FALSE; + +// +// Define the box image links +// +$inbox_url = ( $folder != 'inbox' || $mode != '' ) ? ''. $lang['INBOX'] .'' : $lang['INBOX']; + +$outbox_url = ( $folder != 'outbox' || $mode != '' ) ? ''. $lang['OUTBOX'] .'' : $lang['OUTBOX']; + +$sentbox_url = ( $folder != 'sentbox' || $mode != '' ) ? ''. $lang['SENTBOX'] .'' : $lang['SENTBOX']; + +$savebox_url = ( $folder != 'savebox' || $mode != '' ) ? ''. $lang['SAVEBOX'] .'' : $lang['SAVEBOX']; + +// ---------- +// Start main +// + +$template->assign_var('POSTING_SUBJECT'); + +if ( $mode == 'read' ) +{ + if ( !empty($_GET[POST_POST_URL]) ) + { + $privmsgs_id = intval($_GET[POST_POST_URL]); + } + else + { + message_die(GENERAL_ERROR, $lang['NO_POST_ID']); + } + + // + // SQL to pull appropriate message, prevents nosey people + // reading other peoples messages ... hopefully! + // + switch( $folder ) + { + case 'inbox': + $l_box_name = $lang['INBOX']; + $pm_sql_user = "AND pm.privmsgs_to_userid = " . $userdata['user_id'] . " + AND ( pm.privmsgs_type = " . PRIVMSGS_READ_MAIL . " + OR pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR pm.privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + case 'outbox': + $l_box_name = $lang['OUTBOX']; + $pm_sql_user = "AND pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND ( pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR pm.privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " ) "; + break; + case 'sentbox': + $l_box_name = $lang['SENTBOX']; + $pm_sql_user = "AND pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND pm.privmsgs_type = " . PRIVMSGS_SENT_MAIL; + break; + case 'savebox': + $l_box_name = $lang['SAVEBOX']; + $pm_sql_user = "AND ( ( pm.privmsgs_to_userid = " . $userdata['user_id'] . " + AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) + OR ( pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " ) + )"; + break; + default: + message_die(GENERAL_ERROR, $lang['NO_SUCH_FOLDER']); + break; + } + + // + // Major query obtains the message ... + // + $sql = "SELECT u.username AS username_1, u.user_id AS user_id_1, u2.username AS username_2, u2.user_id AS user_id_2, u.user_posts, u.user_from, u.user_email, u.user_regdate, u.user_rank, u.user_avatar, pm.*, pmt.privmsgs_bbcode_uid, pmt.privmsgs_text + FROM " . BB_PRIVMSGS . " pm, " . BB_PRIVMSGS_TEXT . " pmt, " . BB_USERS . " u, " . BB_USERS . " u2 + WHERE pm.privmsgs_id = $privmsgs_id + AND pmt.privmsgs_text_id = pm.privmsgs_id + $pm_sql_user + AND u.user_id = pm.privmsgs_from_userid + AND u2.user_id = pm.privmsgs_to_userid"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query private message post information', '', __LINE__, __FILE__, $sql); + } + + // + // Did the query return any data? + // + if ( !($privmsg = DB()->sql_fetchrow($result)) ) + { + redirect(append_sid("privmsg.php?folder=$folder", true)); + } + + $privmsg_id = $privmsg['privmsgs_id']; + + // + // Is this a new message in the inbox? If it is then save + // a copy in the posters sent box + // + if (($privmsg['privmsgs_type'] == PRIVMSGS_NEW_MAIL || $privmsg['privmsgs_type'] == PRIVMSGS_UNREAD_MAIL) && $folder == 'inbox') + { + // Update appropriate counter + switch ($privmsg['privmsgs_type']) + { + case PRIVMSGS_NEW_MAIL: + $sql = "user_new_privmsg = IF(user_new_privmsg, user_new_privmsg - 1, 0)"; + break; + case PRIVMSGS_UNREAD_MAIL: + $sql = "user_unread_privmsg = IF(user_unread_privmsg, user_unread_privmsg - 1, 0)"; + break; + } + + $sql = "UPDATE " . BB_USERS . " + SET $sql + WHERE user_id = " . $userdata['user_id']; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update private message read status for user', '', __LINE__, __FILE__, $sql); + } + if (DB()->affected_rows()) + { + cache_rm_userdata($userdata); + } + + $sql = "UPDATE " . BB_PRIVMSGS . " + SET privmsgs_type = " . PRIVMSGS_READ_MAIL . " + WHERE privmsgs_id = " . $privmsg['privmsgs_id']; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update private message read status', '', __LINE__, __FILE__, $sql); + } + + // Check to see if the poster has a 'full' sent box + $sql = "SELECT COUNT(privmsgs_id) AS sent_items, MIN(privmsgs_date) AS oldest_post_time + FROM " . BB_PRIVMSGS . " + WHERE privmsgs_type = " . PRIVMSGS_SENT_MAIL . " + AND privmsgs_from_userid = " . $privmsg['privmsgs_from_userid']; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain sent message info for sendee', '', __LINE__, __FILE__, $sql); + } + + if ( $sent_info = DB()->sql_fetchrow($result) ) + { + if ($bb_cfg['max_sentbox_privmsgs'] && $sent_info['sent_items'] >= $bb_cfg['max_sentbox_privmsgs']) + { + $sql = "SELECT privmsgs_id FROM " . BB_PRIVMSGS . " + WHERE privmsgs_type = " . PRIVMSGS_SENT_MAIL . " + AND privmsgs_date = " . $sent_info['oldest_post_time'] . " + AND privmsgs_from_userid = " . $privmsg['privmsgs_from_userid']; + if ( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not find oldest privmsgs', '', __LINE__, __FILE__, $sql); + } + $old_privmsgs_id = DB()->sql_fetchrow($result); + $old_privmsgs_id = (int) $old_privmsgs_id['privmsgs_id']; + + $sql = "DELETE FROM " . BB_PRIVMSGS . " + WHERE privmsgs_id = $old_privmsgs_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs (sent)', '', __LINE__, __FILE__, $sql); + } + + $sql = "DELETE FROM " . BB_PRIVMSGS_TEXT . " + WHERE privmsgs_text_id = $old_privmsgs_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (sent)', '', __LINE__, __FILE__, $sql); + } + } + } + + // + // This makes a copy of the post and stores it as a SENT message from the sendee. Perhaps + // not the most DB friendly way but a lot easier to manage, besides the admin will be able to + // set limits on numbers of storable posts for users ... hopefully! + // + $sql = "INSERT INTO " . BB_PRIVMSGS . " (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_bbcode, privmsgs_enable_smilies) + VALUES (" . PRIVMSGS_SENT_MAIL . ", '" . str_replace("\'", "''", addslashes($privmsg['privmsgs_subject'])) . "', " . $privmsg['privmsgs_from_userid'] . ", " . $privmsg['privmsgs_to_userid'] . ", " . $privmsg['privmsgs_date'] . ", '" . $privmsg['privmsgs_ip'] . "', " . $privmsg['privmsgs_enable_bbcode'] . ", " . $privmsg['privmsgs_enable_smilies'] . ")"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not insert private message sent info', '', __LINE__, __FILE__, $sql); + } + + $privmsg_sent_id = DB()->sql_nextid(); + + $sql = "INSERT INTO " . BB_PRIVMSGS_TEXT . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text) + VALUES ($privmsg_sent_id, '" . $privmsg['privmsgs_bbcode_uid'] . "', '" . str_replace("\'", "''", addslashes($privmsg['privmsgs_text'])) . "')"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not insert private message sent text', '', __LINE__, __FILE__, $sql); + } + } + + // + // Pick a folder, any folder, so long as it's one below ... + // + $post_urls = array( + 'post' => append_sid("privmsg.php?mode=post"), + 'reply' => append_sid("privmsg.php?mode=reply&" . POST_POST_URL . "=$privmsg_id"), + 'quote' => append_sid("privmsg.php?mode=quote&" . POST_POST_URL . "=$privmsg_id"), + 'edit' => append_sid("privmsg.php?mode=edit&" . POST_POST_URL . "=$privmsg_id") + ); + $post_icons = array( + 'post_img' => '' . $lang['POST_NEW_PM'] . '', + 'post' => '' . $lang['POST_NEW_PM'] . '', + 'reply_img' => '' . $lang['POST_REPLY_PM'] . '', + 'reply' => '' . $lang['POST_REPLY_PM'] . '', + 'quote_img' => '' . $lang['POST_QUOTE_PM'] . '', + 'quote' => '' . $lang['POST_QUOTE_PM'] . '', + 'edit_img' => '' . $lang['EDIT_PM'] . '', + 'edit' => '' . $lang['EDIT_PM'] . '' + ); + + if ( $folder == 'inbox' ) + { + $post_img = $post_icons['post_img']; + $reply_img = $post_icons['reply_img']; + $quote_img = $post_icons['quote_img']; + $edit_img = ''; + $post = $post_icons['post']; + $reply = $post_icons['reply']; + $quote = $post_icons['quote']; + $edit = ''; + $l_box_name = $lang['INBOX']; + } + else if ( $folder == 'outbox' ) + { + $post_img = $post_icons['post_img']; + $reply_img = ''; + $quote_img = ''; + $edit_img = $post_icons['edit_img']; + $post = $post_icons['post']; + $reply = ''; + $quote = ''; + $edit = $post_icons['edit']; + $l_box_name = $lang['OUTBOX']; + } + else if ( $folder == 'savebox' ) + { + if ( $privmsg['privmsgs_type'] == PRIVMSGS_SAVED_IN_MAIL ) + { + $post_img = $post_icons['post_img']; + $reply_img = $post_icons['reply_img']; + $quote_img = $post_icons['quote_img']; + $edit_img = ''; + $post = $post_icons['post']; + $reply = $post_icons['reply']; + $quote = $post_icons['quote']; + $edit = ''; + } + else + { + $post_img = $post_icons['post_img']; + $reply_img = ''; + $quote_img = ''; + $edit_img = ''; + $post = $post_icons['post']; + $reply = ''; + $quote = ''; + $edit = ''; + } + $l_box_name = $lang['SAVED']; + } + else if ( $folder == 'sentbox' ) + { + $post_img = $post_icons['post_img']; + $reply_img = ''; + $quote_img = ''; + $edit_img = ''; + $post = $post_icons['post']; + $reply = ''; + $quote = ''; + $edit = ''; + $l_box_name = $lang['SENT']; + } + + // Report + // + // Get report privmsg module and create report links + // + if ($folder == 'inbox') + { + include(INC_DIR ."functions_report.php"); + $report_privmsg = report_modules('name', 'report_privmsg'); + + if ($report_privmsg && $report_privmsg->auth_check('auth_write')) + { + if ($privmsg['privmsgs_reported']) + { + $report_img = '' . $report_privmsg->lang['DUPLICATE_REPORT'] . ''; + $report = $report_privmsg->lang['DUPLICATE_REPORT']; + } + else + { + $temp_url = append_sid("report.php?mode=" . $report_privmsg->mode . "&id=$privmsg_id"); + $report_img = '' . $report_privmsg->lang['WRITE_REPORT'] . ''; + $report = '' . $report_privmsg->lang['WRITE_REPORT'] . ''; + } + + $template->assign_vars(array( + 'REPORT_PM_IMG' => $report_img, + 'REPORT_PM' => $report) + ); + } + } + // Report [END] + + $s_hidden_fields = ''; + + $page_title = $lang['READ_PM']; + + // + // Load templates + // + $template->set_filenames(array( + 'body' => 'privmsgs_read.tpl') + ); + + $template->assign_vars(array( + 'INBOX' => $inbox_url, + + 'POST_PM_IMG' => $post_img, + 'REPLY_PM_IMG' => $reply_img, + 'EDIT_PM_IMG' => $edit_img, + 'QUOTE_PM_IMG' => $quote_img, + 'POST_PM' => $post, + 'REPLY_PM' => $reply, + 'EDIT_PM' => $edit, + 'QUOTE_PM' => $quote, + + 'SENTBOX' => $sentbox_url, + 'OUTBOX' => $outbox_url, + 'SAVEBOX' => $savebox_url, + + 'BOX_NAME' => $l_box_name, + + 'L_SENTBOX' => $lang['SENT'], + 'L_SAVEBOX' => $lang['SAVED'], + 'L_SAVE_MSG' => $lang['SAVE_MESSAGE'], + 'L_DELETE_MSG' => $lang['DELETE_MESSAGE'], + + 'S_PRIVMSGS_ACTION' => append_sid("privmsg.php?folder=$folder"), + 'S_HIDDEN_FIELDS' => $s_hidden_fields) + ); + + $username_from = $privmsg['username_1']; + $user_id_from = $privmsg['user_id_1']; + $username_to = $privmsg['username_2']; + $user_id_to = $privmsg['user_id_2']; + + $post_date = bb_date($privmsg['privmsgs_date']); + + $temp_url = append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $user_id_from); + $profile_img = '' . $lang['READ_PROFILE'] . ''; + $profile = '' . $lang['READ_PROFILE'] . ''; + + $temp_url = append_sid("privmsg.php?mode=post&" . POST_USERS_URL . "=$user_id_from"); + $pm_img = '' . $lang['SEND_PRIVATE_MESSAGE'] . ''; + $pm = '' . $lang['SEND_PRIVATE_MESSAGE'] . ''; + + $temp_url = append_sid("search.php?search_author=1&uid=$user_id_from"); + $search_img = '' . sprintf($lang['SEARCH_USER_POSTS'], $username_from) . ''; + $search = '' . sprintf($lang['SEARCH_USER_POSTS'], $username_from) . ''; + + // + // Processing of post + // + $post_subject = htmlCHR($privmsg['privmsgs_subject']); + + $private_message = $privmsg['privmsgs_text']; + $bbcode_uid = $privmsg['privmsgs_bbcode_uid']; + + if ( $bbcode_uid != '' ) + { + $private_message = ( $bb_cfg['allow_bbcode'] ) ? bbencode_second_pass($private_message, $bbcode_uid) : preg_replace('/\:[0-9a-z\:]+\]/si', ']', $private_message); + } + + $orig_word = array(); + $replacement_word = array(); + obtain_word_list($orig_word, $replacement_word); + + if ( count($orig_word) ) + { + $post_subject = preg_replace($orig_word, $replacement_word, $post_subject); + $private_message = preg_replace($orig_word, $replacement_word, $private_message); + } + + $private_message = str_replace("\n", '
    ', $private_message); + + // + // Dump it to the templating engine + // + $template->assign_vars(array( + 'TO_USER_ID' => $user_id_to, + 'TO_USER_NAME' => $username_to, + 'FROM_USER_ID' => $user_id_from, + 'FROM_USER_NAME' => $username_from, + + 'QR_SUBJECT' => ((!preg_match('/^Re:/', $post_subject)) ? 'Re: ' : '') . $post_subject, + 'MESSAGE_TO' => $username_to, + 'MESSAGE_FROM' => $username_from, + 'RANK_IMAGE' => (@$rank_image) ? $rank_image : '', + 'POSTER_JOINED' => (@$poster_joined) ? $poster_joined : '', + 'POSTER_POSTS' => (@$poster_posts) ? $poster_posts : '', + 'POSTER_FROM' => (@$poster_from) ? $poster_from : '', + 'POSTER_AVATAR' => (@$poster_avatar) ? $poster_avatar : '', + 'POST_SUBJECT' => $post_subject, + 'POST_DATE' => $post_date, + 'PM_MESSAGE' => $private_message, + + 'PROFILE_IMG' => $profile_img, + 'PROFILE' => $profile, + 'SEARCH_IMG' => $search_img, + 'SEARCH' => $search, + )); +} +else if ( ( $delete && $mark_list ) || $delete_all ) +{ + if ( isset($mark_list) && !is_array($mark_list) ) + { + // Set to empty array instead of '0' if nothing is selected. + $mark_list = array(); + } + + if (!$confirmed) + { + $delete = isset($_POST['delete']) ? 'delete' : 'deleteall'; + + $hidden_fields = array( + 'mode' => $mode, + $delete => 1, + ); + foreach ($mark_list as $pm_id) + { + $hidden_fields['mark'][] = (int) $pm_id; + } + + print_confirmation(array( + 'QUESTION' => (count($mark_list) == 1) ? $lang['CONFIRM_DELETE_PM'] : $lang['CONFIRM_DELETE_PMS'], + 'FORM_ACTION' => "privmsg.php?folder=$folder", + 'HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + )); + } + else if ( $confirmed ) + { + $delete_sql_id = ''; + + if (!$delete_all) + { + for ($i = 0; $i < count($mark_list); $i++) + { + $delete_sql_id .= (($delete_sql_id != '') ? ', ' : '') . intval($mark_list[$i]); + } + $delete_sql_id = "AND privmsgs_id IN ($delete_sql_id)"; + } + + switch($folder) + { + case 'inbox': + $delete_type = "privmsgs_to_userid = " . $userdata['user_id'] . " AND ( + privmsgs_type = " . PRIVMSGS_READ_MAIL . " OR privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + + case 'outbox': + $delete_type = "privmsgs_from_userid = " . $userdata['user_id'] . " AND ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + + case 'sentbox': + $delete_type = "privmsgs_from_userid = " . $userdata['user_id'] . " AND privmsgs_type = " . PRIVMSGS_SENT_MAIL; + break; + + case 'savebox': + $delete_type = "( ( privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " ) + OR ( privmsgs_to_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) )"; + break; + } + + $sql = "SELECT privmsgs_id + FROM " . BB_PRIVMSGS . " + WHERE $delete_type $delete_sql_id"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain id list to delete messages', '', __LINE__, __FILE__, $sql); + } + + $mark_list = array(); + while ( $row = DB()->sql_fetchrow($result) ) + { + $mark_list[] = $row['privmsgs_id']; + } + + unset($delete_type); + + if ( count($mark_list) ) + { + $delete_sql_id = ''; + for ($i = 0; $i < sizeof($mark_list); $i++) + { + $delete_sql_id .= (($delete_sql_id != '') ? ', ' : '') . intval($mark_list[$i]); + } + + if ($folder == 'inbox' || $folder == 'outbox') + { + switch ($folder) + { + case 'inbox': + $sql = "privmsgs_to_userid = " . $userdata['user_id']; + break; + case 'outbox': + $sql = "privmsgs_from_userid = " . $userdata['user_id']; + break; + } + + // Get information relevant to new or unread mail + // so we can adjust users counters appropriately + $sql = "SELECT privmsgs_to_userid, privmsgs_type + FROM " . BB_PRIVMSGS . " + WHERE privmsgs_id IN ($delete_sql_id) + AND $sql + AND privmsgs_type IN (" . PRIVMSGS_NEW_MAIL . ", " . PRIVMSGS_UNREAD_MAIL . ")"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain user id list for outbox messages', '', __LINE__, __FILE__, $sql); + } + + if ( $row = DB()->sql_fetchrow($result)) + { + $update_users = $update_list = array(); + + do + { + switch ($row['privmsgs_type']) + { + case PRIVMSGS_NEW_MAIL: + @$update_users['new'][$row['privmsgs_to_userid']]++; + break; + + case PRIVMSGS_UNREAD_MAIL: + @$update_users['unread'][$row['privmsgs_to_userid']]++; + break; + } + } + while ($row = DB()->sql_fetchrow($result)); + + if (sizeof($update_users)) + { + while (list($type, $users) = each($update_users)) + { + while (list($user_id, $dec) = each($users)) + { + $update_list[$type][$dec][] = $user_id; + } + } + unset($update_users); + + while (list($type, $dec_ary) = each($update_list)) + { + switch ($type) + { + case 'new': + $type = "user_new_privmsg"; + break; + + case 'unread': + $type = "user_unread_privmsg"; + break; + } + + while (list($dec, $user_ary) = each($dec_ary)) + { + $user_ids = join(', ', $user_ary); + + $sql = "UPDATE " . BB_USERS . " + SET $type = $type - $dec + WHERE user_id IN ($user_ids)"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update user pm counters', '', __LINE__, __FILE__, $sql); + } + } + } + unset($update_list); + } + } + DB()->sql_freeresult($result); + } + + // Delete the messages + $delete_text_sql = "DELETE FROM " . BB_PRIVMSGS_TEXT . " + WHERE privmsgs_text_id IN ($delete_sql_id)"; + $delete_sql = "DELETE FROM " . BB_PRIVMSGS . " + WHERE privmsgs_id IN ($delete_sql_id) + AND "; + + switch( $folder ) + { + case 'inbox': + $delete_sql .= "privmsgs_to_userid = " . $userdata['user_id'] . " AND ( + privmsgs_type = " . PRIVMSGS_READ_MAIL . " OR privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + + case 'outbox': + $delete_sql .= "privmsgs_from_userid = " . $userdata['user_id'] . " AND ( + privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + + case 'sentbox': + $delete_sql .= "privmsgs_from_userid = " . $userdata['user_id'] . " AND privmsgs_type = " . PRIVMSGS_SENT_MAIL; + break; + + case 'savebox': + $delete_sql .= "( ( privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " ) + OR ( privmsgs_to_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) )"; + break; + } + + if ( !DB()->sql_query($delete_sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete private message info', '', __LINE__, __FILE__, $delete_sql); + } + + if ( !DB()->sql_query($delete_text_sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete private message text', '', __LINE__, __FILE__, $delete_text_sql); + } + + pm_message_die($lang['DELETE_POSTS_SUCCESFULLY']); + } + else + { + pm_message_die($lang['NONE_SELECTED']); + } + } +} +else if ( $save && $mark_list && $folder != 'savebox' && $folder != 'outbox' ) +{ + if (sizeof($mark_list)) + { + // See if recipient is at their savebox limit + $sql = "SELECT COUNT(privmsgs_id) AS savebox_items, MIN(privmsgs_date) AS oldest_post_time + FROM " . BB_PRIVMSGS . " + WHERE ( ( privmsgs_to_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) + OR ( privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ") )"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain sent message info for sendee', '', __LINE__, __FILE__, $sql); + } + + if ( $saved_info = DB()->sql_fetchrow($result) ) + { + if ($bb_cfg['max_savebox_privmsgs'] && $saved_info['savebox_items'] >= $bb_cfg['max_savebox_privmsgs'] ) + { + $sql = "SELECT privmsgs_id FROM " . BB_PRIVMSGS . " + WHERE ( ( privmsgs_to_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) + OR ( privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ") ) + AND privmsgs_date = " . $saved_info['oldest_post_time']; + if ( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not find oldest privmsgs (save)', '', __LINE__, __FILE__, $sql); + } + $old_privmsgs_id = DB()->sql_fetchrow($result); + $old_privmsgs_id = (int) $old_privmsgs_id['privmsgs_id']; + + $sql = "DELETE FROM " . BB_PRIVMSGS . " + WHERE privmsgs_id = $old_privmsgs_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs (save)', '', __LINE__, __FILE__, $sql); + } + + $sql = "DELETE FROM " . BB_PRIVMSGS_TEXT . " + WHERE privmsgs_text_id = $old_privmsgs_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (save)', '', __LINE__, __FILE__, $sql); + } + } + } + + $saved_sql_id = ''; + for ($i = 0; $i < sizeof($mark_list); $i++) + { + $saved_sql_id .= (($saved_sql_id != '') ? ', ' : '') . intval($mark_list[$i]); + } + + // Process request + $saved_sql = "UPDATE " . BB_PRIVMSGS; + + // Decrement read/new counters if appropriate + if ($folder == 'inbox' || $folder == 'outbox') + { + switch ($folder) + { + case 'inbox': + $sql = "privmsgs_to_userid = " . $userdata['user_id']; + break; + case 'outbox': + $sql = "privmsgs_from_userid = " . $userdata['user_id']; + break; + } + + // Get information relevant to new or unread mail + // so we can adjust users counters appropriately + $sql = "SELECT privmsgs_to_userid, privmsgs_type + FROM " . BB_PRIVMSGS . " + WHERE privmsgs_id IN ($saved_sql_id) + AND $sql + AND privmsgs_type IN (" . PRIVMSGS_NEW_MAIL . ", " . PRIVMSGS_UNREAD_MAIL . ")"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain user id list for outbox messages', '', __LINE__, __FILE__, $sql); + } + + if ( $row = DB()->sql_fetchrow($result)) + { + $update_users = $update_list = array(); + + do + { + switch ($row['privmsgs_type']) + { + case PRIVMSGS_NEW_MAIL: + @$update_users['new'][$row['privmsgs_to_userid']]++; + break; + + case PRIVMSGS_UNREAD_MAIL: + @$update_users['unread'][$row['privmsgs_to_userid']]++; + break; + } + } + while ($row = DB()->sql_fetchrow($result)); + + if (sizeof($update_users)) + { + while (list($type, $users) = each($update_users)) + { + while (list($user_id, $dec) = each($users)) + { + $update_list[$type][$dec][] = $user_id; + } + } + unset($update_users); + + while (list($type, $dec_ary) = each($update_list)) + { + switch ($type) + { + case 'new': + $type = "user_new_privmsg"; + break; + + case 'unread': + $type = "user_unread_privmsg"; + break; + } + + while (list($dec, $user_ary) = each($dec_ary)) + { + $user_ids = join(', ', $user_ary); + + $sql = "UPDATE " . BB_USERS . " + SET $type = $type - $dec + WHERE user_id IN ($user_ids)"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update user pm counters', '', __LINE__, __FILE__, $sql); + } + } + } + unset($update_list); + } + } + DB()->sql_freeresult($result); + } + + switch ($folder) + { + case 'inbox': + $saved_sql .= " SET privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " + WHERE privmsgs_to_userid = " . $userdata['user_id'] . " + AND ( privmsgs_type = " . PRIVMSGS_READ_MAIL . " + OR privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")"; + break; + + case 'outbox': + $saved_sql .= " SET privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " + WHERE privmsgs_from_userid = " . $userdata['user_id'] . " + AND ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " ) "; + break; + + case 'sentbox': + $saved_sql .= " SET privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " + WHERE privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SENT_MAIL; + break; + } + + $saved_sql .= " AND privmsgs_id IN ($saved_sql_id)"; + + if ( !DB()->sql_query($saved_sql) ) + { + message_die(GENERAL_ERROR, 'Could not save private messages', '', __LINE__, __FILE__, $saved_sql); + } + + redirect(append_sid("privmsg.php?folder=savebox", true)); + } +} +else if ( $submit || $refresh || $mode != '' ) +{ + // + // Toggles + // + if ( !$bb_cfg['allow_bbcode'] ) + { + $bbcode_on = 0; + } + else + { + $bbcode_on = ($submit || $refresh) ? (int) empty($_POST['disable_bbcode']) : $bb_cfg['allow_bbcode']; + } + + if ( !$bb_cfg['allow_smilies'] ) + { + $smilies_on = 0; + } + else + { + $smilies_on = ($submit || $refresh) ? (int) empty($_POST['disable_smilies']) : $bb_cfg['allow_smilies']; + } + + if (IS_USER && $submit && $mode != 'edit') + { + // + // Flood control + // + $sql = "SELECT MAX(privmsgs_date) AS last_post_time + FROM " . BB_PRIVMSGS . " + WHERE privmsgs_from_userid = " . $userdata['user_id']; + if ( $result = DB()->sql_query($sql) ) + { + $db_row = DB()->sql_fetchrow($result); + + $last_post_time = $db_row['last_post_time']; + $current_time = time(); + + if ( ( $current_time - $last_post_time ) < $bb_cfg['flood_interval']) + { + message_die(GENERAL_MESSAGE, $lang['FLOOD_ERROR']); + } + } + // + // End Flood control + // + } + + if ($submit && $mode == 'edit') + { + $sql = 'SELECT privmsgs_from_userid + FROM ' . BB_PRIVMSGS . ' + WHERE privmsgs_id = ' . (int) $privmsg_id . ' + AND privmsgs_from_userid = ' . $userdata['user_id']; + + if (!($result = DB()->sql_query($sql))) + { + message_die(GENERAL_ERROR, "Could not obtain message details", "", __LINE__, __FILE__, $sql); + } + + if (!($row = DB()->sql_fetchrow($result))) + { + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_POST']); + } + DB()->sql_freeresult($result); + + unset($row); + } + + if ( $submit ) + { + if ( !empty($_POST['username']) ) + { + $to_username = clean_username($_POST['username']); + // DelUsrKeepPM + $to_username_sql = str_replace("\'", "''", $to_username); + + $sql = "SELECT user_id, user_notify_pm, user_email, user_lang, user_active + FROM " . BB_USERS . " + WHERE username = '$to_username_sql'"; + + $to_userdata = DB()->sql_fetchrow(DB()->sql_query($sql)); + + if (!$to_userdata || $to_userdata['user_id'] == ANONYMOUS) + { + $error = TRUE; + $error_msg = $lang['NO_SUCH_USER']; + } + // DelUsrKeepPM end + } + else + { + $error = TRUE; + $error_msg .= ( ( !empty($error_msg) ) ? '
    ' : '' ) . $lang['NO_TO_USER']; + } + + $privmsg_subject = trim(strip_tags($_POST['subject'])); + if ( empty($privmsg_subject) ) + { + $error = TRUE; + $error_msg .= ( ( !empty($error_msg) ) ? '
    ' : '' ) . $lang['EMPTY_SUBJECT']; + } + + if ( !empty($_POST['message']) ) + { + if ( !$error ) + { + $privmsg_message = bbcode2html($_POST['message']); + } + } + else + { + $error = TRUE; + $error_msg .= ( ( !empty($error_msg) ) ? '
    ' : '' ) . $lang['EMPTY_MESSAGE']; + } + } + + if ( $submit && !$error ) + { + // + // Has admin prevented user from sending PM's? + // + if ( !$userdata['user_allow_pm'] ) + { + $message = $lang['CANNOT_SEND_PRIVMSG']; + message_die(GENERAL_MESSAGE, $message); + } + + $msg_time = time(); + + if ( $mode != 'edit' ) + { + // + // See if recipient is at their inbox limit + // + $sql = "SELECT COUNT(privmsgs_id) AS inbox_items, MIN(privmsgs_date) AS oldest_post_time + FROM " . BB_PRIVMSGS . " + WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_READ_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " ) + AND privmsgs_to_userid = " . $to_userdata['user_id']; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_USER']); + } + + if ( $inbox_info = DB()->sql_fetchrow($result) ) + { + if ($bb_cfg['max_inbox_privmsgs'] && $inbox_info['inbox_items'] >= $bb_cfg['max_inbox_privmsgs']) + { + $sql = "SELECT privmsgs_id FROM " . BB_PRIVMSGS . " + WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_READ_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " ) + AND privmsgs_date = " . $inbox_info['oldest_post_time'] . " + AND privmsgs_to_userid = " . $to_userdata['user_id']; + if ( !$result = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not find oldest privmsgs (inbox)', '', __LINE__, __FILE__, $sql); + } + $old_privmsgs_id = DB()->sql_fetchrow($result); + $old_privmsgs_id = (int) $old_privmsgs_id['privmsgs_id']; + + $sql = "DELETE FROM " . BB_PRIVMSGS . " + WHERE privmsgs_id = $old_privmsgs_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs (inbox)'.$sql, '', __LINE__, __FILE__, $sql); + } + + $sql = "DELETE FROM " . BB_PRIVMSGS_TEXT . " + WHERE privmsgs_text_id = $old_privmsgs_id"; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (inbox)', '', __LINE__, __FILE__, $sql); + } + } + } + + $sql_info = "INSERT INTO " . BB_PRIVMSGS . " (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_bbcode, privmsgs_enable_smilies) + VALUES (" . PRIVMSGS_NEW_MAIL . ", '" . str_replace("\'", "''", $privmsg_subject) . "', " . $userdata['user_id'] . ", " . $to_userdata['user_id'] . ", $msg_time, '". USER_IP ."', $bbcode_on, $smilies_on)"; + } + else + { + $sql_info = "UPDATE " . BB_PRIVMSGS . " + SET privmsgs_type = " . PRIVMSGS_NEW_MAIL . ", privmsgs_subject = '" . str_replace("\'", "''", $privmsg_subject) . "', privmsgs_from_userid = " . $userdata['user_id'] . ", privmsgs_to_userid = " . $to_userdata['user_id'] . ", privmsgs_date = $msg_time, privmsgs_ip = '". USER_IP ."', privmsgs_enable_bbcode = $bbcode_on, privmsgs_enable_smilies = $smilies_on + WHERE privmsgs_id = $privmsg_id"; + } + + if ( !($result = DB()->sql_query($sql_info)) ) + { + message_die(GENERAL_ERROR, "Could not insert/update private message sent info.", "", __LINE__, __FILE__, $sql_info); + } + + if ( $mode != 'edit' ) + { + $privmsg_sent_id = DB()->sql_nextid(); + + $sql = "INSERT INTO " . BB_PRIVMSGS_TEXT . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text) + VALUES ($privmsg_sent_id, '" . @$bbcode_uid . "', '" . str_replace("\'", "''", $privmsg_message) . "')"; + } + else + { + $sql = "UPDATE " . BB_PRIVMSGS_TEXT . " + SET privmsgs_text = '" . str_replace("\'", "''", $privmsg_message) . "', privmsgs_bbcode_uid = '$bbcode_uid' + WHERE privmsgs_text_id = $privmsg_id"; + } + + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Could not insert/update private message sent text.", "", __LINE__, __FILE__, $sql_info); + } + + if ( $mode != 'edit' ) + { + $timenow = TIMENOW; + // + // Add to the users new pm counter + // + $sql = "UPDATE ". BB_USERS ." SET + user_new_privmsg = user_new_privmsg + 1, + user_last_privmsg = $timenow, + user_newest_pm_id = $privmsg_sent_id + WHERE user_id = {$to_userdata['user_id']} + LIMIT 1"; + + if ( !$status = DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update private message new/read status for user', '', __LINE__, __FILE__, $sql); + } + + if ( $to_userdata['user_notify_pm'] && !empty($to_userdata['user_email']) && $to_userdata['user_active'] && $bb_cfg['pm_notify_enabled'] ) + { + $script_name = preg_replace('/^\/?(.*?)\/?$/', "\\1", trim($bb_cfg['script_path'])); + $script_name = ( $script_name != '' ) ? $script_name . '/privmsg.php' : 'privmsg.php'; + $server_name = trim($bb_cfg['server_name']); + $server_protocol = ( $bb_cfg['cookie_secure'] ) ? 'https://' : 'http://'; + $server_port = ( $bb_cfg['server_port'] <> 80 ) ? ':' . trim($bb_cfg['server_port']) . '/' : '/'; + + include(INC_DIR .'emailer.class.php'); + $emailer = new emailer($bb_cfg['smtp_delivery']); + + $emailer->from($bb_cfg['board_email']); + $emailer->replyto($bb_cfg['board_email']); + + $emailer->use_template('privmsg_notify', $to_userdata['user_lang']); + $emailer->email_address($to_userdata['user_email']); + $emailer->set_subject($lang['NOTIFICATION_SUBJECT']); + + $emailer->assign_vars(array( + 'USERNAME' => stripslashes($to_username), + 'NAME_FROM' => $userdata['username'], + 'MSG_SUBJECT' => stripslashes($privmsg_subject), + 'SITENAME' => $bb_cfg['sitename'], + 'EMAIL_SIG' => (!empty($bb_cfg['board_email_sig'])) ? str_replace('
    ', "\n", "-- \n" . $bb_cfg['board_email_sig']) : '', + + 'U_INBOX' => $server_protocol . $server_name . $server_port . $script_name . '?folder=inbox&mode=read&p=' . $privmsg_sent_id) + ); + + $emailer->send(); + $emailer->reset(); + } + } + + pm_message_die($lang['MESSAGE_SENT']); + } + else if ( $preview || $refresh || $error ) + { + + // + // If we're previewing or refreshing then obtain the data + // passed to the script, process it a little, do some checks + // where neccessary, etc. + // + $to_username = (isset($_POST['username']) ) ? trim(htmlspecialchars(stripslashes($_POST['username']))) : ''; + + $privmsg_subject = ( isset($_POST['subject']) ) ? trim(strip_tags(stripslashes($_POST['subject']))) : ''; + $privmsg_message = ( isset($_POST['message']) ) ? trim($_POST['message']) : ''; + if ( !$preview ) + { + $privmsg_message = stripslashes($privmsg_message); + } + + // + // Do mode specific things + // + if ( $mode == 'post' ) + { + $page_title = $lang['POST_NEW_PM']; + } + else if ( $mode == 'reply' ) + { + $page_title = $lang['POST_REPLY_PM']; + } + else if ( $mode == 'edit' ) + { + $page_title = $lang['EDIT_PM']; + + $sql = "SELECT u.user_id + FROM " . BB_PRIVMSGS . " pm, " . BB_USERS . " u + WHERE pm.privmsgs_id = $privmsg_id + AND u.user_id = pm.privmsgs_from_userid"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Could not obtain post and post text", "", __LINE__, __FILE__, $sql); + } + + if ( $postrow = DB()->sql_fetchrow($result) ) + { + if ( $userdata['user_id'] != $postrow['user_id'] ) + { + message_die(GENERAL_MESSAGE, $lang['EDIT_OWN_POSTS']); + } + } + } + } + else + { + if ( !$privmsg_id && ( $mode == 'reply' || $mode == 'edit' || $mode == 'quote' ) ) + { + message_die(GENERAL_ERROR, $lang['NO_POST_ID']); + } + + if ( !empty($_GET[POST_USERS_URL]) ) + { + $user_id = intval($_GET[POST_USERS_URL]); + + $sql = "SELECT username + FROM " . BB_USERS . " + WHERE user_id = $user_id + AND user_id <> " . ANONYMOUS; + if ( !($result = DB()->sql_query($sql)) ) + { + $error = TRUE; + $error_msg = $lang['NO_SUCH_USER']; + } + + if ( $row = DB()->sql_fetchrow($result) ) + { + $to_username = $row['username']; + } + } + + else if ( $mode == 'edit' ) + { + $sql = "SELECT pm.*, pmt.privmsgs_bbcode_uid, pmt.privmsgs_text, u.username, u.user_id + FROM " . BB_PRIVMSGS . " pm, " . BB_PRIVMSGS_TEXT . " pmt, " . BB_USERS . " u + WHERE pm.privmsgs_id = $privmsg_id + AND pmt.privmsgs_text_id = pm.privmsgs_id + AND pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND ( pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR pm.privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " ) + AND u.user_id = pm.privmsgs_to_userid"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain private message for editing', '', __LINE__, __FILE__, $sql); + } + + if ( !($privmsg = DB()->sql_fetchrow($result)) ) + { + redirect(append_sid("privmsg.php?folder=$folder", true)); + } + + $privmsg_subject = $privmsg['privmsgs_subject']; + $privmsg_message = $privmsg['privmsgs_text']; + $privmsg_bbcode_uid = $privmsg['privmsgs_bbcode_uid']; + $privmsg_bbcode_enabled = ($privmsg['privmsgs_enable_bbcode'] == 1); + + if ( $privmsg_bbcode_enabled ) + { + $privmsg_message = preg_replace("/\:(([a-z0-9]:)?)$privmsg_bbcode_uid/si", '', $privmsg_message); + } + + $privmsg_message = str_replace('
    ', "\n", $privmsg_message); + + $to_username = $privmsg['username']; + $to_userid = $privmsg['user_id']; + + } + else if ( $mode == 'reply' || $mode == 'quote' ) + { + + $sql = "SELECT pm.privmsgs_subject, pm.privmsgs_date, pmt.privmsgs_bbcode_uid, pmt.privmsgs_text, u.username, u.user_id + FROM " . BB_PRIVMSGS . " pm, " . BB_PRIVMSGS_TEXT . " pmt, " . BB_USERS . " u + WHERE pm.privmsgs_id = $privmsg_id + AND pmt.privmsgs_text_id = pm.privmsgs_id + AND pm.privmsgs_to_userid = " . $userdata['user_id'] . " + AND u.user_id = pm.privmsgs_from_userid"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not obtain private message for editing', '', __LINE__, __FILE__, $sql); + } + + if ( !($privmsg = DB()->sql_fetchrow($result)) ) + { + redirect(append_sid("privmsg.php?folder=$folder", true)); + } + + $privmsg_subject = ( ( !preg_match('/^Re:/', $privmsg['privmsgs_subject']) ) ? 'Re: ' : '' ) . $privmsg['privmsgs_subject']; + + $to_username = $privmsg['username']; + $to_userid = $privmsg['user_id']; + + if ( $mode == 'quote' ) + { + $privmsg_message = $privmsg['privmsgs_text']; + $privmsg_bbcode_uid = $privmsg['privmsgs_bbcode_uid']; + + $privmsg_message = preg_replace("/\:(([a-z0-9]:)?)$privmsg_bbcode_uid/si", '', $privmsg_message); + $privmsg_message = str_replace('
    ', "\n", $privmsg_message); + + $msg_date = bb_date($privmsg['privmsgs_date']); + + $privmsg_message = '[quote="' . $to_username . '"]' . $privmsg_message . '[/quote]'; + + $mode = 'reply'; + } + } + else + { + $privmsg_subject = $privmsg_message = $to_username = ''; + } + } + + // + // Has admin prevented user from sending PM's? + // + if ( !$userdata['user_allow_pm'] && $mode != 'edit' ) + { + $message = $lang['CANNOT_SEND_PRIVMSG']; + message_die(GENERAL_MESSAGE, $message); + } + + // + // Start output, first preview, then errors then post form + // + $page_title = $lang['SEND_PRIVATE_MESSAGE']; + + if ( $preview && !$error ) + { + $orig_word = array(); + $replacement_word = array(); + obtain_word_list($orig_word, $replacement_word); + + $preview_message = stripslashes(bbcode2html($privmsg_message)); + $privmsg_message = stripslashes(preg_replace($html_entities_match, $html_entities_replace, $privmsg_message)); + + + if ( count($orig_word) ) + { + $preview_subject = preg_replace($orig_word, $replacement_word, $privmsg_subject); + $preview_message = preg_replace($orig_word, $replacement_word, $preview_message); + } + else + { + $preview_subject = $privmsg_subject; + } + + $preview_message = str_replace("\n", '
    ', $preview_message); + + $s_hidden_fields = ''; + $s_hidden_fields .= ''; + + if ( isset($privmsg_id) ) + { + $s_hidden_fields .= ''; + } + + $template->assign_vars(array( + 'TPL_PREVIEW_POST' => true, + 'TOPIC_TITLE' => wbr($preview_subject), + 'POST_SUBJECT' => $preview_subject, + 'MESSAGE_TO' => $to_username, + 'MESSAGE_FROM' => $userdata['username'], + 'POST_DATE' => bb_date(TIMENOW), + 'PREVIEW_MSG' => $preview_message, + + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + )); + } + + // + // Start error handling + // + if ($error) + { + $template->assign_vars(array('ERROR_MESSAGE' => $error_msg)); + } + + // + // Load templates + // + $template->set_filenames(array( + 'body' => 'posting.tpl') + ); + + // + // Enable extensions in posting_body + // + $template->assign_block_vars('switch_privmsg', array()); + $template->assign_var('POSTING_USERNAME'); + + // + // BBCode toggle selection + // + if ( $bb_cfg['allow_bbcode'] ) + { + $bbcode_status = $lang['BBCODE_IS_ON']; + $template->assign_block_vars('switch_bbcode_checkbox', array()); + } + else + { + $bbcode_status = $lang['BBCODE_IS_OFF']; + } + + // + // Smilies toggle selection + // + if ( $bb_cfg['allow_smilies'] ) + { + $smilies_status = $lang['SMILIES_ARE_ON']; + $template->assign_block_vars('switch_smilies_checkbox', array()); + } + else + { + $smilies_status = $lang['SMILIES_ARE_OFF']; + } + + $post_a = ' '; + if ( $mode == 'post' ) + { + $post_a = $lang['SEND_A_NEW_MESSAGE']; + } + else if ( $mode == 'reply' ) + { + $post_a = $lang['SEND_A_REPLY']; + $mode = 'post'; + } + else if ( $mode == 'edit' ) + { + $post_a = $lang['EDIT_MESSAGE']; + } + + $s_hidden_fields = ''; + $s_hidden_fields .= ''; + if ( $mode == 'edit' ) + { + $s_hidden_fields .= ''; + } + + // + // Send smilies to template + // + generate_smilies('inline'); + + $privmsg_subject = preg_replace($html_entities_match, $html_entities_replace, $privmsg_subject); + $privmsg_subject = str_replace('"', '"', $privmsg_subject); + + $template->assign_vars(array( + 'SUBJECT' => htmlCHR($privmsg_subject), + 'USERNAME' => $to_username, + 'MESSAGE' => $privmsg_message, + 'SMILIES_STATUS' => $smilies_status, + 'BBCODE_STATUS' => sprintf($bbcode_status, '', ''), + 'FORUM_NAME' => $lang['PRIVATE_MESSAGE'], + + 'BOX_NAME' => $l_box_name, + 'INBOX' => $inbox_url, + 'SENTBOX' => $sentbox_url, + 'OUTBOX' => $outbox_url, + 'SAVEBOX' => $savebox_url, + + 'POSTING_TYPE_TITLE' => $post_a, + 'L_DISABLE_BBCODE' => $lang['DISABLE_BBCODE_PM'], + 'L_DISABLE_SMILIES' => $lang['DISABLE_SMILIES_PM'], + + 'S_BBCODE_CHECKED' => ( !$bbcode_on ) ? ' checked="checked"' : '', + 'S_SMILIES_CHECKED' => ( !$smilies_on ) ? ' checked="checked"' : '', + 'S_HIDDEN_FORM_FIELDS' => $s_hidden_fields, + 'S_POST_ACTION' => append_sid("privmsg.php"), + + 'U_SEARCH_USER' => append_sid("search.php?mode=searchuser"), + 'U_VIEW_FORUM' => append_sid("privmsg.php")) + ); + + // Output the data to the template (for MAIL.RU Keyboard) + $template->assign_vars(array( + 'SHOW_VIRTUAL_KEYBOARD' => $bb_cfg['show_virtual_keyboard'], + 'L_LAYOUT' => $lang['KB_RUS_KEYLAYOUT'], + 'L_NONE' => $lang['KB_NONE'], + 'L_TRANSLIT' => $lang['KB_TRANSLIT'], + 'L_TRADITIONAL' => $lang['KB_TRADITIONAL'], + 'L_RULES' => $lang['KB_RULES'], + 'L_SHOW' => $lang['KB_SHOW'], + 'L_CLOSE' => $lang['KB_CLOSE'], + 'L_TRANSLIT_OPERA7' => $lang['KB_TRANSLIT_OPERA7'], + 'L_TRANSLIT_MOZILLA' => $lang['KB_TRANSLIT_MOZILLA'], + 'S_VISIBILITY_RULES' => 'position:absolute;visibility:hidden;', + 'S_VISIBILITY_KEYB' => 'position:absolute;visibility:hidden;', + 'S_VISIBILITY_OFF' => '') + ); +} +else +{ + // + // Default page + // + + // + // Reset PM counters + // + $userdata['user_new_privmsg'] = 0; + $userdata['user_unread_privmsg'] = $userdata['user_new_privmsg'] + $userdata['user_unread_privmsg']; + $userdata['user_last_privmsg'] = $userdata['session_start']; + + // + // Update unread status + // + db_update_userdata($userdata, array( + 'user_unread_privmsg' => 'user_unread_privmsg + user_new_privmsg', + 'user_new_privmsg' => 0, + 'user_last_privmsg' => $userdata['session_start'], + )); + + $sql = "UPDATE " . BB_PRIVMSGS . " + SET privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " + WHERE privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + AND privmsgs_to_userid = " . $userdata['user_id']; + if ( !DB()->sql_query($sql) ) + { + message_die(GENERAL_ERROR, 'Could not update private message new/read status (2) for user', '', __LINE__, __FILE__, $sql); + } + + // + // Generate page + // + $page_title = $lang['PRIVATE_MESSAGING']; + + // + // Load templates + // + $template->set_filenames(array( + 'body' => 'privmsgs.tpl') + ); + + $orig_word = array(); + $replacement_word = array(); + obtain_word_list($orig_word, $replacement_word); + + // + // New message + // + $post_new_mesg_url = '' . $lang['SEND_A_NEW_MESSAGE'] . ''; + + // + // General SQL to obtain messages + // + $sql_tot = "SELECT COUNT(privmsgs_id) AS total + FROM " . BB_PRIVMSGS . " "; + $sql = "SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username + FROM " . BB_PRIVMSGS . " pm, " . BB_USERS . " u "; + switch( $folder ) + { + case 'inbox': + $sql_tot .= "WHERE privmsgs_to_userid = " . $userdata['user_id'] . " + AND ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_READ_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + + $sql .= "WHERE pm.privmsgs_to_userid = " . $userdata['user_id'] . " + AND u.user_id = pm.privmsgs_from_userid + AND ( pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR pm.privmsgs_type = " . PRIVMSGS_READ_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + + case 'outbox': + $sql_tot .= "WHERE privmsgs_from_userid = " . $userdata['user_id'] . " + AND ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + + $sql .= "WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND u.user_id = pm.privmsgs_to_userid + AND ( pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . " + OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )"; + break; + + case 'sentbox': + $sql_tot .= "WHERE privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SENT_MAIL; + + $sql .= "WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND u.user_id = pm.privmsgs_to_userid + AND pm.privmsgs_type = " . PRIVMSGS_SENT_MAIL; + break; + + case 'savebox': + $sql_tot .= "WHERE ( ( privmsgs_to_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) + OR ( privmsgs_from_userid = " . $userdata['user_id'] . " + AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ") )"; + + $sql .= "WHERE u.user_id = pm.privmsgs_from_userid + AND ( ( pm.privmsgs_to_userid = " . $userdata['user_id'] . " + AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . " ) + OR ( pm.privmsgs_from_userid = " . $userdata['user_id'] . " + AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . " ) )"; + break; + + default: + message_die(GENERAL_MESSAGE, $lang['NO_SUCH_FOLDER']); + break; + } + + // + // Show messages over previous x days/months + // + if ( $submit_msgdays && ( !empty($_POST['msgdays']) || !empty($_GET['msgdays']) ) ) + { + $msg_days = ( !empty($_POST['msgdays']) ) ? intval($_POST['msgdays']) : intval($_GET['msgdays']); + $min_msg_time = time() - ($msg_days * 86400); + + $limit_msg_time_total = " AND privmsgs_date > $min_msg_time"; + $limit_msg_time = " AND pm.privmsgs_date > $min_msg_time "; + + if ( !empty($_POST['msgdays']) ) + { + $start = 0; + } + } + else + { + $limit_msg_time = $limit_msg_time_total = ''; + $msg_days = 0; + } + + $sql .= $limit_msg_time . " ORDER BY pm.privmsgs_date DESC LIMIT $start, " . $bb_cfg['topics_per_page']; + $sql_all_tot = $sql_tot; + $sql_tot .= $limit_msg_time_total; + + // + // Get messages + // + if ( !($result = DB()->sql_query($sql_tot)) ) + { + message_die(GENERAL_ERROR, 'Could not query private message information', '', __LINE__, __FILE__, $sql_tot); + } + + $pm_total = ( $row = DB()->sql_fetchrow($result) ) ? $row['total'] : 0; + + if ( !($result = DB()->sql_query($sql_all_tot)) ) + { + message_die(GENERAL_ERROR, 'Could not query private message information', '', __LINE__, __FILE__, $sql_tot); + } + + $pm_all_total = ( $row = DB()->sql_fetchrow($result) ) ? $row['total'] : 0; + + // + // Build select box + // + $previous_days = array(0, 1, 7, 14, 30, 90, 180, 364); + $previous_days_text = array($lang['ALL_POSTS'], $lang['1_DAY'], $lang['7_DAYS'], $lang['2_WEEKS'], $lang['1_MONTH'], $lang['3_MONTHS'], $lang['6_MONTHS'], $lang['1_YEAR']); + + $select_msg_days = ''; + for($i = 0; $i < count($previous_days); $i++) + { + $selected = ( $msg_days == $previous_days[$i] ) ? ' selected="selected"' : ''; + $select_msg_days .= ''; + } + + // + // Define correct icons + // + switch ( $folder ) + { + case 'inbox': + $l_box_name = $lang['INBOX']; + break; + case 'outbox': + $l_box_name = $lang['OUTBOX']; + break; + case 'savebox': + $l_box_name = $lang['SAVEBOX']; + break; + case 'sentbox': + $l_box_name = $lang['SENTBOX']; + break; + } + $post_pm = append_sid("privmsg.php?mode=post"); + $post_pm_img = '' . $lang['POST_NEW_PM'] . ''; + $post_pm = '' . $lang['POST_NEW_PM'] . ''; + + // + // Output data for inbox status + // + $box_limit_img_length = $box_limit_percent = $l_box_size_status = ''; + $max_pm = ($folder != 'outbox') ? $bb_cfg["max_{$folder}_privmsgs"] : null; + + if ($max_pm) + { + $box_limit_percent = min(round(($pm_all_total / $max_pm) * 100), 100); + $box_limit_img_length = min(round(($pm_all_total / $max_pm) * $bb_cfg['privmsg_graphic_length']), $bb_cfg['privmsg_graphic_length']); + $box_limit_remain = max(($max_pm - $pm_all_total), 0); + + $template->assign_var('PM_BOX_SIZE_INFO'); + + switch( $folder ) + { + case 'inbox': + $l_box_size_status = sprintf($lang['INBOX_SIZE'], $box_limit_percent); + break; + case 'sentbox': + $l_box_size_status = sprintf($lang['SENTBOX_SIZE'], $box_limit_percent); + break; + case 'savebox': + $l_box_size_status = sprintf($lang['SAVEBOX_SIZE'], $box_limit_percent); + break; + default: + $l_box_size_status = ''; + break; + } + } + + // + // Dump vars to template + // + $template->assign_vars(array( + 'BOX_NAME' => $l_box_name, + 'BOX_EXPL' => ($folder == 'outbox') ? $lang['OUTBOX_EXPL'] : '', + 'INBOX' => $inbox_url, + 'SENTBOX' => $sentbox_url, + 'OUTBOX' => $outbox_url, + 'SAVEBOX' => $savebox_url, + + 'POST_PM_IMG' => $post_pm_img, + 'POST_PM' => $post_pm, + + 'INBOX_LIMIT_IMG_WIDTH' => max(4, $box_limit_img_length), + 'INBOX_LIMIT_PERCENT' => $box_limit_percent, + + 'BOX_SIZE_STATUS' => ($l_box_size_status) ? $l_box_size_status : '', + + 'L_SENTBOX' => $lang['SENT'], + 'L_SAVEBOX' => $lang['SAVED'], + 'L_FROM_OR_TO' => ( $folder == 'inbox' || $folder == 'savebox' ) ? $lang['FROM'] : $lang['TO'], + + 'S_PRIVMSGS_ACTION' => append_sid("privmsg.php?folder=$folder"), + 'S_HIDDEN_FIELDS' => '', + 'S_POST_NEW_MSG' => $post_new_mesg_url, + 'S_SELECT_MSG_DAYS' => $select_msg_days, + + 'U_POST_NEW_TOPIC' => append_sid("privmsg.php?mode=post")) + ); + + // + // Okay, let's build the correct folder + // + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, 'Could not query private messages', '', __LINE__, __FILE__, $sql); + } + + if ( $row = DB()->sql_fetchrow($result) ) + { + $i = 0; + do + { + $privmsg_id = $row['privmsgs_id']; + + $flag = $row['privmsgs_type']; + + $icon_flag = ( $flag == PRIVMSGS_NEW_MAIL || $flag == PRIVMSGS_UNREAD_MAIL ) ? $images['pm_unreadmsg'] : $images['pm_readmsg']; + $icon_flag_alt = ( $flag == PRIVMSGS_NEW_MAIL || $flag == PRIVMSGS_UNREAD_MAIL ) ? $lang['UNREAD_MESSAGE'] : $lang['READ_MESSAGE']; + + $msg_userid = $row['user_id']; + $msg_username = $row['username']; + + $u_from_user_profile = append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . "=$msg_userid"); + + $msg_subject = $row['privmsgs_subject']; + + if ( count($orig_word) ) + { + $msg_subject = preg_replace($orig_word, $replacement_word, $msg_subject); + } + + $u_subject = append_sid("privmsg.php?folder=$folder&mode=read&" . POST_POST_URL . "=$privmsg_id"); + + $msg_date = bb_date($row['privmsgs_date']); + + if ( $flag == PRIVMSGS_NEW_MAIL && $folder == 'inbox' ) + { + $msg_subject = '' . $msg_subject . ''; + $msg_date = '' . $msg_date . ''; + $msg_username = '' . $msg_username . ''; + } + + $row_class = !($i & 1) ? 'prow1' : 'prow2'; + $i++; + + $template->assign_block_vars('listrow', array( + 'ROW_CLASS' => $row_class, + 'FROM' => $msg_username, + 'SUBJECT' => htmlCHR($msg_subject), + 'DATE' => $msg_date, + + 'PRIVMSG_FOLDER_IMG' => $icon_flag, + + 'L_PRIVMSG_FOLDER_ALT' => $icon_flag_alt, + + 'S_MARK_ID' => $privmsg_id, + + 'U_READ' => $u_subject, + 'U_FROM_USER_PROFILE' => $u_from_user_profile) + ); + } + while( $row = DB()->sql_fetchrow($result) ); + + $template->assign_vars(array( + 'PAGINATION' => generate_pagination("privmsg.php?folder=$folder", $pm_total, $bb_cfg['topics_per_page'], $start), + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], ( floor( $start / $bb_cfg['topics_per_page'] ) + 1 ), ceil( $pm_total / $bb_cfg['topics_per_page'] )), + )); + + } + else + { + $template->assign_vars(array( + 'L_NO_MESSAGES' => $lang['NO_MESSAGES_FOLDER']) + ); + + $template->assign_block_vars("switch_no_messages", array() ); + } +} + +$template->assign_vars(array('PAGE_TITLE' => @$page_title)); + +require(PAGE_HEADER); + +$template->pparse('body'); + +require(PAGE_FOOTER); + +// +// Functions +// +function pm_message_die ($msg) +{ + global $lang; + + $msg .= '

    '; + $msg .= sprintf($lang['CLICK_RETURN_INBOX'], '', ' '); + $msg .= sprintf($lang['CLICK_RETURN_SENTBOX'], '', ' '); + $msg .= sprintf($lang['CLICK_RETURN_OUTBOX'], '', ' '); + $msg .= sprintf($lang['CLICK_RETURN_SAVEBOX'], '', ' '); + $msg .= '

    '; + $msg .= sprintf($lang['CLICK_RETURN_INDEX'], '', ''); + + message_die(GENERAL_MESSAGE, $msg); +} diff --git a/upload/profile.php b/upload/profile.php new file mode 100644 index 000000000..682039247 --- /dev/null +++ b/upload/profile.php @@ -0,0 +1,51 @@ +session_start(); + +// session id check +$sid = request_var('sid', ''); +$mode = request_var('mode', ''); +$mode = htmlspecialchars($mode); + +switch ($mode) +{ + case 'viewprofile': + require(INC_DIR . 'ucp/usercp_viewprofile.php'); + break; + + case 'register': + case 'editprofile': + if ( !$userdata['session_logged_in'] && $mode == 'editprofile' ) + { + login_redirect(); + } + + require(INC_DIR . 'ucp/usercp_register.php'); + break; + + case 'sendpassword': + require(INC_DIR .'ucp/usercp_sendpasswd.php'); + break; + + case 'activate': + require(INC_DIR .'ucp/usercp_activate.php'); + break; + + case 'email': + require(INC_DIR .'ucp/usercp_email.php'); + break; + + case 'attachcp': + require(INC_DIR .'ucp/usercp_attachcp.php'); + break; + + default: + bb_die('Invalid mode'); +} diff --git a/upload/report.php b/upload/report.php new file mode 100644 index 000000000..1252d5963 --- /dev/null +++ b/upload/report.php @@ -0,0 +1,819 @@ +session_start(); + +if (!$userdata['session_logged_in']) +{ + redirect(append_sid("index.php", true)); +} + +$return_links = array( + 'index' => '

    ' . sprintf($lang['CLICK_RETURN_INDEX'], '', ''), + 'list' => '

    ' . sprintf($lang['CLICK_RETURN_REPORT_LIST'], '', '') +); + +if (isset($_POST['mode']) || isset($_GET['mode'])) +{ + $mode = (isset($_POST['mode'])) ? $_POST['mode'] : $_GET['mode']; +} +else +{ + $mode = ''; +} + +$report_modules = report_modules(); + +// +// Check for matching report module +// +if (!empty($mode)) +{ + foreach (array_keys($report_modules) as $report_module_id) + { + $report_module =& $report_modules[$report_module_id]; + + if (!empty($report_module->mode) && $mode == $report_module->mode) + { + break; + } + + unset($report_module); + } +} + +// +// Report module matched, show report form +// +if (isset($report_module)) +{ + $errors = array(); + + if (isset($_POST['id']) || isset($_GET['id'])) + { + $report_subject_id = (isset($_POST['id'])) ? (int) $_POST['id'] : (int) $_GET['id']; + } + else + { + $report_subject_id = 0; + } + + // + // Check authorisation, check for duplicate reports + // + if (!$report_module->auth_check('auth_write')) + { + message_die(GENERAL_MESSAGE, $report_module->lang['AUTH_WRITE_ERROR'] . $report_module->return_link($report_subject_id) . $return_links['index']); + } + else if (!$report_module->duplicates && report_duplicate_check($report_module->id, $report_subject_id)) + { + message_die(GENERAL_MESSAGE, $report_module->lang['DUPLICATE_ERROR'] . $report_module->return_link($report_subject_id) . $return_links['index']); + } + + if (isset($_POST['submit'])) + { + $report_reason = (isset($_POST['reason'])) ? (int) $_POST['reason'] : 0; + $report_desc = (isset($_POST['message'])) ? htmlspecialchars($_POST['message']) : ''; + + // + // Obtain report title if necessary + // + if (method_exists($report_module, 'subject_obtain')) + { + $report_title = addslashes($report_module->subject_obtain($report_subject_id)); + } + else + { + $report_title = (isset($_POST['title'])) ? htmlspecialchars($_POST['title']) : ''; + $report_subject_id = 0; + } + + // + // Validate values + // + if (empty($report_title)) + { + $errors[] = $lang['REPORT_TITLE_EMPTY']; + } + + if (empty($report_desc)) + { + $errors[] = $lang['REPORT_DESC_EMPTY']; + } + + // + // Insert report + // + if (empty($errors)) + { + $report_desc = str_replace("\'", "'", $report_desc); + $report_title = str_replace("\'", "'", $report_title); + + report_insert($report_module->id, $report_subject_id, $report_reason, $report_title, $report_desc, false); + + message_die(GENERAL_MESSAGE, $lang['REPORT_INSERTED'] . $report_module->return_link($report_subject_id) . $return_links['index']); + } + } + else if (isset($_POST['cancel'])) + { + $redirect_url = (method_exists($report_module, 'subject_url')) ? $report_module->subject_url($report_subject_id, true) : append_sid("index.php", true); + redirect($redirect_url); + } + + $page_title = $report_module->lang['WRITE_REPORT']; + include(PAGE_HEADER); + $template->set_filenames(array( + 'body' => 'report_form_body.tpl') + ); + + // + // Show validation errors + // + if (!empty($errors)) + { + $template->assign_block_vars('switch_report_errors', array()); + foreach ($errors as $error) + { + $template->assign_block_vars('switch_report_errors.report_errors', array( + 'MESSAGE' => $error) + ); + } + } + + // + // Generate report reasons select + // + if ($report_reasons = $report_module->reasons_obtain()) + { + $template->assign_block_vars('switch_report_reasons', array()); + + foreach ($report_reasons as $reason_id => $reason_desc) + { + $template->assign_block_vars('switch_report_reasons.report_reasons', array( + 'ID' => $reason_id, + 'DESC' => $reason_desc, + 'CHECKED' => (isset($report_reason) && $report_reason == $reason_id) ? ' selected="selected"' : '') + ); + } + } + + // + // Show report subject, check for correct subject + // + if (method_exists($report_module, 'subject_obtain')) + { + if ($report_subject = $report_module->subject_obtain($report_subject_id)) + { + $template->assign_block_vars('switch_report_subject', array()); + $template->assign_var('REPORT_SUBJECT', $report_subject); + + if (method_exists($report_module, 'subject_url')) + { + $template->assign_block_vars('switch_report_subject.switch_url', array()); + $template->assign_var('U_REPORT_SUBJECT', $report_module->subject_url($report_subject_id)); + } + } + else + { + message_die(GENERAL_MESSAGE, $report_module->lang['WRITE_REPORT_ERROR'] . $return_links['index']); + } + } + // + // Show report title input + // + else + { + $template->assign_block_vars('switch_report_title', array()); + } + + $hidden_fields = ''; + + $template->assign_vars(array( + 'S_REPORT_ACTION' => append_sid("report.php"), + 'S_HIDDEN_FIELDS' => $hidden_fields, + + 'L_WRITE_REPORT' => $report_module->lang['WRITE_REPORT'], + 'L_WRITE_REPORT_EXPLAIN' => $report_module->lang['WRITE_REPORT_EXPLAIN'], + 'REPORT_TITLE' => (!method_exists($report_module, 'subject_obtain') && isset($report_title)) ? stripslashes($report_title) : '', + 'REPORT_DESC' => (isset($report_desc)) ? stripslashes($report_desc) : '', + + 'L_TITLE' => $lang['POST_SUBJECT'], + 'L_SUBJECT' => $lang['REPORT_SUBJECT']) + ); + + $template->pparse('body'); + include(PAGE_FOOTER); +} +else +{ + if ($userdata['user_level'] != ADMIN && ($bb_cfg['report_list_admin'] || $userdata['user_level'] != MOD)) + { + redirect(append_sid("index.php", true)); + } + + $params = array('open', 'process', 'clear', 'delete'); + foreach ($params as $param) + { + if (isset($_POST[$param])) + { + $mode = $param; + } + } + + // Report status css classes + $report_status_classes = array( + REPORT_NEW => 'report_new', + REPORT_OPEN => 'report_open', + REPORT_IN_PROCESS => 'report_process', + REPORT_CLEARED => 'report_cleared', + REPORT_DELETE => 'report_delete' + ); + + switch ($mode) + { + case 'open': + case 'process': + case 'clear': + case 'delete': + // + // Validate report ids + // + if (isset($_POST[POST_REPORT_URL]) || isset($_GET[POST_REPORT_URL])) + { + $report_id = (isset($_POST[POST_REPORT_URL])) ? $_POST[POST_REPORT_URL] : $_GET[POST_REPORT_URL]; + $reports = array((int) $report_id); + + $single_report = true; + } + else if (isset($_POST['reports'])) + { + $reports = array(); + foreach ($_POST['reports'] as $report_id) + { + $reports[] = (int) $report_id; + } + + $single_report = false; + } + + if (empty($reports)) + { + $template->assign_var('META', ''); + + message_die(GENERAL_MESSAGE, $lang['NO_REPORTS_SELECTED'] . $return_links['list'] . $return_links['index']); + } + + // + // Cancel action + // + if (isset($_POST['cancel'])) + { + $redirect_url = ($single_report) ? "report.php?" . POST_REPORT_URL . '=' . $reports[0] : "report.php"; + redirect(append_sid($redirect_url, true)); + } + + // + // Hidden fields + // + $hidden_fields = ''; + if ($single_report) + { + $hidden_fields .= ''; + } + else + { + foreach ($reports as $report_id) + { + $hidden_fields .= ''; + } + } + + $template->assign_vars(array( + 'S_CONFIRM_ACTION' => append_sid("report.php"), + 'S_HIDDEN_FIELDS' => $hidden_fields) + ); + + // + // Change reports status + // + if ($mode != 'delete') + { + if (isset($_POST['confirm'])) + { + $comment = (isset($_POST['comment'])) ? htmlspecialchars(str_replace("\'", "'", $_POST['comment'])) : ''; + + switch ($mode) + { + case 'open': + $status = REPORT_OPEN; + break; + + case 'process': + $status = REPORT_IN_PROCESS; + break; + + case 'clear': + $status = REPORT_CLEARED; + break; + } + + reports_update_status($reports, $status, $comment); + + $meta_url = ($single_report) ? "report.php?" . POST_REPORT_URL . '=' . $reports[0] : "report.php"; + $template->assign_var('META', ''); + + $return_link = ($single_report) ? '

    ' . sprintf($lang['CLICK_RETURN_REPORT'], '', '') : ''; + $message = ($single_report) ? 'REPORT_CHANGED' : 'REPORTS_CHANGED'; + message_die(GENERAL_MESSAGE, $lang[$message] . $return_link . $return_links['list'] . $return_links['index']); + } + + $page_title = ($single_report) ? $lang['CHANGE_REPORT'] : $lang['CHANGE_REPORTS']; + + include(PAGE_HEADER); + $template->set_filenames(array( + 'body' => 'report_change_body.tpl') + ); + + $template->assign_vars(array( + 'MESSAGE_TITLE' => $page_title, + 'MESSAGE_TEXT' => ($single_report) ? $lang['CHANGE_REPORT_EXPLAIN'] : $lang['CHANGE_REPORTS_EXPLAIN']) + ); + + $template->pparse('body'); + include(PAGE_FOOTER); + } + // + // Delete reports + // + else + { + if (isset($_POST['confirm'])) + { + reports_delete($reports); + + $template->assign_var('META', ''); + + $message = ($single_report) ? 'REPORT_DELETED' : 'REPORTS_DELETED'; + message_die(GENERAL_MESSAGE, $lang[$message] . $return_links['list'] . $return_links['index']); + } + + $page_title = ($single_report) ? $lang['DELETE_REPORT'] : $lang['DELETE_REPORTS']; + + include(PAGE_HEADER); + $template->set_filenames(array( + 'confirm' => 'confirm_body.tpl') + ); + + $template->assign_vars(array( + 'MESSAGE_TITLE' => $page_title, + 'MESSAGE_TEXT' => ($single_report) ? $lang['DELETE_REPORT_EXPLAIN'] : $lang['DELETE_REPORTS_EXPLAIN']) + ); + + $template->pparse('confirm'); + include(PAGE_FOOTER); + } + break; + + case 'reported': + $cat = (isset($_GET[POST_CAT_URL])) ? (int) $_GET[POST_CAT_URL] : 0; + $report_subject_id = (isset($_GET['id'])) ? (int) $_GET['id'] : 0; + + if (empty($cat) || empty($report_subject_id) || !isset($report_modules[$cat])) + { + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['index']); + } + + $report_module =& $report_modules[$cat]; + $reports = reports_open_obtain($cat, $report_subject_id); + + // + // No open reports for the subject, sync report module + // + if (empty($reports)) + { + if (method_exists($report_module, 'sync')) + { + $report_module->sync(); + } + + message_die(GENERAL_MESSAGE, $lang['NO_REPORTS_FOUND'] . $report_module->return_link($report_subject_id) . $return_links['index']); + } + // + // Redirect to the open report + // + else if (count($reports) == 1) + { + $redirect_url = append_sid("report.php?" . POST_REPORT_URL . '=' . $reports[0]['report_id'], true); + redirect($redirect_url); + } + + $page_title = $lang['OPEN_REPORTS']; + include(PAGE_HEADER); + $template->set_filenames(array( + 'body' => 'report_open_body.tpl') + ); + + $template->assign_vars(array( + 'S_REPORT_ACTION', append_sid("report.php"), + + 'L_BY' => $lang['REPORT_BY'], + 'L_MARK' => $lang['REPORT_MARK'], + 'L_STATUS_CLEARED' => $lang['REPORT_STATUS'][REPORT_CLEARED], + 'L_STATUS_IN_PROCESS' => $lang['REPORT_STATUS'][REPORT_IN_PROCESS], + 'L_STATUS_OPEN' => $lang['REPORT_STATUS'][REPORT_OPEN], + 'L_SELECT_ALL' => $lang['MARK_ALL']) + ); + + // + // Show list with open reports + // + foreach ($reports as $report) + { + $template->assign_block_vars('open_reports', array( + 'U_SHOW' => append_sid("report.php?" . POST_REPORT_URL . '=' . $report['report_id']), + 'U_AUTHOR' => append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $report['user_id']), + + 'ID' => $report['report_id'], + 'TITLE' => $report['report_title'], + 'AUTHOR' => $report['username'], + 'TIME' => bb_date($report['report_time'])) + ); + } + + $template->pparse('body'); + include(PAGE_FOOTER); + break; + + case '': + $page_title = $lang['REPORTS']; + include(PAGE_HEADER); + $template->set_filenames(array( + 'body' => 'report_list_body.tpl') + ); + + $template->assign_vars(array( + 'S_REPORT_ACTION' => append_sid("report.php"), + + 'U_REPORT_INDEX' => append_sid("report.php"), + + 'L_BY' => $lang['REPORT_BY'], + 'L_MARK' => $lang['REPORT_MARK'], + 'L_STATUS_CLEARED' => $lang['REPORT_STATUS'][REPORT_CLEARED], + 'L_STATUS_IN_PROCESS' => $lang['REPORT_STATUS'][REPORT_IN_PROCESS], + 'L_STATUS_OPEN' => $lang['REPORT_STATUS'][REPORT_OPEN], + 'L_SELECT_ALL' => $lang['MARK_ALL']) + ); + + $cat = (isset($_GET[POST_CAT_URL])) ? (int) $_GET[POST_CAT_URL] : null; + $cat_url = (!empty($cat)) ? '&' . POST_CAT_URL . "=$cat" : ''; + + $show_delete_option = false; + + // + // Show report list + // + $reports = reports_obtain($cat); + foreach (array_keys($report_modules) as $report_module_id) + { + $report_module =& $report_modules[$report_module_id]; + + // + // Check module authorisation + // + if (!$report_module->auth_check('auth_view')) + { + continue; + } + + $template->assign_block_vars('report_modules', array( + 'U_SHOW' => append_sid("report.php?" . POST_CAT_URL . '=' . $report_module->id), + + 'TITLE' => $report_module->lang['REPORT_LIST_TITLE']) + ); + + // + // No reports in this category, display no reports message + // + if (!isset($reports[$report_module->id])) + { + if (empty($cat) || $cat == $report_module->id) + { + $template->assign_block_vars('report_modules.no_reports', array()); + } + + continue; + } + + // + // Check if deletions are allowed + // + if ($report_module->auth_check('auth_delete_view')) + { + $show_delete_option = true; + } + + // + // Show reports + // + foreach ($reports[$report_module->id] as $report) + { + $template->assign_block_vars('report_modules.reports', array( + 'U_SHOW' => append_sid("report.php?" . POST_REPORT_URL . '=' . $report['report_id'] . $cat_url), + 'U_AUTHOR' => append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $report['user_id']), + + 'ROW_CLASS' => $report_status_classes[$report['report_status']], + 'ID' => $report['report_id'], + 'TITLE' => (strlen($report['report_title'] > 53)) ? substr($report['report_title'], 0, 50) . '...' : $report['report_title'], + 'AUTHOR' => $report['username'], + 'TIME' => bb_date($report['report_time']), + 'STATUS' => $lang['REPORT_STATUS'][$report['report_status']]) + ); + + if (isset($_GET[POST_REPORT_URL]) && $_GET[POST_REPORT_URL] == $report['report_id']) + { + $template->assign_block_vars('report_modules.reports.switch_current', array()); + } + } + } + + if ($show_delete_option) + { + $template->assign_block_vars('switch_global_delete_option', array()); + } + + // + // Show information for one report + // + if (isset($_GET[POST_REPORT_URL])) + { + $template->set_filenames(array( + 'report_view' => 'report_view_body.tpl') + ); + + if (!$report = report_obtain((int) $_GET[POST_REPORT_URL])) + { + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_EXISTS'] . $return_links['list'] . $return_links['index']); + } + + if ($report['report_status'] == REPORT_NEW) + { + reports_update_status($report['report_id'], REPORT_OPEN, '', false, true, false); + $report['report_status'] = REPORT_OPEN; + } + + // + // Show report subject (with or without details, depending on the report module) + // + $report_module =& $report_modules[$report['report_module_id']]; + if (method_exists($report_module, 'subject_details_obtain')) + { + if ($report_subject = $report_module->subject_details_obtain($report['report_subject'])) + { + if (isset($report_subject['subject']) || isset($report_subject['details'])) + { + $template->assign_block_vars('report_subject', array()); + } + + // + // Assign report subject + // + if (isset($report_subject['subject'])) + { + $template->assign_block_vars('report_subject.switch_subject', array()); + $template->assign_var('REPORT_SUBJECT', $report_subject['subject']); + + if (method_exists($report_module, 'subject_url')) + { + $template->assign_block_vars('report_subject.switch_subject.switch_url', array()); + $template->assign_vars(array( + 'S_REPORT_SUBJECT_TARGET' => ($bb_cfg['report_new_window']) ? ' target="_blank"' : '', + 'U_REPORT_SUBJECT' => $report_module->subject_url($report['report_subject'])) + ); + } + } + + // + // Assign report subject details + // + if (isset($report_subject['details'])) + { + foreach ($report_subject['details'] as $detail_title => $detail_value) + { + $template->assign_block_vars('report_subject.details', array( + 'TITLE' => $report_module->lang[$detail_title], + 'VALUE' => $detail_value) + ); + } + } + } + else + { + $template->assign_block_vars('switch_report_subject_deleted', array()); + $template->assign_var('L_REPORT_SUBJECT_DELETED', $report_module->lang['DELETED_ERROR']); + } + } + else if (method_exists($report_module, 'subject_obtain')) + { + if ($report_subject = $report_module->subject_obtain($report['report_subject'])) + { + // + // Assign report subject + // + $template->assign_block_vars('report_subject', array()); + $template->assign_block_vars('report_subject.switch_subject', array()); + $template->assign_var('REPORT_SUBJECT', $report_subject); + + if (method_exists($report_module, 'subject_url')) + { + $template->assign_block_vars('report_subject.switch_subject.switch_url', array()); + $template->assign_vars(array( + 'S_REPORT_SUBJECT_TARGET' => ($bb_cfg['report_new_window']) ? ' target="_blank"' : '', + 'U_REPORT_SUBJECT' => $report_module->subject_url($report['report_subject'])) + ); + } + } + else + { + $template->assign_block_vars('switch_report_subject_deleted', array()); + $template->assign_var('L_REPORT_SUBJECT_DELETED', $report_module->lang['DELETED_ERROR']); + } + } + + // + // Assign report reason + // + if (!empty($report['report_reason_desc'])) + { + $template->assign_block_vars('switch_report_reason', array()); + + $template->assign_var('REPORT_REASON', $report['report_reason_desc']); + } + + // + // Show report changes + // + if ($report_changes = report_changes_obtain($report['report_id'])) + { + $template->assign_block_vars('switch_report_changes', array()); + + foreach ($report_changes as $report_change) + { + $u_report_change_user = append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $report_change['user_id']); + $report_change_user = '' . $report_change['username'] . ''; + + $report_change_status = $lang['REPORT_STATUS'][$report_change['report_status']]; + $report_change_time = bb_date($report_change['report_change_time']); + + // + // Text that contains all information + // + if ($report_change['report_status'] == REPORT_DELETE) + { + $report_change_text = sprintf($lang['REPORT_CHANGE_DELETE_TEXT'], $report_change_user, $report_change_time); + } + else if ($report_change['report_change_comment'] != '') + { + $report_change_text = sprintf($lang['REPORT_CHANGE_TEXT_COMMENT'], $report_change_status, $report_change_user, $report_change_time, $report_change['report_change_comment']); + } + else + { + $report_change_text = sprintf($lang['REPORT_CHANGE_TEXT'], $report_change_status, $report_change_user, $report_change_time); + } + + $template->assign_block_vars('switch_report_changes.report_changes', array( + 'U_USER' => $u_report_change_user, + + 'ROW_CLASS' => $report_status_classes[$report_change['report_status']], + 'STATUS' => $report_change_status, + 'USER' => $report_change['username'], + 'TIME' => $report_change_time, + + 'TEXT' => $report_change_text) + ); + } + + // + // Assign last change information + // + $template->assign_vars(array( + 'U_REPORT_LAST_CHANGE_USER' => $u_report_change_user, + + 'REPORT_LAST_CHANGE_TIME' => $report_change_time, + 'REPORT_LAST_CHANGE_USER' => $report_change['username']) + ); + } + + // + // Check if deletions are allowed + // + if ($report_module->auth_check('auth_delete_view')) + { + $template->assign_block_vars('switch_delete_option', array()); + } + + $template->assign_vars(array( + 'S_HIDDEN_FIELDS' => '', + + 'U_REPORT_AUTHOR' => append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $report['user_id']), + 'U_REPORT_AUTHOR_PRIVMSG' => append_sid("privmsg.php?mode=post&" . POST_USERS_URL . '=' . $report['user_id']), + + 'REPORT_TYPE' => $report_module->lang['REPORT_TYPE'], + 'REPORT_TITLE' => $report['report_title'], + 'REPORT_AUTHOR' => $report['username'], + 'REPORT_TIME' => bb_date($report['report_time']), + 'REPORT_DESC' => str_replace("\n", '
    ', $report['report_desc']), + 'REPORT_STATUS' => $lang['REPORT_STATUS'][$report['report_status']], + 'REPORT_STATUS_CLASS' => $report_status_classes[$report['report_status']], + + 'L_SUBJECT' => $lang['REPORT_SUBJECT'], + 'L_SEND_PRIVMSG' => $lang['SEND_PRIVATE_MESSAGE']) + ); + } + // + // Show report index page + // + else + { + $template->set_filenames(array( + 'report_view' => 'report_index_body.tpl') + ); + + $statistics = array( + 'Report_count' => 'report_count', + 'Report_modules_count' => 'modules_count', + 'Report_hack_count' => 'report_hack_count'); + foreach ($statistics as $stat_lang => $stat_mode) + { + $template->assign_block_vars('report_statistics', array( + 'STATISTIC' => $lang[strtoupper($stat_lang)], + 'VALUE' => report_statistics($stat_mode)) + ); + } + + /* + if ($userdata['user_level'] == ADMIN) + { + */ + $deleted_reports = reports_deleted_obtain(); + if (!empty($deleted_reports)) + { + $template->assign_block_vars('switch_deleted_reports', array()); + foreach ($deleted_reports as $report) + { + $report_module =& $report_modules[$report['report_module_id']]; + + $template->assign_block_vars('switch_deleted_reports.deleted_reports', array( + 'U_SHOW' => append_sid("report.php?" . POST_REPORT_URL . '=' . $report['report_id'] . $cat_url), + 'U_AUTHOR' => append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $report['user_id']), + + 'ID' => $report['report_id'], + 'TITLE' => $report['report_title'], + 'TYPE' => $report_module->lang['REPORT_TYPE'], + 'AUTHOR' => $report['username'], + 'TIME' => bb_date($report['report_time']), + 'STATUS' => $lang['REPORT_STATUS'][REPORT_DELETE]) + ); + } + } + /* + } + */ + } + + $template->assign_var_from_handle('REPORT_VIEW', 'report_view'); + + $template->pparse('body'); + include(PAGE_FOOTER); + break; + + default: + message_die(GENERAL_MESSAGE, $lang['REPORT_NOT_SUPPORTED'] . $return_links['index']); + break; + } +} \ No newline at end of file diff --git a/upload/search.php b/upload/search.php new file mode 100644 index 000000000..abe4b4f20 --- /dev/null +++ b/upload/search.php @@ -0,0 +1,919 @@ +session_start(array('req_login' => $bb_cfg['disable_search_for_guest'])); + +$tracking_topics = get_tracks('topic'); +$tracking_forums = get_tracks('forum'); + +if ($mode =& $_REQUEST['mode']) +{ + // This handles the simple windowed user search functions called from various other scripts + if ($mode == 'searchuser') + { + $username = isset($_POST['search_username']) ? $_POST['search_username'] : ''; + username_search($username); + exit; + } +} + +$excluded_forums_csv = $user->get_excluded_forums(AUTH_READ); + +$search_limit = 500; +$forum_select_size = 16; // forum select box max rows +$max_forum_name_len = 60; // inside forum select box +$text_match_max_len = 60; +$poster_name_max_len = 25; + +$start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; +$url = basename(__FILE__); + +$anon_id = ANONYMOUS; +$user_id = $userdata['user_id']; +$lastvisit = (IS_GUEST) ? TIMENOW : $userdata['user_lastvisit']; +$search_id = (isset($_GET['id']) && verify_id($_GET['id'], SEARCH_ID_LENGTH)) ? $_GET['id'] : ''; +$session_id = $userdata['session_id']; + +$items_found = $items_display = $previous_settings = null; +$text_match_sql = ''; + +$cat_tbl = BB_CATEGORIES .' c'; +$dl_stat_tbl = BB_BT_DLSTATUS .' dl'; +$forums_tbl = BB_FORUMS .' f'; +$posts_tbl = BB_POSTS .' p'; +$posts_text_tbl = BB_POSTS_TEXT .' pt'; +$posts_html_tbl = BB_POSTS_HTML .' h'; +$search_tbl = BB_POSTS_SEARCH .' ps'; +$tr_snap_tbl = BB_BT_TRACKER_SNAP .' sn'; +$topics_tbl = BB_TOPICS .' t'; +$torrents_tbl = BB_BT_TORRENTS .' tor'; +$tracker_tbl = BB_BT_TRACKER .' tr'; +$users_tbl = BB_USERS .' u'; + +// Cat/forum data +if (!$forums = $datastore->get('cat_forums')) +{ + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); +} +$forum_name_html = $forums['forum_name_html']; + +// +// Search options +// +// Key values +$search_all = 0; + +$sort_asc = 1; +$sort_desc = 0; + +$as_topics = 0; +$as_posts = 1; + +$show_all = 0; +$show_briefly = 1; + +$ord_posted = 1; +$ord_name = 2; +$ord_repl = 3; +$ord_views = 4; +$ord_last_p = 5; +$ord_created = 6; + +// Order options +$order_opt = array( + $ord_posted => array( + 'lang' => $lang['SORT_TIME'], + 'sql' => 'item_id', + ), + $ord_last_p => array( + 'lang' => $lang['BT_LAST_POST'], + 'sql' => 't.topic_last_post_id', + ), + $ord_created => array( + 'lang' => $lang['BT_CREATED'], + 'sql' => 't.topic_time', + ), + $ord_name => array( + 'lang' => $lang['SORT_TOPIC_TITLE'], + 'sql' => 't.topic_title', + ), + $ord_repl => array( + 'lang' => $lang['REPLIES'], + 'sql' => 't.topic_replies', + ), +); +$order_select = array(); +foreach ($order_opt as $val => $opt) +{ + $order_select[$opt['lang']] = $val; +} + +// Sort direction +$sort_opt = array( + $sort_asc => array( + 'lang' => $lang['ASC'], + 'sql' => ' ASC ', + ), + $sort_desc => array( + 'lang' => $lang['DESC'], + 'sql' => ' DESC ', + ), +); +$sort_select = array(); +foreach ($sort_opt as $val => $opt) +{ + $sort_select[$opt['lang']] = $val; +} + +// Previous days +$time_opt = array( + $search_all => array( + 'lang' => $lang['BT_ALL_DAYS_FOR'], + 'sql' => 0, + ), + 1 => array( + 'lang' => $lang['BT_1_DAY_FOR'], + 'sql' => TIMENOW - 86400, + ), + 3 => array( + 'lang' => $lang['BT_3_DAY_FOR'], + 'sql' => TIMENOW - 86400*3, + ), + 7 => array( + 'lang' => $lang['BT_7_DAYS_FOR'], + 'sql' => TIMENOW - 86400*7, + ), + 14 => array( + 'lang' => $lang['BT_2_WEEKS_FOR'], + 'sql' => TIMENOW - 86400*14, + ), + 30 => array( + 'lang' => $lang['BT_1_MONTH_FOR'], + 'sql' => TIMENOW - 86400*30, + ), +); +$time_select = array(); +foreach ($time_opt as $val => $opt) +{ + $time_select[$opt['lang']] = $val; +} + +// Display as +$display_as_opt = array( + $as_topics => array( + 'lang' => $lang['TOPICS'], + ), + $as_posts => array( + 'lang' => $lang['MESSAGE'], + ), +); +$display_as_select = array(); +foreach ($display_as_opt as $val => $opt) +{ + $display_as_select[$opt['lang']] = $val; +} + +// Chars +$chars_opt = array( + $show_all => array( + 'lang' => $lang['ALL_AVAILABLE'], + ), + $show_briefly => array( + 'lang' => $lang['BRIEFLY'], + ), +); +$chars_select = array(); +foreach ($chars_opt as $val => $opt) +{ + $chars_select[$opt['lang']] = $val; +} + +$GPC = array( +# var_name key_name def_value GPC type + 'all_words' => array('allw', 1, CHBOX), + 'cat' => array('c', null, REQUEST), + 'chars' => array('ch', $show_all, SELECT), + 'display_as' => array('dm', $as_topics, SELECT), + 'dl_cancel' => array('dla', 0, CHBOX), + 'dl_compl' => array('dlc', 0, CHBOX), + 'dl_down' => array('dld', 0, CHBOX), + 'dl_user_id' => array('dlu', $user_id, CHBOX), + 'dl_will' => array('dlw', 0, CHBOX), + 'forum' => array('f', $search_all, REQUEST), + 'my_topics' => array('myt', 0, CHBOX), + 'new' => array('new', 0, CHBOX), + 'new_topics' => array('nt', 0, CHBOX), + 'order' => array('o', $ord_posted, SELECT), + 'poster_id' => array('uid', null, REQUEST), + 'poster_name' => array('pn', null, REQUEST), + 'sort' => array('s', $sort_desc, SELECT), + 'text_match' => array('nm', null, REQUEST), + 'time' => array('tm', $search_all, SELECT), + 'title_only' => array('to', 0, CHBOX), + 'topic' => array('t', null, REQUEST), +); + +// Define all GPC vars with default values +foreach ($GPC as $var_name => $var_options) +{ + $GLOBALS["{$var_name}_key"] = $var_options[KEY_NAME]; + $GLOBALS["{$var_name}_val"] = $var_options[DEF_VAL]; +} + +// Output basic page +if (empty($_GET) && empty($_POST)) +{ + // Make forum select box + $forum_select_mode = explode(',', $excluded_forums_csv); + $forum_select = get_forum_select($forum_select_mode, "{$forum_key}[]", $search_all, $max_forum_name_len, $forum_select_size, 'style="width: 95%;"', $search_all); + + $template->assign_vars(array( + 'TPL_SEARCH_MAIN' => true, + 'PAGE_TITLE' => $lang['SEARCH'], + + 'POSTER_ID_KEY' => $poster_id_key, + 'TEXT_MATCH_KEY' => $text_match_key, + 'POSTER_NAME_KEY' => $poster_name_key, + + 'THIS_USER_ID' => $userdata['user_id'], + 'THIS_USER_NAME' => addslashes($userdata['username']), + 'SEARCH_ACTION' => "search.php", + 'U_SEARCH_USER' => "search.php?mode=searchuser&input_name=$poster_name_key", + 'ONLOAD_FOCUS_ID' => 'text_match_input', + + 'MY_TOPICS_ID' => 'my_topics', + 'MY_TOPICS_CHBOX' => build_checkbox ($my_topics_key, $lang['SEARCH_MY_TOPICS'], $my_topics_val, true, null, 'my_topics'), + 'TITLE_ONLY_CHBOX' => build_checkbox ($title_only_key, $lang['SEARCH_TITLES_ONLY'], true, $bb_cfg['disable_ft_search_in_posts']), + 'ALL_WORDS_CHBOX' => build_checkbox ($all_words_key, $lang['SEARCH_ALL_WORDS'], true), + 'DL_CANCEL_CHBOX' => build_checkbox ($dl_cancel_key, $lang['SEARCH_DL_CANCEL'], $dl_cancel_val, IS_GUEST, 'dlCancel'), + 'DL_COMPL_CHBOX' => build_checkbox ($dl_compl_key, $lang['SEARCH_DL_COMPLETE'], $dl_compl_val, IS_GUEST, 'dlComplete'), + 'DL_DOWN_CHBOX' => build_checkbox ($dl_down_key, $lang['SEARCH_DL_DOWN'], $dl_down_val, IS_GUEST, 'dlDown'), + 'DL_WILL_CHBOX' => build_checkbox ($dl_will_key, $lang['SEARCH_DL_WILL'], $dl_will_val, IS_GUEST, 'dlWill'), + 'ONLY_NEW_CHBOX' => build_checkbox ($new_key, $lang['BT_ONLY_NEW'], $new_val, IS_GUEST), + 'NEW_TOPICS_CHBOX' => build_checkbox ($new_topics_key, $lang['NEW_TOPICS'], $new_topics_val, IS_GUEST), + + 'FORUM_SELECT' => $forum_select, + 'TIME_SELECT' => build_select ($time_key, $time_select, $time_val), + 'ORDER_SELECT' => build_select ($order_key, $order_select, $order_val), + 'SORT_SELECT' => build_select ($sort_key, $sort_select, $sort_val), + 'CHARS_SELECT' => '', # build_select ($chars_key, $chars_select, $chars_val), + 'DISPLAY_AS_SELECT' => build_select ($display_as_key, $display_as_select, $display_as_val), + )); + + print_page('search.tpl'); +} + +unset($forums); +$datastore->rm('cat_forums'); + +// Restore previously found items list and search settings if we have valid $search_id +if ($search_id) +{ + $row = DB()->fetch_row(" + SELECT search_array, search_settings + FROM ". BB_SEARCH ." + WHERE session_id = '$session_id' + AND search_type = ". SEARCH_TYPE_POST ." + AND search_id = '$search_id' + LIMIT 1 + "); + + if (empty($row['search_settings'])) + { + bb_die($lang['SESSION_EXPIRED']); + } + + $previous_settings = unserialize($row['search_settings']); + $items_found = explode(',', $row['search_array']); +} + +// Get simple "CHBOX" and "SELECT" type vars +foreach ($GPC as $name => $params) +{ + if ($params[GPC_TYPE] == CHBOX) + { + checkbox_get_val($params[KEY_NAME], ${"{$name}_val"}, $params[DEF_VAL]); + } + else if ($params[GPC_TYPE] == SELECT) + { + select_get_val($params[KEY_NAME], ${"{$name}_val"}, ${"{$name}_opt"}, $params[DEF_VAL]); + } +} + +// Get other "REQUEST" vars +$egosearch = false; + +if (!$items_found) +{ + // For compatibility with old-style params + if (isset($_REQUEST['search_id'])) + { + switch ($_REQUEST['search_id']) + { + case 'egosearch': + $egosearch = true; + $display_as_val = $as_topics; + if (empty($_REQUEST[$poster_id_key])) + { + $_REQUEST[$poster_id_key] = $user_id; + } + break; + case 'newposts': + $new_val = true; + break; + } + } + + // Forum + if ($var =& $_REQUEST[$forum_key]) + { + $forum_selected = get_id_ary($var); + + if (!in_array($search_all, $forum_selected)) + { + $forum_val = join(',', $forum_selected); + } + } + + // Topic + if ($var =& $_REQUEST[$topic_key]) + { + $topic_val = join(',', get_id_ary($var)); + } + + // Poster id (from requested name or id) + if ($var = request_var($poster_id_key, 0)) + { + $poster_id_val = (int) $var; + + if ($poster_id_val != $user_id && !get_username($poster_id_val)) + { + bb_die($lang['USER_NOT_EXIST']); + } + } + else if ($var =& $_POST[$poster_name_key]) + { + $poster_name_sql = str_replace("\\'", "''", clean_username($var)); + + if (!$poster_id_val = get_user_id($poster_name_sql)) + { + bb_die($lang['USER_NOT_EXIST']); + } + } + + // Search words + if ($var =& $_REQUEST[$text_match_key]) + { + if ($tmp = substr(trim($var), 0, $text_match_max_len)) + { + $text_match_sql = clean_text_match($tmp, $all_words_val, false, true); + } + } +} + +$dl_status = array(); +if ($dl_cancel_val) $dl_status[] = DL_STATUS_CANCEL; +if ($dl_compl_val) $dl_status[] = DL_STATUS_COMPLETE; +if ($dl_down_val) $dl_status[] = DL_STATUS_DOWN; +if ($dl_will_val) $dl_status[] = DL_STATUS_WILL; +$dl_status_csv = join(',', $dl_status); + +// Switches +$dl_search = ($dl_status && !IS_GUEST); +$new_posts = ($new_val && !IS_GUEST); +$prev_days = ($time_val != $search_all); +$new_topics = (!IS_GUEST && ($new_topics_val || isset($_GET['newposts']))); +$my_topics = ($poster_id_val && $my_topics_val); +$my_posts = ($poster_id_val && !$my_topics_val); +$title_match = ($text_match_sql && ($title_only_val || $bb_cfg['disable_ft_search_in_posts'])); + +// "Display as" mode (posts or topics) +$post_mode = (!$dl_search && ($display_as_val == $as_posts || isset($_GET['search_author']))); + +// Start building SQL +$SQL = DB()->get_empty_sql_array(); + +// Displaying "as posts" mode +if ($post_mode) +{ + $order = $order_opt[$order_val]['sql']; + $sort = $sort_opt[$sort_val]['sql']; + $per_page = $bb_cfg['posts_per_page']; + $display_as_val = $as_posts; + + // Run initial search for post_ids + if (!$items_found) + { + $join_t = ($title_match || $my_topics || $new_topics || in_array($order_val, array($ord_last_p, $ord_created, $ord_name, $ord_repl))); + $join_s = ($text_match_sql && !$title_match); + $join_p = ($my_posts || $join_s); + + $tbl = ($join_t && !$join_p) ? 't' : 'p'; + $time_field = ($join_t && !$join_p) ? 'topic_last_post_time' : 'post_time'; + + // SELECT + $SQL['SELECT'][] = ($join_t && !$join_p) ? 't.topic_first_post_id AS item_id' : 'p.post_id AS item_id'; + + // FROM + if ($join_t) $SQL['FROM'][] = $topics_tbl; + if ($join_p) $SQL['FROM'][] = $posts_tbl; + if ($join_s) $SQL['FROM'][] = $search_tbl; + + if (!$SQL['FROM']) + { + $join_p = true; + $SQL['FROM'][] = $posts_tbl; + } + + // WHERE + if ($join_p && $join_t) $SQL['WHERE'][] = "t.topic_id = p.topic_id"; + if ($join_s) $SQL['WHERE'][] = "ps.post_id = p.post_id"; + + if ($excluded_forums_csv) $SQL['WHERE'][] = "$tbl.forum_id NOT IN($excluded_forums_csv)"; + + if ($forum_val) $SQL['WHERE'][] = "$tbl.forum_id IN($forum_val)"; + if ($topic_val) $SQL['WHERE'][] = "$tbl.topic_id IN($topic_val)"; + if ($new_posts) $SQL['WHERE'][] = "$tbl.$time_field > $lastvisit"; + if ($new_topics) $SQL['WHERE'][] = "t.topic_time > $lastvisit"; + if ($prev_days) $SQL['WHERE'][] = "$tbl.$time_field > ". $time_opt[$time_val]['sql']; + if ($my_posts) $SQL['WHERE'][] = "p.poster_id = $poster_id_val"; + if ($my_topics) $SQL['WHERE'][] = "t.topic_poster = $poster_id_val"; + + if ($text_match_sql) + { + $field_match = ($title_match) ? "t.topic_title" : "ps.search_words" ; + $tmp_text_match_sql = $text_match_sql; + if (mb_substr($tmp_text_match_sql, 0, 1) == '+') $tmp_text_match_sql = mb_substr($tmp_text_match_sql, 1); + $tmp_text_match_sql = str_replace(' +', ' ', $tmp_text_match_sql); + $tmp_text_match_sql = extract_search_words($tmp_text_match_sql, true); + $tmp_text_match_sql = str_replace(' ', '%', $tmp_text_match_sql); + $tmp_text_match_sql = str_replace('%%%', '%', $tmp_text_match_sql); + $tmp_text_match_sql = str_replace('%%', '%', $tmp_text_match_sql); + if ($tmp_text_match_sql == '' || $tmp_text_match_sql == '%') bb_die($lang['NO_SEARCH_MATCH']); + $SQL['WHERE'][] = "$field_match LIKE '%$tmp_text_match_sql%'"; + prevent_huge_searches($SQL); + } + + if (!$SQL['WHERE']) redirect(basename(__FILE__)); + + $SQL['GROUP BY'][] = "item_id"; + $SQL['ORDER BY'][] = ($new_posts && $join_p) ? "p.topic_id ASC, p.post_time ASC" : "$order $sort"; + $SQL['LIMIT'][] = "$search_limit"; + + $items_display = fetch_search_ids($SQL); + } + else if (!$items_display = array_slice($items_found, $start, $per_page)) + { + bb_die($lang['NO_SEARCH_MATCH']); + } + + // Build SQL for displaying posts + $excluded_forums_sql = ($excluded_forums_csv) ? " AND t.forum_id NOT IN($excluded_forums_csv) " : ''; + + $sql = " + SELECT + p.post_id AS item_id, + t.*, + p.*, + h.post_html, IF(h.post_html IS NULL, pt.post_text, NULL) AS post_text, + pt.post_subject, pt.bbcode_uid, + IF(p.poster_id = $anon_id, p.post_username, u.username) AS username, u.user_id + FROM $posts_tbl + INNER JOIN $topics_tbl ON(t.topic_id = p.topic_id) + INNER JOIN $posts_text_tbl ON(pt.post_id = p.post_id) + LEFT JOIN $posts_html_tbl ON(h.post_id = pt.post_id) + INNER JOIN $users_tbl ON(u.user_id = p.poster_id) + WHERE + p.post_id IN(". join(',', $items_display) .") + $excluded_forums_sql + LIMIT $per_page + "; + + // Fetch posts data + if (!$unsorted_rows = DB()->fetch_rowset($sql)) + { + bb_die($lang['NO_SEARCH_MATCH']); + } + $tmp = $sorted_rows = array(); + + foreach ($unsorted_rows as $row) + { + $tmp[$row['post_id']] = $row; + } + foreach ($items_display as $post_id) + { + if (empty($tmp[$post_id])) + { + continue; // if post was deleted but still remain in search results + } + $topic_id = $tmp[$post_id]['topic_id']; + $sorted_rows[$topic_id][] = $tmp[$post_id]; + } + + // Output page + $new_tracks = array(); + + foreach ($sorted_rows as $topic_id => $topic_posts) + { + // Topic title block + $first_post = $topic_posts[0]; + $topic_id = (int) $topic_id; + $forum_id = (int) $first_post['forum_id']; + $is_unread_t = is_unread($first_post['topic_last_post_time'], $topic_id, $forum_id); + + $template->assign_block_vars('t', array( + 'FORUM_ID' => $forum_id, + 'FORUM_NAME' => $forum_name_html[$forum_id], + 'TOPIC_ID' => $topic_id, + 'TOPIC_TITLE' => $first_post['topic_title'], + 'TOPIC_ICON' => get_topic_icon($first_post, $is_unread_t), + )); + + $quote_btn = true; + $edit_btn = $delpost_btn = $ip_btn = (IS_MOD || IS_ADMIN); + + // Topic posts block + foreach ($topic_posts as $row_num => $post) + { + $template->assign_block_vars('t.p', array( + 'ROW_NUM' => $row_num, + 'POSTER_ID' => $post['poster_id'], + 'POSTER_NAME' => ($post['username']) ? wbr($post['username']) : $lang['GUEST'], + 'POST_ID' => $post['post_id'], + 'POST_DATE' => bb_date($post['post_time'], $bb_cfg['post_date_format']), + 'IS_UNREAD' => is_unread($post['post_time'], $topic_id, $forum_id), + 'MESSAGE' => ($chars_val == $show_all) ? get_parsed_post($post, 'full') : get_parsed_post($post, 'briefly'), + 'AVATAR' => '', + 'POSTED_AFTER' => '', + 'QUOTE' => $quote_btn, + 'EDIT' => $edit_btn, + 'DELETE' => $delpost_btn, + 'IP' => $ip_btn, + )); + + $curr_new_track_val = !empty($new_tracks[$topic_id]) ? $new_tracks[$topic_id] : 0; + $new_tracks[$topic_id] = max($curr_new_track_val, $post['post_time']); + } + } + set_tracks(COOKIE_TOPIC, $tracking_topics, $new_tracks); +} +// Displaying "as topics" mode +else +{ + $order = $order_opt[$order_val]['sql']; + $sort = $sort_opt[$sort_val]['sql']; + $per_page = $bb_cfg['topics_per_page']; + $display_as_val = $as_topics; + + // Run initial search for topic_ids + if (!$items_found) + { + $join_t = ($title_match || $my_topics || $new_topics || $dl_search || $new_posts || in_array($order_val, array($ord_last_p, $ord_created, $ord_name, $ord_repl))); + $join_s = ($text_match_sql && !$title_match); + $join_p = ($my_posts || $join_s); + $join_dl = ($dl_search); + + $tbl = ($join_p && !$join_t) ? 'p' : 't'; + $time_field = ($join_p && !$join_t) ? 'post_time' : 'topic_last_post_time'; + + // SELECT + if ($egosearch) + { + $SQL['SELECT'][] = 'p.topic_id AS item_id, MAX(p.post_time) AS max_post_time'; + } + else + { + $SQL['SELECT'][] = ($join_p && !$join_t) ? 'p.topic_id AS item_id' : 't.topic_id AS item_id'; + } + + // FROM + if ($join_t) $SQL['FROM'][] = $topics_tbl; + if ($join_s) $SQL['FROM'][] = $search_tbl; + if ($join_p) $SQL['FROM'][] = $posts_tbl; + + if (!$SQL['FROM']) + { + $join_t = true; + $SQL['FROM'][] = $topics_tbl; + } + + // WHERE + if ($join_p && $join_t) $SQL['WHERE'][] = "t.topic_id = p.topic_id"; + if ($join_s) $SQL['WHERE'][] = "ps.post_id = p.post_id"; + + if ($excluded_forums_csv) $SQL['WHERE'][] = "$tbl.forum_id NOT IN($excluded_forums_csv)"; + + if ($join_t) $SQL['WHERE'][] = "t.topic_status != ". TOPIC_MOVED; + if ($forum_val) $SQL['WHERE'][] = "$tbl.forum_id IN($forum_val)"; + if ($topic_val) $SQL['WHERE'][] = "$tbl.topic_id IN($topic_val)"; + if ($new_posts) $SQL['WHERE'][] = "$tbl.$time_field > $lastvisit"; + if ($new_topics) $SQL['WHERE'][] = "t.topic_time > $lastvisit"; + if ($prev_days) $SQL['WHERE'][] = "$tbl.$time_field > ". $time_opt[$time_val]['sql']; + if ($my_posts) $SQL['WHERE'][] = "p.poster_id = $poster_id_val"; + if ($my_topics) $SQL['WHERE'][] = "t.topic_poster = $poster_id_val"; + + if ($text_match_sql) + { + $field_match = ($title_match) ? "t.topic_title" : "ps.search_words" ; + $tmp_text_match_sql = $text_match_sql; + if (mb_substr($tmp_text_match_sql, 0, 1) == '+') $tmp_text_match_sql = mb_substr($tmp_text_match_sql, 1); + $tmp_text_match_sql = str_replace(' +', ' ', $tmp_text_match_sql); + $tmp_text_match_sql = extract_search_words($tmp_text_match_sql, true); + $tmp_text_match_sql = str_replace(' ', '%', $tmp_text_match_sql); + $tmp_text_match_sql = str_replace('%%%', '%', $tmp_text_match_sql); + $tmp_text_match_sql = str_replace('%%', '%', $tmp_text_match_sql); + if ($tmp_text_match_sql == '' || $tmp_text_match_sql == '%') bb_die($lang['NO_SEARCH_MATCH']); + $SQL['WHERE'][] = "$field_match LIKE '%$tmp_text_match_sql%'"; + prevent_huge_searches($SQL); + } + + if ($join_dl) $SQL['FROM'][] = $dl_stat_tbl; + if ($join_dl) $SQL['WHERE'][] = "dl.topic_id = t.topic_id AND dl.user_id = $dl_user_id_val AND dl.user_status IN($dl_status_csv)"; + + if (!$SQL['WHERE']) redirect(basename(__FILE__)); + + $SQL['GROUP BY'][] = "item_id"; + $SQL['LIMIT'][] = "$search_limit"; + + if ($egosearch) + { + $SQL['ORDER BY'][] = 'max_post_time DESC'; + } + else + { + $SQL['ORDER BY'][] = ($order_val == $ord_posted) ? "$tbl.$time_field $sort" : "$order $sort"; + } + + $items_display = fetch_search_ids($SQL); + } + else if (!$items_display = array_slice($items_found, $start, $per_page)) + { + bb_die($lang['NO_SEARCH_MATCH']); + } + + // Build SQL for displaying topics + $SQL = DB()->get_empty_sql_array(); + $join_dl = ($bb_cfg['show_dl_status_in_search'] && !IS_GUEST); + + $SQL['SELECT'][] = " + t.*, t.topic_poster AS first_user_id, + IF(t.topic_poster = $anon_id, p1.post_username, u1.username) AS first_username, + p2.poster_id AS last_user_id, + IF(p2.poster_id = $anon_id, p2.post_username, u2.username) AS last_username + "; + if ($join_dl) $SQL['SELECT'][] = "dl.user_status AS dl_status"; + + $SQL['FROM'][] = BB_TOPICS ." t"; + $SQL['LEFT JOIN'][] = BB_POSTS ." p1 ON(t.topic_first_post_id = p1.post_id)"; + $SQL['LEFT JOIN'][] = BB_USERS ." u1 ON(t.topic_poster = u1.user_id)"; + $SQL['LEFT JOIN'][] = BB_POSTS ." p2 ON(t.topic_last_post_id = p2.post_id)"; + $SQL['LEFT JOIN'][] = BB_USERS ." u2 ON(p2.poster_id = u2.user_id)"; + if ($join_dl) + { + $SQL['LEFT JOIN'][] = BB_BT_DLSTATUS ." dl ON(dl.user_id = $user_id AND dl.topic_id = t.topic_id)"; + } + + $SQL['WHERE'][] = "t.topic_id IN(". join(',', $items_display) .")"; + if ($excluded_forums_csv) + { + $SQL['WHERE'][] = "t.forum_id NOT IN($excluded_forums_csv)"; + } + + $SQL['LIMIT'][] = "$per_page"; + + // Fetch topics data + $topic_rows = array(); + foreach (DB()->fetch_rowset($SQL) as $row) + { + $topic_rows[$row['topic_id']] = $row; + } + if (!$topic_rows) + { + bb_die($lang['NO_SEARCH_MATCH']); + } + + // Output page + foreach ($items_display as $row_num => $item_id) + { + if (empty($topic_rows[$item_id])) + { + continue; // if topic was deleted but still remain in search results + } + $topic = $topic_rows[$item_id]; + $topic_id = $topic['topic_id']; + $forum_id = $topic['forum_id']; + $is_unread = is_unread($topic['topic_last_post_time'], $topic_id, $forum_id); + $moved = ($topic['topic_status'] == TOPIC_MOVED); + + $template->assign_block_vars('t', array( + 'ROW_NUM' => $row_num, + 'FORUM_ID' => $forum_id, + 'FORUM_NAME' => $forum_name_html[$forum_id], + 'TOPIC_ID' => $topic_id, + 'HREF_TOPIC_ID' => ($moved) ? $topic['topic_moved_id'] : $topic['topic_id'], + 'TOPIC_TITLE' => wbr($topic['topic_title']), + 'IS_UNREAD' => $is_unread, + 'TOPIC_ICON' => get_topic_icon($topic, $is_unread), + 'PAGINATION' => ($moved) ? '' : build_topic_pagination(TOPIC_URL . $topic_id, $topic['topic_replies'], $bb_cfg['posts_per_page']), + 'REPLIES' => $topic['topic_replies'], + 'ATTACH' => $topic['topic_attachment'], + 'STATUS' => $topic['topic_status'], + 'TYPE' => $topic['topic_type'], + 'DL' => ($topic['topic_dl_type'] == TOPIC_DL_TYPE_DL), + 'POLL' => $topic['topic_vote'], + 'DL_CLASS' => isset($topic['dl_status']) ? $dl_link_css[$topic['dl_status']] : '', + + 'TOPIC_AUTHOR_HREF' => ($topic['first_user_id'] != ANONYMOUS) ? $topic['first_user_id'] : '', + 'TOPIC_AUTHOR_NAME' => ($topic['first_username']) ? wbr($topic['first_username']) : $lang['GUEST'], + 'LAST_POSTER_HREF' => ($topic['last_user_id'] != ANONYMOUS) ? $topic['last_user_id'] : '', + 'LAST_POSTER_NAME' => ($topic['last_username']) ? str_short($topic['last_username'], 15) : $lang['GUEST'], + 'LAST_POST_TIME' => bb_date($topic['topic_last_post_time']), + 'LAST_POST_ID' => $topic['topic_last_post_id'], + )); + } +} + +if ($items_display) +{ + $items_count = count($items_found); + $pages = (!$items_count) ? 1 : ceil($items_count / $per_page); + $url = ($search_id) ? url_arg($url, 'id', $search_id) : $url; + + $template->assign_vars(array( + 'PAGE_TITLE' => $lang['SEARCH'], + 'PAGINATION' => generate_pagination($url, $items_count, $per_page, $start), + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], floor($start / $per_page) + 1, $pages), + + 'SEARCH_MATCHES' => ($items_count) ? sprintf($lang['FOUND_SEARCH_MATCHES'], $items_count) : '', + 'DISPLAY_AS_POSTS' => $post_mode, + + 'DL_CONTROLS' => ($dl_search && $dl_user_id_val == $user_id), + 'DL_ACTION' => "dl_list.php", + )); + + print_page('search_results.tpl'); +} + +redirect(basename(__FILE__)); + +// ----------------------------------------------------------- // +// Functions +// +function fetch_search_ids ($sql, $search_type = SEARCH_TYPE_POST, $redirect_to_result = UA_IE) +{ + global $lang, $search_id, $session_id; + global $items_found, $per_page; + + $items_found = array(); + foreach (DB()->fetch_rowset($sql) as $row) + { + $items_found[] = $row['item_id']; + } + if (!$items_count = count($items_found)) + { + bb_die($lang['NO_SEARCH_MATCH']); + } + + // Save results in DB + $search_id = make_rand_str(SEARCH_ID_LENGTH); + $redirect = ($redirect_to_result && isset($_POST['submit'])); + + if ($items_count > $per_page || $redirect) + { + $search_array = join(',', $items_found); + + $save_in_db = array( + 'order', + 'sort', + 'display_as', + 'chars', + ); + if ($GLOBALS['dl_cancel_val']) $save_in_db[] = 'dl_cancel'; + if ($GLOBALS['dl_compl_val']) $save_in_db[] = 'dl_compl'; + if ($GLOBALS['dl_down_val']) $save_in_db[] = 'dl_down'; + if ($GLOBALS['dl_will_val']) $save_in_db[] = 'dl_will'; + + $curr_set = array(); + foreach ($save_in_db as $name) + { + $curr_set[$GLOBALS["{$name}_key"]] = $GLOBALS["{$name}_val"]; + } + $search_settings = DB()->escape(serialize($curr_set)); + + $columns = 'session_id, search_type, search_id, search_time, search_settings, search_array'; + $values = "'$session_id', $search_type, '$search_id', ". TIMENOW .", '$search_settings', '$search_array'"; + + DB()->query("REPLACE INTO ". BB_SEARCH ." ($columns) VALUES ($values)"); + } + + if ($redirect) + { + redirect("search.php?id=$search_id"); + } + + return array_slice($items_found, 0, $per_page); +} + +function prevent_huge_searches ($SQL) +{ + global $bb_cfg; + + if ($bb_cfg['limit_max_search_results']) + { + $SQL['select_options'][] = 'SQL_CALC_FOUND_ROWS'; + $SQL['ORDER BY'] = array(); + $SQL['LIMIT'] = array('0'); + + if (DB()->query($SQL) AND $row = DB()->fetch_row("SELECT FOUND_ROWS() AS rows_count")) + { + if ($row['rows_count'] > $bb_cfg['limit_max_search_results']) + { +# bb_log(str_compact(DB()->build_sql($SQL)) ." [{$row['rows_count']} rows]". LOG_LF, 'sql_huge_search'); + bb_die('Too_many_search_results'); + } + } +### TEMP ### +# preg_match("#MATCH \((\w).*?\) AGAINST \('(.*?)' IN BOOLEAN MODE\)#", stripslashes($SQL['WHERE'][count($SQL['WHERE'])-1]), $m); +# $msg = date('m-d | H:i:s | ') . sprintf('%-18s', $GLOBALS['userdata']['username']) .' | '. sprintf('%04d', $row['rows_count']) .' | '. $m[1] .' | '. sprintf('%-40s', $m[2]) .' | '; +# bb_log($msg . str_compact(DB()->build_sql($SQL)) . LOG_LF, 'sql_text_search'); +### / TEMP ### + } +} + +function username_search ($search_match) +{ + global $template, $lang; + global $gen_simple_header; + + $username_list = ''; + + if (!empty($search_match)) + { + $username_search = preg_replace('/\*/', '%', clean_username($search_match)); + + $sql = " + SELECT username + FROM ". BB_USERS ." + WHERE username LIKE '". str_replace("\'", "''", $username_search) . "' + AND user_id <> ". ANONYMOUS ." + ORDER BY username + LIMIT 200 + "; + + foreach (DB()->fetch_rowset($sql) as $row) + { + $username = htmlCHR(stripslashes(html_entity_decode($row['username']))); + $username_list .= ''; + } + if (!$username_list) + { + $username_list = ''; + } + } + + $input_name = isset($_REQUEST['input_name']) ? htmlCHR($_REQUEST['input_name']) : 'username'; + + $template->assign_vars(array( + 'TPL_SEARCH_USERNAME' => true, + + 'PAGE_TITLE' => $lang['SEARCH'], + 'USERNAME' => !empty($search_match) ? htmlCHR(stripslashes(html_entity_decode($search_match))) : '', + 'INPUT_NAME' => $input_name, + 'USERNAME_OPTIONS' => $username_list, + 'SEARCH_ACTION' => "search.php?mode=searchuser&input_name=$input_name", + )); + + print_page('search.tpl', 'simple'); +} diff --git a/upload/stats/tr_stats.php b/upload/stats/tr_stats.php new file mode 100644 index 000000000..b817b43c3 --- /dev/null +++ b/upload/stats/tr_stats.php @@ -0,0 +1,35 @@ +session_start(); + +if (!IS_ADMIN) die('Unauthorized'); + +$titles[] = 'неактивные пользователи в течение 30 дней'; +$titles[] = 'неактивные пользователи в течение 90 дней'; +$titles[] = 'средний размер раздачи на трекере (сколько мегабайт)'; +$titles[] = 'сколько у нас всего раздач на трекере'; +$titles[] = 'сколько живых раздач (есть хотя бы 1 сид)'; +$titles[] = 'сколько раздач где которые сидируются больше 5 сидами'; +$titles[] = 'сколько у нас аплоадеров (те, кто залили хотя бы 1 раздачу)'; +$titles[] = 'сколько аплоадеров за последние 30 дней'; + +$sql[] = 'SELECT count(*) FROM `'.BB_USERS.'` WHERE `user_lastvisit` < UNIX_TIMESTAMP()-2592000'; +$sql[] = 'SELECT count(*) FROM `'.BB_USERS.'` WHERE `user_lastvisit` < UNIX_TIMESTAMP()-7776000'; +$sql[] = 'SELECT round(avg(size)/1048576) FROM `'.BB_BT_TORRENTS.'`'; +$sql[] = 'SELECT count(*) FROM `'.BB_BT_TORRENTS.'`'; +$sql[] = 'SELECT count(distinct(topic_id)) FROM `'.BB_BT_TRACKER_SNAP.'` WHERE seeders > 0'; +$sql[] = 'SELECT count(distinct(topic_id)) FROM `'.BB_BT_TRACKER_SNAP.'` WHERE seeders > 5'; +$sql[] = 'SELECT count(distinct(poster_id)) FROM `'.BB_BT_TORRENTS.'`'; +$sql[] = 'SELECT count(distinct(poster_id)) FROM `'.BB_BT_TORRENTS.'` WHERE reg_time >= UNIX_TIMESTAMP()-2592000'; + +foreach($sql as $i => $query) { + $res = DB()->query($query) or die('Oh shit!'); + $row = mysql_fetch_row($res); + echo "
  • {$titles[$i]} - {$row[0]}"; +} + +?> \ No newline at end of file diff --git a/upload/stats/tracker.php b/upload/stats/tracker.php new file mode 100644 index 000000000..8e557b979 --- /dev/null +++ b/upload/stats/tracker.php @@ -0,0 +1,141 @@ +query(" + CREATE TEMPORARY TABLE ". TMP_TRACKER_TABLE ." ( + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `user_id` mediumint(9) NOT NULL default '0', + `ip` char(8) binary NOT NULL default '0', + `seeder` tinyint(1) NOT NULL default '0', + `speed_up` mediumint(8) unsigned NOT NULL default '0', + `speed_down` mediumint(8) unsigned NOT NULL default '0', + `update_time` int(11) NOT NULL default '0' + ) + SELECT + topic_id, user_id, ip, seeder, speed_up, speed_down, update_time + FROM ". BB_BT_TRACKER ." +"); + +// Peers within announce interval +$stat += DB()->fetch_row("SELECT COUNT(*) AS p_within_ann FROM ". TMP_TRACKER_TABLE ." WHERE update_time >= ". (TIMENOW - $announce_interval)); +// All peers, "max_peer_time" +$stat += DB()->fetch_row("SELECT COUNT(*) AS p_all, SUM(speed_up) as speed_up, SUM(speed_down) as speed_down, UNIX_TIMESTAMP() - MIN(update_time) AS max_peer_time, UNIX_TIMESTAMP() - MAX(update_time) AS last_peer_time FROM ". TMP_TRACKER_TABLE); + + +// Active users +$stat += DB()->fetch_row("SELECT COUNT(DISTINCT user_id) AS u_bt_active FROM ". TMP_TRACKER_TABLE); +// All bt-users +$stat += DB()->fetch_row("SELECT COUNT(*) AS u_bt_all FROM ". BB_BT_USERS); +// All bb-users +$stat += DB()->fetch_row("SELECT COUNT(*) AS u_bb_all FROM ". BB_USERS); + + +// Active torrents +$stat += DB()->fetch_row("SELECT COUNT(DISTINCT topic_id) AS tor_active FROM ". TMP_TRACKER_TABLE); +// With seeder +$stat += DB()->fetch_row("SELECT COUNT(DISTINCT topic_id) AS tor_with_seeder FROM ". TMP_TRACKER_TABLE ." WHERE seeder = 1"); +// All torrents +$stat += DB()->fetch_row("SELECT COUNT(*) AS tor_all, SUM(size) AS torrents_size FROM ". BB_BT_TORRENTS); + + +// Last xx minutes +$peers_in_last_min = array(); +foreach ($peers_in_last_minutes as $t) +{ + $row = DB()->fetch_row(" + SELECT COUNT(*) AS peers FROM ". TMP_TRACKER_TABLE ." WHERE update_time >= ". (TIMENOW - 60*$t) ." + "); + $peers_in_last_min[$t] = (int) $row['peers']; +} +// Last xx seconds +$peers_in_last_sec = array(); +$rowset = DB()->fetch_rowset("SELECT COUNT(*) AS peers FROM ". TMP_TRACKER_TABLE ." GROUP BY update_time DESC LIMIT $peers_in_last_sec_limit"); +foreach ($rowset as $cnt => $row) +{ + $peers_in_last_sec[] = sprintf('%3s', $row['peers']) . (($cnt && !(++$cnt%15)) ? " \n" : ''); +} + + + +function commify_callback ($matches) +{ + return commify($matches[0]); +} +function commify_ob ($contents) +{ + return preg_replace_callback("#\b\d+\b#", 'commify_callback', $contents); +} +ob_start('commify_ob'); + + +echo ''; +echo ' +


    + +++'; + +echo "\n\n"; + +echo "\n + + +\n"; + +echo "\n + + +\n"; + +echo "\n\n"; +echo "\n\n"; + +echo "\n\n"; +echo '\n"; + +echo '
    users: bb-all / bt-all / bt-active $stat[u_bb_all] / $stat[u_bt_all] / $stat[u_bt_active]
    torrents: all / active / with seeder + $stat[tor_all] / $stat[tor_active] / $stat[tor_with_seeder] +   + [ ". humn_size($stat['torrents_size']) ." ] +
    peers: all ($stat[max_peer_time] s) / in ann interval ($announce_interval s) + $stat[p_all] / $stat[p_within_ann] +   + [ up: ". humn_size($stat['speed_up']) ."/s, + down: ". humn_size($stat['speed_down']) ."/s ] +
    peers: in last ". join(' / ', $peers_in_last_minutes) ." min". join(' / ', $peers_in_last_min) ."
    peers in last $peers_in_last_sec_limit sec
    [ per second, DESC order --> ]
    last peer: $stat[last_peer_time] seconds ago
    ". date("j M H:i:s [T O]") ."
     '. join(' ', $peers_in_last_sec) ."
    '; + +echo '
    ';
    +
    +if ($loadavg = get_loadavg())
    +{
    +	echo "\n\nloadavg: $loadavg\n\n";
    +}
    +
    +echo 'gen time: '. sprintf('%.3f', (array_sum(explode(' ', microtime())) - TIMESTART)) ." sec\n";
    +
    +echo '
    '; +echo ''; + +DB()->query("DROP TEMPORARY TABLE ". TMP_TRACKER_TABLE); + +bb_exit(); + diff --git a/upload/templates/admin/admin_attach_cp.tpl b/upload/templates/admin/admin_attach_cp.tpl new file mode 100644 index 000000000..5240433ba --- /dev/null +++ b/upload/templates/admin/admin_attach_cp.tpl @@ -0,0 +1,254 @@ + +

    {L_CONTROL_PANEL_TITLE}

    + +

    {L_CONTROL_PANEL_EXPLAIN}

    +
    + + + + +
    + + + + +
    {L_VIEW}: {S_VIEW_SELECT}   + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_STATISTIC}{L_VALUE}
    {L_NUMBER_OF_ATTACHMENTS}:{NUMBER_OF_ATTACHMENTS}
    {L_TOTAL_FILESIZE}:{TOTAL_FILESIZE}
    {L_ATTACH_QUOTA}:{ATTACH_QUOTA}
    {L_NUMBER_POSTS_ATTACH}:{NUMBER_OF_POSTS}
    {L_NUMBER_PMS_ATTACH}:{NUMBER_OF_PMS}
    {L_NUMBER_TOPICS_ATTACH}:{NUMBER_OF_TOPICS}
    {L_NUMBER_USERS_ATTACH}:{NUMBER_OF_USERS}
    +
    + + + + + + + +
    + + + + +
    {L_VIEW}: {S_VIEW_SELECT}   + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_ATTACH_SEARCH_QUERY}
    {L_FILE_NAME}:
    {L_SEARCH_WILDCARD_EXPLAIN}
    {L_FILE_COMMENT}:
    {L_SEARCH_WILDCARD_EXPLAIN}
    {L_SEARCH_AUTHOR}:
    {L_SEARCH_WILDCARD_EXPLAIN}
    {L_SIZE_SMALLER_THAN}:
    {L_SIZE_GREATER_THAN}:
    {L_COUNT_SMALLER_THAN}:
    {L_COUNT_GREATER_THAN}:
    {L_MORE_DAYS_OLD}:
    {L_SEARCH_OPTIONS}
    {L_FORUM}:
    {L_SORT_BY}: {S_SORT_OPTIONS}
    {L_SORT}: {S_SORT_ORDER}
    {S_HIDDEN_FIELDS}
    + +
    + + + + + + + +
    + + + + +
    {L_VIEW}: {S_VIEW_SELECT}  {L_SORT_BY}: {S_MODE_SELECT}  {L_ORDER} {S_ORDER_SELECT}   + +
    + + + + + + + + + + + + + + + +
    #{L_USERNAME}{L_ATTACHMENTS}{L_SIZE_IN_KB}
     {memberrow.ROW_NUMBER} {memberrow.USERNAME} {memberrow.TOTAL_ATTACHMENTS}  {memberrow.TOTAL_SIZE} 
    + + + + + + +
    {PAGE_NUMBER}{PAGINATION} 
    +
    + + + + + + + + +{L_STATISTICS_FOR_USER} + + + + +
    + + + + +
    {L_VIEW}: {S_VIEW_SELECT}  {L_SORT_BY}: {S_MODE_SELECT}  {L_ORDER} {S_ORDER_SELECT}   + + +
    + + + + + + + + + + + + + + + + + + + + + + + + {attachrow.S_HIDDEN} + + + + + +
    #{L_FILE_NAME}{L_FILE_COMMENT_CP}{L_EXTENSION}{L_SIZE_IN_KB}{L_DOWNLOADS}{L_POST_TIME}{L_POSTED_IN_TOPIC}{L_DELETE}
     {attachrow.ROW_NUMBER} {attachrow.FILENAME}{attachrow.EXTENSION}{attachrow.SIZE}{attachrow.POST_TIME}{attachrow.POST_TITLE}{attachrow.S_DELETE_BOX}
    + +   + +
    + + + {S_USER_HIDDEN} + + + + + + +
    {L_MARK_ALL} :: {L_UNMARK_ALL}
    + + + + + + +
    {PAGE_NUMBER}{PAGINATION} 
    +
    + + + + +
    diff --git a/upload/templates/admin/admin_attachments.tpl b/upload/templates/admin/admin_attachments.tpl new file mode 100644 index 000000000..5d40bc57f --- /dev/null +++ b/upload/templates/admin/admin_attachments.tpl @@ -0,0 +1,345 @@ + + + + +

    {L_MANAGE_CAT_TITLE}

    + +

    {L_MANAGE_CAT_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_SETTINGS_CAT_IMAGES}
    {L_ASSIGNED_GROUP}: {S_ASSIGNED_GROUP_IMAGES}
    {L_DISPLAY_INLINED}
    {L_DISPLAY_INLINED_EXPLAIN}
    {L_YES}   {L_NO}
    {L_CREATE_THUMBNAIL}
    {L_CREATE_THUMBNAIL_EXPLAIN}
    {L_YES}   {L_NO}
    {L_MIN_THUMB_FILESIZE}
    {L_MIN_THUMB_FILESIZE_EXPLAIN}
    {L_BYTES}
    {L_USE_GD2}
    {L_USE_GD2_EXPLAIN}
    {L_YES}   {L_NO}
    {L_IMAGICK_PATH}
    {L_IMAGICK_PATH_EXPLAIN}
    {L_MAX_IMAGE_SIZE}
    {L_MAX_IMAGE_SIZE_EXPLAIN}
    x
    {L_IMAGE_LINK_SIZE}
    {L_IMAGE_LINK_SIZE_EXPLAIN}
    x
    {S_HIDDEN_FIELDS}      
    +
    + + + + + + + +

    {L_MANAGE_TITLE}

    + +

    {L_MANAGE_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_ATTACHMENT_SETTINGS}
    {L_UPLOAD_DIR}
    {L_UPLOAD_DIR_EXPLAIN}
    {L_ATTACHMENT_IMG_PATH}
    {L_IMG_PATH_EXPLAIN}
    {L_ATTACHMENT_TOPIC_ICON}
    {L_TOPIC_ICON_EXPLAIN}
    {L_DISPLAY_ORDER}
    {L_DISPLAY_ORDER_EXPLAIN}
    + + + + + + + +
    {L_DESC}
    {L_ASC}
    {L_ATTACHMENT_FILESIZE_SETTINGS}
    {L_MAX_FILESIZE}
    {L_MAX_FILESIZE_EXPLAIN}
    {S_FILESIZE}
    {L_ATTACH_QUOTA}
    {L_ATTACH_QUOTA_EXPLAIN}
    {S_FILESIZE_QUOTA}
    {L_MAX_FILESIZE_PM}
    {L_MAX_FILESIZE_PM_EXPLAIN}
    {S_FILESIZE_PM}
    {L_DEFAULT_QUOTA_LIMIT}
    {L_DEFAULT_QUOTA_LIMIT_EXPLAIN}
    + + + + + + + + + +
    {S_DEFAULT_UPLOAD_LIMIT} {L_UPLOAD_QUOTA} 
    {S_DEFAULT_PM_LIMIT} {L_PM_QUOTA} 
    +
    {L_ATTACHMENT_NUMBER_SETTINGS}
    {L_MAX_ATTACHMENTS}
    {L_MAX_ATTACHMENTS_EXPLAIN}
    {L_MAX_ATTACHMENTS_PM}
    {L_MAX_ATTACHMENTS_PM_EXPLAIN}
    {L_ATTACHMENT_OPTIONS_SETTINGS}
    {L_DISABLE_MOD}
    {L_DISABLE_MOD_EXPLAIN}
    {L_YES}   {L_NO}
    {L_PM_ATTACH}
    {L_PM_ATTACH_EXPLAIN}
    {L_YES}   {L_NO}
    {L_FTP_UPLOAD}
    {L_FTP_UPLOAD_EXPLAIN}
    {L_YES}   {L_NO}
    {L_ATTACHMENT_FTP_SETTINGS}
    {L_ATTACHMENT_FTP_SERVER}
    {L_ATTACHMENT_FTP_SERVER_EXPLAIN}
    {L_ATTACHMENT_FTP_PATH}
    {L_ATTACHMENT_FTP_PATH_EXPLAIN}
    {L_DOWNLOAD_PATH}
    {L_DOWNLOAD_PATH_EXPLAIN}
    {L_FTP_PASSIVE_MODE}
    {L_FTP_PASSIVE_MODE_EXPLAIN}
    {L_YES}   {L_NO}
    {L_ATTACHMENT_FTP_USER}
    {L_ATTACHMENT_FTP_PASS}
    {L_ATTACHMENT_FTP_SETTINGS}
    {L_NO_FTP_EXTENSIONS}
    {S_HIDDEN_FIELDS}    
    +
    + + + + + + + +

    {L_MANAGE_QUOTAS_TITLE}

    + +

    {L_MANAGE_QUOTAS_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_MANAGE_QUOTAS_TITLE} +
    {L_DESCRIPTION}{L_SIZE}{L_ADD_NEW}
    {S_FILESIZE}
    {S_HIDDEN_FIELDS}
    {L_DESCRIPTION}{L_SIZE}{L_DELETE}
    + + + + + + +
    {L_VIEW}
    +
    {limit_row.S_FILESIZE}
    +
    + + + + +

    {L_QUOTA_LIMIT_DESC}

    + + + + + + + + + + + + + + +
    + + + + + + + +
    {L_ASSIGNED_USERS} - {L_UPLOAD_QUOTA}
    + +
    +
    +     + + + + + + + + +
    {L_ASSIGNED_GROUPS} - {L_UPLOAD_QUOTA}
    + +
    +
    +     +
    + + + + + + + +
    {L_ASSIGNED_USERS} - {L_PM_QUOTA}
    + +
    +
    +     + + + + + + + + +
    {L_ASSIGNED_GROUPS} - {L_PM_QUOTA}
    + +
    +
    + + + + + +
    \ No newline at end of file diff --git a/upload/templates/admin/admin_board.tpl b/upload/templates/admin/admin_board.tpl new file mode 100644 index 000000000..0ba61941a --- /dev/null +++ b/upload/templates/admin/admin_board.tpl @@ -0,0 +1,211 @@ + +

    {L_GENERAL_CONFIG}

    + +

    {L_CONFIG_EXPLAIN}

    +
    + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_GENERAL_SETTINGS}

    {L_SITE_NAME}

    {L_SITE_DESC}

    {L_BOARD_DISABLE}

    {L_BOARD_DISABLE_EXPLAIN}
    {L_YES}   {L_NO}

    {L_ACCT_ACTIVATION}

    +
    {L_ACC_NONE}
    +
    {L_ACC_USER}
    +
    {L_ACC_ADMIN}
    +

    {L_VISUAL_CONFIRM}

    {L_VISUAL_CONFIRM_EXPLAIN}
    {L_YES}   {L_NO}

    {L_ALLOW_AUTOLOGIN}

    {L_ALLOW_AUTOLOGIN_EXPLAIN}
    {L_YES}   {L_NO}

    {L_AUTOLOGIN_TIME}

    {L_AUTOLOGIN_TIME_EXPLAIN}
    days

    {L_BOARD_EMAIL_FORM}

    {L_BOARD_EMAIL_FORM_EXPLAIN}
    {L_ENABLED}   {L_DISABLED}

    {L_FLOOD_INTERVAL}

    {L_FLOOD_INTERVAL_EXPLAIN}
    sec

    {L_TOPICS_PER_PAGE}

    {L_POSTS_PER_PAGE}

    {L_HOT_THRESHOLD}

    {L_DEFAULT_LANGUAGE}

    {LANG_SELECT}

    {L_DATE_FORMAT}

    {L_DATE_FORMAT_EXPLAIN}

    {L_SYSTEM_TIMEZONE}

    {TIMEZONE_SELECT}

    {L_ENABLE_PRUNE}

    {L_YES}   {L_NO}
    {L_PRIVATE_MESSAGING}

    {L_DISABLE_PRIVMSG}

    {L_ENABLED}   {L_DISABLED}

    {L_INBOX_LIMITS}

    {L_SENTBOX_LIMITS}

    {L_SAVEBOX_LIMITS}

    {L_ABILITIES_SETTINGS}

    {L_MAX_POLL_OPTIONS}

    {L_ALLOW_BBCODE}

    {L_YES}   {L_NO}

    {L_ALLOW_SMILIES}

    {L_YES}   {L_NO}

    {L_SMILIES_PATH}

    {L_SMILIES_PATH_EXPLAIN}

    {L_ALLOW_SIG}

    {L_YES}   {L_NO}

    {L_MAX_SIG_LENGTH}

    {L_MAX_SIG_LENGTH_EXPLAIN}

    {L_ALLOW_NAME_CHANGE}

    {L_YES}   {L_NO}
    {L_AVATAR_SETTINGS}

    {L_ALLOW_LOCAL}

    {L_YES}   {L_NO}

    {L_ALLOW_REMOTE}

    {L_ALLOW_REMOTE_EXPLAIN}
    {L_YES}   {L_NO}

    {L_ALLOW_UPLOAD}

    {L_YES}   {L_NO}

    {L_MAX_FILESIZE}

    {L_MAX_FILESIZE_EXPLAIN}
    Bytes

    {L_MAX_AVATAR_SIZE}

    {L_MAX_AVATAR_SIZE_EXPLAIN}
    x

    {L_AVATAR_STORAGE_PATH}

    {L_AVATAR_STORAGE_PATH_EXPLAIN}

    {L_AVATAR_GALLERY_PATH}

    {L_AVATAR_GALLERY_PATH_EXPLAIN}
    {L_EMAIL_SETTINGS}

    {L_ADMIN_EMAIL}

    {L_EMAIL_SIG}

    {L_EMAIL_SIG_EXPLAIN}

    {L_USE_SMTP}

    {L_USE_SMTP_EXPLAIN}
    {L_YES}   {L_NO}

    {L_SMTP_SERVER}

    {L_SMTP_USERNAME}

    {L_SMTP_USERNAME_EXPLAIN}

    {L_SMTP_PASSWORD}

    {L_SMTP_PASSWORD_EXPLAIN}
    +    +
    + +
    + +
    \ No newline at end of file diff --git a/upload/templates/admin/admin_bt_forum_cfg.tpl b/upload/templates/admin/admin_bt_forum_cfg.tpl new file mode 100644 index 000000000..ae7105a88 --- /dev/null +++ b/upload/templates/admin/admin_bt_forum_cfg.tpl @@ -0,0 +1,190 @@ +

    {L_FORUM_CFG_TITLE}

    + +
    +{S_HIDDEN_FIELDS} + + ++++ + + + + + + + + + + + + + + + +
    {L_BT_SELECT_FORUMS}
    {L_ALLOW_REG_TRACKER}{L_SELF_MODERATED}{L_ALLOW_DL_TOPIC}
    {S_ALLOW_REG_TRACKER}{S_SELF_MODERATED}{S_ALLOW_DL_TOPIC}
    {L_BT_SELECT_FORUMS_EXPL}
    + +
    + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_BT_ANNOUNCE_URL_HEAD}

    {L_BT_ANNOUNCE_URL}

    {L_BT_ANNOUNCE_URL_EXPL}

    {L_BT_DISABLE_DHT}

    {L_BT_DISABLE_DHT_EXPL}

    {L_BT_CHECK_ANNOUNCE_URL}

    {L_BT_CHECK_ANNOUNCE_URL_EXPL}

    {L_BT_REPLACE_ANN_URL}

    {L_BT_REPLACE_ANN_URL_EXPL}

    {L_BT_DEL_ADDIT_ANN_URLS}

    {L_BT_DEL_ADDIT_ANN_URLS_EXPL}

    {L_BT_ADD_COMMENT}

    {L_BT_ADD_COMMENT_EXPL}

    {L_BT_ADD_PUBLISHER}

    {L_BT_ADD_PUBLISHER_EXPL}
    {L_BT_SHOW_PEERS_HEAD}

    {L_BT_SHOW_PEERS}

    {L_BT_SHOW_PEERS_EXPL}

    {L_BT_SHOW_PEERS_MODE}

    +
    +
    +
    +

    {L_BT_ALLOW_SPMODE_CHANGE}

    {L_BT_ALLOW_SPMODE_CHANGE_EXPL}

    {L_BT_SHOW_IP_ONLY_MODER}

    {L_BT_SHOW_PORT_ONLY_MODER}

    {L_BT_SHOW_DL_LIST_HEAD}

    {L_BT_SHOW_DL_LIST}

    {L_BT_DL_LIST_ONLY_1ST_PAGE}

    {L_BT_DL_LIST_ONLY_COUNT}

    +

    {L_BT_SHOW_DL_LIST_BUTTONS}

    + + + + + + + + + + + + + + + + + + + +
    {L_BT_SHOW_DL_BUT_WILL}
    {L_BT_SHOW_DL_BUT_DOWN}
    {L_BT_SHOW_DL_BUT_COMPL}
    {L_BT_SHOW_DL_BUT_CANCEL}
    +

    {L_BT_SET_DLTYPE_ON_TOR_REG}

    {L_BT_SET_DLTYPE_ON_TOR_REG_EXPL}

    {L_BT_UNSET_DLTYPE_ON_TOR_UNREG}

    {L_BT_ADD_AUTH_KEY_HEAD}

    {L_BT_ADD_AUTH_KEY}

    {L_BT_GEN_PASSKEY_ON_REG}

    {L_BT_GEN_PASSKEY_ON_REG_EXPL}
    {L_BT_TOR_BROWSE_ONLY_REG_HEAD}

    {L_BT_TOR_BROWSE_ONLY_REG}

    {L_BT_SEARCH_BOOL_MODE}

    {L_BT_SEARCH_BOOL_MODE_EXPL}
    {L_BT_SHOW_DL_STAT_ON_INDEX_HEAD}

    {L_BT_SHOW_DL_STAT_ON_INDEX}

    {L_BT_NEWTOPIC_AUTO_REG}

    +    +    + +
    + +
    + +
    + diff --git a/upload/templates/admin/admin_bt_tracker_cfg.tpl b/upload/templates/admin/admin_bt_tracker_cfg.tpl new file mode 100644 index 000000000..073bc6dda --- /dev/null +++ b/upload/templates/admin/admin_bt_tracker_cfg.tpl @@ -0,0 +1,125 @@ +

    {L_CONFIGURATION_TITLE}

    + +
    + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_TRACKER_SETTINGS}
    +

    Changes disabled (see $tr_cfg in config.php)

    +

    {L_OFF}

    {L_OFF_REASON}

    {L_OFF_REASON_EXPL}
     

    {L_AUTOCLEAN}

    Used in cron Tracker cleanup and dlstat
    {L_AUTOCLEAN_EXPL}

    {L_COMPACT_MODE}

    {L_COMPACT_MODE_EXPL}

    {L_BROWSER_REDIRECT_URL}

    {L_BROWSER_REDIRECT_URL_EXPL}
       
    {L_USE_AUTH_KEY_HEAD}

    {L_USE_AUTH_KEY}

    {L_USE_AUTH_KEY_EXPL}
      {L_YES}

    {L_AUTH_KEY_NAME}

    $bb_cfg['passkey_key']
    {L_AUTH_KEY_NAME_EXPL}
      {PASSKEY_KEY}

    {L_ALLOW_GUEST_DL}

    {L_ALLOW_GUEST_DL_EXPL}
      {L_NO}
    {L_LIMIT_ACTIVE_TOR_HEAD}

    {L_NUMWANT}

    {L_NUMWANT_EXPL}
     

    {L_LIMIT_ACTIVE_TOR}

    {L_LIMIT_SEED_COUNT}

    {L_LIMIT_SEED_COUNT_EXPL}
      torrents

    {L_LIMIT_LEECH_COUNT}

    {L_LIMIT_LEECH_COUNT_EXPL}
      torrents

    {L_LEECH_EXPIRE_FACTOR}

    {L_LEECH_EXPIRE_FACTOR_EXPL}
      minutes

    {L_LIMIT_CONCURRENT_IPS}

    {L_LIMIT_CONCURRENT_IPS_EXPL}

    {L_LIMIT_SEED_IPS}

    {L_LIMIT_SEED_IPS_EXPL}
      IP's

    {L_LIMIT_LEECH_IPS}

    {L_LIMIT_LEECH_IPS_EXPL}
      IP's
    {L_ANNOUNCE_INTERVAL_HEAD}

    {L_ANNOUNCE_INTERVAL}

    $bb_cfg['announce_interval']
    {L_ANNOUNCE_INTERVAL_EXPL}
      {ANNOUNCE_INTERVAL} seconds

    {L_EXPIRE_FACTOR}

    {L_EXPIRE_FACTOR_EXPL}
     

    {L_UPDATE_DLSTAT}

    Used in cron Tracker cleanup and dlstat

    {L_IGNORE_GIVEN_IP}

    $bb_cfg['ignore_reported_ip']
    {L_IGNOR_GIVEN_IP_EXPL}
      {L_YES}{L_NO}
    + + {S_HIDDEN_FIELDS} +   +   +   + + +
    +
    + +
    + diff --git a/upload/templates/admin/admin_cron.tpl b/upload/templates/admin/admin_cron.tpl new file mode 100644 index 000000000..08cb6197e --- /dev/null +++ b/upload/templates/admin/admin_cron.tpl @@ -0,0 +1,241 @@ + + + +
    + + + + + + + + + + + + + + + + + + + +{LIST} + +
    + {L_CRON_LIST} +
    + + + + {L_CRON_ID} + + + + {L_CRON_ACTIVE} + + + + {L_CRON_TITLE} + + + + {L_CRON_SCRIPT} + + + + {L_CRON_SCHEDULE} + + + + {L_CRON_LAST_RUN} + + + + {L_CRON_NEXT_RUN} + + + + {L_CRON_RUN_COUNT} + + + + {L_CRON_MANAGE} + +
    + + + + + + + + + + + + + + + +
    + {L_CRON_OPTIONS} +
    {L_CRON_ENABLED}
    {L_CRON_CHECK_INTERVAL}
    + {L_WITH_SELECTED} + + +    +
    +
    +
    +
    +{L_RUN_MAIN_CRON}
    +{L_ADD_JOB} +
    +{CRON_ACTION} + +
    {L_CRON_WORKS} +{L_REPAIR_CRON}
    + + + + + + +

    {L_CRON_EDIT_HEAD}

    +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_CRON_EDIT_HEAD}

    {L_CRON_ID}

    {CRON_ID}

    {L_CRON_ACTIVE}

    {L_CRON_ACTIVE_EXPL}

    {L_CRON_TITLE}

    {L_CRON_SCRIPT}

    {L_CRON_SCRIPT_EXPL}

    {L_SCHEDULE}

    {SCHEDULE}

    {L_RUN_DAY}

    {L_RUN_DAY_EXPL}
    {RUN_DAY}

    {L_RUN_TIME}

    {L_RUN_TIME_EXPL}

    {L_RUN_ORDER}

    {L_LAST_RUN}

    {L_NEXT_RUN}

    {L_RUN_INTERVAL}

    {L_RUN_INTERVAL_EXPL}

    {L_LOG_ENABLED}

    {L_LOG_FILE}

    {L_LOG_FILE_EXPL}

    {L_LOG_SQL_QUERIES}

    {L_DISABLE_BOARD}

    {L_DISABLE_BOARD_EXPL}

    {L_RUN_COUNTER}

    +    +    + +
    + +
    + \ No newline at end of file diff --git a/upload/templates/admin/admin_disallow.tpl b/upload/templates/admin/admin_disallow.tpl new file mode 100644 index 000000000..0622d6419 --- /dev/null +++ b/upload/templates/admin/admin_disallow.tpl @@ -0,0 +1,31 @@ + +

    {L_DISALLOW_TITLE}

    + +

    {L_DISALLOW_EXPLAIN}

    +
    + +
    + + +++ + + + + + + + + + + + + + + + + +
    {L_ADD_DISALLOW}

    {L_USERNAME}

    {L_ADD_EXPLAIN}
     
    {L_DELETE_DISALLOW}

    {L_USERNAME}

    {L_DELETE_EXPLAIN}
    {S_DISALLOW_SELECT} 
     
    + +
    diff --git a/upload/templates/admin/admin_extensions.tpl b/upload/templates/admin/admin_extensions.tpl new file mode 100644 index 000000000..7f5a20023 --- /dev/null +++ b/upload/templates/admin/admin_extensions.tpl @@ -0,0 +1,220 @@ + + + + +

    {L_EXTENSIONS_TITLE}

    + +

    {L_EXTENSIONS_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_EXTENSIONS_TITLE} +
     {L_EXPLANATION}  {L_EXTENSION}  {L_EXTENSION_GROUP}  {L_ADD_NEW} 
    {S_ADD_GROUP_SELECT}
    {S_HIDDEN_FIELDS}
     {L_EXPLANATION}  {L_EXTENSION}  {L_EXTENSION_GROUP}  {L_DELETE} 
    {extension_row.EXTENSION}{extension_row.S_GROUP_SELECT}
    + +
    + +
    + + + + + + + +{GROUP_PERMISSIONS_BOX} + +

    {L_EXTENSION_GROUPS_TITLE}

    + +

    {L_EXTENSION_GROUPS_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_EXTENSION_GROUPS_TITLE} +
     {L_EXTENSION_GROUP}  {L_SPECIAL_CATEGORY}  {L_ALLOWED}  {L_DOWNLOAD_MODE}  {L_UPLOAD_ICON}  {L_MAX_FILESIZE}  {L_ALLOWED_FORUMS}  {L_ADD_NEW} 
    + + + + + +
     
    +
    {S_SELECT_CAT}{S_ADD_DOWNLOAD_MODE} {S_FILESIZE} 
     {L_EXTENSION_GROUP}  {L_SPECIAL_CATEGORY}  {L_ALLOWED}  {L_DOWNLOAD_MODE}  {L_UPLOAD_ICON}  {L_MAX_FILESIZE}  {L_ALLOWED_FORUMS}  {L_DELETE} 
    + + + + + +
    {grouprow.CAT_BOX}
    +
    {grouprow.S_SELECT_CAT}{grouprow.S_DOWNLOAD_MODE} {grouprow.S_FILESIZE}{L_FORUM_PERMISSIONS}
    {grouprow.extensionrow.EXTENSION}{grouprow.extensionrow.EXPLANATION}      
    + +
    + +
    + + + + + + + +

    {L_GROUP_PERMISSIONS_TITLE}

    + +

    {L_GROUP_PERMISSIONS_EXPLAIN}

    +
    + + + + + + + +
    +
    + + + + + + + + + + +
    {L_ALLOWED_FORUMS}
    + +
     
    +
    +
    +
    + + + + + + + + + + +
    {L_ADD_FORUMS}
    + +
       
    +
    +
    + + + + +
    + diff --git a/upload/templates/admin/admin_forum_prune.tpl b/upload/templates/admin/admin_forum_prune.tpl new file mode 100644 index 000000000..f00b4e64c --- /dev/null +++ b/upload/templates/admin/admin_forum_prune.tpl @@ -0,0 +1,51 @@ + +

    {L_FORUM_PRUNE}

    + + +

    {L_PRUNE_EXPLAIN}

    + + + +

    {L_FORUM}: {FORUM_NAME}

    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_FORUM}{L_TOPICS_PRUNED}
    {pruned.FORUM_NAME}{pruned.PRUNED_TOPICS}
    {L_PRUNE_RESULT}
    {L_FORUM_PRUNE}
    {SEL_FORUM}
    +

    {L_PRUNE_TOPICS} {L_DAYS}

    +

    +
    + +
    + +
    \ No newline at end of file diff --git a/upload/templates/admin/admin_forumauth.tpl b/upload/templates/admin/admin_forumauth.tpl new file mode 100644 index 000000000..3ba6e9117 --- /dev/null +++ b/upload/templates/admin/admin_forumauth.tpl @@ -0,0 +1,68 @@ +

    {L_AUTH_TITLE}

    + +

    {L_AUTH_EXPLAIN}

    +
    + + + + +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + +
    {L_AUTH_SELECT}
    +

    {S_AUTH_SELECT}

    +

    +

    + +
    + +



    + + + + + + +

    {L_FORUM}: {FORUM_NAME}

    + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + +
    {L_AUTH_TITLE}
    {forum_auth.CELL_TITLE}{forum_auth.S_AUTH_LEVELS_SELECT}
    {U_SWITCH_MODE}
    +    + +
    + +
    + + + + + diff --git a/upload/templates/admin/admin_forumauth_list.tpl b/upload/templates/admin/admin_forumauth_list.tpl new file mode 100644 index 000000000..55404bd40 --- /dev/null +++ b/upload/templates/admin/admin_forumauth_list.tpl @@ -0,0 +1,94 @@ + + + + +

    {L_AUTH_TITLE}

    + +

    {L_AUTH_EXPLAIN}

    +
    + + + + + + + + + + + + + + + + + + + + + +
    {L_FORUM_NAME}{forum_auth_titles.CELL_TITLE}
    {cat_row.CAT_NAME}
    {cat_row.forum_row.FORUM_NAME}{cat_row.forum_row.forum_auth_data.CELL_VALUE}
    +
    + + + + + + + +

    {L_AUTH_TITLE}

    + +

    {L_AUTH_EXPLAIN}

    + +

    {L_CATEGORY} : {CAT_NAME}

    + + + + + + + + + + + + + + + + + + + + + +
    {L_FORUM_NAME}{forum_auth_titles.CELL_TITLE}
    {cat_row.CAT_NAME}
    {cat_row.forum_row.FORUM_NAME}{cat_row.forum_row.forum_auth_data.CELL_VALUE}
    +
    + +
    + + + + + + + + + + + + + + + + +
     {forum_auth_titles.CELL_TITLE}
    {CAT_NAME}{forum_auth_data.S_AUTH_LEVELS_SELECT}
    {S_HIDDEN_FIELDS} + +    + +
    +
    + + + + diff --git a/upload/templates/admin/admin_forums.tpl b/upload/templates/admin/admin_forums.tpl new file mode 100644 index 000000000..a5b1a898c --- /dev/null +++ b/upload/templates/admin/admin_forums.tpl @@ -0,0 +1,234 @@ + + + + + + +

    {L_FORUM_TITLE}

    + +

    {L_FORUM_EXPLAIN}

    +
    + +
    +{S_HIDDEN_FIELDS} +{SID_HIDDEN} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_FORUM_SETTINGS}
    {L_FORUM_NAME}
    {L_FORUM_DESCRIPTION}
    {L_PARENT_FORUM}
    {L_CATEGORY}
    {L_SHOW_ON_INDEX}
    {L_FORUM_STATUS}
    {L_AUTO_PRUNE} + + + + + + + + + +
    {L_ENABLED}
    {L_PRUNE_DAYS}  {L_DAYS}
    {L_SORT_BY} +   +   +
    +
    + + + + + + + +

    {L_EDIT_CAT}

    + +

    {L_EDIT_CAT_EXPL}

    +
    + +
    +{S_HIDDEN_FIELDS} +{SID_HIDDEN} + + ++ + + + + + +
    {L_EDIT_CAT}
    + {L_CATEGORY}: +   + +
    + +
    + + + + + + + +

    {DELETE_TITLE}

    + +

    {L_DELETE_EXPL}

    +
    + +
    +{S_HIDDEN_FIELDS} +{SID_HIDDEN} + + +++ + + + + + + + + + + + + + + + +
    {DELETE_TITLE}
    {CAT_FORUM_NAME}{WHAT_TO_DELETE}
    {L_MOVE_CONTENTS} + + {NOWHERE_TO_MOVE} + + + +
    + +
    + +
    + + + + + + + + + + + +

    {L_FORUM_TITLE}

    + +

    {L_FORUM_EXPLAIN}

    +
    + +
    +{SID_HIDDEN} + + + + + + + + + + + + + + + + + + + +
     ↑  ↓  + + {catrow.CAT_DESC} + + + {L_CREATE_FORUM} + | + {L_EDIT} + | + {L_DELETE} + + {L_PRUNE}
     ↑  ↓ {catrow.forumrow.FORUM_NAME} {L_EDIT}  +sub  {L_RESYNC}  {L_REMOVE} {catrow.forumrow.PRUNE_DAYS}
    + + + + + + +
    + +
    + +
    +

    {L_SHOW_ALL_FORUMS_ON_ONE_PAGE}

    +
    + + + + + + diff --git a/upload/templates/admin/admin_groups.tpl b/upload/templates/admin/admin_groups.tpl new file mode 100644 index 000000000..4473c7fac --- /dev/null +++ b/upload/templates/admin/admin_groups.tpl @@ -0,0 +1,103 @@ + + + + +

    {L_GROUP_ADMINISTRATION}

    + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {T_GROUP_EDIT_DELETE}
    {L_GROUP_NAME}:
    {L_GROUP_DESCRIPTION}:
    {L_GROUP_MODERATOR}:  
    {L_GROUP_STATUS}: +
    {L_GROUP_OPEN}
    +
    {L_GROUP_CLOSED}
    +
    {L_GROUP_HIDDEN}
    +
    {L_DELETE_OLD_GROUP_MOD} + {L_YES} +
    {L_DELETE_OLD_GROUP_MOD_EXPL}
    +
    {L_GROUP_DELETE}: {L_GROUP_DELETE_CHECK}
    {L_UPLOAD_QUOTA}{S_SELECT_UPLOAD_QUOTA}
    {L_PM_QUOTA}{S_SELECT_PM_QUOTA}
    +    + +
    + +
    + + + + + + + +

    {L_GROUP_ADMINISTRATION}

    + +

    {L_GROUP_ADMIN_EXPLAIN}

    + +

    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + +
    {L_SELECT_GROUP}
    + {S_GROUP_SELECT}   +
    +
    + +



    + + + + diff --git a/upload/templates/admin/admin_log.tpl b/upload/templates/admin/admin_log.tpl new file mode 100644 index 000000000..b64f8feaa --- /dev/null +++ b/upload/templates/admin/admin_log.tpl @@ -0,0 +1,216 @@ + + + +
    + +
    + + + + + + + + + + + + + + + +
    Log actions: search options
    + + + + + + +
    +
    + Forum +
    +

    {SEL_FORUM}

    +
    +
    +
    +
    + Action +
    +

    {SEL_LOG_TYPE}

    +
    +
    +
    +
    + User +
    +

    {SEL_USERS}

    +
    +
    +
    +
    + + + + + + +
    +
    + Logs from (first: {FIRST_LOG_TIME}) +
    +

    + + & + + days back +

    +
    +
    +
    +
    + Topic title match +
    +

    +
    +
    +
    +
    + Sort by +
    +

    + + + +

    +
    +
    +
    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    ActionUsernameTimeInfo
    {log.ACTION_DESC} + +
    {log.USER_IP}
    +
    +
    {log.TIME}
    + +
    + +
    {log.MSG}
    + + +
    + {log.TOPIC_TITLE} + + + + + » + {log.TOPIC_TITLE_NEW} + + +
    + + + + +
    {L_NO_MATCH}
    + + + +
    + + +
    + + + +
    + +
    +Filter + + + + + + + + + + + + + + +
    +

    Forums:

    +
    + +

    {forums.FORUM_NAME}

    + +
    +
    +

    Topics:

    +
    + +

    {topics.TOPIC_TITLE}

    + +
    +
    +

    Users:

    +
    + +

    {users.USERNAME}

    + +
    +
    +
    + + diff --git a/upload/templates/admin/admin_mass_email.tpl b/upload/templates/admin/admin_mass_email.tpl new file mode 100644 index 000000000..a7d9f0154 --- /dev/null +++ b/upload/templates/admin/admin_mass_email.tpl @@ -0,0 +1,30 @@ + +

    {L_EMAIL}

    + +

    {L_EMAIL_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + +
    {L_COMPOSE}
    {L_RECIPIENTS}{S_GROUP_SELECT}
    {L_EMAIL_SUBJECT}
    {L_MESSAGE} + +
    + +
    \ No newline at end of file diff --git a/upload/templates/admin/admin_ranks.tpl b/upload/templates/admin/admin_ranks.tpl new file mode 100644 index 000000000..5179eea84 --- /dev/null +++ b/upload/templates/admin/admin_ranks.tpl @@ -0,0 +1,83 @@ + + + + +

    {L_RANKS_TITLE}

    + +

    {L_RANKS_TEXT}

    +
    + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + +
    {L_RANKS_TITLE}

    {L_RANK_TITLE}

    + +

    {L_RANK_IMAGE}:

    + +

    + {IMAGE_DISPLAY} +

    +
    {L_RANK_IMAGE_EXPLAIN}
    +
    +     + +
    + +
    + + + + + + + +

    {L_RANKS_TITLE}

    + +

    {L_RANKS_TEXT}

    +
    + +
    + + + + + + + + + + + + + + + + + + + +
    {L_RANK}Image{L_EDIT}{L_DELETE}
    {ranks.RANK}{ranks.IMAGE_DISPLAY}{L_EDIT}{L_DELETE}
    + +
    + +
    + + + diff --git a/upload/templates/admin/admin_rebuild_search.tpl b/upload/templates/admin/admin_rebuild_search.tpl new file mode 100644 index 000000000..2768fd3ca --- /dev/null +++ b/upload/templates/admin/admin_rebuild_search.tpl @@ -0,0 +1,259 @@ + + + + + + +

    {L_REBUILD_SEARCH}

    + +

    {L_REBUILD_SEARCH_DESC}

    + +
    + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_REBUILD_SEARCH}

    {L_STARTING_POST_ID}

    {L_STARTING_POST_ID_EXPLAIN}
    + + + + + + + +

    {L_CLEAR_SEARCH_TABLES}

    {L_CLEAR_SEARCH_TABLES_EXPLAIN}
    + {L_CLEAR_SEARCH_NO}  + {L_CLEAR_SEARCH_DELETE}  + {L_CLEAR_SEARCH_TRUNCATE}  +

    {L_NUM_OF_POSTS}

    {L_NUM_OF_POSTS_EXPLAIN}

    {L_POSTS_PER_CYCLE}

    {L_POSTS_PER_CYCLE_EXPLAIN}

    {L_TIME_LIMIT}

    {L_TIME_LIMIT_EXPLAIN}

    {L_REFRESH_RATE}

    {L_REFRESH_RATE_EXPLAIN}
    {LAST_SAVED_PROCESSING}
    + + +
    + +
    + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    {L_REBUILD_SEARCH_PROGRESS}
    +
    {PROCESSING_POSTS}
    +
    {PROCESSING_MESSAGES}
    +
    +
    + + + + + + + + + + + + + + +
    {L_PROCESSING_POST_DETAILS}
    {L_CURRENT_SESSION} {SESSION_DETAILS} +

    {SESSION_PERCENT}

    + +
    +
    +
    + +
    {L_TOTAL} {TOTAL_DETAILS} +

    {TOTAL_PERCENT}

    + +
    +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_PROCESSING_TIME_DETAILS}
    {L_TIME_LAST_POSTS_ADMIN} {LAST_CYCLE_TIME}{L_TIME_BEGINNING} {SESSION_TIME}
    {L_TIME_AVERAGE} {SESSION_AVERAGE_CYCLE_TIME}{L_TIME_ESTIMATED} {SESSION_ESTIMATED_TIME}
    {L_SIZE_SEARCH_TABLES} {SEARCH_TABLES_SIZE}Data size {SEARCH_DATA_SIZE}
    {L_SIZE_ESTIMATED} {FINAL_SEARCH_TABLES_SIZE}Index size {SEARCH_INDEX_SIZE}
    + {L_STARTING_POST_ID}: {START_POST}, + {L_POSTS_LAST_CYCLE}: {POST_LIMIT}, + {L_TIME_LIMIT}: {TIME_LIMIT} +
    + +
    {L_ESTIMATED_VALUES}
    +   + +     + + + +
    + +
    + + + + diff --git a/upload/templates/admin/admin_smilies.tpl b/upload/templates/admin/admin_smilies.tpl new file mode 100644 index 000000000..c169cc996 --- /dev/null +++ b/upload/templates/admin/admin_smilies.tpl @@ -0,0 +1,118 @@ + + + + +

    {L_SMILEY_TITLE}

    + +

    {L_SMILEY_TEXT}

    +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + + + + + + +
    {L_CODE}{L_SMILE}{L_EMOT}{L_ACTION}
    {smiles.CODE}{smiles.CODE}{smiles.EMOT}{L_EDIT}{L_DELETE}
        
    + +
    + + + + + + + +

    {L_SMILEY_TITLE}

    + +

    {L_SMILEY_EXPLAIN}

    +
    + + + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + + + + + + +
    {L_SMILEY_CONFIG}
    {L_SMILEY_CODE}
    {L_SMILEY_URL}    
    {L_SMILEY_EMOTION}
    + +
    + + + + + + + +

    {L_SMILEY_TITLE}

    + +

    {L_SMILEY_EXPLAIN}

    +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + + + + + +
    {L_SMILEY_IMPORT}
    {L_SELECT_LBL}{S_SMILE_SELECT}
    {L_DEL_EXISTING}
    {L_CONFLICTS}
    {L_REPLACE_EXISTING}   {L_KEEP_EXISTING}
    + +
    + + + + diff --git a/upload/templates/admin/admin_topic_templates.tpl b/upload/templates/admin/admin_topic_templates.tpl new file mode 100644 index 000000000..1c968a9cf --- /dev/null +++ b/upload/templates/admin/admin_topic_templates.tpl @@ -0,0 +1,28 @@ +

    {L_ADMIN_TITLE}

    + +

    {L_ADMIN_TEXT}

    +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + +
    {L_FORUM}{L_TEMPLATE}
    {forum.FORUM_NAME}{forum.TPL_SELECT}
    +    + +
    + +
    diff --git a/upload/templates/admin/admin_ug_auth.tpl b/upload/templates/admin/admin_ug_auth.tpl new file mode 100644 index 000000000..1d0ce49dc --- /dev/null +++ b/upload/templates/admin/admin_ug_auth.tpl @@ -0,0 +1,332 @@ + + + + + + +
    +{S_HIDDEN_FIELDS} + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_FORUM}{L_MODERATOR_STATUS}{acltype.ACL_TYPE_NAME}
    + +
      {c.CAT_TITLE}
    {c.f.SF_SPACER}{c.f.FORUM_NAME}
    {c.f.SF_SPACER}{c.f.FORUM_NAME}
    + onclick="flip_mod('{c.f.FORUM_ID}', '{AUTH_MOD_BF}');" + + onmouseover="hl('{c.f.FORUM_ID}', '{AUTH_MOD_BF}', 1);" + onmouseout="hl('{c.f.FORUM_ID}', '{AUTH_MOD_BF}', 0);" + class="{c.f.MOD_CLASS}">{c.f.MOD_STATUS} + onclick="flip_perm('{c.f.acl.FORUM_ID}', '{c.f.acl.ACL_TYPE_BF}');" + + onmouseover="hl('{c.f.acl.FORUM_ID}', '{c.f.acl.ACL_TYPE_BF}', 1);" + onmouseout="hl('{c.f.acl.FORUM_ID}', '{c.f.acl.ACL_TYPE_BF}', 0);" + class="{c.f.acl.ACL_CLASS}Disabled">{c.f.acl.PERM_SIGN}
    + +
    + +
    +

    {L_SHOW_ALL_FORUMS_ON_ONE_PAGE}

    +
    + + + +disabled="disabled" /> + +disabled="disabled" /> + + + + + +
    + +
    +{S_HIDDEN_FIELDS} + +

    {L_PERMISSIONS} ({T_AUTH_TITLE})

    +

    {T_USER_OR_GROUPNAME}: {USER_OR_GROUPNAME}

    +{USER_LEVEL}   +

    {T_AUTH_EXPLAIN}

    + +
    + + + + + + + + + +

    {L_USER_ADMIN}

    + +

    {L_USER_AUTH_EXPLAIN}

    +

    + +
    + +{S_HIDDEN_FIELDS} + + + + + + + + +
    {L_USER_SELECT}
    +

    + + +

    +

    + +

    +
    + +
    + +



    + + + + + + + +

    {L_GROUP_ADMINISTRATION}

    + +

    {L_GROUP_AUTH_EXPLAIN}

    +

    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + +
    {L_GROUP_SELECT}
    +  {S_GROUP_SELECT}  +   +
    + +
    + +



    + + + + diff --git a/upload/templates/admin/admin_user_ban.tpl b/upload/templates/admin/admin_user_ban.tpl new file mode 100644 index 000000000..db5c28b38 --- /dev/null +++ b/upload/templates/admin/admin_user_ban.tpl @@ -0,0 +1,59 @@ + +

    {L_BAN_TITLE}

    + +

    {L_BAN_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_BAN_USER}
    {L_USERNAME}: {S_HIDDEN_FIELDS}
    {L_UNBAN_USER}
    {L_USERNAME}:
    {L_UNBAN_USER_EXPLAIN}
    {S_UNBAN_USERLIST_SELECT}
    {L_BAN_IP}
    {L_IP_OR_HOSTNAME}:
    {L_BAN_IP_EXPLAIN}
    {L_UNBAN_IP}
    {L_IP_OR_HOSTNAME}:
    {L_UNBAN_IP_EXPLAIN}
    {S_UNBAN_IPLIST_SELECT}
    {L_BAN_EMAIL}
    {L_EMAIL_ADDRESS}:
    {L_BAN_EMAIL_EXPLAIN}
    {L_UNBAN_EMAIL}
    {L_EMAIL_ADDRESS}:
    {L_UNBAN_EMAIL_EXPLAIN}
    {S_UNBAN_EMAILLIST_SELECT}
      
    + +
    + +

    {L_BAN_EXPLAIN_WARN}

    \ No newline at end of file diff --git a/upload/templates/admin/admin_user_search.tpl b/upload/templates/admin/admin_user_search.tpl new file mode 100644 index 000000000..a33fba53b --- /dev/null +++ b/upload/templates/admin/admin_user_search.tpl @@ -0,0 +1,204 @@ + + + + +

    {L_USER_SEARCH}

    + +

    {L_SEARCH_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {L_USERNAME}:   {L_REGEX}
    {L_USERNAME_EXPLAIN}
    .
    {L_EMAIL}:   {L_REGEX}
    {L_EMAIL_EXPLAIN}
    .
    {L_IP}:  
    {L_IP_EXPLAIN}
    .
    {L_USERS_JOINED}  // 
    {L_JOIN_DATE_EXPLAIN}
    .
    {L_GROUP_MEMBERS}:  
    {L_SEARCH_USERS_GROUPS_EXPLAIN}
    .
    {L_POSTER_RANK}:  
    {L_SEARCH_USERS_RANKS_EXPLAIN}
    .
    {L_POSTCOUNT}   
    {L_POSTCOUNT_EXPLAIN}
    .
    {L_USERFIELD}:    {L_REGEX}
    {L_USERFIELD_EXPLAIN}
    .
    {L_LASTVISITED}   
    {L_LASTVISITED_EXPLAIN}
    .
    {L_LANGUAGE}: {LANGUAGE_LIST} 
    {L_LANGUAGE_EXPLAIN}
    .
    {L_TIMEZONE}: {TIMEZONE_LIST} 
    {L_TIMEZONE_EXPLAIN}
    .
    {L_MODERATORS_OF}:  
    {L_MODERATORS_OF_EXPLAIN}
    .
     
    {L_MISC_EXPLAIN}
    .
    +
    + + + + + + + +

    {L_USER_SEARCH}

    + +

    {NEW_SEARCH}

    +
    + +
    + + + + +
    +

     

    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_USERNAME}{L_EMAIL}{L_JOINDATE}{L_POSTS}{L_LASTVISIT}   {L_ACCOUNT_STATUS}
     {userrow.USERNAME}  {userrow.EMAIL}  {userrow.JOINDATE}  {userrow.POSTS}  {userrow.LASTVISIT}  {L_MANAGE}  {L_PERMISSIONS}  {userrow.BAN}  {userrow.ABLED} 
    .
    + + + + +
    +
    + + + + diff --git a/upload/templates/admin/admin_users.tpl b/upload/templates/admin/admin_users.tpl new file mode 100644 index 000000000..47fad995d --- /dev/null +++ b/upload/templates/admin/admin_users.tpl @@ -0,0 +1,369 @@ + + + + +

    {L_USER_ADMIN}

    + +

    {L_USER_EXPLAIN}

    +

    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + +
    {L_USER_SELECT}
    +

    + + +

    +

    + +

    +
    + +
    + +



    + + + + + + + +

    {L_USER_ADMIN}

    + +

    {L_USER_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_REGISTRATION_INFO}
    {L_ITEMS_REQUIRED}
    {L_USERNAME}: * + +
    {L_EMAIL_ADDRESS}: * + +
    {L_NEW_PASSWORD}: *
    + {L_PASSWORD_IF_CHANGED}
    + +
    {L_CONFIRM_PASSWORD}: *
    + {L_PASSWORD_CONFIRM_IF_CHANGED}
    + +
     
    {L_PROFILE_INFO}
    {L_PROFILE_INFO_NOTICE}
    {L_ICQ} + +
    {L_WEBSITE} + +
    {L_LOCATION} + +
    {L_FLAG}: + + + + +
    {FLAG_SELECT}    
    +
    {L_OCCUPATION} + +
    {L_INTERESTS} + +
    {L_SIGNATURE}
    + {L_SIGNATURE_EXP}
    +
    + {BBCODE_STATUS}
    + {SMILIES_STATUS}
    + +
     
    {L_PREFERENCES}
    {L_PUBLIC_VIEW_EMAIL} + + {L_YES}   + + {L_NO}
    {L_HIDE_USER} + + {L_YES}   + + {L_NO}
    {L_NOTIFY_ON_REPLY} + + {L_YES}   + + {L_NO}
    {L_NOTIFY_ON_PRIVMSG} + + {L_YES}   + + {L_NO}
    {L_ALWAYS_ADD_SIGNATURE} + + {L_YES}   + + {L_NO}
    {L_BOARD_LANGUAGE}{LANGUAGE_SELECT}
    {L_TIMEZONE}{TIMEZONE_SELECT}
    {L_DATE_FORMAT}
    + {L_DATE_FORMAT_EXPLAIN}
    + +
     
    {L_AVATAR_PANEL}
    + + + + + +
    {L_AVATAR_EXP}{L_CURRENT_IMAGE}
    + {ADMIN_AVATAR}
    + +  {L_DELETE_AVATAR}
    +
    {L_UPLOAD_AVATAR_FILE} + + +
    {L_UPLOAD_AVATAR_URL} + +
    {L_LINK_REMOTE_AVATAR} + +
    {L_AVATAR_GALLERY} + +
     
    {L_SPECIAL}
    {L_SPECIAL_EXPLAIN}
    {L_UPLOAD_QUOTA}{S_SELECT_UPLOAD_QUOTA}
    {L_PM_QUOTA}{S_SELECT_PM_QUOTA}
    {L_USER_ACTIVE} + + {L_YES}   + + {L_NO}
    {L_ALLOW_PM} + + {L_YES}   + + {L_NO}
    {L_ALLOW_AVATAR} + + {L_YES}   + + {L_NO}
    {L_SELECT_RANK}
    {L_DELETE_USER}? +
    + + {L_DELETE_USER_EXPLAIN} +
    +
    + + {L_DELETE_USER_POSTS} +
    +
    {S_HIDDEN_FIELDS} + +    + +
    + + + + + + + +

    {L_USER_ADMIN}

    + +

    {L_USER_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_AVATAR_GALLERY}
    {L_SELECT_CATEGORY}:  
    {S_HIDDEN_FIELDS} + +    + +
    +
    + + + + diff --git a/upload/templates/admin/admin_words.tpl b/upload/templates/admin/admin_words.tpl new file mode 100644 index 000000000..5857731da --- /dev/null +++ b/upload/templates/admin/admin_words.tpl @@ -0,0 +1,63 @@ + + + + +

    {L_WORDS_TITLE}

    + +

    {L_WORDS_TEXT}

    +
    + +
    + + + + + + + + + + + + + + + + + + +
    {L_WORD}{L_REPLACEMENT}{L_ACTION}
    {words.WORD}{words.REPLACEMENT}{L_EDIT}{L_DELETE}
    {S_HIDDEN_FIELDS}
    + + + + + + + +

    {L_WORDS_TITLE}

    + +

    {L_WORDS_TEXT}

    +
    + +
    + + + + + + + + + + + + + + + + +
    {L_WORD_CENSOR}
    {L_WORD}
    {L_REPLACEMENT}
    {S_HIDDEN_FIELDS}
    + + + + diff --git a/upload/templates/admin/index.tpl b/upload/templates/admin/index.tpl new file mode 100644 index 000000000..52e27afc3 --- /dev/null +++ b/upload/templates/admin/index.tpl @@ -0,0 +1,178 @@ + + + + + + + + + Administration + + + + + + + + + <body bgcolor="#FFFFFF" text="#000000"> + <p>Sorry, your browser doesn't seem to support frames</p> + </body> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_ADMIN}
    {L_ADMIN_INDEX}
    {L_MAIN_INDEX}
    {catrow.ADMIN_CATEGORY}
    {catrow.modulerow.ADMIN_MODULE}
    + + + + + + + +
    + + + + + + + + + + + + + +
    {L_CLEAR_CACHE}: + {L_DATASTORE},  + {L_TEMPLATES}  +
    {L_UPDATE}: + {L_USER_LEVELS}  +
    {L_SYNCHRONIZE}: + {L_TOPICS},  + {L_USER_POSTS_COUNT}  +
    +
    + + + + + + + + + + + + + +
    {L_VERSION_INFORMATION}
    {L_TP_VERSION}:{$bb_cfg['tp_version']} ({$bb_cfg['tp_release_state']})
    {L_TP_RELEASE_DATE}:{$bb_cfg['tp_release_date']}
    +

    {L_FORUM_STATS}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_STATISTIC}{L_VALUE}{L_STATISTIC}{L_VALUE}
    {L_NUMBER_POSTS}:{NUMBER_OF_POSTS}{L_POSTS_PER_DAY}:{POSTS_PER_DAY}
    {L_NUMBER_TOPICS}:{NUMBER_OF_TOPICS}{L_TOPICS_PER_DAY}:{TOPICS_PER_DAY}
    {L_NUMBER_USERS}:{NUMBER_OF_USERS}{L_USERS_PER_DAY}:{USERS_PER_DAY}
    {L_BOARD_STARTED}:{START_DATE}{L_AVATAR_DIR_SIZE}:{AVATAR_DIR_SIZE}
    {L_DB_SIZE}:{DB_SIZE}{L_GZIP_COMPRESSION}:{GZIP_COMPRESSION}
    + + +

    {L_WHOSONLINE}

    + + + + + + + + + + + + + + + + + + + + + + + + + +
     {L_USERNAME}  {L_LOGIN}
    {L_LAST_UPDATE} 
     {L_IP_ADDRESS} 
     {reg_user_row.USERNAME}  {reg_user_row.STARTED}-{reg_user_row.LASTUPDATE}  {reg_user_row.IP_ADDRESS} 
    .
     {guest_user_row.USERNAME}  {guest_user_row.STARTED}-{guest_user_row.LASTUPDATE}  {guest_user_row.IP_ADDRESS} 
    + +{L_WHOSONLINE} + + + + + diff --git a/upload/templates/board_disabled_exit.php b/upload/templates/board_disabled_exit.php new file mode 100644 index 000000000..7c93d5468 --- /dev/null +++ b/upload/templates/board_disabled_exit.php @@ -0,0 +1,49 @@ + + + + + + <?php echo $bb_cfg['sitename']?> + + + + +
    + +
    +
    +

    + + +
    +
    +

    ваше сообщение не было отправлено:

    + + + +
    + + + + + \ No newline at end of file diff --git a/upload/templates/default/agreement.tpl b/upload/templates/default/agreement.tpl new file mode 100644 index 000000000..4a6083ee3 --- /dev/null +++ b/upload/templates/default/agreement.tpl @@ -0,0 +1,27 @@ + +

    Регистрация

    + + + + + + + + +
    {$bb_cfg['sitename']} - Условия регистрации
    + +
    + + diff --git a/upload/templates/default/attach_rules.tpl b/upload/templates/default/attach_rules.tpl new file mode 100644 index 000000000..d9c0ca1f7 --- /dev/null +++ b/upload/templates/default/attach_rules.tpl @@ -0,0 +1,24 @@ +
    + + + + + + + + + + + + + + + +
    {L_RULES_TITLE}
    {L_EMPTY_GROUP_PERMS}
    +

    {group_row.GROUP_RULE_HEADER}

    +

    + + {group_row.extension_row.EXTENSION}  + +

    +
    \ No newline at end of file diff --git a/upload/templates/default/bbcode.tpl b/upload/templates/default/bbcode.tpl new file mode 100644 index 000000000..7a5960c69 --- /dev/null +++ b/upload/templates/default/bbcode.tpl @@ -0,0 +1,87 @@ +
      +
    + +
      +
    + +
  • + + +
    +

    {USERNAME} {L_WROTE}:

    +
    + + + +
    +

    {L_QUOTE}:

    +
    + + + +
    +
    +
    + + + +
    +
    +

    {L_CODE}:

    + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +{DESCRIPTION} + +{EMAIL} \ No newline at end of file diff --git a/upload/templates/default/common.tpl b/upload/templates/default/common.tpl new file mode 100644 index 000000000..a3462dbf8 --- /dev/null +++ b/upload/templates/default/common.tpl @@ -0,0 +1,50 @@ + + + +

    + + + + +
    {MESSAGE_TITLE}
    {MESSAGE_TEXT}
    + +

    + + + + + + + +
    + {HIDDEN_FIELDS} + +
    + + + + + + + + +
    {CONFIRM_TITLE}
    +

    {QUESTION}

    + + + +
    +
    • {ITEMS_LIST}
    +
    + +
    +   + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/upload/templates/default/confirm_body.tpl b/upload/templates/default/confirm_body.tpl new file mode 100644 index 000000000..285022b40 --- /dev/null +++ b/upload/templates/default/confirm_body.tpl @@ -0,0 +1,10 @@ + + + + + + + +
    {MESSAGE_TITLE}

    {MESSAGE_TEXT}

    {S_HIDDEN_FIELDS}  
    + +
    \ No newline at end of file diff --git a/upload/templates/default/css/admin.css b/upload/templates/default/css/admin.css new file mode 100644 index 000000000..03bb98b79 --- /dev/null +++ b/upload/templates/default/css/admin.css @@ -0,0 +1,8 @@ + +body { background: #E5E5E5; min-width: 10px; } +#body_container { background: #E5E5E5; padding: 0 6px 4px; } +h1, h2, h3 { margin: 0.8em 0; font-size: 16px; } +h4 { margin: 0.1em 0.2em; color: #273F61; font-size: 11px; font-weight: bold; } +h5 { margin: 0.1em 0.6em; color: #333399; font-family: "Courier New"; } +h6 { margin: 0.3em 0.6em; color: #444444; line-height: 100%; } +* html table.forumline { width: 97%; } diff --git a/upload/templates/default/css/backup/admin.css b/upload/templates/default/css/backup/admin.css new file mode 100644 index 000000000..03bb98b79 --- /dev/null +++ b/upload/templates/default/css/backup/admin.css @@ -0,0 +1,8 @@ + +body { background: #E5E5E5; min-width: 10px; } +#body_container { background: #E5E5E5; padding: 0 6px 4px; } +h1, h2, h3 { margin: 0.8em 0; font-size: 16px; } +h4 { margin: 0.1em 0.2em; color: #273F61; font-size: 11px; font-weight: bold; } +h5 { margin: 0.1em 0.6em; color: #333399; font-family: "Courier New"; } +h6 { margin: 0.3em 0.6em; color: #444444; line-height: 100%; } +* html table.forumline { width: 97%; } diff --git a/upload/templates/default/css/backup/dbg.css b/upload/templates/default/css/backup/dbg.css new file mode 100644 index 000000000..89ef3ce24 --- /dev/null +++ b/upload/templates/default/css/backup/dbg.css @@ -0,0 +1,31 @@ +/* dbg */ +.b1 { border: 1px solid #000 !important; } +.b2 { border: 1px solid #f00 !important; } +.b3 { border: 1px solid #00f !important; } + +.bg1 { background: #FAEBD7 !important; } +.bg2 { background: #A52A2A !important; } +.bg3 { background: #E9967A !important; } + +/* ------------------------------------------------------------------- +ERROR CHECKING +This is to determine if deprecated elements are used. If so, they should be replaced: +1a. and +1b. ...: Shouldn't be used. CSS should dictate font attributes. +2.
    : Shouldn't be used. CSS should dictate horizontal alignment. +3a.
    ...
    +3b.

    ...

    +3c. ...
    : +Shouldn't be used. CSS should dictate horizontal alignment. + +font, center, div[align], p[align], table[align], font[color] +{ + color : #cd0000; + font-weight : bold; + background : #eecc11 url(images/warning.gif) repeat 0 0; + margin : 10px; + padding : 10px; + border : 2px dashed #cd0000; + font-size : 2em; +} +------------------------------------------------------------------- */ \ No newline at end of file diff --git a/upload/templates/default/css/backup/index.html b/upload/templates/default/css/backup/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/upload/templates/default/css/backup/main.css b/upload/templates/default/css/backup/main.css new file mode 100644 index 000000000..1ed55c7cc --- /dev/null +++ b/upload/templates/default/css/backup/main.css @@ -0,0 +1,875 @@ +/* + * Initial neutralization + * Top Level + * Globals + + * Links + * Backgrounds + * Headers + * General text + + * Code blocks + * Quote blocks + * Spoiler + + ? Infoboxes + * Inputs, buttons, forms + * Text replacement for buttons + * Basic tables + + * Page header + - TopMenu + - Logo + - Main navigation + - Quick Login, PM Info, Loguot.. + ? Breadcrumb + ? Important info + + * Latest News + * Sidebar 1 + + * Forums on home page + * Forums on viewforum page + + * Topics on viewtopic page + * Attachments + * Search Results page + * Tracker + + * Images + * Page footer + * Menus + * Misc + * Shortcuts +*/ + +/* ================================================================ * + Initial neutralization + * ================================================================ */ + +/* Clean out MARGIN and PADDING */ +html, body, form, fieldset, h3, h4, h5, h6, p, pre, blockquote, +ul, ol, dl, li, dd { + margin: 0; padding: 0; +} +/* Add LEFT MARGIN */ +blockquote, ul, ol, li, dd { margin-left: 1em; } + +/* ================================================================ * + Top Level + * ================================================================ */ +html { + min-height: 100.1%; /* always show vertical scrollbar in Mozilla */ +} +body { + min-width: 760px; color: #000000; background: #E3E3E3; +} +body, th, td, font { + font: 12px Verdana,Arial,sans-serif; +} + +#body_container { background: #E3E3E3; padding: 0 2px 4px; } + #page_container { + margin: 0 auto; + background: #FFFFFF; border: 1px solid #D1D7DC; + } + #page_header { + position: relative; width: 100%; + } + #page_content { + padding: 12px 4px 0; margin: 0 auto; + clear: both; position: relative; + } + #sidebar1 { + padding: 0 6px 0 3px; vertical-align: top; + width: 210px; + } + #sidebar2 { + padding: 0 3px 0 6px; vertical-align: top; + width: 240px; + } + #sidebar1-wrap {} + #sidebar2-wrap {} + #main_content { + vertical-align: top; + } + #main_content_wrap {} + #page_footer { + clear: both; + margin: 12px 0 3px; + } + +/* ================================================================ * + Globals + * ================================================================ */ +hr { height: 0px; border: 0px solid #B7C0C5; border-top-width: 1px; } +.hr1 { border-top: 1px #B7C0C5 solid; } + +form { display: inline; } +label { cursor: pointer; white-space: nowrap; } +img { border: 0px; } + +.highlight { color: #FF0000; background: #FFFFE0; } +/* ---------------------------------- * + Links + * ---------------------------------- */ +:link:focus, :visited:focus { color: #DD6900; } +:link { color: #006699; } +:visited { color: #006699; } +:link:hover, :visited:hover { color: #DD6900; text-decoration: underline !important; } +:link:active, :visited:active { color: #DD6900; text-decoration: underline !important; } + +.colorAdmin, a.colorAdmin, a.colorAdmin:visited { color: #FF8C24; } +.colorMod, a.colorMod, a.colorMod:visited { color: #008000; } +.colorGroup, a.colorGroup, a.colorGroup:visited { color: #476996; } + +.dlWill { color: #0066CC; } +.dlDown, .leech, .leechmed, .leechsmall { color: #800000; } +.dlComplete, .seed, .seedmed, .seedsmall { color: #006600; } +.dlCancel { color: #666666; } + +a.dlWill, a.dlWill:visited { color: #0066CC; text-decoration: none; } +a.dlDown, a.dlDown:visited { color: #800000; text-decoration: none; } +a.dlComplete, a.dlComplete:visited { color: #006600; text-decoration: none; } +a.dlCancel, a.dlCancel:visited { color: #666666; text-decoration: none; } + +a.leech, a.leechmed, a.leechsmall, +a.leech:visited, a.leechmed:visited, a.leechsmall:visited +{ + color: #800000; text-decoration: none; +} +a.seed, a.seedmed, a.seedsmall, +a.seed:visited, a.seedmed:visited, a.seedsmall:visited +{ + color: #006600; text-decoration: none; +} +/* Poster name in viewtopic */ +.nick, .nick a { + color: #005A88 !important; font-size: 13px; font-weight: bold; text-decoration: none; +} +/* Nav links */ +.nav { margin: 0.3em 0; font-size: 11px; font-weight: bold; } +.nav a { text-decoration: none; } +.nav em { color: #660000; font-style: normal; } +/* Topic titles */ +.topictitle, a.topictitle { + font-size: 11px; text-decoration: none; font-weight: bold; +} +.torTopic, a.torTopic { + font-size: 11px; text-decoration: none; +} +a.topictitle:visited { color: #5493B4; } +a.torTopic:visited { color: #5493B4; } +/* ---------------------------------- * + Backgrounds + * ---------------------------------- */ +.row1, .row1 td { background: #EFEFEF; } +.row2, .row2 td { background: #DEE3E7; } +.row3, .row3 td { background: #D1D7DC; } +.row4, .row4 td { background: #ECECEC; } +.row5, .row5 td { background: #E7E7E7; } +.row6, .row6 td { background: #E9E9E6; } + +.prow1 { background: #ECECEC; } +.prow2 { background: #E7E7E7; } +.prow3 { background: #DEE3E7; } +/* ---------------------------------- * + Headers + * ---------------------------------- */ +h1 { font-size: 18px; font-weight: bold; margin: 0.2em 0 0.5em; } +h2 { font-size: 16px; font-weight: bold; margin: 0.2em 0 0.5em; } +h3 { font-size: 13px; font-weight: bold; letter-spacing: 1px; } +h4 { font-size: 12px; font-weight: bold; } +h5 { font-size: 12px; font-weight: normal; } +h6 { font-size: 11px; font-weight: normal; } +/* Page title and toptic title */ +.maintitle, .pagetitle { + font-family: "Trebuchet MS",Verdana,sans-serif; color: #3C3C3C; + padding: 0 4px; margin: 0.2em 0 0.5em; +} +.maintitle a, .pagetitle a { text-decoration: none; } +.maintitle { font-size: 22px; } +/* ---------------------------------- * + General text + * ---------------------------------- */ +.gen, .seed, .leech, +.gen td { font-size: 12px; } +.med, .genmed, .seedmed, .leechmed, +.med td { font-size: 11px; } +.small, .gensmall, .seedsmall, .leechsmall, +.small td { font-size: 10px; } +.tiny, .tiny td { font-size: 10px; letter-spacing: -1px; } + +td.gen { font-size: 12px !important; } +td.med { font-size: 11px !important; } +td.small { font-size: 10px !important; } + +.gen, .med, .genmed, +.small, .gensmall { color: #000000; } +a.gen, a.med, a.genmed, +a.small, a.gensmall { color: #006699; text-decoration: none; } +/* ---------------------------------- * + Code blocks + * ---------------------------------- */ +.code_wrap { width: 95%; margin: 0 auto; clear: both; } +.code_head p { font-size: 11px; padding: 2px 0 1px; } +.code { + font-size: 13px; font-family: "Courier New",Courier,monospace; + padding: 1px 6px 2px; border: 1px solid #C3CBD1; clear: both; + color: #006600; background: #FAFAFA; +} +/* ---------------------------------- * + Quote blocks + * ---------------------------------- */ +.q_wrap { width: 95%; margin: 0 auto 6px; clear: both; } +.q_wrap .q_wrap { width: 95%; } + +.q_head { font-size: 11px; padding: 2px 0 1px; color: #444444; } +.q { padding: 1px 6px 2px; color: #444444; border: solid #C3CBD1; border-width: 1px 1px 1px 2px; } + +.q { background: #FAFAFA; } +.q .q { background: #F5F5F5; } +.q .q .q { background: #FAFAFA; } +.q .q .q .q { background: #F5F5F5; } +.q .q .q .q .q { background: #FAFAFA; } +.q .q .q .q .q .q { background: #F5F5F5; } +.q .q .q .q .q .q .q { background: #FAFAFA; } +/* ---------------------------------- * + Spoiler + * ---------------------------------- */ +.spoiler-wrap { + width: 95%; margin: 6px auto; clear: both; background: #E9E9E6; + border: solid #C3CBD1; border-width: 1px 1px 1px 2px; +} +.spoiler-head { + font-size: 11px; padding: 1px 14px 3px; margin-left: 6px; line-height: 15px; +} +.spoiler-body { + padding: 1px 6px 2px; display: none; + border-top: 1px solid #C3CBD1; background: #F5F5F5; +} +/* ---------------------------------- * + Infoboxes + * ---------------------------------- */ +.infobox { + border: 1px #B7C0C5 solid; background: #EFEFEF; padding: 1px; + } + .infobox h1 { + background: #D1D7DC; font-size: 1.2em; padding: 0px 0.6em 2px; + } +/* ---------------------------------- * + Inputs, buttons, forms + * ---------------------------------- */ +input, textarea, select { + font-family: Verdana,sans-serif; +} +input.post, textarea.post { } + +select, input { font-size: 11px; } +textarea { font-size: 12px; } + +input.mainoption, input.main, +input.liteoption, input.lite { + font-size: 11px; border: 1px solid; background: #FAFAFA; + padding-left: 10px; padding-right: 10px; +} +input.mainoption, input.main { + font-weight: bold; /* main submit button */ +} + +/* The buttons used for bbCode styling in message post */ +input.button, .buttons input { border: 1px solid; background: #F5F5F5; } +input.long { padding-left: 20px; padding-right: 20px; } + +input.button, .buttons input, +input.mainoption, input.main, input.liteoption, input.lite { + border-color: #B4B4B4 #000000 #000000 #B4B4B4; +} + +input[type="checkbox"] { margin-bottom: 1px; } +input[type="radio"] { margin-bottom: -2px; } + +input[disabled="disabled"] { color: #808080; } +input.hint { color: #999999; font-style: italic; text-indent: 0.3em; } +input.error { color: #FF0000; font-weight: bold; } +input.found { font-weight: bold; } +.cat input[type="text"] { background: #FCFCFC; } + +optgroup, option, fieldset, legend { + font-family: Verdana,sans-serif; +} +optgroup { + font-size: 11px; letter-spacing: 0px; font-weight: bold; font-style: italic; + color: #005A88; background: #DEE3E7; border-top: 1px solid #A5AFB4; +} +optgroup option { color: #000000; background: #FFFFFF; } +option { font-size: 11px; } +legend { padding: 0 2px 2px; font-size: 11px; color: #000066; } +legend a { text-decoration: none; } +fieldset > legend { margin-left: 6px; } +.root_forum {} +.has_sf { color: #333333; background: #F5F5F5; font-weight: bold; } + +input.pOrdSel { + border: 0px solid #EFEFEF; width: 18px; overflow: hidden; + color: #333333; background: transparent; + font-size: 12px; font-family: Arial,sans-serif; + cursor: pointer; +} + +textarea.editor { display: block; width: 98%; } + +.fieldsets td { vertical-align: top; white-space: nowrap; } +.fieldsets fieldset { margin: 4px 4px; } +.fieldsets fieldset div { padding: 3px 6px 4px; } +.fieldsets div p { margin-bottom: 1px; } +.fieldsets div > p { margin-bottom: 2px; } +.fieldsets .select { margin-bottom: 3px; } +.fieldsets .radio {} +.fieldsets .chbox {} +.fieldsets .input {} +table.my_downloads { margin-bottom: 2px; } + .my_downloads td { padding: 1px 8px 2px 0 !important; } + +select.text_color option { background: #ECECEC; } +select.text_size option.em { font-weight: bold; background: #ECECEC; } + +.fldSet1 { margin: 2px 4px 1px 4px; padding: 0px; } +.fldSetCont1 { margin: 0px; padding: 3px 8px 4px 8px; } +.fldSetCont2 { margin: 0px; padding: 2px 8px 4px 8px; } +.fldSetCont3 { margin: 0px; padding: 6px 8px 8px 8px; } + +.hl_only_new { color: #993300; } +.select-action { background: #F5F5F5; } +/* ---------------------------------- * + Text replacement for buttons + * ---------------------------------- */ +.txtb, .txtb:link, .txtb:visited, .txtb:hover { + color: #003366; font-size: 11px; text-decoration: none; +} +.txtb:hover { text-decoration: underline; } +/* ---------------------------------- * + Basic tables + * ---------------------------------- */ +.bodyline { + background: #FFFFFF; border: 1px solid #A5AFB4; +} +.bodyline th { + background: #71869F; color: #F0F8FF; font-weight: bold; +} + +table.forumline { + width: 100%; background: #B7C0C5; border-collapse: collapse; + margin-left: auto; margin-right: auto; + border-top: 1px solid #B7C0C5; +} +.forumline th { + border: 1px solid #B7C0C5; border-width: 1px; border-top-color: #92A3A4; +} +.forumline td { + border: 1px solid #B7C0C5; border-width: 0 1px 1px; +} +.forumline th, .thHead { + padding: 6px 8px 7px; text-align: center; + color: #D5E4EC; font-size: 11px; font-weight: bold; + background: #006699 url(../images/cellpic3.gif) repeat-x; +} +* > .forumline th { height: 28px; padding: 2px 4px; } +.forumline th:first-child { border-left-color: #92A3A4; } +.forumline th:last-child { border-right-color: #92A3A4; } +.forumline td { + padding: 2px 4px 3px; +} + +table.borderless th, table.borderless td { border: 0px none; } + +table.bordered { border-collapse: collapse; border: 1px solid #B7C0C5; } + .bordered th, .bordered td { border-style: solid; border-width: 1px; border-color: #B7C0C5; } + +table.message { margin: 0 auto; width: 100%; } +table.message td { + padding: 16px; text-align: center; background: #EFEFEF; +} + +.cat, td.cat, td.catTitle, td.catHead, td.catBottom { + padding: 5px 4px 6px; + background: #E0E5E9 url(../images/cellpic1.gif) repeat-x; +} +.catTitle { + font-weight: bold; letter-spacing: 1px; + color: #006699; text-align: center; +} +.catTitle a { text-decoration: none; } +.catBottom { text-align: center; } +#acp_main_nav .catTitle { + padding: 2px 6px 3px; text-align: left; font-size: 11px; letter-spacing: 0px; +} + +.info_msg_wrap { margin: 12px 0; } +table.info_msg { width: 100%; border: 1px solid #B7C0C5; background: #DEE3E7; margin: 0 auto; } +table.info_msg .msg { + border: 1px solid #B7C0C5; background: #EFEFEF; + padding: 20px; text-align: center; +} +table.error { width: 100%; border: 2px solid #993300; background: #FFD4CC; margin: 0 auto; } +table.error .msg { + border: 1px solid #993300; background: #FAEBD7; + padding: 20px; color: #A52A2A; text-align: center; +} + +table.search_username { margin: 12px; width: 370px; } + +table.pm_box_size { width: 175px; margin: 8px 2px; } + .pm_box_size .progress { background: #008000; } + .pm_box_size b { font-size: 10px; } + .pm_nav td { padding: 4px; font-size: 14px; font-weight: bold; } + +table.translit_expl th { + width: 30px; padding-right: 8px; font-weight: bold; text-align: right; +} +table.translit_expl td { width: 14px; } + +table.user_contacts th { text-align: right; width: 100%; } + .user_contacts td { padding: 2px 6px; } + +table.user_details th { padding: 2px 6px; text-align: right; vertical-align: top; } + .user_details td { width: 70%; } + +table.ratio_details th { padding: 2px 6px; text-align: right; } + .ratio_details td { white-space: nowrap; } + +table.usercp_register h6 { + margin: 0.3em 0.4em; color: #444444; line-height: 100%; +} + +table.smilies td { padding: 3px; text-align: center; } + +/* ================================================================ * + Page header + * ================================================================ */ +/* ---------------------------------- * + Breadcrumb [ home >> forum1 >> etc. ] + * ---------------------------------- */ +#breadcrumb {} +/* ---------------------------------- * + Important info + * ---------------------------------- */ +#important_info {} +/* ================================================================ * + Page content + * ================================================================ */ +#user_ratio { + padding: 6px 6px 4px 12px; font-size: 11px; +} +/* ================================================================ * + Main content + * ================================================================ */ +/* ---------------------------------- * + Forums on home page + * ---------------------------------- */ +#forums_list_wrap { margin-top: 4px; padding-right: 2px; } +#forums_top_links { clear: both; } +#forums_wrap { clear: both; padding-top: 1px; } +.cat_title { /* Category header */ + padding: 3px 8px 5px; letter-spacing: 1px; text-indent: 0.6em; + background: #DEE3E7 url(../images/cellpic1.gif) repeat-x; + } + .cat_title a { text-decoration: none; color: #333333 !important; } +table.forums { width: 100%; } + .forums th { + padding: 0 !important; font-size: 10px; font-weight: normal; color: #3C3C3C; + } + .forums td { + padding: 3px 4px; font-size: 11px; + } +.forums em { /* titles like: "Subforums:", "Moderators:" */ + color: #5E5E5E; font-style: italic; +} +.forumlink { /* forum links */ + font-size: 13px; font-weight: bold; + } + .forumlink a { text-decoration: none; } +.forums .forumlink { /* forum title */ + margin-top: 1px; +} +.forum_desc { /* forum description */ + margin-top: 2px; color: #333333; font-size: 11px; line-height: 110%; +} +.subforums { /* subforums */ + margin-top: 2px; + } + .subforums + .moderators { margin-top: 0; } + .sf_title { white-space: nowrap; } + .sf_icon { margin-right: 1px; } + .sf_separator {} + .sf_title a { text-decoration: none; } +.moderators { /* moderators */ + margin-top: 2px; font-size: 11px; line-height: 110%; + } + .moderators a, .moderators a:visited { + color: #333333; font-size: 10px; text-decoration: none; + } +.f_last_post { /* last topic/post */ + text-align: center; + } + .last_topic { margin-top: 1px; white-space: nowrap; } + .last_topic a { text-decoration: none; } + .last_post_time { margin-top: 2px; font-size: 10px; white-space: nowrap; } + .last_time {} + .last_author { padding-left: 3px; } + .f_stat_inline { /* Posts: xx Topics: xx */ + margin-top: 1px; white-space: nowrap; } + .f_stat_topics {} + .f_stat_posts { padding-left: 3px; } + +.forums thead { /* Forum TH-Headers */ +} +.f_icon { /* Forum Icon cell */ + width: 46px; + padding: 4px 0 !important; +} +.f_titles { /* Forum Title cell */ + width: auto; +} +.f_topics { /* Topics Count cell */ + width: 40px; text-align: center; +} +.f_posts { /* Posts Count cell */ + width: 50px; text-align: center; +} +.f_last_post { /* Forum Last Topic/Post cell */ + width: 230px; +} +.f_stat_inline { /* Inline Topic/Post count */ + display: none; +} + +table.forums { border-collapse: collapse; } +.cat_title { border: 1px solid #B7C0C5; border-bottom-color: #C3CBD1 !important; } +.f_tbl_wrap, #board_stats_wrap { + border: solid #B7C0C5; border-width: 0 1px; } +table.forums th { border-bottom: 1px solid #C3CBD1; } +.forums td.row1 { border: solid #C3CBD1; border-width: 0 1px 1px 0; } +.forums td.row2 { border: solid #C3CBD1; border-width: 0 1px 1px 0; } +td.f_titles { border-right-color: #C3CBD1 !important; } +td.last_td { border-right-width: 0 !important; } + +.cat_footer { + height: 0px; margin-top: -1px; border-top: 1px solid #B7C0C5; + font-size: 0px; line-height: 0px; +} +.cat_separator { height: 10px; font-size: 0px; line-height: 0px; } +#mark_all_forums_read { margin: -10px 0 3px 0; } + +#online_time { float: left; font-style: italic; color: #444444; } +#online_explain { float: right; } +#online_userlist a { white-space: nowrap; } + +/* ---------------------------------- * + Forums on viewforum page + * ---------------------------------- */ +table.forum th { white-space: nowrap; } +td.topic_id { padding: 4px 6px; } + +.spaceRow { + padding: 0 !important; background: #D1D7DC; +} +td.topicSep { /* Topic type groups separator */ + padding: 2px 12px 3px; font-weight: bold; letter-spacing: 1px; color: #333333 +} +.topicMoved { /* Topic Moved prefix */ + font-weight: normal; font-style: italic; +} +.topicAnnounce { /* Topic Announce prefix */ + color: #DD6900; +} +.topicPoll { /* Topic Poll prefix */ + font-weight: normal; color: #006699; +} +.topicPG { /* Topic pagination links */ + font-weight: normal; white-space: nowrap; font-size: 10px; +} +.iconDL { /* DL Icon */ + border: 1px outset; background: #EFEFEF; + padding: 0px 3px 0px 2px; margin: 2px 1px 2px 0px; +} +.topicAuthor, a.topicAuthor, a.topicAuthor:visited { + font-size: 11px; color: #333333; text-decoration: none; +} +.torSize { + font-size: 11px; color: #333333; text-decoration: none; +} +.hl-selected-topic { background-color: #FAF0E6 !important; } +/* ---------------------------------- * + Topics on viewtopic page + * ---------------------------------- */ +table.topic { width: 100%; } + + .post_head { padding: 0 6px; font-size: 10px; } + .post_wrap { padding: 5px 5px 8px; } + .post_body { line-height: 18px; } /* The content of the posts */ + a.postLink { text-decoration: none; } + a.postLink:visited { text-decoration: none; color: #5493B4; } + .posted_since { color: #666666; padding-left: 4px; } + .signature { clear: both; } + .signature, .signature * { + font-size: 10px !important; color: #5E5E5E !important; + text-decoration: none !important; background: transparent !important; + border: 0 none !important; padding: 0 !important; margin: 1px 0 !important; + } + .signature .code_head, .signature .q_head { display: none !important; } + .signature .code_wrap, .signature .code, + .signature .q_wrap, .signature .q { display: inline !important; } + .signature a { text-decoration: underline !important; } + .last_edited { font-size: 10px; color: #5E5E5E; } + + .poster_info p { margin: 2px 0; color: #444444; } + .poster_info .nick { margin: 0 0 4px; color: #333333; line-height: 110%; } + .poster_info .avatar { margin: 5px 0 4px; max-width: 100px; max-height: 100px; overflow: hidden; } + .avatar img { display: block; } + .poster_info .flag { margin: 4px 0; } + .poster_info em { font-style: normal; color: #000000; } + + table.topic, .topic .td1, .topic .td2, .topic .td3, .post_head, .post_btn_2 { + border-style: solid; border-color: #C3CBD1; } + .topic .td1 { border-width: 1px 1px 0px 0px; border-right-color: #B7C0C5; } + .topic .td2 { border-width: 1px 0px 0px 0px; width: 100%; } + .topic .td3 { border-width: 0px 1px 0px 0px; border-right-color: #B7C0C5; height: 100%; } + .post_head { border-width: 0px 0px 1px 0px; } + .post_btn_2 { border-width: 1px 0px 0px 0px; } + table.topic { border-width: 0px 1px 1px 1px; border-color: #B7C0C5; } + + .poster_info { padding: 4px; vertical-align: top; font-size: 10px; line-height: 100%; } + .poster_btn { padding: 0; vertical-align: bottom; text-align: center; white-space: nowrap; } + .message { padding: 0; vertical-align: top; width: 100%; } + + input.select_post { margin-top: 0px; float: right; } + input[type="checkbox"].select_post { margin-top: 4px; } + + table.peers { border-collapse: collapse; } + table.peers th { border: 1px #A5AFB4 solid; padding: 1px; height: auto; background: #D1D7DC; color: #333333; } + table.peers td { border: 1px #A5AFB4 solid; padding: 4px; } + #last_seed_info { border: 1px #A5AFB4 solid; } + + .dl_list {} + .dl_list td { text-align: center; } + .dl_list img { display: block; } + #dl_counts td { font-size: 12px; } + + #poll { border: solid #B7C0C5; border-width: 1px; margin-bottom: -1px; } + + .quick_reply_box { width: 640px; } + .hl-selected-post { background-color: #FFEFD5 !important; } + +/* ---------------------------------- * + Attachments + * ---------------------------------- */ +table.attach { width: 93%; margin: 0 auto; clear: both; border-color: #A5AFB4; } + .attach th, .attach td { border-color: #A5AFB4; } + .attach th { padding: 3px; text-align: center; font-weight: bold; background: #D1D7DC; } + .attach td { padding: 2px 4px; } + +fieldset.attach { width: 93%; margin: 0 auto; padding: 2px; clear: both; } + .attach_link { margin: 2px 12px 6px; } + .attach_stats { padding-left: 3px; } + .attach_comment { + margin: 6px 12px; padding: 1px 8px; line-height: 110%; + color: #444444; border-left: 2px solid #CC9933; + } + .attach .denied { color: #800000; } + +#tor_blocked { width: 93%; } + #tor_blocked td { background: #FAEBD7; padding: 8px 12px; color: #6E380F; } +/* ---------------------------------- * + Search Results page + * ---------------------------------- */ +.opened { /* Clicked link color */ + color: #71869F; +} +/* ---------------------------------- * + Tracker + * ---------------------------------- */ +.dlSp { font-size: 6px; } + +/* ================================================================ * + Images + * ================================================================ */ +img.forum_icon { width: 46px; height: 25px; } +img.topic_icon { width: 19px; height: 18px; } +img.pm_box_icon { width: 28px; height: 25px; } +img.icon1 { width: 12px; height: 9px; } +img.icon2 { width: 18px; height: 9px; } +img.spacer { display: block; height: 1px; } +/* ================================================================ * + Page footer + * ================================================================ */ +.bottom_info { font-size: 11px; } +.copyright { font-size: 10px; color: #444444; letter-spacing: -1px; } + .copyright a { text-decoration: none; } + +#timezone { + float: right; text-align: right; white-space: nowrap; + font-size: 10px; line-height: 110%; color: #333333; +} +.tz_time { font-family: "Courier New",Courier,monospace; font-size: 11px; } + +#f_icons_legend { margin: 4px auto; } +/* ================================================================ * + Menus + * ================================================================ */ +.menu-root { padding-right: 13px; white-space: nowrap; + background: transparent url(../images/menu_open.gif) no-repeat right; } +.menu-alt1 { padding-right: 0; background: transparent; } +img.menu-alt1 { width: 9px; height: 9px; } +a.menu-root, a.menu-root:visited, a.menu-root:hover { + text-decoration: none !important; } +.menu-sub { position: absolute; display: none; z-index: 1000; } + .menu-sub table { background: #FFFFFF; border: 1px solid #92A3A4; } + .menu-sub table th { background: #71869F; color: #F0F8FF; font-weight: bold; font-size: 11px; } + .menu-sub table td { background: #E7E7E7; font-size: 11px; } + .menu-sub table td.cat { background: #B5BEC3; } + .menu-sub legend { font-weight: bold; } + .menu-sub label { display: block; padding-right: 2px; margin-right: 1px; } + .menu-sub label:hover { background: #D1D7DC; color: #993300; } + .menu-sub iframe.ie-fix-select-overlap { + display: none; + display/**/: block; + position: absolute; z-index: -1; filter: mask(); } +/* ================================================================ * + Ajax + * ================================================================ */ +var.ajax-params { display: none; } +#ajax-loading, #ajax-error { + position: absolute; z-index: 2000; padding: 4px; font-size: 11px; + max-width: 400px; max-height: 200px; white-space: nowrap; display: none; +} +#ajax-loading { min-width: 100px; background: #2E8B57; color: #FFF5EE; } +#ajax-error { min-width: 200px; background: #8B0000; color: #F5F5F5; overflow: auto; } +.editable-container { cursor: pointer; } +.editable-container:hover { background: #E8E9F8; } +/* ================================================================ * + Misc + * ================================================================ */ +.sf { padding-left: 20px !important; } +.jumpbox { margin: 6px 0; text-align: right; white-space: nowrap; } + +.attachrow { font-size: 11px; border: 1px #A5AFB4 solid; } +.attachheader { font-size: 11px; border: 1px #A5AFB4 solid; background: #D1D7DC; } +.attachtable { font-size: 12px; border: 1px #A5AFB4 solid; border-collapse: collapse; } + +pre, .pre { + font-family: Courier,monospace; font-size: 12px; + border: 1px solid #B7C0C5; background: #F5F5F5; + padding: 4px; margin: 10px; +} +.pre { width:100%; overflow: auto; white-space: nowrap; } + +.wrap { + /* Browser specific (not valid) styles to make preformatted text wrap */ + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +.ann { font-size: 13px; text-align: center; color: #993300; font-weight: bold; } + +.clickable { cursor: pointer; } +.folded, .folded2 { display: block; + background: transparent url(../images/icon_plus_1.gif) no-repeat left center; padding-left: 14px; } +.unfolded, .unfolded2 { display: block; + background: transparent url(../images/icon_minus_1.gif) no-repeat left center; padding-left: 14px; } +.folded2 { background-image: url(../images/icon_plus_2.gif); } +.unfolded2 { background-image: url(../images/icon_minus_2.gif); } + +.warnColor1 { color: #993300; } +.warnColor2 { color: #FF0000; } +.warnBorder1 { border: 1px solid #A52A2A; } +.warningBox1 { border: 1px solid #A52A2A; color: #993300; padding: 12px; } +.warningBox2 { background:#FFD9B2 none repeat scroll 0%; border:2px solid #CC6600; color:#993300 !important; padding:8px; } + +/* ================================================================ * + Shortcuts + * ================================================================ */ +.spacer_0, .spacer_2, .spacer_4, .spacer_6, .spacer_8, .spacer_10, .spacer_12 { + font-size: 0px; line-height: 0px; } +.spacer_0 { height: 0px; } +.spacer_2 { height: 2px; } +.spacer_4 { height: 4px; } +.spacer_6 { height: 6px; } +.spacer_8 { height: 8px; } +.spacer_10 { height: 10px; } +.spacer_12 { height: 12px; } + +.pad_0, .pad_0 td, td.pad_0 { padding: 0; } +.pad_2, .pad_2 td, td.pad_2 { padding: 2px; } +.pad_4, .pad_4 td, td.pad_4 { padding: 4px; } +.pad_6, .pad_6 td, td.pad_6 { padding: 6px; } +.pad_8, .pad_8 td, td.pad_8 { padding: 8px; } +.pad_10, .pad_10 td, td.pad_10 { padding: 10px; } +.pad_12, .pad_12 td, td.pad_12 { padding: 12px; } +.pad_14, .pad_14 td, td.pad_14 { padding: 14px; } +.pad_16, .pad_16 td, td.pad_16 { padding: 16px; } + +.mrg_0 { margin: 0 !important; } +.mrg_2 { margin: 2px !important; } +.mrg_4 { margin: 4px !important; } +.mrg_6 { margin: 6px !important; } +.mrg_8 { margin: 8px !important; } +.mrg_10 { margin: 10px !important; } +.mrg_12 { margin: 12px !important; } +.mrg_14 { margin: 14px !important; } +.mrg_16 { margin: 16px !important; } + +.lh_100 { line-height: 100%; } +.lh_110 { line-height: 110%; } +.lh_120 { line-height: 120%; } +.lh_150 { line-height: 150%; } + +.wAuto { width: auto !important; } /* widthAuto */ +.w50 { width: 50% !important; } +.w60 { width: 60% !important; } +.w70 { width: 70% !important; } +.w80 { width: 80% !important; } +.w85 { width: 85% !important; } +.w90 { width: 90% !important; } +.w95 { width: 95% !important; } +.w100 { width: 100% !important; } + +.border { border-style: solid; border-color: #B7C0C5; } +.bw_T { border-width: 1px 0px 0px 0px !important; } +.bw_TR { border-width: 1px 1px 0px 0px !important; } +.bw_TRB { border-width: 1px 1px 1px 0px !important; } +.bw_TRBL { border-width: 1px 1px 1px 1px !important; } +.bw_TB { border-width: 1px 0px 1px 0px !important; } +.bw_TBL { border-width: 1px 0px 1px 1px !important; } +.bw_TL { border-width: 1px 0px 0px 1px !important; } +.bw_TRL { border-width: 1px 1px 0px 1px !important; } +.bw_R { border-width: 0px 1px 0px 0px !important; } +.bw_RB { border-width: 0px 1px 1px 0px !important; } +.bw_RBL { border-width: 0px 1px 1px 1px !important; } +.bw_RL { border-width: 0px 1px 0px 1px !important; } +.bw_B { border-width: 0px 0px 1px 0px !important; } +.bw_BL { border-width: 0px 0px 1px 1px !important; } +.bw_L { border-width: 0px 0px 0px 1px !important; } + +.clear { clear: both; height: 0; font-size: 0px; line-height: 0px; overflow: hidden; } +.clearB { clear: both; } +.hidden { display: none; } +.inline { display: inline; } +.block { display: block; } +.bold { font-weight: bold; } +.normal { font-weight: normal; } +.bCenter { margin-left: auto !important; margin-right: auto !important; } /* blockCenter */ +.bLeft { margin-right: auto !important; } +.bRight { margin-left: auto !important; } +.tCenter { text-align: center !important; } /* textCenter */ +.tLeft { text-align: left !important; } +.tRight { text-align: right !important; } +.vTop { vertical-align: top !important; } +.vBottom { vertical-align: bottom !important; } +.floatL { float: left; } +.floatR { float: right; } +.wrap { white-space: normal !important; } +.nowrap { white-space: nowrap !important; } diff --git a/upload/templates/default/css/backup/theme_default.css b/upload/templates/default/css/backup/theme_default.css new file mode 100644 index 000000000..ac3de1964 --- /dev/null +++ b/upload/templates/default/css/backup/theme_default.css @@ -0,0 +1,130 @@ +/* ================================================================ * + Page header + * ================================================================ */ +/* ---------------------------------- * + TopMenu, Quick Login, PM Info, Loguot.. + * ---------------------------------- */ +.topmenu { + background: #EFEFEF; border: solid #CFD4D8; border-width: 1px 0px; + margin: 3px 4px 0; padding: 0 8px; +} +.topmenu a:link, .topmenu a:visited { text-decoration: none; } +.topmenu td { padding: 4px; font-size: 11px; white-space: nowrap; } +.new-pm { background: #FFD9B2; border-color: #CC6600; } +.new-pm-link { color: #993300 !important; font-weight: bold; } +/* ---------------------------------- * + Logo + * ---------------------------------- */ +#logo { padding-left: 14px; min-height: 75px; } + #logo h1 { + margin: 0 300px 0 0; padding-top: 6px; + font-size: 42px; font-variant: small-caps; + } + #logo h6 { + margin: 0 300px 0 0; padding-top: 1px; padding-bottom: 3px; + font-size: 14px; font-variant: small-caps; + } +/* ---------------------------------- * + Main navigation + * ---------------------------------- */ +#main_nav { + padding: 2px 10px; margin: 0 4px; + border: solid #CFD4D8; border-width: 1px 0; background: #CFD4D8; + } + #main_nav b { padding: 0 4px 0 1px; } + #main_nav a { color: #535F62; text-decoration: none; } + #main_nav a:hover, #main_nav a:active { + text-decoration: none !important; color: #000000; + } +/* ---------------------------------- * + Quick Login, PM Info, Loguot.. + * ---------------------------------- */ +#logon { + position: absolute; top: 6px; right: 20px; + font-size: 11px; line-height: 160%; + border: 1px solid #B4B4B4; background: #EFEFEF; + } + #logon a:link, #logon a:visited { text-decoration: none; } + #logon span { + display: block; padding: 0 1px; + } + #name_pwd { /* Username/Password group */ + float: left; text-align: right; margin: 5px 0 5px 6px; + } + #login_button { /* Submit button and Autologin checkbox group */ + float: left; margin: 4px 6px 0 0; + } + #hello_username { font-size: 12px; line-height: 160%; margin: 4px; } + #name_pwd input { font-size: 11px; width: 80px; } + #login_button input { font-size: 12px; margin-top: 1px; } + #logged_in_links, #logged_out_links { + clear: both; text-align: center; + margin: 0 6px 2px; padding-top: 1px !important; + border-top: 1px solid #B4B4B4; + } + #register_link { font-weight: bold; } + .new_pm { + top: 5px !important; + background-color: #FFD9B2 !important; + border: 3px double #CC6600 !important; + } + .new_pm #pm_info a:link, + .new_pm #pm_info a:visited { + font-size: 11px; font-weight: bold; color: #993300; + } + .unread_pm a:link, + .unread_pm a:visited { + font-size: 11px; font-weight: bold; color: #993300; + } + .new_pm big, + .unread_pm big { font-size: 14px; } +/* ---------------------------------- * +Latest News +* ---------------------------------- */ +#latest_news { margin-bottom: 8px; } +#latest_news table { +border-collapse: collapse; +} +#latest_news h3 { padding: 0 0 3px 0; color: #333333; } +#latest_news td { vertical-align: top; } +.news_date { +float: right; padding: 1px 8px 1px; +white-space: nowrap; font-family: "Courier New",Courier,monospace; +color: #333333; background: #F2F2F2; border: 1px solid #B4B4B4; +} +.news_title { +padding: 3px 8px 2px; margin-bottom: 2px; +background: transparent url(../images/hr400_ltr_gradient.jpg) no-repeat left top; +} +#latest_news a { text-decoration: none; } +#latest_news .new a { color: #A52A2A; font-weight: bold; } +/* ================================================================ * +Page content +* ================================================================ */ +/* ---------------------------------- * +Sidebar 1 +* ---------------------------------- */ +#sidebar1 { +margin-top: -8px; +} +#sidebar1 h3 { +padding: 0 0 4px 0; margin: 8px 0 2px 0; +color: #333333; text-indent: 0.5em; +background: transparent url(../images/hr200_ltr_gradient.jpg) no-repeat left bottom; +} +#sidebar1 h3 a { color: #333333; } +#sidebar1 h5 { padding: 2px 4px 5px; } +#sidebar1 ul { margin: 6px 0 0 10px; } +#sidebar1 li { margin-bottom: 2px; margin-left: 14px; } +#sidebar1 a { text-decoration: none; color: #005A88; } +#user_ratio { padding: 0;} /* User ratio */ +#user_ratio td { +padding: 1px 6px 1px 8px ; font-size: 11px; +} +#tr_main_cats {} /* Main tracker categories list */ +#tr_main_cats ul { } +#tr_main_cats li { +margin-bottom: 3px; margin-left: 11px; font-size: 11px; font-weight: bold; line-height: 110%; +} +/* ================================================================ */ + diff --git a/upload/templates/default/css/dbg.css b/upload/templates/default/css/dbg.css new file mode 100644 index 000000000..89ef3ce24 --- /dev/null +++ b/upload/templates/default/css/dbg.css @@ -0,0 +1,31 @@ +/* dbg */ +.b1 { border: 1px solid #000 !important; } +.b2 { border: 1px solid #f00 !important; } +.b3 { border: 1px solid #00f !important; } + +.bg1 { background: #FAEBD7 !important; } +.bg2 { background: #A52A2A !important; } +.bg3 { background: #E9967A !important; } + +/* ------------------------------------------------------------------- +ERROR CHECKING +This is to determine if deprecated elements are used. If so, they should be replaced: +1a. and +1b. ...: Shouldn't be used. CSS should dictate font attributes. +2.
    : Shouldn't be used. CSS should dictate horizontal alignment. +3a.
    ...
    +3b.

    ...

    +3c. ...
    : +Shouldn't be used. CSS should dictate horizontal alignment. + +font, center, div[align], p[align], table[align], font[color] +{ + color : #cd0000; + font-weight : bold; + background : #eecc11 url(images/warning.gif) repeat 0 0; + margin : 10px; + padding : 10px; + border : 2px dashed #cd0000; + font-size : 2em; +} +------------------------------------------------------------------- */ \ No newline at end of file diff --git a/upload/templates/default/css/main.css b/upload/templates/default/css/main.css new file mode 100644 index 000000000..7ab0998ac --- /dev/null +++ b/upload/templates/default/css/main.css @@ -0,0 +1,1159 @@ +/* + * Initial neutralization + * Top Level + * Globals + + * Links + * Backgrounds + * Headers + * General text + + * Code blocks + * Quote blocks + * Spoiler + + ? Infoboxes + * Inputs, buttons, forms + * Text replacement for buttons + * Basic tables + + * Page header + - TopMenu, Quick Login, PM Info, Loguot.. + - Logo + - Main navigation + - Latest News + ? Breadcrumb + ? Important info + + * Page content + * Sidebar 1 + * Latest News + + * Forums on home page + * Forums on viewforum page + + * Topics on viewtopic page + * Torrent status + * Attachments + * Search Results page + * Tracker + + * Images + * Page footer + * Menus + * Misc + * Reports + * Shortcuts +*/ + +/* ================================================================ * + Initial neutralization + * ================================================================ */ + +/* Clean out MARGIN and PADDING */ +html, body, form, fieldset, h3, h4, h5, h6, p, pre, blockquote, +ul, ol, dl, li, dd { + margin: 0; padding: 0; +} +/* Add LEFT MARGIN */ +blockquote, ul, ol, li, dd { margin-left: 1em; } + +/* ================================================================ * + Top Level + * ================================================================ */ +html { + min-height: 100.1%; /* always show vertical scrollbar in Mozilla */ +} +body { + min-width: 760px; color: #000000; background: #E3E3E3; +} +body, th, td, font { + font: 12px Verdana,Arial,sans-serif; +} + +#body_container { background: #E3E3E3; padding: 0 2px 4px; } + #page_container { + margin: 0 auto; + background: #FFFFFF; border: 1px solid #D1D7DC; + } + #page_header { + position: relative; width: 100%; + } + #page_content { + padding: 12px 4px 0; margin: 0 auto; + clear: both; position: relative; + } + #sidebar1 {} + #sidebar2 { + padding: 0 3px 0 6px; vertical-align: top; + width: 240px; + } + #sidebar1-wrap { margin-top: -8px; width: 210px; } + #sidebar2-wrap {} + #main_content { + vertical-align: top; + } + #main_content_wrap {} + #page_footer { + clear: both; + margin: 12px 0 3px; + } + +/* ================================================================ * + Globals + * ================================================================ */ +hr { height: 0px; border: 0px solid #B7C0C5; border-top-width: 1px; } +.hr1 { border-top: 1px #B7C0C5 solid; } + +form { display: inline; } +label { cursor: pointer; white-space: nowrap; } +img { border: 0px; } + +.highlight { color: #FF0000; background: #FFFFE0; } +/* ---------------------------------- * + Links + * ---------------------------------- */ +:link:focus, :visited:focus { color: #DD6900; } +:link { color: #006699; } +:visited { color: #006699; } +:link:hover, :visited:hover { color: #DD6900; text-decoration: underline !important; } +:link:active, :visited:active { color: #DD6900; text-decoration: underline !important; } + +.colorAdmin, a.colorAdmin, a.colorAdmin:visited { color: #FF8C24 !important; } +.colorSuperMod, a.colorSuperMod, a.colorSuperMod:visited { color: #000000;!important; } +.colorMod, a.colorMod, a.colorMod:visited { color: #008000 !important; } +.colorGroup, a.colorGroup, a.colorGroup:visited { color: #476996 !important; } +.colorCPH, a.colorCPH, a.colorCPH:visited { color: #0080FF !important; } + +.adm, a.adm, a.adm:visited { color: #800000; text-decoration: none; font-size: 11px; } + +.dlWill { color: #0066CC; } +.dlDown, .leech, .leechmed, .leechsmall { color: #800000; } +.dlComplete, .seed, .seedmed, .seedsmall { color: #006600; } +.dlCancel { color: #666666; } + +a.dlWill, a.dlWill:visited { color: #0066CC; text-decoration: none; } +a.dlDown, a.dlDown:visited { color: #800000; text-decoration: none; } +a.dlComplete, a.dlComplete:visited { color: #006600; text-decoration: none; } +a.dlCancel, a.dlCancel:visited { color: #666666; text-decoration: none; } + +a.leech, a.leechmed, a.leechsmall, +a.leech:visited, a.leechmed:visited, a.leechsmall:visited +{ + color: #800000; text-decoration: none; +} +a.seed, a.seedmed, a.seedsmall, +a.seed:visited, a.seedmed:visited, a.seedsmall:visited +{ + color: #006600; text-decoration: none; +} +/* Poster name in viewtopic */ +.nick, .nick a { + color: #005A88 !important; font-size: 13px; font-weight: bold; text-decoration: none; +} +/* Nav links */ +.nav { margin: 0.3em 0; font-size: 11px; font-weight: bold; } +.nav a { text-decoration: none; } +.nav em { color: #660000; font-style: normal; } +/* Topic titles */ +.topictitle, a.topictitle { + font-size: 11px; text-decoration: none; font-weight: bold; +} +.torTopic, a.torTopic { + font-size: 11px; text-decoration: none; +} +a.topictitle:visited, a.torTopic:visited, a.tLink:visited { + color: #5493B4; +} +/* ---------------------------------- * + Backgrounds + * ---------------------------------- */ +.row1, .row1 td { background: #EFEFEF; } +.row2, .row2 td { background: #DEE3E7; } +.row3, .row3 td { background: #D1D7DC; } +.row4, .row4 td { background: #ECECEC; } +.row5, .row5 td { background: #E7E7E7; } +.row6, .row6 td { background: #E9E9E6; } + +.prow1 { background: #ECECEC; } +.prow2 { background: #E7E7E7; } +.prow3 { background: #DEE3E7; } + +.p-body tr { background: #ECECEC; } +.p-body tr:hover { background: #DEE3E7; } + +/* ---------------------------------- * + Headers + * ---------------------------------- */ +h1 { font-size: 18px; font-weight: bold; margin: 0.2em 0 0.5em; } +h2 { font-size: 16px; font-weight: bold; margin: 0.2em 0 0.5em; } +h3 { font-size: 13px; font-weight: bold; letter-spacing: 1px; } +h4 { font-size: 12px; font-weight: bold; } +h5 { font-size: 12px; font-weight: normal; } +h6 { font-size: 11px; font-weight: normal; } +/* Page title and toptic title */ +.maintitle, .pagetitle { + font-family: "Trebuchet MS",Verdana,sans-serif; color: #3C3C3C; + padding: 0 4px; margin: 0.2em 0 0.5em; +} +.maintitle a, .pagetitle a { text-decoration: none; } +.maintitle { font-size: 22px; } +/* ---------------------------------- * + General text + * ---------------------------------- */ +.gen, .seed, .leech, +.gen td { font-size: 12px; } +.med, .genmed, .seedmed, .leechmed, +.med td { font-size: 11px; } +.small, .gensmall, .seedsmall, .leechsmall, +.small td { font-size: 10px; } +.tiny, .tiny td { font-size: 10px; letter-spacing: -1px; } + +td.gen { font-size: 12px !important; } +td.med { font-size: 11px !important; } +td.small { font-size: 10px !important; } + +.gen, .med, .genmed, +.small, .gensmall { color: #000000; } +a.gen, a.med, a.genmed, +a.small, a.gensmall { color: #006699; text-decoration: none; } +/* ---------------------------------- * + Post elements + * ---------------------------------- */ +.post-align, .post-br, .post-hr, .postImgAligned { + display: block; +} +.sp-wrap, .post-hr { margin: 8px auto; } +.c-wrap, .q-wrap { margin: 8px auto; } +.c-wrap, .q-wrap, .sp-wrap { width: 98%; clear: both; } +.q-wrap .q-wrap, .sp-wrap .sp-wrap { margin: 2px auto 4px; } +.c-head, .q-head { padding: 0 1px; font-size: 11px; color: #444444; } +.c-body, .q, .sp-wrap, .sp-head, .sp-body { + border: solid #C3CBD1; border-width: 1px 1px 1px 2px; clear: both; +} +.c-body, .q, .sp-body { padding: 2px 6px; } +.c-head, .q-head, .sp-head { text-align: left !important; } + +.post-align { margin: 8px auto; } +.post-br { line-height: 12px; } +.post-b { font-weight: bold; } +.post-u { text-decoration: underline; } +.post-i { font-style: italic; } +.post-s { text-decoration: line-through; } +/* ---------------------------------- * + Code blocks + * ---------------------------------- */ +.c-body { font-size: 13px; font-family: "Courier New",Courier,monospace; color: #006600; background: #FAFAFA; } +/* ---------------------------------- * + Quote blocks + * ---------------------------------- */ +.q { background: #FAFAFA; color: #2E2E2E; max-height: 350px; overflow: auto; } +.q .q { background: #F5F5F5; max-height: 100%; overflow: visible; } +.q .q .q { background: #FAFAFA; } +.q .q .q .q { background: #F5F5F5; } +.q .q .q .q .q { background: #FAFAFA; } +.q .q .q .q .q .q { background: #F5F5F5; } +/* ---------------------------------- * + Spoiler + * ---------------------------------- */ +.sp-wrap { padding: 0; background: #E9E9E6; } +.sp-head { border-width: 0; font-size: 11px; padding: 1px 14px 3px; margin-left: 6px; line-height: 15px; font-weight: bold; color: #2A2A2A; cursor: pointer; } +.sp-body { border-width: 1px 0 0 0; display: none; font-weight: normal; background: #F5F5F5; border-bottom: 1px solid #C3CBD1;} +.sp-fold { width: 98%; margin: 0 auto; text-align: right; font-size: 10px; color: #444444; } +/* ---------------------------------- * + List + * ---------------------------------- */ +.post_body ul, .post_body ol { + margin: 8px auto 8px 8px; +} +.post_body li { margin: 0px 4px 1px 24px; } +/* ---------------------------------- * + Post images + * ---------------------------------- */ +img.smile, img.postImg { vertical-align: text-bottom; } +img.postImg { margin: 2px 2px 0 0; } +img.postImgAligned { margin: 4px 4px 2px; } +var.img-left { float: left; clear: left; } +var.img-right { float: right; clear: right; } +/* ---------------------------------- * + Other BBCode related + * ---------------------------------- */ +.post_body pre { + border: none; background: transparent; + padding: 0; margin: 0; +} +.post-pre { white-space: pre; font-family: monospace; } +a.postLink-name, a.postLink-name:visited { text-decoration: none; } +/* ---------------------------------- * + Infoboxes + * ---------------------------------- */ +.infobox { + border: 1px #B7C0C5 solid; background: #EFEFEF; padding: 1px; + } + .infobox h1 { + background: #D1D7DC; font-size: 1.2em; padding: 0px 0.6em 2px; + } +/* ---------------------------------- * + Inputs, buttons, forms + * ---------------------------------- */ +input, textarea, select { + font-family: Verdana,sans-serif; +} +input.post, textarea.post { } + +select, input { font-size: 11px; } +textarea { font-size: 12px; } + +input.mainoption, input.main, +input.liteoption, input.lite { + font-size: 11px; border: 1px solid; background: #FAFAFA; + padding-left: 10px; padding-right: 10px; +} +input.mainoption, input.main { + font-weight: bold; /* main submit button */ +} + +/* The buttons used for bbCode styling in message post */ +input.button, .buttons input { border: 1px solid; background: #F5F5F5; } +input.long { padding-left: 20px; padding-right: 20px; } + +input.button, .buttons input, +input.mainoption, input.main, input.liteoption, input.lite { + color: #000000; border-color: #B4B4B4 #000000 #000000 #B4B4B4; +} + +/* "gte IE 7" in page_header.tpl */ +input[type="checkbox"] { margin-bottom: 0px; } +input[type="radio"] { margin-bottom: -2px; } + +input[disabled="disabled"] { color: #808080; } +input.hint { color: #999999; font-style: italic; text-indent: 0.3em; } +input.error { color: #FF0000; font-weight: bold; } +input.found { font-weight: bold; } +.cat input[type="text"] { background: #FCFCFC; } + +optgroup, option, fieldset, legend { + font-family: Verdana,sans-serif; +} +optgroup { + font-size: 11px; letter-spacing: 0px; font-weight: bold; font-style: italic; + color: #005A88; background: #DEE3E7; +} +optgroup option { color: #000000; background: #FFFFFF; } +option { font-size: 11px; } +legend { padding: 0 2px 2px; font-size: 11px; color: #000066; } +legend a { text-decoration: none; } +fieldset > legend { margin-left: 6px; } +.root_forum {} +.has_sf { color: #333333; background: #F5F5F5; font-weight: bold; } + +input.pOrdSel { + border: 0px solid #EFEFEF; width: 18px; overflow: hidden; + color: #333333; background: transparent; + font-size: 12px; font-family: Arial,sans-serif; + cursor: pointer; +} + +textarea.editor { display: block; width: 98%; } + +.fieldsets td { vertical-align: top; white-space: nowrap; } +.fieldsets fieldset { margin: 4px 4px; } +.fieldsets fieldset div { padding: 3px 6px 4px; } +.fieldsets div p { margin-bottom: 1px; } +.fieldsets div > p { margin-bottom: 2px; } +.fieldsets .select { margin-bottom: 3px; } +.fieldsets .radio {} +.fieldsets .chbox {} +.fieldsets .input {} +table.my_downloads { margin-bottom: 2px; } + .my_downloads td { padding: 1px 8px 2px 0 !important; } + +select.text_color option { background: #ECECEC; } +select.text_size option.em { font-weight: bold; background: #ECECEC; } + +.fldSet1 { margin: 2px 4px 1px 4px; padding: 0px; } +.fldSetCont1 { margin: 0px; padding: 3px 8px 4px 8px; } +.fldSetCont2 { margin: 0px; padding: 2px 8px 4px 8px; } +.fldSetCont3 { margin: 0px; padding: 6px 8px 8px 8px; } + +.hl_only_new { color: #993300; } +.select-action { background: #F5F5F5; } +/* ---------------------------------- * + Text replacement for buttons + * ---------------------------------- */ +.txtb, .txtb:link, .txtb:visited, .txtb:hover { + color: #003366; font-size: 11px; text-decoration: none; +} +.txtb:hover { text-decoration: underline; } +/* ---------------------------------- * + Basic tables + * ---------------------------------- */ +.bodyline { + background: #FFFFFF; border: 1px solid #A5AFB4; +} +.bodyline th { + background: #71869F; color: #F0F8FF; font-weight: bold; +} + +table.forumline { + width: 100%; background: #B7C0C5; border-collapse: collapse; + margin-left: auto; margin-right: auto; + border-top: 1px solid #B7C0C5; +} +.forumline th { + border: 1px solid #B7C0C5; border-width: 1px; border-top-color: #92A3A4; +} +.forumline td { + border: 1px solid #B7C0C5; border-width: 0 1px 1px; +} +.forumline th, .thHead { + padding: 6px 8px 7px; text-align: center; + color: #D5E4EC; font-size: 11px; font-weight: bold; + background: #006699 url(../images/cellpic3.gif) repeat-x; +} +/* "lte IE 6" in page_header.tpl */ +.forumline th:first-child { border-left-color: #92A3A4; } +.forumline th:last-child { border-right-color: #92A3A4; } +.forumline td { + padding: 2px 4px 3px; +} + +table.borderless th, table.borderless td { border: 0px none; } + +table.bordered { border-collapse: collapse; border: 1px solid #B7C0C5; } + .bordered th, .bordered td { border-style: solid; border-width: 1px; border-color: #B7C0C5; } + +table.message { margin: 0 auto; width: 100%; } +table.message td { + padding: 16px; text-align: center; background: #EFEFEF; +} + +.cat, td.cat, td.catTitle, td.catHead, td.catBottom { + padding: 5px 4px 6px; + background: #E0E5E9 url(../images/cellpic1.gif) repeat-x; +} +.catTitle { + font-weight: bold; letter-spacing: 1px; + color: #333333; text-align: center; +} +.catTitle a { text-decoration: none; } +.catBottom { text-align: center; } +#acp_main_nav .catTitle { + padding: 2px 6px 3px; text-align: left; font-size: 11px; letter-spacing: 0px; +} + +.info_msg_wrap { margin: 12px 0; } +table.info_msg { width: 100%; border: 1px solid #B7C0C5; background: #DEE3E7; margin: 0 auto; } +table.info_msg .msg { + border: 1px solid #B7C0C5; background: #EFEFEF; + padding: 20px; text-align: center; +} +table.error { width: 100%; border: 2px solid #993300; background: #FFD4CC; margin: 0 auto; } +table.error .msg { + border: 1px solid #993300; background: #FAEBD7; + padding: 20px; color: #A52A2A; text-align: center; +} + +table.search_username { margin: 12px; width: 370px; } + +table.pm_box_size { width: 175px; margin: 8px 2px; } + .pm_box_size .progress { background: #008000; } + .pm_box_size b { font-size: 10px; } + .pm_nav td { padding: 4px; font-size: 14px; font-weight: bold; } + +table.translit_expl th { + width: 30px; padding-right: 8px; font-weight: bold; text-align: right; +} +table.translit_expl td { width: 14px; } + +table.user_contacts th { text-align: right; width: 100%; } + .user_contacts td { padding: 2px 6px; } + +table.user_details th { padding: 2px 6px; text-align: right; vertical-align: top; } + .user_details td { width: 70%; } + +table.usercp_register h6 { + margin: 0.3em 0.4em; color: #444444; line-height: 100%; +} + +table.smilies td { padding: 3px; text-align: center; } + +/* ================================================================ * + Page header + * ================================================================ */ +/* ---------------------------------- * + TopMenu, Quick Login, PM Info, Loguot.. + * ---------------------------------- */ +.topmenu { + background: #EFEFEF; border: solid #CFD4D8; border-width: 1px 0px; + margin: 3px 4px 0; padding: 0 8px; +} +.topmenu a:link, .topmenu a:visited { text-decoration: none; } +.topmenu td { padding: 4px; font-size: 11px; white-space: nowrap; } +.new-pm { background: #FFD9B2 !important; border-top-color: #FFD9B2 !important; border-bottom-color: #FFAA51 !important; } +.new-pm-link { color: #993300 !important; font-weight: bold; } +.new-pm-link:hover { color: #591D00 !important; } +/* ---------------------------------- * + Logo + * ---------------------------------- */ +#logo { padding: 2px 4px; min-height: 75px; } + #logo h1 { + margin: 0 300px 0 0; padding-top: 6px; + font-size: 42px; font-variant: small-caps; + } + #logo h6 { + margin: 0 300px 0 0; padding-top: 1px; padding-bottom: 3px; + font-size: 14px; font-variant: small-caps; + } + #logo img { + padding: 7px 7px 6px 5px; + } +/* ---------------------------------- * + Main navigation + * ---------------------------------- */ +#main-nav { + padding: 2px 10px; margin: 0 4px; + border: solid #CFD4D8; border-width: 1px 0; background: #CFD4D8; + } + #main-nav b { padding: 0 4px 0 1px; } + #main-nav a { color: #535F62; text-decoration: none; } + #main-nav a:hover, #main-nav a:active { + text-decoration: none !important; color: #000000; + } +/* ---------------------------------- * + Latest News + * ---------------------------------- */ +#latest_news { margin-bottom: 8px; } + #latest_news table { + border-collapse: collapse; + } + #latest_news h3 { padding: 0 0 3px 0; color: #333333; } + #latest_news td { vertical-align: top; } + .news_date { + float: right; padding: 1px 8px 1px; + white-space: nowrap; font-family: "Courier New",Courier,monospace; + color: #333333; background: #F2F2F2; border: 1px solid #B4B4B4; + } + .news_title { + padding: 3px 8px 2px; margin-bottom: 2px; + background: transparent url(../images/hr400_ltr_gradient.jpg) no-repeat left top; + } + #latest_news a { text-decoration: none; color: #000000; } + #latest_news .new a { color: #A52A2A; font-weight: bold; } +/* ---------------------------------- * + Breadcrumb [ home >> forum1 >> etc. ] + * ---------------------------------- */ +#breadcrumb {} +/* ---------------------------------- * + Important info + * ---------------------------------- */ +#important_info {} +/* ================================================================ * + Page content + * ================================================================ */ +/* ---------------------------------- * + Sidebar 1 + * ---------------------------------- */ +#sidebar1 { + margin-top: -8px; width: 210px; padding: 0 6px 0 3px; vertical-align: top; + } + #sidebar1 h3 { + padding: 0 0 4px 0; margin: 8px 0 2px 0; + color: #333333; text-indent: 0.5em; + background: transparent url(../images/hr200_ltr_gradient.jpg) no-repeat left bottom; + } + #sidebar1 h3 a { color: #333333; } + #sidebar1 h5 { padding: 2px 4px 5px; } + #sidebar1 ul { margin: 6px 0 0 10px; } + #sidebar1 li { margin-bottom: 2px; margin-left: 14px; } + #sidebar1 a { text-decoration: none; color: #005A88; } + + #user_ratio { padding: 0;} /* User ratio */ + #user_ratio td { + padding: 1px 6px 1px 6px ; font-size: 11px; + } + #tr_main_cats {} /* Main tracker categories list */ + #tr_main_cats ul { + list-style-image: url(../images/arrow1.gif); + } + #tr_main_cats li { + margin-bottom: 3px; margin-left: 11px; font-size: 11px; font-weight: bold; line-height: 110%; + } +#user_ratio { + padding: 1px 6px 0px 0px; font-size: 11px; +} +#author-rel a { color: #800000; } +/* ================================================================ * + Main content + * ================================================================ */ +/* ---------------------------------- * + Forums on home page + * ---------------------------------- */ +#forums_list_wrap { margin-top: 4px; padding-right: 2px; } +#forums_top_links { clear: both; } +#forums_wrap { clear: both; padding-top: 1px; } +.cat_title { /* Category header */ + padding: 3px 8px 5px; letter-spacing: 1px; text-indent: 0.6em; + background: #DEE3E7 url(../images/cellpic1.gif) repeat-x; + } + .cat_title a { text-decoration: none; color: #333333 !important; } +table.forums { width: 100%; } + .forums th { + padding: 0 !important; font-size: 10px; font-weight: normal; color: #3C3C3C; + } + .forums td { + padding: 3px 4px; font-size: 11px; + } +.forums em { /* titles like: "Subforums:", "Moderators:" */ + color: #5E5E5E; font-style: italic; +} +.forumlink { /* forum links */ + font-size: 13px; font-weight: bold; + } + .forumlink a { text-decoration: none; } +.forums .forumlink { /* forum title */ + margin-top: 1px; +} +.forum_desc { /* forum description */ + margin-top: 2px; color: #333333; font-size: 11px; line-height: 110%; +} +.subforums { /* subforums */ + margin-top: 2px; padding-left: 0.5em; + } + .subforums em { display: none; } + .subforums + .moderators { margin-top: 0; } + .dot-sf { color: #417998 !important; font-size: 11px; margin-right: 4px; } + .new .dot-sf { color: #CA4200 !important; } + .sf_title { white-space: normal; } + .sf_icon { margin-right: 1px; } + .sf_separator {} + .sf_title a { text-decoration: none; } +.moderators { /* moderators */ + margin-top: 2px; font-size: 11px; line-height: 110%; + } + .moderators a, .moderators a:visited { + color: #333333; font-size: 10px; text-decoration: none; + } +.f_last_post { /* last topic/post */ + text-align: center; + } + .last_topic { margin-top: 1px; white-space: nowrap; } + .last_topic a { text-decoration: none; } + .last_post_time { margin-top: 2px; font-size: 10px; white-space: nowrap; } + .last_time {} + .last_author { padding-left: 3px; } + .f_stat_inline { /* Posts: xx Topics: xx */ + margin-top: 1px; white-space: nowrap; } + .f_stat_topics {} + .f_stat_posts { padding-left: 3px; } + +.forums thead { /* Forum TH-Headers */ + display: none; +} +.f_icon { /* Forum Icon cell */ + width: 46px; + padding: 6px 0 !important; +} +.f_titles { /* Forum Title cell */ + width: auto; +} +.f_topics { /* Topics Count cell */ + width: 40px; text-align: center; +} +.f_posts { /* Posts Count cell */ + width: 50px; text-align: center; +} +.f_last_post { /* Forum Last Topic/Post cell */ + width: 230px; +} +.f_stat_inline { /* Inline Topic/Post count */ + display: block; +} + +table.forums { border-collapse: collapse; } +.cat_title { border: 0 none; + border-top: 1px solid #B7C0C5; + border-bottom: 1px solid #C3CBD1; } +.f_tbl_wrap, #board_stats_wrap { + border: 0 none; } +.forums td.row1 { border: solid #FDFDFD; border-width: 0 1px 1px 0; } +.forums td.row2 { border: solid #F5F5F5; border-width: 0 1px 1px 0; } +td.f_titles { border-right-color: #FAFCFD !important; } +td.last_td { border-right-width: 0 !important; } + +.cat_footer { + height: 0px; margin-top: -1px; border-top: 1px solid #C3CBD1; + font-size: 0px; line-height: 0px; +} +.cat_separator { height: 10px; font-size: 0px; line-height: 0px; } +#mark_all_forums_read { margin: -10px 0 3px 0; } + +#online_time { float: left; font-style: italic; color: #444444; } +#online_explain { float: right; } +#online_userlist a { white-space: nowrap; } +#forums_top_nav { display: none; } +/* ---------------------------------- * + Forums on viewforum page + * ---------------------------------- */ +table.forum th { white-space: nowrap; } +td.topic_id { padding: 4px 6px; } + +.spaceRow { + padding: 0 !important; background: #D1D7DC; +} +td.topicSep { /* Topic type groups separator */ + padding: 2px 12px 3px; font-weight: bold; letter-spacing: 1px; color: #333333; +} +.topicMoved { /* Topic Moved prefix */ + font-weight: normal; font-style: italic; +} +.topicAnnounce { /* Topic Announce prefix */ + color: #DD6900; +} +.topicSticky { /* Topic Sticky prefix */ + color: #009900; +} +.topicPoll { /* Topic Poll prefix */ + font-weight: normal; color: #006699; +} +.topicPG { /* Topic pagination links */ + font-weight: normal; white-space: nowrap; font-size: 10px; +} +.iconDL { /* DL Icon */ + border: 1px outset; background: #EFEFEF; + padding: 0px 3px 0px 2px; margin: 2px 1px 2px 0px; +} +.topicAuthor, a.topicAuthor, a.topicAuthor:visited { + font-size: 11px; color: #333333; text-decoration: none; +} +.torSize { + font-size: 11px; color: #333333; text-decoration: none; +} +.hl-selected-topic { background-color: #FAF0E6 !important; } +.hl-selected-row, .hl-selected-row td { background-color: #FAF0E6 !important; } +/* ---------------------------------- * + Topics on viewtopic page + * ---------------------------------- */ +table.topic { width: 100%; } + + .post_head { padding: 0 6px; font-size: 10px; } + .post_wrap { margin: 5px 5px 8px; } + .post_body { line-height: 18px; } /* The content of the posts */ + a.postLink { text-decoration: none; } + a.postLink:visited { text-decoration: none; color: #5493B4; } + .posted_since { color: #666666; padding-left: 4px; } + .signature { clear: both; } + .signature { max-height: 100px; overflow: hidden; } + .signature, .signature * { + font-size: 10px !important; color: #5E5E5E !important; + text-decoration: none !important; background: transparent !important; + border: 0 none !important; padding: 0 !important; margin: 1px 0 !important; + } + .signature .c-head, .signature .q-head { display: none !important; } + .signature .c-wrap, .signature .c-body, + .signature .q-wrap, .signature .q { display: inline !important; } + .signature a { text-decoration: underline !important; } + .signature img { max-width: 600px; } + .last_edited { font-size: 10px; color: #5E5E5E; } + .poster_info p { margin: 2px 0; color: #444444; } + .poster_info .nick { margin: 0 0 4px; color: #333333; line-height: 110%; } + .poster_info .avatar { margin: 5px 0 4px; max-width: 100px; max-height: 100px; overflow: hidden; } + .avatar imgreflect { display: block; } + .poster_info .flag { margin: 4px 0; } + .poster_info em { font-style: normal; color: #000000; } + + table.topic, .topic .td1, .topic .td2, .topic .td3, .post_head, .post_btn_2 { + border-style: solid; border-color: #C3CBD1; } + .topic .td1 { border-width: 1px 1px 0px 0px; border-right-color: #B7C0C5; } + .topic .td2 { border-width: 1px 0px 0px 0px; width: 100%; } + .topic .td3 { border-width: 0px 1px 0px 0px; border-right-color: #B7C0C5; height: 100%; } + .post_head { border-width: 0px 0px 1px 0px; } + .post_btn_2 { border-width: 1px 0px 0px 0px; } + table.topic { border-width: 0px 1px 1px 1px; border-color: #B7C0C5; } + + .poster_info { padding: 4px; vertical-align: top; font-size: 10px; line-height: 100%; } + .poster_btn { padding: 0; vertical-align: bottom; text-align: center; white-space: nowrap; } + .message { padding: 0; vertical-align: top; width: 100%; } + + input.select_post { margin-top: 0px; float: right; } + input[type="checkbox"].select_post { margin-top: 4px; } + + table.peers { border-collapse: collapse; } + table.peers th { border: 1px #A5AFB4 solid; background: #D1D7DC; color: #333333; } + table.peers td { border: 1px #A5AFB4 solid; padding: 4px; } + #last_seed_info { border: 1px #A5AFB4 solid; } + + .dl_list {} + .dl_list td { text-align: center; } + .dl_list img { display: block; } + #dl_counts td { font-size: 12px; } + + #poll { border: solid #B7C0C5; border-width: 1px; margin-bottom: -1px; } + + .quick_reply_box { width: 640px; } + .hl-selected-post { background-color: #FFEFD5 !important; } +/* ---------------------------------- * + Torrent status + * ---------------------------------- */ +.tor-status-td:hover { background: #F8F8FF; } +.tor-icon { margin: 0 3px; } +.tor-approved { margin-left: 1px; color: #008000; font-weight: bold; } +.tor-closed { padding-left: 1px; color: #FF4500; font-weight: bold; } +.tor-closed-cp { color: #CE3800; font-weight: bold; } +.tor-consumed { color: #D26900; font-weight: bold; } +.tor-dup { padding-left: 1px; color: #0000FF; font-weight: bold; } +.tor-need-edit { color: #FF0000; font-weight: bold; } +.tor-no-desc { padding-left: 1px; color: #FF4500; font-weight: bold; } +.tor-not-approved { color: #C71585; } +.tor-checking { color: #2424FF; } + +/* ---------------------------------- * + Attachments + * ---------------------------------- */ +table.attach { width: 95%; margin: 0 auto; clear: both; border-color: #A5AFB4; } + .attach th, .attach td { border-color: #A5AFB4; } + .attach th { padding: 3px; text-align: center; font-weight: bold; background: #D1D7DC; } + .attach td { padding: 2px 4px; } + .dl-link { font-size: 13px; } + +fieldset.attach { width: 95%; margin: 14px auto; padding: 2px; clear: both; } + .attach_link { margin: 2px 12px 6px; } + .attach_stats { padding-left: 3px; } + .attach_comment { + margin: 6px 12px; padding: 1px 8px; line-height: 110%; + color: #444444; border-left: 2px solid #CC9933; + } + .attach .denied { color: #800000; } + +#tor_blocked { width: 95%; } + #tor_blocked td { background: #FAEBD7; padding: 8px 12px; color: #6E380F; } +/* ---------------------------------- * + Search Results page + * ---------------------------------- */ +.opened { /* Clicked link color */ + color: #71869F; +} +/* ---------------------------------- * + Tracker + * ---------------------------------- */ +a.tr-dl { font-weight: bold; } +a.tr-dl:visited { color: #5493B4; font-weight: normal; } + +/* ================================================================ * + Images + * ================================================================ */ +img.forum_icon { width: 46px; height: 25px; } +img.topic_icon { width: 19px; height: 18px; } +img.pm_box_icon { width: 28px; height: 25px; } +img.icon1 { width: 12px; height: 9px; } +img.icon2 { width: 18px; height: 9px; } +img.spacer { display: block; height: 1px; } +/* ================================================================ * + Page footer + * ================================================================ */ +.bottom_info { font-size: 11px; } +.copyright { font-size: 10px; color: #444444; letter-spacing: -1px; } + .copyright a { text-decoration: none; } + +#timezone { + float: right; text-align: right; white-space: nowrap; + font-size: 10px; line-height: 110%; color: #333333; +} +.tz_time { font-family: "Courier New",Courier,monospace; font-size: 11px; } + +#f_icons_legend { margin: 4px auto; } +/* ================================================================ * + Menus + * ================================================================ */ +.menu-root { padding-right: 13px; white-space: nowrap; + background: transparent url(../images/menu_open.gif) no-repeat right; } +.menu-alt1 { padding-right: 0; background: transparent; } +img.menu-alt1 { width: 9px; height: 9px; } +a.menu-root, a.menu-root:visited, a.menu-root:hover { + text-decoration: none !important; } +.menu-sub { position: absolute; display: none; z-index: 1000; } + .menu-sub table { background: #FFFFFF; border: 1px solid #92A3A4; } + .menu-sub table th { background: #71869F; color: #F0F8FF; font-weight: bold; font-size: 11px; } + .menu-sub table td { background: #E7E7E7; font-size: 11px; } + .menu-sub table td.cat { background: #B5BEC3; } + .menu-sub legend { font-weight: bold; } + .menu-sub label { display: block; padding-right: 2px; margin-right: 1px; } + .menu-sub label:hover { background: #D1D7DC; color: #993300; } + .menu-sub iframe.ie-fix-select-overlap { + display: none; + display/**/: block; + position: absolute; z-index: -1; filter: mask(); } +/* ================================================================ * + Ajax + * ================================================================ */ +var.ajax-params { display: none; } +#ajax-loading, #ajax-error { + position: fixed; right: 3px; top: 0px; + z-index: 5000; + display: none; +} +#ajax-loading td, #ajax-error td { + font-size: 11px; + font-weight: bold; + white-space: nowrap; + padding: 3px 4px 4px 4px; + border: 1px solid #2E8B57; + color: #FFF5EE; background: #2E8B57; +} +#ajax-loading td.icon { + width: 12px; height: 12px; + background: #EFEFEF url(../images/loading.gif) no-repeat center center; +} +#ajax-error { + background: #8B0000; color: #F5F5F5; + border: 0px; padding: 4px; + white-space: nowrap; overflow: auto; +} +.editable-container { cursor: pointer; } +.editable-container:hover { background: #E8E9F8; } +.loading-1 { background: transparent url(../images/loading_1.gif) no-repeat left center; padding-left: 22px; } +/* ================================================================ * + Treeview, TableSorter + * ================================================================ */ +.treeview, .treeview ul { + padding: 0; margin: 0; list-style: none; font-size: 11px; line-height: 14px; +} +.treeview ul { + margin-top: 4px; +} +.treeview .hitarea { + background: url(../images/treeview/treeview-default.gif) -64px -25px no-repeat; + width: 16px; height: 16px; margin-left: -16px; float: left; cursor: pointer; +} +/* fix for IE6 */ +* html .hitarea { + display: inline; float: none; +} +.treeview li { + margin: 0; padding: 1px 0 1px 16px; +} +.treeview span { + padding-left: 3px; display: block; +} +.treeview a.selected { + background-color: #eee; +} +#treecontrol { margin: 1em 0; display: none; } +.treeview .hover { color: red; cursor: pointer; } + +.treeview li { background: url(../images/treeview/treeview-default-line.gif) 0 0 no-repeat; } +.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; } + +.treeview .expandable-hitarea { background-position: -80px -3px; } + +.treeview li.last { background-position: 0 -1766px } +.treeview li.lastCollapsable, .treeview li.lastExpandable { + background-image: url(../images/treeview/treeview-default.gif); +} +.treeview li.lastCollapsable { background-position: 0 -111px } +.treeview li.lastExpandable { background-position: -32px -67px } + +.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; } + +/* Tablesorter */ +.tablesorter u { display: none; } +.tablesorter .header { + cursor: pointer; white-space: nowrap; +} +.tablesorter .tbs-text { + padding-bottom: 1px; +} +.headerSortUp .tbs-text, .headerSortDown .tbs-text { + border-bottom-width: 2px; border-bottom-style: solid; +} +.tbs-icon { + padding-left: 8px; + background-image: url(../images/tbl_sort_bg.gif); background-repeat: no-repeat; background-position: 0 50%; +} +.headerSortUp .tbs-icon { + background-image: url(../images/tbl_sort_asc.gif); +} +.headerSortDown .tbs-icon { + background-image: url(../images/tbl_sort_desc.gif); +} +/* ================================================================ * + Misc + * ================================================================ */ +.sf { padding-left: 20px !important; } +.jumpbox { margin: 6px 0; text-align: right; white-space: nowrap; } + +.attachrow { font-size: 11px; border: 1px #A5AFB4 solid; } +.attachheader { font-size: 11px; border: 1px #A5AFB4 solid; background: #D1D7DC; } +.attachtable { font-size: 12px; border: 1px #A5AFB4 solid; border-collapse: collapse; } + +pre, .pre { + font-family: Courier,monospace; font-size: 12px; + border: 1px solid #B7C0C5; background: #F5F5F5; + padding: 4px; margin: 10px; text-align: left; +} +.pre { width:100%; overflow: auto; white-space: nowrap; } + +.ann { font-size: 13px; text-align: center; color: #993300; font-weight: bold; } + +.clickable { cursor: pointer; } +.folded, .folded2 { display: block; + background: transparent url(../images/icon_plus_1.gif) no-repeat left center; padding-left: 14px; } +.unfolded, .unfolded2 { display: block; + background: transparent url(../images/icon_minus_1.gif) no-repeat left center; padding-left: 14px; } +.folded2 { background-image: url(../images/icon_plus_2.gif); } +.unfolded2 { background-image: url(../images/icon_minus_2.gif); } + +.warnColor1 { color: #993300; } +.warnColor2 { color: #FF0000; } +.warnBorder1 { border: 1px solid #A52A2A; } +.warningBox1 { border: 1px solid #A52A2A; color: #993300; padding: 12px; } +.warningBox2 { color: #993300 !important; background: #FFD9B2; border: 2px solid #CC6600; padding: 8px; } + +/* ================================================================ * + Reports + * ================================================================ */ +/* Color pixel */ +div.report_pixel { + height: 1em; + width: 1em; + float: left; + margin-right: 3px +} + +/* Report list colors */ +td.report_cleared, div.report_cleared { + background-color: #7ce380; +} + +td.report_process, div.report_process { + background-color: #ffc267; +} + +td.report_open, div.report_open { + background-color: #f2a0a7; +} + +td.report_new, div.report_new { + background-color: #f88085; +} + +td.report_delete, div.report_delete { + background-color: #9eabb2; +} + +/* Report mode select */ +select.report_mode option { + margin: 1px 0 +} + +select.report_mode optgroup { + background-color: #FFF; + color: #000; + font-style: normal; + font-weight: bold; + margin-left: 3px +} + +select.report_mode optgroup option { + border-left: 1.3em solid; + padding-left: 2px; + margin-left: 1px; +} + +select.report_mode option.report_cleared { + border-color: #1e6731 +} + +select.report_mode option.report_process { + border-color: #e6721b +} + +select.report_mode option.report_open { + border-color: #8b201d +} + +/* ================================================================ * + Shortcuts + * ================================================================ */ +.spacer_0, .spacer_2, .spacer_4, .spacer_6, .spacer_8, .spacer_10, .spacer_12 { + font-size: 0px; line-height: 0px; } +.spacer_0 { height: 0px; } +.spacer_2 { height: 2px; } +.spacer_4 { height: 4px; } +.spacer_6 { height: 6px; } +.spacer_8 { height: 8px; } +.spacer_10 { height: 10px; } +.spacer_12 { height: 12px; } + +.pad_0, .pad_0 td, td.pad_0 { padding: 0; } +.pad_2, .pad_2 td, td.pad_2 { padding: 2px; } +.pad_4, .pad_4 td, td.pad_4 { padding: 4px; } +.pad_6, .pad_6 td, td.pad_6 { padding: 6px; } +.pad_8, .pad_8 td, td.pad_8 { padding: 8px; } +.pad_10, .pad_10 td, td.pad_10 { padding: 10px; } +.pad_12, .pad_12 td, td.pad_12 { padding: 12px; } +.pad_14, .pad_14 td, td.pad_14 { padding: 14px; } +.pad_16, .pad_16 td, td.pad_16 { padding: 16px; } + +.mrg_0 { margin: 0 !important; } +.mrg_2 { margin: 2px !important; } +.mrg_4 { margin: 4px !important; } +.mrg_6 { margin: 6px !important; } +.mrg_8 { margin: 8px !important; } +.mrg_10 { margin: 10px !important; } +.mrg_12 { margin: 12px !important; } +.mrg_14 { margin: 14px !important; } +.mrg_16 { margin: 16px !important; } + +.lh_100 { line-height: 100%; } +.lh_110 { line-height: 110%; } +.lh_120 { line-height: 120%; } +.lh_150 { line-height: 150%; } + +.wAuto { width: auto !important; } /* widthAuto */ +.w50 { width: 50% !important; } +.w60 { width: 60% !important; } +.w70 { width: 70% !important; } +.w80 { width: 80% !important; } +.w85 { width: 85% !important; } +.w90 { width: 90% !important; } +.w95 { width: 95% !important; } +.w100 { width: 100% !important; } + +.border { border-style: solid; border-color: #B7C0C5; } +.bw_T { border-width: 1px 0px 0px 0px !important; } +.bw_TR { border-width: 1px 1px 0px 0px !important; } +.bw_TRB { border-width: 1px 1px 1px 0px !important; } +.bw_TRBL { border-width: 1px 1px 1px 1px !important; } +.bw_TB { border-width: 1px 0px 1px 0px !important; } +.bw_TBL { border-width: 1px 0px 1px 1px !important; } +.bw_TL { border-width: 1px 0px 0px 1px !important; } +.bw_TRL { border-width: 1px 1px 0px 1px !important; } +.bw_R { border-width: 0px 1px 0px 0px !important; } +.bw_RB { border-width: 0px 1px 1px 0px !important; } +.bw_RBL { border-width: 0px 1px 1px 1px !important; } +.bw_RL { border-width: 0px 1px 0px 1px !important; } +.bw_B { border-width: 0px 0px 1px 0px !important; } +.bw_BL { border-width: 0px 0px 1px 1px !important; } +.bw_L { border-width: 0px 0px 0px 1px !important; } + +.bCenter { margin-left: auto !important; margin-right: auto !important; } /* blockCenter */ +.bLeft { margin-right: auto !important; } +.block { display: block; } +.bold { font-weight: bold; } +.bRight { margin-left: auto !important; } +.clear { clear: both; height: 0; font-size: 0px; line-height: 0px; overflow: hidden; } +.clearB { clear: both; } +.floatL { float: left; } +.floatR { float: right; } +.hidden { display: none; } +.inline { display: inline; } +.normal { font-weight: normal; } +.nowrap { white-space: nowrap !important; } +.wrap { white-space: normal !important; } +.strike { text-decoration: line-through; } +.tCenter { text-align: center !important; } /* textCenter */ +.tLeft { text-align: left !important; } +.tRight { text-align: right !important; } +.vBottom { vertical-align: bottom !important; } +.vTop { vertical-align: top !important; } diff --git a/upload/templates/default/donate.tpl b/upload/templates/default/donate.tpl new file mode 100644 index 000000000..072b7a3a7 --- /dev/null +++ b/upload/templates/default/donate.tpl @@ -0,0 +1,54 @@ +

    {PAGE_TITLE}

    + + + + + + + + + + + + + +
    {L_DONATE_TITLE}
    +

    Финансовая помощь

    + Вся денежная помощь идет на обновление нашего сервера и оборудования, поэтому мы рады любым вашим пожертвованиям... +
    + Если Вы желаете материально помочь в развитии проекту - ниже указаны возможные способы перевода денежных средств. +

    + +
    + WMID: ************* +

    + + + + + + + + + + + + + + + + + + + + + + + +
    ВалютаКошелёк
    Евро E*************
    Доллар Z*************
    Гривны U*************
    Рубли R*************
    +
    + Как перевести WebMoney деньги можно посмотреть здесь +
    +
     
    + +
    \ No newline at end of file diff --git a/upload/templates/default/faq.tpl b/upload/templates/default/faq.tpl new file mode 100644 index 000000000..0785b2176 --- /dev/null +++ b/upload/templates/default/faq.tpl @@ -0,0 +1,43 @@ +

    {PAGE_TITLE}

    + + + + + + + + + + + + + +
    {L_FAQ_TITLE}
    +
    + +

    {faq_block_link.BLOCK_TITLE}

    + +

    {faq_block_link.faq_row_link.FAQ_LINK}

    + +
    + +
     
    + +
    + + + + + + + + + + + + +
    {faq_block.BLOCK_TITLE}
    + +

    {faq_block.faq_row.FAQ_QUESTION}

    +

    {faq_block.faq_row.FAQ_ANSWER}

    +

    {L_BACK_TO_TOP}

    \ No newline at end of file diff --git a/upload/templates/default/gallery.tpl b/upload/templates/default/gallery.tpl new file mode 100644 index 000000000..c58da0fda --- /dev/null +++ b/upload/templates/default/gallery.tpl @@ -0,0 +1,112 @@ + + + + + + + + + +
    {L_GALLERY}
    + +

    {MAX_SIZE_HINT} {MAX_SIZE}

    + {MSG} +
    +
    +
    +
    {MORE}
    +
    + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/upload/templates/default/groupcp.tpl b/upload/templates/default/groupcp.tpl new file mode 100644 index 000000000..1bba40ea0 --- /dev/null +++ b/upload/templates/default/groupcp.tpl @@ -0,0 +1,229 @@ +

    {PAGE_TITLE} :: {GROUP_NAME}

    + + + + + + + +++ + + + + + + + + +
    {L_MEMBERSHIP_DETAILS}
    {groups.MEMBERSHIP} +
    + {S_HIDDEN_FIELDS} +
    + {groups.GROUP_SELECT} +
    +
    + +
    +
    +
    + + + + + + + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + + + + + +
    {L_GROUP_INFORMATION}
    {L_GROUP_NAME}:{GROUP_NAME}
    {L_GROUP_DESCRIPTION}:{GROUP_DESCRIPTION}
    {L_GROUP_MEMBERSHIP}:

    {GROUP_DETAILS}

    + +

    +    +

    + + +

    +    +

    + +
    {L_GROUP_TYPE}: +

    +    +    + +

    +

    + +

    +
    + +
    + +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_PRIVATE_MESSAGE}{L_USERNAME}{L_POSTS_SHORT}{L_LOCATION}{L_EMAIL}{L_WEBSITE}{L_SELECT}
    {L_GROUP_MODERATOR}
    {MOD_PM_IMG}{MOD_USERNAME}{MOD_POSTS}{MOD_FROM}{MOD_EMAIL_IMG}{MOD_WWW_IMG} 
    {L_GROUP_MEMBERS}
    {member.PM_IMG}{member.USERNAME}{member.POSTS}{member.FROM}{member.EMAIL_IMG}{member.WWW_IMG} + + + +
    {L_NO_GROUP_MEMBERS}
    {L_HIDDEN_GROUP_MEMBERS}
    +

    + + + +

    +

    + +

    +
    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_SELECT}{L_USERNAME}{L_POSTS_SHORT}{L_LOCATION}{L_EMAIL}{L_WEBSITE}{L_PRIVATE_MESSAGE}
    {L_PENDING_MEMBERS}
    {pending.USERNAME}{pending.POSTS}{pending.FROM}{pending.EMAIL_IMG}{pending.WWW_IMG}{pending.PM_IMG}
    + +   + +
    + + + +
    + + + + + +
    + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/images/arrow1.gif b/upload/templates/default/images/arrow1.gif new file mode 100644 index 0000000000000000000000000000000000000000..5350962c7613c580ee976f7726ca1c3db7346f4f GIT binary patch literal 59 zcmZ?wbhEHb;B_suit*{ip2KYn@j_WjeBZ{B_Q^!3NDSMNT) zeEsgz*YD3?zx(pz_t)<~KYslIlzI5{1yBi4;@i*PKYsst{q6$;^?>3}7O-JDAQI#! w1~%0L%!?Kq)JQ3FDKkIx(P8q`*w`_Jflug|@eLM^1;>{r7=^mbQedzK01d%^JOBUy literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/cellpic.gif b/upload/templates/default/images/cellpic.gif new file mode 100644 index 0000000000000000000000000000000000000000..47457ef5f772f536ceb76e14f8890953d696c177 GIT binary patch literal 722 zcmV;@0xkVVNk%w1Vfp|C0M!5h^7Quj`TF4I>c-I7+TiBM(%RMB+Z|c+{4b-#Lm~w*WTCOF)5% z*53dB|Nj2|+jRt;?ddQ)7#&E z|Ni~{A^8LV00000EC2ui0Qvw0000L6K!tEf6iz4<&_GEUI0pr2VLFwJBv?r+mD1@d z6%?wcxk1bjoXuu1*enK%ywf4rPp6Ciz!&&8e;XS-JRCAG5j8OwF)S-AB_%3536%?% z4w()BoF1MCprH(-0So~Ts2L9#tQid=4L>3xCOg34-CPx&h@xKZtBqy9C+F>aLv}Fq+0p|!ET)yZK^K;ypq3A5I$?Ps3 zo~QMqN*zQ9hWi>Y6k&L@qAS5l2@>j8D0_D8+N79rky~)}_8UhXy)Z)##x>}mNI?Jq EJ1XXQ%m4rY literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/cellpic1.gif b/upload/templates/default/images/cellpic1.gif new file mode 100644 index 0000000000000000000000000000000000000000..715b8d4aa8b8752fc3e2ff6deb214cd424ad413f GIT binary patch literal 246 zcmV^k0K@q*xuvX;N;ZX;NRrv-QwoR(bv(~ z-pJ6_$kN!-+1|&{*Vf$O+27>X-s92O-PPRT(AVA9-QwQk=gZUC)7szD+Th&b<=o-s z-sI=b*4x|R=FQdHA^8LV00000EC2ui00{sY000GZ;Npy=vz$pXE@|r~j3CeHd|k6} z@B9S-zTfZiDFTYfPT>NCNTpS!+d;+|@e7w8@f;>Qyk4KPSNLWNzh+jfNN=iaP zSxHGrSse}-IXO5uxj4BwIl1|`dAa!n`G7!B7;J#Bgdjf<2ug^Fi-?Gbi-ELDNhvBS zC@RABtN%a1AjrWW$?%JrQHg;`kdaxC@&6HqXa+_w0J;+fn3x&a*wF=n-e6)D0Esd% z10f7BG6@MfCVns!7G#78!RY_D7)gI)^g1NouYq zx>oF%Dasfac;by~3Dla(e|%EC8%{U3EiiuYZ~@PcvgAjnUkLyCr)*AHg<}O%dGI1Y!&V0k(J&s-LC97BS z6fPDiTh0Imia%Mvv<`>_+3CRA`9QJnQNld6h3i&5+P6;SyivmaigoWR9{%6gS)frO z(eKt+wDO7Ne9PVvE#8RrVclh`Yb*BO>#fi+n{hs^qiXHC9ryEA)c7rTfA_;$pyO!L zzlM4Z4Vl)qR-VqTPTAhRUL75g$x|kCPoFWJclMmw9P<~<_wnIex@@WB%2g}H*RESz Qx^dIyEnBylDKc0C0N++|T>t<8 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder.gif b/upload/templates/default/images/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..c16bfa75d5daf0c2eb6a6fd0b7f2d1a4e4a0cfcd GIT binary patch literal 344 zcmV-e0jK^)Nk%w1VG{rn0K^{v@$vDh$=Jxr$?NOu+}zwth^LW}k&3g(T#>A1W@gjV z)8pggnWn8NbeXcUvitk{5@(Xb*yFvvzIm#`Y@xi*;O9gwL!-c?mqL75L(9zKz9v+ICqT%fF!PMO{dY=JajP>{Ucc{Q?jh^iD_SxCl zSBayTq^d%OssI1~A^8LW0018VEC2ui022Tb000HB;3tkEP#k2MQbhqY9-yX^dnFg3 z$g{W{iC|DS=`9L30z!yc%m9@jArg@YJ*ZTLA{;~vfiOi;932Y5fWd%(gu@NY=%R2W z!VD_o9e^k8WRtRodTPj8yg4@ z4s@xVUJ(NbsT&Xme;*heZ4kA#5Wxrr9CAJt5)vJ2%*h!Q4P_-B6%Q8I*AEpgJ>4lG F06W--dwu`_ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder_announce_new.gif b/upload/templates/default/images/folder_announce_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..56b2702b172763bbe794c036602884c41f83ac3b GIT binary patch literal 289 zcmV++0p9*cNk%w1VG{rn0K^{v|Hh06V2t$m`u?g_x}Jjm>(~FCI<3dj{nDpYac}|x z0*$uJ)w7IQldsjotJaS~YoWZ~>+!6HQ0~{hOo*e3e`tSULwAyt|F>`c-@kvUyGk@4 zE_j^5*yCcEv;Y79A^8LW0018VEC2ui022Tb000G^;3tma(JW+|c1?45)S;%4Tiiz= z&myGVz+8j}Y1}3bpawEKa59;RLQ#QcD5w<2VcjSQR!3ksT2K&Zg4%&bUo;~@fQ`0H zEp2o_AX;1ifB*=0fq)lT91Mj3goO+oA95Izly{Vrdl3NxoSk=_og5KzpaWhC8xN&> n9~ub;u(7hS6-+$|5)Tivx)KQxWF-_F90A70#4bF`DIowmKFxZB literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder_big.gif b/upload/templates/default/images/folder_big.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b2bc47c67aa83051fcf1a312a739046b9976b8e GIT binary patch literal 677 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 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder_lock.gif b/upload/templates/default/images/folder_lock.gif new file mode 100644 index 0000000000000000000000000000000000000000..10eb77697215f3b201fd49984272c6f5dc22e48c GIT binary patch literal 333 zcmV-T0kZx_Nk%w1VG{rn0K^{v)YR0f$=FCpNK1&P?Ck4`v&hBA$6S%D^78TIhbpJ>F0!*r0?(V;p*-IUX1he^EiQ} z^Y{8SeWBjo-v9sqA^8LW0018VEC2ui022Tb000Hb;3tYy(PU^>aAPY%4m2tB14FJT z4Va?+2n_-=khmlVjv}b>2@!=5Hhy)b`2#r_*TnPqY0Rt7I7n)@R2_6Ps z91aNym!<-!01Fu`5(OTwWdgpwsS5`<9}^A+yRV~=sRj%V7$YVI03O!Y0L~5tE-(xW f)Y%IQ7TY-=0UHem7VQHLVdo<@8yy=mIUxW$un>jZ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder_lock_new.gif b/upload/templates/default/images/folder_lock_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..720e21028931a2bada129f617207b0e8e5183d96 GIT binary patch literal 459 zcmV;+0W|(cNk%w1VG{rn0M$PLq{Y_V-Q7rvtI~xs)YR1RmNj;$z;C0y_xJbD;OEQB z%jD$bEOwjm@$rYU$=cf5>hbpB;o(`8v&F^5?Ck6pX_Lp>=6gtG_rLnWL z;p*<^=jZeD^O9jJu*};5UW{m-xtyk}wsbGQzrPJ-kztIXu% zVvf1f-z0FBIeebP*yHi@^op&&?C$TAr?L9{{d$w2McR zBoPq-6AUpdCMXfZ%d`Oj1REhXKO!>$&W0c7=K&8TCk8?Z6+92y^xF>)6C*7gLqXp`C5 z+3xP`-rn6FLws>+$jN^YijWhpFuI_FIptg|Wy}k+4fkOQXcq z%G~9fo166X^f`j2xX|6Kudw3c;9_E8;Og(}?CbdW_UGs3QiGiG^6`P2sC%o!kGIV4 z@9%JMZvb74fUd@Te0;vt;F-SB{r>*z?(gL7@vOkhZ<3_2&D)%&tMBsjIeVS)_4lo{ zx&QzFA^8LW002J#EC2ui04@L-000L6z@KnPEDmj$O5(-*tR%*$bV`&65-X5pU>e9) zhK!6#ros}e!N8N6xKp0N#vmx$iGmMlK$)ac6cm4NH5mdlcV#OTJ05-%9&u|Pf_^Cl zb%|4RHjaQECJzS(483S!_CI=%88X6-I z5T>Xt1u(uuA0V-Cq9Z2TCNT#cu@fy03DZIr34^i&quP<(E)5iWc-_9dJ>rR=gG^B4}iwB9ku`0wx?Rv0y^Qit!di0Kig# zfC3B)WYk!q#Y7i4bH*!iLWEDg0ysRj%26T0iK8bL=v>+$f(Qms1E5$q4IKaxECH0j z$*e201}C5@P=LTdK64*#FnB5=g4efT8H^1OqMW%O8!C*2dg85D4I;)8K!8Hp-5+TQ zC|KJenPbNgBfVuIXE|tb613!q~YrB z0bYzafu%Klq5uE?A^8LW0018VEC2ui022Tb000He;3tY!0&%F90Anjo(NqDn1W&F= z9UJY_n*+r~VfYAw1pz@T2uA~tuOJ9y1eiqu(11uphe4BoxtJ9gN1>2ld@PYBHDERi z2x~`tU|b{XW@!xt4jvK-6aZ^gfM^a44Gsqhh-(NK3V;Cu29S~i0|x~SRRNi1n~(+w zUH}o03j$aI8CDAh1`Y%qEEEZl4XXsPS-1!cI3E=e2)NG94yz9w8zUwN(a*UE4-pA2 iFb@dW4&wwG-Z>vp5DXgc2N7ZFBN7xH9vw0{Apkog5Pe|) literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder_new_big.gif b/upload/templates/default/images/folder_new_big.gif new file mode 100644 index 0000000000000000000000000000000000000000..5eec565b382bb9e0b9280fc0387a09f5f3a4a8e6 GIT binary patch literal 663 zcmV;I0%-k5Nk%w1VJ-j}0M$PLsm9go?CejCth~Iu{L-k7j*iRA%=^ih_q~JqxOHx$ zy~D%9@$vE8+}z~k zMF0Q)A^8LW002J#EC2ui04@L-000L6z@KnPEDmX&62-+Vu`5JArv~HMF0Y&3 zfk>$V6Vasou!XaMg#`~LK&ZiCM1>7JI1ET?VSox@VtYTI;Tl8BdC>m(h2e{qF1xy{!qn7s-@biqYY!fqQ`pwlR$5w`8sYu@Ku62WB@bV{`~3Oy zt8I-N&fI2<>&ck6GqGpk8#nO}eY?m2vH z!J#W3KY!VI`ToJv7ytkNulS$a&ow02*)hP?NY8+ok%56h@h1x_7lS>64v@_N@+Je@ zy#w{t8TM5G$={iOR?06iwLQ5G%^b?u$Zt(YxVKVataB|nZsagE6OY0Fo9iOS#7S2 z41<}ugH zm21~T6!jzQ1zGGw9zGJ0WYpDkcC%u5E%HNzK~auH)GvUk#R2GxCIPVk0fC86kMl_~ z#Vwc-;mk0<&3Vm<8H&w~a_WvqUS?%rWngFE1bW%%Fz-z{*#HBpExvUvTHWi1UG>LP6QNiEDX#HTnyYmQvwdmzo1kZ zA>g#|)r1!_9Qv2AmaIDF&~V?uXjPc+wD=P(ALsFLbf^>x%?nfT;@Fb)-(d0KB-^OO zcbr1@{6hX}vc4)#1|pJTDnbFClez699l@5cLM&kdTEYXg#0MBV9Fjb(Q;t9W&cPeX zFYw~JWkknP7PlD_0_vt5PXA$9&~iDEr=+f=ZzD595>syLV;-lP{;AG#?3qD9VjOZE z9sDZx4DRvv-0@f~2n1SCv6H7$?Bw|-iMWvVBj;JF6dctPd02k%sw{qZGDUD!-*V?* zCE0ZjQv@=minfWrx#-p5>7m9ilx{D}DXYRQ4Dp15J-7R0dy!ZqTbLP`fS%w5dL!n* z`~nV1saA28myVJ$`rViKLpE8oPY!zC?m5H8*?}`fW~RmdR+cSVvlBRSt2j7>as%@a72Z4?xkJ6x<{8Z~4*UTin&6Spto zRIas`;1qJ^7Yb1WdC(2wzfgB4?ztlIvz~ZNrkKZ=%bHJ8kGXg zFZzElH1dhPOep-ZMo5T5RJ?eq8T?d>EaB$|3Ljs7%T%X&c(I_|^4S)cG{RAckuGb-HC@zpo>vU15 z9R=>A^WOCmToeuzTU-)*OD72n4*(8Q50M508e}5~9SxBVk&Ofg79MjO3LO=i4+I7V z00#pJHzNvm5361UtOE)QClCXY1`lfhtO7G5W2^ue1OyQn$^ZihBX!K68X6V^7y!!= q9U~bY90MF42nYfb76+fYCmR6+5IiUX9RnI3yk%JP7fgr<0RTH%oPzBD literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/folder_sticky_new.gif b/upload/templates/default/images/folder_sticky_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..dd2e366543610022fdbdee5f5f63d2b4a30f39d8 GIT binary patch literal 325 zcmV-L0lNN2Nk%w1VG{rn0K^{vA#9KP=h3jp(g#+3{k3h7oRp!8V*b;nL4~LO$B>M* z%KxZRX`sCP+`R4c_hgKi+2-wZnWTDxbH=one5kzZ%&GeP{r>Rc#F=Ey;OXb^_5AJJ zPIG(N+ty)%i2wipA^8LW0018VEC2ui022Tb000HT;3s~THi`m*D9$M=1HiNpg9rjO zSf>Vb8yx_kxEMEx%qfG|I5z=7z$uWqKDU6D6VpBf*H5*f1q=pc3PqtXohXq;!!zK> z8;D3`*8|840|j??NiF~t2NeSo2aS#%U?U0ujsuR4698@&6aW(mpr4=#1pqfA3=g9T z5_O;j3=k&@9t5_wTm!crGb0EXx3?Gz!4e9R5(~;05)uZ=&=?3K8g&L-YzP3u$_5N4 X76J?cJSYep2CcGTSK<_IA0YrcrtyMh literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/hr200_ltr_gradient.jpg b/upload/templates/default/images/hr200_ltr_gradient.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0cc7e7a4cdc4c689c766454f2ca57ecb397c1cce GIT binary patch literal 761 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrMU_b4?usLlYAdd38%$3nLpnV-q8g zA&i`yoIKn-61=<;Mv5|uMkIs(2N(o7fL=Pm%&5e`B*@4t$oT&VgFMimtc+m500oRp z%q*;I>>Qk2+&~3e1sIqZnVFebm|0m_Sb(Z)f$|J2f~-P{hK_8)fr;!&g(60c6BlwQ zJ8e8D8g%i4ig8j=6DOCLxP+vXs+zinrk07RnYo3fm9vYho4bdnS8zyZSa?KaR5CEI z(lau%ic3n%$}1|Xnp;}i+B-VCCQY6)b=ve9GiNPYykzOJeA&aSFc^aar4&0M~|O8efIpt%U2&ieg5+G+xH(oe}VkP$iNKo7LbH^ z49#DHKz}i@urRZ*gZ#zFR1U<+=k`+o literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/hr400_ltr_gradient.jpg b/upload/templates/default/images/hr400_ltr_gradient.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e1908abc5b0fa5801bf8af46745c61032ab6139 GIT binary patch literal 815 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrMU_b4?usLlYAdd38%$3nLpnV-q8g zA&i`yoIKn-61=<;Mv5|uMkIs(2N(o7fF7H`%&5e`B*@4t$oT&VgFMimtc+m500oRp z%q*;I>>Qk2+&~3e1sIqZnVFebm|0m_Sb(Z)f$|J2f~-P{hK_8)fr;!&g(60c6BlwQ zJ8e8D8g%i4ig8j=6DOCLxP+vXs+zinrk07RnYo3fm9vYho4bdnS8zyZSa?KaR5CEI z(lau%ic3n%$}1|Xnp;}i+B-VCCQY6)b=ve9GiNPYykzOJeA&aSFc^aar4&0M~|O8efIpt%U2&ieg5+G+xH(oe}VkP$iNKo7LbH^ z49#DHKz}i@urRZ*gZ#zFR1U<$JbcZI-LZ$jDHSulDx#<>lq^@$oTs znKWW}rn9==-{9Qb+}POI|NsBe($cuNxVzQi`uh6){rw1Hj{sea5HUO&w1U6WV!YA^8LW000jFEC2ui01^NR000Cu@X1MmwY1j2aef}i9hY>S prl6{Td6vLo%uEZuHh>VkVpl&vVnB5KCPzS{z+4FM?L z_3`oX`T6;Wsk!|8{6cn+hpxj^gq-{Q{n_5(IDw@+gQxcS`>MUi?(_A0pRgief8yuq zKZU5O!p`C2<>KV!A^8LV00000EC2ui01N;P000G8;9*c?NgASXtn4ZnmDILUMXj9{ z1QE89u16yh05}}L<1xcyFh~yPU>7JT6r`(S3fL^Z*>52;K$sDvGxLE+xG9xHdvci& V?w^VQ;<@|p5GVp1CM75#06VFzZ@vHk literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_mini_groups.gif b/upload/templates/default/images/icon_mini_groups.gif new file mode 100644 index 0000000000000000000000000000000000000000..be5c2018ce4a0f34b55598fe302f70c67a5b219a GIT binary patch literal 222 zcmV<403rWJNk%w1VGIBb0K@gwwI{QWqA zrT_o`077H;_xI)HFMeA_V)Pr`2PO> z`T6FVO-<>BMyA^8LV00000EC2ui01N;P000GB;9@CcNm>geENsgP(37}s@+h>s zku0+?Kt>=y+606_21i2*3FVt6@7?C=IBSLC>h1XW_>#KLhpxl>{QWFqefIhLV~d~S9}$U?v&LJTdzLPFvI9EkxVp|KE1638I|uoM^H06_o|000Mo!9j93 j80Gf?fe3UOfDQ{54SX3L3KScBjC>R*6FMd*2_XPGY?5tE literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_mini_members.gif b/upload/templates/default/images/icon_mini_members.gif new file mode 100644 index 0000000000000000000000000000000000000000..a79a5a74b27ae629430d8533b979b15b7f2777fe GIT binary patch literal 223 zcmV<503iQINk%w1VGIBb0K@gxOa z{WyW8|Ns90LSy&$_W%F@{{H?vgQw-?<&L+^=jZ3>=;-F==KTEpinYr2`TPC-{psoH z;^gH&g{bH0>h|{bA^8LV00000EC2ui01N;P000GCAcHMrNn*?-Fl@^TQ>3`A5-se* zG&~QHE(k=Uxm-xY$EC+BkO)vh!QuEA3?%BqzyttDhQq-N2$%AmOf1 ZC>Bm+g5cmS5`hv36AS_!CM75#06WiqcFzC+ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_mini_message.gif b/upload/templates/default/images/icon_mini_message.gif new file mode 100644 index 0000000000000000000000000000000000000000..57071d6e8f821869f95c6201d4a8057840e9f380 GIT binary patch literal 232 zcmVE7Png@uKztgM}# zopW<@yu7^l`1rN8weIfj+1c6V=H}$&FVO-s;vB)1 zVXTrk3jvO_iUo`qCuhi75eZZa{#l4gvUpsA^+`~3X&`TNDXzkt8t zOq00e^7s=J7NMM+A^8LV00000EC2ui01N;P000GPAR`!LNeUtgMbV`&seug-U_BAW zU?g*Sj|KwpV)P=7gfc7cN^0ur>i_@$?(Xj8<>idF%huoHw#Loz^78rl z`Stbn%Gch9rnUV1{F<`9lDf`^uEYEM{UKU+IDw@-gQxcS`{U>7=F)61=_>A^8LV00000EC2ui01N;P000GD;9yW>Ng5(Ftn3OImDH|DBURKq zFjF&-Ge+RyZ~%)AVMD+tMzN@p4gr8Ba7lO*qy!=m$Pms10qHym2;T1xrScIx a5TE>~;HelQ9eV|XgAphYI3_0pApko(NpD;L literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_mini_search.gif b/upload/templates/default/images/icon_mini_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..1295e9f1db2d0d3513e8d4e6810f589bd40d3834 GIT binary patch literal 237 zcmVis!^r437J=l1`vlq4#M9sO|5%o__WJz#{Qbw==J@#dC}xF&rMBnk>3^%jW2MH@@BebN)pnt` za-X&9@A2~X`JCMSA^8LV00000EC2ui01N;P000GQAOZ+vNdh8@tZXVo-X%~%10fM9 z3I!27h6qBJ$OJyVOD88lBp?oBfYX_fB8ipnv#~5llOisI0d&5CMdMKjXa)q0y-c9WQGGv@C8;^ZC*b`lLJByMm!>kLWh#VNP7vyNjWF0EZ QkPtn~6f`r(je)@$0E;X^jsO4v literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_minipost.gif b/upload/templates/default/images/icon_minipost.gif new file mode 100644 index 0000000000000000000000000000000000000000..d172abb0605bc5fbfa7bf18b48d24d45d327535a GIT binary patch literal 122 zcmZ?wbhEHb!Kyi>XDp35% z!pH#Bssj=RnZdxKZlLP0a*t3;?#DaMPZ?bznI13TWA9@0P~4uJc&DkFvHijG#a$jk Hj11NQ?`AEC literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_minipost_new.gif b/upload/templates/default/images/icon_minipost_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ec44a17871a827ead40201b929e46622d58586b GIT binary patch literal 122 zcmZ?wbhEHbAo-gk5 J5MpGo1^|-ADbxS} literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_minus_1.gif b/upload/templates/default/images/icon_minus_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9fcfcf54ba7ddb02e2222a792b59e37ebcb3c70 GIT binary patch literal 187 zcmV;s07U;sNk%w1VF>^U0K^^u;_dnO{Qvy^|A3LkjhoB6#p$iN;eLh%1|)$fCo$I{*M z+U52P3=IGO{{R30A^8LW0015UEC2ui00{sI000FzpjRowF+h=M6jZix2?4P#2Vff1 pzPF=EnT}96L0mSEN`KMW}TWMO1rU}w-_00NL&24?9B hA?Y;=UJsVVm>D^o_`xuZ)5(oBt-#=%k_;z>(H^S z=dSI#cz6G`M`zBQIdJ~kxhvPtT)%tu`i*OM?%la_=hlPA_g{Z}^5n_mx1ZjB`1tMT z?;k&Y{Qv)-fn1>YpWDwhB-q(8z|~04fSD0!j^aOAr_#)v5{2^2k_-iRPd5eM{Ibkc z1^3j%A_ZeT0|v#PER0+XYz#UeOF`klz&6dHnbAQeWUvMRf*YHz literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_newest_reply.gif b/upload/templates/default/images/icon_newest_reply.gif new file mode 100644 index 0000000000000000000000000000000000000000..eca28618360dcfc0e9e57c74509a88c19c10aac1 GIT binary patch literal 133 zcmZ?wbhEHb6k_0H*v!cQ1pm&=y1lae_sQx1&(8jSbn=%&6W;Fb{CRxp|Ns9%(x^c3 zCkrD3P^%6|7-R+mi;=-e&&I7=!VVSs$(`VxUNSdr!K#MJX$KVe-MROfHHg&wZEa{u U)Yy=z*3g^~`6s1dEeC@&0K?ZXNB{r; literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_plus_1.gif b/upload/templates/default/images/icon_plus_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f7abae62695bdfedd4dc05183814a92b2fe057a GIT binary patch literal 191 zcmV;w06_moNk%w1VF>^U0K^{vikZrRlE(f1{@Ug9fRM$2k;Z{{^s!d{r&!nn#zKb#)Ff` z{{H_A3=IGO|NsC0A^8LW0018VEC2ui00{sI000F%;0I_LLuOxwcpg_#inOs@$3@pN tyPb7CnoX_a=yU{$O@(9WVK9LW1=qnGAc4%_C%`}&647L0C=gH~06R6EW=;SA literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_plus_2.gif b/upload/templates/default/images/icon_plus_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3d6bda025da89d259044826b346510232cdfd12 GIT binary patch literal 89 zcmZ?wbhEHbN`|Ns9CV4(Pug^_`Ql|cu@1F2P-`lrufByXWjvYJRym`ZyHia+sY%Cj-5Vd)v);6&)+fA zwj4crls%y@bKZ_s8#cSNugsae{QLLs7p~qoee0Ykn37d8w=-qnq+?8vy zcc1?7^~dRpSMnF_dGX@Kr%#{WzkmPl-@l(fe}4P+jX!M?Lu}9g|Nj{V4k-R)VPs$k zXV3vT0Td?;>>C=w!$VtI+d`Yd1+2Zp`uf9!oi&@yCg_FOPVi`voS+_}GC?hrb3&Ly zh)LiYW~HTlYXY@H%$b;&gFHjI`S`Xo%ZJzp1#t!Y>|qu<$|a@c8yw8*^k#{_<5?<_#jI4q!rc!UX1DsBDv-!<=VBwU( o#x2V^S488&A@&|#1pjz=2YnH01u91bd8TsXOjiIKq?0A7Fd&j0`b literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/icon_reported.gif b/upload/templates/default/images/icon_reported.gif new file mode 100644 index 0000000000000000000000000000000000000000..d32e26b3bdafb99f1b713b59bf5b4c0876cebe21 GIT binary patch literal 595 zcmZ?wbhEHbP-`lrufByXWjvYJRym`ZyHtENYAN=W) z-@SXspEmjB%a>oje*OFR?~Mwjdp#}}uHIO5)X%YPc}5&>U4VYK{{Aqf_oU( zgm8&q*`PJdLQDJB1PKN!GchrTh=%d-^KWPN4fYEO;S819!|ZsJQ&r0(G?XvEBTO$u z@)Dn1urotIK%iL|M<~OC06TA=z(8(x@uv)y@3`gdb=VmhS>0L`rQUEmGCTfwc|`k2JV5Da60H(WrcJ;p8SJMh0sDl9&5M literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/index.html b/upload/templates/default/images/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/upload/templates/default/images/lang_english/icon_edit.gif b/upload/templates/default/images/lang_english/icon_edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb70004b9328ff534fbbc3bc3ae7f6b144697c8a GIT binary patch literal 798 zcmV+(1L6EfNk%w1VLJd40M$PLxVX65+SFMR= z<^TWx;o;%<`1n_sxBy*@?d|O`agx%~(#_%O|Nis;{p6^-#rF2~GBGgm@$m)*25XqE z3s7>##I64Q>UN{Khq1k2^z`%}A09V-pzP|+?(ExQVP60L`>U+104hM%+umb~ zpa1{=A^8LW002J#EC2ui06PE@000L6z@Kn9)DVxzq;knrY6>}wX4=Kf?!TwOG(JGZYkSDmn%TBz=mDjE#gDQs?0XsX8k0B|E1TTvutgQ_VA!Vw4ej0kF{Qw_CpE}5nvi0^00$RhG#p^VMuH6T;yvJC0YZk486ZH=_dpSX94G*)^x(q4 zHVp?LtZL=JL4p(Fg9ZpWOnh7lLB<9SCoC}N@qt4G7AJfJh+tSj z3l0Kg^san)MYIGA0tApCVFwhKy%azYV88$X>TxL`Ll19NCf|JW#dlVG1@;yI01tc+ zf>I$RK$?8?2_OLg%t25)lt^*~$iRrajcB5YC7$J=06ySRn=S(60>F#_h_V9$JJ6`( cjy(40fSTl2n(tl$4aUnpyVt_S4kV z|NP%c&fukc#(>&zq`}lNrt53?eeIYfW4%Iz0K8` zf?`5EGR2=a{r&tRccJ9Vr`Nxe&f)9-{_pnr`_Q<1sfsw)*x9SEvF-Ht?&8Js^YhKk z%>V!YA^8LW002J#EC2ui06PE@000L6z@KnPEE41ej4&w#2tOhOFnQu4JQLE4-*4D z05@PW<3k3IZZbF|a1rW70R}E6P^ct;MhFB5E;O)nF$M^X7kX&8h`fM+^@p2zaOfbASm10|t<= zP=Td^3Rwrpd|;-B4h#zxfGfbZz>5zBTwti60TzsmF&>ndAl1i&5F!k)oY3F`#+F(w z2!4>mU)HgIVDvBm0PTkiH`pe);ljrNS2i@nK+z$FMdh#>jiD#Q*;)r2eG0x3^G`uwPjgdh>eH;^^?-#{QUfFUTpwfj5~*|;Oz2&WrR$Eoia5tqO`sM zHvktE794S$9btp)^Y(92gS5N9%-784?eI4$NC4yjvaqtGtgx%CtK8h)D}JcV&(PVo z*#H0lA^8LW002J#EC2ui06PE@000L6z@KnPbh(Jgq;kn@DqSPW(WOv0uh^?G9v&kH7Z)xeV2hC=0h*K&0kMoI5+bUo zt*r~s3q5F!E;*?CIKEZ6P=yy2N2(4&Bwzr7 zMhhESII;h!EbM5@gM~X516o4p%en7g6Gj=h7?5~{niYv}Y81c$?+y+yHb}tRg9Cwu z1MqgxGE)n1`BfFH;Wq>;GH+}zwbca{WW zlgY`+d#=db>F~D9*wN9^iLAZ4!p2IDu&u_^`1ts}*W{hU*16K(6)@U4!waN4I z^Tox+Ay;wg>gr`>W&m7^X_BUmqpvJ(i2J5Ht7sidkg@}1mi(1A`1trcgQvxzUaE9% zkd>E}BMio{me}R!T!M{#h>SyPd&rU$Vk#2%wh(JtA^Xu2f5+`3A05(-H+rYP%-!Zb zmcy*6pziPR^!fZPex>5<@e^;J{QUe_q{(`nuC<(y|CAlxtquSG;m^|2|M-L6-rhn& zKmY&#A^8LW002J#EC2ui06PE@000L6z@KpV^ErIPpUfLL6T7Gb z!CJ{^#^Ob@7cVfp_z;bS3 zS`QqA-~$5~Vkm+O^-YFemS8&!5MpFKlxRQ?v>A{hZao0-KrPVqu)_j0(ioy-GVTDt zjywXe19!K9xFV25;x@nn5J>XC3KA~Rz?d05E60 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_english/icon_profile.gif b/upload/templates/default/images/lang_english/icon_profile.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bd32d2d73ada808dd312f62e035fdbf5997df93 GIT binary patch literal 801 zcmV++1K#{cNk%w1VLJd40M$PL+9~* zY)_K2{<={HX_{=6sWxnb)Z*v!^Yj1sgT}_h0bPqch^_pnK>7Lk*VosNr?gn6(9GWE z*?|T3wh+p;nETNa%+S(VhMT&jaBa5T$&N9Bd2w^4zV7t+{hc${qgB$FMXs!+qqo63 zdYR$u@`lFgq^z(;p2@n>-W+zKDSxY*zR-=1k3W{dv#_VIu(9Xu@p!)C|CAlsrWF7G z;s5{tA^8LW002J#EC2ui06PE@000L6z@Knf=qVJvp>oM=I-k&Ap(F80KAfm_%N3G3 zDUagQDRj^14243nSWs?;YOt=`@A$kvpBYjPE(9qIgoP?A00fGQjE#}6h9dU zi)|K#3?zsblA(_p4I3LW1Tqa5pscPJ2x=#b6L4;B1vvnqqP?jN00|2V5i%4B5w91? zAZv^lBq-7-JS7tekctqq1ShlJiW}TA6*CSA5HbnI!4Wz#5E1ei&Ws)f9Qg$gAlQo# z4G>gl(BQy@1vF|jkg;K417bC1P6hvzyLNM1PjTi#S0Ax6q$IjBg8I67cfo; zHX}m<8dd?!U=gfBhy+6ope0Jdz{UkPSp;ROh((MMFIqq#uwciCl?hy_>KCDb*9s1} zng~WCaay4*3}D2d(18O17=liyN1#Ov4I@T`kkMDefUT^GJq)lQBLKv~Ow2f7g2Ds? zkB4HIY@mUI0~HPc0I*pks}?kFfW9%{#)26G1OSj%jDiE4asjk(pw@tc0S__+-H8Ff zfe^bNWMD(@nN%mxIN002P^N1y?jVZ=gt2R29`1`q;( zfdCX_fB-TH7%+hV9CA25!33Fo^bv0cmRMqe0iai)i6$aAfdhS5C%}dr=3t|Z9p;$9 f132dBqmMWKC?pIaR3d~LdnBpkl1cXQLl6Kv6GT|O literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_english/icon_quote.gif b/upload/templates/default/images/lang_english/icon_quote.gif new file mode 100644 index 0000000000000000000000000000000000000000..3dec6756b3acf967de220d918b87c98fce9efe06 GIT binary patch literal 794 zcmV+#1LgcjNk%w1VLJd40M$PL25Fne$Hm;-+)|RV&*A5ej*3HZhyVZoi?hggcXj^# z>*3+yGjNaj`T1>>s16Pey}iBV<>mDB^oOLf|NZjn>gw?D@a^sG09}ksOiHArq(F(T z)6>&?ti;OE)wj2|3sQDSNPBOex3J09zQ@b_{QRN2$G6Pa?)3QK?D4C@&AQUw&D`X^ z*yT`slK=kq9CV=n|NJw4q|43D*w)Oky1v-h*yio41ejEx5=2pB&-2!}fX z6cmAge|-f7C61zvC8ee%4XF(sV<-nPmzkO&nSd`i1r4L3ryCurz^M`v9%P6KJPOLR z6d?+k2^zYI1g4Ht5)C&iH^b^2#)lOd%JIsXG#L@o2Lu}c03G5h z0LpdPP!0h<7$+p~1L2@T2YvunT(Dr_0y_+e5@hfpFCLZ(_(aIap#lI16(cZIkl?QZ z0RR(h3}8^90)rj`asW7?0)vbH2o)|=n9=S~i5VF(;3|-yfC4NQ8khorAm|1L3sOe7 z;4cCK7z-Ahz~G_61_uHLiylB#0m7#O8gwWqkRhrn7!xX3kb!jsfCUu> zfHnBGr-uj|1_&_dK*S6VZzDtqP}G!!3lYLD(1>G40(C5@KE(P`#6AoYA^_N6LWT<) z3kF~yp;Ls34JsCB-c06{s$mo>&WI*h-GT`qWL$kK0)zn)E?fvu;Q~Yt61Y8pm>|Fe z1BM=ihvtkS9Wd0$D=ZLzc;W@2^F=VQp;>?p8v+D4-+usx>1p^4@bv4FN#l;)^iG_~HjNI^Y5iH0G$| Yjy&?n!x%%1LC26p7CEFHKLh~)J0SC2;Q#;t literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_english/icon_search.gif b/upload/templates/default/images/lang_english/icon_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..8dd38a3666638bef04d12ee41bbe7166839e4c3e GIT binary patch literal 758 zcmVfAGio=;`JBF?9@9%M|No!A-{$S{&d$!Iw!ZxQ{Qs>n!^+q6|Nn@v#DuET*xu!n zxy@63lFs1j9CV=9*w`<8qQ%(a-|O+t*4w46v8IG$tgYOi;{NgT^L($!$VfTBC)2QCNX;IRPL60UUdWh>41ehcqn)KMF001wDTt zAR(ECjGc=nCKx*q5GJIgDq;|nJ%E`hDIuJmjG(r*7#bNArxX-1Vv0Hm9hf0{A|57s zG&F}VFMB#KwmLc{IwPbn+7P(|6D-!&zzT{K9tk-hu`eDddKv}>7!WTQ^AZp`^Dr|I z5@bA@Faw_fT^MA{Gr%H)LlVIdeK>JLfQJ=5R=iub07eTIHFQXjkO6~&kQ4^UIFMn2 z0R=8t1SC;nLj{u?P$(!-VZZ?Yh~^GWWZ<9yj{-=~*b-qt!T<_QVZeMa!JvhnGF%XN z0As_}3O5hLh+&|_gPuTzo?w8$$AVj+dQFf)62{6B1S-IQF+l^28UrvK$O}V5UY~+v zJSdyDLRvjT5#X?Os`3a4Ei_!!+}A0L1M(Cccpx~hUlkf8kQTex#@7g9Y+Ychtg^4$ zI(TTdfS1Jqm}VPTfayZ(%B?Ye^Coa$gJKyCVt|FMKnJf9k|ErtFwUC83%`>;v@##BY6{mjD1UDh62R-u=6OpXGto6Ic(NMPPvl7ARnX2v&d~0TKKb oi3R{fU}1$3R0zO^9Cqjv;fElG2%-%V3PHz-D5j{Q5J3O{JD$E+=>Px# literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_english/icon_www.gif b/upload/templates/default/images/lang_english/icon_www.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c1731f3a7d5334984ea471742c0ebc1decf1c61 GIT binary patch literal 733 zcmV<30wVoKNk%w1VLJd40M$PLxw*Oj|Nrvx^4#|Q+9=kt>{^I znE!4TTARF$waWdMGN!`M|G9a@#l`#k`~R{pjMnpGVqmbBai+DwYLcd&by_xVivP=( zbApk>`2T?V|MLI-d7`95 z>FgeHo6XqW09}mQI+>11?k5X9uh^{6ahgmV z3!8R4#=u||u9tgq$PVYYd`_?1=a}K4q1rg2Utt>o78wDDh>41ejE#sY4F^9M4FM2; zYhe%)A0rtS5{{ydG^G-!sHY8PD*<0Mfi@5{9|Ij76&ItUr8KFjE5X7qXNVXUCt(hV zAGZ`7j4F#NG%6Cls4)^T!oo2E;Nd03hddq@A%+1RA_^cB9?*&`2ign`67-QRD+~`S z`VO=Za8JO411}JS6EF@2A_X1{Ffed~MgtQm6i|4U$dn5Z0uJy%z<>t<7a~IPXi<{D zo)`yow9ui0009Iz5i~@kBcc!b0|7>ez^Ksx2W+VtxHt%-$AJqiK)6tP;NS%U45q@d zTHq#50zJqDkdVNDj|4Z^5v5>s#i?#B4!F?aLT=X=a_QE+o7aU44KKRdv>8FH1cGNJ zbO2$(1P>iEaCBS9fW!q6BsdgkLDDh^5-0@gAOYYriV}kd7lwgU!ipI_K2Xr10L6}P zD;6&7p`pMF4L!Odc%Yy}3E+Z>m*5>iaO%|px~)LKp#qK)xpjlfnUjEE!3ex}EkJ&7 zdGgL}761T)l0xmgww3?Cj&@f6WF-Q3*V+1c6j z*Scbyxk-zxhpD^t^z^mR-ukIp`M7v|e0=rBnfs$m^X%muZI-yh$Tc-J=hMIVk}me# z!|LACYLlq{h!k^{r=g*tX=!Qe|==q-;e+Mdi%2)ZOCi!<(SQ*6D*E z?|%~dg%by0jSOXxa-6YClC`hR+^xaO`@x7_{om{H-GnRp{QbPt-w|k(`0(k(%+UJe z&-wfO(BbOmq+?TroyX780AY~$`uppOEK+!i@%H&6VSv($MgRZ*A^8LW004ggEC2ui z08#)M000O7fPaF6e=-XQUK5IojE#gqea{2rpj}YiOdQq@|{(sHv)^ zbSh?E3z(W|hZ3u|xVfuoyuE4=A5&kMv`>BbCBmjkeEmT20D!xNP4GDlIz*+zUVm46XKtw}_ z7w~w{!C=A_En_f|z#9svFh&ASjNyUDW1tJ{LfqQ6Z5JG)>{j-4(2Q)Co6;_PF!5I4;Pz47Zl;K7H zFb5PM!iYu0Km!yulwe^7NI=m<3sG=3-VIPJf#Qh_l&Qgae2}tKdqV&~!4VmVfJPTJ z3}8Yz8&Kio7!|lNh7d5^;XngllpzHbW8`4R01Swrm1kMV9T3Atc`^_Kp9Pcw!W|qWU_l0Dc(4Kj z9#k-B23mok6&n^n2*ze?G%&-p;5C4u9;J3$>Hs>tQI<1w-p7jt8g!u&5nU7z!&L|f z;p7Ar6tG1f6DUvt0~uto#|kj?!NQ9cfQbSMXLwpf9S8fd#1CXdfN&87{O|<-3OsmQ zDhmc|@Wler3_(u_1i%-L5*@gU6-XJBnn42xFknFeIt<`I0TwXez|9T}fb*vj6v0CS zqY6!GsSjk_?E^j+aKO_~Qvk#QV&uRD1_D`d1ONdLp@b4d1kiy6vo&f$S0acu?90P8 z&}{=25G`r}44imF1fw3UvBpsM4fOyWC?LTfE^Kj}2{5mqI18^qw1W~WGz!*dp@BwT z++(7cHyJ4Gy|>?>_f3HT2nZs<8%$(iLfS+hFu)Njupqkzkymc{<(Q9|cbVSuu*Bz~ z2jBM!fe$0d2M93HfCxT;MzqtfufV9Gh m0mkFtAle`U5Re4{Kn$V~he*UC8u5ro6e0&)a0w0u0suRXh1WO$ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_english/post.gif b/upload/templates/default/images/lang_english/post.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b7cb20642ae861e5b1c66c4d6104e74a3cbfce7 GIT binary patch literal 1627 zcmV-h2Bi5%Nk%w1VNw7Y0Oo%H)^if2rKPyIxRjKXiHV8(rc;%uvi$t~;o;%x>gqFn zqcL@s=jZ3F$kyfMh^^y$75Mo0SC+NJ#KiOS^Z$qydaJ_Xz>;*GY)iP$kp5ZnK$&2dFX=!tor~Z*A-rn9tMMdDQeer-2*N#S?!qn!9FZ;4; z?67v(oMGg>mIq*s3}umXowE9c6YJj5{K1H>!OK{Rq)d{wU z`TCT*&mVN3W%!V-kvsjE#@)VVhKo* zGFk|2k-$a+AS6u5=<#5}C;>T=sNld7mqm;R3XG@`ZRa_V19i*^I#j5Lvl|`=!GX}! zfB_%>2n^sRN{xyTPSeC`(x%H6H_g;^u{5De6KG8)9B^}D0-P8lp46CN;>i;e1F^8E zQNU(U9XeWwF!7_nlL#A9Z?J$t0gp1JKJ-XH=5LKw$+G8;k(J20x6z#1}ifVZj49K2U)or5un10uERp0s;c$mIenZ{CB|r zFC7@+zyoGv(S;cxm{A}DbbtT?8e;_GKmsCsm_h`8I3Yp{8%Dr_6j2M??;!Wjkl zp+f=;)Qf-*cOc{pRBiAgiUk}55P%v*1d!}U3K#*V1Q;aH1RfGBkVOI;XiF#P}o5HR2XsP9>Dg^f6de5<)itk5#O4mdzF0$;2^bG;P| zfkGKPgzxH|+?KmbO- zfh-6C1S$-{2Nj?J5~x--s(FxV2neAFM~H+Hn$U!zOQ8x^$ifzij(HUbfdCA!032ja z6MrZJ38tWcAyCQyKn$V~he$*qzTk*ROrjE($iyZZVF+5_!2-m9!%VQ@1|(pM0=CG- ZE_(5cU<{)e$Jj*>-~b2{Bt#$p06Vak^bP<3 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_english/reply-locked.gif b/upload/templates/default/images/lang_english/reply-locked.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ab1d7a1b1b785fc5d639d23a05fbd3fd60e0878 GIT binary patch literal 1515 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 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/icon_ip.gif b/upload/templates/default/images/lang_russian/icon_ip.gif new file mode 100644 index 0000000000000000000000000000000000000000..3865d855d7431ece4018c8a650eed173544ffb72 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZk0K^{vFH;Wq>;GH+}zwbca{WW zlgY`+d#=db>F~D9*wN9^iLAZ4!p2IDu&u_^`1ts}*W{hU*16K(!J(K) z2%Ex#^@hvo2?h}WdVB)|aR3u|2mpk81Opx(2L>Dt2^)k31q&>koQ{qhn+Ops5Tpg7 YtOyGR1Rq=iw6(SdJ0dT;u^%A-JK3^;TmS$7 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/icon_pm.gif b/upload/templates/default/images/lang_russian/icon_pm.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec1b8f0a2f5abc9b5f2cba2a71b2e9888d3631f8 GIT binary patch literal 765 zcmVgwwM|Nrsv@%7?$)@U5%<>kl6 z$BeYe8dPx7($Z{ZWdL1_CTfOEk+S&s_yc5={G~msXdRTNvHX)U#i3rRbZ%ylq>`7J zU4o94BMiu@jx~p|$dVM;z__dB>+U*y zn*aa+A^8LW002J#EC2ui05$*;000L6z@KpV+c|c`X3wgoGe|e~F5Vi$fC&F&il=6atnM zHUu&S1qmvapaK{Q2Arm+sHvPW3ll#N3!EDr7qztrHaZfVI-j6~Dx|8z1v19RG7<}Q zy9EFpd(jm64hTC~;HHm5i9H}Huz2?^nT!x0#JTt|0Y;4;0YeHT$VtKq2N^P0sIefy zt`I(IMBsq|!wMhV{)MYC0f2=65HKJBpus_8Kmr3F=!<}2h6EWn0tDbdK!OGoO*sXq zfx<@u1LFdQ=;*`1vad%8s9mdooMXHv%^wQX>?A8Mnp^v?6N=?b#~C+QVuS zv{kwZf>abW04#{hKtT@%b#ZWzTBC)JcOqR(ut4C04;L^ZNUo8fwQI$7`ptmRqDBA+ z5I!(4F(APX2rXJbh_JPVX?%wxKv27Y0RR9H9zf8b<8|xBH^L<_!GXhy6(%-_7@#15 zjtwSO{AK`w!3q%ybR4$+x;lOH1M0LiKtM+W@(KjlKm!R7U|s_X44@zn3JyTveGt;8 vg8~{n@WTW%kk{aN<2C3S;Q%6pC}M{nmS|#wG*mbQBP_P);){w15d;7`Rw7JH literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/icon_profile.gif b/upload/templates/default/images/lang_russian/icon_profile.gif new file mode 100644 index 0000000000000000000000000000000000000000..385c35e212223bd2c336baa655e90f5845007e38 GIT binary patch literal 849 zcmV-X1Frl>Nk%w1VMqWH0M$PL1ZSBlTXO2^>aok&k-5yGa3_1M#!Qj3<>lq>(`-G6 ztp2)D09=d6$Hf2t|Nr=dyuH0SbdmV@`0()XXp*P5x3~24^!%tmccQq*+T_;Q*jT2} zOm>Nnth(8O1@W{H{QUgNwwU|T6WrtEx}|V!w%yH&GRV-={hc${qg7XjoYI&@?eq7d z!_Ach3sjaX=n#Jbr@!{(38*!T}fUC2zuCBnzc)sGEw!+7pBd)Ba|Nr5Jfqegz z9RL6TA^8LW002J#EC2ui07w85000L6z@Knf_#_g#p>oM=I-k%e@$=w4L`kW3%Y~Xg zsZc`nDRj?hC}XX=Tu|=CDzL8G@A$la&tDH21~LvQ3x$R&I|v{SjE#O1c1T|0_QYwc#(sK z0uVI-+!zQT!vK9WBH+tl0KkO*3@*j>Bw!JMfr}R#C~FkK#RhE-Fu1^>0>MZ|05CXs zk&=P177T9QU}a&Vf(R27V3yo6Go_56Cj7h91#Ez00%c9fWdbLj>don2%r|hgYJO0 z1`85^FhKwqW*9&ZJ=oB000Q8Q!@>jx$c2Xi&i#M}_km z1U&NCzzGZrK+ZT85kSF-7tx3S1*s|NWQ-a#K*1&qU;se_5LBRL1vc2AWshKnnI(@~ bmTBghXr^f<4Ez1j$D44*DW@Ml1OWg$H}!K> literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/icon_quote.gif b/upload/templates/default/images/lang_russian/icon_quote.gif new file mode 100644 index 0000000000000000000000000000000000000000..633010d932dc31ca712ac4469b6edd6d647e4afc GIT binary patch literal 761 zcmV-__WN~bD6B=<>h#I zb@cS~>FMdbyu9u0?eX#P*Vfby4h}IfFgR|B07q(gqPI;=OwZxxkf^l({qm%wqSs?WoM(JlUatHu&}A1tgy?< zzW@LLA^8LW002J#EC2ui06qW`000L6z@KnPEEs`+1bFP*eyWjA*d@diR03gjR!~c9tekKJL5Cw*Zh>41ejE5aG04YBM0ERg} zd>Mg(CIkc>jiI3(q@^7OsHhubF$FJ|nVNkWodgD=xTdA4yr~N%V}}Yn0mUDE0elJ? zx3~o~hPtG^y$jaX4-XK*h7S_O;KdmM5Eco|1um5rE+H2zr0f?X^dklUE-Wn~2lW*T z0$8vZLF0jggB-XSx?urFIB*gmFhIwmLWdA6LSXD5!o>g(AyDi%V8F(K4J>wCIFMpT zhzA=E2uM-kAOi*o2O#Po!-56>PXrX)2!Q2*7E%>2vN(XTBMS-!7L52uV}w2z6ArRK z;6OwReKQc;yeUIrfm04V+*qsO8^Z;>DjLAZl*I}Z2qi<-w`M$+$0=O0OG}r$4Eo9Ae%uB z%NRVkHh=LE0)-V5cBn|O0z-o46ed((tfDapYQAbaxSrsk zLGum}Odt{YW`eQqxlf0!c=~+B5MYeip!?c2+XjtwkWKKt7ax5HCWxR45O}bIBq<;O rg9j8==s^P*W~iZtCv@l*;fElGC?beGJU9d$D5j|5iepIfLl6KvuhCDi literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/icon_search.gif b/upload/templates/default/images/lang_russian/icon_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..4542d84ce85ebb83ddd5fcc4d8d27f019dd01ec9 GIT binary patch literal 694 zcmV;n0!jTxNk%w1VL1R20M$PLxw*LnW|(G3X|eMB%hu>tYqJ0U|GPi~`1$!ih^_VY z_2uQ|q2vAV@bI^}&;VSE>FMcHlCkaW?Z(E&!LAr!v6nyptRNg|NQ*?iL=OesKD3W=>M%T^#A{nx67Wn-MZ1-gsRhB zhSB2c@Ta!EFn*++!PTn4%prH7o^@pZ_twzT)U2)C!pPpGt+BSn%zduL^7HeXq|}VD z)&KwiA^8LW002J#EC2ui0672>000L6z@KnPEE3YFDFHtZDTf3;APgWN zSr!E&ik*lfprIoOq$FVoh9i><8z2@aC?bTOilU*UxVQ=zVTe2)t*&`78MJz~4Wqfb z3e5^UJT|?DH6AUNC>ACjIC%-*-v$a10Rb=?BM}LtF*^t`Gv*`&0X!xFAr1Ns(hr9p zCun5wz`_R$Zh8VlSdrqv2p9omXdt)Z+q(ceI4IN+0)vJCE?`t}A)%y%eue-Zpy9v; zftMyk;Ty3c06iH9p3T_tja-1!5)mqxl<*M-3=-Xk4gbOY$+p!55bBDH=psC zQ6fPANH9V~fKf83#&|1|E?CRdpVJcu1l*XqtQkH9S9w6>F!6y77!NQ&NDv~%PYyd$ zaCmS5;)=Cw!-S#`w}S#^&YwUGxh;>& zFQ7Wp3T>b7vT7kGwE?-f@#AYR00=_@LW9gad^Z>>0YY`9*pX}Beqlm}2S4xum@r{H cfb;0nt6$H)z55&)90{32zrOwYLV^GQJEufJZ~y=R literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/icon_www.gif b/upload/templates/default/images/lang_russian/icon_www.gif new file mode 100644 index 0000000000000000000000000000000000000000..a684496c51ae74953318e82d0cf85e281d7261f7 GIT binary patch literal 715 zcmV;+0yO+9?B@$tF2xoOM$khI9l`u|sOmI-K>|85rl|Ns4$ zGUn#y|G9aw$kh4y`Tw#njMno2U5vxS!(v=ru$OV){Qi2Y#a5ZTk*T=V+T3Z9rk-_L z2T5yCtoi@TmojmX{QUeqhp)Nz|A6}ca(|2R|NecVx2_%pASX@#f)tm((i9LW9dw{p zfTZH<@oKH;&e7BM_V(iF>$=n5+2iT_|NsBH3HwF{sI0GqkghqU|4J`K|I0o_UyknS z)c^nhA^8LW002J#EC2ui06PE@000L6z@KnP{JA!hqH@V>I+=41YE(8ZZ5d;Ygd}?6~ zASD$W6d;SAiy)$-AP%Mu1ZEBiUp9U>3^kesA`>{EproUxr!l@U8D@nV6e(c}g(b8Q zIi9$Lx}vgi;78*i)2%th_ zfD0@F0GJ6NTZBRh2Xtsy0Yk*-i33RJasYzG1$`nfe28H|W5*CGB4o(eU|&cKGyyEI zS;)bQ0XkkJC}1LD3kX4{`D%HxXCMZM@06Vy=FC_o~ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/index.html b/upload/templates/default/images/lang_russian/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/upload/templates/default/images/lang_russian/msg_newpost.gif b/upload/templates/default/images/lang_russian/msg_newpost.gif new file mode 100644 index 0000000000000000000000000000000000000000..92007e6ca70e4690add07798be2a19651b054bb4 GIT binary patch literal 1908 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 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/lang_russian/reply.gif b/upload/templates/default/images/lang_russian/reply.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbc94626d1fcba4cae421c4f92b7ff06a2a32aa7 GIT binary patch literal 1554 zcmV+t2JQJrNk%w1VN3uS0Oo%Hh=_*e<>f(kkN`|`*W~K@`ughX>chjs=jZ3_?CiMA z)|IHSd3ko>;o+^l#UXj6@9*z~v&%<`t2u+H_xJZ=ow|Cf#LdgPJ3Be>@bK8!*r>_c z^78Vv#m)8g^#EOrS65err@4})uFlTRb(pDZp}Z1ll}SlQ^z`)6+~VBa+-z)SFE20D z)YO}so8;u=#o6N}beuDNqubibyS%-utgO+|(OZ|bsHd0Y?egQ{%xsgVk&%&tf_*i3 znRcYSRf?nlVUn)G%iiAJxzypb&)u}NvovUdl)KMCi?PGf+3E1}ft;(%-{`~5)8p#x zp`oD+Ws&gq`GT;>oWazXzR`iM#$b)4{{H=9VO{`cnceB|=H=jyu)zRSeh_b+|NsB~ z{{H>_{rvp=`TP9#`TP3({mI!6>Olah?V)!-3u zpa1{;n3$HEv%jyeq4V?e)7su0ZI)kvkcYL+*xumA%FN&1$p8QUA^8LW004ggEC2ui z089WG000O7fPaF6e?=uSF&~PHjE#5F~*JDIPAs z6!5^|Ko%A&3IrT=4xKc1?GPfQK$0Y%G-e3MP%{bz1_%WxfHC0W+X)_G$PG*fQslvs zKudZsAYnrU3#44|pwI)E3NT?foH#K8V5*Kh4f=c+6sU)5Tb&FA}ui((7@qN z9~S`sz+k~Z2ZTmZQiu?FMzE(ly(3A&C^?t{SQIesDCWR8Lk0&j^5hr=g$Ecq0C>=7 zkkbH$7a;nK;k8GO7A+5&P&s{i59=gL3T!Zq8U|}EMYJUOS|P~;)>D#b;o!J<1_(}~ zM7bBLz=;L{0^Dgp11^{mAh>`yKtap~EdmHA_+o+pkq<`{M9?xN0-7lVo z13Em>GT}}I@Cw{8023()cN_!=BA9>;ii~0e17Pp~1q~xKkO2o^)W8527-*0I88@Io zfIC%u5JCaq6|kNRzrnCx1#)=7L|91-pqOs|fd|199|!?K5y=HNzokt z2sVImKn*-(HX#@Qz%c^`78a1i2eHYfMFv?g65_d3`gcpu!5rh{Z z3IKr>K?spRjY8ZIL>C4Gia;M9#IOY~4?=Yp1S8Y{1sE&X(FO<&Krp5j7EqAG1YRf+ zrT`wSSHu$!44{M-c|4K96jNmICW2ZFphp7WC4i?81_)<>1!yo4r~%ZOa8@)>*u;Pl z4a_0R94B1x#tIga1cVn4#5f}gK?uOX6li!6#DE!u;6)4%l=vv$67T2kcGin0APn7ENCz{ z)CuODz}{8&tu^4Fcdfz!J_sYo9y0KeKnB37pn(Q09MBC2Mq8c$-g$F=wdY%h?mO3` zUr_=k7R1m;1A+$7fa|cgV8a0#1VFX!S@TZw@7QzQfDJV4PysBMSP{i<4hPtvfeJ&U z@4E9Nw4g!*@W&5-`t;YY!u|N?umAq~!~Q%CBJe>4#1@MjSRf5P*Z~Pbuz&_GKm-tk zpaUm3!3bLLf*8!821&33AmkwiNQea{%us|Mm_-ICOrZ)_$if!7@P#hCK?UFwi$DMX EJEP&phX4Qo literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/loading.gif b/upload/templates/default/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e846e1d6c58796558015ffee1fdec546bc207ee8 GIT binary patch literal 771 zcmZ?wbhEHb6krfw*v!MQYQ=(yeQk4RPu{+D?cCXuwr^cCp}%d_ius2R?!0jBXnAQ) zOH<|l|Nj|aK=D7fpKD04vtxj(k)8oFBT!uNCkrbB0}q1^NDatX1{VJbCr|b)oWWMT zS%hVC ~NwO_yO%;SvZ5MdNYf|QNy-I*%yJaj+uTdt+qbZ z4E`Fzb8m}I&!N8OKmWEcCmrLs^Hs&3i)mt@hQVdcqghkaBs*D}tG_lKew4?rTjzIZ z9tSone1TS+TR7tu^CunG)Y7Jg#sw#)sG9C!c0I%LEzP)9;hqRf&)s$D8d5Db{TBs% zgl0~5QQ91luq4Q9tJgt4QLbaxZvAaKeCM9!oy85dg4k>TdBSVqjHub_PG=PO&J-rx z7oYTuF+kH|tG-UK+EkUhDjYx?zW?T|lx>+aOQm zzL$v$zBLo4Cj=G&tw{H}dW?tlTkS)SY4<#NS92z*EY-MMB6Ftp`R=*=*Ev7cS+X%W zMCur^FdlokL}1Y+&aasU2J4#EOuNlnb9CmqgLCGTSY!1BD42pkHY^XidQ5=>YQx%` z*%Pm9D!CkBu&tMWm(%-ejACVWGS2RX5=QOJ$1*tr7F}F+*-OA+Ly&Isg|AEuUYicA z#%IG6kPXkHt{zk2M6zK@Vu^4Q(1zE$?yY6M!^&jQ+2^E?!p7{g*|X6}vuRC3p@jk0 W117c83?+LXEZI4G$p&LV25SKE>nb+@ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/loading_1.gif b/upload/templates/default/images/loading_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e62d01af9e52f328d4bae7018d881773d914290 GIT binary patch literal 1877 zcma*oYfw{H9suy`z31lM+(&YWkp@KP5`rcnApt^&V%?kYe#in&%`v14+=VU>~!I#pEg&B$QT4YOLW%R#ynA&WON7xSAk$N^O zCzCzU+-|e7SyoFctBcnLCTu%kIc#NXUT2LBmd^ZU%i(z2t98v#^fSOG0z0UJ=LatU zp&cv>!~E#arr~rGe#baElO5$*z3ZP9UA<+QL*7bv`kBu;_GdT5#>Zt(M+>L8jo(QR zxtv#vV)%c0XmV7hp1()lPPiz?6sBmRMr8C>u#Z!8JIG&2!qd%a9DlxB(LSak5tV|(@` z96!g*buMPY4u9KA9x>zE(izi-(g675Z+_xF{<64kI1J>&)lvi{>_n2uRq6l?AP1_t z^Lcco{^T3oU1tsFQYunHQaXc_kEj3zq~jSYnYb_OW@+evEC2O;Xe z8noF!zmXUhnn*et4qtj{baDj zb1k9a=cT~P9cjzfXgbV4>GRa}#GLe;){mcx2?^*40)DRw0Gv|XwGp|jB#x(2_TsCt zuzM~>%bPlDzQ`^`?!H|+A)g9I#&bC?YUj-tZe16NBQ*)PY>18-@S7J)u0(nOV*1oq z0)%wiQMa@f!%$0sO+#T-7^P4QsWBYNw>BQ*V`P)YpZT`9nJ3$mJ0@IhH<&1OMw zYG9@61S?-w`s6>Dk}E_Bk}V7DZ_5|{l4Gfl=4G9^Z0(eEEj-E94p?vMm;78w_n{dS zZ0O#*k>0e>7b_Fo`_-3r2}STLF*FN8I{AG1D8$8qZa`765PLC>z!FZW`5BgExKR<> zvKbl0l(E=k70@NJhpTPJ4F5vcXYf);)f8YA5NRHq}7R znm=?#`B2sTtp{NdzOf7QABOwxZCzWD^F`R*#kn0UAaPzSu^+)`93?3tQ3)_1?1gzk zo08;fP;@Ud5hp{C_RyNP;H%lxG*(=eJtP)#nU;#*_*N?x=yn`_tCflwscf ziOAu;FLp`x5q*xqYyXH4)z4FEBZQ{BEyHDP2pL4W#$%W59|8F{ZAt9&W z@BjZF|NnpS{^!jnpR2l8t>1I8pn37bS6@5l9^P~6e#4BFr$7HMnXv!H-~Y2V-VRJE ztDUrC*S&Wo(-z+T|G%tr&87p_^6O?a%{-D)-`2Bi-{EujV+zaHUwOQ2+sWeo{R|WX z#h)yU3=EnKIv|rkeqvxVIpEwG#NZgf5~Mnb(PBQ&dC%fP8%A!P<0>AVD(4$gw|LIv Y}VR Ix-wV;07#=c7ytkO literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/msg_inbox.gif b/upload/templates/default/images/msg_inbox.gif new file mode 100644 index 0000000000000000000000000000000000000000..011d0bd36021c332639bb170d2f59a9c51abdf58 GIT binary patch literal 684 zcmV;d0#p4*Nk%w1VH^M%0M$PL|NsBh)zubimB`%Y;o;#Xa+&-4``q2##>U3gtE)vtMY7A-Vw$!(fuwtTdyD%gaoHopze6khsmE zp`m=N#9E7^z186ZUyXpS#`pO7`uzQwzR~^u{?O3Swb0(Cv9`Uy!LYcz;q3A+c%6%( ztpET2A^8LW002J#EC2ui02}}r000L6z@Kn9;5%bLx$QK14JR!WVt+&ueeY+#oJYbJOs4|4z-8c`HIac3qiCK(_ZCJ1IU5*tt@ z19A%>1^_lT9gYMxSqTCSL=+!$9uQ{;5g-wro*FVlm~svv7kmH=CL$RK7@r3MLk$9D zXAmbd9VZqCSvJEC7zPVH141|wXg0eG0T>eq5FMl-4-+#p3nVN;H6))l7#J-cHtEs? z#TJM-aKV9t1r^x*U{N8P0Rs+15a4iO!T|>9Y^2C=V8H|j98i#;N8;VP5GHJRXu&`M zfr>UlMCdqS0)Z8UevFV{(7^=B5ejS|2yr4BOAH-69H4k1z>9f5l+~Po5??+H7ZikO zVIV?_2OJh~NKv4hkP;&nT!7#xLx*V(HsD6pIYLCeVudRT(;=Ei}= zrca};teSxeg;6y0&=CN)aRQSOSSWF)%?~jv5ZIoGJb>#J0)RUoKtjL^9~Qz}@bRL6 S7w1rT$UvfmiPHJQ7HXB+*~-Y==451H|Ns9ca+$QWw4$P-)#U5Q$GP|S_r$}(?eX(SimRi=);2aZ zy1KdM=H`U4$XJxJvdq~!fu#HU`-iEzOoE-_;@+;Uq>#AHe5}M;i=%;neZAG;tgf%6 zrJDZ!{sUi)fUd^&`TP3({r&y@nZD7GkdTm%hR@H>;q3A+c%5%=ZHu9-u(-U|*Vnkf z#Q*>QA^8LW002J#EC2ui02}}r000L6z@Kn9#CbBW%6Y)~3GaakQ3B4z}J z3ocnQ86Hp}4ret15F!=;7Y`dcm01)F07M!enpprF7%>(Q0~4wO0W(=M2QWmSX8|=9 z1ax*Y7y=JHGcGO#3_}qM|f;G)I^4mTEH006;+ zjuHW5xyO7B!lkgwU+Pg9QUHEI`mG-l>r@)@8wPgT(|04@_Jj zfD~Mcf3L!vZ|A z4bhN6?t%#_8c43tLdCBJHg0rSpdf{@V;~$(&>=vF4HFe4H%LvOz=EnTFg(!^p~r#+ z1#U>Fp+bia0xdW+n6RJ+ha8@uytz@JKo0}ZpDVZ^fx~kSBpO9Iki&<8=B{sxFQ7m| x2m~(L{1AiS0`u_(6mUSmK)ZSe^i%ARP+h`~6cKo#9uzphfP@lE*cC+(06XKGHKhOm literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/msg_savebox.gif b/upload/templates/default/images/msg_savebox.gif new file mode 100644 index 0000000000000000000000000000000000000000..86d1f2cb83f296a5fc7b9f773076a956c4dd4a8d GIT binary patch literal 623 zcmV-#0+9VjNk%w1VH^M%0M$PLPmizb>+9Is+i#=2vbDF#c`5(@|7x1Dg_Q_4V~8a+%nJF8TTS$jHd)(Yn>->+Q69=H}+`@bK*O_QQuuqs7+vl`_3@CWNub zvdh@y&bjc`yE}rV{QUffsk-v*=JLanSBaw3ooA4^&H3~0e5}O1)#38as`28}?T#

    Q?DFW6JGIc>@!G_Tp{(!9rQMQ8FL<5%_VLov z(*OVeA^8LW002J#EC2ui02}}r000L6z@Kn9tZhE7r0au{5TDSWWRO6m9)|2IwEf*JA z5(ySW7yxG)prN9mJy{?FFGP-?1#>D6ursnV0trJF31wyl2xv1Z2oo6@AjKd7JPSfM zo>{U5EV9Kb4m&5qAP?FB2PQ%?2QkJV&>kf%Cl?wx4=foE4DkVgLM8*n+T<)F1qCG< z6Bs;jz#?8e3Ly@BJD?5T185I+z;aL_9yA6OGAcL_hywtF77OZNu`eS7XcYpe6hOk; z4_p~dUKC+tf{2tAP^zQ=p@A}tAs;vdh*>T|1P>k}bm)MR0tEpCYz^rYfWlB{EczjE zPyiIPstO>GV5EwJ0;?U6DmA*agHZ|!d=PN4iBkgsXPxTZt2ZtU9%P@q@qt%?;lqgi zk_Z%K01q046B`x)fxw3Yc-n|L0D&-K9}s99NWi$wj|HPi)CditpET2+k-6Q&kj6>gww4?d|OI_DG7W)z#Ib#ny79z47t!^~RTJpu5}L-RX=k z_V)IKvB>%P`B;>)vdh>yfu!}5G4i;5;EXtlqp|$_{QjOlOoE;Mm^1j5GLX2<*oWP>cC!~49V z(AZ%$%bLwKP{INpT0)YuJX@1}GBt2(f}Q&Z8EjA$JaK=1GZP(9Aqa9c4GWSB4Ra0$ z5=0drHFJ;;3!s%}H5M^Mjej*G8?6MDHL*1s2SXAEWrrgvDI%}2CMFO(2tqp(W;zDT z%q$o^yuJ-J9v%@ND?&7Qu?Cah4;w1cuO=K27J@4l!8HaC1o83&;=H{i0UQb?AKDq! zCJfLML9pOBdnW>TxS&CRAP^HcNc7+*zzKx;B1Ev^BHNE!7eb2E7=c588zOimJO@Dm zg9OEdga847BuSGG!iiX^pr;0Y0JVlxm;j-u(Fg$~g-dv$r-A|uT%1A$qJUEc7g!i@ zh9SU(0$>Z^001MCrUW*uKE*2X0)(&yDCFR=2+A8A8sO>;D;I^JC>D6+NV^xT1_l5^ v;A!(ii~t6B!)l;_Siph5j1gow;GzV8&j3oeNZ^Gr6dy5=C}9#aN)P}$tN0s! literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/progress_bar.gif b/upload/templates/default/images/progress_bar.gif new file mode 100644 index 0000000000000000000000000000000000000000..75cf61c59e0c3b736b47150d64e69193fb685639 GIT binary patch literal 12892 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 RIq~=D^XrU>oip&I{{w%u5=sC7 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/progress_bar_full.gif b/upload/templates/default/images/progress_bar_full.gif new file mode 100644 index 0000000000000000000000000000000000000000..624b0d1f05f1e98fc10b7fe04fb073da4fecdf7d GIT binary patch literal 1541 zcmZ?wbhEHblwcHK_|5VU*_-A~ z94DrQW{c_G-jaU(Sg!WGvNh8;#2suEmghTj!yw^!hq!az zgN6i#g_A_>ugO#vKRZ9qxm@nRm##^_x=U%?1EB5`} zodfmU@6Sp%=07?(k>5P-kHzOF=cilGzqiM#&wX_4C`q`|JDn+yDRnn{~zghA*5E3XMNyS0ps?{7O$~W>9*u zphZy6Vqxo(*lP!>cyl`9+GVOLNTs9W{Wj72>WsLy%(R&qlU6>PkyEyF+3egd&gXNAu2nvpUA9c}`P}MPp6c`K%}z2*RTH$zn9{0L zr7@+`Xx9qHUZ-CfOQ!f`tz0-mYu3uev%PL*E}b8@>g9?#lU}V{xnPl2*2*>WZe^`n z@Aqg{BGc+!S=wv1U+a3kZr3-dSL;_XNw40pQ|R>Sjr-VE>n!G!nR0-M!)50IrVzhq z-L03BxR-9d8TUGO`-8mIYZ>o!{a(BC;Uw$4ov-HI&fE3o*zR|G-kplp-}~WF_q%=X zKV|3dd#<#>VY9sE0*5Vs)&8vC|4Zx6heLe#wG9u57~5<-D(XJR@Q954n~z60B;JIE zvrW(WbW&sanop;6w!isw+Tgg(=QAePb3UK7c>G4#Ls|8~=kpHix?e81i06K}=%K#$ r%OxN4w_h#?xa*o;vFCJ|;3$*2_UpBn^0!~FC*;2s^k86NVXy`OHVUBa literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/spacer.gif b/upload/templates/default/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/tbl_sort_asc.gif b/upload/templates/default/images/tbl_sort_asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..74157867f25acbc146704d43399d6c3605ba7724 GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcJa);0M5|G(l-7DfgJMg|=QAOOiQF!A=tFW`Q0{?_dDi`go= G4AuZ#-wosd literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/tbl_sort_bg.gif b/upload/templates/default/images/tbl_sort_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..fac668fcf42af844a3af0a239fa638ddbc08443c GIT binary patch literal 64 zcmZ?wbhEHb6lLIKXkcJa);0M5|G(l-7DfgJMg|=QAOOiQFp2l{H=O3Yl~fU8)V1~= QTew|n!uOuePzDBT00piR0RR91 literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/tbl_sort_desc.gif b/upload/templates/default/images/tbl_sort_desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b30b3c58eabdb47a1c420ad03c8e30b966cc858 GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcJa);0M5|G(l-7DfgJMg|=QAOOiQF!A>EGoD<#VNP?1QCB1* GgEatI(+xQQ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/topic_delete.gif b/upload/templates/default/images/topic_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b21b1108586e29463a5579d7387eb21b6d51afb GIT binary patch literal 311 zcmV-70m%MGNk%w1VG{rn0K^{v;^X7o+}x_k*hz`0inGXBm9xag#_{p-y1TpV?d|C3 z=$WRiDRh|#}2p%{e6b&7(xR?tK7b7MH5V@qg1THWO2*3~q2nZGp#W?~Q3?3HO9t~JIEjAe% J88SH`06V1lsg;s&$xLA%C2PM(^Bq)Jsbmpmg0vHGLbJzd?kR3!uP<$m9M(ZHx;H1%t;4qpv z0@a15p_45Be*g#-2?7|04F(Ys17Qu14G>x`4iaNum=F>V4jWA$3#?%iK*P&+-PWMinGY$6jW~g& zHGQG;_xfImpa1{=A^8LW0018VEC2ui022Tb000HK;3tX|!DJ{$bYm+7{lVXuh?`~hin z00+g{!tYxifDjxG1QL2!etm#+0R)9{fQftsln`G40gDfk7L)=ATpbORl$-(r5C$16 z5(EOJlBWnBI3E-Z2&cNcp9>inBPIwCyr>8Z4FoPQ3kJgw2nGfh$vGbY8w?&7+#U^I O)+06>92+t@ApkqvYktrG literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/topic_move.gif b/upload/templates/default/images/topic_move.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab2fd23536f238412d2b5685df36cc00830b30d7 GIT binary patch literal 316 zcmV-C0mJ@BNk%w1VG{rn0K^{v;^X70$=G6IV%*%^ONgh6v&gfwwOo;`!^6b!@$u~K z?U|;nDRh|6K($mvxdkS|37y=Gl0F3~G0RaSe4u6gqjspl)8x4*C0s@%;0|O8S866)I z1p}m^q@}V52RI)T4IZ+)vkMs)BPIwCyru{X4FxVR3kbsy&IT6AIUfNU3A1W@gjV z)8pggnWn8NbeXcUvitk{5@(Xb*yFvvzIm#`Y@xi*;O9)6>(*$;lpUlXIoMik+uCJUlLXpz7-C<>lq*=;-3&;^5%m z-{0Tu?d|L9>)P7d=jZ45_xJSl^zZNQ^YilnU5wk?+w$`A-QC^eV92FMdf%Flj&euS&OeyzopywI)4*4NqDkFdavx6B=Hn91Db z(b3W1=<7?3uCuth@bdIUhpBs%pqiSR_WAqj^7ioc_`AWyQc_aA)!{&Zq3G`MK|w*I zr>ShBy&-X#EOM4FcA8I5PhX3n(&Fotm6e~u)M8>{N`#?GimH^Qu1}7x!r0_{s=<4! z!-|TE@9^=(*Wp=(n?;GMUx}YuT3YVz?(FRB@bK_DIy&+3@&Et-A^8LW004ggEC2ui z022Tb000O7fPaF5St=GKhzK)UgN=eQ32{#$lywscNREOqZ(kuKCw_h>BvDmjjz9+? zBBEe@6{06}LKA}n7E~mneig8Mz_VN z;7bWE1p=_> z>gwv?;Naro;_dD2=jZ3^>+9Ou+TY*b^78WZ^z`rV@8jd++uPgo^Yh)^-2h#TzP`SO zvdPBA#;(lTb*I7Y^!I6?yLhR>=H}+y+}we$#^LPohkvQ@bTQFbGyOC+^c`q zaTw_C@kNQN@bdI*qP^OPL6Er3A#s`7x0oz)mQ#wR+OLUKk+6G|pw@yo*_&mAtG-H# zs!NToPmZp8tHa;Qw{W7nz188x*WvE&?(FRB@bK`}Y!C7A@&Et-A^8LW004ggEC2ui z022Tb000O7fPaF5Ts9dihzTt~gN=eS3p)V-lz9~kPL6^ybYcK0Bz}G*DO+P@j#mc& zC8A+{5TYbqZ54wA8DuGYjl(9sBe2p=DN z;7SWI1_OTH;CmQ-7$G4X@B&c;Eq8kE@El8hW*hz>APTHOa^}Due;WWc=`)0ehKD#B z^ziXQ&IX4Nz4QTd;)DkeL|j+pb+5VM}!-LS_t_fK>!L7UNa6tzTEn{BT9aIHIf&>p{6mt{^06W;^d)NQ~ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/topic_split.gif b/upload/templates/default/images/topic_split.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdbc88428fe1262154b2ad5ba3b2c8882b741e7e GIT binary patch literal 348 zcmV-i0i*s$Nk%w1VG{rn0K^{v#Kp$(@$st3*miby>+9>>+}ulur@6YiinGXEk*wn4 z<3~qF($mxa{{ES!ttoVw5@(Xb*yDMs!eL=yY@xi*;OCK%k?QgGqN1XNnWW?C?Ezkl zIDw_~_VzV>q5uE?A^8LW0018VEC2ui022Tb000Hq;3tX~@@%MwbYm+@kW_Va1WT?+ z8CnlMSTwQ|#)3gWBt92Nl`vpf z7KHTRKw!uPM^69)X9Not4QYKI5eO7dbO42B9Sa2t362$!+|1qT)bT+InM9~BVH1((^|3;+%r u8Y3nE4BOn^5C|?X4hQ7j2L~DHIUfQX4+$Cj1`uNPBW!T+z(Gci5CA)o@QAYj literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/topic_unlock.gif b/upload/templates/default/images/topic_unlock.gif new file mode 100644 index 0000000000000000000000000000000000000000..dae3e4de6aae7b1b948b7a20743b614543aeb8b3 GIT binary patch literal 317 zcmV-D0mA-ANk%w1VG{rn0K^{v>+9>P$=KuLa9d8)!}p}h9?_Rrww>hbnEIy!`zq~_@90bYzafu->F`89o^ zjEsz4iJ$uX{r~^}A^8LW0018VEC2ui022Tb000HL;3tYy!C>fCXk#lv4Kzu#14FJD z5rCxpzzZSbiX>>jpWz1>jslw`@Id_u7!DC3;7cM7iUS7#C?r0VMi&U6wh!b-Lla0a z0hN3na1mTC4;u~z5ej5@dKG_*4+I5-WPgbj0+p4G0RcRVla>Ml23Q&mo}Hfq4+t0@ z9}xuum6HRrpdC0L6AcEmytD=j7#AZZ1`oZczYPU0Fbf9756=h|$~hka84Mj3+#L*C P)+06<8yOH;E+GIrq1b)Q literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/treeview/treeview-default-line.gif b/upload/templates/default/images/treeview/treeview-default-line.gif new file mode 100644 index 0000000000000000000000000000000000000000..37114d3068e0a787dd44a39430a8fc44d1963dcf GIT binary patch literal 1993 zcmeH`{W}u~0LLe9$&r@`(ZXFlO>r4TVtHG0JrO$Enq6XbCo|$|a&v@;)39R3X0LXK z=4C5;$$F8ukhcpHt9h#|Z}G%v+dcJfT;CtQ-=9C9=lPxpf_ivHn*f&d)&O6Uk&*Fr zztuMb|2qTrN*yf#Km$1Nh5XAW09!Qxje#w!f##d3Weh^%ezb4RHMH}qgq?N>%r^k5 zhj5M29R-#U*YEa+*>{!bg)r&_S7N*KTu!yGdhlq^%Z{9zMGDQ)eI<}UJ(UMPCbY;M zvllJg5gpD6Azb)FR9y4#tw{Tec)?5bncDM@@-br;v!iS@ntF;{x>wqO9T|?VFmpzT z;fHVecYTQ=v*+Ym);btB~p|8@=<84j@I7qIs!>qhv@; z1(eJQ`*ljXoWj|YY77;~vfc-s1?J30uTyU>CwWxmC{uC3JXP^})h#WC2Q6Q>2}dh1 zcq*XfZFX&yXCIEpo4UPomP9A)+9IVF0Y6$f6g%3$872E%%Nax`KPlsmOPDqDF4zI? zSbF4BC;K+)X6keqq{Nz4?$3a;NGF@5tcsAQ*6hmgK{%TdIa$so2hB-mNa;5W-qA2- z8`bnAhoc{WUzTpKZ{$8sL5zp;dAjj7~R*T{ro+bjX zC=NX64_09Azeep!crc#emC*dA+KDTgre1ayzvDV##Y++|?88;rWvt}$q+(H`i5RPS zEHN9edot#LH?f-f_})iLD)jY-ra{u59Qq%o=a#+)lJ@>@q)xJoJ3$ zC30i;uGaC!9^jB|Q?KI`vgyUXl}gucr_J$?)rZWzc?0f_c;28VxP>?5?XTkX`=0bp zsd70NwTbl+Lav>1lvoy}l$LQQ%CUlL65(s3k4oViy0(u<&T*uQ zCTqc{qw;%cYS9$WA0?h{4yTG|#4$4Q?4#t}n@dl!P&;uQVA8R|HlpNVX)kkk%iItT z)uQMtNN@Qdt&n&xPqeC4>+&I#Wd7|GRkEO1kx3R8wSkY8rZwz`s-8aVF?GLU@t9_8 zrD|0N=Dh{cmochMTQlkO*3BnmzDcGjzt8j8R?~OmLo035Z7an1d0*CQ)_K)7BE)2Y zkgWpCHK(nPTNwA}=w{2c(4^y*&P6wk_;T$eD_^_d{#*;4N!{uklCMKTf1X{yr2bti zzumVJ_he@>5-)Z>GylmnHFyWzlGoV=;x6T{txOuWS^2w$nf~>ITa3{F$-_yqw6wR74o)-lATn!~abYe|(Jp=qK2Z~Mv#F|+M1E7Zo2t_F@i)9itD80A@ z!=JWtheLy@ro^PxX&YboiBL)Loiw)@+fZv*gz@0roa`BUbU6&+JhF}1vNN-#bFE}n2rob1X65+pkEe*DZwLSXi!o7KG!HJYnd?<+74YK9YG>B8y}v#$ z4PTdVxGU6Z+nUJb(dSpiS{vy`Ps;C})+4q3p-ZRd>!LZ`7uVifRnN>VcjoGA??Z~) zf4QCsFnrwCC;z;pV~S4jNfG7bZ7V8^pUs+QDV-;|Ys;0R%YxUttlhQM^V+hXyW%vY z%kJ#vEL=V9>`mkMHxD#(_gl~UQm~6Px4muESBs+6=T0j1o(TDw{48a0^7ef@KYw_1 zXL0vpdH;QTD!cYCUVc2rvi#n)*ZtSUu9-zA2t0`pacfj) RGUo9-WFdCJBZP&)8USI+HDCY$ literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/vote_rcap.gif b/upload/templates/default/images/vote_rcap.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9584e23a1ad55fdccbff4dc1c83de3ab63c5f88 GIT binary patch literal 113 zcmZ?wbhEHbWMSZ8*v!u$mObtB=g;@<-TVLle^TGlmJP?4;(8yw{ZzT?@bBNhuim+T z{P^*uYd2oGa%K0Sqd+x^KUo+V82A}<7=Qp|1_O(nz=F?yhUq;`TbO1gsB}uO^cF5_ Re86zXNr9))GlYe~8UWh-Gv@#R literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/voting_bar.gif b/upload/templates/default/images/voting_bar.gif new file mode 100644 index 0000000000000000000000000000000000000000..99473151ec87bc348047acc19f0a5a5b4ef20e44 GIT binary patch literal 92 zcmZ?wbhEHbWMtrB*v!E2|Nno6*q(p?{(b-c{qyI~zkmOJ|Ni~!*ROZ(+{u6qDE?#t Z3+sSLkQodtoCXb=rxczo5MX4m1^^6W9;yHU literal 0 HcmV?d00001 diff --git a/upload/templates/default/images/whosonline.gif b/upload/templates/default/images/whosonline.gif new file mode 100644 index 0000000000000000000000000000000000000000..b45092743218db5a4a6b80bf45a9f215c26ca7f4 GIT binary patch literal 929 zcmV;S177?`Nk%w1VJ-j}0Oo%H)z#I>(boU)2le&!%FD|ub(-DX-2x0}`3YGA0s^S1 zsvB15NnwrU<>g>hC~Tp;+1c3@X_M~m?*IR@MTe>3;o+K^nPz2V#KgtCyu4$YwxzAH zTaT)RvB*=Au>V(4|Nn06?Ck03={h<(qr}z!vjEE6jDgh5yF@aE_j9WK7nF z0K|$nt+ly*9UiX3&#=wg|I1pRrmz3tNdLx;slCVF>+$2`1umqsgf3$+1FL8ktE{bF9uG>iq&*aytY}kHW){A!5*iQ0l(1?8tO-$CPY4Om zLl`1!6dlx(EJxVcA8ukiHP06ctR_HU=Y=F5xxNWHTX-Z$K!g>I6a|M!z+xmHAr>vx zvD1M-$dUvpXb>dAQ9^(S4h5ZvFr$~R7@;Ebg0yUHBdBgK%+u~27Vx%(STHg z1gRqaP*|Wku)&A~QUnBPQ=>wK6;!b1yF(%F*#;M&)ToibPX#|ICQJw-fQA7B1acg8 zIMT5nKQg+gsInl&WdkYn?2%I#jEx0hdPA5#Vh)HmG#Kp2kfY&j+I#>&Ad|+)ivtdj09e0bL>2}XFy#4i;`<*G zWeBX0!Ndmo9qR=cAOT1eV2*u%xPSu&D*!M;92N*DAO=X_Fb#r&JWv1~`bjuo1`1d> z42FW3!bS!d5D?%B7-WD191#dcq97({5J3(;D4?SPKIBkFC^JUVM + +

    + + +
    + + + + + + + + + + + +
    + + + + +
    +

    {c.CAT_TITLE}

    +
    + + + + + + + + + + + + + + + + + + + + + + + +
     {L_FORUM}{L_TOPICS_SHORT}{L_POSTS_SHORT}{L_LASTPOST}
    + {c.f.FORUM_FOLDER_ALT} + + + + + +

    {c.f.FORUM_DESC}

    + + + +

    + {L_SUBFORUMS}: + + {c.f.sf.SF_NAME} + +

    + + + +

    {L_MODERATORS}: {c.f.MODERATORS}

    + + +
    {c.f.TOPICS}{c.f.POSTS} + + + + +
    + {c.f.last.LAST_TOPIC_TITLE} +
    + + +

    + {c.f.last.LAST_POST_TIME} + by + + {c.f.last.LAST_POST_USER_NAME} + + {c.f.last.LAST_POST_USER_NAME} + + +

    + + +

    + {L_TOPICS_SHORT}: {c.f.TOPICS} + {L_POSTS_SHORT}: {c.f.POSTS} +

    + + + {L_NO_POSTS} + + +
    +
    +
    + +
    + + + + + + +
    {NO_FORUMS_MSG}
    +
    + + + +
    + + + + + + + +
    +

    {L_WHOSONLINE}

    +
    + + + + + + +
    +
    +

    {TOTAL_TOPICS}

    +

    {TOTAL_POSTS}

    +

    {TOTAL_USERS}

    +

    {NEWEST_USER}

    + +
    + +

    {TORRENTS_STAT}

    +

    {PEERS_STAT}

    +

    {SPEED_STAT}

    + +
    + +

    {TOTAL_USERS_ONLINE}  {USERS_ONLINE_COUNTS}

    +

    {RECORD_USERS}

    + + + + +
    {LOGGED_IN_USER_LIST}
    + +
    + +

    {L_ONLINE_EXPLAIN}

    +

    + [ {L_ONLINE_ADMIN} ] + [ {L_ONLINE_MOD} ] + [ {L_ONLINE_GROUP_MEMBER} ] +

    + +
    +
    +
    +
    + + +
    + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + + + + + + + + + + +
    new{L_NEW_POSTS}old{L_NO_NEW_POSTS}locked{L_FORUM_LOCKED_MAIN}
    + +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/kb.tpl b/upload/templates/default/kb.tpl new file mode 100644 index 000000000..be9ac5a2d --- /dev/null +++ b/upload/templates/default/kb.tpl @@ -0,0 +1,136 @@ + + + + + + + + + + {L_KB_TITLE} +
    + + {L_TRANSLIT}
    + {L_RULES}
    + {L_HIDE} +
    + + + +
    {L_SHOW}
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RULES}{L_CLOSE}
    а
    б
    в
    г
    д
    е
    - a
    - b
    - v
    - g
    - d
    - e
    ë
    ж
    з
    и
    й
    к
    - 'o
    - 'z ('g)
    - z
    - i
    - j
    - k
    л
    м
    н
    о
    п
    р
    - l
    - m
    - n
    - o
    - p
    - r
    с
    т
    у
    ф
    х
    ц
    - s
    - t
    - u
    - f
    - h
    - c
    ч
    ш
    щ
    ъ
    ы
    ь
    - 'c
    - 's
    - w ('h)
    - ]
    - y
    - [
    э
    ю
    я
    '
    - 'e
    - q ('u)
    - 'a
    - ''
    +
    + +
    + + + + +
    + + + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/upload/templates/default/login.tpl b/upload/templates/default/login.tpl new file mode 100644 index 000000000..3638e6766 --- /dev/null +++ b/upload/templates/default/login.tpl @@ -0,0 +1,61 @@ + +

    Вход

    + +
    + + + + + + + + + + + + + +
    Вход
    + + +

    {LOGIN_ERR_MSG}

    + +

    Для получения доступа к мод/админ опциям необходимо еще раз ввести пароль

    + +

    Введите ваше имя и пароль

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Имя:readonly="readonly" style="color: gray" />
    Пароль:
    Код:{CAPTCHA_HTML}
    В вашем браузере должны быть включены куки и JavaScript!
    Забыли пароль?
    +
    + +
    + +
    diff --git a/upload/templates/default/memberlist.tpl b/upload/templates/default/memberlist.tpl new file mode 100644 index 000000000..6cdb9f472 --- /dev/null +++ b/upload/templates/default/memberlist.tpl @@ -0,0 +1,83 @@ +

    {PAGE_TITLE}

    + +
    + + + + + + + + + + + +
    {L_SORT_BY}: {S_MODE_SELECT}  {L_ORDER} {S_ORDER_SELECT}  
    +   +
    {L_SORT_PER_LETTER}: {S_LETTER_SELECT}{S_LETTER_HIDDEN}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #{L_USERNAME}PM{L_EMAIL}{L_LOCATION}{L_JOINED}{L_POSTS_SHORT}{L_WEBSITE}
     {no_username.NO_USER_ID_SPECIFIED} 
    {memberrow.ROW_NUMBER}{memberrow.USERNAME}{memberrow.PM}{memberrow.EMAIL} + + + + + +
    {memberrow.FROM}{memberrow.FLAG}
    +
    + {memberrow.JOINED_RAW} + {memberrow.JOINED} + {memberrow.POSTS}{memberrow.WWW}
     
    + +
    + + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/modcp.tpl b/upload/templates/default/modcp.tpl new file mode 100644 index 000000000..750023a09 --- /dev/null +++ b/upload/templates/default/modcp.tpl @@ -0,0 +1,133 @@ +

    {PAGE_TITLE}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_IP_INFO}
    {L_THIS_POST_IP}
    +

    {IP}

    +

    [ {L_LOOKUP_IP}

    +
    {L_OTHER_USERS}
    +

    {userrow.USERNAME}

    +

    [ {L_POSTS}: {userrow.POSTS} ]

    +

    [ {userrow.L_SEARCH_POSTS}

    +
    {L_OTHER_IPS}
    +

    {iprow.IP}

    +

    [ {L_POSTS}: {iprow.POSTS} ]

    +

    [ {L_LOOKUP_IP}

    +
    + + + + + + + + + +{S_HIDDEN_FIELDS} + + + + + + + + +
    {MESSAGE_TITLE}
    + +
    + + + + + +
    {L_MOVE_TO_FORUM} +

    {S_FORUM_SELECT}

    + + + +
    +
    + + +
    + + + + +
    + +

    + + +

    + +
    +
    + + +

    {MESSAGE_TEXT}

    + + + + + + +
    +
    • {TOPIC_TITLES}
    +
    + + +
    +   + +
    + +
    + +
    + + + + + +
    + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/modcp_split.tpl b/upload/templates/default/modcp_split.tpl new file mode 100644 index 000000000..c5f28da35 --- /dev/null +++ b/upload/templates/default/modcp_split.tpl @@ -0,0 +1,95 @@ + + + +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_SPLIT_TOPIC}
    {L_SPLIT_TOPIC_EXPLAIN}
    {L_NEW_TOPIC_TITLE}
    {L_FORUM_FOR_NEW_TOPIC}{S_FORUM_SELECT}
    + + + + + + +
     
    +
    + + + +
    +
    + + + + + + + + + id="{postrow.ROW_ID}" onclick="toggle_cbox('{postrow.CB_ID}', '{postrow.ROW_ID}');" class="{postrow.ROW_CLASS}"> + + + + + + + + +
    #{L_AUTHOR}{L_MESSAGE}
    +

    {postrow.POSTER_NAME}

    +

    {postrow.POST_DATE}

    +
    +
    +
    {postrow.MESSAGE}
    +
    +
    + + + + + {S_HIDDEN_FIELDS} +
    +
    \ No newline at end of file diff --git a/upload/templates/default/page_footer.tpl b/upload/templates/default/page_footer.tpl new file mode 100644 index 000000000..30f99c8d2 --- /dev/null +++ b/upload/templates/default/page_footer.tpl @@ -0,0 +1,74 @@ + + +
    + + + + + +
    + + +
    + + + + +
    + + + + + + + + + +
    + + + + + + + + + \ No newline at end of file diff --git a/upload/templates/default/page_header.tpl b/upload/templates/default/page_header.tpl new file mode 100644 index 000000000..7e930df7a --- /dev/null +++ b/upload/templates/default/page_header.tpl @@ -0,0 +1,540 @@ + + + + +<!-- IF PAGE_TITLE -->{PAGE_TITLE} :: {SITENAME}<!-- ELSE -->{SITENAME}<!-- ENDIF --> + + +{META} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Loading...
    +
    Error
    + +
    + +
    + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/upload/templates/default/posting_editor.tpl b/upload/templates/default/posting_editor.tpl new file mode 100644 index 000000000..4b169f0b6 --- /dev/null +++ b/upload/templates/default/posting_editor.tpl @@ -0,0 +1,215 @@ + + +
    + +  + +  + +  + +  + + +   + + +  +
    + + +
    + + + +    + + +   + + +   +   + ? +
    + + + +
    +
    + +
    +

    {L_BT_RATIO}

    + +
    {AVATAR}
    + + + + + +
    {L_YOUR_RATIO}{USER_RATIO}{L_NONE} (DL < {MIN_DL_FOR_RATIO})
    {L_DOWNLOADED}{DOWN_TOTAL}
    {L_UPLOADED}{UP_TOTAL}
    {L_RELEASED}{RELEASED}
    {L_BT_BONUS_UP}{UP_BONUS}
    +
    + + + + +
    +
    +
    + + +
    + + +
    +

    {L_LATEST_NEWS}

    + + + + + + + +
    {news.NEWS_TIME}
    +
    +
    + + + +
    {AD_BLOCK_200}
    {AD_BLOCK_100}
    + + + + + + +
    + + +
    {ERROR_MESSAGE}
    +
    + + + +
    + + +
    {INFO_MESSAGE}
    +
    + + + + \ No newline at end of file diff --git a/upload/templates/default/posting.tpl b/upload/templates/default/posting.tpl new file mode 100644 index 000000000..487bfae93 --- /dev/null +++ b/upload/templates/default/posting.tpl @@ -0,0 +1,218 @@ +
    + + + + + + + + + + + + + + + + + + + +
    {L_NEW_POSTS_PREVIEW}
    {L_AUTHOR}{L_MESSAGE}
    +

    + {new_posts.POSTER_NAME} +

    +

    +
    +
    {MINIPOST_IMG_NEW} {new_posts.POST_DATE}
    +
    {new_posts.MESSAGE}
    +
    + +
    + + + + + + + + + + + + + + +
    {L_PREVIEW}
    {PREVIEW_MSG}
    + +
    + + + + + + +
    +{S_HIDDEN_FORM_FIELDS} +{ADD_ATTACH_HIDDEN_FIELDS} +{POSTED_ATTACHMENTS_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {POSTING_TYPE_TITLE}
    {L_USERNAME} +   + +
    {L_SUBJECT}
    +

    {L_MESSAGE_BODY}

    + + + + + + + + + + + + + + +
    {L_MORE_SMILIES}
    + +
    +

    {L_OPTIONS}

    +

    + {BBCODE_STATUS}
    + {SMILIES_STATUS}
    +

    +
    + +
    + + + + + + + + + +
    disabled="disabled" />
    checked="checked" disabled="disabled" />
    +
    + + + +
      
    + +
    + + + + + + + + + + + + + + + + + +
    checked="checked" />
    +
    + + +
    {S_TYPE_TOGGLE}
    + +
    + + + + +
    + + + + + + + + + + + + + + + + +
    {L_TOPIC_REVIEW}
    {L_AUTHOR}{L_MESSAGE}
    +

    + {review.POSTER_NAME} +

    +

    +
    +
    {MINIPOST_IMG} {review.POST_DATE}
    +
    {review.MESSAGE}
    +
    + +
    + + + \ No newline at end of file diff --git a/upload/templates/default/posting_attach.tpl b/upload/templates/default/posting_attach.tpl new file mode 100644 index 000000000..554c43df2 --- /dev/null +++ b/upload/templates/default/posting_attach.tpl @@ -0,0 +1,71 @@ + + + +
    {L_ADD_ATTACH_TITLE}
    {L_FILE_NAME} + + + + + +
    + +

    {L_ADD_ATTACH_EXPLAIN}

    +
    {RULES}
    +
    {L_FILE_COMMENT} + + +
    {L_POSTED_ATTACHMENTS}
    {L_FILE_NAME}{attach_row.FILE_NAME}
    {L_FILE_COMMENT} +   + +
    {L_OPTIONS} + +   + +   + +   + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    А-aД-dИ-iМ-mР-rФ-fШ-shЫ-y
    Б-bЕ-eЙ-jН-nС-sХ-h,xЩ-sz,wЭ-eh
    В-vЖ-zhК-kО-oТ-tЦ-cЬ-'Ю-ju
    Г-gЗ-zЛ-lП-pУ-uЧ-chЪ-#Я-ja
    +
    + + +
    Для отправки сообщений необходимo включить JavaScript
    + + + + + + + + + + + + \ No newline at end of file diff --git a/upload/templates/default/posting_poll.tpl b/upload/templates/default/posting_poll.tpl new file mode 100644 index 000000000..6031308ba --- /dev/null +++ b/upload/templates/default/posting_poll.tpl @@ -0,0 +1,40 @@ + + + {L_ADD_A_POLL} + + + {L_POLL_QUESTION} + + + + + {L_POLL_OPTION} + +   +   + + + + + + {L_POLL_OPTION} + +   + + + + + {L_POLL_LENGTH} + +   + {L_DAYS}   + {L_POLL_LENGTH_EXPLAIN} + + + + + {L_POLL_DELETE} + + + + \ No newline at end of file diff --git a/upload/templates/default/posting_smilies.tpl b/upload/templates/default/posting_smilies.tpl new file mode 100644 index 000000000..d9be37baf --- /dev/null +++ b/upload/templates/default/posting_smilies.tpl @@ -0,0 +1,44 @@ + + + + + + +
    + + + + + + + + + + +
    {L_EMOTICONS}
    + + + + + + + + + + + + + +
    {smilies_row.smilies_col.SMILEY_DESC}
    {L_MORE_SMILIES}

    {L_CLOSE_WINDOW}
    \ No newline at end of file diff --git a/upload/templates/default/privmsgs.tpl b/upload/templates/default/privmsgs.tpl new file mode 100644 index 000000000..433ec13e0 --- /dev/null +++ b/upload/templates/default/privmsgs.tpl @@ -0,0 +1,150 @@ +
    + +
    + + + + + + + + + + + + + +
    {BOX_SIZE_STATUS}
    +
    +
    0%50%100%
    + + + + + + + + + + + + + +
    {BOX_SIZE_STATUS}
    +
    +
    0%50%100%
    + + + + + + + + + + + +
    {INBOX_IMG}{INBOX}{SENTBOX_IMG}{SENTBOX}
    {OUTBOX_IMG}{OUTBOX}{SAVEBOX_IMG}{SAVEBOX}
    + +
    +
    + + +

    {BOX_EXPL}

    + + +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + +
    {POST_PM_IMG} + {L_DISPLAY_MESSAGES}: + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     {L_SUBJECT}{L_FROM_OR_TO}{L_DATE} 
    {listrow.L_PRIVMSG_FOLDER_ALT}{listrow.SUBJECT}{listrow.FROM}{listrow.DATE}
    {L_NO_MESSAGES}
    +
    + +
    +
    +    +   +
    +
    + +
    + +

    + {L_MARK_ALL} + :: + {L_UNMARK_ALL} +

    + + +
    + +
    + + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    + + \ No newline at end of file diff --git a/upload/templates/default/privmsgs_read.tpl b/upload/templates/default/privmsgs_read.tpl new file mode 100644 index 000000000..c567a3540 --- /dev/null +++ b/upload/templates/default/privmsgs_read.tpl @@ -0,0 +1,94 @@ +
    + + + + + + + + + + +
    {INBOX_IMG}{INBOX}{SENTBOX_IMG}{SENTBOX}
    {OUTBOX_IMG}{OUTBOX}{SAVEBOX_IMG}{SAVEBOX}
    + +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + +
    {REPLY_PM_IMG} 
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {BOX_NAME} :: {L_MESSAGE}
    {L_FROM}: {FROM_USER_NAME}
    {L_TO}: {TO_USER_NAME}
    {L_POSTED}: {POST_DATE}
    {L_SUBJECT}: {POST_SUBJECT}
    +
    {PM_MESSAGE}
    +
    {QUOTE_PM_IMG} {EDIT_PM_IMG} {REPORT_PM_IMG}
    +
    +   +   +
    + +
    + + +
    + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + +
    {L_QUICK_REPLY}
    + {L_TO}: +   + {L_SUBJECT}: + +
    +
    + +
    +
    + +
    + \ No newline at end of file diff --git a/upload/templates/default/report_change_body.tpl b/upload/templates/default/report_change_body.tpl new file mode 100644 index 000000000..e7c049dfb --- /dev/null +++ b/upload/templates/default/report_change_body.tpl @@ -0,0 +1,29 @@ + + + + +
    + +
    + + + + + + + + + + + + + + +
    {MESSAGE_TITLE}
    {MESSAGE_TEXT}
    {L_COMMENT}: + +
    + {S_HIDDEN_FIELDS} + + +
    +
    \ No newline at end of file diff --git a/upload/templates/default/report_config_body.tpl b/upload/templates/default/report_config_body.tpl new file mode 100644 index 000000000..cf4823e55 --- /dev/null +++ b/upload/templates/default/report_config_body.tpl @@ -0,0 +1,92 @@ +

    {L_CONFIGURATION_TITLE}

    + +

    {L_CONFIGURATION_EXPLAIN}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    + {L_REPORT_SUBJECT_AUTH}:
    + {L_REPORT_SUBJECT_AUTH_EXPLAIN} +
    + +   + +
    + {L_REPORT_MODULES_CACHE}:
    + {L_REPORT_MODULES_CACHE_EXPLAIN} +
    + +   + +
    {L_REPORT_NOTIFY}: + +
    + +
    + +
    {L_REPORT_LIST_ADMIN}: + +   + +
    + {L_REPORT_NEW_WINDOW}:
    + {L_REPORT_NEW_WINDOW_EXPLAIN} +
    + +   + +
    + {S_HIDDEN_FIELDS} + + +
    +
    \ No newline at end of file diff --git a/upload/templates/default/report_form_body.tpl b/upload/templates/default/report_form_body.tpl new file mode 100644 index 000000000..51f5e91ea --- /dev/null +++ b/upload/templates/default/report_form_body.tpl @@ -0,0 +1,72 @@ +
    + + + + +
    + + + + + + +
    + + {switch_report_errors.report_errors.MESSAGE}
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_WRITE_REPORT}
    {L_WRITE_REPORT_EXPLAIN}
    {L_SUBJECT}: + + + + {REPORT_SUBJECT} + + + +
    + +
    + + +
    + {S_HIDDEN_FIELDS} +
    \ No newline at end of file diff --git a/upload/templates/default/report_index_body.tpl b/upload/templates/default/report_index_body.tpl new file mode 100644 index 000000000..70811834c --- /dev/null +++ b/upload/templates/default/report_index_body.tpl @@ -0,0 +1,81 @@ + + + + + + + + + + +
    {L_REPORT_INDEX}
    + {L_STATISTICS}:

    + + + + + + + + + + + +
    {L_STATISTIC}{L_VALUE}
    {report_statistics.STATISTIC}:{report_statistics.VALUE}
    + +
    + + + {L_DELETED_REPORTS}:

    + +
    + + + + + + + + + + + + + + + +
    {L_REPORTS}{L_REPORT_TYPE}
    + {switch_deleted_reports.deleted_reports.TITLE}
    + + {L_BY} {switch_deleted_reports.deleted_reports.AUTHOR} + +
    {switch_deleted_reports.deleted_reports.TYPE}
    + + +
    +
    + + + + + +
    + {L_SELECT_ALL} :: + {L_INVERT_SELECT} +
    + +
    + +
    +
    \ No newline at end of file diff --git a/upload/templates/default/report_list_body.tpl b/upload/templates/default/report_list_body.tpl new file mode 100644 index 000000000..7c87c913b --- /dev/null +++ b/upload/templates/default/report_list_body.tpl @@ -0,0 +1,115 @@ + + + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_REPORTS}
    {L_REPORT_INDEX}
    {report_modules.TITLE}
    + + + + {report_modules.reports.TITLE}
    + +
    + + + {L_BY} {report_modules.reports.AUTHOR} + +
    {L_NO_REPORTS}
    + + +
    +
    + + {L_SELECT_ALL} :: + {L_INVERT_SELECT} + +
    + {REPORT_VIEW} +
    \ No newline at end of file diff --git a/upload/templates/default/report_module_edit_body.tpl b/upload/templates/default/report_module_edit_body.tpl new file mode 100644 index 000000000..07b0a194b --- /dev/null +++ b/upload/templates/default/report_module_edit_body.tpl @@ -0,0 +1,96 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_EDIT_MODULE}
    {L_REPORT_MODULE}: + {MODULE_TITLE}
    + {MODULE_EXPLAIN} +
    {L_REPORT_NOTIFY}: + +   + +
    + :
    + {L_REPORT_PRUNE_EXPLAIN} +
    + + {L_DAYS} +
    {L_REPORT_PERMISSIONS}
    + : + + +
    + : + + +
    + :
    + {L_AUTH_NOTIFY_EXPLAIN} +
    + +
    + :
    + {L_AUTH_DELETE_EXPLAIN} +
    + +
    + {S_HIDDEN_FIELDS} + + +
    +
    \ No newline at end of file diff --git a/upload/templates/default/report_module_reasons_body.tpl b/upload/templates/default/report_module_reasons_body.tpl new file mode 100644 index 000000000..5874fdf87 --- /dev/null +++ b/upload/templates/default/report_module_reasons_body.tpl @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + +
    {L_REPORT_REASON}{L_ACTION}
    {report_reasons.DESC} + {L_EDIT} | + {L_MOVE_UP} | + {L_MOVE_DOWN} | + {L_DELETE} +
    {L_NO_REASONS}
    + {L_ADD_REASON} | + {L_BACK_MODULES} +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/report_modules_body.tpl b/upload/templates/default/report_modules_body.tpl new file mode 100644 index 000000000..b2f186b81 --- /dev/null +++ b/upload/templates/default/report_modules_body.tpl @@ -0,0 +1,65 @@ +

    {L_REPORTS_TITLE}

    + +

    {L_REPORTS_EXPLAIN}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_REPORT_MODULE}{L_REPORT_COUNT}{L_ACTION}
    {L_INSTALLED_MODULES}
    + {installed_modules.modules.MODULE_TITLE}
    + {installed_modules.modules.MODULE_EXPLAIN} +
    {installed_modules.modules.REPORT_COUNT} + {L_EDIT} | + {installed_modules.modules.L_REASONS} | + + {L_SYNC} | + + {L_MOVE_UP} | + {L_MOVE_DOWN} | + {L_UNINSTALL} +
    {L_NO_MODULES_INSTALLED}
    {L_INACTIVE_MODULES}
    + {inactive_modules.modules.MODULE_TITLE}
    + {inactive_modules.modules.MODULE_EXPLAIN} +
    {inactive_modules.modules.REPORT_COUNT} + {L_INSTALL} +
    {L_NO_MODULES_INACTIVE}
    + +
    \ No newline at end of file diff --git a/upload/templates/default/report_open_body.tpl b/upload/templates/default/report_open_body.tpl new file mode 100644 index 000000000..84a41262b --- /dev/null +++ b/upload/templates/default/report_open_body.tpl @@ -0,0 +1,90 @@ + + + + + + +
    + +
    + + + + + + + + + + + + + +
    {L_OPEN_REPORTS}
    + {open_reports.TITLE}
    + + {L_BY} {open_reports.AUTHOR} + +
    + + +
    +
    + + + + + +
    + {L_SELECT_ALL} :: + {L_INVERT_SELECT} +
    \ No newline at end of file diff --git a/upload/templates/default/report_reason_edit_body.tpl b/upload/templates/default/report_reason_edit_body.tpl new file mode 100644 index 000000000..dfa938f68 --- /dev/null +++ b/upload/templates/default/report_reason_edit_body.tpl @@ -0,0 +1,36 @@ +
    + + + + + +
    + + {switch_report_errors.report_errors.MESSAGE}
    + +
    +
    + + + + + + + + + + + + + +
    {L_EDIT_REASON}
    + :
    + {L_REASON_DESC_EXPLAIN} +
    + +
    + {S_HIDDEN_FIELDS} + + +
    +
    \ No newline at end of file diff --git a/upload/templates/default/report_view_body.tpl b/upload/templates/default/report_view_body.tpl new file mode 100644 index 000000000..732514af3 --- /dev/null +++ b/upload/templates/default/report_view_body.tpl @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + +
    {REPORT_TYPE}
    + {REPORT_TITLE}

    + + + + + + +
    {L_REPORT_SUBJECT_DELETED}
    +
    + + + + + + + + + + + + + + + + +
    {L_SUBJECT}: + + + + {REPORT_SUBJECT} + + + +
    {report_subject.details.TITLE}:{report_subject.details.VALUE}
    +
    + + + + + + + + + + + + + + + + + + + + + +
    {L_REPORTED_BY}: + {REPORT_AUTHOR}  + [ {L_SEND_PRIVMSG} ] +
    {L_REPORTED_TIME}:{REPORT_TIME}
    {L_REASON}:{REPORT_REASON}
    {L_MESSAGE}:{REPORT_DESC}
    + +
    + + + + + + + + + + + + +
    {L_STATUS}: +
    + {REPORT_STATUS} +
    {L_LAST_CHANGED_BY}: + {REPORT_LAST_CHANGE_USER} ({REPORT_LAST_CHANGE_TIME}) +
    + +
    +
    {L_CHANGES}
    {switch_report_changes.report_changes.TEXT}
    +
    + + + + + + + {S_HIDDEN_FIELDS} +
    +
    \ No newline at end of file diff --git a/upload/templates/default/rss_body.tpl b/upload/templates/default/rss_body.tpl new file mode 100644 index 000000000..c0b0521cd --- /dev/null +++ b/upload/templates/default/rss_body.tpl @@ -0,0 +1,41 @@ + + + + + + +{BOARD_TITLE} +{BOARD_URL} +{BOARD_DESCRIPTION} +{BOARD_MANAGING_EDITOR} +http://blogs.law.harvard.edu/tech/rss +{PROGRAM}{LANGUAGE} +{BUILD_DATE} + + {BOARD_URL}images/logo/logo.gif + {BOARD_TITLE} + {BOARD_URL} + 122 + 56 + + + +{post_item.FORUM_NAME} :: {post_item.TOPIC_TITLE} +{post_item.POST_URL} +{post_item.UTF_TIME} +{post_item.POST_URL} +{L_AUTHOR}: {post_item.AUTHOR}<br /> +{post_item.POST_SUBJECT} +{L_POSTED}: {post_item.POST_TIME}<br /> +<br /><span class="postbody"> +{post_item.POST_TEXT}{post_item.USER_SIG}</span><br /> + +{post_item.AUTHOR0} +{post_item.FORUM_NAME} + +{post_item.REPLY_URL} + + + + \ No newline at end of file diff --git a/upload/templates/default/search.tpl b/upload/templates/default/search.tpl new file mode 100644 index 000000000..8b2fca8ff --- /dev/null +++ b/upload/templates/default/search.tpl @@ -0,0 +1,171 @@ + + + + +

    {PAGE_TITLE}

    + + + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + + + + + +
    {L_SEARCH_OPTIONS}
    +
    + {L_SEARCH_WORDS} [?] +
    +

    +

    {TITLE_ONLY_CHBOX}  {ALL_WORDS_CHBOX}

    +
    +
    +
    +
    + {L_SEARCH_AUTHOR} +
    +

    +   + +

    +

    + + {MY_TOPICS_CHBOX} +

    +
    +
    +
    +

    {$bb_cfg['search_help_url']}

    +

    {L_SEARCH_WORDS_EXPL}

    +
    +
    + {L_FORUM}: +
    +

    {FORUM_SELECT}

    +
    +
    +
    +
    + {L_MY_DOWNLOADS} +
    + + + + + + + + + +
    {DL_COMPL_CHBOX}{DL_WILL_CHBOX}
    {DL_DOWN_CHBOX}{DL_CANCEL_CHBOX}
    +
    +
    +
    + {L_SEARCH_PREVIOUS}: +
    +

    {TIME_SELECT}

    +

    {ONLY_NEW_CHBOX}  {NEW_TOPICS_CHBOX}

    +
    +
    +
    + {L_DISPLAY_RESULTS_AS}: +
    +

    {DISPLAY_AS_SELECT} {CHARS_SELECT}

    +
    +
    +
    + {L_SORT_BY}: +
    +

    {ORDER_SELECT} {SORT_SELECT}

    +
    +
    +
    + +
    + +
    + + +
    + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    + + + + + + + + + +
    + + + + + + + + +
    {L_FIND_USERNAME}
    +

    +   + +

    +

    {L_SEARCH_AUTHOR_EXPL}

    + +
    {L_SELECT_USERNAME}
    +

    +   + +

    + +
    + {L_CLOSE_WINDOW} +
    + +
    + + + \ No newline at end of file diff --git a/upload/templates/default/search_results.tpl b/upload/templates/default/search_results.tpl new file mode 100644 index 000000000..52c6e96b1 --- /dev/null +++ b/upload/templates/default/search_results.tpl @@ -0,0 +1,162 @@ + +

    {SEARCH_MATCHES}

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_AUTHOR}{L_MESSAGE}
    + +

    {t.p.POSTER_NAME}

    +

    + +
    + +
    +

    + {MINIPOST_IMG_NEW}{MINIPOST_IMG} + {t.p.POST_DATE} + + ({L_POSTED_AFTER} {t.p.POSTED_AFTER}) + +

    + +

    + {QUOTE_IMG}{POST_BTN_SPACER} + {EDIT_POST_IMG}{POST_BTN_SPACER} + {DELETE_POST_IMG}{POST_BTN_SPACER} + {IP_POST_IMG}{POST_BTN_SPACER} +

    +
    +
    + +
    +
    {t.p.MESSAGE}
    +
    + +
     
    + + + + +
    + + + +++++++ + + + + + + + + + + + + + + + + + + + + +
     {L_FORUM}{L_TOPICS}{L_AUTHOR}{L_REPLIES_SHORT}{L_LASTPOST}
    + + + + + + {t.FORUM_NAME} +
    + {ICON_NEWEST_REPLY} + {L_MOVED} + {L_ANNOUNCE} + {L_DL_TOPIC} + {TOPIC_ATTACH_ICON} + + {L_POLL} + {t.TOPIC_TITLE} + [{ICON_GOTOPOST}{L_GOTO_SHORT} {t.PAGINATION} ] +
    +
    {t.TOPIC_AUTHOR_NAME}{t.TOPIC_AUTHOR_NAME}{t.REPLIES} +

    {t.LAST_POST_TIME}

    +

    + {t.LAST_POSTER_NAME}{t.LAST_POSTER_NAME} + {ICON_LATEST_REPLY} +

    +
    + + + + + + + + +   + +
    + + +
    + + + + +
    + + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/topic_templates/audiobooks.tpl b/upload/templates/default/topic_templates/audiobooks.tpl new file mode 100644 index 000000000..f1fd39881 --- /dev/null +++ b/upload/templates/default/topic_templates/audiobooks.tpl @@ -0,0 +1,160 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_AUTHOR}:
    {L_PERFORMER}:
    {L_GENRE}:
    {L_PUBLISHER}:
    {L_FORMAT}: +   +   + {L_AUDIO_BITRATE}: +
    {L_DESCRIPTION}:
    {L_MOREINFO}:
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/books.tpl b/upload/templates/default/topic_templates/books.tpl new file mode 100644 index 000000000..c9c9e6f53 --- /dev/null +++ b/upload/templates/default/topic_templates/books.tpl @@ -0,0 +1,148 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_AUTHOR}:
    {L_GENRE}:
    {L_PUBLISHER}:
    {L_ISBN}: +    + {L_EDITION}: +
    {L_FORMAT}: +   + {L_PAGES_COUNT}: +
    {L_QUALITY}:
    {L_DESCRIPTION}:
    {L_MOREINFO}:
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/games.tpl b/upload/templates/default/topic_templates/games.tpl new file mode 100644 index 000000000..e2d7a9e37 --- /dev/null +++ b/upload/templates/default/topic_templates/games.tpl @@ -0,0 +1,151 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_GENRE}:
    {L_DEVELOPER}:
    {L_PUBLISHER}:
    {L_SOURCE_TYPE}: +   + {L_LOCALIZATION}:   + {L_MEDICINE}: +
    {L_PLATFORM}:
    {L_SYSREQ}:
    {L_DESCRIPTION}:
    {L_MOREINFO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/games_ps.tpl b/upload/templates/default/topic_templates/games_ps.tpl new file mode 100644 index 000000000..2f2452012 --- /dev/null +++ b/upload/templates/default/topic_templates/games_ps.tpl @@ -0,0 +1,157 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_GENRE}:
    {L_DEVELOPER}:
    {L_PUBLISHER}:
    {L_SOURCE_TYPE}: + {L_PLATFORM}:   + {L_REGION}:   + {L_MULTIPLAYER}:   +
    {L_TRANSLATION}: + {L_LOCALIZATION}:   + {L_TRANSLATION_TYPE}:   +
    {L_MEDIUM}: +   + {L_AGE}: +
    {L_DESCRIPTION}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/games_psp.tpl b/upload/templates/default/topic_templates/games_psp.tpl new file mode 100644 index 000000000..b1c82b6c6 --- /dev/null +++ b/upload/templates/default/topic_templates/games_psp.tpl @@ -0,0 +1,146 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_GENRE}:
    {L_DEVELOPER}:
    {L_PUBLISHER}:
    {L_SOURCE_TYPE}: + {L_VERSION}:   + {L_CD_IMAGE_TYPE}:   + {L_FIRMWARE}:   +
    {L_TRANSLATION}: + {L_LOCALIZATION}:   + {L_TRANSLATION_TYPE}:   +
    {L_DESCRIPTION}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/games_xbox.tpl b/upload/templates/default/topic_templates/games_xbox.tpl new file mode 100644 index 000000000..88548f060 --- /dev/null +++ b/upload/templates/default/topic_templates/games_xbox.tpl @@ -0,0 +1,153 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_GENRE}:
    {L_DEVELOPER}:
    {L_PUBLISHER}:
    {L_FIRMWARE}: +   +
    {L_SOURCE_TYPE}: +   + {L_REGION}:   + {L_CAN_PLAY_XBOX360}:   +
    {L_TRANSLATION}: + {L_LOCALIZATION}:   + {L_TRANSLATION_TYPE}:   +
    {L_DESCRIPTION}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/music.tpl b/upload/templates/default/topic_templates/music.tpl new file mode 100644 index 000000000..d5bc1a0a3 --- /dev/null +++ b/upload/templates/default/topic_templates/music.tpl @@ -0,0 +1,154 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_COVER}: URL
    {L_YEAR}:
    {L_COUNTRY}:
    {L_GENRE}:
    {L_PLAYTIME}:
    {L_FORMAT}: +   + {L_AUDIO_BITRATE}:   +
    {L_TRACKLIST}:
    {L_MOREINFO}:
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/progs.tpl b/upload/templates/default/topic_templates/progs.tpl new file mode 100644 index 000000000..60b6c262f --- /dev/null +++ b/upload/templates/default/topic_templates/progs.tpl @@ -0,0 +1,150 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_VERSION}: +   +   +
    {L_DEVELOPER}:
    {L_DEVELOPER_URL}: URL
    {L_PLATFORM}: + +   +   +
    {L_SYS_REQUIREMENTS}:
    {L_DESCRIPTION}:
    {L_MOREINFO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/progs_mac.tpl b/upload/templates/default/topic_templates/progs_mac.tpl new file mode 100644 index 000000000..91a752620 --- /dev/null +++ b/upload/templates/default/topic_templates/progs_mac.tpl @@ -0,0 +1,151 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}:
    {L_PICTURE}: URL
    {L_YEAR}:
    {L_VERSION}:
    {L_DEVELOPER}:
    {L_DEVELOPER_URL}: URL
    {L_PLATFORM}: +   +   +   +
    {L_SYS_REQUIREMENTS}:
    {L_DESCRIPTION}:
    {L_MOREINFO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/sport.tpl b/upload/templates/default/topic_templates/sport.tpl new file mode 100644 index 000000000..d928152e8 --- /dev/null +++ b/upload/templates/default/topic_templates/sport.tpl @@ -0,0 +1,154 @@ + + +

    {FORUM_NAME}

    + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}{L_TITLE}:
    {L_PICTURE}{L_PICTURE}: URL
    {L_SPORT_TYPE}{L_SPORT_TYPE}:
    {L_PARTICIPANTS}{L_PARTICIPANTS}:
    {L_PLAYTIME}{L_PLAYTIME}:
    {L_YEAR}{L_YEAR}:
    {L_COMMENTS}{L_COMMENTS}:
    {L_DESCRIPTION}{L_DESCRIPTION}:
    {L_MOREINFO}{L_MOREINFO}:
    {L_FORMAT}{L_FORMAT}: +   +   +   +   +
    {L_VIDEO}{L_VIDEO}:
    {L_AUDIO}{L_AUDIO}:
    {L_TORRENT}{L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/video.tpl b/upload/templates/default/topic_templates/video.tpl new file mode 100644 index 000000000..311eede5f --- /dev/null +++ b/upload/templates/default/topic_templates/video.tpl @@ -0,0 +1,171 @@ + + +

    {FORUM_NAME}

    + + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}{L_TITLE}: {L_TITLE_DESC}
    {L_ORIGINAL_TITLE}{L_ORIGINAL_TITLE}: {L_ORIGINAL_TITLE_DESC}
    {L_PICTURE}{L_PICTURE}: URL
    {L_COUNTRY}{L_COUNTRY}:
    {L_DIRECTOR}{L_DIRECTOR}:
    {L_GENRE}{L_GENRE}:
    {L_PLAYTIME}{L_PLAYTIME}:
    {L_YEAR}{L_YEAR}:
    {L_TRANSLATION}{L_TRANSLATION}:
    {L_CASTING}{L_CASTING}:
    {L_DESCRIPTION}{L_DESCRIPTION}:
    {L_MOREINFO}{L_MOREINFO}:
    {L_FORMAT}{L_FORMAT}: +   +   +   +   +
    {L_VIDEO}{L_VIDEO}:
    {L_AUDIO}{L_AUDIO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}{L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/video_home.tpl b/upload/templates/default/topic_templates/video_home.tpl new file mode 100644 index 000000000..36691588d --- /dev/null +++ b/upload/templates/default/topic_templates/video_home.tpl @@ -0,0 +1,159 @@ + + +

    {FORUM_NAME}

    + + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}{L_TITLE}:
    {L_PICTURE}{L_PICTURE}: URL
    {L_DIRECTOR}{L_DIRECTOR}:
    {L_GENRE}{L_GENRE}:
    {L_PLAYTIME}{L_PLAYTIME}:
    {L_YEAR}{L_YEAR}:
    {L_CASTING}{L_CASTING}:
    {L_DESCRIPTION}{L_DESCRIPTION}:
    {L_MOREINFO}{L_MOREINFO}:
    {L_FORMAT}{L_FORMAT}: +   +   +   +   +
    {L_VIDEO}{L_VIDEO}:
    {L_AUDIO}{L_AUDIO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}{L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/video_lesson.tpl b/upload/templates/default/topic_templates/video_lesson.tpl new file mode 100644 index 000000000..3f32160e7 --- /dev/null +++ b/upload/templates/default/topic_templates/video_lesson.tpl @@ -0,0 +1,136 @@ + + +

    {FORUM_NAME}

    + + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}{L_TITLE}:
    {L_YEAR}{L_YEAR}:
    {L_MANUFACTURER}:
    {L_MANUFACTURER_URL}: URL
    {L_DESCRIPTION}{L_DESCRIPTION}:
    {L_FORMAT}{L_FORMAT}: +   + +
    {L_VIDEO}{L_VIDEO}:
    {L_AUDIO}{L_AUDIO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}{L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/topic_templates/video_simple.tpl b/upload/templates/default/topic_templates/video_simple.tpl new file mode 100644 index 000000000..786ca599b --- /dev/null +++ b/upload/templates/default/topic_templates/video_simple.tpl @@ -0,0 +1,151 @@ + + +

    {FORUM_NAME}

    + + + + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_RELEASE_WELCOME}
    {L_TITLE}{L_TITLE}:
    {L_PICTURE}{L_PICTURE}: URL
    {L_COUNTRY}:
    {L_GENRE}{L_GENRE}:
    {L_PLAYTIME}{L_PLAYTIME}:
    {L_YEAR}{L_YEAR}:
    {L_DESCRIPTION}{L_DESCRIPTION}:
    {L_FORMAT}{L_FORMAT}: +   +   +   +   +
    {L_VIDEO}{L_VIDEO}:
    {L_AUDIO}{L_AUDIO}:
    {L_SCREEN_SHOTS}: URLs
    {L_TORRENT}{L_TORRENT}: +

    +

    {L_TORRENT_EXP}

    +
    + +
    + +
    diff --git a/upload/templates/default/torhelp.tpl b/upload/templates/default/torhelp.tpl new file mode 100644 index 000000000..e8f8592de --- /dev/null +++ b/upload/templates/default/torhelp.tpl @@ -0,0 +1,28 @@ + + +
    + + + + + + +
    {L_TORHELP_TITLE}
    +

    [ + {L_HIDE} + ]

    +
    • {TORHELP_TOPICS}
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/tpl_config.php b/upload/templates/default/tpl_config.php new file mode 100644 index 000000000..0560ad68d --- /dev/null +++ b/upload/templates/default/tpl_config.php @@ -0,0 +1,191 @@ +assign_vars(array( + 'IMG' => $_main, + + 'TEXT_BUTTONS' => $bb_cfg['text_buttons'], + 'POST_BTN_SPACER' => ($bb_cfg['text_buttons']) ? ' ' : '', + 'TOPIC_ATTACH_ICON' => '', + 'ATTACHMENT_ICON' => '', + 'OPEN_MENU_IMG_ALT1' => '', + + 'TOPIC_LEFT_COL_SPACER_WITDH' => $bb_cfg['topic_left_column_witdh'] - 8, // 8px padding +// Images auto-resize + 'POST_IMG_WIDTH_DECR_JS' => $bb_cfg['topic_left_column_witdh'] + $bb_cfg['post_img_width_decr'], + 'ATTACH_IMG_WIDTH_DECR_JS' => $bb_cfg['topic_left_column_witdh'] + $bb_cfg['attach_img_width_decr'], + + 'MAGNET_LINKS' => $bb_cfg['magnet_links_enabled'], +)); + +// post_buttons +if (!empty($page_cfg['load_tpl_vars']) AND $vars = array_flip($page_cfg['load_tpl_vars'])) +{ + if (isset($vars['post_buttons'])) + { + $template->assign_vars(array( + 'QUOTE_IMG' => ($bb_cfg['text_buttons']) ? $lang['REPLY_WITH_QUOTE_TXTB'] : 'Quote', + 'EDIT_POST_IMG' => ($bb_cfg['text_buttons']) ? $lang['EDIT_DELETE_POST_TXTB'] : 'Edit', + 'DELETE_POST_IMG' => ($bb_cfg['text_buttons']) ? $lang['DELETE_POST_TXTB'] : 'Delete', + 'IP_POST_IMG' => ($bb_cfg['text_buttons']) ? $lang['VIEW_IP_TXTB'] : 'IP', + 'MOD_POST_IMG' => ($bb_cfg['text_buttons']) ? $lang['MODERATE_POST_TXTB'] : 'Moderate', + + 'QUOTE_URL' => BB_ROOT ."posting.php?mode=quote&p=", + 'EDIT_POST_URL' => BB_ROOT ."posting.php?mode=editpost&p=", + 'DELETE_POST_URL' => BB_ROOT ."posting.php?mode=delete&p=", + 'IP_POST_URL' => BB_ROOT ."modcp.php?mode=ip&p=", + + 'PROFILE_IMG' => ($bb_cfg['text_buttons']) ? $lang['READ_PROFILE_TXTB'] : 'Profile', + 'PM_IMG' => ($bb_cfg['text_buttons']) ? $lang['SEND_PM_TXTB'] : 'PM', + 'EMAIL_IMG' => ($bb_cfg['text_buttons']) ? $lang['SEND_EMAIL_TXTB'] : 'email', + 'WWW_IMG' => ($bb_cfg['text_buttons']) ? $lang['VISIT_WEBSITE_TXTB'] : 'www', + 'ICQ_IMG' => ($bb_cfg['text_buttons']) ? $lang['ICQ_TXTB'] : 'ICQ', + + 'EMAIL_URL' => BB_ROOT ."profile.php?mode=email&u=", + 'FORUM_URL' => BB_ROOT . FORUM_URL, + 'ICQ_URL' => 'http://wwp.icq.com/scripts/search.dll?to=', + 'PM_URL' => BB_ROOT . PM_URL, + 'PROFILE_URL' => BB_ROOT . PROFILE_URL, + )); + } + if (isset($vars['post_icons'])) + { + $template->assign_vars(array( + 'MINIPOST_IMG' => 'post', + 'ICON_GOTOPOST' => 'goto', + 'MINIPOST_IMG_NEW' => 'new', + 'ICON_LATEST_REPLY' => 'latest', + 'ICON_NEWEST_REPLY' => 'newest', + )); + } + if (isset($vars['topic_icons'])) + { + $template->assign_vars(array( + 'MOVED' => TOPIC_MOVED, + 'ANNOUNCE' => POST_ANNOUNCE, + 'STICKY' => POST_STICKY, + 'LOCKED' => TOPIC_LOCKED, + 'L_MOVED' => $lang['TOPIC_MOVED'], + 'L_ANNOUNCE' => $lang['TOPIC_ANNOUNCEMENT'], + 'L_DL_TOPIC' => $lang['TOPIC_DL'], + 'L_POLL' => $lang['TOPIC_POLL'], + )); + } + if (isset($vars['pm_icons'])) + { + $template->assign_vars(array( + 'INBOX_IMG' => '', + 'OUTBOX_IMG' => '', + 'SENTBOX_IMG' => '', + 'SAVEBOX_IMG' => '', + )); + } +} \ No newline at end of file diff --git a/upload/templates/default/tracker.tpl b/upload/templates/default/tracker.tpl new file mode 100644 index 000000000..40339f8b9 --- /dev/null +++ b/upload/templates/default/tracker.tpl @@ -0,0 +1,439 @@ + + + + + + + + + + + + + +

    {PAGE_TITLE}

    + + + + + +
    + + + + + + + +
    +{S_HIDDEN_FIELDS} + + ++ + + + + + + + + +
    {L_TOR_SEARCH_TITLE}
    + + + + + + + + + + +
    +
    + + + + +
    +

    {CAT_FORUM_SELECT}

    +

    +
    +
    +
    +
    + {L_SORT_BY} +
    +

    {ORDER_SELECT}

    +

    +

    +
    +
    +
    + {L_TORRENTS_FROM} +
    +

    {TIME_SELECT}

    +
    +
    +
    + {L_SEED_NOT_SEEN} +
    +

    {S_NOT_SEEN_SELECT}

    +
    +
    +
    +
    + {L_SHOW_ONLY} +
    +

    {ONLY_MY_CHBOX}[®]

    +

    {ONLY_ACTIVE_CHBOX}

    +

    {SEED_EXIST_CHBOX}

    +

    {ONLY_NEW_CHBOX}[{MINIPOST_IMG_NEW}] 

    +
    +
    +
    + {L_MY_DOWNLOADS} +
    + + + + + + + + + +
    {DL_COMPL_CHBOX}{DL_WILL_CHBOX}
    {DL_DOWN_CHBOX}{DL_CANCEL_CHBOX}
    +
    +
    +
    +
    + {L_SHOW_COLUMN} +
    +

    {SHOW_CAT_CHBOX}  {SHOW_FORUM_CHBOX}  {SHOW_AUTHOR_CHBOX}  {SHOW_SPEED_CHBOX} 

    +
    +
    +
    + {L_AUTHOR} +
    +

    style="color: red" class="post" type="text" size="16" maxlength="{POSTER_NAME_MAX}" name="{POSTER_NAME_NAME}" value="{POSTER_NAME_VAL}" />

    +
    +
    +
    + {L_TITLE_MATCH} +
    +

    + +

    +

    + {ALL_WORDS_CHBOX} ·  + Помощь по поиску +

    +
    +
    +
    + +
    + +
    + +
    + +
    + + + + + + + +
    + + + + + + + +
    +   + + {L_DISPLAYING_OPTIONS} + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {L_CATEGORY}{L_FORUM}{L_TOPIC}{L_AUTHOR}{L_SIZE}SLCSP{L_ADDED}

     ® 

    {MINIPOST_IMG_NEW}{MINIPOST_IMG}
    {tor.TOR_STATUS_ICON}{tor.CAT_TITLE}{tor.FORUM_NAME} + onclick="ajax.view_post({tor.POST_ID}, this); return false;" href="{TOPIC_URL}{tor.TOPIC_ID}">{tor.TOPIC_TITLE}{tor.TOR_TYPE}{tor.TOPIC_TITLE} + {tor.USERNAME} + {tor.TOR_SIZE_RAW} + {tor.TOR_SIZE} {tor.MAGNET} + {tor.TOR_SIZE} + {tor.SEEDS}{tor.LEECHS}{tor.COMPLETED} +

    {tor.UL_SPEED}

    +

    {tor.DL_SPEED}

    +
    + {tor.ADDED_RAW} +

    {tor.ADDED_TIME}

    +

    {tor.ADDED_DATE}

    +
    {NO_MATCH_MSG}
     
    + +
    + + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    + + \ No newline at end of file diff --git a/upload/templates/default/usercp_attachcp.tpl b/upload/templates/default/usercp_attachcp.tpl new file mode 100644 index 000000000..87f8bb50e --- /dev/null +++ b/upload/templates/default/usercp_attachcp.tpl @@ -0,0 +1,113 @@ +

    {L_UACP} :: {USERNAME}

    + +
    +{S_USER_HIDDEN} + + + + + + +
    + {L_SORT_BY}: {S_MODE_SELECT} + {L_ORDER} {S_ORDER_SELECT} + +
    + + + + ++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #{L_POSTED_IN_TOPIC}{L_FILENAME}{L_FILECOMMENT}{L_EXTENSION}{L_SIZE}{L_DOWNLOADS}{L_POST_TIME}{L_DELETE}
    {attachrow.ROW_NUMBER}{attachrow.POST_TITLE}{attachrow.FILENAME}{attachrow.COMMENT}{attachrow.EXTENSION} + {attachrow.SIZE_RAW} +

    {attachrow.SIZE}

    +
    {attachrow.DOWNLOAD_COUNT} + {attachrow.POST_TIME_RAW} + {attachrow.POST_TIME} + {attachrow.S_DELETE_BOX}{attachrow.S_HIDDEN}
    + +
    + +
    + +

    + {L_MARK_ALL} + :: + {L_UNMARK_ALL} +

    + + +
    + +
    + + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    + + \ No newline at end of file diff --git a/upload/templates/default/usercp_avatar_gallery.tpl b/upload/templates/default/usercp_avatar_gallery.tpl new file mode 100644 index 000000000..b679896ad --- /dev/null +++ b/upload/templates/default/usercp_avatar_gallery.tpl @@ -0,0 +1,35 @@ + + +
    +{S_HIDDEN_FIELDS} + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_AVATAR_GALLERY}
    {L_SELECT_CATEGORY}: {S_CATEGORY_SELECT}
    +    + +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/usercp_email.tpl b/upload/templates/default/usercp_email.tpl new file mode 100644 index 000000000..8bc717d18 --- /dev/null +++ b/upload/templates/default/usercp_email.tpl @@ -0,0 +1,73 @@ +
    + + + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + + + + + + +
    {L_SEND_EMAIL_MSG}
    {L_RECIPIENT}{USERNAME}
    {L_SUBJECT}
    {L_MESSAGE_BODY}

    {L_MESSAGE_BODY_DESC}

    {L_OPTIONS}
    + +
    + +
    + + +
    + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    + + \ No newline at end of file diff --git a/upload/templates/default/usercp_register.tpl b/upload/templates/default/usercp_register.tpl new file mode 100644 index 000000000..9aa6a37bd --- /dev/null +++ b/upload/templates/default/usercp_register.tpl @@ -0,0 +1,200 @@ + + + +

    {PAGE_TITLE}

    + + + +
    + + + + + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Регистрационная информация
    Поля отмеченные * обязательны к заполнению
    Имя: *{USERNAME} +  
    Адрес email: *
    На этот адрес вам будет отправлено письмо для завершения регистрации
    readonly="readonly" style="color: gray;" /> +
    Текущий пароль: *
    Вы должны указать ваш текущий пароль, если хотите изменить его или поменять свой e-mail
    Новый пароль: *
    Указывайте пароль только если вы хотите его поменять
    Пароль: *
     максимум 20 символов
    Подтвердите пароль: *
    Подтверждать пароль нужно в том случае, если вы изменили его выше
    +
    Код подтверждения:{CAPTCHA_HTML}
    {L_AUTOLOGIN}:{L_RESET_AUTOLOGIN}
    {L_RESET_AUTOLOGIN_EXPL}
    TorrentPier
    {L_GEN_PASSKEY}
    {L_GEN_PASSKEY_EXPLAIN}
    {L_GEN_PASSKEY_EXPLAIN_2}
    {S_GEN_PASSKEY}
    {L_CURR_PASSKEY}{CURR_PASSKEY}
    Профиль
    Пол: + +
    ICQ:
    CommFort:
    Skype:
    Сайт:
    Род занятий:
    Интересы:
    Откуда: +
    +
    Часовой пояс:{TIMEZONE_SELECT}
    Личные настройки
    Опция управления подписью отключена за нарушение правил форума
    Подпись:
    максимум {$bb_cfg['max_sig_chars']} символов
    Уведомлять о новых личных сообщениях: +    + +
    {$bb_cfg['lang_hide_porno_forums']}: +    + +
    + +
    +
    + Для продолжения регистрации Вы должны принять наше ПОЛЬЗОВАТЕЛЬСКОЕ СОГЛАШЕНИЕ +
    + +
    +

    +
    +
    +
    +
    +   + +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/usercp_sendpasswd.tpl b/upload/templates/default/usercp_sendpasswd.tpl new file mode 100644 index 000000000..234624973 --- /dev/null +++ b/upload/templates/default/usercp_sendpasswd.tpl @@ -0,0 +1,33 @@ + + +
    +{S_HIDDEN_FIELDS} + + +++ + + + + + + + + + + + + + + + + + + +
    {L_FORGOTTEN_PASSWORD}
    {L_ITEMS_REQUIRED}
    {L_USERNAME}: *
    {L_EMAIL_ADDRESS}: *
    +   + +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/usercp_viewprofile.tpl b/upload/templates/default/usercp_viewprofile.tpl new file mode 100644 index 000000000..a2d1a76b0 --- /dev/null +++ b/upload/templates/default/usercp_viewprofile.tpl @@ -0,0 +1,371 @@ + + + +{action: "edit_user_profile", id: "user_regdate"} +{action: "edit_user_profile", id: "user_lastvisit"} + +{action: "edit_user_profile", id: "ignore_srv_load", editableType: "yesno-radio"} + + +{action: "edit_user_profile", id: "u_up_total"} +{action: "edit_user_profile", id: "u_down_total"} +{action: "edit_user_profile", id: "u_up_release"} +{action: "edit_user_profile", id: "u_up_bonus"} + + + + + + +

    {L_VIEWING_PROFILE}

    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_VIEW_TOR_PROF}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_DOWN_TOTAL}: + {DOWN_TOTAL} +
    {L_UP_TOTAL}: + {UP_TOTAL} +
    {L_TOTAL_RELEASED}: + {RELEASED} +  [ {L_SEARCH_RELEASES} ] +
    {L_BONUS}: + {UP_BONUS} +
    {L_MAX_SPEED}: + {SPEED_UP} / {SPEED_DOWN} +
    {L_USER_RATIO}: + + {USER_RATIO}  + [?] + + {L_IT_WILL_BE_DOWN} {MIN_DL_FOR_RATIO} + +
    Passkey:{AUTH_KEY}
    + +
    {L_CUR_ACTIVE_DLS}
    {L_RELEASINGS}{L_NONE}
    {L_FORUM}{L_TOPICS}
    {seed.releasedrow.FORUM_NAME}{seed.releasedrow.TOPIC_TITLE}
    {L_SEEDINGS}{L_NONE}
    {L_FORUM}{L_TOPICS}
    {seed.seedrow.FORUM_NAME}{seed.seedrow.TOPIC_TITLE}
    {L_LEECHINGS}{L_NONE}
    {L_FORUM}{L_TOPICS}%
    {leech.leechrow.FORUM_NAME}{leech.leechrow.TOPIC_TITLE}{leech.leechrow.COMPL_PERC}
    + + {L_SEARCH_DL_WILL_DOWNLOADS} + :: + {L_SEARCH_DL_DOWN} + :: + {L_SEARCH_DL_COMPLETE} + :: + {L_SEARCH_DL_CANCEL} + +
    + + +
    + + +
    +

    + +

    +
    + +
    + + + +
    + {L_MANAGE_USER}:  + {L_MANAGE}  + {L_PERMISSIONS} +
    + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/viewforum.tpl b/upload/templates/default/viewforum.tpl new file mode 100644 index 000000000..d1abf2275 --- /dev/null +++ b/upload/templates/default/viewforum.tpl @@ -0,0 +1,650 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    {FORUM_NAME}

    + +

    {L_MODERATORS}: {MODERATORS}

    + + +

    {LOGGED_IN_USER_LIST}

    + +
    {PAGINATION}
    + + + + + + +
    {T_POST_NEW_TOPIC}
    + + + + ++++++ + + + + + + + + + + + + + + + + + +
    {L_FORUM}{L_TOPICS}{L_POSTS_SHORT}{L_LASTPOST}
    {f.TOPIC_TYPE} + +

    {f.FORUM_DESC}

    +

    {L_MODERATORS}: {f.MODERATORS}

    +
    {f.TOPICS}{f.POSTS} + + + + + +
    + {f.last.LAST_TOPIC_TITLE} + {ICON_LATEST_REPLY} +
    +

    + {f.last.LAST_POST_TIME} + by + + {f.last.LAST_POST_USER_NAME} + + {f.last.LAST_POST_USER_NAME} + +

    + + + +

    {f.last.LAST_POST_TIME}

    +

    + + {f.last.LAST_POST_USER_NAME} + + {f.last.LAST_POST_USER_NAME} + + {ICON_LATEST_REPLY} +

    + + + + {L_NO_POSTS} + + +
    +
    + + + + + + + +
    + + + + + + + + + + + + + + +
    + {L_MODERATE_FORUM} + |{L_TOPICS_PER_PAGE}: +
    {SELECT_TPP}
    +
    +   + + {L_SEARCH_SELF}  |  + {L_DISPLAYING_OPTIONS} + + +
    + + value="{TITLE_MATCH}" class="found"class="error" + + value="{L_TITLE_SEARCH_HINT}" class="hint" + + style="width: 150px;" /> + +
    +
    + +
    + + + + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_TOPICS}{L_TORRENT}{L_REPLIES_SHORT}{L_LASTPOST}
    {t.TOPICS_SEPARATOR}
    +
    + {t.TOR_STATUS_ICON}· + {ICON_NEWEST_REPLY} + {L_MOVED} + {L_DL_TOPIC} + + {L_POLL} + + {TOPIC_ATTACH_ICON} + {t.TOPIC_TITLE} + + {t.TOR_TYPE}{t.TOPIC_TITLE} + +
    +
    + {t.TOPIC_AUTHOR_NAME} + {t.TOPIC_AUTHOR_NAME} +  [{ICON_GOTOPOST}{L_GOTO_SHORT} {t.PAGINATION} ] +
    +
    + +
    +
    {t.tor.SEEDERS} | {t.tor.LEECHERS}
    +
    {t.tor.TOR_SIZE}{t.tor.TOR_SIZE} {t.tor.MAGNET}
    +
    + +
    +

    + {t.REPLIES} + | + {t.VIEWS} +

    + +

    + {t.tor.COMPL_CNT} +

    + +
    +

    {t.LAST_POST_TIME}

    +

    + {t.LAST_POSTER_NAME}{t.LAST_POSTER_NAME} + {ICON_LATEST_REPLY} +

    +
    {NO_TOPICS}
    + +
    + {L_DISPLAY_TOPICS}: {S_SELECT_TOPIC_DAYS} {S_DISPLAY_ORDER} + +
    + +   + +
    + + + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_TOPICS}{L_REPLIES}{L_AUTHOR}{L_VIEWS}{L_LASTPOST}
    {t.TOPICS_SEPARATOR}
    + + {ICON_NEWEST_REPLY} + {L_MOVED} + {L_DL_TOPIC} + {TOPIC_ATTACH_ICON} + + {L_POLL} + {t.TOPIC_TITLE} + + [{ICON_GOTOPOST}{L_GOTO_SHORT} {t.PAGINATION} ] + {t.REPLIES}{t.TOPIC_AUTHOR_NAME}{t.TOPIC_AUTHOR_NAME}{t.VIEWS} +

    {t.LAST_POST_TIME}

    +

    + {t.LAST_POSTER_NAME}{t.LAST_POSTER_NAME} + {ICON_LATEST_REPLY} +

    +
    {NO_TOPICS}
    + +
    + {L_DISPLAY_TOPICS}: {S_SELECT_TOPIC_DAYS} {S_DISPLAY_ORDER} + +
    + +   + +
    + + + + + + + + +
    {T_POST_NEW_TOPIC}
    + + +
    + + + + + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + + +

    {L_MARK_TOPICS_READ}

    + + + + + + + +
    {S_AUTH_LIST} + + + + + + + + + + + + + + + + + + + +
    {L_NEW_POSTS}{L_POST_ANNOUNCEMENT}
    {L_NO_NEW_POSTS}{L_POST_STICKY}
    {L_NO_NEW_POSTS_LOCKED}{L_POST_DOWNLOAD}
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/viewonline.tpl b/upload/templates/default/viewonline.tpl new file mode 100644 index 000000000..2a1a09ad7 --- /dev/null +++ b/upload/templates/default/viewonline.tpl @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_USERNAME}{L_LAST_UPDATE}
    {TOTAL_REGISTERED_USERS_ONLINE}
    {reg_user_row.USERNAME}{reg_user_row.LASTUPDATE}
    {TOTAL_GUEST_USERS_ONLINE}
    {guest_user_row.USERNAME}{guest_user_row.LASTUPDATE}
    + +
    + +
    + +

    {L_ONLINE_EXPLAIN}

    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    \ No newline at end of file diff --git a/upload/templates/default/viewtopic.tpl b/upload/templates/default/viewtopic.tpl new file mode 100644 index 000000000..97e595d9c --- /dev/null +++ b/upload/templates/default/viewtopic.tpl @@ -0,0 +1,448 @@ + + + + + + + + + + + +
    + +

    {TOPIC_TITLE}

    + +

    {PAGINATION}

    + + + + + + + +
    + {T_POST_REPLY} +
    + + + + + + + + + +
    + + + + + + + + + + + + + + + + + +
    + {L_MODERATE_TOPIC}{L_MODERATE_TOPIC} + |{L_SELECT_PPP} +
    {SELECT_PPP}
    +
    +   + + {L_SEARCH_SELF}  |  + {L_DISPLAYING_OPTIONS} + + +
    + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_AUTHOR}{L_MESSAGE}
    + + +

    {postrow.POSTER_NAME}

    +

    {postrow.POSTER_AVATAR}

    + + +

    + {postrow.POSTER_NAME} +

    + +

    {postrow.POSTER_NAME}

    + + +

    {postrow.POSTER_RANK}

    +

    {postrow.RANK_IMAGE}

    +

    {postrow.POSTER_AVATAR}

    +

    {L_LONGEVITY}: {postrow.POSTER_JOINED}

    +

    {L_POSTS}: {postrow.POSTER_POSTS}

    +

    {L_LOCATION}: {postrow.POSTER_FROM}

    +

    {postrow.POSTER_FROM_FLAG}

    + + +

    + +
    + +
    +

    + {MINIPOST_IMG_NEW}{MINIPOST_IMG} + {postrow.POST_DATE} + + ({L_POSTED_AFTER} {postrow.POSTED_AFTER}) + +

    + + + +

    + {QUOTE_IMG}{POST_BTN_SPACER} + {EDIT_POST_IMG}{POST_BTN_SPACER} + {DELETE_POST_IMG}{POST_BTN_SPACER} + {IP_POST_IMG}{POST_BTN_SPACER} + {postrow.REPORT}{POST_BTN_SPACER} + + {MOD_POST_IMG}{POST_BTN_SPACER} + +

    +
    +
    + +
    +
    {postrow.MESSAGE}{postrow.ATTACHMENTS}
    + {postrow.SIGNATURE} +
    {postrow.EDITED_MESSAGE}
    +
    + +
    + + +   + +
    + {PROFILE_IMG}{POST_BTN_SPACER} + {PM_IMG}{POST_BTN_SPACER} +
    + + +
    + + + + + + + + +
    + + +
    + + + + + + + + + + + + + +
    {L_QUICK_REPLY}
    + +
    + +

    {L_QR_USERNAME}:

    + +
    + +
    +
    + +
    + + {L_QR_DISABLE}:  + + + + + +   + + + +   + + + +
    + +
    + + + + + + +
    +
    + {L_DISPLAY_POSTS}: {S_SELECT_POST_DAYS}  + {S_SELECT_POST_ORDER}  + +
    +
    + + + + + + + + + + +
    + {T_POST_REPLY} +
    + + +
    + +
    + +
    +

    {LAST_VISIT_DATE}

    +

    {CURRENT_TIME}

    +

    {S_TIMEZONE}

    +
    +
    + +
    + + + + + +
    {S_WATCH_TOPIC}
    +
    + +
    +
    {S_TOPIC_ADMIN}
    + + +
    + Admin:  + {L_LOGS}  +
    + + +
    +
    {S_DL_DELETE}
    + +
    +
    {S_AUTH_LIST}
    +
    +
    \ No newline at end of file diff --git a/upload/templates/default/viewtopic_attach.tpl b/upload/templates/default/viewtopic_attach.tpl new file mode 100644 index 000000000..4b8d715c3 --- /dev/null +++ b/upload/templates/default/viewtopic_attach.tpl @@ -0,0 +1,443 @@ + +
    +
    + + +
    +{ATTACHMENT_ICON} Attachment + +
    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    {postrow.attach.cat_stream.DOWNLOAD_NAME}
     {L_DESCRIPTION}: + + + + +
    {postrow.attach.cat_stream.COMMENT}
    +
     {L_FILESIZE}: {postrow.attach.cat_stream.FILESIZE} {postrow.attach.cat_stream.SIZE_VAR}
     {L_VIEWED}: {postrow.attach.cat_stream.DOWNLOAD_COUNT}

    + + + + + + + + + + + +

    +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    {postrow.attach.cat_swf.DOWNLOAD_NAME}
     {L_DESCRIPTION}: + + + + +
    {postrow.attach.cat_swf.COMMENT}
    +
     {L_FILESIZE}: {postrow.attach.cat_swf.FILESIZE} {postrow.attach.cat_swf.SIZE_VAR}
     {L_VIEWED}: {postrow.attach.cat_swf.DOWNLOAD_COUNT}

    + + + + + + + + +

    +
    +
    + + + +
    +{ATTACHMENT_ICON} Attachment ({postrow.attach.cat_images.FILESIZE} {postrow.attach.cat_images.SIZE_VAR}) +

    + img +

    + +

    + {postrow.attach.cat_images.COMMENT} +

    + +
    + +
    + + + +
    +{ATTACHMENT_ICON} Attachment Thumbnail + + + +

    + {postrow.attach.cat_thumb_images.COMMENT} +

    + +
    + +
    + + + +
    +{postrow.attach.attachrow.S_UPLOAD_IMAGE} Attachment + + +

    + {postrow.attach.attachrow.COMMENT} +

    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {postrow.attach.tor_not_reged.DOWNLOAD_NAME}
    {L_TRACKER}:{postrow.attach.tor_not_reged.TRACKER_LINK} +

    {postrow.attach.tor_not_reged.S_UPLOAD_IMAGE}

    +

    {L_DOWNLOAD}

    +

    {postrow.attach.tor_not_reged.FILESIZE}

    +
    {L_ADDED}:{postrow.attach.tor_not_reged.POSTED_TIME}
    {L_DOWNLOADED}:{postrow.attach.tor_not_reged.DOWNLOAD_COUNT}  [ {L_SHOW_DL_LIST} ]
    {postrow.attach.tor_not_reged.comment.COMMENT}
      + + + + + +   + +  
    + +
    + + + + + + + + +

    {TOR_BLOCKED_MSG}

    + +
    + + + + +

    {RATIO_WARN_MSG}

    + +
    + + + + + + + + + + + + + + + + + + + + + + + style="padding: 6px 4px;"> + {postrow.attach.tor_reged.TOR_STATUS_ICON} {postrow.attach.tor_reged.TOR_STATUS_TEXT} + {postrow.attach.tor_reged.TOR_STATUS_BY} + + +
    + + + {postrow.attach.tor_reged.TOR_STATUS_SELECT} + + [ Изменить ] + + + +
    + + + + + + + + + + + + + + + + +
    {postrow.attach.tor_reged.DOWNLOAD_NAME} {postrow.attach.tor_reged.MAGNET}
     {L_SILVER_STATUS} 
     {L_GOLD_STATUS} 
    {L_TRACKER}: + {postrow.attach.tor_reged.TRACKER_LINK}   + [ {postrow.attach.tor_reged.REGED_TIME} ] + + +

    {postrow.attach.tor_reged.S_UPLOAD_IMAGE}

    {L_DOWNLOAD}

    + + +

    {postrow.attach.tor_reged.S_UPLOAD_IMAGE}

    {L_DOWNLOAD}

    + +

    {postrow.attach.tor_reged.FILESIZE}

    +

    +
    {L_TOR_STATUS}:
    {L_COMPLETED}:{postrow.attach.tor_reged.COMPLETED}
    {L_SIZE}:{postrow.attach.tor_reged.TORRENT_SIZE}
    {postrow.attach.tor_reged.comment.COMMENT}
    + + + + + +   + + + {TOR_HELP_LINKS} + +   + +
    + + + + + + + +
    + + + + \ No newline at end of file diff --git a/upload/templates/default/viewtopic_attach_guest.tpl b/upload/templates/default/viewtopic_attach_guest.tpl new file mode 100644 index 000000000..663fe14ce --- /dev/null +++ b/upload/templates/default/viewtopic_attach_guest.tpl @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/upload/templates/default/viewtopic_poll.tpl b/upload/templates/default/viewtopic_poll.tpl new file mode 100644 index 000000000..966cf9cd1 --- /dev/null +++ b/upload/templates/default/viewtopic_poll.tpl @@ -0,0 +1,51 @@ +
    + + + + +
    + {S_HIDDEN_FIELDS} + +

    {POLL_QUESTION}

    + + + + + + + + +
    + +

    + +

    {L_VIEW_RESULTS}

    + +
    + + + + + + + +

    {POLL_QUESTION}

    + + + + + + + + + + + +
    {poll_option.POLL_OPTION_CAPTION} {poll_option.POLL_OPTION_PERCENT} {poll_option.POLL_OPTION_PERCENT} [ {poll_option.POLL_OPTION_RESULT} ]
    + +

    {L_TOTAL_VOTES} : {TOTAL_VOTES}

    + + + + +
    \ No newline at end of file diff --git a/upload/templates/default/viewtopic_torrent.tpl b/upload/templates/default/viewtopic_torrent.tpl new file mode 100644 index 000000000..ddeff4395 --- /dev/null +++ b/upload/templates/default/viewtopic_torrent.tpl @@ -0,0 +1,266 @@ + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {L_DL_LIST_AND_TORRENT_ACTIVITY} +
    {dl_users.users_row.DL_OPTION_NAME}
    {dl_users.users_row.DL_OPTION_USERS}
    + + + + + + + +
    {dl_counts.count_row.DL_OPTION_NAME}:[ {dl_counts.count_row.DL_OPTION_USERS} ]
    +
    + {L_SIZE}:  {TOR_SIZE}   |    + {L_IS_REGISTERED}:  {TOR_LONGEVITY}   |    + {L_COMPLETED}:  {TOR_COMPLETED} +
    DL-List: {L_NONE}
    + +

    {SEEDER_LAST_SEEN}

    + + + +
    + + + {L_SEEDERS}:  {SEED_COUNT}  [  {TOR_SPEED_UP}  ]   + + + {L_LEECHERS}:  {LEECH_COUNT}  [  {TOR_SPEED_DOWN}  ]   + + + + + {L_SPMODE_FULL} + +
    + +
    {L_SEEDERS}{SEED_LIST}
    +

    {SEEDER_LAST_SEEN}

    +
    {L_LEECHERS}{LEECH_LIST}
    + + +
    +

    {SEEDER_LAST_SEEN}

    +
    + + + +
    + + + + + + + + + + +
    +
    + +

    {L_SEEDERS}:

    + +

    + {L_SORT_BY}: {sfull.sorder.SEED_ORDER_SELECT} + +

    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Username + UL
    Ratio +
    Transfers + Speed + + IP + + + Port + +
    up + down + up + down +
    {sfull.srow.NAME}{sfull.srow.COMPL_PRC}{sfull.srow.UP_TOTAL}{sfull.srow.DOWN_TOTAL}{sfull.srow.SPEED_UP}{sfull.srow.SPEED_DOWN}{sfull.srow.ip.IP}{sfull.srow.port.PORT}
    + +
    + + + + + + + + + + + +
    +
    + +

    {L_LEECHERS}:

    + +

    + {L_SORT_BY}: {lfull.lorder.LEECH_ORDER_SELECT} + +

    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Username + % + Transfers + Speed + + IP + + + Port + +
    up + down + up + down +
    {lfull.lrow.NAME}{lfull.lrow.COMPL_PRC}{lfull.lrow.UP_TOTAL}{lfull.lrow.DOWN_TOTAL}{lfull.lrow.SPEED_UP}{lfull.lrow.SPEED_DOWN}{lfull.lrow.ip.IP}{lfull.lrow.port.PORT}
    + +
    + + +
    показаны данные только за текущую сессию
    + +
    + + +
    +   + +
    {DL_HIDDEN_FIELDS} +   +   +   + +
    + +   +
    +
    \ No newline at end of file diff --git a/upload/templates/limit_load_exit.php b/upload/templates/limit_load_exit.php new file mode 100644 index 000000000..a47a52e37 --- /dev/null +++ b/upload/templates/limit_load_exit.php @@ -0,0 +1,70 @@ +close(); +} +send_no_cache_headers(); + +$redirect_url = !empty($_POST['redirect']) ? $_POST['redirect'] : $_SERVER['REQUEST_URI']; + + + // LOG + global $userdata; + + if ($userdata['username']) + { + $name = html_entity_decode($userdata['username']); + } + else if (!empty($_POST['login_username'])) + { + $name = $_POST['login_username']; + } + else + { + $name = ''; + } + + $file = 'load/load-'. date('m-d'); + $str = array(); + $str[] = date('H:i:s'); + $str[] = sprintf('%-5s', floatval(LOADAVG)); + $str[] = sprintf('%-15s', $_SERVER['REMOTE_ADDR']); + $str[] = sprintf('%-20s', $name); + $str[] = $redirect_url; + $str = join(LOG_SEPR, $str) . LOG_LF; + bb_log($str, $file); + + +?> + + + + + <?php echo $bb_cfg['sitename']?> + + + + +
    + + +
    +

    Извините, в данный момент сервер перегружен.

    +

    Попробуйте зайти через несколько минут.

    +

    +
    + +
    + + + + + \ No newline at end of file diff --git a/upload/templates/topic_tpl_overall_header.html b/upload/templates/topic_tpl_overall_header.html new file mode 100644 index 000000000..699e02c49 --- /dev/null +++ b/upload/templates/topic_tpl_overall_header.html @@ -0,0 +1,51 @@ + + + + + + + + +
    Общие правила и положения
    + +
    + +

    Правила оформления раздач на трекере

    + +
    +
      +
    • + Все создающие раздачу (выкладывающие файл для общедоступного скачивания) обязаны контролировать содержимое этой раздачи по качеству (к примеру, отсутствие звука в фильмах, неснятая защита в программах, неработоспособность программы и т.п.). +
    • +
    • + Данная конференция ведется на русском языке. Для не имеющих возможности писать кириллицей в форум встроена виртуальная русская клавиатура и транслит, кроме того в интернете существует целый ряд подобных сервисов. Модераторы и администрация оставляют за собой право редактировать или удалять сообщения, написанные латиницей, без предупреждения. +
    • +
    • + Перед тем, как создавать раздачу, воспользуйтесь поиском - возможно такая раздача уже существует. +
    • +
    +
    + +

    Всем участникам раздач на данном трекере запрещается:

    + +
    +
      +
    • Создавать раздачу, дублирующую то, что уже существует на трекере. Дублирующей считается не отличающаяся ни по содержанию, ни по качеству информация.
    • +
    • Создавать раздачу, содержание которой нарушает общественные нормы морали, различные Базы Данных, отсутствующие в свободном законном доступе и т.п.
    • +
    • Выкладывать для общедоступного скачивания более двадцати раздач одновременно или по совокупности (исключение делается для пользователей с очень широким каналом, по личному разрешению Администрации). Пользователи, раздающие больше 20 раздач, будут предупреждаться. Если предупреждения не приведут к должному результату, то часть Ваших раздач будет приостановлена (а возможно, и удалена).
    • +
    +
    + +
    Решение по соответствию раздачи данным требованиям принимает Модератор или Администратор. В их полномочиях редактировать, перемещать, закрывать или удалять раздачу.
    + +
    + +
    + +
    \ No newline at end of file diff --git a/upload/templates/topic_tpl_rules_video.html b/upload/templates/topic_tpl_rules_video.html new file mode 100644 index 000000000..df0348915 --- /dev/null +++ b/upload/templates/topic_tpl_rules_video.html @@ -0,0 +1,99 @@ + + + + + + + +
    Правила оформления
    + +
    + +

    Перед тем, как начинать оформление раздачи, вы должны обязательно ознакомиться со следующими темами:

    + + +
    + + Является ли ваш релиз повтором + +
    + + Как получить информацию по видео файлу + +
    + + Как сделать скриншот с фильма + +
    + + Как залить скриншот на бесплатный хост + +
    + + Обозначение качества видео + +
    + + Как подписывать торрент файлы + +
    + + Как правильно писать на форуме + +
    + +

    Правила оформления раздач в этом разделе:

    + +
      + +
    • +Если при оформлении раздачи фильма вы указываете русское название, оно должно соответствовать названию под которым фильм выходил на территории Российской Федерации. Буквальный перевод оригинального названия не приветствуется. В названии темы должно быть название фильма на русском языке / на английском или на языке оригинала. +
    • +
    • +В раздаче должен обязательно присутствовать постер. +
    • +
    • +Также вы должны заполнить все графы в бланке по оформлению раздачи - продолжительность, перевод, страна, год создания фильма, режиссёр, актёры (в ролях), для чего вы можете воспользоваться авторитетными сайтами о кинематографии, такими как - IMdB либо VideoGuide. +
    • +
    • +Обязательно должно присутствовать хотя бы краткое описание сюжета фильма. +
    • +
    • +В описании обязательно должно присутствовать обозначение качества раздающегося материала, формат, а также параметры аудио и видео потоков. +
    • +
    • +При сознательном введении в заблуждение пользователей форума относительно качества раздаваемого материала, раздающему будет сделано предупреждение с запретом на дальнейшее оформление раздач. +
    • +
    • +Сриншоты при качестве фильма ниже DVDRip выкладывать обязательно. На качество DVDRip раздающий обязан выложить скриншоты по первому требованию пользователей ресурса. Скриншот должен быть сделан непосредственно с того видео файла, который раздаётся! +
    • +
    • +В имени торрент-файла должно присутствовать русское название фильма, написанное на латинице. Далее, в скобках, должно быть указано имя трекера. Например: Imja_Faila_[].torrent (если оригинальное название торрент-файла было Имя Файла.torrent). В названии торрент-файла и его содержимого, не должно присутствовать ссылок на другие ресурсы. +
    • +
    • +Если вы имеете принадлежность к одной из релиз-групп, то разрешается указывать в теме название вашей релиз-группы, но только в виде текста либо графического файла, не содержащих прямых ссылок на другой ресурс, иначе это будет расцениваться как реклама и данная ссылка будет удалена. При желании вы можете указать название релиз-группы раздаваемого фильма, не принадлежа к ней, но также без ссылок на другой ресурс. +
    • +
    • +Если по различного рода объективным причинам, в какое-то время суток вы будете отсутствовать на раздаче длительное время, являясь единственным сидом на ней, вы должны указать это. +
    • +
    • +При несоблюдении вышеперечисленных правил, либо в случае отсутствия сида на раздаче по истечении 2 часов после оформления, раздача будет перенесена в Тестовый форум, а раздающему будет сделано предупреждение. При наличии трёх предупреждений, аккаунт пользователя будет удалён без объяснения причины. Для проб используйте Тестовый форум. +
    • +
    • +При скорости отдачи (Upload) менее 12 кб/с не разрешается сидировать более 1-ого файла одновременно (другие раздачи и закачки на этот момент должны быть завершены). При нарушении данного условия все ваши последующие одновременные раздачи будут закрываться. Начав раздачу, вы должны довести её до конца, пока не появится минимум 3-5 скачавших. +
    • +
    • +Если вы по каким-либо причинам не смогли сделать что-либо из вышеперечисленного - оформлять раздачу напрямую в данном разделе запрещено, для этого существует Тестовый форум. +
    • + +
    + +
    + +
    + +
    + +
    diff --git a/upload/templates/xs_mod/tpl/cache.tpl b/upload/templates/xs_mod/tpl/cache.tpl new file mode 100644 index 000000000..0d679fd8d --- /dev/null +++ b/upload/templates/xs_mod/tpl/cache.tpl @@ -0,0 +1,43 @@ + +/*************************************************************************** + * cache.tpl + * --------- + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 55 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:55 + * + ***************************************************************************/ + + +

    {L_XS_MANAGE_CACHE}

    + +

    +{L_XS_MANAGE_CACHE_EXPLAIN2} +{RESULT} +

    + + + + + + + + + + + + + + + + + + + +
    {L_XS_MANAGE_CACHE}
    {L_XS_TEMPLATE}{L_XS_STYLES}{L_XS_CLEAR_ALL_LC}{L_XS_COMPILE_ALL_LC}
    {styles.TPL}{styles.STYLES}{L_XS_CLEAR_CACHE_LC}{L_XS_COMPILE_CACHE_LC}
    +
    \ No newline at end of file diff --git a/upload/templates/xs_mod/tpl/config.tpl b/upload/templates/xs_mod/tpl/config.tpl new file mode 100644 index 000000000..74ea40b78 --- /dev/null +++ b/upload/templates/xs_mod/tpl/config.tpl @@ -0,0 +1,171 @@ + +/*************************************************************************** + * confir.tpl + * ---------- + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 55 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:55 + * + ***************************************************************************/ + + +

    {L_XS_CONFIG_MAINTITLE}

    + +

    {L_XS_CONFIG_SUBTITLE}

    + + + + + + + + + + + + +
    {L_XS_CONFIG_UPDATED}
    + + + + + + + + + +
     
    {L_XS_CONFIG_UPDATED_EXPLAIN}
     
    +
    + + + + + + + + + + +
    {L_XS_CONFIG_WARNING}
    + + + + + + + + + +
     
    {L_XS_CONFIG_WARNING_EXPLAIN}
     
    +
    + + + + + + + + + + +
    {L_Error}
    + + + + + + + + + +
     
    {L_XS_FTP_COMMENT3}
     
    +
    + + + + + + + + + + +
    {L_Error}
    + + + + + + + + + +
     
    {ftperror.ERROR}
     
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_XS_CONFIG_TITLE}
    {L_XS_CONFIG_TPL_COMMENTS}
    {L_XS_CONFIG_TPL_COMMENTS_EXPLAIN}
      
    {L_XS_CONFIG_CACHE}
    {L_XS_CONFIG_USE_CACHE}
    {L_XS_CONFIG_USE_CACHE_EXPLAIN}
      
    {L_XS_CONFIG_AUTO_COMPILE}
    {L_XS_CONFIG_AUTO_COMPILE_EXPLAIN}
      
    {L_XS_CONFIG_AUTO_RECOMPILE}
    {L_XS_CONFIG_AUTO_RECOMPILE_EXPLAIN}
      
    {L_XS_CONFIG_PHP}
    {L_XS_CONFIG_PHP_EXPLAIN}
    {S_HIDDEN_FIELDS}
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {L_XS_DEBUG_HEADER}
    {L_XS_DEBUG_EXPLAIN}
    {XS_DEBUG_HDR1}
    {L_XS_DEBUG_TPL_NAME}{XS_DEBUG_FILENAME1}
    {L_XS_DEBUG_CACHE_FILENAME}{XS_DEBUG_FILENAME2}
    {L_XS_DEBUG_DATA}{XS_DEBUG_DATA}
    diff --git a/upload/templates/xs_mod/tpl/frameset.tpl b/upload/templates/xs_mod/tpl/frameset.tpl new file mode 100644 index 000000000..f95487b4c --- /dev/null +++ b/upload/templates/xs_mod/tpl/frameset.tpl @@ -0,0 +1,22 @@ + +/*************************************************************************** + * frameset.tpl + * ------------ + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 57 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:55 + * + ***************************************************************************/ + + + + + + +{L_XS_CLICK_HERE_LC} + \ No newline at end of file diff --git a/upload/templates/xs_mod/tpl/index.tpl b/upload/templates/xs_mod/tpl/index.tpl new file mode 100644 index 000000000..a8ce8bb8e --- /dev/null +++ b/upload/templates/xs_mod/tpl/index.tpl @@ -0,0 +1,34 @@ + +/*************************************************************************** + * index.tpl + * --------- + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 72 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:55 + * + ***************************************************************************/ + + +

    {L_XS_TITLE}

    + + + + + + + + + + + + + +
    {L_XS_MAIN_TITLE}
    {L_XS_CONFIGURATION}:
    {L_XS_CONFIGURATION_EXPLAIN}
    [{L_XS_SET_CONFIGURATION_LC}]
    {L_XS_MANAGE_CACHE}:
    {L_XS_MANAGE_CACHE_EXPLAIN}
    [{L_XS_MANAGE_CACHE_LC}]
    + +
    + diff --git a/upload/templates/xs_mod/tpl/message.tpl b/upload/templates/xs_mod/tpl/message.tpl new file mode 100644 index 000000000..481827aaa --- /dev/null +++ b/upload/templates/xs_mod/tpl/message.tpl @@ -0,0 +1,41 @@ + +/*************************************************************************** + * message.tpl + * ----------- + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 72 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:54 + * + ***************************************************************************/ + + + + + + + + + + + + + +
    {MESSAGE_TITLE}
    + + + + + + + + + +
     
    {MESSAGE_TEXT}
     
    + diff --git a/upload/templates/xs_mod/tpl/xs_footer.tpl b/upload/templates/xs_mod/tpl/xs_footer.tpl new file mode 100644 index 000000000..6c8cc65bb --- /dev/null +++ b/upload/templates/xs_mod/tpl/xs_footer.tpl @@ -0,0 +1,36 @@ + +/*************************************************************************** + * xs_footer.tpl + * ------------- + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 72 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:55 + * + ***************************************************************************/ + + + + + + +
    Powered by phpBB © phpBB Group and by eXtreme Styles mod © Vjacheslav Trushkin.
    + + + \ No newline at end of file diff --git a/upload/templates/xs_mod/tpl/xs_header.tpl b/upload/templates/xs_mod/tpl/xs_header.tpl new file mode 100644 index 000000000..969db4ba1 --- /dev/null +++ b/upload/templates/xs_mod/tpl/xs_header.tpl @@ -0,0 +1,40 @@ + +/*************************************************************************** + * xs_header.tpl + * ------------- + * copyright : (C) 2003 - 2005 CyberAlien + * support : http://www.phpbbstyles.com + * + * version : 2.3.1 + * + * file revision : 72 + * project revision : 78 + * last modified : 05 Dec 2005 13:54:54 + * + ***************************************************************************/ + + + + + + + + + + +
    + + + + + + +
    diff --git a/upload/tracker.php b/upload/tracker.php new file mode 100644 index 000000000..37ba89757 --- /dev/null +++ b/upload/tracker.php @@ -0,0 +1,914 @@ +session_start(array('req_login' => $bb_cfg['bt_tor_browse_only_reg'])); + +$tor_search_limit = (IS_AM) ? 2000 : 500; +$title_match_limit = 700; // больше $tor_search_limit т.к. ищет по всем темам, а не только по раздачам +$forum_select_size = (UA_OPERA) ? 21 : 24; // forum select box max rows +$max_forum_name_len = 60; // inside forum select box +$title_match_max_len = 60; +$poster_name_max_len = 25; +$tor_colspan = 13; // torrents table colspan with all columns +$per_page = $bb_cfg['topics_per_page']; +$tracker_url = basename(__FILE__); + +$time_format = 'H:i'; +$date_format = 'j-M-y'; +$row_class_1 = 'prow1'; +$row_class_2 = 'prow2'; + +$start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; + +$set_default = isset($_GET['def']); +$user_id = $userdata['user_id']; +$lastvisit = (!IS_GUEST) ? $userdata['user_lastvisit'] : ''; +$search_id = (isset($_GET['search_id']) && verify_id($_GET['search_id'], SEARCH_ID_LENGTH)) ? $_GET['search_id'] : ''; +$session_id = $userdata['session_id']; + +$cat_forum = $tor_to_show = $search_in_forums_ary = array(); +$title_match_sql = $title_match_q = $search_in_forums_csv = ''; +$tr_error = $poster_error = false; +$row_num = $tor_count = 0; + +$torrents_tbl = BB_BT_TORRENTS .' tor'; +$cat_tbl = BB_CATEGORIES .' c'; +$forums_tbl = BB_FORUMS .' f'; +$topics_tbl = BB_TOPICS .' t'; +$users_tbl = BB_USERS .' u'; +$tracker_tbl = BB_BT_TRACKER .' tr'; +$tr_snap_tbl = BB_BT_TRACKER_SNAP .' sn'; +$dl_stat_tbl = BB_BT_DLSTATUS .' dl'; + +// +// Search options +// +// Key values +$search_all = -1; +$never = -2; + +$sort_asc = 1; +$sort_desc = 2; + +$ord_posted = 1; +$ord_name = 2; +$ord_compl = 4; +$ord_repl = 5; +$ord_views = 6; +$ord_size = 7; +$ord_last_p = 8; +$ord_last_s = 9; +$ord_seeders = 10; +$ord_leechers = 11; +$ord_sp_up = 12; +$ord_sp_down = 13; + +// Order options +$order_opt = array( + $ord_posted => array( + 'lang' => $lang['IS_REGISTERED'], + 'sql' => 'tor.reg_time', + ), + $ord_name => array( + 'lang' => $lang['BT_TOPIC_TITLE'], + 'sql' => 't.topic_title', + ), + $ord_compl => array( + 'lang' => $lang['COMPLETED'], + 'sql' => 'tor.complete_count', + ), + $ord_seeders => array( + 'lang' => 'Seeders', + 'sql' => 'sn.seeders', + ), + $ord_leechers => array( + 'lang' => 'Leechers', + 'sql' => 'sn.leechers', + ), + $ord_sp_up => array( + 'lang' => 'Speed UP', + 'sql' => 'sn.speed_up', + ), + $ord_sp_down => array( + 'lang' => 'Speed DOWN', + 'sql' => 'sn.speed_down', + ), + $ord_repl => array( + 'lang' => $lang['BT_REPLIES'], + 'sql' => 't.topic_replies', + ), + $ord_views => array( + 'lang' => $lang['BT_VIEWS'], + 'sql' => 't.topic_views', + ), + $ord_size => array( + 'lang' => $lang['SIZE'], + 'sql' => 'tor.size', + ), + $ord_last_p => array( + 'lang' => $lang['BT_LAST_POST'], + 'sql' => 't.topic_last_post_id', + ), + $ord_last_s => array( + 'lang' => $lang['BT_SEEDER_LAST_SEEN'], + 'sql' => 'tor.seeder_last_seen', + ), +); +$order_select = array(); +foreach ($order_opt as $val => $opt) +{ + $order_select[$opt['lang']] = $val; +} + +// Sort direction +$sort_opt = array( + $sort_asc => array( + 'lang' => $lang['ASC'], + 'sql' => 'ASC', + ), + $sort_desc => array( + 'lang' => $lang['DESC'], + 'sql' => 'DESC', + ), +); + +// Previous days +$time_opt = array( + $search_all => array( + 'lang' => $lang['BT_ALL_DAYS_FOR'], + 'sql' => 0, + ), + 1 => array( + 'lang' => $lang['BT_1_DAY_FOR'], + 'sql' => TIMENOW - 86400, + ), + 3 => array( + 'lang' => $lang['BT_3_DAY_FOR'], + 'sql' => TIMENOW - 86400*3, + ), + 7 => array( + 'lang' => $lang['BT_7_DAYS_FOR'], + 'sql' => TIMENOW - 86400*7, + ), + 14 => array( + 'lang' => $lang['BT_2_WEEKS_FOR'], + 'sql' => TIMENOW - 86400*14, + ), + 30 => array( + 'lang' => $lang['BT_1_MONTH_FOR'], + 'sql' => TIMENOW - 86400*30, + ), +); +$time_select = array(); +foreach ($time_opt as $val => $opt) +{ + $time_select[$opt['lang']] = $val; +} + +// Seeder not seen +$s_not_seen_opt = array( + $search_all => array( + 'lang' => $lang['BT_DISREGARD'], + 'sql' => 0, + ), + 1 => array( + 'lang' => $lang['BT_1_DAY'], + 'sql' => TIMENOW - 86400, + ), + 3 => array( + 'lang' => $lang['BT_3_DAYS'], + 'sql' => TIMENOW - 86400*3, + ), + 7 => array( + 'lang' => $lang['BT_7_DAYS'], + 'sql' => TIMENOW - 86400*7, + ), + 14 => array( + 'lang' => $lang['BT_2_WEEKS'], + 'sql' => TIMENOW - 86400*14, + ), + 30 => array( + 'lang' => $lang['BT_1_MONTH'], + 'sql' => TIMENOW - 86400*30, + ), + $never => array( + 'lang' => $lang['BT_NEVER'], + 'sql' => 0, + ), +); +$s_not_seen_select = array(); +foreach ($s_not_seen_opt as $val => $opt) +{ + $s_not_seen_select[$opt['lang']] = $val; +} + +$GPC = array( +# var_name key_name def_value GPC type + 'all_words' => array('allw', 1, CHBOX), + 'active' => array('a', 0, CHBOX), + 'cat' => array('c', null, REQUEST), + 'dl_cancel' => array('dla', 0, CHBOX), + 'dl_compl' => array('dlc', 0, CHBOX), + 'dl_down' => array('dld', 0, CHBOX), + 'dl_will' => array('dlw', 0, CHBOX), + 'forum' => array('f', $search_all, REQUEST), + 'my' => array('my', 0, CHBOX), + 'new' => array('new', 0, CHBOX), + 'title_match' => array('nm', null, REQUEST), + 'order' => array('o', $ord_posted, SELECT), + 'poster_id' => array('pid', null, GET), + 'poster_name' => array('pn', null, REQUEST), + 'user_releases' => array('rid', null, GET), + 'sort' => array('s', $sort_desc, SELECT), + 'seed_exist' => array('sd', 0, CHBOX), + 'show_author' => array('da', 1, CHBOX), + 'show_cat' => array('dc', 0, CHBOX), + 'show_forum' => array('df', 1, CHBOX), + 'show_speed' => array('ds', 0, CHBOX), + 's_not_seen' => array('sns', $search_all, SELECT), + 'time' => array('tm', $search_all, SELECT), +); + +// Define all GPC vars with default values +foreach ($GPC as $name => $params) +{ + ${"{$name}_key"} = $params[KEY_NAME]; + ${"{$name}_val"} = $params[DEF_VAL]; +} + +if (isset($_GET[$user_releases_key])) +{ + // Search releases by user + $_GET[$poster_id_key] = (int) $_GET[$user_releases_key]; + $_REQUEST[$forum_key] = $search_all; +} +else if (!empty($_REQUEST['max'])) +{ + $_REQUEST[$forum_key] = $search_all; +} +else +{ + // Get "checkbox" and "select" vars + foreach ($GPC as $name => $params) + { + if ($params[GPC_TYPE] == CHBOX) + { + checkbox_get_val($params[KEY_NAME], ${"{$name}_val"}, $params[DEF_VAL]); + } + else if ($params[GPC_TYPE] == SELECT) + { + select_get_val($params[KEY_NAME], ${"{$name}_val"}, ${"{$name}_opt"}, $params[DEF_VAL]); + } + } +} + +// Restore torrents list and search settings if we have valid $search_id +$tor_list_ary = array(); +$tor_list_sql = ''; + +if ($search_id) +{ + $row = DB()->fetch_row(" + SELECT search_array, search_settings + FROM ". BB_SEARCH ." + WHERE session_id = '$session_id' + AND search_type = ". SEARCH_TYPE_TRACKER ." + AND search_id = '$search_id' + LIMIT 1 + "); + + if (empty($row['search_settings'])) + { + bb_die($lang['SESSION_EXPIRED']); + } + + $previous_settings = unserialize($row['search_settings']); + $tor_list_sql = $row['search_array']; + $tor_list_ary = explode(',', $tor_list_sql); + $tor_count = count($tor_list_ary); + unset($row); +} + +// Get allowed for searching forums list +if (!$forums = $datastore->get('cat_forums')) +{ + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); +} +$cat_title_html = $forums['cat_title_html']; +$forum_name_html = $forums['forum_name_html']; + +$excluded_forums_csv = $user->get_excluded_forums(AUTH_READ); +$allowed_forums = array_diff(explode(',', $forums['tracker_forums']), explode(',', $excluded_forums_csv)); + +foreach ($allowed_forums as $forum_id) +{ + $f = $forums['f'][$forum_id]; + $cat_forum['c'][$f['cat_id']][] = $forum_id; + + if ($f['forum_parent']) + { + $cat_forum['subforums'][$forum_id] = true; + $cat_forum['forums_with_sf'][$f['forum_parent']] = true; + } +} +unset($forums); +$datastore->rm('cat_forums'); + +// Get current search settings +if (!$set_default) +{ + // Search in forum or category + // Get requested cat_id + $search_in_forums_fary = array(); + + if ($req_cat_id =& $_REQUEST[$cat_key]) + { + if (isset($cat_forum['c'][$req_cat_id])) + { + $valid_forums = $cat_forum['c'][$req_cat_id]; + $forum_val = join(',', $valid_forums); + } + } + // Get requested forum_id(s) + else if ($req_forums =& $_REQUEST[$forum_key]) + { + if ($req_forums != $search_all) + { + $req_forums = (array) $req_forums; + array_deep($req_forums, 'intval'); + $valid_forums = array_intersect($req_forums, $allowed_forums); + $forum_val = join(',', $valid_forums); + } + } + else if (isset($previous_settings[$forum_key])) + { + $valid_forums = array_intersect(explode(',', $previous_settings[$forum_key]), $allowed_forums); + $forum_val = join(',', $valid_forums); + } + + if ($forum_val && $forum_val != $search_all) + { + $search_in_forums_ary = array_slice(explode(',', $forum_val), 0, $max_forums_selected); + $search_in_forums_fary = array_flip($search_in_forums_ary); + $search_in_forums_csv = join(',', $search_in_forums_ary); + $forum_val = $search_in_forums_csv; + } + else + { + $forum_val = $search_all; + } + + // Get poster_id + if (!$my_val) + { + $req_poster_id = ''; + + if (isset($_GET[$poster_id_key]) && !$search_id) + { + $req_poster_id = intval($_GET[$poster_id_key]); + } + else if (isset($_POST[$poster_name_key]) && !$search_id) + { + if ($req_poster_name = clean_username($_POST[$poster_name_key])) + { + $poster_name_sql = str_replace("\\'", "''", $req_poster_name); + + if ($poster_id = get_user_id($poster_name_sql)) + { + $poster_id_val = $poster_id; + $poster_name_val = stripslashes(html_entity_decode($req_poster_name)); + } + else + { + $poster_name_val = $lang['BT_USER_NOT_FOUND']; + $tr_error = $poster_error = true; + } + } + } + else if ($search_id && $previous_settings[$poster_id_key]) + { + $poster_id_val = intval($previous_settings[$poster_id_key]); + $poster_name_val = ($previous_settings[$poster_name_key]) ? $previous_settings[$poster_name_key] : ''; + } + + if ($req_poster_id) + { + if ($req_poster_id == ANONYMOUS) + { + $poster_id_val = ANONYMOUS; + $poster_name_val = $lang['GUEST']; + } + else if ($poster_name_val = get_username($req_poster_id)) + { + $poster_name_val = stripslashes(html_entity_decode($poster_name_val)); + $poster_id_val = $req_poster_id; + } + } + } + + if ($tm =& $_REQUEST[$title_match_key] AND is_string($tm)) + { + if ($tmp = mb_substr(trim($tm), 0, $title_match_max_len)) + { + $title_match_val = $tmp; + $title_match_sql = clean_text_match($title_match_val, true, false, false); + } + } +} + +$dl_status = array(); +if ($dl_cancel_val) $dl_status[] = DL_STATUS_CANCEL; +if ($dl_compl_val) $dl_status[] = DL_STATUS_COMPLETE; +if ($dl_down_val) $dl_status[] = DL_STATUS_DOWN; +if ($dl_will_val) $dl_status[] = DL_STATUS_WILL; +$dl_status_csv = join(',', $dl_status); + +// Switches +$only_new = ($new_val && !IS_GUEST); +$seed_exist = (bool) $seed_exist_val; +$only_active = ($active_val || $seed_exist); +$dl_search = ($dl_status && !IS_GUEST); +$only_my = ($my_val && !IS_GUEST && !$dl_search); +$prev_days = ($time_val != $search_all); +$poster_id = (bool) $poster_id_val; +$title_match = (bool) $title_match_sql; +$s_not_seen = ($s_not_seen_val != $search_all); + +$hide_cat = intval(!$show_cat_val); +$hide_forum = intval(!$show_forum_val); +$hide_author = intval(!$show_author_val); +$hide_speed = intval(!$show_speed_val); + +if ($s_not_seen_val != $search_all) +{ + $seed_exist_val = 0; +} +if ($seed_exist_val) +{ + $active_val = 1; +} +if ($dl_search) +{ + $my_val = 0; +} + +if ($allowed_forums) +{ + // Text search + $search_match_topics_csv = ''; + + if ($title_match) + { + $title_match_topics = get_title_match_topics($title_match_sql, $title_match_limit, $search_in_forums_ary); + + if (!$search_match_topics_csv = join(',', $title_match_topics)) + { + $tr_error = true; + } + } + else + { + $title_match_val = ''; + } + + // Get torrents list + if (!$tr_error && !$tor_list_sql) + { + $reg_time = $time_opt[$time_val]['sql']; + $poster_id_sql = (int) $poster_id_val; + $s_seen_time = $s_not_seen_opt[$s_not_seen_val]['sql']; + $s_seen_sign = ($s_not_seen_val == $never) ? '=' : '<'; + $s_seen_exclude = ($s_not_seen_val == $never) ? '' : "AND tor.seeder_last_seen != 0"; + $order_by_peers = ($order_val == $ord_seeders || $order_val == $ord_leechers); + $order_by_speed = ($order_val == $ord_sp_up || $order_val == $ord_sp_down); + + $join_t = in_array($order_val, array($ord_name, $ord_repl, $ord_views, $ord_last_p, $title_match)); + $join_sn = ($only_active || $order_by_peers || $order_by_speed); + $join_dl = $dl_search; + + // Start building SQL + $SQL = DB()->get_empty_sql_array(); + + // SELECT + $SQL['SELECT'][] = "tor.topic_id"; + + // FROM + $SQL['FROM'][] = $torrents_tbl; + + if ($join_t) + { + $SQL['INNER JOIN'][] = "$topics_tbl ON(t.topic_id = tor.topic_id)"; + } + if ($join_sn) + { + $SQL['LEFT JOIN'][] = "$tr_snap_tbl ON(sn.topic_id = tor.topic_id)"; + } + if ($join_dl) + { + $SQL['INNER JOIN'][] = "$dl_stat_tbl ON( + dl.topic_id = tor.topic_id + AND dl.user_id = $user_id + AND dl.user_status IN($dl_status_csv) + )"; + } + + // WHERE + $title_match_notfound_flag = false; + if ($search_match_topics_csv) + { + $SQL['WHERE'][] = "tor.topic_id IN($search_match_topics_csv)"; + } + if ($search_in_forums_csv) + { + $SQL['WHERE'][] = "tor.forum_id IN($search_in_forums_csv)"; + } + if ($excluded_forums_csv) + { + $SQL['WHERE'][] = "tor.forum_id NOT IN($excluded_forums_csv)"; + } + if ($poster_id) + { + $SQL['WHERE'][] = "tor.poster_id = $poster_id_sql"; + } + if ($only_new) + { + $SQL['WHERE'][] = "tor.reg_time > $lastvisit"; + } + if ($prev_days) + { + $SQL['WHERE'][] = "tor.reg_time > $reg_time"; + } + if ($s_not_seen) + { + $SQL['WHERE'][] = "tor.seeder_last_seen $s_seen_sign $s_seen_time $s_seen_exclude"; + } + if ($only_my) + { + $SQL['WHERE'][] = "tor.poster_id = $user_id"; + } + if ($only_active) + { + $SQL['WHERE'][] = "sn.topic_id IS NOT NULL"; + } + if ($seed_exist) + { + $SQL['WHERE'][] = "sn.seeders >= 1"; + } + + // ORDER + $SQL['ORDER BY'][] = "{$order_opt[$order_val]['sql']} {$sort_opt[$sort_val]['sql']}"; + + // LIMIT + $SQL['LIMIT'][] = $tor_search_limit; + + if ($title_match && $title_match_notfound_flag) + { + $tor_list_sql = ''; + $tor_count = 0; + } + else + { + foreach (DB()->fetch_rowset($SQL) as $row) + { + $tor_list_ary[] = $row['topic_id']; + } + $tor_list_sql = join(',', $tor_list_ary); + $tor_count = count($tor_list_ary); + } + } + + if (!$tor_list_sql || $start > $tor_count) + { + $template->assign_vars(array( + 'TOR_NOT_FOUND' => true, + 'NO_MATCH_MSG' => $lang['NO_MATCH'], + )); + } + else + { + // Save result in DB + if ($tor_count > $per_page && !$search_id) + { + $search_id = make_rand_str(SEARCH_ID_LENGTH); + $search_type = SEARCH_TYPE_TRACKER; + + $columns = 'session_id, search_type, search_id, search_time, search_settings, search_array'; + $values = "'$session_id', $search_type, '$search_id', ". TIMENOW .", '$curr_set_sql', '$tor_list_sql'"; + + DB()->query("REPLACE INTO ". BB_SEARCH ." ($columns) VALUES ($values)"); + } + unset($columns, $values, $curr_set_sql, $tor_list_sql); + + $tor_to_show = ($tor_count > $per_page) ? array_slice($tor_list_ary, $start, $per_page) : $tor_list_ary; + + if (!$tor_to_show = join(',', $tor_to_show)) + { + bb_die($lang['NO_SEARCH_MATCH']); + } + + // SELECT + $select = " + SELECT + tor.topic_id, tor.post_id, tor.attach_id, tor.size, tor.reg_time, tor.complete_count, tor.seeder_last_seen, tor.tor_status, tor.tor_type, + t.topic_title, t.topic_replies, t.topic_views, sn.seeders, sn.leechers, tor.info_hash + "; + $select .= (!$hide_speed) ? ", sn.speed_up, sn.speed_down" : ''; + $select .= (!$hide_forum) ? ", tor.forum_id" : ''; + $select .= (!$hide_cat) ? ", f.cat_id" : ''; + $select .= (!$hide_author) ? ", tor.poster_id, u.username" : ''; + $select .= (!IS_GUEST) ? ", dl.user_status AS dl_status" : ''; + + // FROM + $from = " + FROM $torrents_tbl + LEFT JOIN $topics_tbl ON(t.topic_id = tor.topic_id) + "; + $from .= (!$hide_cat) ? " + LEFT JOIN $forums_tbl ON(f.forum_id = t.forum_id) + " : ''; + $from .= (!$hide_author) ? " + LEFT JOIN $users_tbl ON(u.user_id = tor.poster_id) + " : ''; + $from .= (!IS_GUEST) ? " + LEFT JOIN $dl_stat_tbl ON(dl.topic_id = tor.topic_id AND dl.user_id = $user_id) + " : ''; + $from .= "LEFT JOIN $tr_snap_tbl ON(sn.topic_id = tor.topic_id)"; + + // WHERE + $where = " + WHERE tor.topic_id IN($tor_to_show) + "; + + // ORDER + $order = "ORDER BY ". $order_opt[$order_val]['sql']; + + // SORT + $sort = $sort_opt[$sort_val]['sql']; + + // LIMIT + $limit = "LIMIT $per_page"; + + $sql = " + $select + $from + $where + $order + $sort + $limit + "; + + $passkey = DB()->fetch_row("SELECT auth_key FROM ". BB_BT_USERS ." WHERE user_id = ". (int) $user_id ." LIMIT 1"); + // Build torrents table + foreach (DB()->fetch_rowset($sql) as $tor) + { + $dl = isset($tor['speed_down']) ? $tor['speed_down'] : 0; + $ul = isset($tor['speed_up']) ? $tor['speed_up'] : 0; + + $seeds = $tor['seeders']; + $leechs = $tor['leechers']; + $s_last = $tor['seeder_last_seen']; + $att_id = $tor['attach_id']; + $size = $tor['size']; + $tor_magnet = create_magnet($tor['info_hash'], $passkey['auth_key'], $userdata['session_logged_in']); + $compl = $tor['complete_count']; + $dl_sp = ($dl) ? humn_size($dl, 0, 'KB') .'/s' : '0 KB/s'; + $ul_sp = ($ul) ? humn_size($ul, 0, 'KB') .'/s' : '0 KB/s'; + + $dl_class = isset($tor['dl_status']) ? $dl_link_css[$tor['dl_status']] : 'genmed'; + $row_class = !($row_num & 1) ? $row_class_1 : $row_class_2; + $row_num++; + + $cat_id = (!$hide_cat && isset($tor['cat_id'])) ? $tor['cat_id'] : ''; + $forum_id = (!$hide_forum && isset($tor['forum_id'])) ? $tor['forum_id'] : ''; + $poster_id = (!$hide_author && isset($tor['poster_id'])) ? $tor['poster_id'] : ''; + + // Gold/Silver releases mod + $is_gold = ''; + if ($bb_cfg['gold_silver_enabled']) + { + if ($tor['tor_type'] == TOR_TYPE_GOLD) + { + $is_gold = ' '; + } + elseif ($tor['tor_type'] == TOR_TYPE_SILVER) + { + $is_gold = ' '; + } + } + // END Gold/Silver releases mod + + $template->assign_block_vars('tor', array( + 'CAT_ID' => $cat_id, + 'CAT_TITLE' => ($cat_id) ? $cat_title_html[$cat_id] : '', + 'FORUM_ID' => $forum_id, + 'FORUM_NAME' => ($forum_id) ? $forum_name_html[$forum_id] : '', + 'TOPIC_ID' => $tor['topic_id'], + 'TOPIC_TITLE' => wbr($tor['topic_title']), + 'POST_ID' => $tor['post_id'], + 'POSTER_ID' => $poster_id, + 'USERNAME' => isset($tor['username']) ? wbr($tor['username']) : '', + + 'ROW_CLASS' => $row_class, + 'ROW_NUM' => $row_num, + 'DL_CLASS' => $dl_class, + 'IS_NEW' => (!IS_GUEST && $tor['reg_time'] > $lastvisit), + 'USER_AUTHOR' => (!IS_GUEST && $poster_id == $user_id), + + 'ATTACH_ID' => $att_id, + 'MAGNET' => $tor_magnet, + 'TOR_TYPE' => $is_gold, + + 'TOR_FROZEN' => isset($bb_cfg['tor_frozen'][$tor['tor_status']]), + 'TOR_STATUS_ICON' => $bb_cfg['tor_icons'][$tor['tor_status']], + 'TOR_STATUS_TEXT' => $lang['tor_status'][$tor['tor_status']], + + 'TOR_SIZE_RAW' => $size, + 'TOR_SIZE' => humn_size($size), + 'UL_SPEED' => $ul_sp, + 'DL_SPEED' => $dl_sp, + 'SEEDS' => ($seeds) ? $seeds : 0, + 'SEEDS_TITLE' => ($seeds) ? 'Seeders' : (" Last seen: \n ". (($s_last) ? bb_date($s_last, $date_format) : 'Never')), + 'LEECHS' => ($leechs) ? $leechs : 0, + 'COMPLETED' => ($compl) ? $compl : 0, + 'REPLIES' => $tor['topic_replies'], + 'VIEWS' => $tor['topic_views'], + 'ADDED_RAW' => $tor['reg_time'], + 'ADDED_TIME' => bb_date($tor['reg_time'], $time_format), + 'ADDED_DATE' => bb_date($tor['reg_time'], $date_format), + )); + } + } +} +else +{ + $template->assign_vars(array( + 'TOR_NOT_FOUND' => true, + 'NO_MATCH_MSG' => $lang['BT_NO_SEARCHABLE_FORUMS'], + )); +} + +// Pagination +if ($tor_count) +{ + $base_url = "$tracker_url?search_id=$search_id"; + $search_matches = ($tor_count == 1) ? sprintf($lang['FOUND_SEARCH_MATCH'], $tor_count) : sprintf($lang['FOUND_SEARCH_MATCHES'], $tor_count); + $search_max = "(max: $tor_search_limit)"; + + $template->assign_vars(array( + 'MATCHES' => $search_matches, + 'SERACH_MAX' => $search_max, + 'PAGINATION' => generate_pagination($base_url, $tor_count, $per_page, $start), + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], (floor($start / $per_page) + 1), ceil($tor_count / $per_page)), + )); +} + +if(empty($cat_forum)) +{ + message_die(GENERAL_MESSAGE, $lang['BT_NO_SEARCHABLE_FORUMS']); +} + +// Forum select +$opt = ''; +foreach ($cat_forum['c'] as $cat_id => $forums_ary) +{ + $opt .= '\n"; + + foreach ($forums_ary as $forum_id) + { + $forum_name = $forum_name_html[$forum_id]; + $forum_name = str_short($forum_name, $max_forum_name_len-2); + $style = ''; + if (!isset($cat_forum['subforums'][$forum_id])) + { + $class = 'root_forum'; + $class .= isset($cat_forum['forums_with_sf'][$forum_id]) ? ' has_sf' : ''; + $style = " class=\"$class\""; + } + $selected = (isset($search_in_forums_fary[$forum_id])) ? HTML_SELECTED : ''; + $opt .= '\n"; + } + + $opt .= "\n"; +} +$search_all_opt = '\n"; +$cat_forum_select = "\n".'\n"; + +// Sort dir +$template->assign_vars(array( + 'SORT_NAME' => $sort_key, + 'SORT_ASC' => $sort_asc, + 'SORT_DESC' => $sort_desc, + 'SORT_ASC_CHECKED' => ($sort_val == $sort_asc) ? HTML_CHECKED : '', + 'SORT_DESC_CHECKED' => ($sort_val == $sort_desc) ? HTML_CHECKED : '', +)); + +// Displaying options +$template->assign_vars(array( + 'SHOW_CAT_CHBOX' => build_checkbox ($show_cat_key, $lang['BT_SHOW_CAT'], $show_cat_val), + 'SHOW_FORUM_CHBOX' => build_checkbox ($show_forum_key, $lang['BT_SHOW_FORUM'], $show_forum_val), + 'SHOW_AUTHOR_CHBOX' => build_checkbox ($show_author_key, $lang['BT_SHOW_AUTHOR'], $show_author_val), + 'SHOW_SPEED_CHBOX' => build_checkbox ($show_speed_key, $lang['BT_SHOW_SPEED'], $show_speed_val), + 'ALL_WORDS_CHBOX' => build_checkbox ($all_words_key, $lang['SEARCH_ALL_WORDS'], $all_words_val), + + 'ONLY_MY_CHBOX' => build_checkbox ($my_key, $lang['BT_ONLY_MY'], $only_my, IS_GUEST), + 'ONLY_ACTIVE_CHBOX' => build_checkbox ($active_key, $lang['BT_ONLY_ACTIVE'], $active_val), + 'SEED_EXIST_CHBOX' => build_checkbox ($seed_exist_key, $lang['BT_SEED_EXIST'], $seed_exist), + 'ONLY_NEW_CHBOX' => build_checkbox ($new_key, $lang['BT_ONLY_NEW'], $only_new, IS_GUEST), + + 'DL_CANCEL_CHBOX' => build_checkbox ($dl_cancel_key, $lang['SEARCH_DL_CANCEL'], $dl_cancel_val, IS_GUEST, 'dlCancel'), + 'DL_COMPL_CHBOX' => build_checkbox ($dl_compl_key, $lang['SEARCH_DL_COMPLETE'], $dl_compl_val, IS_GUEST, 'dlComplete'), + 'DL_DOWN_CHBOX' => build_checkbox ($dl_down_key, $lang['SEARCH_DL_DOWN'], $dl_down_val, IS_GUEST, 'dlDown'), + 'DL_WILL_CHBOX' => build_checkbox ($dl_will_key, $lang['SEARCH_DL_WILL'], $dl_will_val, IS_GUEST, 'dlWill'), + + 'POSTER_NAME_NAME' => $poster_name_key, + 'POSTER_NAME_VAL' => htmlCHR($poster_name_val), + 'TITLE_MATCH_NAME' => $title_match_key, + 'TITLE_MATCH_VAL' => $title_match_val, + + 'AJAX_TOPICS' => $user->opt_js['tr_t_ax'], + 'U_SEARCH_USER' => "search.php?mode=searchuser&input_name=$poster_name_key", +)); + +// Hidden fields +$save_through_pages = array( + 'all_words', + 'active', + 'dl_cancel', + 'dl_compl', + 'dl_down', + 'dl_will', + 'my', + 'new', + 'seed_exist', + 'show_author', + 'show_cat', + 'show_forum', + 'show_speed', +); +$hidden_fields = array(); +foreach ($save_through_pages as $name) +{ + $hidden_fields['prev_'. ${"{$name}_key"}] = ${"{$name}_val"}; +} + +// Set colspan +$tor_colspan = $tor_colspan - $hide_cat - $hide_forum - $hide_author - $hide_speed; + +$template->assign_vars(array( + 'PAGE_TITLE' => $lang['TRACKER'], + 'S_HIDDEN_FIELDS' => build_hidden_fields($hidden_fields), + 'CAT_FORUM_SELECT' => $cat_forum_select, + 'ORDER_SELECT' => build_select($order_key, $order_select, $order_val), + 'TIME_SELECT' => build_select($time_key, $time_select, $time_val), + 'S_NOT_SEEN_SELECT' => build_select($s_not_seen_key, $s_not_seen_select, $s_not_seen_val), + 'TOR_SEARCH_ACTION' => $tracker_url, + 'TOR_COLSPAN' => $tor_colspan, + 'TITLE_MATCH_MAX' => $title_match_max_len, + 'POSTER_NAME_MAX' => $poster_name_max_len, + 'POSTER_ERROR' => $poster_error, + 'SHOW_SEARCH_OPT' => (bool) $allowed_forums, + 'SHOW_CAT' => $show_cat_val, + 'SHOW_FORUM' => $show_forum_val, + 'SHOW_AUTHOR' => $show_author_val, + 'SHOW_SPEED' => $show_speed_val, + + 'TR_CAT_URL' => "$tracker_url?$cat_key=", + 'TR_FORUM_URL' => "$tracker_url?$forum_key=", + 'TR_POSTER_URL' => "$tracker_url?$poster_id_key=", +)); + +print_page('tracker.tpl'); \ No newline at end of file diff --git a/upload/triggers/$on b/upload/triggers/$on new file mode 100644 index 000000000..e69de29bb diff --git a/upload/triggers/.htaccess b/upload/triggers/.htaccess new file mode 100644 index 000000000..baa56e5a3 --- /dev/null +++ b/upload/triggers/.htaccess @@ -0,0 +1,2 @@ +order allow,deny +deny from all \ No newline at end of file diff --git a/upload/triggers/cron_allowed b/upload/triggers/cron_allowed new file mode 100644 index 000000000..e69de29bb diff --git a/upload/viewforum.php b/upload/viewforum.php new file mode 100644 index 000000000..33f4f1a66 --- /dev/null +++ b/upload/viewforum.php @@ -0,0 +1,618 @@ +enqueue(array( + 'moderators', +)); + +$page_cfg['load_tpl_vars'] = array( + 'post_icons', + 'topic_icons', +); + +// Init request vars +$forum_id = (int) request_var('f', ''); +$start = abs(intval(request_var('start', ''))); +$mark_read = (request_var('mark', '') === 'topics'); + +$anon = ANONYMOUS; + +// Start session +$user->session_start(); + +$lastvisit = (IS_GUEST) ? TIMENOW : $userdata['user_lastvisit']; + +// Caching output +$req_page = "forum_f{$forum_id}"; +$req_page .= ($start) ? "_start{$start}" : ''; + +define('REQUESTED_PAGE', $req_page); +caching_output(IS_GUEST, 'send', REQUESTED_PAGE .'_guest'); + +// Check if the user has actually sent a forum ID +$sql = "SELECT * FROM ". BB_FORUMS ." WHERE forum_id = $forum_id LIMIT 1"; + +if (!$forum_id OR !$forum_data = DB()->fetch_row($sql)) +{ + bb_die($lang['FORUM_NOT_EXIST']); +} + +// Only new +$only_new = $user->opt_js['only_new']; +$only_new_sql = ''; +if ($only_new == ONLY_NEW_POSTS) +{ + $only_new_sql = "AND t.topic_last_post_time > $lastvisit"; +} +else if ($only_new == ONLY_NEW_TOPICS) +{ + $only_new_sql = "AND t.topic_time > $lastvisit"; +} + +// Auth +$is_auth = auth(AUTH_ALL, $forum_id, $userdata, $forum_data); + +$moderation = (!empty($_REQUEST['mod']) && $is_auth['auth_mod']); + +if (!$is_auth['auth_view']) +{ + if (IS_GUEST) + { + $redirect = "f=$forum_id"; + $redirect .= ($start) ? "&start=$start" : ''; + redirect("login.php?redirect=viewforum.php&$redirect"); + } + // The user is not authed to read this forum ... + $message = sprintf($lang['SORRY_AUTH_VIEW'], $is_auth['auth_view_type']); + bb_die($message); +} + +// Redirect to login page if not admin session +$mod_redirect_url = ''; + +if ($is_auth['auth_mod']) +{ + $redirect = isset($_POST['redirect']) ? $_POST['redirect'] : $_SERVER['REQUEST_URI']; + $redirect = url_arg($redirect, 'mod', 1, '&'); + $mod_redirect_url = "login.php?redirect=$redirect&admin=1"; + + if ($moderation && !$userdata['session_admin']) + { + redirect($mod_redirect_url); + } + + $select_st = array_merge(array('Выберите статус' => -1), array_flip($lang['tor_status'])); + $template->assign_vars(array( + 'SELECT_ST' => build_select('st', $select_st, -1), + )); +} + +// Topics read tracks +$tracking_topics = get_tracks('topic'); +$tracking_forums = get_tracks('forum'); + +if ($mark_read && !IS_GUEST) +{ + set_tracks(COOKIE_FORUM, $tracking_forums, $forum_id); + + $message = $lang['TOPICS_MARKED_READ'] .'

    '; + $message .= sprintf($lang['CLICK_RETURN_FORUM'], '', ''); + $message .= '

    '; + $message .= sprintf($lang['CLICK_RETURN_INDEX'], '', ''); + bb_die($message); +} + +// Subforums +$show_subforums = ($bb_cfg['sf_on_first_page_only']) ? !$start : true; + +if (!$forums = $datastore->get('cat_forums')) +{ + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); +} + +if (!$forum_data['forum_parent'] && isset($forums['f'][$forum_id]['subforums']) && $show_subforums) +{ + $not_auth_forums = ($bb_cfg['sf_check_view_permissions']) ? $user->get_not_auth_forums(AUTH_VIEW) : ''; + $ignore_forum_sql = ($not_auth_forums) ? "AND f.forum_id NOT IN($not_auth_forums)" : ''; + + $sql = " + SELECT + f.forum_id, f.forum_status, f.forum_last_post_id, f.forum_posts, f.forum_topics, + t.topic_last_post_time, t.topic_id AS last_topic_id, t.topic_title AS last_topic_title, + p.poster_id AS sf_last_user_id, IF(p.poster_id = $anon, p.post_username, u.username) AS sf_last_username + FROM ". BB_FORUMS ." f + LEFT JOIN ". BB_TOPICS ." t ON(f.forum_last_post_id = t.topic_last_post_id) + LEFT JOIN ". BB_POSTS ." p ON(f.forum_last_post_id = p.post_id) + LEFT JOIN ". BB_USERS ." u ON(p.poster_id = u.user_id) + WHERE f.forum_parent = $forum_id + $only_new_sql + $ignore_forum_sql + GROUP BY f.forum_id + ORDER BY f.forum_order + "; + + if ($rowset = DB()->fetch_rowset($sql)) + { + $template->assign_vars(array( + 'SHOW_SUBFORUMS' => true, + 'FORUM_IMG' => $images['forum'], + 'FORUM_NEW_IMG' => $images['forum_new'], + 'FORUM_LOCKED_IMG' => $images['forum_locked'], + )); + } + foreach ($rowset as $sf_data) + { + $sf_forum_id = $sf_data['forum_id']; + $sf_last_tid = $sf_data['last_topic_id']; + $folder_image = $images['forum']; + $last_post = $lang['NO_POSTS']; + + if (!$fname_html =& $forums['forum_name_html'][$sf_forum_id]) + { + continue; + } + + if ($sf_data['forum_status'] == FORUM_LOCKED) + { + $folder_image = $images['forum_locked']; + } + else if (is_unread($sf_data['topic_last_post_time'], $sf_last_tid, $sf_forum_id)) + { + $folder_image = $images['forum_new']; + } + + $last_post_username = ($sf_data['sf_last_username']) ? $sf_data['sf_last_username'] : $lang['GUEST']; + + if ($sf_data['forum_last_post_id']) + { + $last_post = bb_date($sf_data['topic_last_post_time'], $bb_cfg['last_post_date_format']); + $last_post .= '
    '; + $last_post .= ($sf_data['sf_last_user_id'] != ANONYMOUS) ? ''. $last_post_username .'' : $last_post_username; + $last_post .= 'latest'; + } + + $template->assign_block_vars('f', array( + 'FORUM_FOLDER_IMG' => $folder_image, + + 'FORUM_NAME' => $fname_html, + 'FORUM_DESC' => $forums['f'][$sf_forum_id]['forum_desc'], + 'U_VIEWFORUM' => FORUM_URL . $sf_forum_id, + 'TOPICS' => commify($sf_data['forum_topics']), + 'POSTS' => commify($sf_data['forum_posts']), + 'LAST_POST' => $last_post, + 'MODERATORS' => '', + )); + + if ($sf_data['forum_last_post_id']) + { + $template->assign_block_vars('f.last', array( + 'FORUM_LAST_POST' => true, + 'SHOW_LAST_TOPIC' => $show_last_topic, + 'LAST_TOPIC_ID' => $sf_data['last_topic_id'], + 'LAST_TOPIC_TIP' => $sf_data['last_topic_title'], + 'LAST_TOPIC_TITLE' => str_short($sf_data['last_topic_title'], $last_topic_max_len), + 'LAST_POST_TIME' => bb_date($sf_data['topic_last_post_time'], $bb_cfg['last_post_date_format']), + 'LAST_POST_ID' => $sf_data['forum_last_post_id'], + 'LAST_POST_USER_NAME' => $last_post_username, + 'LAST_POST_USER_ID' => ($sf_data['sf_last_user_id'] != ANONYMOUS) ? $sf_data['sf_last_user_id'] : '', + 'ICON_LATEST_REPLY' => $images['icon_latest_reply'], + )); + } + else + { + $template->assign_block_vars('f.last', array('FORUM_LAST_POST' => false)); + } + } +} +else if ($parent_id = $forum_data['forum_parent']) +{ + $template->assign_vars(array( + 'HAS_PARENT_FORUM' => true, + 'PARENT_FORUM_HREF' => FORUM_URL . $forum_data['forum_parent'], + 'PARENT_FORUM_NAME' => $forums['forum_name_html'][$parent_id], + )); +} +unset($forums, $rowset); +$datastore->rm('cat_forums'); + +// Topics per page +$topics_per_page = $bb_cfg['topics_per_page']; +$select_tpp = ''; + +if ($is_auth['auth_mod']) +{ + if ($req_tpp = abs(intval(@$_REQUEST['tpp'])) AND in_array($req_tpp, $bb_cfg['allowed_topics_per_page'])) + { + $topics_per_page = $req_tpp; + } + + $select_tpp = array(); + foreach ($bb_cfg['allowed_topics_per_page'] as $tpp) + { + $select_tpp[$tpp] = $tpp; + } +} + +// Obtain list of moderators +$moderators = array(); +if (!$mod = $datastore->get('moderators')) +{ + $datastore->update('moderators'); + $mod = $datastore->get('moderators'); +} + +if (isset($mod['mod_users'][$forum_id])) +{ + foreach ($mod['mod_users'][$forum_id] as $user_id) + { + $moderators[] = ''. $mod['name_users'][$user_id] .''; + } +} +if (isset($mod['mod_groups'][$forum_id])) +{ + foreach ($mod['mod_groups'][$forum_id] as $group_id) + { + $moderators[] = ''. $mod['name_groups'][$group_id] .''; + } +} + +$template->assign_vars(array( + 'MODERATORS' => ($moderators) ? join(', ', $moderators) : $lang['NONE'], +)); + +unset($moderators, $mod); +$datastore->rm('moderators'); + +// Generate a 'Show topics in previous x days' select box. +$topic_days = 0; // all the time +$forum_topics = $forum_data['forum_topics']; + +$sel_previous_days = array( + 0 => $lang['ALL_POSTS'], + 1 => $lang['1_DAY'], + 7 => $lang['7_DAYS'], + 14 => $lang['2_WEEKS'], + 30 => $lang['1_MONTH'], + 90 => $lang['3_MONTHS'], + 180 => $lang['6_MONTHS'], + 364 => $lang['1_YEAR'], +); + +if (!empty($_REQUEST['topicdays'])) +{ + if ($req_topic_days = abs(intval($_REQUEST['topicdays'])) AND isset($sel_previous_days[$req_topic_days])) + { + $sql = " + SELECT COUNT(*) AS forum_topics + FROM ". BB_TOPICS ." + WHERE forum_id = $forum_id + AND topic_last_post_time > ". (TIMENOW - 86400*$req_topic_days) ." + "; + + if ($row = DB()->fetch_row($sql)) + { + $topic_days = $req_topic_days; + $forum_topics = $row['forum_topics']; + } + } +} +// Correct $start value +if ($start > $forum_topics) +{ + redirect("viewforum.php?f=$forum_id"); +} + +// Generate SORT and ORDER selects +$sort_value = isset($_REQUEST['sort']) ? (int) $_REQUEST['sort'] : $forum_data['forum_display_sort']; +$order_value = isset($_REQUEST['order']) ? (int) $_REQUEST['order'] : $forum_data['forum_display_order']; +$sort_list = ''; +$order_list = ''; +$s_display_order = ' '. $lang['SORT_BY'] .': '. $sort_list . $order_list .' '; + +// Selected SORT and ORDER methods +$sort_method = get_forum_display_sort_option($sort_value, 'field', 'sort'); +$order_method = get_forum_display_sort_option($order_value, 'field', 'order'); + +$order_sql = "ORDER BY t.topic_type DESC, $sort_method $order_method"; + +$limit_topics_time_sql = ($topic_days) ? "AND t.topic_last_post_time > ". (TIMENOW - 86400*$topic_days) : ''; + +$select_tor_sql = $join_tor_sql = ''; +$join_dl = ($bb_cfg['show_dl_status_in_forum'] && !IS_GUEST); + +if ($forum_data['allow_reg_tracker']) +{ + $select_tor_sql = ', + bt.auth_key, tor.info_hash, tor.size AS tor_size, tor.reg_time, tor.complete_count, tor.seeder_last_seen, tor.attach_id, tor.tor_status, tor.tor_type, + sn.seeders, sn.leechers + '; + $select_tor_sql .= ($join_dl) ? ', dl.user_status AS dl_status' : ''; + + $join_tor_sql = " + LEFT JOIN ". BB_BT_TORRENTS ." tor ON(t.topic_id = tor.topic_id) + LEFT JOIN ". BB_BT_USERS ." bt ON(bt.user_id = {$userdata['user_id']}) + LEFT JOIN ". BB_BT_TRACKER_SNAP ." sn ON(tor.topic_id = sn.topic_id) + "; + $join_tor_sql .= ($join_dl) ? " LEFT JOIN ". BB_BT_DLSTATUS ." dl ON(dl.user_id = {$userdata['user_id']} AND dl.topic_id = t.topic_id)" : ''; +} + +// Title match +$title_match_sql = ''; + +if ($title_match =& $_REQUEST[$title_match_key]) +{ + if ($title_match = substr(trim($title_match), 0, $title_match_max_len)) + { + $search_bool_mode = ($bb_cfg['allow_search_in_bool_mode']) ? " IN BOOLEAN MODE" : ''; + $search_text_sql = DB()->escape($title_match); + $title_match_sql = " + AND MATCH (t.topic_title) AGAINST ('$search_text_sql'". $search_bool_mode .") + "; + $start = 0; + $forum_topics = $topics_per_page; + } +} + +// Get topics +$topic_ids = $topic_rowset = array(); + +// IDs +$sql = " + SELECT t.topic_id + FROM ". BB_TOPICS ." t + WHERE t.forum_id = $forum_id + $only_new_sql + $title_match_sql + $limit_topics_time_sql + $order_sql + LIMIT $start, $topics_per_page +"; +foreach (DB()->fetch_rowset($sql) as $row) +{ + $topic_ids[] = $row['topic_id']; +} + +// Titles, posters etc. +if ($topics_csv = join(',', $topic_ids)) +{ + $topic_rowset = DB()->fetch_rowset(" + SELECT + t.*, t.topic_poster AS first_user_id, + IF(t.topic_poster = $anon, p1.post_username, u1.username) AS first_username, + p2.poster_id AS last_user_id, + IF(p2.poster_id = $anon, p2.post_username, u2.username) AS last_username + $select_tor_sql + FROM ". BB_TOPICS ." t + LEFT JOIN ". BB_POSTS ." p1 ON(t.topic_first_post_id = p1.post_id) + LEFT JOIN ". BB_USERS ." u1 ON(t.topic_poster = u1.user_id) + LEFT JOIN ". BB_POSTS ." p2 ON(t.topic_last_post_id = p2.post_id) + LEFT JOIN ". BB_USERS ." u2 ON(p2.poster_id = u2.user_id) + $join_tor_sql + WHERE t.topic_id IN($topics_csv) + GROUP BY t.topic_id + $order_sql + "); +} + +$found_topics = count($topic_rowset); + +// Define censored word matches +$orig_word = $replacement_word = array(); +obtain_word_list($orig_word, $replacement_word); + +$post_new_topic_url = "posting.php?mode=newtopic&f=$forum_id"; +$post_new_topic_url .= ($forum_data['topic_tpl_id']) ? '&tpl=1' : ''; + +// Post URL generation for templating vars +$template->assign_vars(array( + 'U_POST_NEW_TOPIC' => $post_new_topic_url, + 'S_SELECT_TOPIC_DAYS' => build_select('topicdays', array_flip($sel_previous_days), $topic_days), + 'S_POST_DAYS_ACTION' => "viewforum.php?f=$forum_id&start=$start", + 'S_DISPLAY_ORDER' => $s_display_order, +)); + +// User authorisation levels output +$u_auth = array(); +$u_auth[] = ($is_auth['auth_post']) ? $lang['RULES_POST_CAN'] : $lang['RULES_POST_CANNOT']; +$u_auth[] = ($is_auth['auth_reply']) ? $lang['RULES_REPLY_CAN'] : $lang['RULES_REPLY_CANNOT']; +$u_auth[] = ($is_auth['auth_edit']) ? $lang['RULES_EDIT_CAN'] : $lang['RULES_EDIT_CANNOT']; +$u_auth[] = ($is_auth['auth_delete']) ? $lang['RULES_DELETE_CAN'] : $lang['RULES_DELETE_CANNOT']; +$u_auth[] = ($is_auth['auth_vote']) ? $lang['RULES_VOTE_CAN'] : $lang['RULES_VOTE_CANNOT']; +$u_auth[] = ($is_auth['auth_attachments']) ? $lang['RULES_ATTACH_CAN'] : $lang['RULES_ATTACH_CANNOT']; +$u_auth[] = ($is_auth['auth_download']) ? $lang['RULES_DOWNLOAD_CAN'] : $lang['RULES_DOWNLOAD_CANNOT']; +$u_auth[] = ($is_auth['auth_mod']) ? $lang['RULES_MODERATE'] : ''; +$u_auth = join("
    \n", $u_auth); + +$template->assign_vars(array( + 'SHOW_JUMPBOX' => true, + 'PAGE_TITLE' => htmlCHR($forum_data['forum_name']), + 'FORUM_ID' => $forum_id, + 'FORUM_NAME' => htmlCHR($forum_data['forum_name']), + 'TORRENTS' => $forum_data['allow_reg_tracker'], + 'POST_IMG' => ($forum_data['forum_status'] == FORUM_LOCKED) ? $images['post_locked'] : $images['post_new'], + + 'FOLDER_IMG' => $images['folder'], + 'FOLDER_NEW_IMG' => $images['folder_new'], + 'FOLDER_LOCKED_IMG' => $images['folder_locked'], + 'FOLDER_STICKY_IMG' => $images['folder_sticky'], + 'FOLDER_ANNOUNCE_IMG' => $images['folder_announce'], + 'FOLDER_DOWNLOAD_IMG' => $images['folder_dl'], + + 'SHOW_ONLY_NEW_MENU' => true, + 'ONLY_NEW_POSTS_ON' => ($only_new == ONLY_NEW_POSTS), + 'ONLY_NEW_TOPICS_ON' => ($only_new == ONLY_NEW_TOPICS), + + 'TITLE_MATCH' => htmlCHR($title_match), + 'SELECT_TPP' => ($select_tpp) ? build_select('tpp', $select_tpp, $topics_per_page, null, null, 'onchange="$(\'#tpp\').submit();"') : '', + 'T_POST_NEW_TOPIC' => ($forum_data['forum_status'] == FORUM_LOCKED) ? $lang['FORUM_LOCKED'] : $lang['POST_NEW_TOPIC'], + 'S_AUTH_LIST' => $u_auth, + 'U_VIEW_FORUM' => FORUM_URL . $forum_id, + 'U_MARK_READ' => FORUM_URL . $forum_id ."&mark=topics", + 'U_SEARCH_SELF' => "search.php?uid={$userdata['user_id']}&f=$forum_id", +)); + +// Okay, lets dump out the page ... +foreach ($topic_rowset as $topic) +{ + $topic_id = $topic['topic_id']; + $moved = ($topic['topic_status'] == TOPIC_MOVED); + $replies = $topic['topic_replies']; + $t_hot = ($replies >= $bb_cfg['hot_threshold']); + $t_type = $topic['topic_type']; + $separator = ''; + $is_unread = is_unread($topic['topic_last_post_time'], $topic_id, $forum_id); + + if ($t_type == POST_ANNOUNCE && !defined('ANNOUNCE_SEP')) + { + define('ANNOUNCE_SEP', true); + $separator = $lang['TOPICS_ANNOUNCEMENT']; + } + else if ($t_type == POST_STICKY && !defined('STICKY_SEP')) + { + define('STICKY_SEP', true); + $separator = $lang['TOPICS_STICKY']; + } + else if ($t_type == POST_NORMAL && !defined('NORMAL_SEP')) + { + if (defined('ANNOUNCE_SEP') || defined('STICKY_SEP')) + { + define('NORMAL_SEP', true); + $separator = $lang['TOPICS_NORMAL']; + } + } + + // Gold/Silver releases mod + $is_gold = ''; + if ($bb_cfg['gold_silver_enabled'] && isset($topic['tor_type'])) + { + if ($topic['tor_type'] == TOR_TYPE_GOLD) + { + $is_gold = ' '; + } + elseif ($topic['tor_type'] == TOR_TYPE_SILVER) + { + $is_gold = ' '; + } + } + // END Gold/Silver releases mod + + $template->assign_block_vars('t', array( + 'FORUM_ID' => $forum_id, + 'TOPIC_ID' => $topic_id, + 'HREF_TOPIC_ID' => ($moved) ? $topic['topic_moved_id'] : $topic['topic_id'], + 'TOPIC_TITLE' => wbr($topic['topic_title']), + 'TOPICS_SEPARATOR' => $separator, + 'IS_UNREAD' => $is_unread, + 'TOPIC_ICON' => get_topic_icon($topic, $is_unread), + 'PAGINATION' => ($moved) ? '' : build_topic_pagination(TOPIC_URL . $topic_id, $replies, $bb_cfg['posts_per_page']), + 'REPLIES' => $replies, + 'VIEWS' => $topic['topic_views'], + 'TOR_STALED' => ($forum_data['allow_reg_tracker'] && !($t_type == POST_ANNOUNCE || $t_type == POST_STICKY || $topic['tor_size'])), + 'TOR_FROZEN' => isset($topic['tor_status']) ? isset($bb_cfg['tor_frozen'][$topic['tor_status']]) : '', + 'TOR_TYPE' => $is_gold, + + 'TOR_STATUS_ICON' => isset($topic['tor_status']) ? $bb_cfg['tor_icons'][$topic['tor_status']] : '', + + 'ATTACH' => $topic['topic_attachment'], + 'STATUS' => $topic['topic_status'], + 'TYPE' => $topic['topic_type'], + 'DL' => ($topic['topic_dl_type'] == TOPIC_DL_TYPE_DL && !$forum_data['allow_reg_tracker']), + 'POLL' => $topic['topic_vote'], + 'DL_CLASS' => isset($topic['dl_status']) ? $dl_link_css[$topic['dl_status']] : '', + + 'TOPIC_AUTHOR_ID' => ($topic['first_user_id'] != ANONYMOUS) ? $topic['first_user_id'] : '', + 'TOPIC_AUTHOR_NAME' => ($topic['first_username']) ? wbr($topic['first_username']) : $lang['GUEST'], + 'LAST_POSTER_HREF' => ($topic['last_user_id'] != ANONYMOUS) ? $topic['last_user_id'] : '', + 'LAST_POSTER_NAME' => ($topic['last_username']) ? str_short($topic['last_username'], 15) : $lang['GUEST'], + 'LAST_POST_TIME' => bb_date($topic['topic_last_post_time']), + 'LAST_POST_ID' => $topic['topic_last_post_id'], + )); + + if (isset($topic['tor_size'])) + { + $tor_magnet = create_magnet($topic['info_hash'], $topic['auth_key'], $userdata['session_logged_in']); + + $template->assign_block_vars('t.tor', array( + 'SEEDERS' => (int) $topic['seeders'], + 'LEECHERS' => (int) $topic['leechers'], + 'TOR_SIZE' => humn_size($topic['tor_size']), + 'COMPL_CNT' => (int) $topic['complete_count'], + 'ATTACH_ID' => $topic['attach_id'], + 'MAGNET' => $tor_magnet, + )); + } +} +unset($topic_rowset); + +$pg_url = FORUM_URL . $forum_id; +$pg_url .= ($topic_days) ? "&topicdays=$topic_days" : ''; +$pg_url .= ($sort_value) ? "&sort=$sort_value" : ''; +$pg_url .= ($order_value) ? "&order=$order_value" : ''; +$pg_url .= ($moderation) ? "&mod=1" : ''; +$pg_url .= ($topics_per_page != $bb_cfg['topics_per_page']) ? "&tpp=$topics_per_page" : ''; + +if ($found_topics) +{ + $template->assign_vars(array( + 'PAGINATION' => generate_pagination($pg_url, $forum_topics, $topics_per_page, $start), + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], (floor($start / $topics_per_page) + 1), ceil($forum_topics / $topics_per_page)), + )); +} +else +{ + if ($only_new) + { + $no_topics_msg = $lang['NO_NEW_POSTS']; + } + else + { + $no_topics_msg = ($topic_days || $title_match) ? $lang['NO_SEARCH_MATCH'] : $lang['NO_TOPICS_POST_ONE']; + } + $template->assign_vars(array( + 'NO_TOPICS' => $no_topics_msg, + )); +} + +$template->assign_vars(array( + 'PAGE_URL' => $pg_url, + 'PAGE_URL_TPP' => url_arg($pg_url, 'tpp', null), + 'FOUND_TOPICS' => $found_topics, + + 'AUTH_MOD' => $is_auth['auth_mod'], + 'SESSION_ADMIN' => $userdata['session_admin'], + 'MOD_REDIRECT_URL' => $mod_redirect_url, + 'MODERATION_ON' => $moderation, +)); + +print_page('viewforum.tpl'); diff --git a/upload/viewonline.php b/upload/viewonline.php new file mode 100644 index 000000000..25e2b3348 --- /dev/null +++ b/upload/viewonline.php @@ -0,0 +1,201 @@ +session_start(array('req_login' => true)); + +// +// Output page header and load viewonline template +// +$template->assign_vars(array( + 'PAGE_TITLE' => $lang['WHOSONLINE'], + 'L_LAST_UPDATE' => $lang['LAST_UPDATED'], +)); + +// +// Get auth data +// +$is_auth_ary = array(); +$is_auth_ary = auth(AUTH_VIEW, AUTH_LIST_ALL, $userdata); + +// +// Get user list +// +$sql = "SELECT u.user_id, u.username, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_time, s.session_ip + FROM ".BB_USERS." u, ".BB_SESSIONS." s + WHERE u.user_id = s.session_user_id + AND s.session_time >= ".( time() - 300 ) . " + ORDER BY u.username ASC, s.session_ip ASC"; +if ( !($result = DB()->sql_query($sql)) ) +{ + message_die(GENERAL_ERROR, 'Could not obtain regd user/online information', '', __LINE__, __FILE__, $sql); +} + +$guest_users = 0; +$registered_users = 0; +$hidden_users = 0; + +$reg_counter = 0; +$guest_counter = 0; +$prev_user = 0; +$prev_ip = ''; + +$user_id = 0; + +while ( $row = DB()->sql_fetchrow($result) ) +{ + $view_online = false; + + if ( $row['session_logged_in'] ) + { + $user_id = $row['user_id']; + + if ( $user_id != $prev_user ) + { + $username = $row['username']; + + $style_color = ''; + if ( $row['user_level'] == ADMIN ) + { + $username = '' . $username . ''; + } + else if ( $row['user_level'] == MOD ) + { + $username = '' . $username . ''; + } + else if ( $row['user_level'] == GROUP_MEMBER ) + { + $username = '' . $username . ''; + } + + if ( !$row['user_allow_viewonline'] ) + { + $view_online = IS_AM; + $hidden_users++; + + $username = '' . $username . ''; + } + else + { + $view_online = true; + $registered_users++; + } + + $which_counter = 'reg_counter'; + $which_row = 'reg_user_row'; + $prev_user = $user_id; + } + } + else + { + if ( $row['session_ip'] != $prev_ip ) + { + $username = $lang['GUEST']; + $view_online = true; + $guest_users++; + + $which_counter = 'guest_counter'; + $which_row = 'guest_user_row'; + } + } + + $prev_ip = $row['session_ip']; + + if ( $view_online ) + { + $row_class = !($$which_counter % 2) ? 'row1' : 'row2'; + + $template->assign_block_vars("$which_row", array( + 'ROW_CLASS' => $row_class, + 'USERNAME' => $username, + 'LASTUPDATE' => bb_date($row['session_time']), + + 'U_USER_PROFILE' => ((isset($user_id)) ? append_sid("profile.php?mode=viewprofile&" . POST_USERS_URL . '=' . $user_id) : ''), + )); + + $$which_counter++; + } +} + +if( $registered_users == 0 ) +{ + $l_r_user_s = $lang['REG_USERS_ZERO_ONLINE']; +} +else if( $registered_users == 1 ) +{ + $l_r_user_s = $lang['REG_USER_ONLINE']; +} +else +{ + $l_r_user_s = $lang['REG_USERS_ONLINE']; +} + +if( $hidden_users == 0 ) +{ + $l_h_user_s = $lang['HIDDEN_USERS_ZERO_ONLINE']; +} +else if( $hidden_users == 1 ) +{ + $l_h_user_s = $lang['HIDDEN_USER_ONLINE']; +} +else +{ + $l_h_user_s = $lang['HIDDEN_USERS_ONLINE']; +} + +if( $guest_users == 0 ) +{ + $l_g_user_s = $lang['GUEST_USERS_ZERO_ONLINE']; +} +else if( $guest_users == 1 ) +{ + $l_g_user_s = $lang['GUEST_USER_ONLINE']; +} +else +{ + $l_g_user_s = $lang['GUEST_USERS_ONLINE']; +} + +$template->assign_vars(array( + 'TOTAL_REGISTERED_USERS_ONLINE' => sprintf($l_r_user_s, $registered_users) . sprintf($l_h_user_s, $hidden_users), + 'TOTAL_GUEST_USERS_ONLINE' => sprintf($l_g_user_s, $guest_users)) +); + +if ( $registered_users + $hidden_users == 0 ) +{ + $template->assign_vars(array( + 'L_NO_REGISTERED_USERS_BROWSING' => $lang['NO_USERS_BROWSING']) + ); +} + +if ( $guest_users == 0 ) +{ + $template->assign_vars(array( + 'L_NO_GUESTS_BROWSING' => $lang['NO_USERS_BROWSING']) + ); +} + +print_page('viewonline.tpl'); diff --git a/upload/viewtopic.php b/upload/viewtopic.php new file mode 100644 index 000000000..dabf4745b --- /dev/null +++ b/upload/viewtopic.php @@ -0,0 +1,1085 @@ +enqueue(array( + 'ranks', +)); + +$page_cfg['load_tpl_vars'] = array( + 'post_buttons', + 'post_icons', + 'topic_icons', +); + +$newest = $next_topic_id = 0; +$start = isset($_GET['start']) ? abs(intval($_GET['start'])) : 0; +$topic_id = isset($_GET[POST_TOPIC_URL]) ? (int) $_GET[POST_TOPIC_URL] : 0; +$post_id = (!$topic_id && isset($_GET[POST_POST_URL])) ? (int) $_GET[POST_POST_URL] : 0; +$porno_forums = array_flip(explode(',', $bb_cfg['porno_forums'])); + +// Start session +$user->session_start(); + +// Posts per page +$posts_per_page = $bb_cfg['posts_per_page']; +$select_ppp = ''; + +if ($userdata['session_admin']) +{ + if ($req_ppp = abs(intval(@$_REQUEST['ppp'])) AND in_array($req_ppp, $bb_cfg['allowed_posts_per_page'])) + { + $posts_per_page = $req_ppp; + } + + $select_ppp = array(); + foreach ($bb_cfg['allowed_posts_per_page'] as $ppp) + { + $select_ppp[$ppp] = $ppp; + } +} + +if (isset($_REQUEST['single'])) +{ + $posts_per_page = 1; +} +else +{ + $start = floor($start/$posts_per_page) * $posts_per_page; +} + +if (!$topic_id && !$post_id) +{ + bb_die($lang['TOPIC_POST_NOT_EXIST']); +} + +$tracking_topics = get_tracks('topic'); +$tracking_forums = get_tracks('forum'); + +// Find topic id if user requested a newer or older topic +if ($topic_id && isset($_GET['view']) && ($_GET['view'] == 'next' || $_GET['view'] == 'previous')) +{ + $sql_condition = ($_GET['view'] == 'next') ? '>' : '<'; + $sql_ordering = ($_GET['view'] == 'next') ? 'ASC' : 'DESC'; + + $sql = "SELECT t.topic_id + FROM ". BB_TOPICS ." t, ". BB_TOPICS ." t2 + WHERE t2.topic_id = $topic_id + AND t.forum_id = t2.forum_id + AND t.topic_moved_id = 0 + AND t.topic_last_post_id $sql_condition t2.topic_last_post_id + ORDER BY t.topic_last_post_id $sql_ordering + LIMIT 1"; + + if ($row = DB()->fetch_row($sql)) + { + $next_topic_id = $topic_id = $row['topic_id']; + } + else + { + $message = ($_GET['view'] == 'next') ? $lang['NO_NEWER_TOPICS'] : $lang['NO_OLDER_TOPICS']; + bb_die($message); + } +} + +// Get forum/topic data +if ($topic_id) +{ + $sql = "SELECT t.*, f.* + FROM ". BB_TOPICS ." t, ". BB_FORUMS ." f + WHERE t.topic_id = $topic_id + AND f.forum_id = t.forum_id + LIMIT 1"; +} +else if ($post_id) +{ + $sql = "SELECT t.*, f.*, p.post_time + FROM ". BB_TOPICS ." t, ". BB_FORUMS ." f, ". BB_POSTS ." p + WHERE p.post_id = $post_id + AND t.topic_id = p.topic_id + AND f.forum_id = t.forum_id + LIMIT 1"; +} +else +{ + bb_die($lang['TOPIC_POST_NOT_EXIST']); +} + +if (!$t_data = DB()->fetch_row($sql)) +{ + bb_die($lang['TOPIC_POST_NOT_EXIST']); +} + +$forum_topic_data =& $t_data; +$topic_id = $t_data['topic_id']; +$forum_id = $t_data['forum_id']; + +if ($userdata['session_admin'] && !empty($_REQUEST['mod'])) +{ + if (IS_ADMIN) + { + $datastore->enqueue(array('viewtopic_forum_select')); + } +} +if ($t_data['topic_attachment']) +{ + $datastore->enqueue(array( + 'attach_extensions', + )); +} + +// Find newest post +if (($next_topic_id || @$_GET['view'] === 'newest') && !IS_GUEST && $topic_id) +{ + $post_time = 'post_time >= '. get_last_read($topic_id, $forum_id); + $post_id_altern = ($next_topic_id) ? '' : ' OR post_id = '. $t_data['topic_last_post_id']; + + $sql = "SELECT post_id, post_time + FROM ". BB_POSTS ." + WHERE topic_id = $topic_id + AND ($post_time $post_id_altern) + ORDER BY post_time ASC + LIMIT 1"; + + if ($row = DB()->fetch_row($sql)) + { + $post_id = $newest = $row['post_id']; + $t_data['post_time'] = $row['post_time']; + } +} + +if ($post_id && !empty($t_data['post_time']) && ($t_data['topic_replies'] + 1) > $posts_per_page) +{ + $sql = "SELECT COUNT(post_id) AS prev_posts + FROM ". BB_POSTS ." + WHERE topic_id = $topic_id + AND post_time <= {$t_data['post_time']}"; + + if ($row = DB()->fetch_row($sql)) + { + $t_data['prev_posts'] = $row['prev_posts']; + } +} + +// Auth check +$is_auth = auth(AUTH_ALL, $forum_id, $userdata, $t_data); + +if (!$is_auth['auth_read']) +{ + if (IS_GUEST) + { + $redirect = ($post_id) ? POST_POST_URL . "=$post_id" : POST_TOPIC_URL . "=$topic_id"; + $redirect .= ($start) ? "&start=$start" : ''; + redirect("login.php?redirect=viewtopic.php&$redirect"); + } + bb_die($lang['TOPIC_POST_NOT_EXIST']); +} + +$forum_name = $t_data['forum_name']; +$topic_title = $t_data['topic_title']; +$topic_id = $t_data['topic_id']; +$topic_time = $t_data['topic_time']; + +$moderation = (!empty($_REQUEST['mod']) && $is_auth['auth_mod']); + +// Redirect to login page if not admin session +$mod_redirect_url = ''; + +if ($is_auth['auth_mod']) +{ + $redirect = isset($_POST['redirect']) ? $_POST['redirect'] : $_SERVER['REQUEST_URI']; + $redirect = url_arg($redirect, 'mod', 1, '&'); + $mod_redirect_url = "login.php?redirect=$redirect&admin=1"; + + if ($moderation && !$userdata['session_admin']) + { + redirect($mod_redirect_url); + } +} + +if ($moderation) +{ + if (IS_ADMIN) + { + if (!$forum_select = $datastore->get('viewtopic_forum_select')) + { + $datastore->update('viewtopic_forum_select'); + $forum_select = $datastore->get('viewtopic_forum_select'); + } + $forum_select_html = $forum_select['viewtopic_forum_select']; + } + else + { + $not_auth_forums_csv = $user->get_not_auth_forums(AUTH_VIEW); + $forum_select_html = get_forum_select(explode(',', $not_auth_forums_csv), 'new_forum_id'); + } + $template->assign_vars(array( + 'S_FORUM_SELECT' => $forum_select_html, + )); +} + +if ($parent_id = $t_data['forum_parent']) +{ + if (!$forums = $datastore->get('cat_forums')) + { + $datastore->update('cat_forums'); + $forums = $datastore->get('cat_forums'); + } + + $template->assign_vars(array( + 'HAS_PARENT_FORUM' => true, + 'PARENT_FORUM_HREF' => FORUM_URL . $parent_id, + 'PARENT_FORUM_NAME' => htmlCHR($forums['f'][$parent_id]['forum_name']), + )); + unset($forums); +} +$datastore->rm('cat_forums'); + +if ($post_id && !empty($t_data['prev_posts'])) +{ + $start = floor(($t_data['prev_posts'] - 1) / $posts_per_page) * $posts_per_page; +} + +// +// Is user watching this thread? +// +$can_watch_topic = $is_watching_topic = false; + +if ($bb_cfg['topic_notify_enabled']) +{ + if( $userdata['session_logged_in'] ) + { + $can_watch_topic = TRUE; + + $sql = "SELECT notify_status + FROM " . BB_TOPICS_WATCH . " + WHERE topic_id = $topic_id + AND user_id = " . $userdata['user_id']; + + if ($row = DB()->fetch_row($sql)) + { + if ( isset($_GET['unwatch']) ) + { + if ( $_GET['unwatch'] == 'topic' ) + { + $is_watching_topic = 0; + + $sql = "DELETE FROM " . BB_TOPICS_WATCH . " + WHERE topic_id = $topic_id + AND user_id = " . $userdata['user_id']; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Could not delete topic watch information", '', __LINE__, __FILE__, $sql); + } + } + + $message = $lang['NO_LONGER_WATCHING'] . '

    ' . sprintf($lang['CLICK_RETURN_TOPIC'], '', ''); + bb_die($message); + } + else + { + $is_watching_topic = TRUE; + + if ( $row['notify_status'] ) + { + $sql = "UPDATE " . BB_TOPICS_WATCH . " + SET notify_status = 0 + WHERE topic_id = $topic_id + AND user_id = " . $userdata['user_id']; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Could not update topic watch information", '', __LINE__, __FILE__, $sql); + } + } + } + } + else + { + if ( isset($_GET['watch']) ) + { + if ( $_GET['watch'] == 'topic' ) + { + $is_watching_topic = TRUE; + + $sql = "INSERT INTO " . BB_TOPICS_WATCH . " (user_id, topic_id, notify_status) + VALUES (" . $userdata['user_id'] . ", $topic_id, 0)"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Could not insert topic watch information", '', __LINE__, __FILE__, $sql); + } + } + + $message = $lang['YOU_ARE_WATCHING'] . '

    ' . sprintf($lang['CLICK_RETURN_TOPIC'], '', ''); + bb_die($message); + } + else + { + $is_watching_topic = 0; + } + } + } + else + { + if ( isset($_GET['unwatch']) ) + { + if ( $_GET['unwatch'] == 'topic' ) + { + redirect("login.php?redirect=viewtopic.php&t=$topic_id&unwatch=topic"); + } + } + } +} + +// Generate a 'Show posts in previous x days' select box. If the postdays var is POSTed +// then get it's value, find the number of topics with dates newer than it (to properly +// handle pagination) and alter the main query +$post_days = 0; +$limit_posts_time = ''; +$total_replies = $t_data['topic_replies'] + 1; + +if (!empty($_REQUEST['postdays'])) +{ + if ($post_days = abs(intval($_REQUEST['postdays']))) + { + if (!empty($_POST['postdays'])) + { + $start = 0; + } + $min_post_time = TIMENOW - ($post_days*86400); + + $sql = "SELECT COUNT(p.post_id) AS num_posts + FROM " . BB_TOPICS . " t, " . BB_POSTS . " p + WHERE t.topic_id = $topic_id + AND p.topic_id = t.topic_id + AND p.post_time > $min_post_time"; + + $total_replies = ($row = DB()->fetch_row($sql)) ? $row['num_posts'] : 0; + $limit_posts_time = "AND p.post_time >= $min_post_time "; + } +} + +// Decide how to order the post display +$post_order = (isset($_POST['postorder']) && $_POST['postorder'] !== 'asc') ? 'desc' : 'asc'; + +// +// Go ahead and pull all data for this topic +// +$sql = " + SELECT + u.username, u.user_id, u.user_posts, u.user_from, u.user_from_flag, + u.user_regdate, u.user_rank, u.user_sig, u.user_sig_bbcode_uid, + u.user_avatar, u.user_avatar_type, u.user_allowavatar, + p.*, + h.post_html, IF(h.post_html IS NULL, pt.post_text, NULL) AS post_text, + pt.post_subject, pt.bbcode_uid + FROM ". BB_POSTS ." p + LEFT JOIN ". BB_USERS ." u ON(u.user_id = p.poster_id) + LEFT JOIN ". BB_POSTS_TEXT ." pt ON(pt.post_id = p.post_id) + LEFT JOIN ". BB_POSTS_HTML ." h ON(h.post_id = p.post_id) + WHERE + p.topic_id = $topic_id + $limit_posts_time + GROUP BY + p.post_id + ORDER BY + p.post_time + $post_order + LIMIT + $start, $posts_per_page +"; + +if ($postrow = DB()->fetch_rowset($sql)) +{ + $total_posts = count($postrow); +} +else +{ + bb_die($lang['NO_POSTS_TOPIC']); +} + +if (!$ranks = $datastore->get('ranks')) +{ + $datastore->update('ranks'); + $ranks = $datastore->get('ranks'); +} + +// +// Define censored word matches +// +$orig_word = array(); +$replacement_word = array(); +obtain_word_list($orig_word, $replacement_word); + +// +// Censor topic title +// +if ( count($orig_word) ) +{ + $topic_title = preg_replace($orig_word, $replacement_word, $topic_title); +} + +// +// Post, reply and other URL generation for +// templating vars +// +$new_topic_url = "posting.php?mode=newtopic&f=$forum_id"; +$new_topic_url .= ($t_data['topic_tpl_id']) ? '&tpl=1' : ''; +$reply_topic_url = "posting.php?mode=reply&t=$topic_id"; +$view_forum_url = "viewforum.php?f=$forum_id"; +$view_prev_topic_url = "viewtopic.php?t=$topic_id&view=previous#newest"; +$view_next_topic_url = "viewtopic.php?t=$topic_id&view=next#newest"; + +$reply_img = ( $t_data['forum_status'] == FORUM_LOCKED || $t_data['topic_status'] == TOPIC_LOCKED ) ? $images['reply_locked'] : $images['reply_new']; +$reply_alt = ( $t_data['forum_status'] == FORUM_LOCKED || $t_data['topic_status'] == TOPIC_LOCKED ) ? $lang['TOPIC_LOCKED_SHORT'] : $lang['REPLY_TO_TOPIC']; + +// Set 'body' template for attach_mod +$template->set_filenames(array('body' => 'viewtopic.tpl')); + +// +// User authorisation levels output +// +$s_auth_can = ( ( $is_auth['auth_post'] ) ? $lang['RULES_POST_CAN'] : $lang['RULES_POST_CANNOT'] ) . '
    '; +$s_auth_can .= ( ( $is_auth['auth_reply'] ) ? $lang['RULES_REPLY_CAN'] : $lang['RULES_REPLY_CANNOT'] ) . '
    '; +$s_auth_can .= ( ( $is_auth['auth_edit'] ) ? $lang['RULES_EDIT_CAN'] : $lang['RULES_EDIT_CANNOT'] ) . '
    '; +$s_auth_can .= ( ( $is_auth['auth_delete'] ) ? $lang['RULES_DELETE_CAN'] : $lang['RULES_DELETE_CANNOT'] ) . '
    '; +$s_auth_can .= ( ( $is_auth['auth_vote'] ) ? $lang['RULES_VOTE_CAN'] : $lang['RULES_VOTE_CANNOT'] ) . '
    '; +$s_auth_can .= ( ($is_auth['auth_attachments'] ) ? $lang['RULES_ATTACH_CAN'] : $lang['RULES_ATTACH_CANNOT'] ) . '
    '; +$s_auth_can .= ( ($is_auth['auth_download'] ) ? $lang['RULES_DOWNLOAD_CAN'] : $lang['RULES_DOWNLOAD_CANNOT'] ) . '
    '; + +$topic_mod = ''; + +if ( $is_auth['auth_mod'] ) +{ + $s_auth_can .= $lang['RULES_MODERATE']; + + $topic_mod .= "' . $lang['DELETE_TOPIC'] . ' '; + + $topic_mod .= "' . $lang['MOVE_TOPIC'] . ' '; + + $topic_mod .= ( $t_data['topic_status'] == TOPIC_UNLOCKED ) ? "' . $lang['LOCK_TOPIC'] . ' ' : "' . $lang['UNLOCK_TOPIC'] . ' '; + + $topic_mod .= "' . $lang['SPLIT_TOPIC'] . ' '; + //bt + if ($t_data['allow_dl_topic'] || $t_data['topic_dl_type'] == TOPIC_DL_TYPE_DL || IS_ADMIN) + { + if ($t_data['topic_dl_type'] == TOPIC_DL_TYPE_DL) + { + $topic_mod .= "' . $lang['UNSET_DL_STATUS'] . ''; + } + else + { + $topic_mod .= "' . $lang['SET_DL_STATUS'] . ''; + } + } + //bt end +} +//bt +else if (($t_data['topic_poster'] == $userdata['user_id']) && $userdata['session_logged_in'] && $t_data['self_moderated']) +{ + $topic_mod .= "' . $lang['MOVE_TOPIC'] . ' '; +} +//bt end + +// Report +// +// Get report topic module and create report link +// +require_once(INC_DIR ."functions_report.php"); +$report_topic = report_modules('name', 'report_topic'); + +if ($report_topic && $report_topic->auth_check('auth_write')) +{ + if ($forum_topic_data['topic_reported']) + { + $report_auth = ($userdata['user_level'] == ADMIN || (!$bb_cfg['report_list_admin'] && (!$bb_cfg['report_subject_auth'] || $is_auth['auth_mod']))); + if ($report_topic->auth_check('auth_view') && $is_auth) + { + $target = ($bb_cfg['report_new_window']) ? ' target="_blank"' : ''; + $s_report_topic =' ' . $report_topic->lang['DUPLICATE_REPORT'] . ' '; + } + else + { + $s_report_topic = ' ' . $report_topic->lang['DUPLICATE_REPORT'] . ' '; + } + } + else + { + $s_report_topic = ' ' . $report_topic->lang['WRITE_REPORT'] . ' '; + } + + $topic_mod .= $s_report_topic; + $template->assign_var('S_REPORT_TOPIC', $s_report_topic); +} +// Report [END] + +// +// Topic watch information +// +$s_watching_topic = $s_watching_topic_img = ''; +if ( $can_watch_topic ) +{ + if ( $is_watching_topic ) + { + $s_watching_topic = "' . $lang['STOP_WATCHING_TOPIC'] . ''; + $s_watching_topic_img = ( isset($images['topic_un_watch']) ) ? "' . $lang['STOP_WATCHING_TOPIC'] . '' : ''; + } + else + { + $s_watching_topic = "' . $lang['START_WATCHING_TOPIC'] . ''; + $s_watching_topic_img = ( isset($images['Topic_watch']) ) ? "' . $lang['START_WATCHING_TOPIC'] . '' : ''; + } +} + +// If we've got a hightlight set pass it on to pagination, +$pg_url = TOPIC_URL . $topic_id; +$pg_url .= ($post_days) ? "&postdays=$post_days" : ''; +$pg_url .= ($post_order != 'asc') ? "&postorder=$post_order" : ''; +$pg_url .= isset($_REQUEST['single']) ? "&single=1" : ''; +$pg_url .= ($moderation) ? "&mod=1" : ''; +$pg_url .= ($posts_per_page != $bb_cfg['posts_per_page']) ? "&ppp=$posts_per_page" : ''; + +$pagination = generate_pagination($pg_url, $total_replies, $posts_per_page, $start); + +// +// Selects +// +$sel_previous_days = array( + 0 => $lang['ALL_POSTS'], + 1 => $lang['1_DAY'], + 7 => $lang['7_DAYS'], + 14 => $lang['2_WEEKS'], + 30 => $lang['1_MONTH'], + 90 => $lang['3_MONTHS'], + 180 => $lang['6_MONTHS'], + 364 => $lang['1_YEAR'], +); + +$sel_post_order_ary = array( + $lang['OLDEST_FIRST'] => 'asc', + $lang['NEWEST_FIRST'] => 'desc', +); + +// +// Send vars to template +// +$template->assign_vars(array( + 'PAGE_URL' => $pg_url, + 'PAGE_URL_PPP' => url_arg($pg_url, 'ppp', null), + 'PAGE_START' => $start, + 'SHOW_JUMPBOX' => true, + + 'FORUM_ID' => $forum_id, + 'FORUM_NAME' => htmlCHR($forum_name), + 'TOPIC_ID' => $topic_id, + 'PAGE_TITLE' => $topic_title, + 'TOPIC_TITLE' => wbr($topic_title), + 'PAGINATION' => $pagination, + 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], ( floor($start/$posts_per_page) + 1 ), ceil( $total_replies / $posts_per_page )), + 'PORNO_FORUM' => isset($porno_forums[$forum_id]), + 'REPLY_IMG' => $reply_img, + 'SHOW_BOT_NICK' => $bb_cfg['show_bot_nick'], + 'T_POST_REPLY' => $reply_alt, + + 'HIDE_FLAGS' => ($user->opt_js['h_flag'] && $bb_cfg['show_poster_flag']), + 'HIDE_AVATAR' => $user->opt_js['h_av'], + 'HIDE_RANK_IMG' => ($user->opt_js['h_rnk_i'] && $bb_cfg['show_rank_image']), + 'HIDE_POST_IMG' => $user->opt_js['h_post_i'], + 'HIDE_SMILE' => $user->opt_js['h_smile'], + 'HIDE_SIGNATURE' => $user->opt_js['h_sig'], + 'SPOILER_OPENED' => $user->opt_js['sp_op'], + + 'HIDE_FLAGS_DIS' => !$bb_cfg['show_poster_flag'], + 'HIDE_RANK_IMG_DIS' => !$bb_cfg['show_rank_image'], + + 'AUTH_MOD' => $is_auth['auth_mod'], + 'IN_MODERATION' => $moderation, + 'L_SELECT_PPP' => $lang['SELECT_POSTS_PER_PAGE'], + 'SELECT_PPP' => ($moderation && $select_ppp && $total_replies > $posts_per_page) ? build_select('ppp', $select_ppp, $posts_per_page, null, null, 'onchange="$(\'#ppp\').submit();"') : '', + + 'S_SELECT_POST_DAYS' => build_select('postdays', array_flip($sel_previous_days), $post_days), + 'S_SELECT_POST_ORDER' => build_select('postorder', $sel_post_order_ary, $post_order), + 'S_POST_DAYS_ACTION' => "viewtopic.php?t=$topic_id&start=$start", + 'S_AUTH_LIST' => $s_auth_can, + 'S_TOPIC_ADMIN' => $topic_mod, + 'S_WATCH_TOPIC' => $s_watching_topic, + 'S_WATCH_TOPIC_IMG' => $s_watching_topic_img, + 'U_VIEW_TOPIC' => TOPIC_URL . $topic_id, + 'U_VIEW_FORUM' => $view_forum_url, + 'U_VIEW_OLDER_TOPIC' => $view_prev_topic_url, + 'U_VIEW_NEWER_TOPIC' => $view_next_topic_url, + 'U_POST_NEW_TOPIC' => $new_topic_url, + 'U_POST_REPLY_TOPIC' => $reply_topic_url, + 'U_SEARCH_SELF' => "search.php?uid={$userdata['user_id']}&t=$topic_id&dm=1", + +)); + +// Does this topic contain DL-List? +$template->assign_vars(array( + 'SHOW_TOR_ACT' => false, + 'PEERS_FULL_LINK' => false, + 'DL_LIST_HREF' => TOPIC_URL ."$topic_id&dl=names&spmode=full", +)); +require(INC_DIR .'torrent_show_dl_list.php'); + +// +// Does this topic contain a poll? +// +if ( !empty($t_data['topic_vote']) ) +{ + $s_hidden_fields = ''; + + $sql = "SELECT vd.vote_id, vd.vote_text, vd.vote_start, vd.vote_length, vr.vote_option_id, vr.vote_option_text, vr.vote_result + FROM " . BB_VOTE_DESC . " vd, " . BB_VOTE_RESULTS . " vr + WHERE vd.topic_id = $topic_id + AND vr.vote_id = vd.vote_id + ORDER BY vr.vote_option_id ASC"; + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Could not obtain vote data for this topic", '', __LINE__, __FILE__, $sql); + } + + if ( $vote_info = DB()->sql_fetchrowset($result) ) + { + DB()->sql_freeresult($result); + $vote_options = count($vote_info); + + $vote_id = $vote_info[0]['vote_id']; + $vote_title = $vote_info[0]['vote_text']; + + $sql = "SELECT vote_id + FROM " . BB_VOTE_USERS . " + WHERE vote_id = $vote_id + AND vote_user_id = " . intval($userdata['user_id']); + if ( !($result = DB()->sql_query($sql)) ) + { + message_die(GENERAL_ERROR, "Could not obtain user vote data for this topic", '', __LINE__, __FILE__, $sql); + } + + $user_voted = ( $row = DB()->sql_fetchrow($result) ) ? TRUE : 0; + DB()->sql_freeresult($result); + + if ( isset($_GET['vote']) || isset($_POST['vote']) ) + { + $view_result = ( ( ( isset($_GET['vote']) ) ? $_GET['vote'] : $_POST['vote'] ) == 'viewresult' ) ? TRUE : 0; + } + else + { + $view_result = 0; + } + + $poll_expired = ( $vote_info[0]['vote_length'] ) ? ( ( $vote_info[0]['vote_start'] + $vote_info[0]['vote_length'] < time() ) ? TRUE : 0 ) : 0; + + if ( $user_voted || $view_result || $poll_expired || !$is_auth['auth_vote'] || $t_data['topic_status'] == TOPIC_LOCKED ) + { + $vote_results_sum = 0; + + for($i = 0; $i < $vote_options; $i++) + { + $vote_results_sum += $vote_info[$i]['vote_result']; + } + + $vote_graphic = 0; + $vote_graphic_max = count($images['voting_graphic']); + + for($i = 0; $i < $vote_options; $i++) + { + $vote_percent = ( $vote_results_sum > 0 ) ? $vote_info[$i]['vote_result'] / $vote_results_sum : 0; + $vote_graphic_length = round($vote_percent * $bb_cfg['vote_graphic_length']); + + $vote_graphic_img = $images['voting_graphic'][$vote_graphic]; + $vote_graphic = ($vote_graphic < $vote_graphic_max - 1) ? $vote_graphic + 1 : 0; + + if ( count($orig_word) ) + { + $vote_info[$i]['vote_option_text'] = preg_replace($orig_word, $replacement_word, $vote_info[$i]['vote_option_text']); + } + + $template->assign_block_vars("poll_option", array( + 'POLL_OPTION_CAPTION' => $vote_info[$i]['vote_option_text'], + 'POLL_OPTION_RESULT' => $vote_info[$i]['vote_result'], + 'POLL_OPTION_PERCENT' => sprintf("%.1d%%", ($vote_percent * 100)), + + 'POLL_OPTION_IMG' => $vote_graphic_img, + 'POLL_OPTION_IMG_WIDTH' => $vote_graphic_length) + ); + } + + $template->assign_vars(array( + 'TPL_POLL_RESULT' => true, + 'TOTAL_VOTES' => $vote_results_sum, + )); + } + else + { + for($i = 0; $i < $vote_options; $i++) + { + if ( count($orig_word) ) + { + $vote_info[$i]['vote_option_text'] = preg_replace($orig_word, $replacement_word, $vote_info[$i]['vote_option_text']); + } + + $template->assign_block_vars("poll_option", array( + 'POLL_OPTION_ID' => $vote_info[$i]['vote_option_id'], + 'POLL_OPTION_CAPTION' => $vote_info[$i]['vote_option_text']) + ); + } + + $template->assign_vars(array( + 'TPL_POLL_BALLOT' => true, + 'U_VIEW_RESULTS' => TOPIC_URL ."$topic_id&vote=viewresult", + )); + + $s_hidden_fields = ''; + } + + if ( count($orig_word) ) + { + $vote_title = preg_replace($orig_word, $replacement_word, $vote_title); + } + + $s_hidden_fields .= ''; + + $template->assign_vars(array( + 'TOPIC_HAS_POLL' => true, + 'POLL_QUESTION' => $vote_title, + + 'S_HIDDEN_FIELDS' => $s_hidden_fields, + 'S_POLL_ACTION' => "posting.php?mode=vote&t=$topic_id", + )); + } +} + +if ($t_data['topic_attachment']) +{ + require(BB_ROOT .'attach_mod/attachment_mod.php'); + init_display_post_attachments($t_data['topic_attachment']); +} + +// +// Update the topic view counter +// +$sql = "INSERT INTO ". BUF_TOPIC_VIEW ." + (topic_id, topic_views) VALUES + ($topic_id, 1) + ON DUPLICATE KEY UPDATE + topic_views = topic_views + 1"; + +if ( !DB()->sql_query($sql) ) +{ + message_die(GENERAL_ERROR, "Could not update topic views.", '', __LINE__, __FILE__, $sql); +} + +$prev_post_time = $max_post_time = 0; + +// Report +// +// Get report post module +// +require_once(INC_DIR ."functions_report.php"); +$report_post = report_modules('name', 'report_post'); +// Report [END] + +// +// Okay, let's do the loop, yeah come on baby let's do the loop +// and it goes like this ... +// +for($i = 0; $i < $total_posts; $i++) +{ + $poster_id = $postrow[$i]['user_id']; + $poster = ( $poster_id == ANONYMOUS ) ? $lang['GUEST'] : $postrow[$i]['username']; + + $post_date = bb_date($postrow[$i]['post_time'], $bb_cfg['post_date_format']); + $max_post_time = max($max_post_time, $postrow[$i]['post_time']); + + $poster_posts = ( $postrow[$i]['user_id'] != ANONYMOUS ) ? $postrow[$i]['user_posts'] : ''; + + $poster_from = ( $postrow[$i]['user_from'] && $postrow[$i]['user_id'] != ANONYMOUS ) ? $postrow[$i]['user_from'] : ''; + +// FLAGHACK-start + $poster_from_flag = ( !$user->opt_js['h_flag'] && $postrow[$i]['user_from_flag'] && $postrow[$i]['user_id'] != ANONYMOUS ) ? make_user_flag($postrow[$i]['user_from_flag']) : ""; +// FLAGHACK-end + + $poster_joined = ( $postrow[$i]['user_id'] != ANONYMOUS ) ? $lang['JOINED'] . ': ' . bb_date($postrow[$i]['user_regdate'], $lang['DATE_FORMAT']) : ''; + + + + $poster_longevity = ( $postrow[$i]['user_id'] != ANONYMOUS ) ? delta_time($postrow[$i]['user_regdate']) : ''; + + $poster_avatar = ''; + if ( !$user->opt_js['h_av'] && $poster_id != ANONYMOUS ) + { + $poster_avatar = get_avatar($postrow[$i]['user_avatar'], $postrow[$i]['user_avatar_type'], $postrow[$i]['user_allowavatar']); + } + + // + // Generate ranks, set them to empty string initially. + // + $poster_rank = $rank_image = ''; + + if (!$user->opt_js['h_rnk_i'] AND $user_rank = $postrow[$i]['user_rank'] AND isset($ranks[$user_rank])) + { + $rank_image = ($bb_cfg['show_rank_image'] && $ranks[$user_rank]['rank_image']) ? '' : ''; + $poster_rank = ($bb_cfg['show_rank_text']) ? $ranks[$user_rank]['rank_title'] : ''; + } + + // + // Handle anon users posting with usernames + // + if ( $poster_id == ANONYMOUS && $postrow[$i]['post_username'] != '' ) + { + $poster = $postrow[$i]['post_username']; + } + + // Buttons + $pm_btn = ''; + $profile_btn = ''; + + $delpost_btn = ''; + $edit_btn = ''; + $ip_btn = ''; + $quote_btn = ''; + + if ($poster_id != ANONYMOUS) + { + // profile + $profile_btn = true; + // pm + $pm_btn = true; + } + + if ($poster_id != BOT_UID) + { + // Quote + $quote_btn = true; + // Edit + $edit_btn = (($userdata['user_id'] == $poster_id && $is_auth['auth_edit']) || $is_auth['auth_mod']); + // IP + $ip_btn = ($is_auth['auth_mod'] || IS_MOD); + } + // Delete + $delpost_btn = ($postrow[$i]['post_id'] != $t_data['topic_first_post_id'] && ($is_auth['auth_mod'] || ($userdata['user_id'] == $poster_id && $is_auth['auth_delete'] && $t_data['topic_last_post_id'] == $postrow[$i]['post_id'] && $postrow[$i]['post_time'] + 3600*3 > TIMENOW))); + + // + // Parse message and sig + // + $post_subject = ( $postrow[$i]['post_subject'] != '' ) ? $postrow[$i]['post_subject'] : ''; + + $message = get_parsed_post($postrow[$i]); + + $bbcode_uid = $postrow[$i]['bbcode_uid']; + + $user_sig = ($bb_cfg['allow_sig'] && !$user->opt_js['h_sig'] && $postrow[$i]['enable_sig'] && $postrow[$i]['user_sig']) ? $postrow[$i]['user_sig'] : ''; + + if ($user_sig) + { + $user_sig = bbcode2html($user_sig); + } + + // + // Replace naughty words + // + if (count($orig_word)) + { + $post_subject = preg_replace($orig_word, $replacement_word, $post_subject); + + if ($user_sig) + { + $user_sig = str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $user_sig . '<'), 1, -1)); + } + + $message = str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1)); + } + + // + // Replace newlines (we use this rather than nl2br because + // till recently it wasn't XHTML compliant) + // + if ($user_sig) + { + $user_sig = '
    _________________
    ' . str_replace("\n", "\n
    \n", $user_sig); + } + + // + // Editing information + // + if ( $postrow[$i]['post_edit_count'] ) + { + $l_edit_time_total = ( $postrow[$i]['post_edit_count'] == 1 ) ? $lang['EDITED_TIME_TOTAL'] : $lang['EDITED_TIMES_TOTAL']; + + $l_edited_by = '

    ' . sprintf($l_edit_time_total, $poster, bb_date($postrow[$i]['post_edit_time']), $postrow[$i]['post_edit_count']); + } + else + { + $l_edited_by = ''; + } + + // + // Again this will be handled by the templating + // code at some point + // + $pg_row_class = !($i % 2) ? 'row2' : 'row1'; + + // Report + // + // Create report links + // + if ($report_post && $report_post->auth_check('auth_write')) + { + if ($postrow[$i]['post_reported']) + { + $report_auth = ($userdata['user_level'] == ADMIN || (!$bb_cfg['report_list_admin'] && (!$bb_cfg['report_subject_auth'] || $is_auth['auth_mod']))); + if ($report_post->auth_check('auth_view') && $report_auth) + { + $temp_url = append_sid("report.php?mode=reported&" . POST_CAT_URL . '=' . $report_post->id . '&id=' . $postrow[$i]['post_id']); + $target = ($bb_cfg['report_new_window']) ? ' target="_blank"' : ''; + $report_img = '' . $report_post->lang['DUPLICATE_REPORT'] . ''; + $report = '[' . $report_post->lang['DUPLICATE_REPORT'] . ']'; + } + else + { + $report_img = '' . $report_post->lang['DUPLICATE_REPORT'] . ''; + $report = '['. $report_post->lang['DUPLICATE_REPORT'] .']'; + } + } + else + { + $temp_url = append_sid("report.php?mode=" . $report_post->mode . '&id=' . $postrow[$i]['post_id']); + $report_img = '' . $report_post->lang['WRITE_REPORT'] . ''; + $report = '[' . $report_post->lang['WRITE_REPORT'] . ']'; + } + } + else + { + $report_img = $report = ''; + } + // Report [END] + + $template->assign_block_vars('postrow', array( + 'ROW_CLASS' => !($i % 2) ? 'row1' : 'row2', + 'POST_ID' => $postrow[$i]['post_id'], + 'IS_NEWEST' => ($postrow[$i]['post_id'] == $newest), + 'POSTER_NAME' => wbr($poster), + 'POSTER_NAME_JS' => addslashes($poster), + 'POSTER_RANK' => $poster_rank, + 'RANK_IMAGE' => $rank_image, + 'POSTER_JOINED' => ($bb_cfg['show_poster_joined']) ? $poster_longevity : '', + + 'POSTER_JOINED_DATE' => $poster_joined, + 'POSTER_POSTS' => ($bb_cfg['show_poster_posts']) ? $poster_posts : '', + 'POSTER_FROM' => ($bb_cfg['show_poster_from']) ? wbr($poster_from) : '', + 'POSTER_BOT' => ($poster_id == BOT_UID), + 'POSTER_ID' => $poster_id, + 'POSTED_AFTER' => ($prev_post_time) ? delta_time($postrow[$i]['post_time'], $prev_post_time) : '', + 'POSTER_FROM_FLAG' => ($bb_cfg['show_poster_flag']) ? $poster_from_flag : '', + 'IS_UNREAD' => is_unread($postrow[$i]['post_time'], $topic_id, $forum_id), + 'IS_FIRST_POST' => (!$start && ($postrow[$i]['post_id'] == $t_data['topic_first_post_id'])), + 'MOD_CHECKBOX' => ($moderation && ($start || defined('SPLIT_FORM_START'))), + 'POSTER_AVATAR' => $poster_avatar, + 'POST_NUMBER' => ($i + $start + 1), + 'POST_DATE' => $post_date, + 'POST_SUBJECT' => $post_subject, + 'MESSAGE' => $message, + 'SIGNATURE' => $user_sig, + 'EDITED_MESSAGE' => $l_edited_by, + + 'PM' => $pm_btn, + 'PROFILE' => $profile_btn, + + 'QUOTE' => $quote_btn, + 'EDIT' => $edit_btn, + 'DELETE' => $delpost_btn, + 'IP' => $ip_btn, + + // Report + 'REPORT' => ($bb_cfg['text_buttons']) ? $report : $report_img, + // Report [END] + )); + + if ($postrow[$i]['post_attachment'] && $is_auth['auth_download'] && function_exists('display_post_attachments')) + { + display_post_attachments($postrow[$i]['post_id'], $postrow[$i]['post_attachment']); + } + + if ($moderation && !defined('SPLIT_FORM_START') && ($start || $postrow[$i]['post_id'] == $t_data['topic_first_post_id'])) + { + define('SPLIT_FORM_START', TRUE); + } + + if ($poster_id != BOT_UID) + { + $prev_post_time = $postrow[$i]['post_time']; + } +} + +set_tracks(COOKIE_TOPIC, $tracking_topics, $topic_id, $max_post_time); + +if (defined('SPLIT_FORM_START')) +{ + $template->assign_vars(array( + 'SPLIT_FORM' => true, + 'START' => $start, + 'S_SPLIT_ACTION' => "modcp.php", + 'POST_FORUM_URL' => POST_FORUM_URL, + 'POST_TOPIC_URL' => POST_TOPIC_URL, + )); +} + +// +// Quick Reply +// +if ($bb_cfg['show_quick_reply']) +{ + if ($is_auth['auth_reply'] && !($t_data['forum_status'] == FORUM_LOCKED || $t_data['topic_status'] == TOPIC_LOCKED)) + { + $template->assign_vars(array( + 'QUICK_REPLY' => true, + 'QR_POST_ACTION' => "posting.php", + 'QR_TOPIC_ID' => $topic_id, + 'CAPTCHA_HTML' => (IS_GUEST) ? CAPTCHA()->get_html() : '', + )); + if (!IS_GUEST) + { + $template->assign_vars(array( + 'QR_ATTACHSIG_CHECKED' => bf($userdata['user_opt'], 'user_opt', 'attachsig'), + 'QR_NOTIFY_CHECKED' => ($userdata['user_notify'] || $is_watching_topic), + )); + } + } +} + +$template->assign_vars(array( + 'PG_ROW_CLASS' => isset($pg_row_class) ? $pg_row_class : 'row1', +)); + +if (IS_ADMIN) +{ + $template->assign_vars(array( + 'U_LOGS' => "admin/admin_log.php?sid={$userdata['session_id']}&t=$topic_id&db=900", + )); +} + +print_page('viewtopic.tpl');