aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/build.xml20
-rw-r--r--build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php225
-rw-r--r--build/code_sniffer/phpbb/Sniffs/Namespaces/UnusedUseSniff.php209
-rw-r--r--build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc19
-rw-r--r--build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php54
-rw-r--r--build/code_sniffer/phpbb/build.xml23
-rw-r--r--build/code_sniffer/phpbb/phpbbCodingStandard.php46
-rw-r--r--build/code_sniffer/ruleset-php-extensions.xml8
-rw-r--r--build/code_sniffer/ruleset-php-legacy-core.xml11
-rw-r--r--build/code_sniffer/ruleset-php-legacy.xml30
-rw-r--r--build/code_sniffer/ruleset-php-strict-core.xml9
-rw-r--r--build/code_sniffer/ruleset-php-strict.xml9
-rwxr-xr-xgit-tools/hooks/commit-msg4
-rw-r--r--phpBB/adm/images/bg_tabs1.gifbin2325 -> 0 bytes
-rw-r--r--phpBB/adm/images/bg_tabs2.gifbin541 -> 0 bytes
-rw-r--r--phpBB/adm/style/acp_attachments.html4
-rw-r--r--phpBB/adm/style/acp_forums.html8
-rw-r--r--phpBB/adm/style/acp_groups.html2
-rw-r--r--phpBB/adm/style/acp_users_avatar.html2
-rw-r--r--phpBB/adm/style/admin.css178
-rw-r--r--phpBB/adm/style/admin.js4
-rw-r--r--phpBB/adm/style/install_footer.html4
-rw-r--r--phpBB/adm/style/install_header.html2
-rw-r--r--phpBB/adm/style/install_update.html208
-rw-r--r--phpBB/adm/style/overall_footer.html18
-rw-r--r--phpBB/adm/style/overall_header.html2
-rw-r--r--phpBB/assets/javascript/core.js87
-rw-r--r--phpBB/common.php2
-rw-r--r--phpBB/composer.json11
-rw-r--r--phpBB/composer.lock323
-rw-r--r--phpBB/config/profilefields.yml9
-rw-r--r--phpBB/config/services.yml9
-rw-r--r--phpBB/develop/add_permissions.php2
-rw-r--r--phpBB/develop/benchmark.php2
-rw-r--r--phpBB/develop/create_schema_files.php185
-rw-r--r--phpBB/develop/merge_attachment_tables.php2
-rw-r--r--phpBB/develop/merge_post_tables.php4
-rw-r--r--phpBB/docs/CHANGELOG.html177
-rw-r--r--phpBB/docs/CREDITS.txt1
-rw-r--r--phpBB/docs/INSTALL.html1
-rw-r--r--phpBB/docs/README.html2
-rw-r--r--phpBB/docs/coding-guidelines.html2
-rw-r--r--phpBB/docs/events.md109
-rw-r--r--phpBB/download/file.php7
-rw-r--r--phpBB/includes/acp/acp_board.php2
-rw-r--r--phpBB/includes/acp/acp_contact.php11
-rw-r--r--phpBB/includes/acp/acp_database.php276
-rw-r--r--phpBB/includes/acp/acp_extensions.php14
-rw-r--r--phpBB/includes/acp/acp_forums.php2
-rw-r--r--phpBB/includes/acp/acp_icons.php3
-rw-r--r--phpBB/includes/acp/acp_jabber.php14
-rw-r--r--phpBB/includes/acp/acp_main.php6
-rw-r--r--phpBB/includes/acp/acp_permission_roles.php6
-rw-r--r--phpBB/includes/acp/acp_permissions.php2
-rw-r--r--phpBB/includes/acp/acp_profile.php9
-rw-r--r--phpBB/includes/acp/acp_prune.php4
-rw-r--r--phpBB/includes/acp/acp_reasons.php3
-rw-r--r--phpBB/includes/acp/acp_styles.php4
-rw-r--r--phpBB/includes/acp/acp_users.php4
-rw-r--r--phpBB/includes/acp/auth.php4
-rw-r--r--phpBB/includes/acp/info/acp_contact.php10
-rw-r--r--phpBB/includes/constants.php2
-rw-r--r--phpBB/includes/functions.php38
-rw-r--r--phpBB/includes/functions_admin.php28
-rw-r--r--phpBB/includes/functions_container.php14
-rw-r--r--phpBB/includes/functions_content.php42
-rw-r--r--phpBB/includes/functions_convert.php13
-rw-r--r--phpBB/includes/functions_display.php169
-rw-r--r--phpBB/includes/functions_install.php93
-rw-r--r--phpBB/includes/functions_mcp.php666
-rw-r--r--phpBB/includes/functions_module.php20
-rw-r--r--phpBB/includes/functions_posting.php134
-rw-r--r--phpBB/includes/functions_privmsgs.php27
-rw-r--r--phpBB/includes/functions_upload.php31
-rw-r--r--phpBB/includes/functions_user.php53
-rw-r--r--phpBB/includes/mcp/mcp_ban.php2
-rw-r--r--phpBB/includes/mcp/mcp_forum.php8
-rw-r--r--phpBB/includes/mcp/mcp_main.php44
-rw-r--r--phpBB/includes/mcp/mcp_pm_reports.php4
-rw-r--r--phpBB/includes/mcp/mcp_post.php6
-rw-r--r--phpBB/includes/mcp/mcp_queue.php22
-rw-r--r--phpBB/includes/mcp/mcp_reports.php14
-rw-r--r--phpBB/includes/mcp/mcp_topic.php22
-rw-r--r--phpBB/includes/message_parser.php17
-rw-r--r--phpBB/includes/ucp/ucp_pm_viewmessage.php12
-rw-r--r--phpBB/includes/utf/utf_tools.php2
-rw-r--r--phpBB/install/convertors/convert_phpbb20.php2
-rw-r--r--phpBB/install/convertors/functions_phpbb20.php17
-rw-r--r--phpBB/install/database_update.php8
-rw-r--r--phpBB/install/index.php6
-rw-r--r--phpBB/install/install_convert.php33
-rw-r--r--phpBB/install/install_install.php56
-rw-r--r--phpBB/install/install_update.php44
-rw-r--r--phpBB/install/phpinfo.php11
-rw-r--r--phpBB/install/schemas/firebird_schema.sql5
-rw-r--r--phpBB/install/schemas/mssql_schema.sql8
-rw-r--r--phpBB/install/schemas/mysql_40_schema.sql5
-rw-r--r--phpBB/install/schemas/mysql_41_schema.sql5
-rw-r--r--phpBB/install/schemas/oracle_schema.sql8
-rw-r--r--phpBB/install/schemas/postgres_schema.sql7
-rw-r--r--phpBB/install/schemas/schema.json20
-rw-r--r--phpBB/install/schemas/schema_data.sql7
-rw-r--r--phpBB/install/schemas/sqlite_schema.sql5
-rw-r--r--phpBB/language/en/acp/board.php4
-rw-r--r--phpBB/language/en/acp/common.php2
-rw-r--r--phpBB/language/en/acp/forums.php4
-rw-r--r--phpBB/language/en/acp/profile.php3
-rw-r--r--phpBB/language/en/acp/search.php1
-rw-r--r--phpBB/language/en/acp/styles.php4
-rw-r--r--phpBB/language/en/common.php60
-rw-r--r--phpBB/language/en/help_faq.php6
-rw-r--r--phpBB/language/en/install.php12
-rw-r--r--phpBB/language/en/memberlist.php6
-rw-r--r--phpBB/language/en/plupload.php2
-rw-r--r--phpBB/language/en/posting.php3
-rw-r--r--phpBB/language/en/ucp.php3
-rw-r--r--phpBB/mcp.php649
-rw-r--r--phpBB/memberlist.php181
-rw-r--r--phpBB/phpbb/auth/auth.php4
-rw-r--r--phpBB/phpbb/auth/provider/oauth/oauth.php10
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/facebook.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/google.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/service_interface.php2
-rw-r--r--phpBB/phpbb/auth/provider/oauth/token_storage.php5
-rw-r--r--phpBB/phpbb/auth/provider/provider_interface.php2
-rw-r--r--phpBB/phpbb/auth/provider_collection.php4
-rw-r--r--phpBB/phpbb/avatar/driver/driver.php11
-rw-r--r--phpBB/phpbb/avatar/driver/gravatar.php12
-rw-r--r--phpBB/phpbb/avatar/driver/local.php10
-rw-r--r--phpBB/phpbb/avatar/driver/remote.php8
-rw-r--r--phpBB/phpbb/avatar/driver/upload.php14
-rw-r--r--phpBB/phpbb/cache/driver/driver_interface.php2
-rw-r--r--phpBB/phpbb/cache/driver/file.php4
-rw-r--r--phpBB/phpbb/cache/service.php9
-rw-r--r--phpBB/phpbb/console/command/cache/purge.php23
-rw-r--r--phpBB/phpbb/console/command/config/delete.php15
-rw-r--r--phpBB/phpbb/console/command/config/get.php16
-rw-r--r--phpBB/phpbb/console/command/config/increment.php14
-rw-r--r--phpBB/phpbb/console/command/config/set.php14
-rw-r--r--phpBB/phpbb/console/command/config/set_atomic.php15
-rw-r--r--phpBB/phpbb/console/command/cron/cron_list.php25
-rw-r--r--phpBB/phpbb/console/command/cron/run.php9
-rw-r--r--phpBB/phpbb/console/command/extension/disable.php2
-rw-r--r--phpBB/phpbb/console/command/extension/enable.php4
-rw-r--r--phpBB/phpbb/console/command/extension/purge.php2
-rw-r--r--phpBB/phpbb/content_visibility.php7
-rw-r--r--phpBB/phpbb/controller/helper.php6
-rw-r--r--phpBB/phpbb/controller/provider.php8
-rw-r--r--phpBB/phpbb/controller/resolver.php2
-rw-r--r--phpBB/phpbb/cron/manager.php4
-rw-r--r--phpBB/phpbb/cron/task/core/prune_shadow_topics.php5
-rw-r--r--phpBB/phpbb/datetime.php6
-rw-r--r--phpBB/phpbb/db/driver/driver.php96
-rw-r--r--phpBB/phpbb/db/driver/driver_interface.php84
-rw-r--r--phpBB/phpbb/db/driver/factory.php435
-rw-r--r--phpBB/phpbb/db/driver/firebird.php526
-rw-r--r--phpBB/phpbb/db/driver/mssql.php8
-rw-r--r--phpBB/phpbb/db/driver/mssql_odbc.php8
-rw-r--r--phpBB/phpbb/db/driver/mssqlnative.php14
-rw-r--r--phpBB/phpbb/db/driver/mysql.php8
-rw-r--r--phpBB/phpbb/db/driver/mysqli.php51
-rw-r--r--phpBB/phpbb/db/driver/oracle.php8
-rw-r--r--phpBB/phpbb/db/driver/postgres.php8
-rw-r--r--phpBB/phpbb/db/driver/sqlite.php8
-rw-r--r--phpBB/phpbb/db/driver/sqlite3.php8
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php13
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php10
-rw-r--r--phpBB/phpbb/db/migration/data/v310/contact_admin_form.php10
-rw-r--r--phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php60
-rw-r--r--phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php60
-rw-r--r--phpBB/phpbb/db/migration/data/v310/profilefield_skype.php60
-rw-r--r--phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php60
-rw-r--r--phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php60
-rw-r--r--phpBB/phpbb/db/migration/data/v310/rc1.php39
-rw-r--r--phpBB/phpbb/db/migration/migration.php6
-rw-r--r--phpBB/phpbb/db/migration/profilefield_base_migration.php3
-rw-r--r--phpBB/phpbb/db/migration/schema_generator.php2
-rw-r--r--phpBB/phpbb/db/migration/tool/config.php2
-rw-r--r--phpBB/phpbb/db/migration/tool/module.php3
-rw-r--r--phpBB/phpbb/db/migration/tool/permission.php3
-rw-r--r--phpBB/phpbb/db/migrator.php10
-rw-r--r--phpBB/phpbb/db/sql_insert_buffer.php2
-rw-r--r--phpBB/phpbb/db/tools.php181
-rw-r--r--phpBB/phpbb/di/extension/config.php6
-rw-r--r--phpBB/phpbb/di/extension/core.php2
-rw-r--r--phpBB/phpbb/di/extension/ext.php2
-rw-r--r--phpBB/phpbb/di/pass/kernel_pass.php1
-rw-r--r--phpBB/phpbb/event/dispatcher.php5
-rw-r--r--phpBB/phpbb/event/dispatcher_interface.php40
-rw-r--r--phpBB/phpbb/event/md_exporter.php2
-rw-r--r--phpBB/phpbb/event/php_exporter.php2
-rw-r--r--phpBB/phpbb/event/recursive_event_filter_iterator.php3
-rw-r--r--phpBB/phpbb/extension/manager.php46
-rw-r--r--phpBB/phpbb/extension/metadata_manager.php89
-rw-r--r--phpBB/phpbb/extension/provider.php2
-rw-r--r--phpBB/phpbb/feed/base.php21
-rw-r--r--phpBB/phpbb/feed/factory.php11
-rw-r--r--phpBB/phpbb/feed/helper.php2
-rw-r--r--phpBB/phpbb/feed/post_base.php4
-rw-r--r--phpBB/phpbb/feed/topic_base.php4
-rw-r--r--phpBB/phpbb/filesystem.php2
-rw-r--r--phpBB/phpbb/groupposition/legend.php18
-rw-r--r--phpBB/phpbb/groupposition/teampage.php27
-rw-r--r--phpBB/phpbb/lock/db.php4
-rw-r--r--phpBB/phpbb/log/log.php27
-rw-r--r--phpBB/phpbb/message/admin_form.php12
-rw-r--r--phpBB/phpbb/message/form.php12
-rw-r--r--phpBB/phpbb/message/message.php16
-rw-r--r--phpBB/phpbb/message/topic_form.php12
-rw-r--r--phpBB/phpbb/message/user_form.php12
-rw-r--r--phpBB/phpbb/mimetype/content_guesser.php4
-rw-r--r--phpBB/phpbb/mimetype/extension_guesser.php4
-rw-r--r--phpBB/phpbb/mimetype/guesser.php2
-rw-r--r--phpBB/phpbb/mimetype/guesser_base.php4
-rw-r--r--phpBB/phpbb/notification/manager.php9
-rw-r--r--phpBB/phpbb/notification/type/base.php49
-rw-r--r--phpBB/phpbb/notification/type/disapprove_post.php36
-rw-r--r--phpBB/phpbb/notification/type/disapprove_topic.php36
-rw-r--r--phpBB/phpbb/notification/type/pm.php15
-rw-r--r--phpBB/phpbb/notification/type/post.php14
-rw-r--r--phpBB/phpbb/notification/type/report_pm.php48
-rw-r--r--phpBB/phpbb/notification/type/report_pm_closed.php14
-rw-r--r--phpBB/phpbb/notification/type/report_post.php48
-rw-r--r--phpBB/phpbb/notification/type/report_post_closed.php14
-rw-r--r--phpBB/phpbb/notification/type/topic.php28
-rw-r--r--phpBB/phpbb/notification/type/type_interface.php21
-rw-r--r--phpBB/phpbb/pagination.php2
-rw-r--r--phpBB/phpbb/passwords/driver/base.php10
-rw-r--r--phpBB/phpbb/passwords/driver/bcrypt.php8
-rw-r--r--phpBB/phpbb/passwords/driver/bcrypt_2y.php4
-rw-r--r--phpBB/phpbb/passwords/driver/bcrypt_wcf2.php10
-rw-r--r--phpBB/phpbb/passwords/driver/convert_password.php6
-rw-r--r--phpBB/phpbb/passwords/driver/driver_interface.php2
-rw-r--r--phpBB/phpbb/passwords/driver/helper.php4
-rw-r--r--phpBB/phpbb/passwords/driver/md5_mybb.php8
-rw-r--r--phpBB/phpbb/passwords/driver/md5_phpbb2.php12
-rw-r--r--phpBB/phpbb/passwords/driver/md5_vb.php8
-rw-r--r--phpBB/phpbb/passwords/driver/phpass.php2
-rw-r--r--phpBB/phpbb/passwords/driver/salted_md5.php10
-rw-r--r--phpBB/phpbb/passwords/driver/sha1.php8
-rw-r--r--phpBB/phpbb/passwords/driver/sha1_smf.php8
-rw-r--r--phpBB/phpbb/passwords/driver/sha1_wcf1.php8
-rw-r--r--phpBB/phpbb/passwords/driver/sha_xf1.php8
-rw-r--r--phpBB/phpbb/passwords/helper.php2
-rw-r--r--phpBB/phpbb/passwords/manager.php10
-rw-r--r--phpBB/phpbb/path_helper.php33
-rw-r--r--phpBB/phpbb/permissions.php7
-rw-r--r--phpBB/phpbb/plupload/plupload.php2
-rw-r--r--phpBB/phpbb/profilefields/lang_helper.php61
-rw-r--r--phpBB/phpbb/profilefields/manager.php37
-rw-r--r--phpBB/phpbb/profilefields/type/type_base.php1
-rw-r--r--phpBB/phpbb/profilefields/type/type_bool.php30
-rw-r--r--phpBB/phpbb/profilefields/type/type_date.php14
-rw-r--r--phpBB/phpbb/profilefields/type/type_dropdown.php32
-rw-r--r--phpBB/phpbb/profilefields/type/type_googleplus.php58
-rw-r--r--phpBB/phpbb/profilefields/type/type_int.php13
-rw-r--r--phpBB/phpbb/profilefields/type/type_interface.php9
-rw-r--r--phpBB/phpbb/profilefields/type/type_string.php1
-rw-r--r--phpBB/phpbb/profilefields/type/type_string_common.php15
-rw-r--r--phpBB/phpbb/profilefields/type/type_text.php1
-rw-r--r--phpBB/phpbb/search/base.php4
-rw-r--r--phpBB/phpbb/search/fulltext_mysql.php8
-rw-r--r--phpBB/phpbb/search/fulltext_native.php11
-rw-r--r--phpBB/phpbb/search/fulltext_postgres.php39
-rw-r--r--phpBB/phpbb/search/fulltext_sphinx.php10
-rw-r--r--phpBB/phpbb/symfony_request.php2
-rw-r--r--phpBB/phpbb/template/context.php5
-rw-r--r--phpBB/phpbb/template/template.php1
-rw-r--r--phpBB/phpbb/template/twig/environment.php30
-rw-r--r--phpBB/phpbb/template/twig/extension.php2
-rw-r--r--phpBB/phpbb/template/twig/lexer.php2
-rw-r--r--phpBB/phpbb/template/twig/loader.php6
-rw-r--r--phpBB/phpbb/template/twig/node/definenode.php8
-rw-r--r--phpBB/phpbb/template/twig/node/event.php16
-rw-r--r--phpBB/phpbb/template/twig/node/includeasset.php12
-rw-r--r--phpBB/phpbb/template/twig/node/includenode.php8
-rw-r--r--phpBB/phpbb/template/twig/node/includephp.php10
-rw-r--r--phpBB/phpbb/template/twig/node/php.php10
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/defineparser.php22
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/event.php20
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includecss.php20
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includejs.php20
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includeparser.php20
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includephp.php20
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/php.php20
-rw-r--r--phpBB/phpbb/template/twig/twig.php6
-rw-r--r--phpBB/phpbb/tree/nestedset.php23
-rw-r--r--phpBB/phpbb/viewonline_helper.php37
-rw-r--r--phpBB/posting.php150
-rw-r--r--phpBB/search.php13
-rw-r--r--phpBB/styles/prosilver/style.cfg4
-rw-r--r--phpBB/styles/prosilver/template/ajax.js31
-rw-r--r--phpBB/styles/prosilver/template/forum_fn.js333
-rw-r--r--phpBB/styles/prosilver/template/index_body.html28
-rw-r--r--phpBB/styles/prosilver/template/jumpbox.html28
-rw-r--r--phpBB/styles/prosilver/template/mcp_forum.html13
-rw-r--r--phpBB/styles/prosilver/template/mcp_header.html4
-rw-r--r--phpBB/styles/prosilver/template/mcp_topic.html20
-rw-r--r--phpBB/styles/prosilver/template/memberlist_search.html2
-rw-r--r--phpBB/styles/prosilver/template/navbar_footer.html22
-rw-r--r--phpBB/styles/prosilver/template/navbar_header.html119
-rw-r--r--phpBB/styles/prosilver/template/notification_dropdown.html11
-rw-r--r--phpBB/styles/prosilver/template/overall_header.html2
-rw-r--r--phpBB/styles/prosilver/template/pagination.html2
-rw-r--r--phpBB/styles/prosilver/template/posting_attach_body.html2
-rw-r--r--phpBB/styles/prosilver/template/posting_editor.html18
-rw-r--r--phpBB/styles/prosilver/template/ucp_avatar_options.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_header.html4
-rw-r--r--phpBB/styles/prosilver/template/ucp_notifications.html11
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_viewmessage.html4
-rw-r--r--phpBB/styles/prosilver/template/ucp_register.html5
-rw-r--r--phpBB/styles/prosilver/template/viewforum_body.html27
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_body.html36
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_topic_tools.html8
-rw-r--r--phpBB/styles/prosilver/theme/bidi.css253
-rw-r--r--phpBB/styles/prosilver/theme/buttons.css29
-rw-r--r--phpBB/styles/prosilver/theme/colours.css239
-rw-r--r--phpBB/styles/prosilver/theme/common.css237
-rw-r--r--phpBB/styles/prosilver/theme/content.css25
-rw-r--r--phpBB/styles/prosilver/theme/cp.css190
-rw-r--r--phpBB/styles/prosilver/theme/forms.css28
-rw-r--r--phpBB/styles/prosilver/theme/images/bg_menu.gifbin354 -> 0 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/bg_menu_rtl.gifbin345 -> 0 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/bg_tabs1.gifbin1520 -> 0 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/bg_tabs2.gifbin420 -> 0 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/corners_left2.gifbin112 -> 0 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/corners_right2.gifbin111 -> 0 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icon_acp.gifbin0 -> 389 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icon_delete_cookies.gifbin0 -> 108 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icon_mcp.gifbin0 -> 342 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icon_profile.gifbin0 -> 538 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icon_team.gifbin0 -> 1009 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icons_button.pngbin5690 -> 6478 bytes
-rw-r--r--phpBB/styles/prosilver/theme/links.css50
-rw-r--r--phpBB/styles/prosilver/theme/print.css10
-rw-r--r--phpBB/styles/prosilver/theme/responsive.css48
-rw-r--r--phpBB/styles/prosilver/theme/tweaks.css10
-rw-r--r--phpBB/styles/subsilver2/style.cfg4
-rw-r--r--phpBB/styles/subsilver2/template/breadcrumbs.html2
-rw-r--r--phpBB/styles/subsilver2/template/index_body.html4
-rw-r--r--phpBB/styles/subsilver2/template/overall_header.html17
-rw-r--r--phpBB/styles/subsilver2/template/ucp_groups_manage.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_notifications.html6
-rw-r--r--phpBB/styles/subsilver2/template/ucp_profile_avatar.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_register.html6
-rw-r--r--phpBB/styles/subsilver2/theme/stylesheet.css25
-rw-r--r--phpBB/ucp.php20
-rw-r--r--phpBB/viewonline.php9
-rw-r--r--phpBB/viewtopic.php20
-rw-r--r--tests/RUNNING_TESTS.md13
-rw-r--r--tests/auth/fixtures/oauth_tokens.xml6
-rw-r--r--tests/auth/phpbb_not_a_token.php23
-rw-r--r--tests/auth/provider_oauth_token_storage_test.php18
-rw-r--r--tests/bootstrap.php1
-rw-r--r--tests/console/cron/cron_list_test.php2
-rw-r--r--tests/content_visibility/delete_post_test.php4
-rw-r--r--tests/dbal/db_tools_test.php29
-rw-r--r--tests/dbal/order_lower_test.php2
-rw-r--r--tests/dbal/select_test.php4
-rw-r--r--tests/dbal/sql_insert_buffer_test.php8
-rw-r--r--tests/event/php_exporter_test.php2
-rw-r--r--tests/extension/ext/barfoo/composer.json8
-rw-r--r--tests/extension/ext/vendor/moo/composer.json8
-rw-r--r--tests/extension/ext/vendor2/bar/composer.json8
-rw-r--r--tests/extension/ext/vendor2/foo/composer.json8
-rw-r--r--tests/extension/manager_test.php46
-rw-r--r--tests/extension/metadata_manager_test.php324
-rw-r--r--tests/filesystem/clean_path_test.php2
-rw-r--r--tests/functional/download_test.php6
-rw-r--r--tests/functional/feed_test.php6
-rw-r--r--tests/functional/fileupload_form_test.php2
-rw-r--r--tests/functional/fileupload_remote_test.php2
-rw-r--r--tests/functional/fixtures/ext/foo/bar/composer.json8
-rw-r--r--tests/functional/forgot_password_test.php2
-rw-r--r--tests/functional/jumpbox_test.php20
-rw-r--r--tests/functional/mcp_test.php6
-rw-r--r--tests/functional/plupload_test.php2
-rw-r--r--tests/functional/posting_test.php23
-rw-r--r--tests/functional/ucp_profile_test.php12
-rw-r--r--tests/functional/visibility_softdelete_test.php40
-rw-r--r--tests/functions/convert_30_dbms_to_31_test.php1
-rw-r--r--tests/functions/obtain_online_test.php8
-rw-r--r--tests/functions_content/get_username_string_test.php14
-rw-r--r--tests/log/function_view_log_test.php26
-rw-r--r--tests/notification/user_list_trim_test.php10
-rw-r--r--tests/path_helper/path_helper_test.php39
-rw-r--r--tests/profile/custom_string_test.php120
-rw-r--r--tests/profile/custom_test.php75
-rw-r--r--tests/profile/fixtures/profile_fields.xml31
-rw-r--r--tests/profile/get_profile_value_test.php46
-rw-r--r--tests/profilefields/type_bool_test.php195
-rw-r--r--tests/profilefields/type_date_test.php228
-rw-r--r--tests/profilefields/type_dropdown_test.php235
-rw-r--r--tests/profilefields/type_googleplus_test.php62
-rw-r--r--tests/profilefields/type_int_test.php236
-rw-r--r--tests/profilefields/type_string_test.php286
-rw-r--r--tests/profilefields/type_url_test.php141
-rw-r--r--tests/template/template_test.php7
-rw-r--r--tests/template/templates/if_nested_tags.html1
-rw-r--r--tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php2
-rw-r--r--tests/test_framework/phpbb_database_test_case.php31
-rw-r--r--tests/test_framework/phpbb_database_test_connection_manager.php50
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php219
-rw-r--r--tests/test_framework/phpbb_mink_test_case.php183
-rw-r--r--tests/text_processing/make_clickable_test.php45
-rw-r--r--tests/viewonline/helper_test.php42
-rwxr-xr-xtravis/ext-sniff.sh27
-rwxr-xr-xtravis/setup-webserver.sh1
413 files changed, 8392 insertions, 5539 deletions
diff --git a/build/build.xml b/build/build.xml
index 510e7d0955..7d0068bec9 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -2,9 +2,9 @@
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build -->
- <property name="newversion" value="3.1.0-b5-dev" />
- <property name="prevversion" value="3.1.0-b4" />
- <property name="olderversions" value="3.0.12, 3.1.0-a1, 3.1.0-a2, 3.1.0-a3, 3.1.0-b1, 3.1.0-b2, 3.1.0-b3" />
+ <property name="newversion" value="3.1.0-RC2-dev" />
+ <property name="prevversion" value="3.1.0-RC1" />
+ <property name="olderversions" value="3.0.12, 3.1.0-a1, 3.1.0-a2, 3.1.0-a3, 3.1.0-b1, 3.1.0-b2, 3.1.0-b3, 3.1.0-b4" />
<!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" />
@@ -77,16 +77,17 @@
<exec command="phpBB/vendor/bin/phpcs
-s
--extensions=php
- --standard=build/code_sniffer/ruleset-php-strict.xml
+ --standard=build/code_sniffer/ruleset-php-strict-core.xml
--ignore=${project.basedir}/phpBB/phpbb/db/migration/data/v30x/*
phpBB/phpbb"
dir="." returnProperty="retval-php-strict" passthru="true" />
<exec command="phpBB/vendor/bin/phpcs
-s
--extensions=php
- --standard=build/code_sniffer/ruleset-php-legacy.xml
+ --standard=build/code_sniffer/ruleset-php-legacy-core.xml
--ignore=${project.basedir}/phpBB/cache/*
--ignore=${project.basedir}/phpBB/develop/*
+ --ignore=${project.basedir}/phpBB/ext/*
--ignore=${project.basedir}/phpBB/includes/diff/*.php
--ignore=${project.basedir}/phpBB/includes/sphinxapi.php
--ignore=${project.basedir}/phpBB/includes/utf/data/*
@@ -96,10 +97,19 @@
--ignore=${project.basedir}/phpBB/vendor/*
phpBB"
dir="." returnProperty="retval-php-legacy" passthru="true" />
+ <exec command="phpBB/vendor/bin/phpcs
+ -s
+ --extensions=php
+ --standard=build/code_sniffer/ruleset-php-extensions.xml
+ --ignore=${project.basedir}/phpBB/ext/*/tests/*
+ --ignore=${project.basedir}/phpBB/ext/*/vendor/*
+ phpBB/ext"
+ dir="." returnProperty="retval-php-ext" passthru="true" />
<if>
<or>
<not><equals arg1="${retval-php-strict}" arg2="0" /></not>
<not><equals arg1="${retval-php-legacy}" arg2="0" /></not>
+ <not><equals arg1="${retval-php-ext}" arg2="0" /></not>
</or>
<then>
<fail message="PHP Code Sniffer failed." />
diff --git a/build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php b/build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php
index fcf53b5061..fa7d3b40c1 100644
--- a/build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php
+++ b/build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php
@@ -12,9 +12,8 @@
*/
/**
-* Checks that each source file contains the standard header.
-*
-* Based on Coding Guidelines 1.ii File Header.
+* Checks that each PHP source file contains a valid header as defined by the
+* phpBB Coding Guidelines.
*
* @package code_sniffer
* @author Manuel Pichler <mapi@phpundercontrol.org>
@@ -47,10 +46,10 @@ class phpbb_Sniffs_Commenting_FileCommentSniff implements PHP_CodeSniffer_Sniff
{
if ($phpcsFile->findPrevious(T_OPEN_TAG, $stackPtr - 1) !== false)
{
- return;
+ return;
}
}
-
+
// Fetch next non whitespace token
$tokens = $phpcsFile->getTokens();
$start = $phpcsFile->findNext(T_WHITESPACE, $stackPtr + 1, null, true);
@@ -66,65 +65,68 @@ class phpbb_Sniffs_Commenting_FileCommentSniff implements PHP_CodeSniffer_Sniff
$phpcsFile->addError('Missing required file doc comment.', $stackPtr);
return;
}
-
+
// Find comment end token
$end = $phpcsFile->findNext(T_DOC_COMMENT, $start + 1, null, true) - 1;
-
+
// If there is no end, skip processing here
if ($end === false)
{
return;
}
-
+
// List of found comment tags
$tags = array();
-
+
// check comment lines without the first(/**) an last(*/) line
- for ($i = $start + 1, $c = ($end - $start); $i <= $c; ++$i)
+ for ($i = $start + 1, $c = $end - 1; $i <= $c; ++$i)
{
$line = $tokens[$i]['content'];
// Check that each line starts with a '*'
if (substr($line, 0, 1) !== '*')
{
- $message = 'The file doc comment should not be idented.';
+ $message = 'The file doc comment should not be idented.';
$phpcsFile->addWarning($message, $i);
}
else if (preg_match('/^\*\s+@([\w]+)\s+(.*)$/', $line, $match) !== 0)
{
- $tags[$match[1]] = array($match[2], $i);
+ if (!isset($tags[$match[1]]))
+ {
+ $tags[$match[1]] = array();
+ }
+
+ $tags[$match[1]][] = array($match[2], $i);
}
}
-
+
// Check that the first and last line is empty
if (trim($tokens[$start + 1]['content']) !== '*')
{
$message = 'The first file comment line should be empty.';
- $phpcsFile->addWarning($message, ($start + 1));
- }
- if (trim($tokens[$end - $start]['content']) !== '*')
- {
- $message = 'The last file comment line should be empty.';
- $phpcsFile->addWarning($message, ($end - $start));
- }
-
- $this->processPackage($phpcsFile, $start, $tags);
- $this->processVersion($phpcsFile, $start, $tags);
- $this->processCopyright($phpcsFile, $start, $tags);
- $this->processLicense($phpcsFile, $start, $tags);
-
- //print_r($tags);
+ $phpcsFile->addWarning($message, ($start + 1));
+ }
+ if (trim($tokens[$end - 1]['content']) !== '*')
+ {
+ $message = 'The last file comment line should be empty.';
+ $phpcsFile->addWarning($message, $end - 1);
+ }
+
+ //$this->processPackage($phpcsFile, $start, $tags);
+ //$this->processVersion($phpcsFile, $start, $tags);
+ $this->processCopyright($phpcsFile, $start, $tags);
+ $this->processLicense($phpcsFile, $start, $tags);
}
-
+
/**
- * Checks that the tags array contains a valid package tag
- *
- * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
- * @param integer The stack pointer for the first comment token.
- * @param array(string=>array) $tags The found file doc comment tags.
- *
- * @return null
- */
+ * Checks that the tags array contains a valid package tag
+ *
+ * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
+ * @param integer The stack pointer for the first comment token.
+ * @param array(string=>array) $tags The found file doc comment tags.
+ *
+ * @return null
+ */
protected function processPackage(PHP_CodeSniffer_File $phpcsFile, $ptr, $tags)
{
if (!isset($tags['package']))
@@ -134,80 +136,87 @@ class phpbb_Sniffs_Commenting_FileCommentSniff implements PHP_CodeSniffer_Sniff
}
else if (preg_match('/^([\w]+)$/', $tags['package'][0]) === 0)
{
- $message = 'Invalid content found for @package tag.';
- $phpcsFile->addWarning($message, $tags['package'][1]);
+ $message = 'Invalid content found for @package tag.';
+ $phpcsFile->addWarning($message, $tags['package'][1]);
}
}
-
+
/**
- * Checks that the tags array contains a valid version tag
- *
- * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
- * @param integer The stack pointer for the first comment token.
- * @param array(string=>array) $tags The found file doc comment tags.
- *
- * @return null
- */
+ * Checks that the tags array contains a valid version tag
+ *
+ * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
+ * @param integer The stack pointer for the first comment token.
+ * @param array(string=>array) $tags The found file doc comment tags.
+ *
+ * @return null
+ */
protected function processVersion(PHP_CodeSniffer_File $phpcsFile, $ptr, $tags)
- {
- if (!isset($tags['version']))
- {
- $message = 'Missing require @version tag in file doc comment.';
- $phpcsFile->addError($message, $ptr);
- }
- else if (preg_match('/^\$Id:[^\$]+\$$/', $tags['version'][0]) === 0)
- {
- $message = 'Invalid content found for @version tag, use "$Id: $".';
- $phpcsFile->addError($message, $tags['version'][1]);
- }
- }
-
- /**
- * Checks that the tags array contains a valid copyright tag
- *
- * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
- * @param integer The stack pointer for the first comment token.
- * @param array(string=>array) $tags The found file doc comment tags.
- *
- * @return null
- */
- protected function processCopyright(PHP_CodeSniffer_File $phpcsFile, $ptr, $tags)
- {
- if (!isset($tags['copyright']))
- {
- $message = 'Missing require @copyright tag in file doc comment.';
- $phpcsFile->addError($message, $ptr);
- }
- else if (preg_match('/^\(c\) 2[0-9]{3} phpBB Group\s*$/', $tags['copyright'][0]) === 0)
- {
- $message = 'Invalid content found for @copyright tag, use "(c) <year> phpBB Group".';
- $phpcsFile->addError($message, $tags['copyright'][1]);
- }
- }
-
- /**
- * Checks that the tags array contains a valid license tag
- *
- * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
- * @param integer The stack pointer for the first comment token.
- * @param array(string=>array) $tags The found file doc comment tags.
- *
- * @return null
- */
- protected function processLicense(PHP_CodeSniffer_File $phpcsFile, $ptr, $tags)
- {
- $license = 'http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2';
-
- if (!isset($tags['license']))
- {
- $message = 'Missing require @license tag in file doc comment.';
- $phpcsFile->addError($message, $ptr);
- }
- else if (trim($tags['license'][0]) !== $license)
- {
- $message = 'Invalid content found for @license tag, use '
- . '"' . $license . '".';
- $phpcsFile->addError($message, $tags['license'][1]);
- }
- }
+ {
+ if (!isset($tags['version']))
+ {
+ $message = 'Missing require @version tag in file doc comment.';
+ $phpcsFile->addError($message, $ptr);
+ }
+ else if (preg_match('/^\$Id:[^\$]+\$$/', $tags['version'][0]) === 0)
+ {
+ $message = 'Invalid content found for @version tag, use "$Id: $".';
+ $phpcsFile->addError($message, $tags['version'][1]);
+ }
+ }
+
+ /**
+ * Checks that the tags array contains a valid copyright tag
+ *
+ * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
+ * @param integer The stack pointer for the first comment token.
+ * @param array(string=>array) $tags The found file doc comment tags.
+ *
+ * @return null
+ */
+ protected function processCopyright(PHP_CodeSniffer_File $phpcsFile, $ptr, $tags)
+ {
+ $copyright = '(c) phpBB Limited <https://www.phpbb.com>';
+
+ if (!isset($tags['copyright']))
+ {
+ $message = 'Missing require @copyright tag in file doc comment.';
+ $phpcsFile->addError($message, $ptr);
+ }
+ else if ($tags['copyright'][0][0] !== $copyright)
+ {
+ $message = 'Invalid content found for the first @copyright tag, use "' . $copyright . '".';
+ $phpcsFile->addError($message, $tags['copyright'][0][1]);
+ }
+ }
+
+ /**
+ * Checks that the tags array contains a valid license tag
+ *
+ * @param PHP_CodeSniffer_File $phpcsFile The context source file instance.
+ * @param integer The stack pointer for the first comment token.
+ * @param array(string=>array) $tags The found file doc comment tags.
+ *
+ * @return null
+ */
+ protected function processLicense(PHP_CodeSniffer_File $phpcsFile, $ptr, $tags)
+ {
+ $license = 'GNU General Public License, version 2 (GPL-2.0)';
+
+ if (!isset($tags['license']))
+ {
+ $message = 'Missing require @license tag in file doc comment.';
+ $phpcsFile->addError($message, $ptr);
+ }
+ else if (sizeof($tags['license']) !== 1)
+ {
+ $message = 'It must be only one @license tag in file doc comment.';
+ $phpcsFile->addError($message, $ptr);
+ }
+ else if (trim($tags['license'][0][0]) !== $license)
+ {
+ $message = 'Invalid content found for @license tag, use '
+ . '"' . $license . '".';
+ $phpcsFile->addError($message, $tags['license'][0][1]);
+ }
+ }
}
diff --git a/build/code_sniffer/phpbb/Sniffs/Namespaces/UnusedUseSniff.php b/build/code_sniffer/phpbb/Sniffs/Namespaces/UnusedUseSniff.php
new file mode 100644
index 0000000000..16e3427bd9
--- /dev/null
+++ b/build/code_sniffer/phpbb/Sniffs/Namespaces/UnusedUseSniff.php
@@ -0,0 +1,209 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+/**
+* Checks that each use statement is used.
+*/
+class phpbb_Sniffs_Namespaces_UnusedUseSniff implements PHP_CodeSniffer_Sniff
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function register()
+ {
+ return array(T_USE);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+ {
+ if ($this->should_ignore_use($phpcsFile, $stackPtr) === true)
+ {
+ return;
+ }
+
+ $tokens = $phpcsFile->getTokens();
+
+ $class_name_start = $phpcsFile->findNext(array(T_NS_SEPARATOR, T_STRING), ($stackPtr + 1));
+
+ $find = array(
+ T_NS_SEPARATOR,
+ T_STRING,
+ T_WHITESPACE,
+ );
+
+ $class_name_end = $phpcsFile->findNext($find, ($stackPtr + 1), null, true);
+
+ $aliasing_as_position = $phpcsFile->findNext(T_AS, $class_name_end, null, false, null, true);
+ if ($aliasing_as_position !== false)
+ {
+ $alias_position = $phpcsFile->findNext(T_STRING, $aliasing_as_position, null, false, null, true);
+ $class_name_short = $tokens[$alias_position]['content'];
+ $class_name_full = $phpcsFile->getTokensAsString($class_name_start, ($class_name_end - $class_name_start - 1));
+ }
+ else
+ {
+ $class_name_full = $phpcsFile->getTokensAsString($class_name_start, ($class_name_end - $class_name_start));
+ $class_name_short = $tokens[$class_name_end - 1]['content'];
+ }
+
+ $ok = false;
+
+ // Checks in simple statements (new, instanceof and extends)
+ foreach (array(T_INSTANCEOF, T_NEW, T_EXTENDS) as $keyword)
+ {
+ $old_simple_statement = $stackPtr;
+ while (($simple_statement = $phpcsFile->findNext($keyword, ($old_simple_statement + 1))) !== false)
+ {
+ $old_simple_statement = $simple_statement;
+
+ $simple_class_name_start = $phpcsFile->findNext(array(T_NS_SEPARATOR, T_STRING), ($simple_statement + 1));
+ $simple_class_name_end = $phpcsFile->findNext($find, ($simple_statement + 1), null, true);
+
+ $simple_class_name = trim($phpcsFile->getTokensAsString($simple_class_name_start, ($simple_class_name_end - $simple_class_name_start)));
+
+ if ($simple_class_name === $class_name_full)
+ {
+ $error = 'Either use statement or full name must be used.';
+ $phpcsFile->addError($error, $simple_statement, 'FullName');
+ }
+
+ if ($simple_class_name === $class_name_short)
+ {
+ $ok = true;
+ }
+ }
+ }
+
+ // Checks paamayim nekudotayim
+ $old_paamayim_nekudotayim = $stackPtr;
+ while (($paamayim_nekudotayim = $phpcsFile->findNext(T_PAAMAYIM_NEKUDOTAYIM, ($old_paamayim_nekudotayim + 1))) !== false)
+ {
+ $old_paamayim_nekudotayim = $paamayim_nekudotayim;
+
+ $paamayim_nekudotayim_class_name_start = $phpcsFile->findPrevious($find, $paamayim_nekudotayim - 1, null, true);
+ $paamayim_nekudotayim_class_name_end = $paamayim_nekudotayim - 1;
+
+ $paamayim_nekudotayim_class_name = trim($phpcsFile->getTokensAsString($paamayim_nekudotayim_class_name_start + 1, ($paamayim_nekudotayim_class_name_end - $paamayim_nekudotayim_class_name_start)));
+
+ if ($paamayim_nekudotayim_class_name === $class_name_full)
+ {
+ $error = 'Either use statement or full name must be used.';
+ $phpcsFile->addError($error, $paamayim_nekudotayim, 'FullName');
+ }
+
+ if ($paamayim_nekudotayim_class_name === $class_name_short)
+ {
+ $ok = true;
+ }
+ }
+
+ // Checks in implements
+ $old_implements = $stackPtr;
+ while (($implements = $phpcsFile->findNext(T_IMPLEMENTS, ($old_implements + 1))) !== false)
+ {
+ $old_implements = $implements;
+
+ $old_implemented_class = $implements;
+ while (($implemented_class = $phpcsFile->findNext(T_STRING, ($old_implemented_class + 1), null, false, null, true)) !== false)
+ {
+ $old_implemented_class = $implemented_class;
+
+ $implements_class_name_start = $phpcsFile->findNext(array(T_NS_SEPARATOR, T_STRING), ($implemented_class - 1));
+ $implements_class_name_end = $phpcsFile->findNext($find, ($implemented_class - 1), null, true);
+
+ $implements_class_name = trim($phpcsFile->getTokensAsString($implements_class_name_start, ($implements_class_name_end - $implements_class_name_start)));
+
+ if ($implements_class_name === $class_name_full)
+ {
+ $error = 'Either use statement or full name must be used.';
+ $phpcsFile->addError($error, $implements, 'FullName');
+ }
+
+ if ($implements_class_name === $class_name_short)
+ {
+ $ok = true;
+ }
+ }
+ }
+
+ // Checks in type hinting
+ $old_function_declaration = $stackPtr;
+ while (($function_declaration = $phpcsFile->findNext(T_FUNCTION, ($old_function_declaration + 1))) !== false)
+ {
+ $old_function_declaration = $function_declaration;
+
+ $end_function = $phpcsFile->findNext(array(T_CLOSE_PARENTHESIS), ($function_declaration + 1));
+ $old_argument = $function_declaration;
+ while (($argument = $phpcsFile->findNext(T_VARIABLE, ($old_argument + 1), $end_function)) !== false)
+ {
+ $old_argument = $argument;
+
+ $start_argument = $phpcsFile->findPrevious(array(T_OPEN_PARENTHESIS, T_COMMA), $argument);
+ $argument_class_name_start = $phpcsFile->findNext(array(T_NS_SEPARATOR, T_STRING), ($start_argument + 1), $argument);
+ $argument_class_name_end = $phpcsFile->findNext($find, ($argument_class_name_start + 1), null, true);
+
+ $argument_class_name = $phpcsFile->getTokensAsString($argument_class_name_start, ($argument_class_name_end - $argument_class_name_start - 1));
+
+ if ($argument_class_name === $class_name_full)
+ {
+ $error = 'Either use statement or full name must be used.';
+ $phpcsFile->addError($error, $function_declaration, 'FullName');
+ }
+
+ if ($argument_class_name === $class_name_short)
+ {
+ $ok = true;
+ }
+ }
+ }
+
+ if (!$ok)
+ {
+ $error = 'There must not be unused USE statements.';
+ $phpcsFile->addError($error, $stackPtr, 'Unused');
+ }
+ }
+
+ /**
+ * Check if this use statement is part of the namespace block.
+ *
+ * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
+ * @param int $stackPtr The position of the current token in
+ * the stack passed in $tokens.
+ *
+ * @return bool
+ */
+ private function should_ignore_use(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+ {
+ $tokens = $phpcsFile->getTokens();
+
+ // Ignore USE keywords inside closures.
+ $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true);
+ if ($tokens[$next]['code'] === T_OPEN_PARENTHESIS)
+ {
+ return true;
+ }
+
+ // Ignore USE keywords for traits.
+ if ($phpcsFile->hasCondition($stackPtr, array(T_CLASS, T_TRAIT)) === true)
+ {
+ return true;
+ }
+
+ return false;
+
+ }
+}
diff --git a/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc b/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc
deleted file mode 100644
index 0ace1c1bda..0000000000
--- a/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
-*
-* @package code_sniffer³
-* @version $Id: $
-* @copyright (c) 2008 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php BSD License
- *
-*/
-?>
-<?php
-/**
-* Broken but not first file doc comment.
-*
-* @version @package_version@
-* @license http://www.opensource.org/licenses/bsd-license.php BSD License
-* @copyright (c) 2007 phpBB Group
-*
-*/
diff --git a/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php b/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php
deleted file mode 100644
index 23aaa45bd3..0000000000
--- a/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-/**
-* Unit test class for the EmptyStatement sniff.
-*
-* @package code_sniffer
-* @author Manuel Pichler <mapi@phpundercontrol.org>
-*/
-class phpbb_Tests_Commenting_FileCommentUnitTest extends AbstractSniffUnitTest
-{
-
- /**
- * Returns the lines where errors should occur.
- *
- * The key of the array should represent the line number and the value
- * should represent the number of errors that should occur on that line.
- *
- * @return array(int => int)
- */
- public function getErrorList()
- {
- return array(
- 7 => 1 // BSD License error :)
- );
- }//end getErrorList()
-
-
- /**
- * Returns the lines where warnings should occur.
- *
- * The key of the array should represent the line number and the value
- * should represent the number of warnings that should occur on that line.
- *
- * @return array(int => int)
- */
- public function getWarningList()
- {
- return array(
- 4 => 1,
- 8 => 1
- );
- }//end getWarningList()
-}
diff --git a/build/code_sniffer/phpbb/build.xml b/build/code_sniffer/phpbb/build.xml
deleted file mode 100644
index b6d3bf6451..0000000000
--- a/build/code_sniffer/phpbb/build.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="code_sniffer" basedir="." default="install">
-
- <property name="working.dir" value="${basedir}" />
- <property name="target.dir" value="/usr/share/php/PHP/CodeSniffer/Standards" />
-
- <!--
- Install phpbb sniff
- -->
- <target name="install">
- <delete dir="${target.dir}/phpbb" />
- <mkdir dir="${target.dir}/phpbb"/>
-
- <copy todir="${target.dir}/phpbb">
- <fileset file="${working.dir}/phpbbCodingStandard.php" />
- </copy>
- <copy todir="${target.dir}/phpbb/Sniffs">
- <fileset dir="${working.dir}/Sniffs" />
- </copy>
-
- </target>
-
-</project>
diff --git a/build/code_sniffer/phpbb/phpbbCodingStandard.php b/build/code_sniffer/phpbb/phpbbCodingStandard.php
deleted file mode 100644
index b94186ab6c..0000000000
--- a/build/code_sniffer/phpbb/phpbbCodingStandard.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-/**
- * @ignore
- */
-if (class_exists('PHP_CodeSniffer_Standards_CodingStandard', true) === false) {
- throw new PHP_CodeSniffer_Exception(
- 'Class PHP_CodeSniffer_Standards_CodingStandard not found'
- );
-}
-
-/**
- * Primary class for the phpbb coding standard.
- *
- * @package code_sniffer
- */
-class PHP_CodeSniffer_Standards_phpbb_phpbbCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
-{
- /**
- * Return a list of external sniffs to include with this standard.
- *
- * External locations can be single sniffs, a whole directory of sniffs, or
- * an entire coding standard. Locations start with the standard name. For
- * example:
- * PEAR => include all sniffs in this standard
- * PEAR/Sniffs/Files => include all sniffs in this dir
- * PEAR/Sniffs/Files/LineLengthSniff => include this single sniff
- *
- * @return array
- */
- public function getIncludedSniffs()
- {
- return array();
- }
-}
diff --git a/build/code_sniffer/ruleset-php-extensions.xml b/build/code_sniffer/ruleset-php-extensions.xml
new file mode 100644
index 0000000000..2d388103c3
--- /dev/null
+++ b/build/code_sniffer/ruleset-php-extensions.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<ruleset name="phpBB PHP Strict Standard Extensions">
+
+ <description>phpBB coding standard for PHP files of phpBB extensions</description>
+
+ <rule ref="./ruleset-php-strict.xml" />
+
+</ruleset>
diff --git a/build/code_sniffer/ruleset-php-legacy-core.xml b/build/code_sniffer/ruleset-php-legacy-core.xml
new file mode 100644
index 0000000000..55f2461a04
--- /dev/null
+++ b/build/code_sniffer/ruleset-php-legacy-core.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<ruleset name="phpBB PHP Legacy Standard Core">
+
+ <description>phpBB legacy coding standard for PHP files of phpBB core</description>
+
+ <rule ref="./ruleset-php-legacy.xml" />
+
+ <!-- Each file MUST start with a valid header as defined by the Coding Guidelines -->
+ <rule ref="./phpbb/Sniffs/Commenting/FileCommentSniff.php" />
+
+</ruleset>
diff --git a/build/code_sniffer/ruleset-php-legacy.xml b/build/code_sniffer/ruleset-php-legacy.xml
index 65eb0a8622..b0110e8b12 100644
--- a/build/code_sniffer/ruleset-php-legacy.xml
+++ b/build/code_sniffer/ruleset-php-legacy.xml
@@ -20,6 +20,16 @@
<!-- Call-time pass-by-reference MUST not be used. -->
<rule ref="Generic.Functions.CallTimePassByReference.NotAllowed" />
+ <!-- Filenames MUST be lowercase. -->
+ <rule ref="Generic.Files.LowercasedFilename" />
+
+ <!-- The function brace MUST be on the line following the function declaration
+ and MUST be indented to the same column as the start of the function declaration. -->
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman" />
+
+ <!-- There MUST be exactly one space after a cast. -->
+ <rule ref="Generic.Formatting.SpaceAfterCast" />
+
<!-- Class constants MUST be declared in all upper case with underscore separators. -->
<rule ref="Generic.NamingConventions.UpperCaseConstantName" />
@@ -32,6 +42,20 @@
<!-- Each file MUST end with exactly one newline character -->
<rule ref="PSR2.Files.EndFileNewline" />
+ <!-- When referencing arrays there MUST NOT be any whitespace around the opening bracket
+ or before the closing bracket. -->
+ <rule ref="Squiz.Arrays.ArrayBracketSpacing" />
+
+ <!-- The "else if" statement MUST be written with a space between the words else and if. -->
+ <rule ref="Squiz.ControlStructures.ElseIfDeclaration" />
+
+ <!-- There MUST be a space between each element of a foreach loop. -->
+ <rule ref="Squiz.ControlStructures.ForEachLoopDeclaration" />
+
+ <!-- In a for loop declaration, there MUST be no space inside the brackets
+ and there MUST be 0 spaces before and 1 space after semicolons. -->
+ <rule ref="Squiz.ControlStructures.ForLoopDeclaration" />
+
<!-- In the argument list, there MUST NOT be a space before each comma,
and there MUST be one space after each comma. -->
<rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing">
@@ -41,6 +65,12 @@
</rule>
<rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint" />
+ <!-- All built-in PHP functions MUST be called lowercased. -->
+ <rule ref="Squiz.Functions.LowercaseFunctionKeywords" />
+
+ <!-- The eval() function MUST NOT be used. -->
+ <rule ref="Squiz.PHP.Eval" />
+
<!-- There MUST NOT be trailing whitespace at the end of lines. -->
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" />
diff --git a/build/code_sniffer/ruleset-php-strict-core.xml b/build/code_sniffer/ruleset-php-strict-core.xml
new file mode 100644
index 0000000000..5ca4d0cf1e
--- /dev/null
+++ b/build/code_sniffer/ruleset-php-strict-core.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<ruleset name="phpBB PHP Strict Standard Core">
+
+ <description>phpBB coding standard for PHP files of phpBB core</description>
+
+ <rule ref="./ruleset-php-legacy-core.xml" />
+ <rule ref="./ruleset-php-strict.xml" />
+
+</ruleset>
diff --git a/build/code_sniffer/ruleset-php-strict.xml b/build/code_sniffer/ruleset-php-strict.xml
index f2d5b86dd1..9e2f0664d8 100644
--- a/build/code_sniffer/ruleset-php-strict.xml
+++ b/build/code_sniffer/ruleset-php-strict.xml
@@ -22,6 +22,9 @@
<!-- PHP keywords MUST be in lower case. -->
<rule ref="Generic.PHP.LowerCaseKeyword" />
+ <!-- Constructors MUST be called __construct() instead of after the class. -->
+ <rule ref="Generic.NamingConventions.ConstructorName" />
+
<!-- Classes etc. MUST be namespaced -->
<rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace" />
@@ -36,4 +39,10 @@
There MUST be one blank line after the use block. -->
<rule ref="PSR2.Namespaces.UseDeclaration" />
+ <!-- There MUST be one blank line after the namespace declaration -->
+ <rule ref="PSR2.Namespaces.NamespaceDeclaration" />
+
+ <!-- There MUST NOT be unused use statements. -->
+ <rule ref="./phpbb/Sniffs/Namespaces/UnusedUseSniff.php" />
+
</ruleset>
diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg
index b156d276df..136606252c 100755
--- a/git-tools/hooks/commit-msg
+++ b/git-tools/hooks/commit-msg
@@ -191,12 +191,12 @@ do
err=$ERR_HEADER;
echo "$line" | grep -Eq "^\[(ticket/[0-9]+|feature/$branch_regex|task/$branch_regex)\] .+$"
result=$?
- if ! echo "$line" | grep -Eq "^\[(ticket/[0-9]+|feature/$branch_regex|task/$branch_regex)\] [A-Z].+$"
+ if ! echo "$line" | grep -Eq "^\[(ticket/[0-9]+|feature/$branch_regex|task/$branch_regex)\] [a-zA-Z].+$"
then
# Don't be too strict.
# Commits may be temporary, intended to be squashed later.
# Just issue a warning here.
- complain "$severity: heading should be a sentence beginning with a capital letter." 1>&2
+ complain "$severity: heading should be a sentence beginning with a letter." 1>&2
complain "You entered:" 1>&2
complain "$line" 1>&2
fi
diff --git a/phpBB/adm/images/bg_tabs1.gif b/phpBB/adm/images/bg_tabs1.gif
deleted file mode 100644
index d129365661..0000000000
--- a/phpBB/adm/images/bg_tabs1.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/adm/images/bg_tabs2.gif b/phpBB/adm/images/bg_tabs2.gif
deleted file mode 100644
index 0aace9b6db..0000000000
--- a/phpBB/adm/images/bg_tabs2.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/adm/style/acp_attachments.html b/phpBB/adm/style/acp_attachments.html
index 0e3b5ff3b2..59b10f597e 100644
--- a/phpBB/adm/style/acp_attachments.html
+++ b/phpBB/adm/style/acp_attachments.html
@@ -205,8 +205,8 @@
</dl>
<dl>
<dt><label for="allowed_forums">{L_ALLOWED_FORUMS}{L_COLON}</label><br /><span>{L_ALLOWED_FORUMS_EXPLAIN}</span></dt>
- <dd><label><input type="radio" id="allowed_forums" class="radio" name="forum_select" value="0"<!-- IF not S_FORUM_IDS --> checked="checked"<!-- ENDIF --> /> {L_ALLOW_ALL_FORUMS}</label>
- <label><input type="radio" class="radio" name="forum_select" value="1"<!-- IF S_FORUM_IDS --> checked="checked"<!-- ENDIF --> /> {L_ALLOW_SELECTED_FORUMS}</label></dd>
+ <dd><label><input type="radio" id="allowed_forums" class="radio" name="forum_select" value="0"<!-- IF not S_FORUM_IDS --> checked="checked"<!-- ENDIF --> /> {L_ALLOW_ALL_FORUMS}</label></dd>
+ <dd><label><input type="radio" class="radio" name="forum_select" value="1"<!-- IF S_FORUM_IDS --> checked="checked"<!-- ENDIF --> /> {L_ALLOW_SELECTED_FORUMS}</label></dd>
<dd><select name="allowed_forums[]" multiple="multiple" size="8">{S_FORUM_ID_OPTIONS}</select></dd>
</dl>
diff --git a/phpBB/adm/style/acp_forums.html b/phpBB/adm/style/acp_forums.html
index f8ea284acb..af79791ff8 100644
--- a/phpBB/adm/style/acp_forums.html
+++ b/phpBB/adm/style/acp_forums.html
@@ -284,12 +284,12 @@
<label><input type="radio" class="radio" name="enable_shadow_prune" value="0"<!-- IF not S_PRUNE_SHADOW_ENABLE --> id="enable_shadow_prune" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl>
<dl>
- <dt><label for="prune_shadow_freq">{L_AUTO_PRUNE_FREQ}{L_COLON}</label><br /><span>{L_AUTO_PRUNE_FREQ_EXPLAIN}</span></dt>
- <dd><input type="number" id="prune_shadow_freq" name="prune_shadow_freq" value="{PRUNE_FREQ}" maxlength="4" size="4" min="0" max="9999" /> {L_DAYS}</dd>
+ <dt><label for="prune_shadow_freq">{L_AUTO_PRUNE_SHADOW_FREQ}{L_COLON}</label><br /><span>{L_AUTO_PRUNE_SHADOW_FREQ_EXPLAIN}</span></dt>
+ <dd><input type="number" id="prune_shadow_freq" name="prune_shadow_freq" value="{PRUNE_SHADOW_FREQ}" maxlength="4" size="4" min="0" max="9999" /> {L_DAYS}</dd>
</dl>
<dl>
- <dt><label for="prune_shadow_days">{L_AUTO_PRUNE_DAYS}{L_COLON}</label><br /><span>{L_AUTO_PRUNE_DAYS_EXPLAIN}</span></dt>
- <dd><input type="number" id="prune_shadow_days" name="prune_shadow_days" value="{PRUNE_DAYS}" maxlength="4" size="4" min="0" max="9999" /> {L_DAYS}</dd>
+ <dt><label for="prune_shadow_days">{L_AUTO_PRUNE_SHADOW_DAYS}{L_COLON}</label><br /><span>{L_AUTO_PRUNE_SHADOW_DAYS_EXPLAIN}</span></dt>
+ <dd><input type="number" id="prune_shadow_days" name="prune_shadow_days" value="{PRUNE_SHADOW_DAYS}" maxlength="4" size="4" min="0" max="9999" /> {L_DAYS}</dd>
</dl>
</fieldset>
</div>
diff --git a/phpBB/adm/style/acp_groups.html b/phpBB/adm/style/acp_groups.html
index f9846ea7cd..6049673e0a 100644
--- a/phpBB/adm/style/acp_groups.html
+++ b/phpBB/adm/style/acp_groups.html
@@ -117,7 +117,7 @@
<dl>
<dt><label>{L_AVATAR_TYPE}{L_COLON}</label></dt>
<dd><select name="avatar_driver" id="avatar_driver" data-togglable-settings="true">
- <option value="">{L_NO_AVATAR_CATEGORY}</option>
+ <option value="">{L_NO_AVATAR}</option>
<!-- BEGIN avatar_drivers -->
<option value="{avatar_drivers.DRIVER}"<!-- IF avatar_drivers.SELECTED --> selected="selected"<!-- ENDIF --> data-toggle-setting="#avatar_option_{avatar_drivers.DRIVER}">{avatar_drivers.L_TITLE}</option>
<!-- END avatar_drivers -->
diff --git a/phpBB/adm/style/acp_users_avatar.html b/phpBB/adm/style/acp_users_avatar.html
index 0d06d088e8..8ad4ad710b 100644
--- a/phpBB/adm/style/acp_users_avatar.html
+++ b/phpBB/adm/style/acp_users_avatar.html
@@ -14,7 +14,7 @@
<dl>
<dt><label>{L_AVATAR_TYPE}</label></dt>
<dd><select name="avatar_driver" id="avatar_driver" data-togglable-settings="true">
- <option value="">{L_NO_AVATAR_CATEGORY}</option>
+ <option value="">{L_NO_AVATAR}</option>
<!-- BEGIN avatar_drivers -->
<option value="{avatar_drivers.DRIVER}"<!-- IF avatar_drivers.SELECTED --> selected="selected"<!-- ENDIF --> data-toggle-setting="#avatar_option_{avatar_drivers.DRIVER}">{avatar_drivers.L_TITLE}</option>
<!-- END avatar_drivers -->
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index f23c720add..b8f55e66c5 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -209,6 +209,9 @@ li {
#page-footer {
clear: both;
+}
+
+.copyright {
font-size: 0.75em;
text-align: center;
}
@@ -317,176 +320,156 @@ li {
/* Tabbed menu
- Based on: http://www.alistapart.com/articles/slidingdoors2/
----------------------------------------*/
#tabs {
+ font-family: Arial, Helvetica, sans-serif;
line-height: normal;
margin: 0 7px;
- min-width: 600px;
position: relative;
z-index: 2;
}
-#tabs ul {
- margin:0;
- padding: 0;
+#tabs > ul {
list-style: none;
-}
-
-#tabs ul:after {
- content: '';
- display: block;
- clear: both;
-}
-
-#tabs li {
- display: block;
- float: left;
margin: 0;
padding: 0;
- font-size: 0.85em;
- font-weight: bold;
}
-#tabs li:after {
+#tabs > ul:after {
content: '';
display: block;
clear: both;
}
-#tabs a {
+#tabs .tab {
+ display: inline-block;
float: left;
- background:url("../images/bg_tabs1.gif") no-repeat 0% -34px;
- margin: 0 1px 0 0;
- padding: 0 0 0 7px;
- text-decoration: none;
- position: relative;
+ font-size: 0.85em;
+ font-weight: bold;
+ line-height: 14px;
}
-.rtl #tabs li {
+.rtl #tabs .tab {
float: right;
}
-#tabs a span {
- float: left;
- display: block;
- background: url("../images/bg_tabs2.gif") no-repeat 100% -34px;
- padding: 7px 10px 4px 4px;
- min-height: 14px;
+#tabs .tab > a {
+ background: #D4D6DA;
+ background: -moz-linear-gradient(top, #CACBCF 0%, #D4D6DA 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #CACBCF), color-stop(100%, #D4D6DA));
+ background: -webkit-linear-gradient(top, #CACBCF 0%, #D4D6DA 100%);
+ background: -o-linear-gradient(top, #CACBCF 0%, #D4D6DA 100%);
+ background: -ms-linear-gradient(top, #CACBCF 0%, #D4D6DA 100%);
+ background: linear-gradient(to bottom, #CACBCF 0%, #D4D6DA 100%);
+ border: 1px solid #BBB;
+ border-bottom-width: 0;
+ border-radius: 5px 5px 0 0;
color: #767676;
- white-space: nowrap;
- font-family: Arial, Helvetica, sans-serif;
- text-transform: uppercase;
+ display: block;
font-weight: bold;
+ margin: 1px 1px 2px 0;
+ padding: 6px 9px 4px;
+ position: relative;
+ text-decoration: none;
+ text-transform: uppercase;
+ white-space: nowrap;
+ cursor: pointer;
}
-.rtl #tabs a span {
- float: right;
-}
-
-/* Commented Backslash Hack hides rule from IE5-Mac \*/
-#tabs a span, .rtl #tabs a span { float:none;}
-/* End hack */
-
-#tabs a:hover span {
+#tabs .tab > a:hover {
+ background: #F1F1EE;
+ border-color: #C0BFBB;
color: #BC2A4D;
}
-#tabs a:hover {
- background-position: 0 -69px;
-}
-
-#tabs a:hover span {
- background-position: 100% -69px;
-}
-
-#tabs .activetab a {
- background-position: 0 0;
- border-bottom: 1px solid #DCDEE2;
-}
-
-#tabs .activetab a span {
- background-position: 100% 0;
- padding-bottom: 5px;
+#tabs .activetab > a,
+#tabs .activetab > a:hover {
+ background: #DCDEE2;
+ background: -moz-linear-gradient(top, #F2F2F2 0%, #DCDEE2 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F2F2F2), color-stop(100%, #DCDEE2));
+ background: -webkit-linear-gradient(top, #F2F2F2 0%, #DCDEE2 100%);
+ background: -o-linear-gradient(top, #F2F2F2 0%, #DCDEE2 100%);
+ background: -ms-linear-gradient(top, #F2F2F2 0%, #DCDEE2 100%);
+ background: linear-gradient(to bottom, #F2F2F2 0%, #DCDEE2 100%);
+ border-color: #999;
+ border-bottom: 2px solid #DCDEE2;
+ box-shadow: 0 1px 1px #FFF inset;
color: #23649F;
+ margin: 0 1px 0 0;
+ padding: 7px 10px 4px;
}
-#tabs .activetab a:hover span {
+#tabs .activetab > a:hover {
color: #115098;
}
+/* Responsive tabs
+----------------------------------------*/
.responsive-tab {
position: relative;
}
-.responsive-tab .responsive-tab-link span {
- display: inline-block;
+.responsive-tab > a.responsive-tab-link {
+ display: block;
font-size: 16px;
position: relative;
width: 16px;
line-height: 14px;
text-decoration: none;
+ padding-left: 9px !important;
+ padding-right: 9px !important;
}
-.responsive-tab .responsive-tab-link span:before {
+.responsive-tab .responsive-tab-link:before {
content: '';
position: absolute;
- left: 5px;
- top: 8px;
+ left: 10px;
+ top: 7px;
height: .125em;
width: 14px;
border-bottom: 0.125em solid #767676;
border-top: 0.375em double #767676;
}
-.responsive-tab .responsive-tab-link:hover span:before {
+.responsive-tab .responsive-tab-link:hover:before {
border-color: #BC2A4D;
}
-.responsive-tab.activetab .responsive-tab-link span:before {
+.responsive-tab.activetab .responsive-tab-link:before {
border-color: #23649F;
}
-.responsive-tab.activetab .responsive-tab-link:hover span:before {
+.responsive-tab.activetab .responsive-tab-link:hover:before {
border-color: #115098;
}
-#tabs .dropdown {
- top: 18px;
- margin-right: -1px;
+#tabs .dropdown, #minitabs .dropdown {
+ top: 20px;
+ margin-right: -2px;
+ font-weight: normal;
}
#tabs .dropdown-right .dropdown {
margin-left: -2px;
}
-#tabs .dropdown li {
- display: block !important;
- float: none;
- background: transparent none;
- padding: 0;
+#tabs .dropdown-contents {
+ list-style: none;
+ margin: 0;
}
-#tabs .dropdown a, #tabs .dropdown a span {
- background: transparent;
- display: block;
- border-width: 0;
- float: none;
- margin: 0;
- padding: 0;
- text-align: right;
+#tabs .dropdown li {
+ border-bottom: 1px dotted #DCDCDC;
}
-#tabs .dropdown a span {
- padding: 4px 8px;
- color: inherit !important;
+#tabs .dropdown li:last-child {
+ border-bottom: none;
}
-@media only screen and (max-width: 700px), only screen and (max-device-width: 700px)
-{
- #tabs {
- min-width: 0;
- }
+#tabs .dropdown a {
+ display: block;
+ padding: 4px 8px;
+ text-align: right;
}
/* Main Panel
@@ -984,6 +967,10 @@ table.fixed-width-table {
margin-bottom: 1px;
}
+ .rtl table.responsive td {
+ text-align: right !important;
+ }
+
table.responsive td.empty {
display: none !important;
}
@@ -1004,6 +991,10 @@ table.fixed-width-table {
box-sizing: border-box;
}
+ .rtl table.responsive.two-columns td {
+ float: right;
+ }
+
table.responsive.two-columns td:nth-child(2n+1) {
clear: left;
}
@@ -1594,7 +1585,6 @@ input.button1:focus, input.button2:focus {
z-index: 50;
padding: 25px;
padding: 0 25px 20px 25px;
- text-align: left;
}
.phpbb_alert .alert_close {
diff --git a/phpBB/adm/style/admin.js b/phpBB/adm/style/admin.js
index a839e7e0e2..253fd46a62 100644
--- a/phpBB/adm/style/admin.js
+++ b/phpBB/adm/style/admin.js
@@ -169,7 +169,7 @@ function parse_document(container)
ul = $this.children(),
tabs = ul.children().not('[data-skip-responsive]'),
links = tabs.children('a'),
- item = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span>&nbsp;</span></a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
+ item = ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
menu = item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
@@ -211,7 +211,7 @@ function parse_document(container)
for (i = total - 1; i >= 0; i --) {
tab = availableTabs.eq(i);
- menu.prepend(tab.clone(true));
+ menu.prepend(tab.clone(true).removeClass('tab'));
tab.hide();
if ($this.height() <= maxHeight) {
menu.find('a').click(function() { check(true); });
diff --git a/phpBB/adm/style/install_footer.html b/phpBB/adm/style/install_footer.html
index 75ad3c39f4..a29fce6c5a 100644
--- a/phpBB/adm/style/install_footer.html
+++ b/phpBB/adm/style/install_footer.html
@@ -5,7 +5,9 @@
</div>
<div id="page-footer">
- Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited
+ <div class="copyright">
+ Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited
+ </div>
</div>
</div>
diff --git a/phpBB/adm/style/install_header.html b/phpBB/adm/style/install_header.html
index a8f7009e4b..c818a4fc6d 100644
--- a/phpBB/adm/style/install_header.html
+++ b/phpBB/adm/style/install_header.html
@@ -29,7 +29,7 @@
<div id="tabs">
<ul>
<!-- BEGIN t_block1 -->
- <li<!-- IF t_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li>
+ <li class="tab<!-- IF t_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{t_block1.U_TITLE}">{t_block1.L_TITLE}</a></li>
<!-- END t_block1 -->
</ul>
</div>
diff --git a/phpBB/adm/style/install_update.html b/phpBB/adm/style/install_update.html
index f0df138641..898233f72d 100644
--- a/phpBB/adm/style/install_update.html
+++ b/phpBB/adm/style/install_update.html
@@ -184,72 +184,105 @@
<form id="install_update" method="post" action="{U_UPDATE_ACTION}">
- <!-- IF .up_to_date -->
- <h2>{L_FILES_UP_TO_DATE}</h2>
- <p>{L_FILES_UP_TO_DATE_EXPLAIN}</p>
-
- <fieldset>
- <legend><img src="{T_IMAGE_PATH}file_up_to_date.gif" alt="{L_STATUS_UP_TO_DATE}" /></legend>
- <!-- BEGIN up_to_date -->
+ <!-- IF .deleted -->
+ <h2>{L_FILES_DELETED}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('deleted', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+ <p>{L_FILES_DELETED_EXPLAIN}</p>
+
+ <fieldset id="deleted">
+ <legend><img src="{T_IMAGE_PATH}icon_delete.gif" alt="{L_STATUS_DELETED}" /></legend>
+ <!-- BEGIN deleted -->
<dl>
- <dd class="full" style="text-align: {S_CONTENT_FLOW_BEGIN};"><strong>{up_to_date.FILENAME}</strong></dd>
+ <dt style="width: 60%;"><strong><!-- IF deleted.DIR_PART -->{deleted.DIR_PART}<br /><!-- ENDIF -->{deleted.FILE_PART}</strong></dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">
+ <!-- IF not deleted.S_BINARY -->[<a href="{deleted.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{deleted.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
+ </dd>
</dl>
- <!-- END up_to_date -->
+ <!-- END deleted -->
</fieldset>
<!-- ENDIF -->
- <!-- IF .new -->
- <h2>{L_FILES_NEW}</h2>
- <p>{L_FILES_NEW_EXPLAIN}</p>
+ <!-- IF .conflict -->
+ <h2>{L_FILES_CONFLICT}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('conflict', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+ <p>{L_FILES_CONFLICT_EXPLAIN}</p>
- <fieldset>
- <legend><img src="{T_IMAGE_PATH}file_new.gif" alt="{L_STATUS_NEW}" /></legend>
- <!-- BEGIN new -->
+ <!-- BEGIN conflict -->
+ <fieldset id="conflict">
+ <legend><img src="{T_IMAGE_PATH}file_conflict.gif" alt="{L_STATUS_CONFLICT}" /></legend>
<dl>
- <dt style="width: 60%;"><strong><!-- IF new.DIR_PART -->{new.DIR_PART}<br /><!-- ENDIF -->{new.FILE_PART}</strong>
- <!-- IF new.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{new.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
- </dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">
- <!-- IF not new.S_BINARY -->[<a href="{new.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{new.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
- </dd>
- <!-- IF new.S_CUSTOM -->
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{new.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
- <!-- ENDIF -->
+ <dt style="width: 60%;"><strong><!-- IF conflict.DIR_PART -->{conflict.DIR_PART}<br /><!-- ENDIF -->{conflict.FILE_PART}</strong>
+ <!-- IF conflict.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{conflict.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
+ <!-- IF conflict.NUM_CONFLICTS --><br /><span>{L_NUM_CONFLICTS}{L_COLON} {conflict.NUM_CONFLICTS}</span><!-- ENDIF -->
+ </dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">
+ <!-- IF not conflict.S_BINARY -->[<a href="{conflict.U_SHOW_DIFF}">{L_DOWNLOAD_CONFLICTS}</a>]<br />{L_DOWNLOAD_CONFLICTS_EXPLAIN}
+ <!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
+ </dd>
+ <!-- IF conflict.S_CUSTOM -->
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+ <!-- ENDIF -->
</dl>
- <!-- END new -->
+ <!-- IF conflict.S_BINARY -->
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="1" checked="checked" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">&nbsp;</dd>
+ </dl>
+ <!-- ELSE -->
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="3" checked="checked" /> {L_MERGE_NEW_FILE_OPTION}</label></dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_NEW_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
+ </dl>
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="4" /> {L_MERGE_MOD_FILE_OPTION}</label></dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_MOD_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
+ </dl>
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="1" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
+ </dl>
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="2" /> {L_MERGE_NO_MERGE_MOD_OPTION}</label></dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
+ </dl>
+ <!-- ENDIF -->
</fieldset>
+ <!-- END conflict -->
<!-- ENDIF -->
- <!-- IF .not_modified -->
- <h2>{L_FILES_NOT_MODIFIED}</h2>
- <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('not_modified', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
- <p>{L_FILES_NOT_MODIFIED_EXPLAIN}</p>
+ <!-- IF .new_conflict -->
+ <h2>{L_FILES_NEW_CONFLICT}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('new_conflict', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+ <p>{L_FILES_NEW_CONFLICT_EXPLAIN}</p>
- <fieldset id="not_modified" style="display: none;">
- <legend><img src="{T_IMAGE_PATH}file_not_modified.gif" alt="{L_STATUS_NOT_MODIFIED}" /></legend>
- <!-- BEGIN not_modified -->
+ <fieldset id="new_conflict">
+ <legend><img src="{T_IMAGE_PATH}file_new_conflict.gif" alt="{L_STATUS_NEW_CONFLICT}" /></legend>
+ <!-- BEGIN new_conflict -->
<dl>
- <dt style="width: 60%;"><strong><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<br /><!-- ENDIF -->{not_modified.FILE_PART}</strong>
- <!-- IF not_modified.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{not_modified.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
- </dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><!-- IF not not_modified.S_BINARY -->[<a href="{not_modified.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{not_modified.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
- <!-- IF not_modified.S_CUSTOM -->
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{not_modified.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
- <!-- ENDIF -->
+ <dt style="width: 60%;"><strong><!-- IF new_conflict.DIR_PART -->{new_conflict.DIR_PART}<br /><!-- ENDIF -->{new_conflict.FILE_PART}</strong>
+ <!-- IF new_conflict.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{new_conflict.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
+ </dt>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">
+ <!-- IF not new_conflict.S_BINARY -->[<a href="{new_conflict.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{new_conflict.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
+ </dd>
+ <!-- IF new_conflict.S_CUSTOM -->
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{new_conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+ <!-- ENDIF -->
</dl>
- <!-- END not_modified -->
+ <!-- END new_conflict -->
</fieldset>
<!-- ENDIF -->
<!-- IF .modified -->
<h2>{L_FILES_MODIFIED}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('modified', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
<p>{L_FILES_MODIFIED_EXPLAIN}</p>
<!-- BEGIN modified -->
- <fieldset>
+ <fieldset id="modified">
<legend><img src="{T_IMAGE_PATH}file_modified.gif" alt="{L_STATUS_MODIFIED}" /></legend>
<dl>
<dt style="width: 60%;"><strong><!-- IF modified.DIR_PART -->{modified.DIR_PART}<br /><!-- ENDIF -->{modified.FILE_PART}</strong>
@@ -277,74 +310,65 @@
<!-- ENDIF -->
- <!-- IF .new_conflict -->
- <h2>{L_FILES_NEW_CONFLICT}</h2>
- <p>{L_FILES_NEW_CONFLICT_EXPLAIN}</p>
+ <!-- IF .new -->
+ <h2>{L_FILES_NEW}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('new_files', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+ <p>{L_FILES_NEW_EXPLAIN}</p>
- <fieldset>
- <legend><img src="{T_IMAGE_PATH}file_new_conflict.gif" alt="{L_STATUS_NEW_CONFLICT}" /></legend>
- <!-- BEGIN new_conflict -->
+ <fieldset id="new_files" style="display: none;">
+ <legend><img src="{T_IMAGE_PATH}file_new.gif" alt="{L_STATUS_NEW}" /></legend>
+ <!-- BEGIN new -->
<dl>
- <dt style="width: 60%;"><strong><!-- IF new_conflict.DIR_PART -->{new_conflict.DIR_PART}<br /><!-- ENDIF -->{new_conflict.FILE_PART}</strong>
- <!-- IF new_conflict.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{new_conflict.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
+ <dt style="width: 60%;"><strong><!-- IF new.DIR_PART -->{new.DIR_PART}<br /><!-- ENDIF -->{new.FILE_PART}</strong>
+ <!-- IF new.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{new.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
</dt>
<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">
- <!-- IF not new_conflict.S_BINARY -->[<a href="{new_conflict.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{new_conflict.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
+ <!-- IF not new.S_BINARY -->[<a href="{new.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{new.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
</dd>
- <!-- IF new_conflict.S_CUSTOM -->
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{new_conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+ <!-- IF new.S_CUSTOM -->
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{new.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
<!-- ENDIF -->
</dl>
- <!-- END new_conflict -->
+ <!-- END new -->
</fieldset>
<!-- ENDIF -->
- <!-- IF .conflict -->
- <h2>{L_FILES_CONFLICT}</h2>
- <p>{L_FILES_CONFLICT_EXPLAIN}</p>
+ <!-- IF .not_modified -->
+ <h2>{L_FILES_NOT_MODIFIED}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('not_modified', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+ <p>{L_FILES_NOT_MODIFIED_EXPLAIN}</p>
- <!-- BEGIN conflict -->
- <fieldset>
- <legend><img src="{T_IMAGE_PATH}file_conflict.gif" alt="{L_STATUS_CONFLICT}" /></legend>
+ <fieldset id="not_modified" style="display: none;">
+ <legend><img src="{T_IMAGE_PATH}file_not_modified.gif" alt="{L_STATUS_NOT_MODIFIED}" /></legend>
+ <!-- BEGIN not_modified -->
<dl>
- <dt style="width: 60%;"><strong><!-- IF conflict.DIR_PART -->{conflict.DIR_PART}<br /><!-- ENDIF -->{conflict.FILE_PART}</strong>
- <!-- IF conflict.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{conflict.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
- <!-- IF conflict.NUM_CONFLICTS --><br /><span>{L_NUM_CONFLICTS}{L_COLON} {conflict.NUM_CONFLICTS}</span><!-- ENDIF -->
+ <dt style="width: 60%;"><strong><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<br /><!-- ENDIF -->{not_modified.FILE_PART}</strong>
+ <!-- IF not_modified.S_CUSTOM --><br /><span><em>{L_FILE_USED}{L_COLON} </em>{not_modified.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
</dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">
- <!-- IF not conflict.S_BINARY -->[<a href="{conflict.U_SHOW_DIFF}">{L_DOWNLOAD_CONFLICTS}</a>]<br />{L_DOWNLOAD_CONFLICTS_EXPLAIN}
- <!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
- </dd>
- <!-- IF conflict.S_CUSTOM -->
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><!-- IF not not_modified.S_BINARY -->[<a href="{not_modified.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{not_modified.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
+ <!-- IF not_modified.S_CUSTOM -->
+ <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;"><label><input type="checkbox" name="no_update[]" value="{not_modified.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
<!-- ENDIF -->
</dl>
- <!-- IF conflict.S_BINARY -->
- <dl>
- <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="1" checked="checked" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">&nbsp;</dd>
- </dl>
- <!-- ELSE -->
- <dl>
- <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="3" checked="checked" /> {L_MERGE_NEW_FILE_OPTION}</label></dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_NEW_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
- </dl>
- <dl>
- <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="4" /> {L_MERGE_MOD_FILE_OPTION}</label></dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_MOD_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
- </dl>
- <dl>
- <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="1" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
- </dl>
- <dl>
- <dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="2" /> {L_MERGE_NO_MERGE_MOD_OPTION}</label></dt>
- <dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
- </dl>
- <!-- ENDIF -->
+ <!-- END not_modified -->
+ </fieldset>
+
+ <!-- ENDIF -->
+
+ <!-- IF .up_to_date -->
+ <h2>{L_FILES_UP_TO_DATE}</h2>
+ <div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('up_to_date', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+ <p>{L_FILES_UP_TO_DATE_EXPLAIN}</p>
+
+ <fieldset id="up_to_date" style="display: none;">
+ <legend><img src="{T_IMAGE_PATH}file_up_to_date.gif" alt="{L_STATUS_UP_TO_DATE}" /></legend>
+ <!-- BEGIN up_to_date -->
+ <dl>
+ <dd class="full" style="text-align: {S_CONTENT_FLOW_BEGIN};"><strong>{up_to_date.FILENAME}</strong></dd>
+ </dl>
+ <!-- END up_to_date -->
</fieldset>
- <!-- END conflict -->
<!-- ENDIF -->
diff --git a/phpBB/adm/style/overall_footer.html b/phpBB/adm/style/overall_footer.html
index 0f4589f5d4..deb38c8691 100644
--- a/phpBB/adm/style/overall_footer.html
+++ b/phpBB/adm/style/overall_footer.html
@@ -5,15 +5,17 @@
</div>
<div id="page-footer">
- <!-- IF S_COPYRIGHT_HTML -->
- {CREDIT_LINE}
- <!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF -->
- <!-- ENDIF -->
+ <div class="copyright">
+ <!-- IF S_COPYRIGHT_HTML -->
+ {CREDIT_LINE}
+ <!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF -->
+ <!-- ENDIF -->
- <!-- IF DEBUG_OUTPUT -->
- <!-- IF S_COPYRIGHT_HTML --><br /><!-- ENDIF -->
- {DEBUG_OUTPUT}
- <!-- ENDIF -->
+ <!-- IF DEBUG_OUTPUT -->
+ <!-- IF S_COPYRIGHT_HTML --><br /><!-- ENDIF -->
+ {DEBUG_OUTPUT}
+ <!-- ENDIF -->
+ </div>
<div id="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
<div id="darken">&nbsp;</div>
diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html
index 25a82a5faa..afd2b94924 100644
--- a/phpBB/adm/style/overall_header.html
+++ b/phpBB/adm/style/overall_header.html
@@ -106,7 +106,7 @@ function popup(url, width, height, name)
<div id="tabs">
<ul>
<!-- BEGIN t_block1 -->
- <li<!-- IF t_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li>
+ <li class="tab<!-- IF t_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{t_block1.U_TITLE}">{t_block1.L_TITLE}</a></li>
<!-- END t_block1 -->
</ul>
</div>
diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js
index 37728864c4..2c35875dca 100644
--- a/phpBB/assets/javascript/core.js
+++ b/phpBB/assets/javascript/core.js
@@ -7,6 +7,7 @@ phpbb.alertTime = 100;
// define a couple constants for keydown functions.
var keymap = {
+ TAB: 9,
ENTER: 13,
ESC: 27
};
@@ -873,19 +874,6 @@ phpbb.timezonePreselectSelect = function(forceSelector) {
}
};
-// Toggle notification list
-$('#notification_list_button').click(function(e) {
- $('#notification_list').toggle();
- e.preventDefault();
-});
-$('#phpbb').click(function(e) {
- var target = $(e.target);
-
- if (!target.is('#notification_list, #notification_list_button') && !target.parents().is('#notification_list, #notification_list_button')) {
- $('#notification_list').hide();
- }
-});
-
phpbb.ajaxCallbacks = {};
/**
@@ -1201,10 +1189,10 @@ phpbb.applyCodeEditor = function(textarea) {
var key = event.keyCode || event.which;
// intercept tabs
- if (key == 9 &&
- !event.ctrlKey &&
- !event.shiftKey &&
- !event.altKey &&
+ if (key == keymap.TAB &&
+ !event.ctrlKey &&
+ !event.shiftKey &&
+ !event.altKey &&
!event.metaKey) {
if (inTag()) {
appendText("\t");
@@ -1214,7 +1202,7 @@ phpbb.applyCodeEditor = function(textarea) {
}
// intercept new line characters
- if (key == 13) {
+ if (key == keymap.ENTER) {
if (inTag()) {
var lastLine = getLastLine(true),
code = '' + /^\s*/g.exec(lastLine);
@@ -1308,11 +1296,29 @@ phpbb.toggleDropdown = function() {
else if ((offset + width + 2) > windowWidth) {
$this.css('margin-left', (windowWidth - offset - width - 2) + 'px');
}
+
+ // Check whether the vertical scrollbar is present.
+ $this.toggleClass('dropdown-nonscroll', this.scrollHeight === $this.innerHeight());
+
});
var freeSpace = parent.offset().left - 4;
if (direction == 'left') {
options.dropdown.css('margin-left', '-' + freeSpace + 'px');
+
+ // Try to position the notification dropdown correctly in RTL-responsive mode
+ if (options.dropdown.hasClass('dropdown-extended')) {
+ var contentWidth,
+ fullFreeSpace = freeSpace + parent.outerWidth();
+
+ options.dropdown.find('.dropdown-contents').each(function() {
+ contentWidth = parseInt($(this).outerWidth());
+ $(this).css({marginLeft: 0, left: 0});
+ });
+
+ var maxOffset = Math.min(contentWidth, fullFreeSpace) + 'px';
+ options.dropdown.css({'width': maxOffset, 'margin-left': '-' + maxOffset});
+ }
} else {
options.dropdown.css('margin-right', '-' + (windowWidth + freeSpace) + 'px');
}
@@ -1515,11 +1521,37 @@ phpbb.getFunctionByName = function (functionName) {
};
/**
-* Apply code editor to all textarea elements with data-bbcode attribute
+* Register page dropdowns.
*/
-$(document).ready(function() {
- $('textarea[data-bbcode]').each(function() {
- phpbb.applyCodeEditor(this);
+phpbb.registerPageDropdowns = function() {
+ $('body').find('.dropdown-container').each(function() {
+ var $this = $(this),
+ trigger = $this.find('.dropdown-trigger:first'),
+ contents = $this.find('.dropdown'),
+ options = {
+ direction: 'auto',
+ verticalDirection: 'auto'
+ },
+ data;
+
+ if (!trigger.length) {
+ data = $this.attr('data-dropdown-trigger');
+ trigger = data ? $this.children(data) : $this.children('a:first');
+ }
+
+ if (!contents.length) {
+ data = $this.attr('data-dropdown-contents');
+ contents = data ? $this.children(data) : $this.children('div:first');
+ }
+
+ if (!trigger.length || !contents.length) return;
+
+ if ($this.hasClass('dropdown-up')) options.verticalDirection = 'up';
+ if ($this.hasClass('dropdown-down')) options.verticalDirection = 'down';
+ if ($this.hasClass('dropdown-left')) options.direction = 'left';
+ if ($this.hasClass('dropdown-right')) options.direction = 'right';
+
+ phpbb.registerDropdown(trigger, contents, options);
});
// Hide active dropdowns when click event happens outside
@@ -1529,6 +1561,17 @@ $(document).ready(function() {
$(phpbb.dropdownHandles).each(phpbb.toggleDropdown);
}
});
+}
+
+/**
+* Apply code editor to all textarea elements with data-bbcode attribute
+*/
+$(document).ready(function() {
+ $('textarea[data-bbcode]').each(function() {
+ phpbb.applyCodeEditor(this);
+ });
+
+ phpbb.registerPageDropdowns();
$('#color_palette_placeholder').each(function() {
phpbb.registerPalette($(this));
diff --git a/phpBB/common.php b/phpBB/common.php
index 4b06cd1eda..e96a34938a 100644
--- a/phpBB/common.php
+++ b/phpBB/common.php
@@ -95,6 +95,8 @@ $phpbb_class_loader->register();
$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
$phpbb_class_loader_ext->register();
+phpbb_load_extensions_autoloaders($phpbb_root_path);
+
// Set up container
$phpbb_container = phpbb_create_default_container($phpbb_root_path, $phpEx);
diff --git a/phpBB/composer.json b/phpBB/composer.json
index 435d6139e4..9b473a3bb7 100644
--- a/phpBB/composer.json
+++ b/phpBB/composer.json
@@ -15,11 +15,20 @@
"twig/twig": "1.13.*"
},
"require-dev": {
+ "behat/mink": "1.4.*",
+ "behat/mink-goutte-driver": "1.0.*",
"fabpot/goutte": "1.0.*",
"phpunit/dbunit": "1.3.*",
"phpunit/phpunit": "4.1.*",
"phing/phing": "2.4.*",
"sami/sami": "1.*",
- "squizlabs/php_codesniffer": "1.*"
+ "squizlabs/php_codesniffer": "1.*",
+ "symfony/browser-kit": "2.3.*",
+ "symfony/debug": "2.3.*",
+ "symfony/dom-crawler": "2.3.*",
+ "symfony/filesystem": "2.3.*",
+ "symfony/finder": "2.3.*",
+ "symfony/http-foundation": "2.3.*",
+ "symfony/process": "2.3.*"
}
}
diff --git a/phpBB/composer.lock b/phpBB/composer.lock
index 2213c3789b..751cd0695f 100644
--- a/phpBB/composer.lock
+++ b/phpBB/composer.lock
@@ -3,7 +3,7 @@
"This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
],
- "hash": "be323c0a1b5baeb83934238033e079ec",
+ "hash": "dcd46c1373cfc4dacd2e1f8a79da0b91",
"packages": [
{
"name": "lusitanian/oauth",
@@ -108,17 +108,17 @@
},
{
"name": "symfony/config",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Config",
"source": {
"type": "git",
"url": "https://github.com/symfony/Config.git",
- "reference": "91faa2d4944d0c8a94d5b73cb7ccfb219aee9d21"
+ "reference": "259722b5f2e87d3f487630abfd40f922cf2f6900"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Config/zipball/91faa2d4944d0c8a94d5b73cb7ccfb219aee9d21",
- "reference": "91faa2d4944d0c8a94d5b73cb7ccfb219aee9d21",
+ "url": "https://api.github.com/repos/symfony/Config/zipball/259722b5f2e87d3f487630abfd40f922cf2f6900",
+ "reference": "259722b5f2e87d3f487630abfd40f922cf2f6900",
"shasum": ""
},
"require": {
@@ -154,21 +154,21 @@
],
"description": "Symfony Config Component",
"homepage": "http://symfony.com",
- "time": "2014-03-31 10:15:50"
+ "time": "2014-04-22 08:09:28"
},
{
"name": "symfony/console",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Console",
"source": {
"type": "git",
"url": "https://github.com/symfony/Console.git",
- "reference": "df17996d37eb113a5675ca4cc2ac45f4fc057cb7"
+ "reference": "c6c5a354a9945a5e9a9a6a495ca19558eb8639e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Console/zipball/df17996d37eb113a5675ca4cc2ac45f4fc057cb7",
- "reference": "df17996d37eb113a5675ca4cc2ac45f4fc057cb7",
+ "url": "https://api.github.com/repos/symfony/Console/zipball/c6c5a354a9945a5e9a9a6a495ca19558eb8639e9",
+ "reference": "c6c5a354a9945a5e9a9a6a495ca19558eb8639e9",
"shasum": ""
},
"require": {
@@ -209,21 +209,21 @@
],
"description": "Symfony Console Component",
"homepage": "http://symfony.com",
- "time": "2014-03-01 17:25:29"
+ "time": "2014-05-14 13:35:53"
},
{
"name": "symfony/debug",
- "version": "v2.4.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Debug",
"source": {
"type": "git",
"url": "https://github.com/symfony/Debug.git",
- "reference": "6a8eb9aba50595014fef52d6b4d99b31dfaa6f02"
+ "reference": "ca764f8af9cc4ba5d81b598c1b18b30db5508e18"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Debug/zipball/6a8eb9aba50595014fef52d6b4d99b31dfaa6f02",
- "reference": "6a8eb9aba50595014fef52d6b4d99b31dfaa6f02",
+ "url": "https://api.github.com/repos/symfony/Debug/zipball/ca764f8af9cc4ba5d81b598c1b18b30db5508e18",
+ "reference": "ca764f8af9cc4ba5d81b598c1b18b30db5508e18",
"shasum": ""
},
"require": {
@@ -234,13 +234,14 @@
"symfony/http-kernel": "~2.1"
},
"suggest": {
+ "symfony/class-loader": "",
"symfony/http-foundation": "",
"symfony/http-kernel": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -266,21 +267,21 @@
],
"description": "Symfony Debug Component",
"homepage": "http://symfony.com",
- "time": "2014-04-16 10:34:42"
+ "time": "2014-04-29 19:42:43"
},
{
"name": "symfony/dependency-injection",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/DependencyInjection",
"source": {
"type": "git",
"url": "https://github.com/symfony/DependencyInjection.git",
- "reference": "41e9e2078e8edf261c11be478300c8fcddb64e30"
+ "reference": "5ebd813eac59b4051705a2e29e32f211a966b6ca"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/41e9e2078e8edf261c11be478300c8fcddb64e30",
- "reference": "41e9e2078e8edf261c11be478300c8fcddb64e30",
+ "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/5ebd813eac59b4051705a2e29e32f211a966b6ca",
+ "reference": "5ebd813eac59b4051705a2e29e32f211a966b6ca",
"shasum": ""
},
"require": {
@@ -324,21 +325,21 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "http://symfony.com",
- "time": "2014-03-27 18:14:33"
+ "time": "2014-05-02 22:42:57"
},
{
"name": "symfony/event-dispatcher",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/EventDispatcher",
"source": {
"type": "git",
"url": "https://github.com/symfony/EventDispatcher.git",
- "reference": "15645237c6ff70e74a28e8836362d82492765055"
+ "reference": "cb7cd38c081507d10997553c4c522956a4d2afab"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/15645237c6ff70e74a28e8836362d82492765055",
- "reference": "15645237c6ff70e74a28e8836362d82492765055",
+ "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/cb7cd38c081507d10997553c4c522956a4d2afab",
+ "reference": "cb7cd38c081507d10997553c4c522956a4d2afab",
"shasum": ""
},
"require": {
@@ -380,21 +381,21 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "http://symfony.com",
- "time": "2014-02-11 10:29:24"
+ "time": "2014-04-16 10:30:19"
},
{
"name": "symfony/filesystem",
- "version": "v2.4.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Filesystem",
"source": {
"type": "git",
"url": "https://github.com/symfony/Filesystem.git",
- "reference": "a3af8294bcce4a7c1b2892363b0c9d8109affad4"
+ "reference": "69e476c4db31c43ab7ab797adc5fc73d20aa5571"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a3af8294bcce4a7c1b2892363b0c9d8109affad4",
- "reference": "a3af8294bcce4a7c1b2892363b0c9d8109affad4",
+ "url": "https://api.github.com/repos/symfony/Filesystem/zipball/69e476c4db31c43ab7ab797adc5fc73d20aa5571",
+ "reference": "69e476c4db31c43ab7ab797adc5fc73d20aa5571",
"shasum": ""
},
"require": {
@@ -403,7 +404,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -429,33 +430,30 @@
],
"description": "Symfony Filesystem Component",
"homepage": "http://symfony.com",
- "time": "2014-04-16 10:34:31"
+ "time": "2014-04-16 10:30:19"
},
{
"name": "symfony/http-foundation",
- "version": "v2.4.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/HttpFoundation",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpFoundation.git",
- "reference": "22c4dee84271ad0cd08d19f26d89f2878e11159b"
+ "reference": "ad7891d4dfe221c5a9edca64b71bdb500f5b026a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/22c4dee84271ad0cd08d19f26d89f2878e11159b",
- "reference": "22c4dee84271ad0cd08d19f26d89f2878e11159b",
+ "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/ad7891d4dfe221c5a9edca64b71bdb500f5b026a",
+ "reference": "ad7891d4dfe221c5a9edca64b71bdb500f5b026a",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
- "require-dev": {
- "symfony/expression-language": "~2.4"
- },
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -484,21 +482,21 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "http://symfony.com",
- "time": "2014-04-18 21:02:05"
+ "time": "2014-05-22 16:20:26"
},
{
"name": "symfony/http-kernel",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/HttpKernel",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpKernel.git",
- "reference": "48d61b3622ca35dd924b167441a9810ad55906ce"
+ "reference": "d8c00747f592183692afaacf622c444c36092613"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/48d61b3622ca35dd924b167441a9810ad55906ce",
- "reference": "48d61b3622ca35dd924b167441a9810ad55906ce",
+ "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/d8c00747f592183692afaacf622c444c36092613",
+ "reference": "d8c00747f592183692afaacf622c444c36092613",
"shasum": ""
},
"require": {
@@ -557,21 +555,21 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "http://symfony.com",
- "time": "2014-04-03 05:42:39"
+ "time": "2014-05-31 02:04:21"
},
{
"name": "symfony/routing",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Routing",
"source": {
"type": "git",
"url": "https://github.com/symfony/Routing.git",
- "reference": "08afcafd9af22a24a8055669f85d63b863c4711b"
+ "reference": "6e4c9024a04340b83e456a1a24597dba066dcdc9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Routing/zipball/08afcafd9af22a24a8055669f85d63b863c4711b",
- "reference": "08afcafd9af22a24a8055669f85d63b863c4711b",
+ "url": "https://api.github.com/repos/symfony/Routing/zipball/6e4c9024a04340b83e456a1a24597dba066dcdc9",
+ "reference": "6e4c9024a04340b83e456a1a24597dba066dcdc9",
"shasum": ""
},
"require": {
@@ -617,21 +615,21 @@
],
"description": "Symfony Routing Component",
"homepage": "http://symfony.com",
- "time": "2014-03-28 10:34:27"
+ "time": "2014-04-23 13:35:47"
},
{
"name": "symfony/yaml",
- "version": "v2.3.12",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml.git",
- "reference": "3acf34f6993db3d873fa77ac2cb6e595db00b88d"
+ "reference": "2e257c292cfce88bf6c894a03d0fe8d782055aee"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Yaml/zipball/3acf34f6993db3d873fa77ac2cb6e595db00b88d",
- "reference": "3acf34f6993db3d873fa77ac2cb6e595db00b88d",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/2e257c292cfce88bf6c894a03d0fe8d782055aee",
+ "reference": "2e257c292cfce88bf6c894a03d0fe8d782055aee",
"shasum": ""
},
"require": {
@@ -666,7 +664,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "http://symfony.com",
- "time": "2014-03-04 16:04:39"
+ "time": "2014-05-12 09:13:35"
},
{
"name": "twig/twig",
@@ -723,6 +721,167 @@
],
"packages-dev": [
{
+ "name": "behat/mink",
+ "version": "v1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Mink.git",
+ "reference": "0817070a6e2ec9f475fad9bfb81a962c462eb934"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Mink/zipball/0817070a6e2ec9f475fad9bfb81a962c462eb934",
+ "reference": "0817070a6e2ec9f475fad9bfb81a962c462eb934",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1",
+ "symfony/css-selector": ">=2.0,<2.4-dev"
+ },
+ "suggest": {
+ "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+ "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+ "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+ "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Mink": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Web acceptance testing framework for PHP 5.3",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "testing",
+ "web"
+ ],
+ "time": "2013-03-02 15:53:18"
+ },
+ {
+ "name": "behat/mink-browserkit-driver",
+ "version": "v1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/MinkBrowserKitDriver.git",
+ "reference": "f2771b5fc4dbc233859addf37a7d150852f78418"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/MinkBrowserKitDriver/zipball/f2771b5fc4dbc233859addf37a7d150852f78418",
+ "reference": "f2771b5fc4dbc233859addf37a7d150852f78418",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "~1.4.3",
+ "php": ">=5.3.1",
+ "symfony/browser-kit": "~2.0",
+ "symfony/dom-crawler": "~2.0"
+ },
+ "require-dev": {
+ "silex/silex": "@dev"
+ },
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Mink\\Driver": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Symfony2 BrowserKit driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "Mink",
+ "Symfony2",
+ "browser",
+ "testing"
+ ],
+ "time": "2013-04-13 12:17:15"
+ },
+ {
+ "name": "behat/mink-goutte-driver",
+ "version": "v1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/MinkGoutteDriver.git",
+ "reference": "fa1b073b48761464feb0b05e6825da44b20118d8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/MinkGoutteDriver/zipball/fa1b073b48761464feb0b05e6825da44b20118d8",
+ "reference": "fa1b073b48761464feb0b05e6825da44b20118d8",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink-browserkit-driver": ">=1.0.5,<1.2.0",
+ "fabpot/goutte": "~1.0.1",
+ "php": ">=5.3.1"
+ },
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Mink\\Driver": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Goutte driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "goutte",
+ "headless",
+ "testing"
+ ],
+ "time": "2013-07-03 18:43:54"
+ },
+ {
"name": "fabpot/goutte",
"version": "v1.0.3",
"source": {
@@ -2009,17 +2168,17 @@
},
{
"name": "symfony/browser-kit",
- "version": "v2.3.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/BrowserKit",
"source": {
"type": "git",
"url": "https://github.com/symfony/BrowserKit.git",
- "reference": "2639dc4eec81f92760e05396a93bb78000b4f5ca"
+ "reference": "bc6cb0fe5196ecfe183483791928ed525ac41728"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/2639dc4eec81f92760e05396a93bb78000b4f5ca",
- "reference": "2639dc4eec81f92760e05396a93bb78000b4f5ca",
+ "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/bc6cb0fe5196ecfe183483791928ed525ac41728",
+ "reference": "bc6cb0fe5196ecfe183483791928ed525ac41728",
"shasum": ""
},
"require": {
@@ -2062,21 +2221,21 @@
],
"description": "Symfony BrowserKit Component",
"homepage": "http://symfony.com",
- "time": "2013-07-21 12:12:18"
+ "time": "2014-04-22 14:58:51"
},
{
"name": "symfony/css-selector",
- "version": "v2.3.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/CssSelector",
"source": {
"type": "git",
"url": "https://github.com/symfony/CssSelector.git",
- "reference": "885544201cb24e79754da1dbd61bd779c2e4353e"
+ "reference": "2ff53e8a7870b453836e879b083b971d455e174d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/CssSelector/zipball/885544201cb24e79754da1dbd61bd779c2e4353e",
- "reference": "885544201cb24e79754da1dbd61bd779c2e4353e",
+ "url": "https://api.github.com/repos/symfony/CssSelector/zipball/2ff53e8a7870b453836e879b083b971d455e174d",
+ "reference": "2ff53e8a7870b453836e879b083b971d455e174d",
"shasum": ""
},
"require": {
@@ -2115,21 +2274,21 @@
],
"description": "Symfony CssSelector Component",
"homepage": "http://symfony.com",
- "time": "2013-07-21 12:12:18"
+ "time": "2014-05-12 09:13:35"
},
{
"name": "symfony/dom-crawler",
- "version": "v2.3.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/DomCrawler",
"source": {
"type": "git",
"url": "https://github.com/symfony/DomCrawler.git",
- "reference": "e05e07fe8958a304b5e135f8e65d4ae6148cf59b"
+ "reference": "5dd259d7842480fa7c5d4a45c4f911bd6fb60bc8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/e05e07fe8958a304b5e135f8e65d4ae6148cf59b",
- "reference": "e05e07fe8958a304b5e135f8e65d4ae6148cf59b",
+ "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/5dd259d7842480fa7c5d4a45c4f911bd6fb60bc8",
+ "reference": "5dd259d7842480fa7c5d4a45c4f911bd6fb60bc8",
"shasum": ""
},
"require": {
@@ -2170,21 +2329,21 @@
],
"description": "Symfony DomCrawler Component",
"homepage": "http://symfony.com",
- "time": "2013-07-21 12:12:18"
+ "time": "2014-05-26 22:15:18"
},
{
"name": "symfony/finder",
- "version": "v2.3.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Finder",
"source": {
"type": "git",
"url": "https://github.com/symfony/Finder.git",
- "reference": "4a0fee5b86f5bbd9dfdc11ec124eba2915737ce1"
+ "reference": "32949721cc76afd75e4ac60d14ac3cf55b10a768"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Finder/zipball/4a0fee5b86f5bbd9dfdc11ec124eba2915737ce1",
- "reference": "4a0fee5b86f5bbd9dfdc11ec124eba2915737ce1",
+ "url": "https://api.github.com/repos/symfony/Finder/zipball/32949721cc76afd75e4ac60d14ac3cf55b10a768",
+ "reference": "32949721cc76afd75e4ac60d14ac3cf55b10a768",
"shasum": ""
},
"require": {
@@ -2219,21 +2378,21 @@
],
"description": "Symfony Finder Component",
"homepage": "http://symfony.com",
- "time": "2013-08-13 20:18:00"
+ "time": "2014-05-22 13:42:36"
},
{
"name": "symfony/process",
- "version": "v2.3.4",
+ "version": "v2.3.16",
"target-dir": "Symfony/Component/Process",
"source": {
"type": "git",
"url": "https://github.com/symfony/Process.git",
- "reference": "1e91553e1cedd0b8fb1da6ea4f89b02e21713d5b"
+ "reference": "2cd7d075df6cb0d564c069a66408b3877c07d4e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Process/zipball/1e91553e1cedd0b8fb1da6ea4f89b02e21713d5b",
- "reference": "1e91553e1cedd0b8fb1da6ea4f89b02e21713d5b",
+ "url": "https://api.github.com/repos/symfony/Process/zipball/2cd7d075df6cb0d564c069a66408b3877c07d4e3",
+ "reference": "2cd7d075df6cb0d564c069a66408b3877c07d4e3",
"shasum": ""
},
"require": {
@@ -2268,7 +2427,7 @@
],
"description": "Symfony Process Component",
"homepage": "http://symfony.com",
- "time": "2013-08-22 06:42:25"
+ "time": "2014-05-17 21:49:26"
}
],
"aliases": [
diff --git a/phpBB/config/profilefields.yml b/phpBB/config/profilefields.yml
index 00f025e141..ce2a84b12b 100644
--- a/phpBB/config/profilefields.yml
+++ b/phpBB/config/profilefields.yml
@@ -55,6 +55,15 @@ services:
tags:
- { name: profilefield.type }
+ profilefields.type.googleplus:
+ class: phpbb\profilefields\type\type_googleplus
+ arguments:
+ - @request
+ - @template
+ - @user
+ tags:
+ - { name: profilefield.type }
+
profilefields.type.int:
class: phpbb\profilefields\type\type_int
arguments:
diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml
index 3743daa075..735a49c99b 100644
--- a/phpBB/config/services.yml
+++ b/phpBB/config/services.yml
@@ -139,6 +139,11 @@ services:
- @service_container
dbal.conn:
+ class: phpbb\db\driver\factory
+ arguments:
+ - @service_container
+
+ dbal.conn.driver:
class: %dbal.driver.class%
calls:
- [sql_connect, [%dbal.dbhost%, %dbal.dbuser%, %dbal.dbpasswd%, %dbal.dbname%, %dbal.dbport%, false, %dbal.new_link%]]
@@ -255,7 +260,6 @@ services:
arguments:
- @auth
- @config
- - @config_text
- @dbal.conn
- @user
- %core.root_path%
@@ -355,3 +359,6 @@ services:
- @cache
- @config
- @user
+
+ viewonline_helper:
+ class: phpbb\viewonline_helper
diff --git a/phpBB/develop/add_permissions.php b/phpBB/develop/add_permissions.php
index 7639256cfd..fd419a7dde 100644
--- a/phpBB/develop/add_permissions.php
+++ b/phpBB/develop/add_permissions.php
@@ -371,7 +371,7 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting)
switch ($sql_type)
{
case 'insert':
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
diff --git a/phpBB/develop/benchmark.php b/phpBB/develop/benchmark.php
index 27176c97d3..c3cf90773e 100644
--- a/phpBB/develop/benchmark.php
+++ b/phpBB/develop/benchmark.php
@@ -313,7 +313,7 @@ function make_post($new_topic_id, $forum_id, $user_id, $post_username, $text, $m
else
{
// Rollback
- if($db->sql_layer == "mysql")
+ if($db->get_sql_layer() == "mysql")
{
$sql = "DELETE FROM " . POSTS_TABLE . "
WHERE post_id = $new_post_id";
diff --git a/phpBB/develop/create_schema_files.php b/phpBB/develop/create_schema_files.php
index 05085d39ab..b1e981795f 100644
--- a/phpBB/develop/create_schema_files.php
+++ b/phpBB/develop/create_schema_files.php
@@ -20,7 +20,6 @@
$schema_path = dirname(__FILE__) . '/../install/schemas/';
$supported_dbms = array(
- 'firebird',
'mssql',
'mysql_40',
'mysql_41',
@@ -58,188 +57,4 @@ $fp = fopen($schema_path . 'schema.json', 'wb');
fwrite($fp, json_encode($schema_data, JSON_PRETTY_PRINT));
fclose($fp);
-foreach ($supported_dbms as $dbms)
-{
- $fp = fopen($schema_path . $dbms . '_schema.sql', 'wb');
-
- // Write Header
- switch ($dbms)
- {
- case 'mysql_40':
- case 'mysql_41':
- case 'firebird':
- case 'sqlite':
- case 'sqlite3':
- fwrite($fp, "# DO NOT EDIT THIS FILE, IT IS GENERATED\n");
- fwrite($fp, "#\n");
- fwrite($fp, "# To change the contents of this file, edit\n");
- fwrite($fp, "# phpBB/develop/create_schema_files.php and\n");
- fwrite($fp, "# run it.\n");
- break;
-
- case 'mssql':
- case 'oracle':
- case 'postgres':
- fwrite($fp, "/*\n");
- fwrite($fp, " * DO NOT EDIT THIS FILE, IT IS GENERATED\n");
- fwrite($fp, " *\n");
- fwrite($fp, " * To change the contents of this file, edit\n");
- fwrite($fp, " * phpBB/develop/create_schema_files.php and\n");
- fwrite($fp, " * run it.\n");
- fwrite($fp, " */\n\n");
- break;
- }
-
- $line = '';
- switch ($dbms)
- {
- case 'oracle':
- $line .= custom_data('oracle') . "\n";
- break;
-
- case 'postgres':
- $line .= "BEGIN;\n\n";
- $line .= custom_data('postgres') . "\n";
- $line .= "COMMIT;\n\n";
- break;
- }
-
- fwrite($fp, $line);
- fclose($fp);
-}
-
-/**
-* Data put into the header for various dbms
-*/
-function custom_data($dbms)
-{
- switch ($dbms)
- {
- case 'oracle':
- return <<<EOF
-/*
- This first section is optional, however its probably the best method
- of running phpBB on Oracle. If you already have a tablespace and user created
- for phpBB you can leave this section commented out!
-
- The first set of statements create a phpBB tablespace and a phpBB user,
- make sure you change the password of the phpBB user before you run this script!!
-*/
-
-/*
-CREATE TABLESPACE "PHPBB"
- LOGGING
- DATAFILE 'E:\ORACLE\ORADATA\LOCAL\PHPBB.ora'
- SIZE 10M
- AUTOEXTEND ON NEXT 10M
- MAXSIZE 100M;
-
-CREATE USER "PHPBB"
- PROFILE "DEFAULT"
- IDENTIFIED BY "phpbb_password"
- DEFAULT TABLESPACE "PHPBB"
- QUOTA UNLIMITED ON "PHPBB"
- ACCOUNT UNLOCK;
-
-GRANT ANALYZE ANY TO "PHPBB";
-GRANT CREATE SEQUENCE TO "PHPBB";
-GRANT CREATE SESSION TO "PHPBB";
-GRANT CREATE TABLE TO "PHPBB";
-GRANT CREATE TRIGGER TO "PHPBB";
-GRANT CREATE VIEW TO "PHPBB";
-GRANT "CONNECT" TO "PHPBB";
-
-COMMIT;
-DISCONNECT;
-
-CONNECT phpbb/phpbb_password;
-*/
-EOF;
-
- break;
-
- case 'postgres':
- return <<<EOF
-/*
- Domain definition
-*/
-CREATE DOMAIN varchar_ci AS varchar(255) NOT NULL DEFAULT ''::character varying;
-
-/*
- Operation Functions
-*/
-CREATE FUNCTION _varchar_ci_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) = LOWER($2)' LANGUAGE SQL STRICT;
-CREATE FUNCTION _varchar_ci_not_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) != LOWER($2)' LANGUAGE SQL STRICT;
-CREATE FUNCTION _varchar_ci_less_than(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) < LOWER($2)' LANGUAGE SQL STRICT;
-CREATE FUNCTION _varchar_ci_less_equal(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) <= LOWER($2)' LANGUAGE SQL STRICT;
-CREATE FUNCTION _varchar_ci_greater_than(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) > LOWER($2)' LANGUAGE SQL STRICT;
-CREATE FUNCTION _varchar_ci_greater_equals(varchar_ci, varchar_ci) RETURNS boolean AS 'SELECT LOWER($1) >= LOWER($2)' LANGUAGE SQL STRICT;
-
-/*
- Operators
-*/
-CREATE OPERATOR <(
- PROCEDURE = _varchar_ci_less_than,
- LEFTARG = varchar_ci,
- RIGHTARG = varchar_ci,
- COMMUTATOR = >,
- NEGATOR = >=,
- RESTRICT = scalarltsel,
- JOIN = scalarltjoinsel);
-
-CREATE OPERATOR <=(
- PROCEDURE = _varchar_ci_less_equal,
- LEFTARG = varchar_ci,
- RIGHTARG = varchar_ci,
- COMMUTATOR = >=,
- NEGATOR = >,
- RESTRICT = scalarltsel,
- JOIN = scalarltjoinsel);
-
-CREATE OPERATOR >(
- PROCEDURE = _varchar_ci_greater_than,
- LEFTARG = varchar_ci,
- RIGHTARG = varchar_ci,
- COMMUTATOR = <,
- NEGATOR = <=,
- RESTRICT = scalargtsel,
- JOIN = scalargtjoinsel);
-
-CREATE OPERATOR >=(
- PROCEDURE = _varchar_ci_greater_equals,
- LEFTARG = varchar_ci,
- RIGHTARG = varchar_ci,
- COMMUTATOR = <=,
- NEGATOR = <,
- RESTRICT = scalargtsel,
- JOIN = scalargtjoinsel);
-
-CREATE OPERATOR <>(
- PROCEDURE = _varchar_ci_not_equal,
- LEFTARG = varchar_ci,
- RIGHTARG = varchar_ci,
- COMMUTATOR = <>,
- NEGATOR = =,
- RESTRICT = neqsel,
- JOIN = neqjoinsel);
-
-CREATE OPERATOR =(
- PROCEDURE = _varchar_ci_equal,
- LEFTARG = varchar_ci,
- RIGHTARG = varchar_ci,
- COMMUTATOR = =,
- NEGATOR = <>,
- RESTRICT = eqsel,
- JOIN = eqjoinsel,
- HASHES,
- MERGES,
- SORT1= <);
-
-EOF;
- break;
- }
-
- return '';
-}
-
echo 'done';
diff --git a/phpBB/develop/merge_attachment_tables.php b/phpBB/develop/merge_attachment_tables.php
index a23db829e5..dd6e12172e 100644
--- a/phpBB/develop/merge_attachment_tables.php
+++ b/phpBB/develop/merge_attachment_tables.php
@@ -48,7 +48,7 @@ $sql = "CREATE TABLE {$table_prefix}attachments
AND a.post_id = p.post_id";
$db->sql_query($sql);
-switch ($db->sql_layer)
+switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
diff --git a/phpBB/develop/merge_post_tables.php b/phpBB/develop/merge_post_tables.php
index 700c509782..9e81917108 100644
--- a/phpBB/develop/merge_post_tables.php
+++ b/phpBB/develop/merge_post_tables.php
@@ -46,7 +46,7 @@ $sql = "CREATE TABLE {$table_prefix}posts
WHERE pt.post_id = p.post_id";
$db->sql_query($sql);
-switch ($db->sql_layer)
+switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
@@ -142,7 +142,7 @@ while ($row = $db->sql_fetchrow($result))
}
$db->sql_freeresult($result);
-switch ($db->sql_layer)
+switch ($db->get_sql_layer())
{
case 'oracle':
$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id
diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html
index ab3a42206e..2a824fa9b7 100644
--- a/phpBB/docs/CHANGELOG.html
+++ b/phpBB/docs/CHANGELOG.html
@@ -46,6 +46,7 @@
<ol>
<li><a href="#changelog">Changelog</a>
<ol style="list-style-type: lower-roman;">
+ <li><a href="#v310b3">Changes since 3.1.0-b4</a></li>
<li><a href="#v310b3">Changes since 3.1.0-b3</a></li>
<li><a href="#v310b2">Changes since 3.1.0-b2</a></li>
<li><a href="#v310b1">Changes since 3.1.0-b1</a></li>
@@ -93,7 +94,127 @@
<div class="content">
- <a name="v310b3"></a><h3>1.i. Changes since 3.1.0-b3</h3>
+ <a name="v310b4"></a><h3>1.i. Changes since 3.1.0-b4</h3>
+
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8610">PHPBB3-8610</a>] - Splitting and merging topics does not handle subscriptions and bookmarks correctly</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10899">PHPBB3-10899</a>] - Using Delete All in log viewer with keyword search</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11331">PHPBB3-11331</a>] - Inform admin of incorrect avatar path instead of stripping unexpected parts from destination path</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11445">PHPBB3-11445</a>] - Suboptimal number of query complexity in phpbb_notification_manager::get_global_subscriptions()</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11467">PHPBB3-11467</a>] - phpbb_extension_metadata_manager uses hard coded language for exceptions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11659">PHPBB3-11659</a>] - Information about file_upload is missing from the requirement page</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11942">PHPBB3-11942</a>] - Delete post/topic reason should be added to the generated log entry</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12109">PHPBB3-12109</a>] - Bug when setting users forum permissions with &quot;Select all users&quot; checkbox</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12209">PHPBB3-12209</a>] - OAuth Authentication in ACP does not explain that it allows regular login too</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12332">PHPBB3-12332</a>] - Attachments with long file names break the Uploader layout</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12352">PHPBB3-12352</a>] - The service definition &quot;auth.provider.smf&quot; does not exist.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12443">PHPBB3-12443</a>] - Responsive tabs broken in IE</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12457">PHPBB3-12457</a>] - Gallery avatar category &quot;Main&quot; is empty</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12508">PHPBB3-12508</a>] - phpbb\finder (currently phpbb\extension\finder) should not depend on extension manager</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12521">PHPBB3-12521</a>] - When selecting the target to merge two topics, the last column is pushed on a new line</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12552">PHPBB3-12552</a>] - [RTL] - Forum list content forced into single char column when responsive</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12553">PHPBB3-12553</a>] - Right-to-left language bugs in prosilver</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12566">PHPBB3-12566</a>] - &quot;Private messages&quot; in viewtopic.php should be &quot;Send pivate message&quot;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12589">PHPBB3-12589</a>] - The finder should search directly in $directory if it's an absolute sub-path</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12612">PHPBB3-12612</a>] - Front-facing files should not contain functions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12615">PHPBB3-12615</a>] - Improper clearing of .topic-actions leads to float problems</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12637">PHPBB3-12637</a>] - coding-guidelines.html contains invalid HTML</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12638">PHPBB3-12638</a>] - Call to undefined function phpbb\db\migration\data\v30x\phpbb_require_updated() when not using autoupdate package</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12639">PHPBB3-12639</a>] - Delete entry in admin-log leads to mysql-error</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12640">PHPBB3-12640</a>] - Posting editor tab &quot;attachments&quot; is unclicked in IE8</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12641">PHPBB3-12641</a>] - With IE8 logged in to ACP error message appears in the browser</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12643">PHPBB3-12643</a>] - Cannot convert SQLite DB from 3.0.12 to 3.1.0</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12652">PHPBB3-12652</a>] - Deleting marked log entries leads to MySQL Error</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12660">PHPBB3-12660</a>] - Undefined offset error when phpinfo() disabled and debug enabled</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12665">PHPBB3-12665</a>] - develop/migration_tips.php should not find extension tips</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12667">PHPBB3-12667</a>] - New posts in a topic cause undesirable results when clicking topic title or page button</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12672">PHPBB3-12672</a>] - Make &lt;Tab&gt; inside [code] - more user friendly</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12673">PHPBB3-12673</a>] - PLUPLOAD fails due missing constant IMAGETYPE_SWC</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12675">PHPBB3-12675</a>] - Fix code sniffer complaints in 3.1.0-b5-dev code</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12682">PHPBB3-12682</a>] - Code Sniffer does not work correctly on Travis CI.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12688">PHPBB3-12688</a>] - Rank images do not work on routes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12694">PHPBB3-12694</a>] - Remove whitespace at end of line from acp_groups</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12697">PHPBB3-12697</a>] - Database Test Case Must Purge Extension Schema When Done</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12705">PHPBB3-12705</a>] - make_clickable is using static variables incorrectly</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12707">PHPBB3-12707</a>] - \phpbb\db\driver\phpbb\db\driver\mysql is tried being loaded</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12708">PHPBB3-12708</a>] - [ROOT] -/install/install_main.php still uses docs/COPYING</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12709">PHPBB3-12709</a>] - Duplicate entries in the posting attachments tab</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12711">PHPBB3-12711</a>] - Contact form migration fails on MSSQL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12712">PHPBB3-12712</a>] - Password conversion migration fails on MSSQL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12715">PHPBB3-12715</a>] - Mistakes in the doc blocks</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12720">PHPBB3-12720</a>] - Git commit hook should not require commit message to start with a capital letter</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12728">PHPBB3-12728</a>] - Enforce box-model for image attachments</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12741">PHPBB3-12741</a>] - Functional tests on Travis fail since php update last night</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12746">PHPBB3-12746</a>] - Failing test: tests/content_visibility/delete_post_test.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12747">PHPBB3-12747</a>] - Drop Firebird support</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12750">PHPBB3-12750</a>] - Install/Update footer is not centered anymore</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12752">PHPBB3-12752</a>] - Cron list tests fail on windows with ansi support</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12753">PHPBB3-12753</a>] - FIELD_INVALID_CHARS_ALPHA_PUNCTUATION is not localized</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12755">PHPBB3-12755</a>] - Remote upload stuck in infinite loop if server sends keep-alive</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12756">PHPBB3-12756</a>] - Fatal error with mysqli_fetch_assoc on hhvm</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12761">PHPBB3-12761</a>] - Remove the execute bit from functions_user.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12762">PHPBB3-12762</a>] - Make ext.php optional for extensions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12763">PHPBB3-12763</a>] - Do not unnecessarily rewrite install/schemas/*_schema.sql when updating schema.json file</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11266">PHPBB3-11266</a>] - Use our own error message when composer is not set up</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12532">PHPBB3-12532</a>] - Add header_navbar_username_prepend/append template events.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12541">PHPBB3-12541</a>] - Activate attachments tab when files are dropped into textarea</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12563">PHPBB3-12563</a>] - Language key names in ACP styles are misleading</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12606">PHPBB3-12606</a>] - PHP events in /includes/acp/acp_groups.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12608">PHPBB3-12608</a>] - Improve notifications drop-down menu styling in header</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12613">PHPBB3-12613</a>] - Improve pagination styling and jump-to-page dialog</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12646">PHPBB3-12646</a>] - Add data attribute to breadcrumb links</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12648">PHPBB3-12648</a>] - Improve UCP/MCP/Posting tabs styling &amp; problems</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12655">PHPBB3-12655</a>] - Allow the CLI to be used as a shell</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12664">PHPBB3-12664</a>] - Refactor develop/migration_tips.php into a console command</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12666">PHPBB3-12666</a>] - Use &quot;None&quot; for images in gallery avatar path root and rename lang key</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12668">PHPBB3-12668</a>] - Add ability to modify subforums template data for core.display_forums_modify_template_vars event</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12669">PHPBB3-12669</a>] - Add core event to the function display_forums() for additional template data</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12677">PHPBB3-12677</a>] - Remove comment about ‘threading’</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12687">PHPBB3-12687</a>] - Add a constant to dissociate the displaying of the load time from DEBUG</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12690">PHPBB3-12690</a>] - Add core.submit_pm_after event</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12691">PHPBB3-12691</a>] - Add core.delete_pm to funtion delete_pm.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12704">PHPBB3-12704</a>] - Improve the load time information in the footer when enabled</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12706">PHPBB3-12706</a>] - Ignore additional languages and styles from git</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12714">PHPBB3-12714</a>] - Better align the description of radio buttons to avoid confusion with the forum list in attachments settings</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12740">PHPBB3-12740</a>] - Stop Using IDs as CSS selectors</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12758">PHPBB3-12758</a>] - Add 'show_results' mode var to event core.search_modify_rowset</li>
+ </ul>
+ <h4>New Feature</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12597">PHPBB3-12597</a>] - Command for executing all available cron tasks</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12602">PHPBB3-12602</a>] - Add command to print the cron list</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12607">PHPBB3-12607</a>] - CLI command for running a specific cron task</li>
+ </ul>
+ <h4>Sub-task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12575">PHPBB3-12575</a>] - Use a proxy pattern in \phpbb\di\service_collection</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12699">PHPBB3-12699</a>] - Replace instances in the message textarea keydown callback</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12721">PHPBB3-12721</a>] - Simple rules</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12722">PHPBB3-12722</a>] - Add rule Generic.Formatting.SpaceAfterCast</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12724">PHPBB3-12724</a>] - Add rule Squiz.PHP.Eval</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12729">PHPBB3-12729</a>] - Add Facebook profile field</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12730">PHPBB3-12730</a>] - Add Google+ profile field</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12731">PHPBB3-12731</a>] - Add YouTube profile field</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12732">PHPBB3-12732</a>] - Add Skype profile field</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12733">PHPBB3-12733</a>] - Add Twitter profile field</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11528">PHPBB3-11528</a>] - Use mink for acceptance tests involving javascript execution</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12514">PHPBB3-12514</a>] - Add additional tests for custom profile fields type</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12696">PHPBB3-12696</a>] - Add events to ucp_register.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12701">PHPBB3-12701</a>] - Add events to user_add function</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12723">PHPBB3-12723</a>] - Add Code Sniffer sniff ensuring PHP files use the correct file header</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12726">PHPBB3-12726</a>] - Add Code Sniffer sniff ensuring PHP files do not contain any unused use statements</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12757">PHPBB3-12757</a>] - Add a Code Sniffer ruleset for PHP files of phpBB extensions</li>
+ </ul>
+
+
+ <a name="v310b3"></a><h3>1.ii. Changes since 3.1.0-b3</h3>
<h4>Bug</h4>
<ul>
@@ -200,7 +321,7 @@
</ul>
- <a name="v310b2"></a><h3>1.ii. Changes since 3.1.0-b2</h3>
+ <a name="v310b2"></a><h3>1.iii. Changes since 3.1.0-b2</h3>
<h4>Bug</h4>
<ul>
@@ -365,7 +486,7 @@
</ul>
- <a name="v310b1"></a><h3>1.iii. Changes since 3.1.0-b1</h3>
+ <a name="v310b1"></a><h3>1.iv. Changes since 3.1.0-b1</h3>
<h4>Bug</h4>
<ul>
@@ -433,7 +554,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12302">PHPBB3-12302</a>] - Upgrade composer.phar to 1.0.0-alpha8</li>
</ul>
- <a name="v310a3"></a><h3>1.iv. Changes since 3.1.0-a3</h3>
+ <a name="v310a3"></a><h3>1.v. Changes since 3.1.0-a3</h3>
<h4>Bug</h4>
<ul>
@@ -580,7 +701,7 @@
</ul>
- <a name="v310a2"></a><h3>1.v. Changes since 3.1.0-a2</h3>
+ <a name="v310a2"></a><h3>1.vi. Changes since 3.1.0-a2</h3>
<h4>Bug</h4>
<ul>
@@ -688,7 +809,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12147">PHPBB3-12147</a>] - Remove Travis CI notification configuration</li>
</ul>
- <a name="v310a1"></a><h3>1.vi. Changes since 3.1.0-a1</h3>
+ <a name="v310a1"></a><h3>1.vii. Changes since 3.1.0-a1</h3>
<h4>Bug</h4>
<ul>
@@ -764,7 +885,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11998">PHPBB3-11998</a>] - Add console / command line client environment </li>
</ul>
- <a name="v30x"></a><h3>1.vii. Changes since 3.0.x</h3>
+ <a name="v30x"></a><h3>1.viii. Changes since 3.0.x</h3>
<h4>Bug</h4>
<ul>
@@ -1445,7 +1566,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11913">PHPBB3-11913</a>] - Apply reorganisation of download.phpbb.com to build_announcement.php</li>
</ul>
- <a name="v3011"></a><h3>1.viii. Changes since 3.0.11</h3>
+ <a name="v3011"></a><h3>1.ix. Changes since 3.0.11</h3>
<h4>Bug</h4>
<ul>
@@ -1600,7 +1721,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11753">PHPBB3-11753</a>] - Upgrade mysql_upgrader.php schema data.</li>
</ul>
- <a name="v3010"></a><h3>1.ix. Changes since 3.0.10</h3>
+ <a name="v3010"></a><h3>1.x. Changes since 3.0.10</h3>
<h4>Bug</h4>
<ul>
@@ -1725,7 +1846,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10909">PHPBB3-10909</a>] - Update Travis Test Configuration: Travis no longer supports PHP 5.3.2</li>
</ul>
- <a name="v309"></a><h3>1.x. Changes since 3.0.9</h3>
+ <a name="v309"></a><h3>1.xi. Changes since 3.0.9</h3>
<h4>Bug</h4>
<ul>
@@ -1861,7 +1982,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10480">PHPBB3-10480</a>] - Automate changelog building</li>
</ul>
- <a name="v308"></a><h3>1.xi. Changes since 3.0.8</h3>
+ <a name="v308"></a><h3>1.xii. Changes since 3.0.8</h3>
<h4> Bug
</h4>
@@ -2229,7 +2350,7 @@
</ul>
- <a name="v307-PL1"></a><h3>1.xii. Changes since 3.0.7-PL1</h3>
+ <a name="v307-PL1"></a><h3>1.xiii. Changes since 3.0.7-PL1</h3>
<h4> Security
</h4>
<ul>
@@ -2687,13 +2808,13 @@
</ul>
- <a name="v307"></a><h3>1.xiii. Changes since 3.0.7</h3>
+ <a name="v307"></a><h3>1.xiv. Changes since 3.0.7</h3>
<ul>
<li>[Sec] Do not expose forum content of forums with ACL entries but no actual permission in ATOM Feeds. (Bug #58595)</li>
</ul>
- <a name="v306"></a><h3>1.xiv. Changes since 3.0.6</h3>
+ <a name="v306"></a><h3>1.xv. Changes since 3.0.6</h3>
<ul>
<li>[Fix] Allow ban reason and length to be selected and copied in ACP and subsilver2 MCP. (Bug #51095)</li>
@@ -2797,7 +2918,7 @@
</ul>
- <a name="v305"></a><h3>1.xv. Changes since 3.0.5</h3>
+ <a name="v305"></a><h3>1.xvi. Changes since 3.0.5</h3>
<ul>
<li>[Fix] Allow whitespaces in avatar gallery names. (Bug #44955)</li>
@@ -3019,7 +3140,7 @@
<li>[Feature] Send anonymous statistical information to phpBB on installation and update (optional).</li>
</ul>
- <a name="v304"></a><h3>1.xvi. Changes since 3.0.4</h3>
+ <a name="v304"></a><h3>1.xvii. Changes since 3.0.4</h3>
<ul>
<li>[Fix] Delete user entry from ban list table upon user deletion (Bug #40015 - Patch by TerraFrost)</li>
@@ -3108,7 +3229,7 @@
<li>[Sec] Only use forum id supplied for posting if global announcement detected. (Reported by nickvergessen)</li>
</ul>
- <a name="v303"></a><h3>1.xvii. Changes since 3.0.3</h3>
+ <a name="v303"></a><h3>1.xviii. Changes since 3.0.3</h3>
<ul>
<li>[Fix] Allow mixed-case template directories to be inherited (Bug #36725)</li>
@@ -3140,7 +3261,7 @@
<li>[Sec] Ask for forum password if post within passworded forum quoted in private message. (Reported by nickvergessen)</li>
</ul>
- <a name="v302"></a><h3>1.xviii. Changes since 3.0.2</h3>
+ <a name="v302"></a><h3>1.xix. Changes since 3.0.2</h3>
<ul>
<li>[Fix] Correctly set topic starter if first post in topic removed (Bug #30575 - Patch by blueray2048)</li>
@@ -3239,7 +3360,7 @@
<li>[Sec Precaution] Stricter validation of the HTTP_HOST header (Thanks to Techie-Micheal et al for pointing out possible issues in derived code)</li>
</ul>
- <a name="v301"></a><h3>1.xix. Changes since 3.0.1</h3>
+ <a name="v301"></a><h3>1.xx. Changes since 3.0.1</h3>
<ul>
<li>[Fix] Ability to set permissions on non-mysql dbms (Bug #24955)</li>
@@ -3287,7 +3408,7 @@
<li>[Sec] Only allow urls gone through redirect() being used within login_box(). (thanks nookieman)</li>
</ul>
- <a name="v300"></a><h3>1.xx. Changes since 3.0.0</h3>
+ <a name="v300"></a><h3>1.xxi. Changes since 3.0.0</h3>
<ul>
<li>[Change] Validate birthdays (Bug #15004)</li>
@@ -3358,7 +3479,7 @@
<li>[Fix] Find and display colliding usernames correctly when converting from one database to another (Bug #23925)</li>
</ul>
- <a name="v30rc8"></a><h3>1.xxi. Changes since 3.0.RC8</h3>
+ <a name="v30rc8"></a><h3>1.xxii. Changes since 3.0.RC8</h3>
<ul>
<li>[Fix] Cleaned usernames contain only single spaces, so &quot;a_name&quot; and &quot;a__name&quot; are treated as the same name (Bug #15634)</li>
@@ -3367,7 +3488,7 @@
<li>[Fix] Call garbage_collection() within database updater to correctly close connections (affects Oracle for example)</li>
</ul>
- <a name="v30rc7"></a><h3>1.xxii. Changes since 3.0.RC7</h3>
+ <a name="v30rc7"></a><h3>1.xxiii. Changes since 3.0.RC7</h3>
<ul>
<li>[Fix] Fixed MSSQL related bug in the update system</li>
@@ -3402,7 +3523,7 @@
<li>[Fix] No duplication of active topics (Bug #15474)</li>
</ul>
- <a name="v30rc6"></a><h3>1.xxiii. Changes since 3.0.RC6</h3>
+ <a name="v30rc6"></a><h3>1.xxiv. Changes since 3.0.RC6</h3>
<ul>
<li>[Fix] Submitting language changes using acp_language (Bug #14736)</li>
@@ -3412,7 +3533,7 @@
<li>[Fix] Able to request new password (Bug #14743)</li>
</ul>
- <a name="v30rc5"></a><h3>1.xxiv. Changes since 3.0.RC5</h3>
+ <a name="v30rc5"></a><h3>1.xxv. Changes since 3.0.RC5</h3>
<ul>
<li>[Feature] Removing constant PHPBB_EMBEDDED in favor of using an exit_handler(); the constant was meant to achive this more or less.</li>
@@ -3475,7 +3596,7 @@
<li>[Sec] New password hashing mechanism for storing passwords (#i42)</li>
</ul>
- <a name="v30rc4"></a><h3>1.xxv. Changes since 3.0.RC4</h3>
+ <a name="v30rc4"></a><h3>1.xxvi. Changes since 3.0.RC4</h3>
<ul>
<li>[Fix] MySQL, PostgreSQL and SQLite related database fixes (Bug #13862)</li>
@@ -3526,7 +3647,7 @@
<li>[Fix] odbc_autocommit causing existing result sets to be dropped (Bug #14182)</li>
</ul>
- <a name="v30rc3"></a><h3>1.xxvi. Changes since 3.0.RC3</h3>
+ <a name="v30rc3"></a><h3>1.xxvii. Changes since 3.0.RC3</h3>
<ul>
<li>[Fix] Fixing some subsilver2 and prosilver style issues</li>
@@ -3635,7 +3756,7 @@
</ul>
- <a name="v30rc2"></a><h3>1.xxvii. Changes since 3.0.RC2</h3>
+ <a name="v30rc2"></a><h3>1.xxviii. Changes since 3.0.RC2</h3>
<ul>
<li>[Fix] Re-allow searching within the memberlist</li>
@@ -3681,7 +3802,7 @@
</ul>
- <a name="v30rc1"></a><h3>1.xxviii. Changes since 3.0.RC1</h3>
+ <a name="v30rc1"></a><h3>1.xxix. Changes since 3.0.RC1</h3>
<ul>
<li>[Fix] (X)HTML issues within the templates (Bug #11255, #11255)</li>
diff --git a/phpBB/docs/CREDITS.txt b/phpBB/docs/CREDITS.txt
index a4ba4cb87c..edb6361b2a 100644
--- a/phpBB/docs/CREDITS.txt
+++ b/phpBB/docs/CREDITS.txt
@@ -28,6 +28,7 @@ phpBB Developers: bantu (Andreas Fischer)
imkingdavid (David King)
marc1706 (Marc Alexander)
nickvergessen (Joas Schilling)
+ nicofuma (Tristan Darricau)
prototech (Cesar Gallegos)
For a list of phpBB Team members, please see:
diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html
index 0fce349974..a46cea47b1 100644
--- a/phpBB/docs/INSTALL.html
+++ b/phpBB/docs/INSTALL.html
@@ -136,7 +136,6 @@
<li>PostgreSQL 8.3+</li>
<li>SQLite 2.8.2+</li>
<li>SQLite 3.6.15+</li>
- <li>Firebird 2.1+</li>
<li>MS SQL Server 2000 or above (directly or via ODBC or the native adapter)</li>
<li>Oracle</li>
</ul>
diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html
index b0fd86f959..e64d3dd8f2 100644
--- a/phpBB/docs/README.html
+++ b/phpBB/docs/README.html
@@ -323,7 +323,7 @@
<p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p>
- <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p>
+ <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and SQLite 3. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p>
<a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3>
diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html
index 173c7e5441..98cfe0e717 100644
--- a/phpBB/docs/coding-guidelines.html
+++ b/phpBB/docs/coding-guidelines.html
@@ -736,7 +736,7 @@ static private function f()
<a name="sql"></a><h3>2.iii. SQL/SQL Layout</h3>
<h4>Common SQL Guidelines: </h4>
- <p>All SQL should be cross-DB compatible, if DB specific SQL is used alternatives must be provided which work on all supported DB's (MySQL3/4/5, MSSQL (7.0 and 2000), PostgreSQL (8.3+), Firebird, SQLite, Oracle8, ODBC (generalised if possible)).</p>
+ <p>All SQL should be cross-DB compatible, if DB specific SQL is used alternatives must be provided which work on all supported DB's (MySQL3/4/5, MSSQL (7.0 and 2000), PostgreSQL (8.3+), SQLite, Oracle8, ODBC (generalised if possible)).</p>
<p>All SQL commands should utilise the DataBase Abstraction Layer (DBAL)</p>
<h4>SQL code layout:</h4>
diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md
index 44a7824901..f1c03672c3 100644
--- a/phpBB/docs/events.md
+++ b/phpBB/docs/events.md
@@ -246,21 +246,21 @@ index_body_block_stats_prepend
* Since: 3.1.0-b3
* Purpose: Prepend content to the statistics list on the Board index
-index_body_linklist_after
+index_body_markforums_after
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
-* Since: 3.1.0-a3
-* Purpose: Add content after the linklist above the forum list on Board index
+* Since: 3.1.0-RC2
+* Purpose: Add content after the mark-read link above the forum list on Board index
-index_body_linklist_before
+index_body_markforums_before
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
-* Since: 3.1.0-a3
-* Purpose: Add content before the linklist above the forum list on Board index
+* Since: 3.1.0-RC2
+* Purpose: Add content before the mark-read link above the forum list on Board index
index_body_stat_blocks_after
===
@@ -344,6 +344,55 @@ memberlist_view_user_statistics_before
* Since: 3.1.0-a1
* Purpose: Add entries before the user statistics part of any user profile
+navbar_header_logged_out_content
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC1
+* Purpose: Add text and HTML in place of the username when not logged in.
+
+navbar_header_profile_list_after
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC2
+* Purpose: Add links to the bottom of the profile drop-down menu in the header navbar
+
+navbar_header_profile_list_before
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC2
+* Purpose: Add links to the top of the profile drop-down menu in the header navbar
+
+navbar_header_quick_links_after
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC2
+* Purpose: Add links to the bottom of the quick-links drop-down menu in the header
+
+navbar_header_quick_links_before
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC2
+* Purpose: Add links to the top of the quick-links drop-down menu in the header
+
+navbar_header_username_append
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC1
+* Purpose: Add text and HTMl after the username shown in the navbar.
+
+navbar_header_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/navbar_header.html
+* Since: 3.1.0-RC1
+* Purpose: Add text and HTMl before the username shown in the navbar.
+
overall_footer_after
===
* Locations:
@@ -767,7 +816,7 @@ ucp_prefs_view_radio_buttons_prepend
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
-* Purpose: Add options to the top of the radio buttons block of the Edit
+* Purpose: Add options to the top of the radio buttons block of the Edit
Display Options screen
ucp_prefs_view_radio_buttons_append
@@ -776,7 +825,7 @@ ucp_prefs_view_radio_buttons_append
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
-* Purpose: Add options to the bottom of the radio buttons block of the Edit
+* Purpose: Add options to the bottom of the radio buttons block of the Edit
Display Options screen
ucp_prefs_view_select_menu_prepend
@@ -785,7 +834,7 @@ ucp_prefs_view_select_menu_prepend
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
-* Purpose: Add options to the top of the drop-down lists block of the Edit
+* Purpose: Add options to the top of the drop-down lists block of the Edit
Display Options screen
ucp_prefs_view_select_menu_append
@@ -794,9 +843,49 @@ ucp_prefs_view_select_menu_append
+ styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
-* Purpose: Add options to the bottom of the drop-down lists block of the Edit
+* Purpose: Add options to the bottom of the drop-down lists block of the Edit
Display Options screen
+ucp_register_credentials_before
+===
+* Locations:
+ + styles/prosilver/template/ucp_register.html
+ + styles/subsilver2/template/ucp_register.html
+* Since: 3.1.0-b5
+* Purpose: Add options in registration page fieldset - before first field.
+
+ucp_register_profile_fields_after
+===
+* Locations:
+ + styles/prosilver/template/ucp_register.html
+ + styles/subsilver2/template/ucp_register.html
+* Since: 3.1.0-b5
+* Purpose: Add options in registration page fieldset - after last field.
+
+ucp_register_credentials_after
+===
+* Locations:
+ + styles/prosilver/template/ucp_register.html
+ + styles/subsilver2/template/ucp_register.html
+* Since: 3.1.0-b5
+* Purpose: Add options in registration page fieldset - after password field.
+
+ucp_register_options_before
+===
+* Locations:
+ + styles/prosilver/template/ucp_register.html
+ + styles/subsilver2/template/ucp_register.html
+* Since: 3.1.0-b5
+* Purpose: Add options in registration page fieldset - before language selector.
+
+ucp_register_profile_fields_before
+===
+* Locations:
+ + styles/prosilver/template/ucp_register.html
+ + styles/subsilver2/template/ucp_register.html
+* Since: 3.1.0-b5
+* Purpose: Add options in registration page fieldset - before profile fields.
+
ucp_friend_list_before
===
* Locations:
diff --git a/phpBB/download/file.php b/phpBB/download/file.php
index ce2855473b..abafeee667 100644
--- a/phpBB/download/file.php
+++ b/phpBB/download/file.php
@@ -59,6 +59,8 @@ if (isset($_GET['avatar']))
$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
$phpbb_class_loader_ext->register();
+ phpbb_load_extensions_autoloaders($phpbb_root_path);
+
// Set up container
$phpbb_container = phpbb_create_default_container($phpbb_root_path, $phpEx);
@@ -73,11 +75,6 @@ if (isset($_GET['avatar']))
$db = $phpbb_container->get('dbal.conn');
$phpbb_log = $phpbb_container->get('log');
- // Connect to DB
- if (!@$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false))
- {
- exit;
- }
unset($dbpasswd);
request_var('', 0, false, false, $request);
diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php
index 74df9240a1..1811748c2f 100644
--- a/phpBB/includes/acp/acp_board.php
+++ b/phpBB/includes/acp/acp_board.php
@@ -410,7 +410,7 @@ class acp_board
'ip_check' => array('lang' => 'IP_VALID', 'validate' => 'int', 'type' => 'custom', 'method' => 'select_ip_check', 'explain' => true),
'browser_check' => array('lang' => 'BROWSER_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'forwarded_for_check' => array('lang' => 'FORWARDED_FOR_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
- 'referer_validation' => array('lang' => 'REFERER_VALID', 'validate' => 'int:0:3','type' => 'custom', 'method' => 'select_ref_check', 'explain' => true),
+ 'referer_validation' => array('lang' => 'REFERRER_VALID', 'validate' => 'int:0:3','type' => 'custom', 'method' => 'select_ref_check', 'explain' => true),
'check_dnsbl' => array('lang' => 'CHECK_DNSBL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'email_check_mx' => array('lang' => 'EMAIL_CHECK_MX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'max_pass_chars' => array('lang' => 'PASSWORD_LENGTH', 'validate' => 'int:8:255', 'type' => false, 'method' => false, 'explain' => false,),
diff --git a/phpBB/includes/acp/acp_contact.php b/phpBB/includes/acp/acp_contact.php
index 13d38d9f29..4e46df21e0 100644
--- a/phpBB/includes/acp/acp_contact.php
+++ b/phpBB/includes/acp/acp_contact.php
@@ -1,9 +1,14 @@
<?php
/**
*
-* @package acp
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
*/
/**
diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
index 3ba1210b5c..8f9c155ffc 100644
--- a/phpBB/includes/acp/acp_database.php
+++ b/phpBB/includes/acp/acp_database.php
@@ -90,7 +90,7 @@ class acp_database
$time = time();
$filename = 'backup_' . $time . '_' . unique_id();
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysqli':
case 'mysql4':
@@ -119,10 +119,6 @@ class acp_database
case 'mssqlnative':
$extractor = new mssql_extractor($format, $filename, $time, $download, $store);
break;
-
- case 'firebird':
- $extractor = new firebird_extractor($format, $filename, $time, $download, $store);
- break;
}
$extractor->write_start($table_prefix);
@@ -137,11 +133,10 @@ class acp_database
else
{
// We might wanna empty out all that junk :D
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$extractor->flush('DELETE FROM ' . $table_name . ";\n");
break;
@@ -325,7 +320,7 @@ class acp_database
break;
}
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
@@ -338,20 +333,6 @@ class acp_database
}
break;
- case 'firebird':
- $delim = ";\n";
- while (($sql = $fgetd($fp, $delim, $read, $seek, $eof)) !== false)
- {
- $query = trim($sql);
- if (substr($query, 0, 8) === 'SET TERM')
- {
- $delim = $query[9] . "\n";
- continue;
- }
- $db->sql_query($query);
- }
- break;
-
case 'postgres':
$delim = ";\n";
while (($sql = $fgetd($fp, $delim, $read, $seek, $eof)) !== false)
@@ -384,10 +365,10 @@ class acp_database
{
trigger_error($user->lang['RESTORE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
- pg_put_line($db->db_connect_id, $sub . "\n");
+ pg_put_line($db->get_db_connect_id(), $sub . "\n");
}
- pg_put_line($db->db_connect_id, "\\.\n");
- pg_end_copy($db->db_connect_id);
+ pg_put_line($db->get_db_connect_id(), "\\.\n");
+ pg_end_copy($db->get_db_connect_id());
}
}
break;
@@ -642,7 +623,7 @@ class mysql_extractor extends base_extractor
if ($new_extract === null)
{
- if ($db->sql_layer === 'mysqli' || version_compare($db->sql_server_info(true), '3.23.20', '>='))
+ if ($db->get_sql_layer() === 'mysqli' || version_compare($db->sql_server_info(true), '3.23.20', '>='))
{
$new_extract = true;
}
@@ -665,7 +646,7 @@ class mysql_extractor extends base_extractor
function write_data($table_name)
{
global $db;
- if ($db->sql_layer === 'mysqli')
+ if ($db->get_sql_layer() === 'mysqli')
{
$this->write_data_mysqli($table_name);
}
@@ -680,7 +661,7 @@ class mysql_extractor extends base_extractor
global $db;
$sql = "SELECT *
FROM $table_name";
- $result = mysqli_query($db->db_connect_id, $sql, MYSQLI_USE_RESULT);
+ $result = mysqli_query($db->get_db_connect_id(), $sql, MYSQLI_USE_RESULT);
if ($result != false)
{
$fields_cnt = mysqli_num_fields($result);
@@ -759,7 +740,7 @@ class mysql_extractor extends base_extractor
global $db;
$sql = "SELECT *
FROM $table_name";
- $result = mysql_unbuffered_query($sql, $db->db_connect_id);
+ $result = mysql_unbuffered_query($sql, $db->get_db_connect_id());
if ($result != false)
{
@@ -1012,11 +993,11 @@ class sqlite_extractor extends base_extractor
{
global $db;
- $col_types = sqlite_fetch_column_types($db->db_connect_id, $table_name);
+ $col_types = sqlite_fetch_column_types($db->get_db_connect_id(), $table_name);
$sql = "SELECT *
FROM $table_name";
- $result = sqlite_unbuffered_query($db->db_connect_id, $sql);
+ $result = sqlite_unbuffered_query($db->get_db_connect_id(), $sql);
$rows = sqlite_fetch_all($result, SQLITE_ASSOC);
$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES (';
foreach ($rows as $row)
@@ -1572,11 +1553,11 @@ class mssql_extractor extends base_extractor
{
global $db;
- if ($db->sql_layer === 'mssql')
+ if ($db->get_sql_layer() === 'mssql')
{
$this->write_data_mssql($table_name);
}
- else if($db->sql_layer === 'mssqlnative')
+ else if($db->get_sql_layer() === 'mssqlnative')
{
$this->write_data_mssqlnative($table_name);
}
@@ -2110,235 +2091,6 @@ class oracle_extractor extends base_extractor
}
}
-class firebird_extractor extends base_extractor
-{
- function write_start($prefix)
- {
- $sql_data = "--\n";
- $sql_data .= "-- phpBB Backup Script\n";
- $sql_data .= "-- Dump of tables for $prefix\n";
- $sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
- $sql_data .= "--\n";
- $this->flush($sql_data);
- }
-
- function write_data($table_name)
- {
- global $db;
- $ary_type = $ary_name = array();
-
- // Grab all of the data from current table.
- $sql = "SELECT *
- FROM $table_name";
- $result = $db->sql_query($sql);
-
- $i_num_fields = ibase_num_fields($result);
-
- for ($i = 0; $i < $i_num_fields; $i++)
- {
- $info = ibase_field_info($result, $i);
- $ary_type[$i] = $info['type'];
- $ary_name[$i] = $info['name'];
- }
-
- while ($row = $db->sql_fetchrow($result))
- {
- $schema_vals = $schema_fields = array();
-
- // Build the SQL statement to recreate the data.
- for ($i = 0; $i < $i_num_fields; $i++)
- {
- $str_val = $row[strtolower($ary_name[$i])];
-
- if (preg_match('#char|text|bool|varbinary|blob#i', $ary_type[$i]))
- {
- $str_quote = '';
- $str_empty = "''";
- $str_val = sanitize_data_generic(str_replace("'", "''", $str_val));
- }
- else if (preg_match('#date|timestamp#i', $ary_type[$i]))
- {
- if (empty($str_val))
- {
- $str_quote = '';
- }
- else
- {
- $str_quote = "'";
- }
- }
- else
- {
- $str_quote = '';
- $str_empty = 'NULL';
- }
-
- if (empty($str_val) && $str_val !== '0')
- {
- $str_val = $str_empty;
- }
-
- $schema_vals[$i] = $str_quote . $str_val . $str_quote;
- $schema_fields[$i] = '"' . $ary_name[$i] . '"';
- }
-
- // Take the ordered fields and their associated data and build it
- // into a valid sql statement to recreate that field in the data.
- $sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\n";
-
- $this->flush($sql_data);
- }
- $db->sql_freeresult($result);
- }
-
- function write_table($table_name)
- {
- global $db;
-
- $sql_data = '-- Table: ' . $table_name . "\n";
- $sql_data .= "DROP TABLE $table_name;\n";
-
- $data_types = array(7 => 'SMALLINT', 8 => 'INTEGER', 10 => 'FLOAT', 12 => 'DATE', 13 => 'TIME', 14 => 'CHARACTER', 27 => 'DOUBLE PRECISION', 35 => 'TIMESTAMP', 37 => 'VARCHAR', 40 => 'CSTRING', 261 => 'BLOB', 701 => 'DECIMAL', 702 => 'NUMERIC');
-
- $sql_data .= "\nCREATE TABLE $table_name (\n";
-
- $sql = 'SELECT DISTINCT R.RDB$FIELD_NAME as FNAME, R.RDB$NULL_FLAG as NFLAG, R.RDB$DEFAULT_SOURCE as DSOURCE, F.RDB$FIELD_TYPE as FTYPE, F.RDB$FIELD_SUB_TYPE as STYPE, F.RDB$FIELD_LENGTH as FLEN
- FROM RDB$RELATION_FIELDS R
- JOIN RDB$FIELDS F ON R.RDB$FIELD_SOURCE=F.RDB$FIELD_NAME
- LEFT JOIN RDB$FIELD_DIMENSIONS D ON R.RDB$FIELD_SOURCE = D.RDB$FIELD_NAME
- WHERE F.RDB$SYSTEM_FLAG = 0
- AND R.RDB$RELATION_NAME = \''. $table_name . '\'
- ORDER BY R.RDB$FIELD_POSITION';
- $result = $db->sql_query($sql);
-
- $rows = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $line = "\t" . '"' . $row['fname'] . '" ' . $data_types[$row['ftype']];
-
- if ($row['ftype'] == 261 && $row['stype'] == 1)
- {
- $line .= ' SUB_TYPE TEXT';
- }
-
- if ($row['ftype'] == 37 || $row['ftype'] == 14)
- {
- $line .= ' (' . $row['flen'] . ')';
- }
-
- if (!empty($row['dsource']))
- {
- $line .= ' ' . $row['dsource'];
- }
-
- if (!empty($row['nflag']))
- {
- $line .= ' NOT NULL';
- }
- $rows[] = $line;
- }
- $db->sql_freeresult($result);
-
- $sql_data .= implode(",\n", $rows);
- $sql_data .= "\n);\n";
- $keys = array();
-
- $sql = 'SELECT I.RDB$FIELD_NAME as NAME
- FROM RDB$RELATION_CONSTRAINTS RC, RDB$INDEX_SEGMENTS I, RDB$INDICES IDX
- WHERE (I.RDB$INDEX_NAME = RC.RDB$INDEX_NAME)
- AND (IDX.RDB$INDEX_NAME = RC.RDB$INDEX_NAME)
- AND (RC.RDB$RELATION_NAME = \''. $table_name . '\')
- ORDER BY I.RDB$FIELD_POSITION';
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $keys[] = $row['name'];
- }
-
- if (sizeof($keys))
- {
- $sql_data .= "\nALTER TABLE $table_name ADD PRIMARY KEY (" . implode(', ', $keys) . ');';
- }
-
- $db->sql_freeresult($result);
-
- $sql = 'SELECT I.RDB$INDEX_NAME as INAME, I.RDB$UNIQUE_FLAG as UFLAG, S.RDB$FIELD_NAME as FNAME
- FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME=I.RDB$INDEX_NAME
- WHERE (I.RDB$SYSTEM_FLAG IS NULL OR I.RDB$SYSTEM_FLAG=0)
- AND I.RDB$FOREIGN_KEY IS NULL
- AND I.RDB$RELATION_NAME = \''. $table_name . '\'
- AND I.RDB$INDEX_NAME NOT STARTING WITH \'RDB$\'
- ORDER BY S.RDB$FIELD_POSITION';
- $result = $db->sql_query($sql);
-
- $index = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $index[$row['iname']]['unique'] = !empty($row['uflag']);
- $index[$row['iname']]['values'][] = $row['fname'];
- }
-
- foreach ($index as $index_name => $data)
- {
- $sql_data .= "\nCREATE ";
- if ($data['unique'])
- {
- $sql_data .= 'UNIQUE ';
- }
- $sql_data .= "INDEX $index_name ON $table_name(" . implode(', ', $data['values']) . ");";
- }
- $sql_data .= "\n";
-
- $db->sql_freeresult($result);
-
- $sql = 'SELECT D1.RDB$DEPENDENT_NAME as DNAME, D1.RDB$FIELD_NAME as FNAME, D1.RDB$DEPENDENT_TYPE, R1.RDB$RELATION_NAME
- FROM RDB$DEPENDENCIES D1
- LEFT JOIN RDB$RELATIONS R1 ON ((D1.RDB$DEPENDENT_NAME = R1.RDB$RELATION_NAME) AND (NOT (R1.RDB$VIEW_BLR IS NULL)))
- WHERE (D1.RDB$DEPENDED_ON_TYPE = 0)
- AND (D1.RDB$DEPENDENT_TYPE <> 3)
- AND (D1.RDB$DEPENDED_ON_NAME = \'' . $table_name . '\')
- UNION SELECT DISTINCT F2.RDB$RELATION_NAME, D2.RDB$FIELD_NAME, D2.RDB$DEPENDENT_TYPE, R2.RDB$RELATION_NAME FROM RDB$DEPENDENCIES D2, RDB$RELATION_FIELDS F2
- LEFT JOIN RDB$RELATIONS R2 ON ((F2.RDB$RELATION_NAME = R2.RDB$RELATION_NAME) AND (NOT (R2.RDB$VIEW_BLR IS NULL)))
- WHERE (D2.RDB$DEPENDENT_TYPE = 3)
- AND (D2.RDB$DEPENDENT_NAME = F2.RDB$FIELD_SOURCE)
- AND (D2.RDB$DEPENDED_ON_NAME = \'' . $table_name . '\')
- ORDER BY 1, 2';
- $result = $db->sql_query($sql);
- while ($row = $db->sql_fetchrow($result))
- {
- $sql = 'SELECT T1.RDB$DEPENDED_ON_NAME as GEN, T1.RDB$FIELD_NAME, T1.RDB$DEPENDED_ON_TYPE
- FROM RDB$DEPENDENCIES T1
- WHERE (T1.RDB$DEPENDENT_NAME = \'' . $row['dname'] . '\')
- AND (T1.RDB$DEPENDENT_TYPE = 2 AND T1.RDB$DEPENDED_ON_TYPE = 14)
- UNION ALL SELECT DISTINCT D.RDB$DEPENDED_ON_NAME, D.RDB$FIELD_NAME, D.RDB$DEPENDED_ON_TYPE
- FROM RDB$DEPENDENCIES D, RDB$RELATION_FIELDS F
- WHERE (D.RDB$DEPENDENT_TYPE = 3)
- AND (D.RDB$DEPENDENT_NAME = F.RDB$FIELD_SOURCE)
- AND (F.RDB$RELATION_NAME = \'' . $row['dname'] . '\')
- ORDER BY 1,2';
- $result2 = $db->sql_query($sql);
- $row2 = $db->sql_fetchrow($result2);
- $db->sql_freeresult($result2);
- $gen_name = $row2['gen'];
-
- $sql_data .= "\nDROP GENERATOR " . $gen_name . ";";
- $sql_data .= "\nSET TERM ^ ;";
- $sql_data .= "\nCREATE GENERATOR " . $gen_name . "^";
- $sql_data .= "\nSET GENERATOR " . $gen_name . " TO 0^\n";
- $sql_data .= "\nCREATE TRIGGER {$row['dname']} FOR $table_name";
- $sql_data .= "\nBEFORE INSERT\nAS\nBEGIN";
- $sql_data .= "\n NEW.{$row['fname']} = GEN_ID(" . $gen_name . ", 1);";
- $sql_data .= "\nEND^\n";
- $sql_data .= "\nSET TERM ; ^\n";
- }
-
- $this->flush($sql_data);
-
- $db->sql_freeresult($result);
- }
-}
-
// get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P)
function get_usable_memory()
{
diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php
index 3d3cfb7f16..aba9caaece 100644
--- a/phpBB/includes/acp/acp_extensions.php
+++ b/phpBB/includes/acp/acp_extensions.php
@@ -137,7 +137,7 @@ class acp_extensions
trigger_error($user->lang['EXTENSION_NOT_AVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
- if ($phpbb_extension_manager->enabled($ext_name))
+ if ($phpbb_extension_manager->is_enabled($ext_name))
{
redirect($this->u_action);
}
@@ -162,7 +162,7 @@ class acp_extensions
trigger_error($user->lang['EXTENSION_NOT_AVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
- if ($phpbb_extension_manager->enabled($ext_name))
+ if ($phpbb_extension_manager->is_enabled($ext_name))
{
redirect($this->u_action);
}
@@ -194,7 +194,7 @@ class acp_extensions
break;
case 'disable_pre':
- if (!$phpbb_extension_manager->enabled($ext_name))
+ if (!$phpbb_extension_manager->is_enabled($ext_name))
{
redirect($this->u_action);
}
@@ -209,7 +209,7 @@ class acp_extensions
break;
case 'disable':
- if (!$phpbb_extension_manager->enabled($ext_name))
+ if (!$phpbb_extension_manager->is_enabled($ext_name))
{
redirect($this->u_action);
}
@@ -234,7 +234,7 @@ class acp_extensions
break;
case 'delete_data_pre':
- if ($phpbb_extension_manager->enabled($ext_name))
+ if ($phpbb_extension_manager->is_enabled($ext_name))
{
redirect($this->u_action);
}
@@ -248,7 +248,7 @@ class acp_extensions
break;
case 'delete_data':
- if ($phpbb_extension_manager->enabled($ext_name))
+ if ($phpbb_extension_manager->is_enabled($ext_name))
{
redirect($this->u_action);
}
@@ -527,7 +527,7 @@ class acp_extensions
$version_helper = new \phpbb\version_helper($this->cache, $this->config, $this->user);
$version_helper->set_current_version($meta['version']);
- $version_helper->set_file_location($version_check ['host'], $version_check ['directory'], $version_check ['filename']);
+ $version_helper->set_file_location($version_check['host'], $version_check['directory'], $version_check['filename']);
$version_helper->force_stability($this->config['extension_force_unstable'] ? 'unstable' : null);
return $updates = $version_helper->get_suggested_updates($force_update, $force_cache);
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index f8c463e158..adf5de44f5 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -1827,7 +1827,7 @@ class acp_forums
}
$db->sql_freeresult($result);
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql4':
case 'mysqli':
diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php
index 259b9845a3..028025b547 100644
--- a/phpBB/includes/acp/acp_icons.php
+++ b/phpBB/includes/acp/acp_icons.php
@@ -538,11 +538,10 @@ class acp_icons
// The user has already selected a smilies_pak file
if ($current == 'delete')
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$db->sql_query('DELETE FROM ' . $table);
break;
diff --git a/phpBB/includes/acp/acp_jabber.php b/phpBB/includes/acp/acp_jabber.php
index 5b88035fa4..8d2e9d41a3 100644
--- a/phpBB/includes/acp/acp_jabber.php
+++ b/phpBB/includes/acp/acp_jabber.php
@@ -47,13 +47,13 @@ class acp_jabber
$this->tpl_name = 'acp_jabber';
$this->page_title = 'ACP_JABBER_SETTINGS';
- $jab_enable = request_var('jab_enable', (bool) $config['jab_enable']);
- $jab_host = request_var('jab_host', (string) $config['jab_host']);
- $jab_port = request_var('jab_port', (int) $config['jab_port']);
- $jab_username = request_var('jab_username', (string) $config['jab_username']);
- $jab_password = request_var('jab_password', (string) $config['jab_password']);
- $jab_package_size = request_var('jab_package_size', (int) $config['jab_package_size']);
- $jab_use_ssl = request_var('jab_use_ssl', (bool) $config['jab_use_ssl']);
+ $jab_enable = request_var('jab_enable', (bool) $config['jab_enable']);
+ $jab_host = request_var('jab_host', (string) $config['jab_host']);
+ $jab_port = request_var('jab_port', (int) $config['jab_port']);
+ $jab_username = request_var('jab_username', (string) $config['jab_username']);
+ $jab_password = request_var('jab_password', (string) $config['jab_password']);
+ $jab_package_size = request_var('jab_package_size', (int) $config['jab_package_size']);
+ $jab_use_ssl = request_var('jab_use_ssl', (bool) $config['jab_use_ssl']);
$form_name = 'acp_jabber';
add_form_key($form_name);
diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php
index 3acefebedc..0d0d49774c 100644
--- a/phpBB/includes/acp/acp_main.php
+++ b/phpBB/includes/acp/acp_main.php
@@ -269,11 +269,10 @@ class acp_main
break;
case 'db_track':
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
break;
@@ -375,11 +374,10 @@ class acp_main
foreach ($tables as $table)
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$db->sql_query("DELETE FROM $table");
break;
diff --git a/phpBB/includes/acp/acp_permission_roles.php b/phpBB/includes/acp/acp_permission_roles.php
index 9715b9bce8..cd3616208d 100644
--- a/phpBB/includes/acp/acp_permission_roles.php
+++ b/phpBB/includes/acp/acp_permission_roles.php
@@ -253,7 +253,7 @@ class acp_permission_roles
{
$sql = 'SELECT auth_option_id, auth_option
FROM ' . ACL_OPTIONS_TABLE . "
- WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char) . "
+ WHERE auth_option " . $db->sql_like_expression($permission_type . $db->get_any_char()) . "
AND auth_option <> '{$permission_type}'
ORDER BY auth_option_id";
$result = $db->sql_query($sql);
@@ -315,7 +315,7 @@ class acp_permission_roles
// We need to fill the auth options array with ACL_NO options ;)
$sql = 'SELECT auth_option_id, auth_option
FROM ' . ACL_OPTIONS_TABLE . "
- WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char) . "
+ WHERE auth_option " . $db->sql_like_expression($permission_type . $db->get_any_char()) . "
AND auth_option <> '{$permission_type}'
ORDER BY auth_option_id";
$result = $db->sql_query($sql);
@@ -519,7 +519,7 @@ class acp_permission_roles
// Get complete auth array
$sql = 'SELECT auth_option, auth_option_id
FROM ' . ACL_OPTIONS_TABLE . "
- WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char);
+ WHERE auth_option " . $db->sql_like_expression($permission_type . $db->get_any_char());
$result = $db->sql_query($sql);
$auth_settings = array();
diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php
index 6540173433..cb408e304f 100644
--- a/phpBB/includes/acp/acp_permissions.php
+++ b/phpBB/includes/acp/acp_permissions.php
@@ -1238,7 +1238,7 @@ class acp_permissions
$sql = 'SELECT auth_option_id
FROM ' . ACL_OPTIONS_TABLE . '
- WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
+ WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->get_any_char());
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php
index b7f0df4614..fda6ef25ec 100644
--- a/phpBB/includes/acp/acp_profile.php
+++ b/phpBB/includes/acp/acp_profile.php
@@ -112,7 +112,7 @@ class acp_profile
$db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");
$db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id");
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
@@ -1196,7 +1196,7 @@ class acp_profile
{
global $db;
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
@@ -1267,11 +1267,6 @@ class acp_profile
break;
- case 'firebird':
- $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' ADD "' . strtoupper($field_ident) . '" ' . $sql_type;
-
- break;
-
case 'oracle':
$sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident " . $sql_type;
diff --git a/phpBB/includes/acp/acp_prune.php b/phpBB/includes/acp/acp_prune.php
index 2ddda28afc..a10b248324 100644
--- a/phpBB/includes/acp/acp_prune.php
+++ b/phpBB/includes/acp/acp_prune.php
@@ -436,8 +436,8 @@ class acp_prune
$sort_by_types = array('username', 'user_email', 'user_posts', 'user_regdate', 'user_lastvisit');
$where_sql = '';
- $where_sql .= ($username) ? ' AND username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($username))) : '';
- $where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', $db->any_char, $email)) . ' ' : '';
+ $where_sql .= ($username) ? ' AND username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($username))) : '';
+ $where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), $email)) . ' ' : '';
$where_sql .= $joined_sql;
$where_sql .= ($count) ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
diff --git a/phpBB/includes/acp/acp_reasons.php b/phpBB/includes/acp/acp_reasons.php
index c5e8f1e2d0..3d7ccf422c 100644
--- a/phpBB/includes/acp/acp_reasons.php
+++ b/phpBB/includes/acp/acp_reasons.php
@@ -219,7 +219,7 @@ class acp_reasons
$other_reason_id = (int) $db->sql_fetchfield('reason_id');
$db->sql_freeresult($result);
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
// The ugly one!
case 'mysqli':
@@ -252,7 +252,6 @@ class acp_reasons
// Teh standard
case 'postgres':
case 'oracle':
- case 'firebird':
case 'sqlite':
case 'sqlite3':
// Change the reports using this reason to 'other'
diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php
index 3d0d27e8c9..4cc93e5670 100644
--- a/phpBB/includes/acp/acp_styles.php
+++ b/phpBB/includes/acp/acp_styles.php
@@ -209,8 +209,8 @@ class acp_styles
trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
}
$message = implode('<br />', $messages);
- $message .= '<br /><br />' . sprintf($this->user->lang['STYLE_INSTALLED_RETURN_STYLES'], $this->u_base_action . '&amp;mode=style');
- $message .= '<br /><br />' . sprintf($this->user->lang['STYLE_INSTALLED_RETURN_UNINSTALLED'], $this->u_base_action . '&amp;mode=install');
+ $message .= '<br /><br /><a href="' . $this->u_base_action . '&amp;mode=style' . '">&laquo; ' . $this->user->lang('STYLE_INSTALLED_RETURN_INSTALLED_STYLES') . '</a>';
+ $message .= '<br /><br /><a href="' . $this->u_base_action . '&amp;mode=install' . '">&raquo; ' . $this->user->lang('STYLE_INSTALLED_RETURN_UNINSTALLED_STYLES') . '</a>';
trigger_error($message, E_USER_NOTICE);
}
diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php
index d07120a65f..71880c2267 100644
--- a/phpBB/includes/acp/acp_users.php
+++ b/phpBB/includes/acp/acp_users.php
@@ -2384,7 +2384,7 @@ class acp_users
// Select auth options
$sql = 'SELECT auth_option, is_local, is_global
FROM ' . ACL_OPTIONS_TABLE . '
- WHERE auth_option ' . $db->sql_like_expression($db->any_char . '_') . '
+ WHERE auth_option ' . $db->sql_like_expression($db->get_any_char() . '_') . '
AND is_global = 1
ORDER BY auth_option';
$result = $db->sql_query($sql);
@@ -2404,7 +2404,7 @@ class acp_users
{
$sql = 'SELECT auth_option, is_local, is_global
FROM ' . ACL_OPTIONS_TABLE . "
- WHERE auth_option " . $db->sql_like_expression($db->any_char . '_') . "
+ WHERE auth_option " . $db->sql_like_expression($db->get_any_char() . '_') . "
AND is_local = 1
ORDER BY is_global DESC, auth_option";
$result = $db->sql_query($sql);
diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php
index 8fa9dba57b..7ff3212b72 100644
--- a/phpBB/includes/acp/auth.php
+++ b/phpBB/includes/acp/auth.php
@@ -835,7 +835,7 @@ class auth_admin extends \phpbb\auth\auth
}
// Remove current auth options...
- $auth_option_ids = array((int)$any_option_id);
+ $auth_option_ids = array((int) $any_option_id);
foreach ($auth as $auth_option => $auth_setting)
{
$auth_option_ids[] = (int) $this->acl_options['id'][$auth_option];
@@ -1024,7 +1024,7 @@ class auth_admin extends \phpbb\auth\auth
// Get permission type
$sql = 'SELECT auth_option, auth_option_id
FROM ' . ACL_OPTIONS_TABLE . "
- WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char);
+ WHERE auth_option " . $db->sql_like_expression($permission_type . $db->get_any_char());
$result = $db->sql_query($sql);
$auth_id_ary = array();
diff --git a/phpBB/includes/acp/info/acp_contact.php b/phpBB/includes/acp/info/acp_contact.php
index b8326f34ea..548eb52816 100644
--- a/phpBB/includes/acp/info/acp_contact.php
+++ b/phpBB/includes/acp/info/acp_contact.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package acp
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php
index 723956de0c..2287639aee 100644
--- a/phpBB/includes/constants.php
+++ b/phpBB/includes/constants.php
@@ -28,7 +28,7 @@ if (!defined('IN_PHPBB'))
*/
// phpBB Version
-define('PHPBB_VERSION', '3.1.0-b5-dev');
+define('PHPBB_VERSION', '3.1.0-RC2-dev');
// QA-related
// define('PHPBB_QA', 1);
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index 3d0a4761f3..9d5770069d 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -21,6 +21,37 @@ if (!defined('IN_PHPBB'))
// Common global functions
/**
+* Load the autoloaders added by the extensions.
+*
+* @param string $phpbb_root_path Path to the phpbb root directory.
+*/
+function phpbb_load_extensions_autoloaders($phpbb_root_path)
+{
+ $iterator = new \RecursiveIteratorIterator(
+ new \phpbb\recursive_dot_prefix_filter_iterator(
+ new \RecursiveDirectoryIterator(
+ $phpbb_root_path . 'ext/',
+ \FilesystemIterator::SKIP_DOTS
+ )
+ ),
+ \RecursiveIteratorIterator::SELF_FIRST
+ );
+ $iterator->setMaxDepth(2);
+
+ foreach ($iterator as $file_info)
+ {
+ if ($file_info->getFilename() === 'vendor' && $iterator->getDepth() === 2)
+ {
+ $filename = $file_info->getRealPath() . '/autoload.php';
+ if (file_exists($filename))
+ {
+ require $filename;
+ }
+ }
+ }
+}
+
+/**
* Casts a variable to the given type.
*
* @deprecated
@@ -3998,7 +4029,7 @@ function obtain_guest_count($item_id = 0, $item = 'forum')
// Get number of online guests
- if ($db->sql_layer === 'sqlite' || $db->sql_layer === 'sqlite3')
+ if ($db->get_sql_layer() === 'sqlite' || $db->get_sql_layer() === 'sqlite3')
{
$sql = 'SELECT COUNT(session_ip) as num_guests
FROM (
@@ -4881,6 +4912,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'PRIVATE_MESSAGE_COUNT' => (!empty($user->data['user_unread_privmsg'])) ? $user->data['user_unread_privmsg'] : 0,
'CURRENT_USER_AVATAR' => phpbb_get_user_avatar($user->data),
+ 'CURRENT_USERNAME_SIMPLE' => get_username_string('no_profile', $user->data['user_id'], $user->data['username'], $user->data['user_colour']),
'CURRENT_USERNAME_FULL' => get_username_string('full', $user->data['user_id'], $user->data['username'], $user->data['user_colour']),
'UNREAD_NOTIFICATIONS_COUNT' => ($notifications !== false) ? $notifications['unread_count'] : '',
'NOTIFICATIONS_COUNT' => ($notifications !== false) ? $notifications['unread_count'] : '',
@@ -5064,10 +5096,10 @@ function phpbb_generate_debug_output(phpbb\db\driver\driver_interface $db, \phpb
if (isset($GLOBALS['starttime']))
{
$totaltime = microtime(true) - $GLOBALS['starttime'];
- $debug_info[] = sprintf('Time: %.3fs', $totaltime);
+ $debug_info[] = sprintf('<abbr title="SQL time: %.3fs / PHP time: %.3fs">Time: %.3fs</abbr>', $db->get_sql_time(), ($totaltime - $db->get_sql_time()), $totaltime);
}
- $debug_info[] = $db->sql_num_queries() . ' Queries (' . $db->sql_num_queries(true) . ' cached)';
+ $debug_info[] = sprintf('<abbr title="Cached: %d">Queries: %d</abbr>', $db->sql_num_queries(true), $db->sql_num_queries());
$memory_usage = memory_get_peak_usage();
if ($memory_usage)
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
index 2d3ac62f86..accc8a6a83 100644
--- a/phpBB/includes/functions_admin.php
+++ b/phpBB/includes/functions_admin.php
@@ -1435,7 +1435,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
{
case 'topic_moved':
$db->sql_transaction('begin');
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql4':
case 'mysqli':
@@ -2441,11 +2441,10 @@ function phpbb_cache_moderators($db, $cache, $auth)
$cache->destroy('sql', MODERATOR_CACHE_TABLE);
// Clear table
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$db->sql_query('DELETE FROM ' . MODERATOR_CACHE_TABLE);
break;
@@ -2492,7 +2491,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
AND ' . $db->sql_in_set('ug.user_id', $ug_id_ary) . "
AND ug.user_pending = 0
- AND o.auth_option " . $db->sql_like_expression('m_' . $db->any_char),
+ AND o.auth_option " . $db->sql_like_expression('m_' . $db->get_any_char()),
);
$sql = $db->sql_build_query('SELECT', $sql_ary_deny);
$result = $db->sql_query($sql);
@@ -2698,11 +2697,11 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
return;
}
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysqli':
case 'mysql4':
- $sql = 'DELETE ' . (($db->sql_layer === 'mysqli' || version_compare($db->sql_server_info(true), '4.1', '>=')) ? 'z.*' : ZEBRA_TABLE) . '
+ $sql = 'DELETE ' . (($db->get_sql_layer() === 'mysqli' || version_compare($db->sql_server_info(true), '4.1', '>=')) ? 'z.*' : ZEBRA_TABLE) . '
FROM ' . ZEBRA_TABLE . ' z, ' . USER_GROUP_TABLE . ' ug
WHERE z.zebra_id = ug.user_id
AND z.foe = 1
@@ -2855,7 +2854,7 @@ function get_database_size()
$database_size = false;
// This code is heavily influenced by a similar routine in phpMyAdmin 2.2.0
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
@@ -2871,7 +2870,7 @@ function get_database_size()
if (preg_match('#(3\.23|[45]\.)#', $version))
{
- $db_name = (preg_match('#^(?:3\.23\.(?:[6-9]|[1-9]{2}))|[45]\.#', $version)) ? "`{$db->dbname}`" : $db->dbname;
+ $db_name = (preg_match('#^(?:3\.23\.(?:[6-9]|[1-9]{2}))|[45]\.#', $version)) ? "`{$db->get_db_name()}`" : $db->get_db_name();
$sql = 'SHOW TABLE STATUS
FROM ' . $db_name;
@@ -2900,17 +2899,6 @@ function get_database_size()
}
break;
- case 'firebird':
- global $dbname;
-
- // if it on the local machine, we can get lucky
- if (file_exists($dbname))
- {
- $database_size = filesize($dbname);
- }
-
- break;
-
case 'sqlite':
case 'sqlite3':
global $dbhost;
@@ -2958,7 +2946,7 @@ function get_database_size()
if ($row['proname'] == 'pg_database_size')
{
- $database = $db->dbname;
+ $database = $db->get_db_name();
if (strpos($database, '.') !== false)
{
list($database, ) = explode('.', $database);
diff --git a/phpBB/includes/functions_container.php b/phpBB/includes/functions_container.php
index 5794d2f403..a00613c26b 100644
--- a/phpBB/includes/functions_container.php
+++ b/phpBB/includes/functions_container.php
@@ -64,9 +64,10 @@ function phpbb_bootstrap_table_prefix($config_file)
*
* @param string $config_file
* @param string $phpbb_root_path
+* @param \phpbb\db\driver\driver_interface $db The generated connection
* @return array enabled extensions
*/
-function phpbb_bootstrap_enabled_exts($config_file, $phpbb_root_path)
+function phpbb_bootstrap_enabled_exts($config_file, $phpbb_root_path, &$db)
{
$db = phpbb_bootstrap_db_connection($config_file);
$table_prefix = phpbb_bootstrap_table_prefix($config_file);
@@ -133,7 +134,7 @@ function phpbb_create_install_container($phpbb_root_path, $php_ext)
$container->setParameter('core.php_ext', $php_ext);
$container->setParameter('core.table_prefix', '');
- $container->register('dbal.conn')->setSynthetic(true);
+ $container->register('dbal.conn.driver')->setSynthetic(true);
$container->setAlias('cache.driver', 'cache.driver.install');
@@ -259,9 +260,10 @@ function phpbb_create_dumped_container_unless_debug($config_file, array $extensi
function phpbb_create_default_container($phpbb_root_path, $php_ext)
{
$config_file = $phpbb_root_path . 'config.' . $php_ext;
- $installed_exts = phpbb_bootstrap_enabled_exts($config_file, $phpbb_root_path);
+ $db = null;
+ $installed_exts = phpbb_bootstrap_enabled_exts($config_file, $phpbb_root_path, $db);
- return phpbb_create_dumped_container_unless_debug(
+ $container = phpbb_create_dumped_container_unless_debug(
$config_file,
array(
new \phpbb\di\extension\config($config_file),
@@ -275,6 +277,10 @@ function phpbb_create_default_container($phpbb_root_path, $php_ext)
$phpbb_root_path,
$php_ext
);
+
+ $container->get('dbal.conn')->set_driver($db);
+
+ return $container;
}
/**
diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php
index 72fca905e0..ee78364083 100644
--- a/phpBB/includes/functions_content.php
+++ b/phpBB/includes/functions_content.php
@@ -174,8 +174,9 @@ function make_jumpbox($action, $forum_id = false, $select_all = false, $acl_list
$template->assign_block_vars('jumpbox_forums', array(
'FORUM_ID' => ($select_all) ? 0 : -1,
'FORUM_NAME' => ($select_all) ? $user->lang['ALL_FORUMS'] : $user->lang['SELECT_FORUM'],
- 'S_FORUM_COUNT' => $iteration)
- );
+ 'S_FORUM_COUNT' => $iteration,
+ 'LINK' => $phpbb_path_helper->append_url_params($action, array('f' => $forum_id)),
+ ));
$iteration++;
$display_jumpbox = true;
@@ -188,8 +189,9 @@ function make_jumpbox($action, $forum_id = false, $select_all = false, $acl_list
'S_FORUM_COUNT' => $iteration,
'S_IS_CAT' => ($row['forum_type'] == FORUM_CAT) ? true : false,
'S_IS_LINK' => ($row['forum_type'] == FORUM_LINK) ? true : false,
- 'S_IS_POST' => ($row['forum_type'] == FORUM_POST) ? true : false)
- );
+ 'S_IS_POST' => ($row['forum_type'] == FORUM_POST) ? true : false,
+ 'LINK' => $phpbb_path_helper->append_url_params($action, array('f' => $row['forum_id'])),
+ ));
for ($i = 0; $i < $padding; $i++)
{
@@ -773,44 +775,47 @@ function make_clickable($text, $server_url = false, $class = 'postlink')
static $static_class;
static $magic_url_match_args;
- if (!is_array($magic_url_match_args) || $static_class != $class)
+ if (!isset($magic_url_match_args[$server_url]) || $static_class != $class)
{
$static_class = $class;
$class = ($static_class) ? ' class="' . $static_class . '"' : '';
$local_class = ($static_class) ? ' class="' . $static_class . '-local"' : '';
- $magic_url_match_args = array();
+ if (!is_array($magic_url_match_args))
+ {
+ $magic_url_match_args = array();
+ }
// relative urls for this board
- $magic_url_match_args[] = array(
+ $magic_url_match_args[$server_url][] = array(
'#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#i',
MAGIC_URL_LOCAL,
$local_class,
);
// matches a xxxx://aaaaa.bbb.cccc. ...
- $magic_url_match_args[] = array(
+ $magic_url_match_args[$server_url][] = array(
'#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#i',
MAGIC_URL_FULL,
$class,
);
// matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing
- $magic_url_match_args[] = array(
+ $magic_url_match_args[$server_url][] = array(
'#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#i',
MAGIC_URL_WWW,
$class,
);
// matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode.
- $magic_url_match_args[] = array(
+ $magic_url_match_args[$server_url][] = array(
'/(^|[\n\t (>])(' . get_preg_expression('email') . ')/i',
MAGIC_URL_EMAIL,
'',
);
}
- foreach ($magic_url_match_args as $magic_args)
+ foreach ($magic_url_match_args[$server_url] as $magic_args)
{
if (preg_match($magic_args[0], $text, $matches))
{
@@ -1331,9 +1336,9 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
global $phpbb_root_path, $phpEx;
$_profile_cache['base_url'] = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u={USER_ID}');
- $_profile_cache['tpl_noprofile'] = '{USERNAME}';
+ $_profile_cache['tpl_noprofile'] = '<span class="username">{USERNAME}</span>';
$_profile_cache['tpl_noprofile_colour'] = '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
- $_profile_cache['tpl_profile'] = '<a href="{PROFILE_URL}">{USERNAME}</a>';
+ $_profile_cache['tpl_profile'] = '<a href="{PROFILE_URL}" class="username">{USERNAME}</a>';
$_profile_cache['tpl_profile_colour'] = '<a href="{PROFILE_URL}" style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</a>';
}
@@ -1449,16 +1454,19 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
/**
* Add an option to the quick-mod tools.
*
+ * @param string $url The recepting URL for the quickmod actions.
* @param string $option The language key for the value of the option.
* @param string $lang_string The language string to use.
*/
-function phpbb_add_quickmod_option($option, $lang_string)
+function phpbb_add_quickmod_option($url, $option, $lang_string)
{
- global $template, $user;
+ global $template, $user, $phpbb_path_helper;
+
$lang_string = $user->lang($lang_string);
$template->assign_block_vars('quickmod', array(
- 'VALUE' => $option,
- 'TITLE' => $lang_string,
+ 'VALUE' => $option,
+ 'TITLE' => $lang_string,
+ 'LINK' => $phpbb_path_helper->append_url_params($url, array('action' => $option)),
));
}
diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php
index e68e770b3a..9d480692e9 100644
--- a/phpBB/includes/functions_convert.php
+++ b/phpBB/includes/functions_convert.php
@@ -1007,8 +1007,8 @@ function get_remote_avatar_dim($src, $axis)
{
$bigger = ($remote_avatar_cache[$src][0] > $remote_avatar_cache[$src][1]) ? 0 : 1;
$ratio = $default[$bigger] / $remote_avatar_cache[$src][$bigger];
- $remote_avatar_cache[$src][0] = (int)($remote_avatar_cache[$src][0] * $ratio);
- $remote_avatar_cache[$src][1] = (int)($remote_avatar_cache[$src][1] * $ratio);
+ $remote_avatar_cache[$src][0] = (int) ($remote_avatar_cache[$src][0] * $ratio);
+ $remote_avatar_cache[$src][1] = (int) ($remote_avatar_cache[$src][1] * $ratio);
}
}
@@ -1287,7 +1287,9 @@ function restore_config($schema)
{
$var = (empty($m[2]) || empty($convert_config[$m[2]])) ? "''" : "'" . addslashes($convert_config[$m[2]]) . "'";
$exec = '$config_value = ' . $m[1] . '(' . $var . ');';
+ // @codingStandardsIgnoreStart
eval($exec);
+ // @codingStandardsIgnoreEnd
}
else
{
@@ -1645,7 +1647,7 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
switch ($sql_type)
{
case 'insert':
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
@@ -2039,11 +2041,10 @@ function update_topics_posted()
{
global $db, $config;
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
break;
@@ -2295,7 +2296,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
$message = preg_replace('#\[size=([0-9]+)\](.*?)\[/size\]#i', '[size=\1]\2[/size]', $message);
$message = preg_replace('#\[size=[0-9]{2,}\](.*?)\[/size\]#i', '[size=29]\1[/size]', $message);
- for ($i = sizeof($size); $i; )
+ for ($i = sizeof($size); $i;)
{
$i--;
$message = str_replace('[size=' . $i . ']', '[size=' . $size[$i] . ']', $message);
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index 4606a9f7ca..68b1356297 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -622,7 +622,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'L_SUBFORUM' => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'TOPICS_UNAPPROVED'),
- 'UNAPPROVED_POST_IMG' => $user->img('icon_topic_unapproved', 'POSTS_UNAPPROVED'),
+ 'UNAPPROVED_POST_IMG' => $user->img('icon_topic_unapproved', 'POSTS_UNAPPROVED_FORUM'),
));
if ($return_moderators)
@@ -674,6 +674,8 @@ function generate_forum_nav(&$forum_data)
// Get forum parents
$forum_parents = get_forum_parents($forum_data);
+ $microdata_attr = 'data-forum-id';
+
// Build navigation links
if (!empty($forum_parents))
{
@@ -693,6 +695,7 @@ function generate_forum_nav(&$forum_data)
'S_IS_POST' => ($parent_type == FORUM_POST) ? true : false,
'FORUM_NAME' => $parent_name,
'FORUM_ID' => $parent_forum_id,
+ 'MICRODATA' => $microdata_attr . '="' . $parent_forum_id . '"',
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $parent_forum_id))
);
}
@@ -704,6 +707,7 @@ function generate_forum_nav(&$forum_data)
'S_IS_POST' => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
'FORUM_NAME' => $forum_data['forum_name'],
'FORUM_ID' => $forum_data['forum_id'],
+ 'MICRODATA' => $microdata_attr . '="' . $forum_data['forum_id'] . '"',
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id']))
);
@@ -1440,3 +1444,166 @@ function phpbb_gen_download_links($param_key, $param_val, $phpbb_root_path, $php
return $links;
}
+
+/**
+* Prepare profile data
+*/
+function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabled = false)
+{
+ global $config, $auth, $user, $phpEx, $phpbb_root_path, $phpbb_dispatcher;
+
+ $username = $data['username'];
+ $user_id = $data['user_id'];
+
+ $rank_title = $rank_img = $rank_img_src = '';
+ get_user_rank($data['user_rank'], (($user_id == ANONYMOUS) ? false : $data['user_posts']), $rank_title, $rank_img, $rank_img_src);
+
+ if ((!empty($data['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_user'))
+ {
+ $email = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=email&amp;u=' . $user_id) : (($config['board_hide_emails'] && !$auth->acl_get('a_user')) ? '' : 'mailto:' . $data['user_email']);
+ }
+ else
+ {
+ $email = '';
+ }
+
+ if ($config['load_onlinetrack'])
+ {
+ $update_time = $config['load_online_time'] * 60;
+ $online = (time() - $update_time < $data['session_time'] && ((isset($data['session_viewonline']) && $data['session_viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
+ }
+ else
+ {
+ $online = false;
+ }
+
+ if ($data['user_allow_viewonline'] || $auth->acl_get('u_viewonline'))
+ {
+ $last_active = (!empty($data['session_time'])) ? $data['session_time'] : $data['user_lastvisit'];
+ }
+ else
+ {
+ $last_active = '';
+ }
+
+ $age = '';
+
+ if ($config['allow_birthdays'] && $data['user_birthday'])
+ {
+ list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $data['user_birthday']));
+
+ if ($bday_year)
+ {
+ $now = $user->create_datetime();
+ $now = phpbb_gmgetdate($now->getTimestamp() + $now->getOffset());
+
+ $diff = $now['mon'] - $bday_month;
+ if ($diff == 0)
+ {
+ $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
+ }
+ else
+ {
+ $diff = ($diff < 0) ? 1 : 0;
+ }
+
+ $age = max(0, (int) ($now['year'] - $bday_year - $diff));
+ }
+ }
+
+ if (!function_exists('phpbb_get_banned_user_ids'))
+ {
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+ }
+
+ // Can this user receive a Private Message?
+ $can_receive_pm = (
+ // They must be a "normal" user
+ $data['user_type'] != USER_IGNORE &&
+
+ // They must not be deactivated by the administrator
+ ($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) &&
+
+ // They must be able to read PMs
+ sizeof($auth->acl_get_list($user_id, 'u_readpm')) &&
+
+ // They must not be permanently banned
+ !sizeof(phpbb_get_banned_user_ids($user_id, false)) &&
+
+ // They must allow users to contact via PM
+ (($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $data['user_allow_pm'])
+ );
+
+ // Dump it out to the template
+ $template_data = array(
+ 'AGE' => $age,
+ 'RANK_TITLE' => $rank_title,
+ 'JOINED' => $user->format_date($data['user_regdate']),
+ 'LAST_ACTIVE' => (empty($last_active)) ? ' - ' : $user->format_date($last_active),
+ 'POSTS' => ($data['user_posts']) ? $data['user_posts'] : 0,
+ 'WARNINGS' => isset($data['user_warnings']) ? $data['user_warnings'] : 0,
+
+ 'USERNAME_FULL' => get_username_string('full', $user_id, $username, $data['user_colour']),
+ 'USERNAME' => get_username_string('username', $user_id, $username, $data['user_colour']),
+ 'USER_COLOR' => get_username_string('colour', $user_id, $username, $data['user_colour']),
+ 'U_VIEW_PROFILE' => get_username_string('profile', $user_id, $username, $data['user_colour']),
+
+ 'A_USERNAME' => addslashes(get_username_string('username', $user_id, $username, $data['user_colour'])),
+
+ 'AVATAR_IMG' => phpbb_get_user_avatar($data),
+ 'ONLINE_IMG' => (!$config['load_onlinetrack']) ? '' : (($online) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
+ 'S_ONLINE' => ($config['load_onlinetrack'] && $online) ? true : false,
+ 'RANK_IMG' => $rank_img,
+ 'RANK_IMG_SRC' => $rank_img_src,
+ 'S_JABBER_ENABLED' => ($config['jab_enable']) ? true : false,
+
+ 'S_WARNINGS' => ($auth->acl_getf_global('m_') || $auth->acl_get('m_warn')) ? true : false,
+
+ 'U_SEARCH_USER' => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$user_id&amp;sr=posts") : '',
+ 'U_NOTES' => ($user_notes_enabled && $auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $user_id, true, $user->session_id) : '',
+ 'U_WARN' => ($warn_user_enabled && $auth->acl_get('m_warn')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_user&amp;u=' . $user_id, true, $user->session_id) : '',
+ 'U_PM' => ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && $can_receive_pm) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $user_id) : '',
+ 'U_EMAIL' => $email,
+ 'U_JABBER' => ($data['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contact&amp;action=jabber&amp;u=' . $user_id) : '',
+
+ 'USER_JABBER' => $data['user_jabber'],
+ 'USER_JABBER_IMG' => ($data['user_jabber']) ? $user->img('icon_contact_jabber', $data['user_jabber']) : '',
+
+ 'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $username),
+ 'L_CONTACT_USER' => $user->lang('CONTACT_USER', $username),
+ 'L_VIEWING_PROFILE' => $user->lang('VIEWING_PROFILE', $username),
+ );
+
+ /**
+ * Preparing a user's data before displaying it in profile and memberlist
+ *
+ * @event core.memberlist_prepare_profile_data
+ * @var array data Array with user's data
+ * @var array template_data Template array with user's data
+ * @since 3.1.0-a1
+ */
+ $vars = array('data', 'template_data');
+ extract($phpbb_dispatcher->trigger_event('core.memberlist_prepare_profile_data', compact($vars)));
+
+ return $template_data;
+}
+
+function phpbb_sort_last_active($first, $second)
+{
+ global $id_cache, $sort_dir;
+
+ $lesser_than = ($sort_dir === 'd') ? -1 : 1;
+
+ if (isset($id_cache[$first]['group_leader']) && $id_cache[$first]['group_leader'] && (!isset($id_cache[$second]['group_leader']) || !$id_cache[$second]['group_leader']))
+ {
+ return -1;
+ }
+ else if (isset($id_cache[$second]['group_leader']) && (!isset($id_cache[$first]['group_leader']) || !$id_cache[$first]['group_leader']) && $id_cache[$second]['group_leader'])
+ {
+ return 1;
+ }
+ else
+ {
+ return $lesser_than * (int) ($id_cache[$first]['last_visit'] - $id_cache[$second]['last_visit']);
+ }
+}
diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php
index 1c66489c31..06f49e4b50 100644
--- a/phpBB/includes/functions_install.php
+++ b/phpBB/includes/functions_install.php
@@ -27,15 +27,6 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
{
global $lang;
$available_dbms = array(
- 'firebird' => array(
- 'LABEL' => 'FireBird',
- 'SCHEMA' => 'firebird',
- 'MODULE' => 'interbase',
- 'DELIM' => ';;',
- 'DRIVER' => 'phpbb\db\driver\firebird',
- 'AVAILABLE' => true,
- '2.0.x' => false,
- ),
// Note: php 5.5 alpha 2 deprecated mysql.
// Keep mysqli before mysql in this list.
'mysqli' => array(
@@ -260,7 +251,6 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
$prefix_length = 200;
break;
- case 'phpbb\db\driver\firebird':
case 'phpbb\db\driver\oracle':
$prefix_length = 6;
break;
@@ -300,7 +290,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
switch ($dbms_details['DRIVER'])
{
case 'phpbb\db\driver\mysqli':
- if (version_compare(mysqli_get_server_info($db->db_connect_id), '4.1.3', '<'))
+ if (version_compare(mysqli_get_server_info($db->get_db_connect_id()), '4.1.3', '<'))
{
$error[] = $lang['INST_ERR_DB_NO_MYSQLI'];
}
@@ -321,87 +311,6 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
}
break;
- case 'phpbb\db\driver\firebird':
- // check the version of FB, use some hackery if we can't get access to the server info
- if ($db->service_handle !== false && function_exists('ibase_server_info'))
- {
- $val = @ibase_server_info($db->service_handle, IBASE_SVC_SERVER_VERSION);
- preg_match('#V([\d.]+)#', $val, $match);
- if ($match[1] < 2)
- {
- $error[] = $lang['INST_ERR_DB_NO_FIREBIRD'];
- }
- $db_info = @ibase_db_info($db->service_handle, $dbname, IBASE_STS_HDR_PAGES);
-
- preg_match('/^\\s*Page size\\s*(\\d+)/m', $db_info, $regs);
- $page_size = intval($regs[1]);
- if ($page_size < 8192)
- {
- $error[] = $lang['INST_ERR_DB_NO_FIREBIRD_PS'];
- }
- }
- else
- {
- $sql = "SELECT *
- FROM RDB$FUNCTIONS
- WHERE RDB$SYSTEM_FLAG IS NULL
- AND RDB$FUNCTION_NAME = 'CHAR_LENGTH'";
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // if its a UDF, its too old
- if ($row)
- {
- $error[] = $lang['INST_ERR_DB_NO_FIREBIRD'];
- }
- else
- {
- $sql = 'SELECT 1 FROM RDB$DATABASE
- WHERE BIN_AND(10, 1) = 0';
- $result = $db->sql_query($sql);
- if (!$result) // This can only fail if BIN_AND is not defined
- {
- $error[] = $lang['INST_ERR_DB_NO_FIREBIRD'];
- }
- $db->sql_freeresult($result);
- }
-
- // Setup the stuff for our random table
- $char_array = array_merge(range('A', 'Z'), range('0', '9'));
- $char_len = mt_rand(7, 9);
- $char_array_len = sizeof($char_array) - 1;
-
- $final = '';
-
- for ($i = 0; $i < $char_len; $i++)
- {
- $final .= $char_array[mt_rand(0, $char_array_len)];
- }
-
- // Create some random table
- $sql = 'CREATE TABLE ' . $final . " (
- FIELD1 VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE,
- FIELD2 INTEGER DEFAULT 0 NOT NULL);";
- $db->sql_query($sql);
-
- // Create an index that should fail if the page size is less than 8192
- $sql = 'CREATE INDEX ' . $final . ' ON ' . $final . '(FIELD1, FIELD2);';
- $db->sql_query($sql);
-
- if (ibase_errmsg() !== false)
- {
- $error[] = $lang['INST_ERR_DB_NO_FIREBIRD_PS'];
- }
- else
- {
- // Kill the old table
- $db->sql_query('DROP TABLE ' . $final . ';');
- }
- unset($final);
- }
- break;
-
case 'phpbb\db\driver\oracle':
if ($unicode_check)
{
diff --git a/phpBB/includes/functions_mcp.php b/phpBB/includes/functions_mcp.php
new file mode 100644
index 0000000000..7593f08f4d
--- /dev/null
+++ b/phpBB/includes/functions_mcp.php
@@ -0,0 +1,666 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Functions used to generate additional URL paramters
+*/
+function phpbb_module__url($mode, &$module_row)
+{
+ return phpbb_extra_url();
+}
+
+function phpbb_module_notes_url($mode, &$module_row)
+{
+ if ($mode == 'front')
+ {
+ return '';
+ }
+
+ global $user_id;
+ return ($user_id) ? "&amp;u=$user_id" : '';
+}
+
+function phpbb_module_warn_url($mode, &$module_row)
+{
+ if ($mode == 'front' || $mode == 'list')
+ {
+ global $forum_id;
+
+ return ($forum_id) ? "&amp;f=$forum_id" : '';
+ }
+
+ if ($mode == 'warn_post')
+ {
+ global $forum_id, $post_id;
+
+ $url_extra = ($forum_id) ? "&amp;f=$forum_id" : '';
+ $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
+
+ return $url_extra;
+ }
+ else
+ {
+ global $user_id;
+
+ return ($user_id) ? "&amp;u=$user_id" : '';
+ }
+}
+
+function phpbb_module_main_url($mode, &$module_row)
+{
+ return phpbb_extra_url();
+}
+
+function phpbb_module_logs_url($mode, &$module_row)
+{
+ return phpbb_extra_url();
+}
+
+function phpbb_module_ban_url($mode, &$module_row)
+{
+ return phpbb_extra_url();
+}
+
+function phpbb_module_queue_url($mode, &$module_row)
+{
+ return phpbb_extra_url();
+}
+
+function phpbb_module_reports_url($mode, &$module_row)
+{
+ return phpbb_extra_url();
+}
+
+function phpbb_extra_url()
+{
+ global $forum_id, $topic_id, $post_id, $report_id, $user_id;
+
+ $url_extra = '';
+ $url_extra .= ($forum_id) ? "&amp;f=$forum_id" : '';
+ $url_extra .= ($topic_id) ? "&amp;t=$topic_id" : '';
+ $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
+ $url_extra .= ($user_id) ? "&amp;u=$user_id" : '';
+ $url_extra .= ($report_id) ? "&amp;r=$report_id" : '';
+
+ return $url_extra;
+}
+
+/**
+* Get simple topic data
+*/
+function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = false)
+{
+ global $auth, $db, $config, $user;
+ static $rowset = array();
+
+ $topics = array();
+
+ if (!sizeof($topic_ids))
+ {
+ return array();
+ }
+
+ // cache might not contain read tracking info, so we can't use it if read
+ // tracking information is requested
+ if (!$read_tracking)
+ {
+ $cache_topic_ids = array_intersect($topic_ids, array_keys($rowset));
+ $topic_ids = array_diff($topic_ids, array_keys($rowset));
+ }
+ else
+ {
+ $cache_topic_ids = array();
+ }
+
+ if (sizeof($topic_ids))
+ {
+ $sql_array = array(
+ 'SELECT' => 't.*, f.*',
+
+ 'FROM' => array(
+ TOPICS_TABLE => 't',
+ ),
+
+ 'LEFT_JOIN' => array(
+ array(
+ 'FROM' => array(FORUMS_TABLE => 'f'),
+ 'ON' => 'f.forum_id = t.forum_id'
+ )
+ ),
+
+ 'WHERE' => $db->sql_in_set('t.topic_id', $topic_ids)
+ );
+
+ if ($read_tracking && $config['load_db_lastread'])
+ {
+ $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
+
+ $sql_array['LEFT_JOIN'][] = array(
+ 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
+ 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
+ );
+
+ $sql_array['LEFT_JOIN'][] = array(
+ 'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
+ 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
+ );
+ }
+
+ $sql = $db->sql_build_query('SELECT', $sql_array);
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $rowset[$row['topic_id']] = $row;
+
+ if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
+ {
+ continue;
+ }
+
+ $topics[$row['topic_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+ }
+
+ foreach ($cache_topic_ids as $id)
+ {
+ if (!$acl_list || $auth->acl_gets($acl_list, $rowset[$id]['forum_id']))
+ {
+ $topics[$id] = $rowset[$id];
+ }
+ }
+
+ return $topics;
+}
+
+/**
+* Get simple post data
+*/
+function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = false)
+{
+ global $db, $auth, $config, $user;
+
+ $rowset = array();
+
+ if (!sizeof($post_ids))
+ {
+ return array();
+ }
+
+ $sql_array = array(
+ 'SELECT' => 'p.*, u.*, t.*, f.*',
+
+ 'FROM' => array(
+ USERS_TABLE => 'u',
+ POSTS_TABLE => 'p',
+ TOPICS_TABLE => 't',
+ ),
+
+ 'LEFT_JOIN' => array(
+ array(
+ 'FROM' => array(FORUMS_TABLE => 'f'),
+ 'ON' => 'f.forum_id = t.forum_id'
+ )
+ ),
+
+ 'WHERE' => $db->sql_in_set('p.post_id', $post_ids) . '
+ AND u.user_id = p.poster_id
+ AND t.topic_id = p.topic_id',
+ );
+
+ if ($read_tracking && $config['load_db_lastread'])
+ {
+ $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
+
+ $sql_array['LEFT_JOIN'][] = array(
+ 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
+ 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
+ );
+
+ $sql_array['LEFT_JOIN'][] = array(
+ 'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
+ 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
+ );
+ }
+
+ $sql = $db->sql_build_query('SELECT', $sql_array);
+ $result = $db->sql_query($sql);
+ unset($sql_array);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
+ {
+ continue;
+ }
+
+ if ($row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
+ {
+ // Moderators without the permission to approve post should at least not see them. ;)
+ continue;
+ }
+
+ $rowset[$row['post_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+
+ return $rowset;
+}
+
+/**
+* Get simple forum data
+*/
+function phpbb_get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking = false)
+{
+ global $auth, $db, $user, $config, $phpbb_container;
+
+ $rowset = array();
+
+ if (!is_array($forum_id))
+ {
+ $forum_id = array($forum_id);
+ }
+
+ if (!sizeof($forum_id))
+ {
+ return array();
+ }
+
+ if ($read_tracking && $config['load_db_lastread'])
+ {
+ $read_tracking_join = ' LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
+ AND ft.forum_id = f.forum_id)';
+ $read_tracking_select = ', ft.mark_time';
+ }
+ else
+ {
+ $read_tracking_join = $read_tracking_select = '';
+ }
+
+ $sql = "SELECT f.* $read_tracking_select
+ FROM " . FORUMS_TABLE . " f$read_tracking_join
+ WHERE " . $db->sql_in_set('f.forum_id', $forum_id);
+ $result = $db->sql_query($sql);
+
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
+ {
+ continue;
+ }
+
+ $row['forum_topics_approved'] = $phpbb_content_visibility->get_count('forum_topics', $row, $row['forum_id']);
+
+ $rowset[$row['forum_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+
+ return $rowset;
+}
+
+/**
+* Get simple pm data
+*/
+function phpbb_get_pm_data($pm_ids)
+{
+ global $db;
+
+ $rowset = array();
+
+ if (!sizeof($pm_ids))
+ {
+ return array();
+ }
+
+ $sql_array = array(
+ 'SELECT' => 'p.*, u.*',
+
+ 'FROM' => array(
+ USERS_TABLE => 'u',
+ PRIVMSGS_TABLE => 'p',
+ ),
+
+ 'WHERE' => $db->sql_in_set('p.msg_id', $pm_ids) . '
+ AND u.user_id = p.author_id',
+ );
+
+ $sql = $db->sql_build_query('SELECT', $sql_array);
+ $result = $db->sql_query($sql);
+ unset($sql_array);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $rowset[$row['msg_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+
+ return $rowset;
+}
+
+/**
+* sorting in mcp
+*
+* @param string $where_sql should either be WHERE (default if ommited) or end with AND or OR
+*
+* $mode reports and reports_closed: the $where parameters uses aliases p for posts table and r for report table
+* $mode unapproved_posts: the $where parameters uses aliases p for posts table and t for topic table
+*/
+function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by_sql, &$sort_order_sql, &$total, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')
+{
+ global $db, $user, $auth, $template;
+
+ $sort_days = request_var('st', 0);
+ $min_time = ($sort_days) ? time() - ($sort_days * 86400) : 0;
+
+ switch ($mode)
+ {
+ case 'viewforum':
+ $type = 'topics';
+ $default_key = 't';
+ $default_dir = 'd';
+
+ $sql = 'SELECT COUNT(topic_id) AS total
+ FROM ' . TOPICS_TABLE . "
+ $where_sql forum_id = $forum_id
+ AND topic_type NOT IN (" . POST_ANNOUNCE . ', ' . POST_GLOBAL . ")
+ AND topic_last_post_time >= $min_time";
+
+ if (!$auth->acl_get('m_approve', $forum_id))
+ {
+ $sql .= 'AND topic_visibility = ' . ITEM_APPROVED;
+ }
+ break;
+
+ case 'viewtopic':
+ $type = 'posts';
+ $default_key = 't';
+ $default_dir = 'a';
+
+ $sql = 'SELECT COUNT(post_id) AS total
+ FROM ' . POSTS_TABLE . "
+ $where_sql topic_id = $topic_id
+ AND post_time >= $min_time";
+
+ if (!$auth->acl_get('m_approve', $forum_id))
+ {
+ $sql .= 'AND post_visibility = ' . ITEM_APPROVED;
+ }
+ break;
+
+ case 'unapproved_posts':
+ case 'deleted_posts':
+ $visibility_const = ($mode == 'unapproved_posts') ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
+ $type = 'posts';
+ $default_key = 't';
+ $default_dir = 'd';
+ $where_sql .= ($topic_id) ? ' p.topic_id = ' . $topic_id . ' AND' : '';
+
+ $sql = 'SELECT COUNT(p.post_id) AS total
+ FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
+ $where_sql " . $db->sql_in_set('p.forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_approve'))) . '
+ AND ' . $db->sql_in_set('p.post_visibility', $visibility_const) .'
+ AND t.topic_id = p.topic_id
+ AND t.topic_visibility <> p.post_visibility';
+
+ if ($min_time)
+ {
+ $sql .= ' AND post_time >= ' . $min_time;
+ }
+ break;
+
+ case 'unapproved_topics':
+ case 'deleted_topics':
+ $visibility_const = ($mode == 'unapproved_topics') ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
+ $type = 'topics';
+ $default_key = 't';
+ $default_dir = 'd';
+
+ $sql = 'SELECT COUNT(topic_id) AS total
+ FROM ' . TOPICS_TABLE . "
+ $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_approve'))) . '
+ AND ' . $db->sql_in_set('topic_visibility', $visibility_const);
+
+ if ($min_time)
+ {
+ $sql .= ' AND topic_time >= ' . $min_time;
+ }
+ break;
+
+ case 'pm_reports':
+ case 'pm_reports_closed':
+ case 'reports':
+ case 'reports_closed':
+ $pm = (strpos($mode, 'pm_') === 0) ? true : false;
+
+ $type = ($pm) ? 'pm_reports' : 'reports';
+ $default_key = 't';
+ $default_dir = 'd';
+ $limit_time_sql = ($min_time) ? "AND r.report_time >= $min_time" : '';
+
+ if ($topic_id)
+ {
+ $where_sql .= ' p.topic_id = ' . $topic_id . ' AND ';
+ }
+ else if ($forum_id)
+ {
+ $where_sql .= ' p.forum_id = ' . $forum_id . ' AND ';
+ }
+ else if (!$pm)
+ {
+ $where_sql .= ' ' . $db->sql_in_set('p.forum_id', get_forum_list(array('!f_read', '!m_report')), true, true) . ' AND ';
+ }
+
+ if ($mode == 'reports' || $mode == 'pm_reports')
+ {
+ $where_sql .= ' r.report_closed = 0 AND ';
+ }
+ else
+ {
+ $where_sql .= ' r.report_closed = 1 AND ';
+ }
+
+ if ($pm)
+ {
+ $sql = 'SELECT COUNT(r.report_id) AS total
+ FROM ' . REPORTS_TABLE . ' r, ' . PRIVMSGS_TABLE . " p
+ $where_sql r.post_id = 0
+ AND p.msg_id = r.pm_id
+ $limit_time_sql";
+ }
+ else
+ {
+ $sql = 'SELECT COUNT(r.report_id) AS total
+ FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . " p
+ $where_sql r.pm_id = 0
+ AND p.post_id = r.post_id
+ $limit_time_sql";
+ }
+ break;
+
+ case 'viewlogs':
+ $type = 'logs';
+ $default_key = 't';
+ $default_dir = 'd';
+
+ $sql = 'SELECT COUNT(log_id) AS total
+ FROM ' . LOG_TABLE . "
+ $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_'))) . '
+ AND log_time >= ' . $min_time . '
+ AND log_type = ' . LOG_MOD;
+ break;
+ }
+
+ $sort_key = request_var('sk', $default_key);
+ $sort_dir = request_var('sd', $default_dir);
+ $sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);
+
+ switch ($type)
+ {
+ case 'topics':
+ $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
+ $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'tt' => $user->lang['TOPIC_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
+
+ $sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');
+ $limit_time_sql = ($min_time) ? "AND t.topic_last_post_time >= $min_time" : '';
+ break;
+
+ case 'posts':
+ $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
+ $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
+ $sort_by_sql = array('a' => 'u.username_clean', 't' => 'p.post_time', 's' => 'p.post_subject');
+ $limit_time_sql = ($min_time) ? "AND p.post_time >= $min_time" : '';
+ break;
+
+ case 'reports':
+ $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
+ $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
+ $sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.post_time', 't' => 'r.report_time', 's' => 'p.post_subject');
+ break;
+
+ case 'pm_reports':
+ $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
+ $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
+ $sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.message_time', 't' => 'r.report_time', 's' => 'p.message_subject');
+ break;
+
+ case 'logs':
+ $limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
+ $sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']);
+
+ $sort_by_sql = array('u' => 'u.username_clean', 't' => 'l.log_time', 'i' => 'l.log_ip', 'o' => 'l.log_operation');
+ $limit_time_sql = ($min_time) ? "AND l.log_time >= $min_time" : '';
+ break;
+ }
+
+ if (!isset($sort_by_sql[$sort_key]))
+ {
+ $sort_key = $default_key;
+ }
+
+ $sort_order_sql = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
+
+ $s_limit_days = $s_sort_key = $s_sort_dir = $sort_url = '';
+ gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url);
+
+ $template->assign_vars(array(
+ 'S_SELECT_SORT_DIR' => $s_sort_dir,
+ 'S_SELECT_SORT_KEY' => $s_sort_key,
+ 'S_SELECT_SORT_DAYS' => $s_limit_days)
+ );
+
+ if (($sort_days && $mode != 'viewlogs') || in_array($mode, array('reports', 'unapproved_topics', 'unapproved_posts', 'deleted_topics', 'deleted_posts')) || $where_sql != 'WHERE')
+ {
+ $result = $db->sql_query($sql);
+ $total = (int) $db->sql_fetchfield('total');
+ $db->sql_freeresult($result);
+ }
+ else
+ {
+ $total = -1;
+ }
+}
+
+/**
+* Validate ids
+*
+* @param array &$ids The relevant ids to check
+* @param string $table The table to find the ids in
+* @param string $sql_id The ids relevant column name
+* @param array $acl_list A list of permissions the user need to have
+* @param mixed $singe_forum Limit to one forum id (int) or the first forum found (true)
+*
+* @return mixed False if no ids were able to be retrieved, true if at least one id left.
+* Additionally, this value can be the forum_id assigned if $single_forum was set.
+* Therefore checking the result for with !== false is the best method.
+*/
+function phpbb_check_ids(&$ids, $table, $sql_id, $acl_list = false, $single_forum = false)
+{
+ global $db, $auth;
+
+ if (!is_array($ids) || empty($ids))
+ {
+ return false;
+ }
+
+ $sql = "SELECT $sql_id, forum_id FROM $table
+ WHERE " . $db->sql_in_set($sql_id, $ids);
+ $result = $db->sql_query($sql);
+
+ $ids = array();
+ $forum_id = false;
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if ($acl_list && $row['forum_id'] && !$auth->acl_gets($acl_list, $row['forum_id']))
+ {
+ continue;
+ }
+
+ if ($acl_list && !$row['forum_id'] && !$auth->acl_getf_global($acl_list))
+ {
+ continue;
+ }
+
+ // Limit forum? If not, just assign the id.
+ if ($single_forum === false)
+ {
+ $ids[] = $row[$sql_id];
+ continue;
+ }
+
+ // Limit forum to a specific forum id?
+ // This can get really tricky, because we do not want to create a failure on global topics. :)
+ if ($row['forum_id'])
+ {
+ if ($single_forum !== true && $row['forum_id'] == (int) $single_forum)
+ {
+ $forum_id = (int) $single_forum;
+ }
+ else if ($forum_id === false)
+ {
+ $forum_id = $row['forum_id'];
+ }
+
+ if ($row['forum_id'] == $forum_id)
+ {
+ $ids[] = $row[$sql_id];
+ }
+ }
+ else
+ {
+ // Always add a global topic
+ $ids[] = $row[$sql_id];
+ }
+ }
+ $db->sql_freeresult($result);
+
+ if (!sizeof($ids))
+ {
+ return false;
+ }
+
+ // If forum id is false and ids populated we may have only global announcements selected (returning 0 because of (int) $forum_id)
+
+ return ($single_forum === false) ? true : (int) $forum_id;
+}
diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php
index 51284af233..86439ea03f 100644
--- a/phpBB/includes/functions_module.php
+++ b/phpBB/includes/functions_module.php
@@ -250,13 +250,25 @@ class p_master
// Function for building 'url_extra'
$short_name = $this->get_short_name($row['module_basename']);
- $url_func = '_module_' . $short_name . '_url';
+ $url_func = 'phpbb_module_' . $short_name . '_url';
+ if (!function_exists($url_func))
+ {
+ $url_func = '_module_' . $short_name . '_url';
+ }
// Function for building the language name
- $lang_func = '_module_' . $short_name . '_lang';
+ $lang_func = 'phpbb_module_' . $short_name . '_lang';
+ if (!function_exists($lang_func))
+ {
+ $lang_func = '_module_' . $short_name . '_lang';
+ }
// Custom function for calling parameters on module init (for example assigning template variables)
- $custom_func = '_module_' . $short_name;
+ $custom_func = 'phpbb_module_' . $short_name;
+ if (!function_exists($custom_func))
+ {
+ $custom_func = '_module_' . $short_name;
+ }
$names[$row['module_basename'] . '_' . $row['module_mode']][] = true;
@@ -456,7 +468,9 @@ class p_master
);
$is_auth = false;
+ // @codingStandardsIgnoreStart
eval('$is_auth = (int) (' . $module_auth . ');');
+ // @codingStandardsIgnoreEnd
return $is_auth;
}
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index d4e7fecbff..0b37af0ee0 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -2485,3 +2485,137 @@ function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)
return $url;
}
+
+/**
+* Show upload popup (progress bar)
+*/
+function phpbb_upload_popup($forum_style = 0)
+{
+ global $template, $user;
+
+ ($forum_style) ? $user->setup('posting', $forum_style) : $user->setup('posting');
+
+ page_header($user->lang['PROGRESS_BAR']);
+
+ $template->set_filenames(array(
+ 'popup' => 'posting_progress_bar.html')
+ );
+
+ $template->assign_vars(array(
+ 'PROGRESS_BAR' => $user->img('upload_bar', $user->lang['UPLOAD_IN_PROGRESS']))
+ );
+
+ $template->display('popup');
+
+ garbage_collection();
+ exit_handler();
+}
+
+/**
+* Do the various checks required for removing posts as well as removing it
+*/
+function phpbb_handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft = false, $soft_delete_reason = '')
+{
+ global $user, $auth, $config, $request;
+ global $phpbb_root_path, $phpEx;
+
+ $perm_check = ($is_soft) ? 'softdelete' : 'delete';
+
+ // If moderator removing post or user itself removing post, present a confirmation screen
+ if ($auth->acl_get("m_$perm_check", $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get("f_$perm_check", $forum_id) && $post_id == $post_data['topic_last_post_id'] && !$post_data['post_edit_locked'] && ($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])))
+ {
+ $s_hidden_fields = array(
+ 'p' => $post_id,
+ 'f' => $forum_id,
+ 'mode' => ($is_soft) ? 'soft_delete' : 'delete',
+ );
+
+ if (confirm_box(true))
+ {
+ $data = array(
+ 'topic_first_post_id' => $post_data['topic_first_post_id'],
+ 'topic_last_post_id' => $post_data['topic_last_post_id'],
+ 'topic_posts_approved' => $post_data['topic_posts_approved'],
+ 'topic_posts_unapproved' => $post_data['topic_posts_unapproved'],
+ 'topic_posts_softdeleted' => $post_data['topic_posts_softdeleted'],
+ 'topic_visibility' => $post_data['topic_visibility'],
+ 'topic_type' => $post_data['topic_type'],
+ 'post_visibility' => $post_data['post_visibility'],
+ 'post_reported' => $post_data['post_reported'],
+ 'post_time' => $post_data['post_time'],
+ 'poster_id' => $post_data['poster_id'],
+ 'post_postcount' => $post_data['post_postcount'],
+ );
+
+ $next_post_id = delete_post($forum_id, $topic_id, $post_id, $data, $is_soft, $soft_delete_reason);
+ $post_username = ($post_data['poster_id'] == ANONYMOUS && !empty($post_data['post_username'])) ? $post_data['post_username'] : $post_data['username'];
+
+ if ($next_post_id === false)
+ {
+ add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), $post_data['topic_title'], $post_username, $soft_delete_reason);
+
+ $meta_info = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id");
+ $message = $user->lang['POST_DELETED'];
+ }
+ else
+ {
+ add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), $post_data['post_subject'], $post_username, $soft_delete_reason);
+
+ $meta_info = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p=$next_post_id") . "#p$next_post_id";
+ $message = $user->lang['POST_DELETED'];
+
+ if (!$request->is_ajax())
+ {
+ $message .= '<br /><br />' . $user->lang('RETURN_TOPIC', '<a href="' . $meta_info . '">', '</a>');
+ }
+ }
+
+ meta_refresh(3, $meta_info);
+ if (!$request->is_ajax())
+ {
+ $message .= '<br /><br />' . $user->lang('RETURN_FORUM', '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
+ }
+ trigger_error($message);
+ }
+ else
+ {
+ global $user, $template, $request;
+
+ $can_delete = $auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id));
+ $can_softdelete = $auth->acl_get('m_softdelete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_softdelete', $forum_id));
+
+ $template->assign_vars(array(
+ 'S_SOFTDELETED' => $post_data['post_visibility'] == ITEM_DELETED,
+ 'S_CHECKED_PERMANENT' => $request->is_set_post('delete_permanent') ? ' checked="checked"' : '',
+ 'S_ALLOWED_DELETE' => $can_delete,
+ 'S_ALLOWED_SOFTDELETE' => $can_softdelete,
+ ));
+
+ $l_confirm = 'DELETE_POST';
+ if ($post_data['post_visibility'] == ITEM_DELETED)
+ {
+ $l_confirm .= '_PERMANENTLY';
+ $s_hidden_fields['delete_permanent'] = '1';
+ }
+ else if (!$can_softdelete)
+ {
+ $s_hidden_fields['delete_permanent'] = '1';
+ }
+
+ confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html');
+ }
+ }
+
+ // If we are here the user is not able to delete - present the correct error message
+ if ($post_data['poster_id'] != $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id))
+ {
+ trigger_error('DELETE_OWN_POSTS');
+ }
+
+ if ($post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id) && $post_id != $post_data['topic_last_post_id'])
+ {
+ trigger_error('CANNOT_DELETE_REPLIED');
+ }
+
+ trigger_error('USER_CANNOT_DELETE');
+}
diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php
index 92655cd035..e60311f8ab 100644
--- a/phpBB/includes/functions_privmsgs.php
+++ b/phpBB/includes/functions_privmsgs.php
@@ -988,7 +988,7 @@ function handle_mark_actions($user_id, $mark_action)
*/
function delete_pm($user_id, $msg_ids, $folder_id)
{
- global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container;
+ global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
$user_id = (int) $user_id;
$folder_id = (int) $folder_id;
@@ -1012,6 +1012,18 @@ function delete_pm($user_id, $msg_ids, $folder_id)
return false;
}
+ /**
+ * Get all info for PM(s) before they are deleted
+ *
+ * @event core.delete_pm_before
+ * @var int user_id ID of the user requested the message delete
+ * @var array msg_ids array of all messages to be deleted
+ * @var int folder_id ID of the user folder where the messages are stored
+ * @since 3.1.0-b5
+ */
+ $vars = array('user_id', 'msg_ids', 'folder_id');
+ extract($phpbb_dispatcher->trigger_event('core.delete_pm_before', compact($vars)));
+
// Get PM Information for later deleting
$sql = 'SELECT msg_id, pm_unread, pm_new
FROM ' . PRIVMSGS_TO_TABLE . '
@@ -1906,6 +1918,19 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
$phpbb_notifications->add_notifications('pm', $pm_data);
}
+ /**
+ * Get PM message ID after submission to DB
+ *
+ * @event core.submit_pm_after
+ * @var string mode PM Post mode - post|reply|quote|quotepost|forward|edit
+ * @var string subject Subject of the private message
+ * @var array data The whole row data of the PM.
+ * @var array pm_data The data sent to notification class
+ * @since 3.1.0-b5
+ */
+ $vars = array('mode', 'subject', 'data', 'pm_data');
+ extract($phpbb_dispatcher->trigger_event('core.submit_pm_after', compact($vars)));
+
return $data['msg_id'];
}
diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php
index c640865212..0847c3a550 100644
--- a/phpBB/includes/functions_upload.php
+++ b/phpBB/includes/functions_upload.php
@@ -485,6 +485,9 @@ class fileupload
var $max_height = 0;
var $error_prefix = '';
+ /** @var int Timeout for remote upload */
+ var $upload_timeout = 6;
+
/**
* Init file upload class.
*
@@ -828,13 +831,28 @@ class fileupload
fputs($fsock, "HOST: " . $host . "\r\n");
fputs($fsock, "Connection: close\r\n\r\n");
+ // Set a proper timeout for the socket
+ socket_set_timeout($fsock, $this->upload_timeout);
+
$get_info = false;
$data = '';
- while (!@feof($fsock))
+ $length = false;
+ $timer_stop = time() + $this->upload_timeout;
+
+ while ((!$length || $filesize < $length) && !@feof($fsock))
{
if ($get_info)
{
- $block = @fread($fsock, 1024);
+ if ($length)
+ {
+ // Don't attempt to read past end of file if server indicated length
+ $block = @fread($fsock, min($length - $filesize, 1024));
+ }
+ else
+ {
+ $block = @fread($fsock, 1024);
+ }
+
$filesize += strlen($block);
if ($remote_max_filesize && $filesize > $remote_max_filesize)
@@ -880,6 +898,15 @@ class fileupload
}
}
}
+
+ $stream_meta_data = stream_get_meta_data($fsock);
+
+ // Cancel upload if we exceed timeout
+ if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop)
+ {
+ $file = new fileerror($user->lang[$this->error_prefix . 'REMOTE_UPLOAD_TIMEOUT']);
+ return $file;
+ }
}
@fclose($fsock);
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index d728ed7d78..d39be50251 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -261,10 +261,13 @@ function user_add($user_row, $cp_data = false)
* Use this event to modify the values to be inserted when a user is added
*
* @event core.user_add_modify_data
+ * @var array user_row Array of user details submited to user_add
+ * @var array cp_data Array of Custom profile fields submited to user_add
* @var array sql_ary Array of data to be inserted when a user is added
* @since 3.1.0-a1
+ * @change 3.1.0-b5
*/
- $vars = array('sql_ary');
+ $vars = array('user_row', 'cp_data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.user_add_modify_data', compact($vars)));
$sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
@@ -344,6 +347,18 @@ function user_add($user_row, $cp_data = false)
set_config('newest_user_colour', $row['group_colour'], true);
}
+ /**
+ * Event that returns user id, user detals and user CPF of newly registared user
+ *
+ * @event core.user_add_after
+ * @var int user_id User id of newly registared user
+ * @var array user_row Array of user details submited to user_add
+ * @var array cp_data Array of Custom profile fields submited to user_add
+ * @since 3.1.0-b5
+ */
+ $vars = array('user_id', 'user_row', 'cp_data');
+ extract($phpbb_dispatcher->trigger_event('core.user_add_after', compact($vars)));
+
return $user_id;
}
@@ -755,7 +770,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
else
{
$ban_other = explode('-', $ban_len_other);
- if (sizeof($ban_other) == 3 && ((int)$ban_other[0] < 9999) &&
+ if (sizeof($ban_other) == 3 && ((int) $ban_other[0] < 9999) &&
(strlen($ban_other[0]) == 4) && (strlen($ban_other[1]) == 2) && (strlen($ban_other[2]) == 2))
{
$ban_end = max($current_time, $user->create_datetime()
@@ -1122,7 +1137,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
// Update log
$log_entry = ($ban_exclude) ? 'LOG_BAN_EXCLUDE_' : 'LOG_BAN_';
- // Add to moderator log, admin log and user notes
+ // Add to admin log, moderator log and user notes
add_log('admin', $log_entry . strtoupper($mode), $ban_reason, $ban_list_log);
add_log('mod', 0, 0, $log_entry . strtoupper($mode), $ban_reason, $ban_list_log);
if ($mode == 'user')
@@ -2086,7 +2101,7 @@ function avatar_delete($mode, $row, $clean_db = false)
// Check if the users avatar is actually *not* a group avatar
if ($mode == 'user')
{
- if (strpos($row['user_avatar'], 'g') === 0 || (((int)$row['user_avatar'] !== 0) && ((int)$row['user_avatar'] !== (int)$row['user_id'])))
+ if (strpos($row['user_avatar'], 'g') === 0 || (((int) $row['user_avatar'] !== 0) && ((int) $row['user_avatar'] !== (int) $row['user_id'])))
{
return false;
}
@@ -2419,7 +2434,7 @@ function group_correct_avatar($group_id, $old_entry)
{
global $config, $db, $phpbb_root_path;
- $group_id = (int)$group_id;
+ $group_id = (int) $group_id;
$ext = substr(strrchr($old_entry, '.'), 1);
$old_filename = get_avatar_filename($old_entry);
$new_filename = $config['avatar_salt'] . "_g$group_id.$ext";
@@ -2844,7 +2859,7 @@ function remove_default_avatar($group_id, $user_ids)
$sql = 'SELECT *
FROM ' . GROUPS_TABLE . '
- WHERE group_id = ' . (int)$group_id;
+ WHERE group_id = ' . (int) $group_id;
$result = $db->sql_query($sql);
if (!$row = $db->sql_fetchrow($result))
{
@@ -2885,7 +2900,7 @@ function remove_default_rank($group_id, $user_ids)
$sql = 'SELECT *
FROM ' . GROUPS_TABLE . '
- WHERE group_id = ' . (int)$group_id;
+ WHERE group_id = ' . (int) $group_id;
$result = $db->sql_query($sql);
if (!$row = $db->sql_fetchrow($result))
{
@@ -2896,9 +2911,9 @@ function remove_default_rank($group_id, $user_ids)
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_rank = 0
- WHERE group_id = ' . (int)$group_id . '
+ WHERE group_id = ' . (int) $group_id . '
AND user_rank <> 0
- AND user_rank = ' . (int)$row['group_rank'] . '
+ AND user_rank = ' . (int) $row['group_rank'] . '
AND ' . $db->sql_in_set('user_id', $user_ids);
$db->sql_query($sql);
}
@@ -3530,3 +3545,23 @@ function phpbb_get_banned_user_ids($user_ids = array(), $ban_end = true)
return $banned_ids_list;
}
+
+/**
+* Function for assigning a template var if the zebra module got included
+*/
+function phpbb_module_zebra($mode, &$module_row)
+{
+ global $template;
+
+ $template->assign_var('S_ZEBRA_ENABLED', true);
+
+ if ($mode == 'friends')
+ {
+ $template->assign_var('S_ZEBRA_FRIENDS_ENABLED', true);
+ }
+
+ if ($mode == 'foes')
+ {
+ $template->assign_var('S_ZEBRA_FOES_ENABLED', true);
+ }
+}
diff --git a/phpBB/includes/mcp/mcp_ban.php b/phpBB/includes/mcp/mcp_ban.php
index d9ee53fe30..e6fac3b80c 100644
--- a/phpBB/includes/mcp/mcp_ban.php
+++ b/phpBB/includes/mcp/mcp_ban.php
@@ -185,7 +185,7 @@ class mcp_ban
}
else if ($post_id)
{
- $post_info = get_post_data($post_id, 'm_ban');
+ $post_info = phpbb_get_post_data($post_id, 'm_ban');
if (sizeof($post_info) && !empty($post_info[$post_id]))
{
diff --git a/phpBB/includes/mcp/mcp_forum.php b/phpBB/includes/mcp/mcp_forum.php
index e63888e70e..0c6acaa908 100644
--- a/phpBB/includes/mcp/mcp_forum.php
+++ b/phpBB/includes/mcp/mcp_forum.php
@@ -102,7 +102,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$sort_days = $total = 0;
$sort_key = $sort_dir = '';
$sort_by_sql = $sort_order_sql = array();
- mcp_sorting('viewforum', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id);
+ phpbb_mcp_sorting('viewforum', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id);
$forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
$limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
@@ -328,7 +328,7 @@ function mcp_resync_topics($topic_ids)
trigger_error('NO_TOPIC_SELECTED');
}
- if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
+ if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
{
return;
}
@@ -380,7 +380,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
$sync_topics = array_merge($topic_ids, array($to_topic_id));
- $topic_data = get_topic_data($sync_topics, 'm_merge');
+ $topic_data = phpbb_get_topic_data($sync_topics, 'm_merge');
if (!sizeof($topic_data) || empty($topic_data[$to_topic_id]))
{
@@ -420,7 +420,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
return;
}
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_merge')))
+ if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_merge')))
{
return;
}
diff --git a/phpBB/includes/mcp/mcp_main.php b/phpBB/includes/mcp/mcp_main.php
index 9d1afb7dc5..9f6125f256 100644
--- a/phpBB/includes/mcp/mcp_main.php
+++ b/phpBB/includes/mcp/mcp_main.php
@@ -187,7 +187,7 @@ class mcp_main
$forum_id = request_var('f', 0);
- $forum_info = get_forum_data($forum_id, 'm_', true);
+ $forum_info = phpbb_get_forum_data($forum_id, 'm_', true);
if (!sizeof($forum_info))
{
@@ -252,7 +252,7 @@ function lock_unlock($action, $ids)
$orig_ids = $ids;
- if (!check_ids($ids, $table, $sql_id, array('m_lock')))
+ if (!phpbb_check_ids($ids, $table, $sql_id, array('m_lock')))
{
// Make sure that for f_user_lock only the lock action is triggered.
if ($action != 'lock')
@@ -262,7 +262,7 @@ function lock_unlock($action, $ids)
$ids = $orig_ids;
- if (!check_ids($ids, $table, $sql_id, array('f_user_lock')))
+ if (!phpbb_check_ids($ids, $table, $sql_id, array('f_user_lock')))
{
return;
}
@@ -286,7 +286,7 @@ function lock_unlock($action, $ids)
WHERE ' . $db->sql_in_set($sql_id, $ids);
$db->sql_query($sql);
- $data = ($action == 'lock' || $action == 'unlock') ? get_topic_data($ids) : get_post_data($ids);
+ $data = ($action == 'lock' || $action == 'unlock') ? phpbb_get_topic_data($ids) : phpbb_get_post_data($ids);
foreach ($data as $id => $row)
{
@@ -346,7 +346,7 @@ function change_topic_type($action, $topic_ids)
break;
}
- $forum_id = check_ids($topic_ids, TOPICS_TABLE, 'topic_id', $check_acl, true);
+ $forum_id = phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', $check_acl, true);
if ($forum_id === false)
{
@@ -388,7 +388,7 @@ function change_topic_type($action, $topic_ids)
if (sizeof($topic_ids))
{
- $data = get_topic_data($topic_ids);
+ $data = phpbb_get_topic_data($topic_ids);
foreach ($data as $topic_id => $row)
{
@@ -422,7 +422,7 @@ function mcp_move_topic($topic_ids)
global $phpEx, $phpbb_root_path;
// Here we limit the operation to one forum only
- $forum_id = check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_move'), true);
+ $forum_id = phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_move'), true);
if ($forum_id === false)
{
@@ -442,7 +442,7 @@ function mcp_move_topic($topic_ids)
if ($to_forum_id)
{
- $forum_data = get_forum_data($to_forum_id, 'f_post');
+ $forum_data = phpbb_get_forum_data($to_forum_id, 'f_post');
if (!sizeof($forum_data))
{
@@ -479,7 +479,7 @@ function mcp_move_topic($topic_ids)
if (confirm_box(true))
{
- $topic_data = get_topic_data($topic_ids);
+ $topic_data = phpbb_get_topic_data($topic_ids);
$leave_shadow = (isset($_POST['move_leave_shadow'])) ? true : false;
$forum_sync_data = array();
@@ -496,11 +496,11 @@ function mcp_move_topic($topic_ids)
{
$topics_moved++;
}
- elseif ($topic_info['topic_visibility'] == ITEM_UNAPPROVED || $topic_info['topic_visibility'] == ITEM_REAPPROVE)
+ else if ($topic_info['topic_visibility'] == ITEM_UNAPPROVED || $topic_info['topic_visibility'] == ITEM_REAPPROVE)
{
$topics_moved_unapproved++;
}
- elseif ($topic_info['topic_visibility'] == ITEM_DELETED)
+ else if ($topic_info['topic_visibility'] == ITEM_DELETED)
{
$topics_moved_softdeleted++;
}
@@ -567,7 +567,7 @@ function mcp_move_topic($topic_ids)
'topic_last_poster_id' => (int) $row['topic_last_poster_id'],
'topic_last_poster_colour'=>(string) $row['topic_last_poster_colour'],
'topic_last_poster_name'=> (string) $row['topic_last_poster_name'],
- 'topic_last_post_subject'=> (string) $row['topic_last_post_subject'],
+ 'topic_last_post_subject'=> (string) $row['topic_last_post_subject'],
'topic_last_post_time' => (int) $row['topic_last_post_time'],
'topic_last_view_time' => (int) $row['topic_last_view_time'],
'topic_moved_id' => (int) $row['topic_id'],
@@ -677,7 +677,7 @@ function mcp_restore_topic($topic_ids)
{
global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
- if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_approve')))
+ if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_approve')))
{
return;
}
@@ -697,7 +697,7 @@ function mcp_restore_topic($topic_ids)
{
$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_RESTORED_SUCCESS' : 'TOPICS_RESTORED_SUCCESS';
- $data = get_topic_data($topic_ids);
+ $data = phpbb_get_topic_data($topic_ids);
$phpbb_content_visibility = $phpbb_container->get('content.visibility');
foreach ($data as $topic_id => $row)
@@ -750,7 +750,7 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''
{
global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
- if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_delete')))
+ if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_delete')))
{
return;
}
@@ -770,7 +770,7 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''
{
$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_DELETED_SUCCESS' : 'TOPICS_DELETED_SUCCESS';
- $data = get_topic_data($topic_ids);
+ $data = phpbb_get_topic_data($topic_ids);
foreach ($data as $topic_id => $row)
{
@@ -878,7 +878,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
{
global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
- if (!check_ids($post_ids, POSTS_TABLE, 'post_id', array('m_softdelete')))
+ if (!phpbb_check_ids($post_ids, POSTS_TABLE, 'post_id', array('m_softdelete')))
{
return;
}
@@ -896,7 +896,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
if (confirm_box(true) && $is_soft)
{
- $post_info = get_post_data($post_ids);
+ $post_info = phpbb_get_post_data($post_ids);
$topic_info = $approve_log = array();
@@ -984,7 +984,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
$affected_topics = sizeof($topic_id_list);
$db->sql_freeresult($result);
- $post_data = get_post_data($post_ids);
+ $post_data = phpbb_get_post_data($post_ids);
foreach ($post_data as $id => $row)
{
@@ -1105,7 +1105,7 @@ function mcp_fork_topic($topic_ids)
global $auth, $user, $db, $template, $config;
global $phpEx, $phpbb_root_path;
- if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
+ if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
{
return;
}
@@ -1124,7 +1124,7 @@ function mcp_fork_topic($topic_ids)
if ($to_forum_id)
{
- $forum_data = get_forum_data($to_forum_id, 'f_post');
+ $forum_data = phpbb_get_forum_data($to_forum_id, 'f_post');
if (!sizeof($topic_ids))
{
@@ -1161,7 +1161,7 @@ function mcp_fork_topic($topic_ids)
if (confirm_box(true))
{
- $topic_data = get_topic_data($topic_ids, 'f_post');
+ $topic_data = phpbb_get_topic_data($topic_ids, 'f_post');
$total_topics = $total_topics_unapproved = $total_topics_softdeleted = 0;
$total_posts = $total_posts_unapproved = $total_posts_softdeleted = 0;
diff --git a/phpBB/includes/mcp/mcp_pm_reports.php b/phpBB/includes/mcp/mcp_pm_reports.php
index 7e39c157c1..03e4ed4722 100644
--- a/phpBB/includes/mcp/mcp_pm_reports.php
+++ b/phpBB/includes/mcp/mcp_pm_reports.php
@@ -100,7 +100,7 @@ class mcp_pm_reports
$pm_id = $report['pm_id'];
$report_id = $report['report_id'];
- $pm_info = get_pm_data(array($pm_id));
+ $pm_info = phpbb_get_pm_data(array($pm_id));
if (!sizeof($pm_info))
{
@@ -216,7 +216,7 @@ class mcp_pm_reports
$sort_days = $total = 0;
$sort_key = $sort_dir = '';
$sort_by_sql = $sort_order_sql = array();
- mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total);
+ phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total);
$limit_time_sql = ($sort_days) ? 'AND r.report_time >= ' . (time() - ($sort_days * 86400)) : '';
diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php
index d2cc5d285e..e81abd0c8e 100644
--- a/phpBB/includes/mcp/mcp_post.php
+++ b/phpBB/includes/mcp/mcp_post.php
@@ -33,7 +33,7 @@ function mcp_post_details($id, $mode, $action)
$start = request_var('start', 0);
// Get post data
- $post_info = get_post_data(array($post_id), false, true);
+ $post_info = phpbb_get_post_data(array($post_id), false, true);
add_form_key('mcp_post_details');
@@ -43,7 +43,7 @@ function mcp_post_details($id, $mode, $action)
}
$post_info = $post_info[$post_id];
- $url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . extra_url());
+ $url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . phpbb_extra_url());
switch ($action)
{
@@ -508,7 +508,7 @@ function change_poster(&$post_info, $userdata)
$to_username = $userdata['username'];
// Renew post info
- $post_info = get_post_data(array($post_id), false, true);
+ $post_info = phpbb_get_post_data(array($post_id), false, true);
if (!sizeof($post_info))
{
diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
index e2ca3a8752..37ce3c6fc3 100644
--- a/phpBB/includes/mcp/mcp_queue.php
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -159,7 +159,7 @@ class mcp_queue
if ($topic_id)
{
- $topic_info = get_topic_data(array($topic_id), 'm_approve');
+ $topic_info = phpbb_get_topic_data(array($topic_id), 'm_approve');
if (isset($topic_info[$topic_id]['topic_first_post_id']))
{
$post_id = (int) $topic_info[$topic_id]['topic_first_post_id'];
@@ -174,7 +174,7 @@ class mcp_queue
$phpbb_notifications->mark_notifications_read('post_in_queue', $post_id, $user->data['user_id']);
- $post_info = get_post_data(array($post_id), 'm_approve', true);
+ $post_info = phpbb_get_post_data(array($post_id), 'm_approve', true);
if (!sizeof($post_info))
{
@@ -343,7 +343,7 @@ class mcp_queue
if ($topic_id)
{
- $topic_info = get_topic_data(array($topic_id));
+ $topic_info = phpbb_get_topic_data(array($topic_id));
if (!sizeof($topic_info))
{
@@ -389,7 +389,7 @@ class mcp_queue
}
else
{
- $forum_info = get_forum_data(array($forum_id), $m_perm);
+ $forum_info = phpbb_get_forum_data(array($forum_id), $m_perm);
if (!sizeof($forum_info))
{
@@ -409,7 +409,7 @@ class mcp_queue
$sort_days = $total = 0;
$sort_key = $sort_dir = '';
$sort_by_sql = $sort_order_sql = array();
- mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
+ phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
$forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
$limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
@@ -572,7 +572,7 @@ class mcp_queue
global $db, $template, $user, $config, $request, $phpbb_container;
global $phpEx, $phpbb_root_path;
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
+ if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
{
trigger_error('NOT_AUTHORISED');
}
@@ -591,7 +591,7 @@ class mcp_queue
'redirect' => $redirect,
));
- $post_info = get_post_data($post_id_list, 'm_approve');
+ $post_info = phpbb_get_post_data($post_id_list, 'm_approve');
if (confirm_box(true))
{
@@ -795,7 +795,7 @@ class mcp_queue
global $db, $template, $user, $config;
global $phpEx, $phpbb_root_path, $request, $phpbb_container;
- if (!check_ids($topic_id_list, TOPICS_TABLE, 'topic_id', array('m_approve')))
+ if (!phpbb_check_ids($topic_id_list, TOPICS_TABLE, 'topic_id', array('m_approve')))
{
trigger_error('NOT_AUTHORISED');
}
@@ -813,7 +813,7 @@ class mcp_queue
'redirect' => $redirect,
));
- $topic_info = get_topic_data($topic_id_list, 'm_approve');
+ $topic_info = phpbb_get_topic_data($topic_id_list, 'm_approve');
if (confirm_box(true))
{
@@ -964,7 +964,7 @@ class mcp_queue
global $db, $template, $user, $config, $phpbb_container;
global $phpEx, $phpbb_root_path, $request;
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
+ if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
{
trigger_error('NOT_AUTHORISED');
}
@@ -1016,7 +1016,7 @@ class mcp_queue
}
}
- $post_info = get_post_data($post_id_list, 'm_approve');
+ $post_info = phpbb_get_post_data($post_id_list, 'm_approve');
$is_disapproving = false;
foreach ($post_info as $post_id => $post_data)
diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php
index f045fd018f..a7d8bf18d6 100644
--- a/phpBB/includes/mcp/mcp_reports.php
+++ b/phpBB/includes/mcp/mcp_reports.php
@@ -106,7 +106,7 @@ class mcp_reports
$parse_post_flags += $report['reported_post_enable_smilies'] ? OPTION_FLAG_SMILIES : 0;
$parse_post_flags += $report['reported_post_enable_magic_url'] ? OPTION_FLAG_LINKS : 0;
- $post_info = get_post_data(array($post_id), 'm_report', true);
+ $post_info = phpbb_get_post_data(array($post_id), 'm_report', true);
if (!sizeof($post_info))
{
@@ -269,7 +269,7 @@ class mcp_reports
if ($topic_id)
{
- $topic_info = get_topic_data(array($topic_id));
+ $topic_info = phpbb_get_topic_data(array($topic_id));
if (!sizeof($topic_info))
{
@@ -312,7 +312,7 @@ class mcp_reports
}
else
{
- $forum_info = get_forum_data(array($forum_id), 'm_report');
+ $forum_info = phpbb_get_forum_data(array($forum_id), 'm_report');
if (!sizeof($forum_info))
{
@@ -338,7 +338,7 @@ class mcp_reports
$sort_days = $total = 0;
$sort_key = $sort_dir = '';
$sort_by_sql = $sort_order_sql = array();
- mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
+ phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
$forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
$limit_time_sql = ($sort_days) ? 'AND r.report_time >= ' . (time() - ($sort_days * 86400)) : '';
@@ -479,7 +479,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
}
else
{
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_report')))
+ if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_report')))
{
trigger_error('NOT_AUTHORISED');
}
@@ -489,7 +489,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
{
$redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=reports');
}
- elseif ($action == 'delete' && strpos($user->data['session_page'], 'mode=pm_report_details') !== false)
+ else if ($action == 'delete' && strpos($user->data['session_page'], 'mode=pm_report_details') !== false)
{
$redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=pm_reports');
}
@@ -515,7 +515,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
if (confirm_box(true))
{
- $post_info = ($pm) ? get_pm_data($post_id_list) : get_post_data($post_id_list, 'm_report');
+ $post_info = ($pm) ? phpbb_get_pm_data($post_id_list) : phpbb_get_post_data($post_id_list, 'm_report');
$sql = "SELECT r.report_id, r.$id_column, r.report_closed, r.user_id, r.user_notify, u.username, u.username_clean, u.user_email, u.user_jabber, u.user_lang, u.user_notify_type
FROM " . REPORTS_TABLE . ' r, ' . USERS_TABLE . ' u
diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php
index f8ce8aae7b..1698b080c9 100644
--- a/phpBB/includes/mcp/mcp_topic.php
+++ b/phpBB/includes/mcp/mcp_topic.php
@@ -27,13 +27,13 @@ function mcp_topic_view($id, $mode, $action)
global $phpEx, $phpbb_root_path, $config;
global $template, $db, $user, $auth, $cache, $phpbb_container;
- $url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . extra_url());
+ $url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . phpbb_extra_url());
$user->add_lang('viewtopic');
$pagination = $phpbb_container->get('pagination');
$topic_id = request_var('t', 0);
- $topic_info = get_topic_data(array($topic_id), false, true);
+ $topic_info = phpbb_get_topic_data(array($topic_id), false, true);
if (!sizeof($topic_info))
{
@@ -114,7 +114,7 @@ function mcp_topic_view($id, $mode, $action)
$sort_days = $total = 0;
$sort_key = $sort_dir = '';
$sort_by_sql = $sort_order_sql = array();
- mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $topic_info['forum_id'], $topic_id, $where_sql);
+ phpbb_mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $topic_info['forum_id'], $topic_id, $where_sql);
$limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$phpbb_content_visibility = $phpbb_container->get('content.visibility');
@@ -278,7 +278,7 @@ function mcp_topic_view($id, $mode, $action)
// Has the user selected a topic for merge?
if ($to_topic_id)
{
- $to_topic_info = get_topic_data(array($to_topic_id), 'm_merge');
+ $to_topic_info = phpbb_get_topic_data(array($to_topic_id), 'm_merge');
if (!sizeof($to_topic_info))
{
@@ -368,13 +368,13 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
return;
}
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_split')))
+ if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_split')))
{
return;
}
$post_id = $post_id_list[0];
- $post_info = get_post_data(array($post_id));
+ $post_info = phpbb_get_post_data(array($post_id));
if (!sizeof($post_info))
{
@@ -398,7 +398,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
return;
}
- $forum_info = get_forum_data(array($to_forum_id), 'f_post');
+ $forum_info = phpbb_get_forum_data(array($to_forum_id), 'f_post');
if (!sizeof($forum_info))
{
@@ -438,7 +438,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$sort_days = $total = 0;
$sort_key = $sort_dir = '';
$sort_by_sql = $sort_order_sql = array();
- mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
+ phpbb_mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
$limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
@@ -505,7 +505,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$to_topic_id = $db->sql_nextid();
move_posts($post_id_list, $to_topic_id);
- $topic_info = get_topic_data(array($topic_id));
+ $topic_info = phpbb_get_topic_data(array($topic_id));
$topic_info = $topic_info[$topic_id];
add_log('mod', $to_forum_id, $to_topic_id, 'LOG_SPLIT_DESTINATION', $subject);
@@ -594,7 +594,7 @@ function merge_posts($topic_id, $to_topic_id)
$sync_topics = array($topic_id, $to_topic_id);
- $topic_data = get_topic_data($sync_topics, 'm_merge');
+ $topic_data = phpbb_get_topic_data($sync_topics, 'm_merge');
if (!sizeof($topic_data) || empty($topic_data[$to_topic_id]))
{
@@ -619,7 +619,7 @@ function merge_posts($topic_id, $to_topic_id)
return;
}
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_merge')))
+ if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_merge')))
{
return;
}
diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php
index 6d3907880e..da27d8900d 100644
--- a/phpBB/includes/message_parser.php
+++ b/phpBB/includes/message_parser.php
@@ -1194,6 +1194,15 @@ class parse_message extends bbcode_firstpass
}
}
+ // Check for out-of-bounds characters that are currently
+ // not supported by utf8_bin in MySQL
+ if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $this->message, $matches))
+ {
+ $character_list = implode('<br />', $matches[0]);
+ $this->warn_msg[] = $user->lang('UNSUPPORTED_CHARACTERS_MESSAGE', $character_list);
+ return $update_this_message ? $this->warn_msg : $return_message;
+ }
+
// Check for "empty" message. We do not check here for maximum length, because bbcode, smilies, etc. can add to the length.
// The maximum length check happened before any parsings.
if ($mode === 'post' && utf8_clean_string($this->message) === '')
@@ -1341,7 +1350,7 @@ class parse_message extends bbcode_firstpass
// NOTE: obtain_* function? chaching the table contents?
// For now setting the ttl to 10 minutes
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mssql':
case 'mssql_odbc':
@@ -1351,12 +1360,6 @@ class parse_message extends bbcode_firstpass
ORDER BY LEN(code) DESC';
break;
- case 'firebird':
- $sql = 'SELECT *
- FROM ' . SMILIES_TABLE . '
- ORDER BY CHAR_LENGTH(code) DESC';
- break;
-
// LENGTH supported by MySQL, IBM DB2, Oracle and Access for sure...
default:
$sql = 'SELECT *
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php
index fc568abc68..94383b935f 100644
--- a/phpBB/includes/ucp/ucp_pm_viewmessage.php
+++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php
@@ -85,7 +85,16 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
// Editing information
if ($message_row['message_edit_count'] && $config['display_last_edited'])
{
- $l_edited_by = '<br /><br />' . $user->lang('EDITED_TIMES_TOTAL', (int) $message_row['message_edit_count'], (!$message_row['message_edit_user']) ? $message_row['username'] : $message_row['message_edit_user'], $user->format_date($message_row['message_edit_time'], false, true));
+ if (!$message_row['message_edit_user'])
+ {
+ $display_username = get_username_string('full', $author_id, $user_info['username'], $user_info['user_colour']);
+ }
+ else
+ {
+ $edit_user_info = get_user_information($message_row['message_edit_user'], false);
+ $display_username = get_username_string('full', $message_row['message_edit_user'], $edit_user_info['username'], $edit_user_info['user_colour']);
+ }
+ $l_edited_by = '<br /><br />' . $user->lang('EDITED_TIMES_TOTAL', (int) $message_row['message_edit_count'], $display_username, $user->format_date($message_row['message_edit_time'], false, true));
}
else
{
@@ -204,6 +213,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
'AUTHOR_AVATAR' => (isset($user_info['avatar'])) ? $user_info['avatar'] : '',
'AUTHOR_JOINED' => $user->format_date($user_info['user_regdate']),
'AUTHOR_POSTS' => (int) $user_info['user_posts'],
+ 'CONTACT_USER' => $user->lang('CONTACT_USER', get_username_string('username', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username'])),
'ONLINE_IMG' => (!$config['load_onlinetrack']) ? '' : ((isset($user_info['online']) && $user_info['online']) ? $user->img('icon_user_online', $user->lang['ONLINE']) : $user->img('icon_user_offline', $user->lang['OFFLINE'])),
'S_ONLINE' => (!$config['load_onlinetrack']) ? false : ((isset($user_info['online']) && $user_info['online']) ? true : false),
diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php
index 958291fa06..e60a40a195 100644
--- a/phpBB/includes/utf/utf_tools.php
+++ b/phpBB/includes/utf/utf_tools.php
@@ -534,7 +534,7 @@ else
return '';
}
- $lx = (int)((-$length) / 65535);
+ $lx = (int) ((-$length) / 65535);
$ly = (-$length) % 65535;
// negative length requires ... capture everything
diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php
index 7daacf92f4..6b6eabe57d 100644
--- a/phpBB/install/convertors/convert_phpbb20.php
+++ b/phpBB/install/convertors/convert_phpbb20.php
@@ -37,7 +37,7 @@ $dbms = phpbb_convert_30_dbms_to_31($dbms);
$convertor_data = array(
'forum_name' => 'phpBB 2.0.x',
'version' => '1.0.3',
- 'phpbb_version' => '3.1.0-b4',
+ 'phpbb_version' => '3.1.0-RC1',
'author' => '<a href="https://www.phpbb.com/">phpBB Limited</a>',
'dbms' => $dbms,
'dbhost' => $dbhost,
diff --git a/phpBB/install/convertors/functions_phpbb20.php b/phpBB/install/convertors/functions_phpbb20.php
index ff20154d03..01447a6232 100644
--- a/phpBB/install/convertors/functions_phpbb20.php
+++ b/phpBB/install/convertors/functions_phpbb20.php
@@ -92,7 +92,7 @@ function phpbb_insert_forums()
$src_db->sql_query("SET NAMES 'utf8'");
}
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mssql':
case 'mssql_odbc':
@@ -223,7 +223,7 @@ function phpbb_insert_forums()
'forum_desc' => htmlspecialchars(phpbb_set_default_encoding($row['forum_desc']), ENT_COMPAT, 'UTF-8'),
'forum_type' => FORUM_POST,
'forum_status' => is_item_locked($row['forum_status']),
- 'enable_prune' => ($prune_enabled) ? (int)$row['prune_enable'] : 0,
+ 'enable_prune' => ($prune_enabled) ? (int) $row['prune_enable'] : 0,
'prune_next' => (int) null_to_zero($row['prune_next']),
'prune_days' => (int) null_to_zero($row['prune_days']),
'prune_viewed' => 0,
@@ -289,7 +289,7 @@ function phpbb_insert_forums()
}
$src_db->sql_freeresult($result);
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'postgres':
$db->sql_query("SELECT SETVAL('" . FORUMS_TABLE . "_seq',(select case when max(forum_id)>0 then max(forum_id)+1 else 1 end from " . FORUMS_TABLE . '));');
@@ -1768,7 +1768,7 @@ function phpbb_create_userconv_table()
global $db, $src_db, $convert, $table_prefix, $user, $lang;
$map_dbms = '';
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mysql':
$map_dbms = 'mysql_40';
@@ -1796,7 +1796,7 @@ function phpbb_create_userconv_table()
break;
default:
- $map_dbms = $db->sql_layer;
+ $map_dbms = $db->get_sql_layer();
break;
}
@@ -1804,13 +1804,6 @@ function phpbb_create_userconv_table()
$drop_sql = 'DROP TABLE ' . USERCONV_TABLE;
switch ($map_dbms)
{
- case 'firebird':
- $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
- user_id INTEGER NOT NULL,
- username_clean VARCHAR(255) CHARACTER SET UTF8 DEFAULT \'\' NOT NULL COLLATE UNICODE
- )';
- break;
-
case 'mssql':
$create_sql = 'CREATE TABLE [' . USERCONV_TABLE . '] (
[user_id] [int] NOT NULL ,
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index 44dbe43cf8..63e4e8f4ac 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -41,7 +41,9 @@ function phpbb_end_update($cache, $config)
</div>
<div id="page-footer">
- Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited
+ <div class="copyright">
+ Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited
+ </div>
</div>
</div>
</body>
@@ -174,7 +176,7 @@ header('Content-type: text/html; charset=UTF-8');
<br />
- <p><?php echo $user->lang['DATABASE_TYPE']; ?> :: <strong><?php echo $db->sql_layer; ?></strong><br />
+ <p><?php echo $user->lang['DATABASE_TYPE']; ?> :: <strong><?php echo $db->get_sql_layer(); ?></strong><br />
<?php echo $user->lang['PREVIOUS_VERSION']; ?> :: <strong><?php echo $config['version']; ?></strong><br />
<?php
@@ -182,7 +184,7 @@ header('Content-type: text/html; charset=UTF-8');
define('IN_DB_UPDATE', true);
/**
-* @todo firebird/mysql update?
+* @todo mysql update?
*/
// End startup code
diff --git a/phpBB/install/index.php b/phpBB/install/index.php
index 43970029cb..c8a745825a 100644
--- a/phpBB/install/index.php
+++ b/phpBB/install/index.php
@@ -688,7 +688,7 @@ class module
));
// Rollback if in transaction
- if ($db->transaction)
+ if ($db->get_transaction())
{
$db->sql_transaction('rollback');
}
@@ -752,12 +752,16 @@ class module
break;
case 'select':
+ // @codingStandardsIgnoreStart
eval('$s_options = ' . str_replace('{VALUE}', $value, $options) . ';');
+ // @codingStandardsIgnoreEnd
$tpl = '<select id="' . $name . '" name="' . $name . '">' . $s_options . '</select>';
break;
case 'custom':
+ // @codingStandardsIgnoreStart
eval('$tpl = ' . str_replace('{VALUE}', $value, $options) . ';');
+ // @codingStandardsIgnoreEnd
break;
default:
diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php
index 674a1f7dd3..6109f5e28b 100644
--- a/phpBB/install/install_convert.php
+++ b/phpBB/install/install_convert.php
@@ -248,11 +248,10 @@ class install_convert extends module
));
}
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$db->sql_query('DELETE FROM ' . SESSIONS_KEYS_TABLE);
$db->sql_query('DELETE FROM ' . SESSIONS_TABLE);
break;
@@ -700,7 +699,6 @@ class install_convert extends module
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$convert->src_truncate_statement = 'DELETE FROM ';
break;
@@ -729,11 +727,10 @@ class install_convert extends module
$src_db->sql_query("SET NAMES 'binary'");
}
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$convert->truncate_statement = 'DELETE FROM ';
break;
@@ -1021,7 +1018,9 @@ class install_convert extends module
// Now process queries and execute functions that have to be executed prior to the conversion
if (!empty($convert->convertor['execute_first']))
{
+ // @codingStandardsIgnoreStart
eval($convert->convertor['execute_first']);
+ // @codingStandardsIgnoreEnd
}
if (!empty($convert->convertor['query_first']))
@@ -1091,7 +1090,9 @@ class install_convert extends module
// process execute_first and query_first for this table...
if (!empty($schema['execute_first']))
{
+ // @codingStandardsIgnoreStart
eval($schema['execute_first']);
+ // @codingStandardsIgnoreEnd
}
if (!empty($schema['query_first']))
@@ -1128,7 +1129,7 @@ class install_convert extends module
if (!empty($schema['autoincrement']))
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'postgres':
$db->sql_query("SELECT SETVAL('" . $schema['target'] . "_seq',(select case when max(" . $schema['autoincrement'] . ")>0 then max(" . $schema['autoincrement'] . ")+1 else 1 end from " . $schema['target'] . '));');
@@ -1156,7 +1157,9 @@ class install_convert extends module
// it gets split because of time restrictions
if (!empty($schema['execute_always']))
{
+ // @codingStandardsIgnoreStart
eval($schema['execute_always']);
+ // @codingStandardsIgnoreEnd
}
//
@@ -1265,7 +1268,7 @@ class install_convert extends module
if (!empty($schema['autoincrement']))
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mssql':
case 'mssql_odbc':
@@ -1298,7 +1301,7 @@ class install_convert extends module
if ($sql_flag === true)
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
// If MySQL, we'll wait to have num_wait_rows rows to submit at once
case 'mysql':
@@ -1393,7 +1396,7 @@ class install_convert extends module
if (!empty($schema['autoincrement']))
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'mssql':
case 'mssql_odbc':
@@ -1632,7 +1635,7 @@ class install_convert extends module
'RESULT' => $user->lang['DONE'],
));
- if ($db->sql_error_triggered)
+ if ($db->get_sql_error_triggered())
{
$template->assign_vars(array(
'S_ERROR_BOX' => true,
@@ -1667,13 +1670,17 @@ class install_convert extends module
{
if (!is_array($convert->convertor['execute_last']))
{
+ // @codingStandardsIgnoreStart
eval($convert->convertor['execute_last']);
+ // @codingStandardsIgnoreEnd
}
else
{
while ($last_statement < sizeof($convert->convertor['execute_last']))
{
+ // @codingStandardsIgnoreStart
eval($convert->convertor['execute_last'][$last_statement]);
+ // @codingStandardsIgnoreEnd
$template->assign_block_vars('checks', array(
'TITLE' => $convert->convertor['execute_last'][$last_statement],
@@ -1801,7 +1808,7 @@ class install_convert extends module
global $convert;
// Can we use IGNORE with this DBMS?
- $sql_ignore = (strpos($db->sql_layer, 'mysql') === 0 && !defined('DEBUG')) ? 'IGNORE ' : '';
+ $sql_ignore = (strpos($db->get_sql_layer(), 'mysql') === 0 && !defined('DEBUG')) ? 'IGNORE ' : '';
$insert_query = 'INSERT ' . $sql_ignore . 'INTO ' . $schema['target'] . ' (';
$aliases = array();
@@ -2035,7 +2042,9 @@ class install_convert extends module
$execution = str_replace('{RESULT}', '$value', $execution);
$execution = str_replace('{VALUE}', '$value', $execution);
+ // @codingStandardsIgnoreStart
eval($execution);
+ // @codingStandardsIgnoreEnd
}
}
}
@@ -2082,7 +2091,9 @@ class install_convert extends module
$execution = str_replace('{RESULT}', '$value', $execution);
$execution = str_replace('{VALUE}', '$value', $execution);
+ // @codingStandardsIgnoreStart
eval($execution);
+ // @codingStandardsIgnoreEnd
}
}
}
diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php
index 576cbba3ca..43fd6eaf07 100644
--- a/phpBB/install/install_install.php
+++ b/phpBB/install/install_install.php
@@ -1153,21 +1153,25 @@ class install_install extends module
// How should we treat this schema?
$delimiter = $available_dbms[$data['dbms']]['DELIM'];
- $sql_query = @file_get_contents($dbms_schema);
- $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query);
- $sql_query = phpbb_remove_comments($sql_query);
- $sql_query = split_sql_file($sql_query, $delimiter);
- foreach ($sql_query as $sql)
+ if (file_exists($dbms_schema))
{
- //$sql = trim(str_replace('|', ';', $sql));
- if (!$db->sql_query($sql))
+ $sql_query = @file_get_contents($dbms_schema);
+ $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query);
+ $sql_query = phpbb_remove_comments($sql_query);
+ $sql_query = split_sql_file($sql_query, $delimiter);
+
+ foreach ($sql_query as $sql)
{
- $error = $db->sql_error();
- $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__);
+ //$sql = trim(str_replace('|', ';', $sql));
+ if (!$db->sql_query($sql))
+ {
+ $error = $db->sql_error();
+ $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__);
+ }
}
+ unset($sql_query);
}
- unset($sql_query);
// Ok we have the db info go ahead and work on building the table
$db_table_schema = @file_get_contents('schemas/schema.json');
@@ -1528,10 +1532,10 @@ class install_install extends module
$_module->update_module_data($module_data, true);
// Check for last sql error happened
- if ($db->sql_error_triggered)
+ if ($db->get_sql_error_triggered())
{
- $error = $db->sql_error($db->sql_error_sql);
- $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
+ $error = $db->sql_error($db->get_sql_error_sql());
+ $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__);
}
$categories[$cat_name]['id'] = (int) $module_data['module_id'];
@@ -1562,10 +1566,10 @@ class install_install extends module
$_module->update_module_data($module_data, true);
// Check for last sql error happened
- if ($db->sql_error_triggered)
+ if ($db->get_sql_error_triggered())
{
- $error = $db->sql_error($db->sql_error_sql);
- $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
+ $error = $db->sql_error($db->get_sql_error_sql());
+ $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__);
}
$categories[$level2_name]['id'] = (int) $module_data['module_id'];
@@ -1602,10 +1606,10 @@ class install_install extends module
$_module->update_module_data($module_data, true);
// Check for last sql error happened
- if ($db->sql_error_triggered)
+ if ($db->get_sql_error_triggered())
{
- $error = $db->sql_error($db->sql_error_sql);
- $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
+ $error = $db->sql_error($db->get_sql_error_sql());
+ $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__);
}
}
}
@@ -1768,10 +1772,10 @@ class install_install extends module
$_module->update_module_data($module_data, true);
// Check for last sql error happened
- if ($db->sql_error_triggered)
+ if ($db->get_sql_error_triggered())
{
- $error = $db->sql_error($db->sql_error_sql);
- $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
+ $error = $db->sql_error($db->get_sql_error_sql());
+ $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__);
}
}
}
@@ -1820,10 +1824,10 @@ class install_install extends module
$db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $lang_pack));
$installed_languages[] = (int) $db->sql_nextid();
- if ($db->sql_error_triggered)
+ if ($db->get_sql_error_triggered())
{
- $error = $db->sql_error($db->sql_error_sql);
- $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__);
+ $error = $db->sql_error($db->get_sql_error_sql());
+ $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__);
}
}
}
@@ -1909,7 +1913,7 @@ class install_install extends module
if (!$user_id)
{
// If we can't insert this user then continue to the next one to avoid inconsistent data
- $this->p_master->db_error('Unable to insert bot into users table', $db->sql_error_sql, __LINE__, __FILE__, true);
+ $this->p_master->db_error('Unable to insert bot into users table', $db->get_sql_error_sql(), __LINE__, __FILE__, true);
continue;
}
diff --git a/phpBB/install/install_update.php b/phpBB/install/install_update.php
index ab5fcc3f2b..c6f771a7d5 100644
--- a/phpBB/install/install_update.php
+++ b/phpBB/install/install_update.php
@@ -396,7 +396,7 @@ class install_update extends module
'S_COLLECTED' => (int) $update_list['status'],
'S_TO_COLLECT' => sizeof($this->update_info['files']),
'L_IN_PROGRESS' => $user->lang['COLLECTING_FILE_DIFFS'],
- 'L_IN_PROGRESS_EXPLAIN' => sprintf($user->lang['NUMBER_OF_FILES_COLLECTED'], (int) $update_list['status'], sizeof($this->update_info['files'])),
+ 'L_IN_PROGRESS_EXPLAIN' => sprintf($user->lang['NUMBER_OF_FILES_COLLECTED'], (int) $update_list['status'], sizeof($this->update_info['files']) + sizeof($this->update_info['deleted'])),
));
return;
@@ -422,7 +422,7 @@ class install_update extends module
// Now assign the list to the template
foreach ($update_list as $status => $filelist)
{
- if ($status == 'no_update' || !sizeof($filelist) || $status == 'status')
+ if ($status == 'no_update' || !sizeof($filelist) || $status == 'status' || $status == 'status_deleted')
{
continue;
}
@@ -489,7 +489,7 @@ class install_update extends module
$all_up_to_date = true;
foreach ($update_list as $status => $filelist)
{
- if ($status != 'up_to_date' && $status != 'custom' && $status != 'status' && sizeof($filelist))
+ if ($status != 'up_to_date' && $status != 'custom' && $status != 'status' && $status != 'status_deleted' && sizeof($filelist))
{
$all_up_to_date = false;
break;
@@ -831,7 +831,7 @@ class install_update extends module
foreach ($update_list as $status => $files)
{
- if ($status == 'up_to_date' || $status == 'no_update' || $status == 'status')
+ if ($status == 'up_to_date' || $status == 'no_update' || $status == 'status' || $status == 'status_deleted')
{
continue;
}
@@ -1221,6 +1221,16 @@ class install_update extends module
$this->page_title = 'VIEWING_FILE_CONTENTS';
break;
+
+ case 'deleted':
+
+ $diff = $this->return_diff(array(), $phpbb_root_path . $original_file);
+
+ $template->assign_var('S_DIFF_NEW_FILE', true);
+ $diff_mode = 'inline';
+ $this->page_title = 'VIEWING_FILE_CONTENTS';
+
+ break;
}
$diff_mode_options = '';
@@ -1266,7 +1276,9 @@ class install_update extends module
'new_conflict' => array(),
'conflict' => array(),
'no_update' => array(),
+ 'deleted' => array(),
'status' => 0,
+ 'status_deleted'=> 0,
);
}
@@ -1345,7 +1357,31 @@ class install_update extends module
$update_list['status']++;
}
+ foreach ($this->update_info['deleted'] as $index => $file)
+ {
+ if (is_int($update_list['status_deleted']) && $index < $update_list['status_deleted'])
+ {
+ continue;
+ }
+
+ if ($num_bytes_processed >= 500 * 1024)
+ {
+ return;
+ }
+
+ if (file_exists($phpbb_root_path . $file))
+ {
+ $update_list['deleted'][] = array('filename' => $file, 'custom' => false, 'as_expected' => false);
+ $num_bytes_processed += filesize($phpbb_root_path . $file);
+ }
+
+ $update_list['status_deleted']++;
+ $update_list['status']++;
+ }
+
+ $update_list['status_deleted'] = -1;
$update_list['status'] = -1;
+
/* if (!sizeof($this->update_info['files']))
{
return $update_list;
diff --git a/phpBB/install/phpinfo.php b/phpBB/install/phpinfo.php
index 83f154933a..1512b00563 100644
--- a/phpBB/install/phpinfo.php
+++ b/phpBB/install/phpinfo.php
@@ -1,3 +1,14 @@
<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
phpinfo();
diff --git a/phpBB/install/schemas/firebird_schema.sql b/phpBB/install/schemas/firebird_schema.sql
deleted file mode 100644
index 28649dc54c..0000000000
--- a/phpBB/install/schemas/firebird_schema.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-# DO NOT EDIT THIS FILE, IT IS GENERATED
-#
-# To change the contents of this file, edit
-# phpBB/develop/create_schema_files.php and
-# run it.
diff --git a/phpBB/install/schemas/mssql_schema.sql b/phpBB/install/schemas/mssql_schema.sql
deleted file mode 100644
index f88513cf0e..0000000000
--- a/phpBB/install/schemas/mssql_schema.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- * DO NOT EDIT THIS FILE, IT IS GENERATED
- *
- * To change the contents of this file, edit
- * phpBB/develop/create_schema_files.php and
- * run it.
- */
-
diff --git a/phpBB/install/schemas/mysql_40_schema.sql b/phpBB/install/schemas/mysql_40_schema.sql
deleted file mode 100644
index 28649dc54c..0000000000
--- a/phpBB/install/schemas/mysql_40_schema.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-# DO NOT EDIT THIS FILE, IT IS GENERATED
-#
-# To change the contents of this file, edit
-# phpBB/develop/create_schema_files.php and
-# run it.
diff --git a/phpBB/install/schemas/mysql_41_schema.sql b/phpBB/install/schemas/mysql_41_schema.sql
deleted file mode 100644
index 28649dc54c..0000000000
--- a/phpBB/install/schemas/mysql_41_schema.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-# DO NOT EDIT THIS FILE, IT IS GENERATED
-#
-# To change the contents of this file, edit
-# phpBB/develop/create_schema_files.php and
-# run it.
diff --git a/phpBB/install/schemas/oracle_schema.sql b/phpBB/install/schemas/oracle_schema.sql
index 61f5d5f961..2473d31aab 100644
--- a/phpBB/install/schemas/oracle_schema.sql
+++ b/phpBB/install/schemas/oracle_schema.sql
@@ -1,12 +1,4 @@
/*
- * DO NOT EDIT THIS FILE, IT IS GENERATED
- *
- * To change the contents of this file, edit
- * phpBB/develop/create_schema_files.php and
- * run it.
- */
-
-/*
This first section is optional, however its probably the best method
of running phpBB on Oracle. If you already have a tablespace and user created
for phpBB you can leave this section commented out!
diff --git a/phpBB/install/schemas/postgres_schema.sql b/phpBB/install/schemas/postgres_schema.sql
index 3fc8589844..65caba8d1c 100644
--- a/phpBB/install/schemas/postgres_schema.sql
+++ b/phpBB/install/schemas/postgres_schema.sql
@@ -1,10 +1,3 @@
-/*
- * DO NOT EDIT THIS FILE, IT IS GENERATED
- *
- * To change the contents of this file, edit
- * phpBB/develop/create_schema_files.php and
- * run it.
- */
BEGIN;
diff --git a/phpBB/install/schemas/schema.json b/phpBB/install/schemas/schema.json
index 79f06693a6..a3ffd923a1 100644
--- a/phpBB/install/schemas/schema.json
+++ b/phpBB/install/schemas/schema.json
@@ -2088,6 +2088,26 @@
"UINT",
0
],
+ "pf_phpbb_skype": [
+ "VCHAR",
+ ""
+ ],
+ "pf_phpbb_twitter": [
+ "VCHAR",
+ ""
+ ],
+ "pf_phpbb_youtube": [
+ "VCHAR",
+ ""
+ ],
+ "pf_phpbb_facebook": [
+ "VCHAR",
+ ""
+ ],
+ "pf_phpbb_googleplus": [
+ "VCHAR",
+ ""
+ ],
"pf_phpbb_interests": [
"MTEXT",
""
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index 15cd9595c6..572720ff95 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -273,7 +273,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('tpl_allow_php', '0
INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_icons_path', 'images/upload_icons');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_path', 'files');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('use_system_cron', '0');
-INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.1.0-b5-dev');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.1.0-RC2-dev');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400');
@@ -806,6 +806,11 @@ INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_len
INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_icq', 'profilefields.type.string', 'phpbb_icq', '20', '3', '15', '', '', '[0-9]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 6, 1, 'SEND_ICQ_MESSAGE', 'https://www.icq.com/people/%s/');
INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_wlm', 'profilefields.type.string', 'phpbb_wlm', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 7, 1, '', '');
INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_yahoo', 'profilefields.type.string', 'phpbb_yahoo', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 8, 1, 'SEND_YIM_MESSAGE', 'http://edit.yahoo.com/config/send_webmesg?.target=%s&amp;.src=pg');
+INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_facebook', 'profilefields.type.string', 'phpbb_facebook', '20', '5', '50', '', '', '[\w.]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 9, 1, 'VIEW_FACEBOOK_PROFILE', 'http://facebook.com/%s/');
+INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_twitter', 'profilefields.type.string', 'phpbb_twitter', '20', '1', '15', '', '', '[\w_]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 10, 1, 'VIEW_TWITTER_PROFILE', 'http://twitter.com/%s');
+INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_skype', 'profilefields.type.string', 'phpbb_skype', '20', '6', '32', '', '', '[a-zA-Z][\w\.,\-_]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 11, 1, 'VIEW_SKYPE_PROFILE', 'skype:%s?userinfo');
+INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_youtube', 'profilefields.type.string', 'phpbb_youtube', '20', '3', '60', '', '', '[a-zA-Z][\w\.,\-_]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 12, 1, 'VIEW_YOUTUBE_CHANNEL', 'http://youtube.com/user/%s');
+INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_googleplus', 'profilefields.type.googleplus', 'phpbb_googleplus', '20', '3', '255', '', '', '[\w]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 13, 1, 'VIEW_GOOGLEPLUS_PROFILE', 'http://plus.google.com/%s');
# User Notification Options (for first user)
INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('post', 0, 2, '');
diff --git a/phpBB/install/schemas/sqlite_schema.sql b/phpBB/install/schemas/sqlite_schema.sql
deleted file mode 100644
index 28649dc54c..0000000000
--- a/phpBB/install/schemas/sqlite_schema.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-# DO NOT EDIT THIS FILE, IT IS GENERATED
-#
-# To change the contents of this file, edit
-# phpBB/develop/create_schema_files.php and
-# run it.
diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php
index 638e9907ac..d451bdd515 100644
--- a/phpBB/language/en/acp/board.php
+++ b/phpBB/language/en/acp/board.php
@@ -524,8 +524,8 @@ $lang = array_merge($lang, array(
'PASS_TYPE_SYMBOL' => 'Must contain symbols',
'REF_HOST' => 'Only validate host',
'REF_PATH' => 'Also validate path',
- 'REFERER_VALID' => 'Validate Referer',
- 'REFERER_VALID_EXPLAIN' => 'If enabled, the referer of POST requests will be checked against the host/script path settings. This may cause issues with boards using several domains and or external logins.',
+ 'REFERRER_VALID' => 'Validate Referrer',
+ 'REFERRER_VALID_EXPLAIN' => 'If enabled, the referrer of POST requests will be checked against the host/script path settings. This may cause issues with boards using several domains and or external logins.',
'TPL_ALLOW_PHP' => 'Allow php in templates',
'TPL_ALLOW_PHP_EXPLAIN' => 'If this option is enabled, <code>PHP</code> and <code>INCLUDEPHP</code> statements will be recognised and parsed in templates.',
));
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index 8470014161..b374e39367 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -702,7 +702,7 @@ $lang = array_merge($lang, array(
'LOG_REASON_REMOVED' => '<strong>Removed report/denial reason</strong><br />» %s',
'LOG_REASON_UPDATED' => '<strong>Updated report/denial reason</strong><br />» %s',
- 'LOG_REFERER_INVALID' => '<strong>Referer validation failed</strong><br />»Referer was “<em>%1$s</em>”. The request was rejected and the session killed.',
+ 'LOG_REFERER_INVALID' => '<strong>Referrer validation failed</strong><br />»Referrer was “<em>%1$s</em>”. The request was rejected and the session killed.',
'LOG_RESET_DATE' => '<strong>Board start date reset</strong>',
'LOG_RESET_ONLINE' => '<strong>Most users online reset</strong>',
'LOG_RESYNC_FILES_STATS' => '<strong>File statistics resynchronised</strong>',
diff --git a/phpBB/language/en/acp/forums.php b/phpBB/language/en/acp/forums.php
index b4f0f060e9..541d05c255 100644
--- a/phpBB/language/en/acp/forums.php
+++ b/phpBB/language/en/acp/forums.php
@@ -44,6 +44,10 @@ $lang = array_merge($lang, array(
'AUTO_PRUNE_FREQ_EXPLAIN' => 'Time in days between pruning events.',
'AUTO_PRUNE_VIEWED' => 'Auto-prune post viewed age',
'AUTO_PRUNE_VIEWED_EXPLAIN' => 'Number of days since topic was viewed after which topic is removed.',
+ 'AUTO_PRUNE_SHADOW_FREQ' => 'Auto-prune shadow topics frequency',
+ 'AUTO_PRUNE_SHADOW_DAYS' => 'Auto-prune shadow topics age',
+ 'AUTO_PRUNE_SHADOW_DAYS_EXPLAIN' => 'Number of days after which shadow topic is removed.',
+ 'AUTO_PRUNE_SHADOW_FREQ_EXPLAIN' => 'Time in days between pruning events.',
'CONTINUE' => 'Continue',
'COPY_PERMISSIONS' => 'Copy permissions from',
diff --git a/phpBB/language/en/acp/profile.php b/phpBB/language/en/acp/profile.php
index 7336031218..67813bcba4 100644
--- a/phpBB/language/en/acp/profile.php
+++ b/phpBB/language/en/acp/profile.php
@@ -39,9 +39,11 @@ if (empty($lang) || !is_array($lang))
// Custom profile fields
$lang = array_merge($lang, array(
'ADDED_PROFILE_FIELD' => 'Successfully added custom profile field.',
+ 'ALPHA_DOTS' => 'Alphanumeric and dots (periods)',
'ALPHA_ONLY' => 'Alphanumeric only',
'ALPHA_SPACERS' => 'Alphanumeric and spacers',
'ALPHA_UNDERSCORE' => 'Alphanumeric and underscores',
+ 'ALPHA_PUNCTUATION' => 'Alphanumeric with comma, dots, underscore and dashes beginning with a letter',
'ALWAYS_TODAY' => 'Always the current date',
'BOOL_ENTRIES_EXPLAIN' => 'Enter your options now',
@@ -91,6 +93,7 @@ $lang = array_merge($lang, array(
'FIELD_DESCRIPTION' => 'Field description',
'FIELD_DESCRIPTION_EXPLAIN' => 'The explanation for this field presented to the user.',
'FIELD_DROPDOWN' => 'Dropdown box',
+ 'FIELD_GOOGLEPLUS' => 'Google+',
'FIELD_IDENT' => 'Field identification',
'FIELD_IDENT_ALREADY_EXIST' => 'The chosen field identification already exist. Please choose another name.',
'FIELD_IDENT_EXPLAIN' => 'The field identification is a name to identify the profile field within the database and the templates.',
diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php
index f5bec89c2f..564d9dd04c 100644
--- a/phpBB/language/en/acp/search.php
+++ b/phpBB/language/en/acp/search.php
@@ -60,7 +60,6 @@ $lang = array_merge($lang, array(
'FULLTEXT_MYSQL_MAX_SEARCH_CHARS_EXPLAIN' => 'Words with no more than this many characters will be indexed for searching. You or your host can only change this setting by changing the mysql configuration.',
'FULLTEXT_POSTGRES_INCOMPATIBLE_DATABASE' => 'The PostgreSQL fulltext backend can only be used with PostgreSQL.',
- 'FULLTEXT_POSTGRES_TS_NOT_USABLE' => 'The PostgreSQL fulltext backend can only be used with PostgreSQL 8.3 and above.',
'FULLTEXT_POSTGRES_TOTAL_POSTS' => 'Total number of indexed posts',
'FULLTEXT_POSTGRES_VERSION_CHECK' => 'PostgreSQL version',
'FULLTEXT_POSTGRES_TS_NAME' => 'Text search Configuration Profile:',
diff --git a/phpBB/language/en/acp/styles.php b/phpBB/language/en/acp/styles.php
index c2a3f777c2..506d569d56 100644
--- a/phpBB/language/en/acp/styles.php
+++ b/phpBB/language/en/acp/styles.php
@@ -71,8 +71,8 @@ $lang = array_merge($lang, array(
'STYLE_ERR_NAME_EXIST' => 'A style with that name already exists.',
'STYLE_ERR_STYLE_NAME' => 'You must supply a name for this style.',
'STYLE_INSTALLED' => 'Style "%s" has been installed.',
- 'STYLE_INSTALLED_RETURN_STYLES' => '<a href="%s">Click here</a> to return to installed styles list.',
- 'STYLE_INSTALLED_RETURN_UNINSTALLED' => '<a href="%s">Click here</a> to install more styles.',
+ 'STYLE_INSTALLED_RETURN_INSTALLED_STYLES' => 'Return to installed styles list',
+ 'STYLE_INSTALLED_RETURN_UNINSTALLED_STYLES' => 'Install more styles',
'STYLE_NAME' => 'Style name',
'STYLE_NOT_INSTALLED' => 'Style "%s" was not installed.',
'STYLE_PATH' => 'Style path',
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index 9a44337294..dbef16c5f2 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -64,7 +64,7 @@ $lang = array_merge($lang, array(
'ACCOUNT_DEACTIVATED' => 'Your account has been manually deactivated and is only able to be reactivated by an administrator.',
'ACCOUNT_NOT_ACTIVATED' => 'Your account has not been activated yet.',
'ACP' => 'Administration Control Panel',
- 'ACP_SHORT' => 'Administer',
+ 'ACP_SHORT' => 'ACP',
'ACTIVE' => 'active',
'ACTIVE_ERROR' => 'The specified username is currently inactive. If you have problems activating your account, please contact a board administrator.',
'ADMINISTRATOR' => 'Administrator',
@@ -109,6 +109,7 @@ $lang = array_merge($lang, array(
'AVATAR_PARTIAL_UPLOAD' => 'The specified file was only partially uploaded.',
'AVATAR_PHP_SIZE_NA' => 'The avatar’s filesize is too large.<br />The maximum allowed filesize set in php.ini could not be determined.',
'AVATAR_PHP_SIZE_OVERRUN' => 'The avatar’s filesize is too large. The maximum allowed upload size is %1$d %2$s.<br />Please note this is set in php.ini and cannot be overridden.',
+ 'AVATAR_REMOTE_UPLOAD_TIMEOUT' => 'The specified avatar could not be uploaded because the request timed out.',
'AVATAR_URL_INVALID' => 'The URL you specified is invalid.',
'AVATAR_URL_NOT_FOUND' => 'The file specified could not be found.',
'AVATAR_WRONG_FILESIZE' => 'The avatar’s filesize must be between 0 and %1$d %2$s.',
@@ -226,6 +227,7 @@ $lang = array_merge($lang, array(
'EXTENSION_DISABLED_AFTER_POSTING' => 'The extension <strong>%s</strong> has been deactivated and can no longer be displayed.',
'EXTENSION_DOES_NOT_EXIST' => 'The extension <strong>%s</strong> does not exist.',
+ 'FACEBOOK' => 'Facebook',
'FAQ' => 'FAQ',
'FAQ_EXPLAIN' => 'Frequently Asked Questions',
'FILENAME' => 'Filename',
@@ -283,6 +285,7 @@ $lang = array_merge($lang, array(
'GB' => 'GB',
'GIB' => 'GiB',
'GO' => 'Go',
+ 'GOOGLEPLUS' => 'Google+',
'GOTO_FIRST_POST' => 'Go to first post',
'GOTO_LAST_POST' => 'Go to last post',
'GOTO_PAGE' => 'Go to page',
@@ -390,7 +393,7 @@ $lang = array_merge($lang, array(
'MB' => 'MB',
'MIB' => 'MiB',
'MCP' => 'Moderator Control Panel',
- 'MCP_SHORT' => 'Moderate',
+ 'MCP_SHORT' => 'MCP',
'MEMBERLIST' => 'Members',
'MEMBERLIST_EXPLAIN' => 'View complete list of members',
'MERGE' => 'Merge',
@@ -440,29 +443,32 @@ $lang = array_merge($lang, array(
// A, B, C and 2 others replied...
// A, B, C and others replied...
'NOTIFICATION_BOOKMARK' => array(
- 1 => '%1$s replied to the topic “%2$s” you have bookmarked.',
+ 1 => '<strong>Reply</strong> from %1$s in bookmarked topic:',
),
- 'NOTIFICATION_GROUP_REQUEST' => '%1$s is requesting to join the group %2$s.',
- 'NOTIFICATION_GROUP_REQUEST_APPROVED' => 'Your request to join the group %1$s has been approved.',
- 'NOTIFICATION_PM' => '%1$s sent you a Private Message "%2$s".',
+ 'NOTIFICATION_FORUM' => '<em>Forum:</em> %1$s',
+ 'NOTIFICATION_GROUP_REQUEST' => '<strong>Group request</strong> from %1$s to join the group %2$s.',
+ 'NOTIFICATION_GROUP_REQUEST_APPROVED' => '<strong>Group request approved</strong> to join the group %1$s.',
+ 'NOTIFICATION_PM' => '<strong>Private Message</strong> from %1$s:',
'NOTIFICATION_POST' => array(
- 1 => '%1$s replied to the topic “%2$s”.',
+ 1 => '<strong>Reply</strong> from %1$s in topic:',
),
- 'NOTIFICATION_POST_APPROVED' => 'Your post was approved "%2$s".',
- 'NOTIFICATION_POST_DISAPPROVED' => 'Your post "%1$s" was disapproved for reason: "%2$s".',
- 'NOTIFICATION_POST_IN_QUEUE' => 'A new post titled "%2$s" was posted by %1$s and needs approval.',
+ 'NOTIFICATION_POST_APPROVED' => '<strong>Post approved</strong>:',
+ 'NOTIFICATION_POST_DISAPPROVED' => '<strong>Post disapproved</strong>:',
+ 'NOTIFICATION_POST_IN_QUEUE' => '<strong>Post approval</strong> request by %1$s:',
'NOTIFICATION_QUOTE' => array(
- 1 => '%1$s quoted you in the post “%2$s”.',
+ 1 => '<strong>Quoted</strong> by %1$s in:',
),
- 'NOTIFICATION_REPORT_PM' => '%1$s reported a Private Message "%2$s" for reason: "%3$s".',
- 'NOTIFICATION_REPORT_POST' => '%1$s reported a post "%2$s" for reason: "%3$s".',
- 'NOTIFICATION_REPORT_CLOSED' => '%1$s closed the report you made for "%2$s".',
- 'NOTIFICATION_TOPIC' => '%1$s posted a new topic "%2$s" in the forum "%3$s".',
- 'NOTIFICATION_TOPIC_APPROVED' => 'Your topic "%2$s" in the forum "%3$s" was approved.',
- 'NOTIFICATION_TOPIC_DISAPPROVED' => 'Your topic "%1$s" was disapproved for reason: "%2$s".',
- 'NOTIFICATION_TOPIC_IN_QUEUE' => 'A new topic titled "%2$s" was posted by %1$s and needs approval.',
+ 'NOTIFICATION_REFERENCE' => '"%1$s"',
+ 'NOTIFICATION_REASON' => '<em>Reason:</em> %1$s.',
+ 'NOTIFICATION_REPORT_PM' => '<strong>Private Message reported</strong> by %1$s:',
+ 'NOTIFICATION_REPORT_POST' => '<strong>Post reported</strong> by %1$s:',
+ 'NOTIFICATION_REPORT_CLOSED' => '<strong>Report closed</strong> by %1$s for:',
+ 'NOTIFICATION_TOPIC' => '<strong>New topic</strong> by %1$s:',
+ 'NOTIFICATION_TOPIC_APPROVED' => '<strong>Topic approved</strong>:',
+ 'NOTIFICATION_TOPIC_DISAPPROVED' => '<strong>Topic disapproved</strong>:',
+ 'NOTIFICATION_TOPIC_IN_QUEUE' => '<strong>Topic approval</strong> request by %1$s:',
'NOTIFICATION_TYPE_NOT_EXIST' => 'The notification type "%s" is missing from the file system.',
- 'NOTIFICATION_ADMIN_ACTIVATE_USER' => 'The user “%1$s” is newly registered and requires activation.',
+ 'NOTIFICATION_ADMIN_ACTIVATE_USER' => '<strong>Activation required</strong> for newly registered user: “%1$s”',
// Used in conjuction with NOTIFICATION_BOOKMARK and NOTIFICATION_POST.
'NOTIFICATION_MANY_OTHERS' => 'others',
'NOTIFICATION_X_OTHERS' => array(
@@ -558,6 +564,7 @@ $lang = array_merge($lang, array(
'POSTED_ON_DATE' => 'on',
'POSTS' => 'Posts',
'POSTS_UNAPPROVED' => 'At least one post in this topic has not been approved.',
+ 'POSTS_UNAPPROVED_FORUM'=> 'At least one post in this forum has not been approved.',
'POST_BY_AUTHOR' => 'by',
'POST_BY_FOE' => '<strong>%1$s</strong>, who is currently on your ignore list, made this post.',
'POST_DISPLAY' => '%1$sDisplay this post%2$s.',
@@ -588,6 +595,8 @@ $lang = array_merge($lang, array(
'PRIVATE_MESSAGING' => 'Private messaging',
'PROFILE' => 'User Control Panel',
+ 'QUICK_LINKS' => 'Quick links',
+
'RANK' => 'Rank',
'READING_FORUM' => 'Viewing topics in %s',
'READING_GLOBAL_ANNOUNCE' => 'Reading global announcement',
@@ -654,15 +663,15 @@ $lang = array_merge($lang, array(
'SEARCH_ADV_EXPLAIN' => 'View the advanced search options',
'SEARCH_KEYWORDS' => 'Search for keywords',
'SEARCHING_FORUMS' => 'Searching forums',
- 'SEARCH_ACTIVE_TOPICS' => 'View active topics',
+ 'SEARCH_ACTIVE_TOPICS' => 'Active topics',
'SEARCH_FOR' => 'Search for',
'SEARCH_FORUM' => 'Search this forum…',
- 'SEARCH_NEW' => 'View new posts',
+ 'SEARCH_NEW' => 'New posts',
'SEARCH_POSTS_BY' => 'Search posts by',
- 'SEARCH_SELF' => 'View your posts',
+ 'SEARCH_SELF' => 'Your posts',
'SEARCH_TOPIC' => 'Search this topic…',
- 'SEARCH_UNANSWERED' => 'View unanswered posts',
- 'SEARCH_UNREAD' => 'View unread posts',
+ 'SEARCH_UNANSWERED' => 'Unanswered posts',
+ 'SEARCH_UNREAD' => 'Unread posts',
'SEARCH_USER_POSTS' => 'Search user’s posts',
'SECONDS' => 'Seconds',
'SEE_ALL' => 'See All',
@@ -676,6 +685,7 @@ $lang = array_merge($lang, array(
'SETTINGS' => 'Settings',
'SIGNATURE' => 'Signature',
'SKIP' => 'Skip to content',
+ 'SKYPE' => 'Skype',
'SMTP_NO_AUTH_SUPPORT' => 'SMTP server does not support authentication.',
'SORRY_AUTH_READ' => 'You are not authorised to read this forum.',
'SORRY_AUTH_VIEW_ATTACH' => 'You are not authorised to download this attachment.',
@@ -771,6 +781,7 @@ $lang = array_merge($lang, array(
2 => 'Total members <strong>%d</strong>',
),
'TRACKED_PHP_ERROR' => 'Tracked PHP errors: %s',
+ 'TWITTER' => 'Twitter',
'UNABLE_GET_IMAGE_SIZE' => 'It was not possible to determine the dimensions of the image. Please verify that the URL you entered is correct.',
'UNABLE_TO_DELIVER_FILE'=> 'Unable to deliver file.',
@@ -857,6 +868,7 @@ $lang = array_merge($lang, array(
'WROTE' => 'wrote',
'YAHOO' => 'Yahoo Messenger',
+ 'YOUTUBE' => 'YouTube',
'YEAR' => 'Year',
'YEAR_MONTH_DAY' => '(YYYY-MM-DD)',
'YES' => 'Yes',
diff --git a/phpBB/language/en/help_faq.php b/phpBB/language/en/help_faq.php
index 102dffcd5b..904dc92080 100644
--- a/phpBB/language/en/help_faq.php
+++ b/phpBB/language/en/help_faq.php
@@ -121,7 +121,7 @@ $help = array(
),
array(
0 => 'How do I add a signature to my post?',
- 1 => 'To add a signature to a post you must first create one via your User Control Panel. Once created, you can check the <em>Attach a signature</em> box on the posting form to add your signature. You can also add a signature by default to all your posts by checking the appropriate radio button in your profile. If you do so, you can still prevent a signature being added to individual posts by un-checking the add signature box within the posting form.'
+ 1 => 'To add a signature to a post you must first create one via your User Control Panel. Once created, you can check the <em>Attach a signature</em> box on the posting form to add your signature. You can also add a signature by default to all your posts by checking the appropriate radio button in the User Control Panel. If you do so, you can still prevent a signature being added to individual posts by un-checking the add signature box within the posting form.'
),
array(
0 => 'How do I create a poll?',
@@ -153,7 +153,7 @@ $help = array(
),
array(
0 => 'What is the “Save” button for in topic posting?',
- 1 => 'This allows you to save passages to be completed and submitted at a later date. To reload a saved passage, visit the User Control Panel.'
+ 1 => 'This allows you to save drafts to be completed and submitted at a later date. To reload a saved draft, visit the User Control Panel.'
),
array(
0 => 'Why does my post need to be approved?',
@@ -254,7 +254,7 @@ $help = array(
),
array(
0 => 'I keep getting unwanted private messages!',
- 1 => 'You can block a user from sending you private messages by using message rules within your User Control Panel. If you are receiving abusive private messages from a particular user, inform a board administrator; they have the power to prevent a user from sending private messages.'
+ 1 => 'You can automatically delete private messages from a user by using message rules within your User Control Panel. If you are receiving abusive private messages from a particular user, report the messages to the moderators; they have the power to prevent a user from sending private messages.'
),
array(
0 => 'I have received a spamming or abusive email from someone on this board!',
diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php
index 7235e51a94..65448e3299 100644
--- a/phpBB/language/en/install.php
+++ b/phpBB/language/en/install.php
@@ -142,7 +142,6 @@ $lang = array_merge($lang, array(
'DEV_NO_TEST_FILE' => 'No value has been specified for the test_file variable in the convertor. If you are a user of this convertor, you should not be seeing this error, please report this message to the convertor author. If you are a convertor author, you must specify the name of a file which exists in the source board to allow the path to it to be verified.',
'DIRECTORIES_AND_FILES' => 'Directory and file setup',
'DISABLE_KEYS' => 'Disabling keys',
- 'DLL_FIREBIRD' => 'Firebird',
'DLL_FTP' => 'Remote FTP support [ Installation ]',
'DLL_GD' => 'GD graphics support [ Visual Confirmation ]',
'DLL_MBSTRING' => 'Multi-byte character support',
@@ -171,8 +170,6 @@ $lang = array_merge($lang, array(
'FILLING_TABLE' => 'Filling table <strong>%s</strong>',
'FILLING_TABLES' => 'Filling tables',
- 'FIREBIRD_DBMS_UPDATE_REQUIRED' => 'phpBB no longer supports Firebird/Interbase prior to Version 2.1. Please update your Firebird installation to at least 2.1.0 before proceeding with the update.',
-
'FINAL_STEP' => 'Process final step',
'FORUM_ADDRESS' => 'Board address',
'FORUM_ADDRESS_EXPLAIN' => 'This is the URL of your former board, for example <samp>http://www.example.com/phpBB2/</samp>. If an address is entered here and not left empty every instance of this address will be replaced by your new board address within messages, private messages and signatures.',
@@ -216,7 +213,6 @@ $lang = array_merge($lang, array(
<li>PostgreSQL 8.3+</li>
<li>SQLite 2.8.2+</li>
<li>SQLite 3.6.15+</li>
- <li>Firebird 2.1+</li>
<li>MS SQL Server 2000 or above (directly or via ODBC)</li>
<li>MS SQL Server 2005 or above (native)</li>
<li>Oracle</li>
@@ -241,8 +237,6 @@ $lang = array_merge($lang, array(
'INST_ERR_DB_NO_SQLITE' => 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 2.8.2.',
'INST_ERR_DB_NO_SQLITE3' => 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 3.6.15.',
'INST_ERR_DB_NO_ORACLE' => 'The version of Oracle installed on this machine requires you to set the <var>NLS_CHARACTERSET</var> parameter to <var>UTF8</var>. Either upgrade your installation to 9.2+ or change the parameter.',
- 'INST_ERR_DB_NO_FIREBIRD' => 'The version of Firebird installed on this machine is older than 2.1, please upgrade to a newer version.',
- 'INST_ERR_DB_NO_FIREBIRD_PS'=> 'The database you selected for Firebird has a page size less than 8192, it must be at least 8192.',
'INST_ERR_DB_NO_POSTGRES' => 'The database you have selected was not created in <var>UNICODE</var> or <var>UTF8</var> encoding. Try installing with a database in <var>UNICODE</var> or <var>UTF8</var> encoding.',
'INST_ERR_DB_NO_NAME' => 'No database name specified.',
'INST_ERR_EMAIL_INVALID' => 'The email address you entered is invalid.',
@@ -351,7 +345,7 @@ $lang = array_merge($lang, array(
'SUB_LICENSE' => 'License',
'SUB_SUPPORT' => 'Support',
'SUCCESSFUL_CONNECT' => 'Successful connection',
- 'SUPPORT_BODY' => 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=65">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>MODs / Styles</h2><p>For issues relating to MODs, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=81">Modifications Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=80">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&amp;t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/documentation/3.0/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />',
+ 'SUPPORT_BODY' => 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&amp;t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/documentation/3.1/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />',
'SYNC_FORUMS' => 'Starting to synchronise forums',
'SYNC_POST_COUNT' => 'Synchronising post_counts',
'SYNC_POST_COUNT_ID' => 'Synchronising post_counts from <var>entry</var> %1$s to %2$s.',
@@ -433,6 +427,8 @@ $lang = array_merge($lang, array(
'FILE_USED' => 'Information used from', // Single file
'FILES_CONFLICT' => 'Conflict files',
'FILES_CONFLICT_EXPLAIN' => 'The following files are modified and do not represent the original files from the old version. phpBB determined that these files create conflicts if they are tried to be merged. Please investigate the conflicts and try to manually resolve them or continue the update choosing the preferred merging method. If you resolve the conflicts manually check the files again after you modified them. You are also able to choose between the preferred merge method for every file. The first one will result in a file where the conflicting lines from your old file will be lost, the other one will result in losing the changes from the newer file.',
+ 'FILES_DELETED' => 'Deleted files',
+ 'FILES_DELETED_EXPLAIN' => 'The following files do not exist in the new version. These files have to be deleted from your installation.',
'FILES_MODIFIED' => 'Modified files',
'FILES_MODIFIED_EXPLAIN' => 'The following files are modified and do not represent the original files from the old version. The updated file will be a merge between your modifications and the new file.',
'FILES_NEW' => 'New files',
@@ -503,6 +499,7 @@ $lang = array_merge($lang, array(
'SELECT_DOWNLOAD_FORMAT' => 'Select download archive format',
'SELECT_FTP_SETTINGS' => 'Select FTP settings',
'SHOW_DIFF_CONFLICT' => 'Show differences/conflicts',
+ 'SHOW_DIFF_DELETED' => 'Show file contents',
'SHOW_DIFF_FINAL' => 'Show resulting file',
'SHOW_DIFF_MODIFIED' => 'Show merged differences',
'SHOW_DIFF_NEW' => 'Show file contents',
@@ -516,6 +513,7 @@ $lang = array_merge($lang, array(
'STAGE_UPDATE_FILES' => 'Update files',
'STAGE_VERSION_CHECK' => 'Version check',
'STATUS_CONFLICT' => 'Modified file producing conflicts',
+ 'STATUS_DELETED' => 'Deleted file',
'STATUS_MODIFIED' => 'Modified file',
'STATUS_NEW' => 'New file',
'STATUS_NEW_CONFLICT' => 'Conflicting new file',
diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php
index d900ababd1..c1bb25e7fb 100644
--- a/phpBB/language/en/memberlist.php
+++ b/phpBB/language/en/memberlist.php
@@ -49,7 +49,6 @@ $lang = array_merge($lang, array(
'BEFORE' => 'Before',
'CC_EMAIL' => 'Send a copy of this email to yourself.',
- 'CONTACT_USER' => 'Contact',
'CONTACT_ADMIN' => 'Contact a Board Administrator',
'DEST_LANG' => 'Language',
@@ -144,4 +143,9 @@ $lang = array_merge($lang, array(
'USERS_PER_PAGE' => 'Users per page',
'VIEWING_PROFILE' => 'Viewing profile - %s',
+ 'VIEW_FACEBOOK_PROFILE' => 'View Facebook Profile',
+ 'VIEW_SKYPE_PROFILE' => 'View Skype Profile',
+ 'VIEW_TWITTER_PROFILE' => 'View Twitter Profile',
+ 'VIEW_YOUTUBE_CHANNEL' => 'View YouTube Channel',
+ 'VIEW_GOOGLEPLUS_PROFILE' => 'View Google+ Profile',
));
diff --git a/phpBB/language/en/plupload.php b/phpBB/language/en/plupload.php
index c4a8d770a0..15c3955a1a 100644
--- a/phpBB/language/en/plupload.php
+++ b/phpBB/language/en/plupload.php
@@ -3,8 +3,8 @@
*
* This file is part of the phpBB Forum Software package.
*
-* @copyright (c) 2010-2013 Moxiecode Systems AB
* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @copyright (c) 2010-2013 Moxiecode Systems AB
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php
index 20377287fd..31d49e8bdf 100644
--- a/phpBB/language/en/posting.php
+++ b/phpBB/language/en/posting.php
@@ -225,6 +225,7 @@ $lang = array_merge($lang, array(
),
'QUOTE_NO_NESTING' => 'You may not embed quotes within each other.',
+ 'REMOTE_UPLOAD_TIMEOUT' => 'The specified file could not be uploaded because the request timed out.',
'SAVE' => 'Save',
'SAVE_DATE' => 'Saved at',
'SAVE_DRAFT' => 'Save draft',
@@ -256,6 +257,8 @@ $lang = array_merge($lang, array(
'UNAUTHORISED_BBCODE' => 'You cannot use certain BBCodes: %s.',
'UNGLOBALISE_EXPLAIN' => 'To switch this topic back from being global to a normal topic, you need to select the forum you wish this topic to be displayed.',
+ 'UNSUPPORTED_CHARACTERS_MESSAGE' => 'Your message contains the following unsupported characters:<br />%s',
+ 'UNSUPPORTED_CHARACTERS_SUBJECT' => 'Your subject contains the following unsupported characters:<br />%s',
'UPDATE_COMMENT' => 'Update comment',
'URL_INVALID' => 'The URL you specified is invalid.',
'URL_NOT_FOUND' => 'The file specified could not be found.',
diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php
index c3ace160e9..c4328aa3a6 100644
--- a/phpBB/language/en/ucp.php
+++ b/phpBB/language/en/ucp.php
@@ -209,7 +209,9 @@ $lang = array_merge($lang, array(
'FIELD_TOO_LARGE' => 'The value of “%2$s” is too large, a maximum value of %1$d is allowed.',
'FIELD_INVALID_CHARS_INVALID' => 'The field “%s” has invalid characters.',
'FIELD_INVALID_CHARS_NUMBERS_ONLY' => 'The field “%s” has invalid characters, only numbers are allowed.',
+ 'FIELD_INVALID_CHARS_ALPHA_DOTS' => 'The field “%s” has invalid characters, only alphanumeric or . characters are allowed.',
'FIELD_INVALID_CHARS_ALPHA_ONLY' => 'The field “%s” has invalid characters, only alphanumeric characters are allowed.',
+ 'FIELD_INVALID_CHARS_ALPHA_PUNCTUATION' => 'The field “%s” has invalid characters, only alphanumeric or _,-. characters are allowed and the first character must be alphabetic.',
'FIELD_INVALID_CHARS_ALPHA_SPACERS' => 'The field “%s” has invalid characters, only alphanumeric, space or -+_[] characters are allowed.',
'FIELD_INVALID_CHARS_ALPHA_UNDERSCORE' => 'The field “%s” has invalid characters, only alphanumeric or _ characters are allowed.',
'FIELD_INVALID_DATE' => 'The field “%s” has an invalid date.',
@@ -357,6 +359,7 @@ $lang = array_merge($lang, array(
),
'NO_ACTION_MODE' => 'No message action specified.',
'NO_AUTHOR' => 'No author defined for this message',
+ 'NO_AVATAR' => 'No avatar selected',
'NO_AVATAR_CATEGORY' => 'None',
'NO_AUTH_DELETE_MESSAGE' => 'You are not authorised to delete private messages.',
diff --git a/phpBB/mcp.php b/phpBB/mcp.php
index 9354eef8fd..25765b1af7 100644
--- a/phpBB/mcp.php
+++ b/phpBB/mcp.php
@@ -19,6 +19,7 @@ $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
+include($phpbb_root_path . 'includes/functions_mcp.' . $phpEx);
require($phpbb_root_path . 'includes/functions_module.' . $phpEx);
// Start session management
@@ -117,7 +118,7 @@ if (!$auth->acl_getf_global('m_'))
$allow_user = false;
if ($quickmod && isset($user_quickmod_actions[$action]) && $user->data['is_registered'] && $auth->acl_gets($user_quickmod_actions[$action], $forum_id))
{
- $topic_info = get_topic_data(array($topic_id));
+ $topic_info = phpbb_get_topic_data(array($topic_id));
if ($topic_info[$topic_id]['topic_poster'] == $user->data['user_id'])
{
$allow_user = true;
@@ -299,649 +300,3 @@ $template->assign_vars(array(
// Generate the page, do not display/query online list
$module->display($module->get_page_title());
-
-/**
-* Functions used to generate additional URL paramters
-*/
-function _module__url($mode, &$module_row)
-{
- return extra_url();
-}
-
-function _module_notes_url($mode, &$module_row)
-{
- if ($mode == 'front')
- {
- return '';
- }
-
- global $user_id;
- return ($user_id) ? "&amp;u=$user_id" : '';
-}
-
-function _module_warn_url($mode, &$module_row)
-{
- if ($mode == 'front' || $mode == 'list')
- {
- global $forum_id;
-
- return ($forum_id) ? "&amp;f=$forum_id" : '';
- }
-
- if ($mode == 'warn_post')
- {
- global $forum_id, $post_id;
-
- $url_extra = ($forum_id) ? "&amp;f=$forum_id" : '';
- $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
-
- return $url_extra;
- }
- else
- {
- global $user_id;
-
- return ($user_id) ? "&amp;u=$user_id" : '';
- }
-}
-
-function _module_main_url($mode, &$module_row)
-{
- return extra_url();
-}
-
-function _module_logs_url($mode, &$module_row)
-{
- return extra_url();
-}
-
-function _module_ban_url($mode, &$module_row)
-{
- return extra_url();
-}
-
-function _module_queue_url($mode, &$module_row)
-{
- return extra_url();
-}
-
-function _module_reports_url($mode, &$module_row)
-{
- return extra_url();
-}
-
-function extra_url()
-{
- global $forum_id, $topic_id, $post_id, $report_id, $user_id;
-
- $url_extra = '';
- $url_extra .= ($forum_id) ? "&amp;f=$forum_id" : '';
- $url_extra .= ($topic_id) ? "&amp;t=$topic_id" : '';
- $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
- $url_extra .= ($user_id) ? "&amp;u=$user_id" : '';
- $url_extra .= ($report_id) ? "&amp;r=$report_id" : '';
-
- return $url_extra;
-}
-
-/**
-* Get simple topic data
-*/
-function get_topic_data($topic_ids, $acl_list = false, $read_tracking = false)
-{
- global $auth, $db, $config, $user;
- static $rowset = array();
-
- $topics = array();
-
- if (!sizeof($topic_ids))
- {
- return array();
- }
-
- // cache might not contain read tracking info, so we can't use it if read
- // tracking information is requested
- if (!$read_tracking)
- {
- $cache_topic_ids = array_intersect($topic_ids, array_keys($rowset));
- $topic_ids = array_diff($topic_ids, array_keys($rowset));
- }
- else
- {
- $cache_topic_ids = array();
- }
-
- if (sizeof($topic_ids))
- {
- $sql_array = array(
- 'SELECT' => 't.*, f.*',
-
- 'FROM' => array(
- TOPICS_TABLE => 't',
- ),
-
- 'LEFT_JOIN' => array(
- array(
- 'FROM' => array(FORUMS_TABLE => 'f'),
- 'ON' => 'f.forum_id = t.forum_id'
- )
- ),
-
- 'WHERE' => $db->sql_in_set('t.topic_id', $topic_ids)
- );
-
- if ($read_tracking && $config['load_db_lastread'])
- {
- $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
-
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
- 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
- );
-
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
- 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
- );
- }
-
- $sql = $db->sql_build_query('SELECT', $sql_array);
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $rowset[$row['topic_id']] = $row;
-
- if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
- {
- continue;
- }
-
- $topics[$row['topic_id']] = $row;
- }
- $db->sql_freeresult($result);
- }
-
- foreach ($cache_topic_ids as $id)
- {
- if (!$acl_list || $auth->acl_gets($acl_list, $rowset[$id]['forum_id']))
- {
- $topics[$id] = $rowset[$id];
- }
- }
-
- return $topics;
-}
-
-/**
-* Get simple post data
-*/
-function get_post_data($post_ids, $acl_list = false, $read_tracking = false)
-{
- global $db, $auth, $config, $user;
-
- $rowset = array();
-
- if (!sizeof($post_ids))
- {
- return array();
- }
-
- $sql_array = array(
- 'SELECT' => 'p.*, u.*, t.*, f.*',
-
- 'FROM' => array(
- USERS_TABLE => 'u',
- POSTS_TABLE => 'p',
- TOPICS_TABLE => 't',
- ),
-
- 'LEFT_JOIN' => array(
- array(
- 'FROM' => array(FORUMS_TABLE => 'f'),
- 'ON' => 'f.forum_id = t.forum_id'
- )
- ),
-
- 'WHERE' => $db->sql_in_set('p.post_id', $post_ids) . '
- AND u.user_id = p.poster_id
- AND t.topic_id = p.topic_id',
- );
-
- if ($read_tracking && $config['load_db_lastread'])
- {
- $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
-
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
- 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
- );
-
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
- 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
- );
- }
-
- $sql = $db->sql_build_query('SELECT', $sql_array);
- $result = $db->sql_query($sql);
- unset($sql_array);
-
- while ($row = $db->sql_fetchrow($result))
- {
- if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
- {
- continue;
- }
-
- if ($row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
- {
- // Moderators without the permission to approve post should at least not see them. ;)
- continue;
- }
-
- $rowset[$row['post_id']] = $row;
- }
- $db->sql_freeresult($result);
-
- return $rowset;
-}
-
-/**
-* Get simple forum data
-*/
-function get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking = false)
-{
- global $auth, $db, $user, $config, $phpbb_container;
-
- $rowset = array();
-
- if (!is_array($forum_id))
- {
- $forum_id = array($forum_id);
- }
-
- if (!sizeof($forum_id))
- {
- return array();
- }
-
- if ($read_tracking && $config['load_db_lastread'])
- {
- $read_tracking_join = ' LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
- AND ft.forum_id = f.forum_id)';
- $read_tracking_select = ', ft.mark_time';
- }
- else
- {
- $read_tracking_join = $read_tracking_select = '';
- }
-
- $sql = "SELECT f.* $read_tracking_select
- FROM " . FORUMS_TABLE . " f$read_tracking_join
- WHERE " . $db->sql_in_set('f.forum_id', $forum_id);
- $result = $db->sql_query($sql);
-
- $phpbb_content_visibility = $phpbb_container->get('content.visibility');
-
- while ($row = $db->sql_fetchrow($result))
- {
- if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
- {
- continue;
- }
-
- $row['forum_topics_approved'] = $phpbb_content_visibility->get_count('forum_topics', $row, $row['forum_id']);
-
- $rowset[$row['forum_id']] = $row;
- }
- $db->sql_freeresult($result);
-
- return $rowset;
-}
-
-/**
-* Get simple pm data
-*/
-function get_pm_data($pm_ids)
-{
- global $db, $auth, $config, $user;
-
- $rowset = array();
-
- if (!sizeof($pm_ids))
- {
- return array();
- }
-
- $sql_array = array(
- 'SELECT' => 'p.*, u.*',
-
- 'FROM' => array(
- USERS_TABLE => 'u',
- PRIVMSGS_TABLE => 'p',
- ),
-
- 'WHERE' => $db->sql_in_set('p.msg_id', $pm_ids) . '
- AND u.user_id = p.author_id',
- );
-
- $sql = $db->sql_build_query('SELECT', $sql_array);
- $result = $db->sql_query($sql);
- unset($sql_array);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $rowset[$row['msg_id']] = $row;
- }
- $db->sql_freeresult($result);
-
- return $rowset;
-}
-
-/**
-* sorting in mcp
-*
-* @param string $where_sql should either be WHERE (default if ommited) or end with AND or OR
-*
-* $mode reports and reports_closed: the $where parameters uses aliases p for posts table and r for report table
-* $mode unapproved_posts: the $where parameters uses aliases p for posts table and t for topic table
-*/
-function mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by_sql, &$sort_order_sql, &$total, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')
-{
- global $db, $user, $auth, $template;
-
- $sort_days = request_var('st', 0);
- $min_time = ($sort_days) ? time() - ($sort_days * 86400) : 0;
-
- switch ($mode)
- {
- case 'viewforum':
- $type = 'topics';
- $default_key = 't';
- $default_dir = 'd';
-
- $sql = 'SELECT COUNT(topic_id) AS total
- FROM ' . TOPICS_TABLE . "
- $where_sql forum_id = $forum_id
- AND topic_type NOT IN (" . POST_ANNOUNCE . ', ' . POST_GLOBAL . ")
- AND topic_last_post_time >= $min_time";
-
- if (!$auth->acl_get('m_approve', $forum_id))
- {
- $sql .= 'AND topic_visibility = ' . ITEM_APPROVED;
- }
- break;
-
- case 'viewtopic':
- $type = 'posts';
- $default_key = 't';
- $default_dir = 'a';
-
- $sql = 'SELECT COUNT(post_id) AS total
- FROM ' . POSTS_TABLE . "
- $where_sql topic_id = $topic_id
- AND post_time >= $min_time";
-
- if (!$auth->acl_get('m_approve', $forum_id))
- {
- $sql .= 'AND post_visibility = ' . ITEM_APPROVED;
- }
- break;
-
- case 'unapproved_posts':
- case 'deleted_posts':
- $visibility_const = ($mode == 'unapproved_posts') ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
- $type = 'posts';
- $default_key = 't';
- $default_dir = 'd';
- $where_sql .= ($topic_id) ? ' p.topic_id = ' . $topic_id . ' AND' : '';
-
- $sql = 'SELECT COUNT(p.post_id) AS total
- FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
- $where_sql " . $db->sql_in_set('p.forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_approve'))) . '
- AND ' . $db->sql_in_set('p.post_visibility', $visibility_const) .'
- AND t.topic_id = p.topic_id
- AND t.topic_visibility <> p.post_visibility';
-
- if ($min_time)
- {
- $sql .= ' AND post_time >= ' . $min_time;
- }
- break;
-
- case 'unapproved_topics':
- case 'deleted_topics':
- $visibility_const = ($mode == 'unapproved_topics') ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
- $type = 'topics';
- $default_key = 't';
- $default_dir = 'd';
-
- $sql = 'SELECT COUNT(topic_id) AS total
- FROM ' . TOPICS_TABLE . "
- $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_approve'))) . '
- AND ' . $db->sql_in_set('topic_visibility', $visibility_const);
-
- if ($min_time)
- {
- $sql .= ' AND topic_time >= ' . $min_time;
- }
- break;
-
- case 'pm_reports':
- case 'pm_reports_closed':
- case 'reports':
- case 'reports_closed':
- $pm = (strpos($mode, 'pm_') === 0) ? true : false;
-
- $type = ($pm) ? 'pm_reports' : 'reports';
- $default_key = 't';
- $default_dir = 'd';
- $limit_time_sql = ($min_time) ? "AND r.report_time >= $min_time" : '';
-
- if ($topic_id)
- {
- $where_sql .= ' p.topic_id = ' . $topic_id . ' AND ';
- }
- else if ($forum_id)
- {
- $where_sql .= ' p.forum_id = ' . $forum_id . ' AND ';
- }
- else if (!$pm)
- {
- $where_sql .= ' ' . $db->sql_in_set('p.forum_id', get_forum_list(array('!f_read', '!m_report')), true, true) . ' AND ';
- }
-
- if ($mode == 'reports' || $mode == 'pm_reports')
- {
- $where_sql .= ' r.report_closed = 0 AND ';
- }
- else
- {
- $where_sql .= ' r.report_closed = 1 AND ';
- }
-
- if ($pm)
- {
- $sql = 'SELECT COUNT(r.report_id) AS total
- FROM ' . REPORTS_TABLE . ' r, ' . PRIVMSGS_TABLE . " p
- $where_sql r.post_id = 0
- AND p.msg_id = r.pm_id
- $limit_time_sql";
- }
- else
- {
- $sql = 'SELECT COUNT(r.report_id) AS total
- FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . " p
- $where_sql r.pm_id = 0
- AND p.post_id = r.post_id
- $limit_time_sql";
- }
- break;
-
- case 'viewlogs':
- $type = 'logs';
- $default_key = 't';
- $default_dir = 'd';
-
- $sql = 'SELECT COUNT(log_id) AS total
- FROM ' . LOG_TABLE . "
- $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_'))) . '
- AND log_time >= ' . $min_time . '
- AND log_type = ' . LOG_MOD;
- break;
- }
-
- $sort_key = request_var('sk', $default_key);
- $sort_dir = request_var('sd', $default_dir);
- $sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);
-
- switch ($type)
- {
- case 'topics':
- $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
- $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'tt' => $user->lang['TOPIC_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
-
- $sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');
- $limit_time_sql = ($min_time) ? "AND t.topic_last_post_time >= $min_time" : '';
- break;
-
- case 'posts':
- $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
- $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
- $sort_by_sql = array('a' => 'u.username_clean', 't' => 'p.post_time', 's' => 'p.post_subject');
- $limit_time_sql = ($min_time) ? "AND p.post_time >= $min_time" : '';
- break;
-
- case 'reports':
- $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
- $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
- $sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.post_time', 't' => 'r.report_time', 's' => 'p.post_subject');
- break;
-
- case 'pm_reports':
- $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
- $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
- $sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.message_time', 't' => 'r.report_time', 's' => 'p.message_subject');
- break;
-
- case 'logs':
- $limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
- $sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']);
-
- $sort_by_sql = array('u' => 'u.username_clean', 't' => 'l.log_time', 'i' => 'l.log_ip', 'o' => 'l.log_operation');
- $limit_time_sql = ($min_time) ? "AND l.log_time >= $min_time" : '';
- break;
- }
-
- if (!isset($sort_by_sql[$sort_key]))
- {
- $sort_key = $default_key;
- }
-
- $sort_order_sql = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
-
- $s_limit_days = $s_sort_key = $s_sort_dir = $sort_url = '';
- gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url);
-
- $template->assign_vars(array(
- 'S_SELECT_SORT_DIR' => $s_sort_dir,
- 'S_SELECT_SORT_KEY' => $s_sort_key,
- 'S_SELECT_SORT_DAYS' => $s_limit_days)
- );
-
- if (($sort_days && $mode != 'viewlogs') || in_array($mode, array('reports', 'unapproved_topics', 'unapproved_posts', 'deleted_topics', 'deleted_posts')) || $where_sql != 'WHERE')
- {
- $result = $db->sql_query($sql);
- $total = (int) $db->sql_fetchfield('total');
- $db->sql_freeresult($result);
- }
- else
- {
- $total = -1;
- }
-}
-
-/**
-* Validate ids
-*
-* @param array &$ids The relevant ids to check
-* @param string $table The table to find the ids in
-* @param string $sql_id The ids relevant column name
-* @param array $acl_list A list of permissions the user need to have
-* @param mixed $singe_forum Limit to one forum id (int) or the first forum found (true)
-*
-* @return mixed False if no ids were able to be retrieved, true if at least one id left.
-* Additionally, this value can be the forum_id assigned if $single_forum was set.
-* Therefore checking the result for with !== false is the best method.
-*/
-function check_ids(&$ids, $table, $sql_id, $acl_list = false, $single_forum = false)
-{
- global $db, $auth;
-
- if (!is_array($ids) || empty($ids))
- {
- return false;
- }
-
- $sql = "SELECT $sql_id, forum_id FROM $table
- WHERE " . $db->sql_in_set($sql_id, $ids);
- $result = $db->sql_query($sql);
-
- $ids = array();
- $forum_id = false;
-
- while ($row = $db->sql_fetchrow($result))
- {
- if ($acl_list && $row['forum_id'] && !$auth->acl_gets($acl_list, $row['forum_id']))
- {
- continue;
- }
-
- if ($acl_list && !$row['forum_id'] && !$auth->acl_getf_global($acl_list))
- {
- continue;
- }
-
- // Limit forum? If not, just assign the id.
- if ($single_forum === false)
- {
- $ids[] = $row[$sql_id];
- continue;
- }
-
- // Limit forum to a specific forum id?
- // This can get really tricky, because we do not want to create a failure on global topics. :)
- if ($row['forum_id'])
- {
- if ($single_forum !== true && $row['forum_id'] == (int) $single_forum)
- {
- $forum_id = (int) $single_forum;
- }
- else if ($forum_id === false)
- {
- $forum_id = $row['forum_id'];
- }
-
- if ($row['forum_id'] == $forum_id)
- {
- $ids[] = $row[$sql_id];
- }
- }
- else
- {
- // Always add a global topic
- $ids[] = $row[$sql_id];
- }
- }
- $db->sql_freeresult($result);
-
- if (!sizeof($ids))
- {
- return false;
- }
-
- // If forum id is false and ids populated we may have only global announcements selected (returning 0 because of (int) $forum_id)
-
- return ($single_forum === false) ? true : (int) $forum_id;
-}
diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php
index 4eb6d79272..02051bf0df 100644
--- a/phpBB/memberlist.php
+++ b/phpBB/memberlist.php
@@ -640,7 +640,7 @@ switch ($mode)
);
extract($phpbb_dispatcher->trigger_event('core.memberlist_view_profile', compact($vars)));
- $template->assign_vars(show_profile($member, $user_notes_enabled, $warn_user_enabled));
+ $template->assign_vars(phpbb_show_profile($member, $user_notes_enabled, $warn_user_enabled));
// If the user has m_approve permission or a_user permission, then list then display unapproved posts
if ($auth->acl_getf_global('m_approve') || $auth->acl_get('a_user'))
@@ -799,7 +799,7 @@ switch ($mode)
$sql = 'SELECT username, user_id, user_colour
FROM ' . USERS_TABLE . '
WHERE ' . $db->sql_in_set('user_type', array(USER_NORMAL, USER_FOUNDER)) . '
- AND username_clean ' . $db->sql_like_expression(utf8_clean_string($username_chars) . $db->any_char);
+ AND username_clean ' . $db->sql_like_expression(utf8_clean_string($username_chars) . $db->get_any_char());
$result = $db->sql_query_limit($sql, 10);
$user_list = array();
@@ -920,9 +920,9 @@ switch ($mode)
$s_find_active_time .= '<option value="' . $key . '"' . $selected . '>' . $value . '</option>';
}
- $sql_where .= ($username) ? ' AND u.username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($username))) : '';
- $sql_where .= ($auth->acl_get('a_user') && $email) ? ' AND u.user_email ' . $db->sql_like_expression(str_replace('*', $db->any_char, $email)) . ' ' : '';
- $sql_where .= ($jabber) ? ' AND u.user_jabber ' . $db->sql_like_expression(str_replace('*', $db->any_char, $jabber)) . ' ' : '';
+ $sql_where .= ($username) ? ' AND u.username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($username))) : '';
+ $sql_where .= ($auth->acl_get('a_user') && $email) ? ' AND u.user_email ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), $email)) . ' ' : '';
+ $sql_where .= ($jabber) ? ' AND u.user_jabber ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), $jabber)) . ' ' : '';
$sql_where .= (is_numeric($count) && isset($find_key_match[$count_select])) ? ' AND u.user_posts ' . $find_key_match[$count_select] . ' ' . (int) $count . ' ' : '';
if (isset($find_key_match[$joined_select]) && sizeof($joined) == 3)
@@ -1016,12 +1016,12 @@ switch ($mode)
{
for ($i = 97; $i < 123; $i++)
{
- $sql_where .= ' AND u.username_clean NOT ' . $db->sql_like_expression(chr($i) . $db->any_char);
+ $sql_where .= ' AND u.username_clean NOT ' . $db->sql_like_expression(chr($i) . $db->get_any_char());
}
}
else if ($first_char)
{
- $sql_where .= ' AND u.username_clean ' . $db->sql_like_expression(substr($first_char, 0, 1) . $db->any_char);
+ $sql_where .= ' AND u.username_clean ' . $db->sql_like_expression(substr($first_char, 0, 1) . $db->get_any_char());
}
// Are we looking at a usergroup? If so, fetch additional info
@@ -1400,7 +1400,7 @@ switch ($mode)
if ($sort_key == 'l')
{
// uasort($id_cache, create_function('$first, $second', "return (\$first['last_visit'] == \$second['last_visit']) ? 0 : ((\$first['last_visit'] < \$second['last_visit']) ? $lesser_than : ($lesser_than * -1));"));
- usort($user_list, '_sort_last_active');
+ usort($user_list, 'phpbb_sort_last_active');
}
for ($i = 0, $end = sizeof($user_list); $i < $end; ++$i)
@@ -1416,7 +1416,7 @@ switch ($mode)
$cp_row = (isset($profile_fields_cache[$user_id])) ? $cp->generate_profile_fields_template_data($profile_fields_cache[$user_id], false) : array();
}
- $memberrow = array_merge(show_profile($row), array(
+ $memberrow = array_merge(phpbb_show_profile($row), array(
'ROW_NUMBER' => $i + ($start + 1),
'S_CUSTOM_PROFILE' => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
@@ -1485,166 +1485,3 @@ $template->set_filenames(array(
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
page_footer();
-
-/**
-* Prepare profile data
-*/
-function show_profile($data, $user_notes_enabled = false, $warn_user_enabled = false)
-{
- global $config, $auth, $template, $user, $phpEx, $phpbb_root_path, $phpbb_dispatcher;
-
- $username = $data['username'];
- $user_id = $data['user_id'];
-
- $rank_title = $rank_img = $rank_img_src = '';
- get_user_rank($data['user_rank'], (($user_id == ANONYMOUS) ? false : $data['user_posts']), $rank_title, $rank_img, $rank_img_src);
-
- if ((!empty($data['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_user'))
- {
- $email = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=email&amp;u=' . $user_id) : (($config['board_hide_emails'] && !$auth->acl_get('a_user')) ? '' : 'mailto:' . $data['user_email']);
- }
- else
- {
- $email = '';
- }
-
- if ($config['load_onlinetrack'])
- {
- $update_time = $config['load_online_time'] * 60;
- $online = (time() - $update_time < $data['session_time'] && ((isset($data['session_viewonline']) && $data['session_viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
- }
- else
- {
- $online = false;
- }
-
- if ($data['user_allow_viewonline'] || $auth->acl_get('u_viewonline'))
- {
- $last_active = (!empty($data['session_time'])) ? $data['session_time'] : $data['user_lastvisit'];
- }
- else
- {
- $last_active = '';
- }
-
- $age = '';
-
- if ($config['allow_birthdays'] && $data['user_birthday'])
- {
- list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $data['user_birthday']));
-
- if ($bday_year)
- {
- $now = $user->create_datetime();
- $now = phpbb_gmgetdate($now->getTimestamp() + $now->getOffset());
-
- $diff = $now['mon'] - $bday_month;
- if ($diff == 0)
- {
- $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
- }
- else
- {
- $diff = ($diff < 0) ? 1 : 0;
- }
-
- $age = max(0, (int) ($now['year'] - $bday_year - $diff));
- }
- }
-
- if (!function_exists('phpbb_get_banned_user_ids'))
- {
- include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
- }
-
- // Can this user receive a Private Message?
- $can_receive_pm = (
- // They must be a "normal" user
- $data['user_type'] != USER_IGNORE &&
-
- // They must not be deactivated by the administrator
- ($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) &&
-
- // They must be able to read PMs
- sizeof($auth->acl_get_list($user_id, 'u_readpm')) &&
-
- // They must not be permanently banned
- !sizeof(phpbb_get_banned_user_ids($user_id, false)) &&
-
- // They must allow users to contact via PM
- (($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $data['user_allow_pm'])
- );
-
- // Dump it out to the template
- $template_data = array(
- 'AGE' => $age,
- 'RANK_TITLE' => $rank_title,
- 'JOINED' => $user->format_date($data['user_regdate']),
- 'LAST_ACTIVE' => (empty($last_active)) ? ' - ' : $user->format_date($last_active),
- 'POSTS' => ($data['user_posts']) ? $data['user_posts'] : 0,
- 'WARNINGS' => isset($data['user_warnings']) ? $data['user_warnings'] : 0,
-
- 'USERNAME_FULL' => get_username_string('full', $user_id, $username, $data['user_colour']),
- 'USERNAME' => get_username_string('username', $user_id, $username, $data['user_colour']),
- 'USER_COLOR' => get_username_string('colour', $user_id, $username, $data['user_colour']),
- 'U_VIEW_PROFILE' => get_username_string('profile', $user_id, $username, $data['user_colour']),
-
- 'A_USERNAME' => addslashes(get_username_string('username', $user_id, $username, $data['user_colour'])),
-
- 'AVATAR_IMG' => phpbb_get_user_avatar($data),
- 'ONLINE_IMG' => (!$config['load_onlinetrack']) ? '' : (($online) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
- 'S_ONLINE' => ($config['load_onlinetrack'] && $online) ? true : false,
- 'RANK_IMG' => $rank_img,
- 'RANK_IMG_SRC' => $rank_img_src,
- 'S_JABBER_ENABLED' => ($config['jab_enable']) ? true : false,
-
- 'S_WARNINGS' => ($auth->acl_getf_global('m_') || $auth->acl_get('m_warn')) ? true : false,
-
- 'U_SEARCH_USER' => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$user_id&amp;sr=posts") : '',
- 'U_NOTES' => ($user_notes_enabled && $auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $user_id, true, $user->session_id) : '',
- 'U_WARN' => ($warn_user_enabled && $auth->acl_get('m_warn')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_user&amp;u=' . $user_id, true, $user->session_id) : '',
- 'U_PM' => ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && $can_receive_pm) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $user_id) : '',
- 'U_EMAIL' => $email,
- 'U_JABBER' => ($data['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contact&amp;action=jabber&amp;u=' . $user_id) : '',
-
- 'USER_JABBER' => $data['user_jabber'],
- 'USER_JABBER_IMG' => ($data['user_jabber']) ? $user->img('icon_contact_jabber', $data['user_jabber']) : '',
-
- 'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $username),
- 'L_CONTACT_USER' => $user->lang('CONTACT_USER', $username),
- 'L_VIEWING_PROFILE' => $user->lang('VIEWING_PROFILE', $username),
- );
-
- /**
- * Preparing a user's data before displaying it in profile and memberlist
- *
- * @event core.memberlist_prepare_profile_data
- * @var array data Array with user's data
- * @var array template_data Template array with user's data
- * @since 3.1.0-a1
- */
- $vars = array('data', 'template_data');
- extract($phpbb_dispatcher->trigger_event('core.memberlist_prepare_profile_data', compact($vars)));
-
- return $template_data;
-}
-
-function _sort_last_active($first, $second)
-{
- global $id_cache, $sort_dir;
-
- $lesser_than = ($sort_dir === 'd') ? -1 : 1;
-
- if (isset($id_cache[$first]['group_leader']) && $id_cache[$first]['group_leader'] && (!isset($id_cache[$second]['group_leader']) || !$id_cache[$second]['group_leader']))
- {
- return -1;
- }
- else if (isset($id_cache[$second]['group_leader']) && (!isset($id_cache[$first]['group_leader']) || !$id_cache[$first]['group_leader']) && $id_cache[$second]['group_leader'])
- {
- return 1;
- }
- else
- {
- return $lesser_than * (int) ($id_cache[$first]['last_visit'] - $id_cache[$second]['last_visit']);
- }
-}
diff --git a/phpBB/phpbb/auth/auth.php b/phpBB/phpbb/auth/auth.php
index 20c60364d8..65249275d4 100644
--- a/phpBB/phpbb/auth/auth.php
+++ b/phpBB/phpbb/auth/auth.php
@@ -1043,7 +1043,7 @@ class auth
{
if (strpos($auth_options, '%') !== false)
{
- $sql_opts = "AND $key " . $db->sql_like_expression(str_replace('%', $db->any_char, $auth_options));
+ $sql_opts = "AND $key " . $db->sql_like_expression(str_replace('%', $db->get_any_char(), $auth_options));
}
else
{
@@ -1074,7 +1074,7 @@ class auth
{
if (strpos($option, '%') !== false)
{
- $sql[] = $key . ' ' . $db->sql_like_expression(str_replace('%', $db->any_char, $option));
+ $sql[] = $key . ' ' . $db->sql_like_expression(str_replace('%', $db->get_any_char(), $option));
}
else
{
diff --git a/phpBB/phpbb/auth/provider/oauth/oauth.php b/phpBB/phpbb/auth/provider/oauth/oauth.php
index 07430bb42a..7b71e3c844 100644
--- a/phpBB/phpbb/auth/provider/oauth/oauth.php
+++ b/phpBB/phpbb/auth/provider/oauth/oauth.php
@@ -14,7 +14,6 @@
namespace phpbb\auth\provider\oauth;
use OAuth\Common\Consumer\Credentials;
-use OAuth\Common\Http\Uri\Uri;
/**
* OAuth authentication provider for phpBB3
@@ -224,7 +223,7 @@ class oauth extends \phpbb\auth\provider\base
if (!$row)
{
- throw new Exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_ENTRY');
+ throw new \Exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_ENTRY');
}
// Update token storage to store the user_id
@@ -278,9 +277,10 @@ class oauth extends \phpbb\auth\provider\base
* @param array $service_credentials {@see \phpbb\auth\provider\oauth\oauth::get_service_credentials}
* @param string $query The query string of the
* current_uri used in redirection
- * @param array $scope The scope of the request against
+ * @param array $scopes The scope of the request against
* the api.
* @return \OAuth\Common\Service\ServiceInterface
+ * @throws \Exception
*/
protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, $query, array $scopes = array())
{
@@ -298,7 +298,7 @@ class oauth extends \phpbb\auth\provider\base
if (!$service)
{
- throw new Exception('AUTH_PROVIDER_OAUTH_ERROR_SERVICE_NOT_CREATED');
+ throw new \Exception('AUTH_PROVIDER_OAUTH_ERROR_SERVICE_NOT_CREATED');
}
return $service;
@@ -617,7 +617,5 @@ class oauth extends \phpbb\auth\provider\base
$service_name = 'auth.provider.oauth.service.' . strtolower($link_data['oauth_service']);
$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$storage->clearToken($service_name);
-
- return;
}
}
diff --git a/phpBB/phpbb/auth/provider/oauth/service/facebook.php b/phpBB/phpbb/auth/provider/oauth/service/facebook.php
index 31060c4ac4..bb98835e07 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/facebook.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/facebook.php
@@ -21,22 +21,22 @@ class facebook extends base
/**
* phpBB config
*
- * @var phpbb\config\config
+ * @var \phpbb\config\config
*/
protected $config;
/**
* phpBB request
*
- * @var phpbb\request\request_interface
+ * @var \phpbb\request\request_interface
*/
protected $request;
/**
* Constructor
*
- * @param phpbb\config\config $config
- * @param phpbb\request\request_interface $request
+ * @param \phpbb\config\config $config
+ * @param \phpbb\request\request_interface $request
*/
public function __construct(\phpbb\config\config $config, \phpbb\request\request_interface $request)
{
diff --git a/phpBB/phpbb/auth/provider/oauth/service/google.php b/phpBB/phpbb/auth/provider/oauth/service/google.php
index c2d9e1f798..cb9f83a94f 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/google.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/google.php
@@ -21,22 +21,22 @@ class google extends base
/**
* phpBB config
*
- * @var phpbb\config\config
+ * @var \phpbb\config\config
*/
protected $config;
/**
* phpBB request
*
- * @var phpbb\request\request_interface
+ * @var \phpbb\request\request_interface
*/
protected $request;
/**
* Constructor
*
- * @param phpbb\config\config $config
- * @param phpbb\request\request_interface $request
+ * @param \phpbb\config\config $config
+ * @param \phpbb\request\request_interface $request
*/
public function __construct(\phpbb\config\config $config, \phpbb\request\request_interface $request)
{
diff --git a/phpBB/phpbb/auth/provider/oauth/service/service_interface.php b/phpBB/phpbb/auth/provider/oauth/service/service_interface.php
index 3744582b95..e84eb247b6 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/service_interface.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/service_interface.php
@@ -67,7 +67,7 @@ interface service_interface
/**
* Sets the external library service provider
*
- * @param \OAuth\Common\Service\ServiceInterface $service
+ * @param \OAuth\Common\Service\ServiceInterface $service_provider
*/
public function set_external_service_provider(\OAuth\Common\Service\ServiceInterface $service_provider);
}
diff --git a/phpBB/phpbb/auth/provider/oauth/token_storage.php b/phpBB/phpbb/auth/provider/oauth/token_storage.php
index b7d32bf246..023cf402ca 100644
--- a/phpBB/phpbb/auth/provider/oauth/token_storage.php
+++ b/phpBB/phpbb/auth/provider/oauth/token_storage.php
@@ -17,7 +17,6 @@ namespace phpbb\auth\provider\oauth;
use OAuth\OAuth1\Token\StdOAuth1Token;
use OAuth\Common\Token\TokenInterface;
use OAuth\Common\Storage\TokenStorageInterface;
-use OAuth\Common\Storage\Exception\StorageException;
use OAuth\Common\Storage\Exception\TokenNotFoundException;
/**
@@ -198,6 +197,7 @@ class token_storage implements TokenStorageInterface
/**
* Checks to see if an access token exists solely by the session_id of the user
*
+ * @param string $service The name of the OAuth service
* @return bool true if they have token, false if they don't
*/
public function has_access_token_by_session($service)
@@ -250,6 +250,7 @@ class token_storage implements TokenStorageInterface
*
* @param array $data
* @return mixed
+ * @throws \OAuth\Common\Storage\Exception\TokenNotFoundException
*/
protected function _retrieve_access_token($data)
{
@@ -265,7 +266,7 @@ class token_storage implements TokenStorageInterface
// Ensure that the token was serialized/unserialized correctly
if (!($token instanceof TokenInterface))
{
- $this->clearToken();
+ $this->clearToken($data['provider']);
throw new TokenNotFoundException('AUTH_PROVIDER_OAUTH_TOKEN_ERROR_INCORRECTLY_STORED');
}
diff --git a/phpBB/phpbb/auth/provider/provider_interface.php b/phpBB/phpbb/auth/provider/provider_interface.php
index 140353c88b..613297cefc 100644
--- a/phpBB/phpbb/auth/provider/provider_interface.php
+++ b/phpBB/phpbb/auth/provider/provider_interface.php
@@ -148,7 +148,7 @@ interface provider_interface
* user_id of an account needed to successfully link an external account to
* a forum account.
*
- * @param array $link_data Any data needed to link a phpBB account to
+ * @param array $login_link_data Any data needed to link a phpBB account to
* an external account.
* @return string|null Returns a string with a language constant if there
* is data missing or null if there is no error.
diff --git a/phpBB/phpbb/auth/provider_collection.php b/phpBB/phpbb/auth/provider_collection.php
index 27a3f24564..a74a2135dc 100644
--- a/phpBB/phpbb/auth/provider_collection.php
+++ b/phpBB/phpbb/auth/provider_collection.php
@@ -29,7 +29,7 @@ class provider_collection extends \phpbb\di\service_collection
* @param ContainerInterface $container Container object
* @param \phpbb\config\config $config phpBB config
*/
- public function __construct($container, \phpbb\config\config $config)
+ public function __construct(ContainerInterface $container, \phpbb\config\config $config)
{
$this->container = $container;
$this->config = $config;
@@ -53,7 +53,7 @@ class provider_collection extends \phpbb\di\service_collection
return $this->offsetGet('auth.provider.' . basename(trim($this->config['auth_method'])));
}
// Revert to db auth provider if selected method does not exist
- elseif ($this->offsetExists('auth.provider.db'))
+ else if ($this->offsetExists('auth.provider.db'))
{
return $this->offsetGet('auth.provider.db');
}
diff --git a/phpBB/phpbb/avatar/driver/driver.php b/phpBB/phpbb/avatar/driver/driver.php
index 9c769071d4..b3ced7edf7 100644
--- a/phpBB/phpbb/avatar/driver/driver.php
+++ b/phpBB/phpbb/avatar/driver/driver.php
@@ -73,10 +73,9 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
* Construct a driver object
*
* @param \phpbb\config\config $config phpBB configuration
- * @param \phpbb\request\request $request Request object
* @param string $phpbb_root_path Path to the phpBB root
* @param string $php_ext PHP file extension
- * @param \phpbb_path_helper $path_helper phpBB path helper
+ * @param \phpbb\path_helper $path_helper phpBB path helper
* @param \phpbb\cache\driver\driver_interface $cache Cache driver
*/
public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null)
@@ -89,7 +88,7 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_custom_html($user, $row, $alt = '')
{
@@ -97,7 +96,7 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form_acp($user)
{
@@ -105,7 +104,7 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function delete($row)
{
@@ -113,7 +112,7 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_name()
{
diff --git a/phpBB/phpbb/avatar/driver/gravatar.php b/phpBB/phpbb/avatar/driver/gravatar.php
index c4344ee6e8..4aa7445d20 100644
--- a/phpBB/phpbb/avatar/driver/gravatar.php
+++ b/phpBB/phpbb/avatar/driver/gravatar.php
@@ -24,7 +24,7 @@ class gravatar extends \phpbb\avatar\driver\driver
const GRAVATAR_URL = '//secure.gravatar.com/avatar/';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_data($row)
{
@@ -36,7 +36,7 @@ class gravatar extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_custom_html($user, $row, $alt = '')
{
@@ -47,7 +47,7 @@ class gravatar extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form($request, $template, $user, $row, &$error)
{
@@ -61,7 +61,7 @@ class gravatar extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function process_form($request, $template, $user, $row, &$error)
{
@@ -151,7 +151,7 @@ class gravatar extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_template_name()
{
@@ -161,6 +161,8 @@ class gravatar extends \phpbb\avatar\driver\driver
/**
* Build gravatar URL for output on page
*
+ * @param array $row User data or group data that has been cleaned with
+ * \phpbb\avatar\manager::clean_row
* @return string Gravatar URL
*/
protected function get_gravatar_url($row)
diff --git a/phpBB/phpbb/avatar/driver/local.php b/phpBB/phpbb/avatar/driver/local.php
index f3acf7cb2c..ff1996854b 100644
--- a/phpBB/phpbb/avatar/driver/local.php
+++ b/phpBB/phpbb/avatar/driver/local.php
@@ -19,7 +19,7 @@ namespace phpbb\avatar\driver;
class local extends \phpbb\avatar\driver\driver
{
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_data($row)
{
@@ -31,7 +31,7 @@ class local extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form($request, $template, $user, $row, &$error)
{
@@ -99,7 +99,7 @@ class local extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form_acp($user)
{
@@ -109,7 +109,7 @@ class local extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function process_form($request, $template, $user, $row, &$error)
{
@@ -138,7 +138,7 @@ class local extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_template_name()
{
diff --git a/phpBB/phpbb/avatar/driver/remote.php b/phpBB/phpbb/avatar/driver/remote.php
index d97093ae24..455ddebf62 100644
--- a/phpBB/phpbb/avatar/driver/remote.php
+++ b/phpBB/phpbb/avatar/driver/remote.php
@@ -19,7 +19,7 @@ namespace phpbb\avatar\driver;
class remote extends \phpbb\avatar\driver\driver
{
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_data($row)
{
@@ -31,7 +31,7 @@ class remote extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form($request, $template, $user, $row, &$error)
{
@@ -45,7 +45,7 @@ class remote extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function process_form($request, $template, $user, $row, &$error)
{
@@ -191,7 +191,7 @@ class remote extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_template_name()
{
diff --git a/phpBB/phpbb/avatar/driver/upload.php b/phpBB/phpbb/avatar/driver/upload.php
index bef75d61c1..c43004f340 100644
--- a/phpBB/phpbb/avatar/driver/upload.php
+++ b/phpBB/phpbb/avatar/driver/upload.php
@@ -19,7 +19,7 @@ namespace phpbb\avatar\driver;
class upload extends \phpbb\avatar\driver\driver
{
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_data($row, $ignore_config = false)
{
@@ -31,7 +31,7 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form($request, $template, $user, $row, &$error)
{
@@ -49,7 +49,7 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function process_form($request, $template, $user, $row, &$error)
{
@@ -72,7 +72,7 @@ class upload extends \phpbb\avatar\driver\driver
{
$file = $upload->form_upload('avatar_upload_file');
}
- elseif (!empty($this->config['allow_avatar_remote_upload']) && !empty($url))
+ else if (!empty($this->config['allow_avatar_remote_upload']) && !empty($url))
{
if (!preg_match('#^(http|https|ftp)://#i', $url))
{
@@ -143,7 +143,7 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function prepare_form_acp($user)
{
@@ -155,7 +155,7 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function delete($row)
{
@@ -171,7 +171,7 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_template_name()
{
diff --git a/phpBB/phpbb/cache/driver/driver_interface.php b/phpBB/phpbb/cache/driver/driver_interface.php
index 7d08362ed8..9ac9ca0c59 100644
--- a/phpBB/phpbb/cache/driver/driver_interface.php
+++ b/phpBB/phpbb/cache/driver/driver_interface.php
@@ -142,7 +142,7 @@ interface driver_interface
* Fetch a field from the current row of a cached database result (database)
*
* @param int $query_id
- * @param $field The name of the column.
+ * @param string $field The name of the column.
* @return string|bool The field of the query result if found in the cache,
* otherwise false.
*/
diff --git a/phpBB/phpbb/cache/driver/file.php b/phpBB/phpbb/cache/driver/file.php
index 57890cc3a2..b32af32d25 100644
--- a/phpBB/phpbb/cache/driver/file.php
+++ b/phpBB/phpbb/cache/driver/file.php
@@ -28,6 +28,8 @@ class file extends \phpbb\cache\driver\base
/**
* Set cache path
+ *
+ * @param string $cache_dir Define the path to the cache directory (default: $phpbb_root_path . 'cache/')
*/
function __construct($cache_dir = null)
{
@@ -222,7 +224,7 @@ class file extends \phpbb\cache\driver\base
{
$this->remove_dir($fileInfo->getPathname());
}
- elseif (strpos($filename, 'container_') === 0 ||
+ else if (strpos($filename, 'container_') === 0 ||
strpos($filename, 'url_matcher') === 0 ||
strpos($filename, 'sql_') === 0 ||
strpos($filename, 'data_') === 0)
diff --git a/phpBB/phpbb/cache/service.php b/phpBB/phpbb/cache/service.php
index c9aa6525c0..d6bf150384 100644
--- a/phpBB/phpbb/cache/service.php
+++ b/phpBB/phpbb/cache/service.php
@@ -305,7 +305,7 @@ class service
{
if (($bots = $this->driver->get('_bots')) === false)
{
- switch ($this->db->sql_layer)
+ switch ($this->db->get_sql_layer())
{
case 'mssql':
case 'mssql_odbc':
@@ -316,13 +316,6 @@ class service
ORDER BY LEN(bot_agent) DESC';
break;
- case 'firebird':
- $sql = 'SELECT user_id, bot_agent, bot_ip
- FROM ' . BOTS_TABLE . '
- WHERE bot_active = 1
- ORDER BY CHAR_LENGTH(bot_agent) DESC';
- break;
-
// LENGTH supported by MySQL, IBM DB2 and Oracle for sure...
default:
$sql = 'SELECT user_id, bot_agent, bot_ip
diff --git a/phpBB/phpbb/console/command/cache/purge.php b/phpBB/phpbb/console/command/cache/purge.php
index 50953185a4..379d2aa1ca 100644
--- a/phpBB/phpbb/console/command/cache/purge.php
+++ b/phpBB/phpbb/console/command/cache/purge.php
@@ -35,6 +35,16 @@ class purge extends \phpbb\console\command\command
/** @var \phpbb\config\config */
protected $config;
+ /**
+ * Constructor
+ *
+ * @param \phpbb\cache\driver\driver_interface $cache Cache instance
+ * @param \phpbb\db\driver\driver_interface $db Database connection
+ * @param \phpbb\auth\auth $auth Auth instance
+ * @param \phpbb\log\log $log Logger instance
+ * @param \phpbb\user $user User instance
+ * @param \phpbb\config\config $config Config instance
+ */
public function __construct(\phpbb\cache\driver\driver_interface $cache, \phpbb\db\driver\driver_interface $db, \phpbb\auth\auth $auth, \phpbb\log\log $log, \phpbb\user $user, \phpbb\config\config $config)
{
$this->cache = $cache;
@@ -46,6 +56,9 @@ class purge extends \phpbb\console\command\command
parent::__construct();
}
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -54,6 +67,16 @@ class purge extends \phpbb\console\command\command
;
}
+ /**
+ * Executes the command cache:purge.
+ *
+ * Purge the cache (including permissions) and increment the asset_version number
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return null
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->config->increment('assets_version', 1);
diff --git a/phpBB/phpbb/console/command/config/delete.php b/phpBB/phpbb/console/command/config/delete.php
index e29afdbf82..1310bb18b4 100644
--- a/phpBB/phpbb/console/command/config/delete.php
+++ b/phpBB/phpbb/console/command/config/delete.php
@@ -14,11 +14,13 @@ namespace phpbb\console\command\config;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class delete extends command
{
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -32,6 +34,17 @@ class delete extends command
;
}
+ /**
+ * Executes the command config:delete.
+ *
+ * Removes a configuration option
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return null
+ * @see \phpbb\config\config::delete()
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$key = $input->getArgument('key');
diff --git a/phpBB/phpbb/console/command/config/get.php b/phpBB/phpbb/console/command/config/get.php
index 0ed2a12608..ee8c65110e 100644
--- a/phpBB/phpbb/console/command/config/get.php
+++ b/phpBB/phpbb/console/command/config/get.php
@@ -19,6 +19,9 @@ use Symfony\Component\Console\Output\OutputInterface;
class get extends command
{
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -38,6 +41,17 @@ class get extends command
;
}
+ /**
+ * Executes the command config:get.
+ *
+ * Retrieves a configuration value.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return null
+ * @see \phpbb\config\config::offsetGet()
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$key = $input->getArgument('key');
@@ -46,7 +60,7 @@ class get extends command
{
$output->write($this->config[$key]);
}
- elseif (isset($this->config[$key]))
+ else if (isset($this->config[$key]))
{
$output->writeln($this->config[$key]);
}
diff --git a/phpBB/phpbb/console/command/config/increment.php b/phpBB/phpbb/console/command/config/increment.php
index 64b5d42b9d..21f0660e61 100644
--- a/phpBB/phpbb/console/command/config/increment.php
+++ b/phpBB/phpbb/console/command/config/increment.php
@@ -19,6 +19,9 @@ use Symfony\Component\Console\Output\OutputInterface;
class increment extends command
{
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -43,6 +46,17 @@ class increment extends command
;
}
+ /**
+ * Executes the command config:increment.
+ *
+ * Increments an integer configuration value.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return null
+ * @see \phpbb\config\config::increment()
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$key = $input->getArgument('key');
diff --git a/phpBB/phpbb/console/command/config/set.php b/phpBB/phpbb/console/command/config/set.php
index fce1edb93e..587b7fb0de 100644
--- a/phpBB/phpbb/console/command/config/set.php
+++ b/phpBB/phpbb/console/command/config/set.php
@@ -19,6 +19,9 @@ use Symfony\Component\Console\Output\OutputInterface;
class set extends command
{
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -43,6 +46,17 @@ class set extends command
;
}
+ /**
+ * Executes the command config:set.
+ *
+ * Sets a configuration option's value.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return null
+ * @see \phpbb\config\config::set()
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$key = $input->getArgument('key');
diff --git a/phpBB/phpbb/console/command/config/set_atomic.php b/phpBB/phpbb/console/command/config/set_atomic.php
index 4df2d90722..a7a52155f9 100644
--- a/phpBB/phpbb/console/command/config/set_atomic.php
+++ b/phpBB/phpbb/console/command/config/set_atomic.php
@@ -19,6 +19,9 @@ use Symfony\Component\Console\Output\OutputInterface;
class set_atomic extends command
{
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -48,6 +51,18 @@ class set_atomic extends command
;
}
+ /**
+ * Executes the command config:set-atomic.
+ *
+ * Sets a configuration option's value only if the old_value matches the
+ * current configuration value or the configuration value does not exist yet.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return bool True if the value was changed, false otherwise.
+ * @see \phpbb\config\config::set_atomic()
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$key = $input->getArgument('key');
diff --git a/phpBB/phpbb/console/command/cron/cron_list.php b/phpBB/phpbb/console/command/cron/cron_list.php
index 9db6a23947..4f4228d9b3 100644
--- a/phpBB/phpbb/console/command/cron/cron_list.php
+++ b/phpBB/phpbb/console/command/cron/cron_list.php
@@ -23,6 +23,12 @@ class cron_list extends \phpbb\console\command\command
/** @var \phpbb\user */
protected $user;
+ /**
+ * Constructor
+ *
+ * @param \phpbb\cron\manager $cron_manager Cron manager
+ * @param \phpbb\user $user User instance
+ */
public function __construct(\phpbb\cron\manager $cron_manager, \phpbb\user $user)
{
$this->cron_manager = $cron_manager;
@@ -30,6 +36,9 @@ class cron_list extends \phpbb\console\command\command
parent::__construct();
}
+ /**
+ * {@inheritdoc}
+ */
protected function configure()
{
$this
@@ -38,6 +47,16 @@ class cron_list extends \phpbb\console\command\command
;
}
+ /**
+ * Executes the command cron:list.
+ *
+ * Prints a list of ready and unready cron jobs.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ *
+ * @return null
+ */
protected function execute(InputInterface $input, OutputInterface $output)
{
$tasks = $this->cron_manager->get_tasks();
@@ -80,6 +99,12 @@ class cron_list extends \phpbb\console\command\command
}
}
+ /**
+ * Print a list of cron jobs
+ *
+ * @param array $tasks A list of task to display
+ * @param OutputInterface $output An OutputInterface instance
+ */
protected function print_tasks_names(array $tasks, OutputInterface $output)
{
foreach ($tasks as $task)
diff --git a/phpBB/phpbb/console/command/cron/run.php b/phpBB/phpbb/console/command/cron/run.php
index 1029a2e085..0b365ece67 100644
--- a/phpBB/phpbb/console/command/cron/run.php
+++ b/phpBB/phpbb/console/command/cron/run.php
@@ -3,7 +3,7 @@
*
* This file is part of the phpBB Forum Software package.
*
-* @copyright (c) phpBB Limited
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
@@ -15,7 +15,6 @@ namespace phpbb\console\command\cron;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class run extends \phpbb\console\command\command
@@ -35,7 +34,7 @@ class run extends \phpbb\console\command\command
* @param \phpbb\cron\manager $cron_manager The cron manager containing
* the cron tasks to be executed.
* @param \phpbb\lock\db $lock_db The lock for accessing database.
- * @param \phobb\user $user The user object (used to get language information)
+ * @param \phpbb\user $user The user object (used to get language information)
*/
public function __construct(\phpbb\cron\manager $cron_manager, \phpbb\lock\db $lock_db, \phpbb\user $user)
{
@@ -102,7 +101,7 @@ class run extends \phpbb\console\command\command
}
}
- /*
+ /**
* Executes all ready cron tasks.
*
* If verbose mode is set, an info message will be printed if there is no task to
@@ -140,7 +139,7 @@ class run extends \phpbb\console\command\command
return 0;
}
- /*
+ /**
* Executes a given cron task, if it is ready.
*
* If there is a task whose name matches $task_name, it is run and 0 is returned.
diff --git a/phpBB/phpbb/console/command/extension/disable.php b/phpBB/phpbb/console/command/extension/disable.php
index 5f0e74b984..c04848aa01 100644
--- a/phpBB/phpbb/console/command/extension/disable.php
+++ b/phpBB/phpbb/console/command/extension/disable.php
@@ -37,7 +37,7 @@ class disable extends command
$this->manager->disable($name);
$this->manager->load_extensions();
- if ($this->manager->enabled($name))
+ if ($this->manager->is_enabled($name))
{
$output->writeln("<error>Could not disable extension $name</error>");
return 1;
diff --git a/phpBB/phpbb/console/command/extension/enable.php b/phpBB/phpbb/console/command/extension/enable.php
index 0cdf26d4db..86a034cdf4 100644
--- a/phpBB/phpbb/console/command/extension/enable.php
+++ b/phpBB/phpbb/console/command/extension/enable.php
@@ -37,9 +37,9 @@ class enable extends command
$this->manager->enable($name);
$this->manager->load_extensions();
- if ($this->manager->enabled($name))
+ if ($this->manager->is_enabled($name))
{
- $this->log->add('admin', ANONYMOUS, '', 'LOG_EXTENSION_ENABLE', time(), array($name));
+ $this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_ENABLE', time(), array($name));
$output->writeln("<info>Successfully enabled extension $name</info>");
return 0;
}
diff --git a/phpBB/phpbb/console/command/extension/purge.php b/phpBB/phpbb/console/command/extension/purge.php
index 4e57641d83..841598b90a 100644
--- a/phpBB/phpbb/console/command/extension/purge.php
+++ b/phpBB/phpbb/console/command/extension/purge.php
@@ -37,7 +37,7 @@ class purge extends command
$this->manager->purge($name);
$this->manager->load_extensions();
- if ($this->manager->enabled($name))
+ if ($this->manager->is_enabled($name))
{
$output->writeln("<error>Could not purge extension $name</error>");
return 1;
diff --git a/phpBB/phpbb/content_visibility.php b/phpBB/phpbb/content_visibility.php
index 380a479e4a..1f50032f26 100644
--- a/phpBB/phpbb/content_visibility.php
+++ b/phpBB/phpbb/content_visibility.php
@@ -54,10 +54,13 @@ class content_visibility
*
* @param \phpbb\auth\auth $auth Auth object
* @param \phpbb\db\driver\driver_interface $db Database object
- * @param \phpbb\user $user User object
+ * @param \phpbb\user $user User object
* @param string $phpbb_root_path Root path
* @param string $php_ext PHP Extension
- * @return null
+ * @param string $forums_table Forums table name
+ * @param string $posts_table Posts table name
+ * @param string $topics_table Topics table name
+ * @param string $users_table Users table name
*/
public function __construct(\phpbb\auth\auth $auth, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, $phpbb_root_path, $php_ext, $forums_table, $posts_table, $topics_table, $users_table)
{
diff --git a/phpBB/phpbb/controller/helper.php b/phpBB/phpbb/controller/helper.php
index 7b232294f0..930bc42a98 100644
--- a/phpBB/phpbb/controller/helper.php
+++ b/phpBB/phpbb/controller/helper.php
@@ -101,7 +101,7 @@ class helper
* @param string $route Name of the route to travel
* @param array $params String or array of additional url parameters
* @param bool $is_amp Is url using &amp; (true) or & (false)
- * @param string $session_id Possibility to use a custom session id instead of the global one
+ * @param string|bool $session_id Possibility to use a custom session id instead of the global one
* @return string The URL already passed through append_sid()
*/
public function route($route, array $params = array(), $is_amp = true, $session_id = false)
@@ -139,8 +139,8 @@ class helper
* Output an error, effectively the same thing as trigger_error
*
* @param string $message The error message
- * @param string $code The error code (e.g. 404, 500, 503, etc.)
- * @return Response A Reponse instance
+ * @param int $code The error code (e.g. 404, 500, 503, etc.)
+ * @return Response A Response instance
*/
public function error($message, $code = 500)
{
diff --git a/phpBB/phpbb/controller/provider.php b/phpBB/phpbb/controller/provider.php
index bd85385a41..fffd4f0428 100644
--- a/phpBB/phpbb/controller/provider.php
+++ b/phpBB/phpbb/controller/provider.php
@@ -37,7 +37,7 @@ class provider
/**
* Construct method
*
- * @param array() $routing_files Array of strings containing paths
+ * @param array $routing_files Array of strings containing paths
* to YAML files holding route information
*/
public function __construct($routing_files = array())
@@ -46,6 +46,8 @@ class provider
}
/**
+ * Find the list of routing files
+ *
* @param \phpbb\finder $finder
* @return null
*/
@@ -61,10 +63,10 @@ class provider
}
/**
- * Find a list of controllers and return it
+ * Find a list of controllers
*
* @param string $base_path Base path to prepend to file paths
- * @return null
+ * @return provider
*/
public function find($base_path = '')
{
diff --git a/phpBB/phpbb/controller/resolver.php b/phpBB/phpbb/controller/resolver.php
index 77532767fc..efab34b701 100644
--- a/phpBB/phpbb/controller/resolver.php
+++ b/phpBB/phpbb/controller/resolver.php
@@ -122,7 +122,7 @@ class resolver implements ControllerResolverInterface
*
* @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object
* @param mixed $controller A callable (controller class, method)
- * @return bool False
+ * @return array An array of arguments to pass to the controller
* @throws \phpbb\controller\exception
*/
public function getArguments(Request $request, $controller)
diff --git a/phpBB/phpbb/cron/manager.php b/phpBB/phpbb/cron/manager.php
index f04f063228..b0601e641a 100644
--- a/phpBB/phpbb/cron/manager.php
+++ b/phpBB/phpbb/cron/manager.php
@@ -34,7 +34,7 @@ class manager
/**
* Constructor. Loads all available tasks.
*
- * @param array|Traversable $tasks Provides an iterable set of task names
+ * @param array|\Traversable $tasks Provides an iterable set of task names
*/
public function __construct($tasks, $phpbb_root_path, $php_ext)
{
@@ -48,7 +48,7 @@ class manager
* Loads tasks given by name, wraps them
* and puts them into $this->tasks.
*
- * @param array|Traversable $tasks Array of instances of \phpbb\cron\task\task
+ * @param array|\Traversable $tasks Array of instances of \phpbb\cron\task\task
*
* @return null
*/
diff --git a/phpBB/phpbb/cron/task/core/prune_shadow_topics.php b/phpBB/phpbb/cron/task/core/prune_shadow_topics.php
index ca5044343f..83a2460454 100644
--- a/phpBB/phpbb/cron/task/core/prune_shadow_topics.php
+++ b/phpBB/phpbb/cron/task/core/prune_shadow_topics.php
@@ -45,11 +45,11 @@ class prune_shadow_topics extends \phpbb\cron\task\base implements \phpbb\cron\t
* @param string $phpbb_root_path The root path
* @param string $php_ext The PHP extension
* @param \phpbb\config\config $config The config
- * @param \phpbb\db\driver\driver $db The db connection
+ * @param \phpbb\db\driver\driver_interface $db The db connection
* @param \phpbb\log\log $log The phpBB log system
* @param \phpbb\user $user The phpBB user object
*/
- public function __construct($phpbb_root_path, $php_ext, \phpbb\config\config $config, \phpbb\db\driver\driver $db, \phpbb\log\log $log, \phpbb\user $user)
+ public function __construct($phpbb_root_path, $php_ext, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\log\log $log, \phpbb\user $user)
{
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
@@ -164,6 +164,7 @@ class prune_shadow_topics extends \phpbb\cron\task\base implements \phpbb\cron\t
* @param int $forum_id Forum ID of forum that should be pruned
* @param string $prune_mode Prune mode
* @param int $prune_flags Prune flags
+ * @param int $prune_days Prune date in days
* @param int $prune_freq Prune frequency
* @return null
*/
diff --git a/phpBB/phpbb/datetime.php b/phpBB/phpbb/datetime.php
index 47f742f802..9c9292a8e4 100644
--- a/phpBB/phpbb/datetime.php
+++ b/phpBB/phpbb/datetime.php
@@ -39,8 +39,8 @@ class datetime extends \DateTime
* the user context and modify the timezone to the users selected timezone if one is not set.
*
* @param string $time String in a format accepted by strtotime().
- * @param DateTimeZone $timezone Time zone of the time.
- * @param user User object for context.
+ * @param \DateTimeZone $timezone Time zone of the time.
+ * @param user $user object for context.
*/
public function __construct($user, $time = 'now', \DateTimeZone $timezone = null)
{
@@ -120,7 +120,7 @@ class datetime extends \DateTime
/**
* Magic method to convert DateTime object to string
*
- * @return Formatted date time, according to the users default settings.
+ * @return string Formatted date time, according to the users default settings.
*/
public function __toString()
{
diff --git a/phpBB/phpbb/db/driver/driver.php b/phpBB/phpbb/db/driver/driver.php
index 3d4aa95606..3e9110d8bc 100644
--- a/phpBB/phpbb/db/driver/driver.php
+++ b/phpBB/phpbb/db/driver/driver.php
@@ -87,6 +87,102 @@ abstract class driver implements driver_interface
}
/**
+ * {@inheritdoc}
+ */
+ public function get_sql_layer()
+ {
+ return $this->sql_layer;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_db_name()
+ {
+ return $this->dbname;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_any_char()
+ {
+ return $this->any_char;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_one_char()
+ {
+ return $this->one_char;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_db_connect_id()
+ {
+ return $this->db_connect_id;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_error_triggered()
+ {
+ return $this->sql_error_triggered;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_error_sql()
+ {
+ return $this->sql_error_sql;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_transaction()
+ {
+ return $this->transaction;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_time()
+ {
+ return $this->sql_time;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_error_returned()
+ {
+ return $this->sql_error_returned;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_multi_insert()
+ {
+ return $this->multi_insert;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set_multi_insert($multi_insert)
+ {
+ $this->multi_insert = $multi_insert;
+ }
+
+ /**
* {@inheritDoc}
*/
function sql_return_on_error($fail = false)
diff --git a/phpBB/phpbb/db/driver/driver_interface.php b/phpBB/phpbb/db/driver/driver_interface.php
index 7f7d341e2d..6722d059a5 100644
--- a/phpBB/phpbb/db/driver/driver_interface.php
+++ b/phpBB/phpbb/db/driver/driver_interface.php
@@ -16,6 +16,90 @@ namespace phpbb\db\driver;
interface driver_interface
{
/**
+ * Gets the name of the sql layer.
+ *
+ * @return string
+ */
+ public function get_sql_layer();
+
+ /**
+ * Gets the name of the database.
+ *
+ * @return string
+ */
+ public function get_db_name();
+
+ /**
+ * Wildcards for matching any (%) character within LIKE expressions
+ *
+ * @return string
+ */
+ public function get_any_char();
+
+ /**
+ * Wildcards for matching exactly one (_) character within LIKE expressions
+ *
+ * @return string
+ */
+ public function get_one_char();
+
+ /**
+ * Gets the time spent into the queries
+ *
+ * @return int
+ */
+ public function get_sql_time();
+
+ /**
+ * Gets the connect ID.
+ *
+ * @return mixed
+ */
+ public function get_db_connect_id();
+
+ /**
+ * Indicates if an error was triggered.
+ *
+ * @return bool
+ */
+ public function get_sql_error_triggered();
+
+ /**
+ * Gets the last faulty query
+ *
+ * @return string
+ */
+ public function get_sql_error_sql();
+
+ /**
+ * Indicates if we are in a transaction.
+ *
+ * @return bool
+ */
+ public function get_transaction();
+
+ /**
+ * Gets the returned error.
+ *
+ * @return array
+ */
+ public function get_sql_error_returned();
+
+ /**
+ * Indicates if multiple insertion can be used
+ *
+ * @return bool
+ */
+ public function get_multi_insert();
+
+ /**
+ * Set if multiple insertion can be used
+ *
+ * @param bool $multi_insert
+ */
+ public function set_multi_insert($multi_insert);
+
+ /**
* Gets the exact number of rows in a specified table.
*
* @param string $table_name Table name
diff --git a/phpBB/phpbb/db/driver/factory.php b/phpBB/phpbb/db/driver/factory.php
new file mode 100644
index 0000000000..f0fa18051b
--- /dev/null
+++ b/phpBB/phpbb/db/driver/factory.php
@@ -0,0 +1,435 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\driver;
+
+use \Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+* Database Abstraction Layer
+*/
+class factory implements driver_interface
+{
+ /**
+ * @var driver_interface
+ */
+ protected $driver = null;
+
+ /**
+ * @var ContainerInterface
+ */
+ protected $container;
+
+ /**
+ * Constructor.
+ *
+ * @param ContainerInterface $container A ContainerInterface instance
+ */
+ public function __construct(ContainerInterface $container)
+ {
+ $this->container = $container;
+ }
+
+ /**
+ * Return the current driver (and retrieved it from the container if necessary)
+ *
+ * @return driver_interface
+ */
+ protected function get_driver()
+ {
+ if ($this->driver === null)
+ {
+ $this->driver = $this->container->get('dbal.conn.driver');
+ }
+
+ return $this->driver;
+ }
+
+ /**
+ * Set the current driver
+ *
+ * @param driver_interface $driver
+ */
+ public function set_driver(driver_interface $driver)
+ {
+ $this->driver = $driver;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_layer()
+ {
+ return $this->get_driver()->get_sql_layer();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_db_name()
+ {
+ return $this->get_driver()->get_db_name();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_any_char()
+ {
+ return $this->get_driver()->get_any_char();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_one_char()
+ {
+ return $this->get_driver()->get_one_char();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_db_connect_id()
+ {
+ return $this->get_driver()->get_db_connect_id();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_error_triggered()
+ {
+ return $this->get_driver()->get_sql_error_triggered();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_error_sql()
+ {
+ return $this->get_driver()->get_sql_error_sql();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_transaction()
+ {
+ return $this->get_driver()->get_transaction();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_time()
+ {
+ return $this->get_driver()->get_sql_time();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_sql_error_returned()
+ {
+ return $this->get_driver()->get_sql_error_returned();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_multi_insert()
+ {
+ return $this->get_driver()->get_multi_insert();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set_multi_insert($multi_insert)
+ {
+ $this->get_driver()->set_multi_insert($multi_insert);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_row_count($table_name)
+ {
+ return $this->get_driver()->get_row_count($table_name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_estimated_row_count($table_name)
+ {
+ return $this->get_driver()->get_estimated_row_count($table_name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_lower_text($column_name)
+ {
+ return $this->get_driver()->sql_lower_text($column_name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_error($sql = '')
+ {
+ return $this->get_driver()->sql_error($sql);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_buffer_nested_transactions()
+ {
+ return $this->get_driver()->sql_buffer_nested_transactions();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_bit_or($column_name, $bit, $compare = '')
+ {
+ return $this->get_driver()->sql_bit_or($column_name, $bit, $compare);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_server_info($raw = false, $use_cache = true)
+ {
+ return $this->get_driver()->sql_server_info($raw, $use_cache);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_return_on_error($fail = false)
+ {
+ return $this->get_driver()->sql_return_on_error($fail);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_build_array($query, $assoc_ary = array())
+ {
+ return $this->get_driver()->sql_build_array($query, $assoc_ary);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_fetchrowset($query_id = false)
+ {
+ return $this->get_driver()->sql_fetchrowset($query_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_transaction($status = 'begin')
+ {
+ return $this->get_driver()->sql_transaction($status);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_concatenate($expr1, $expr2)
+ {
+ return $this->get_driver()->sql_concatenate($expr1, $expr2);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_case($condition, $action_true, $action_false = false)
+ {
+ return $this->get_driver()->sql_case($condition, $action_true, $action_false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_build_query($query, $array)
+ {
+ return $this->get_driver()->sql_build_query($query, $array);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_fetchfield($field, $rownum = false, $query_id = false)
+ {
+ return $this->get_driver()->sql_fetchfield($field, $rownum, $query_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_fetchrow($query_id = false)
+ {
+ return $this->get_driver()->sql_fetchrow($query_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function cast_expr_to_bigint($expression)
+ {
+ return $this->get_driver()->cast_expr_to_bigint($expression);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_nextid()
+ {
+ return $this->get_driver()->sql_nextid();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_add_num_queries($cached = false)
+ {
+ return $this->get_driver()->sql_add_num_queries($cached);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
+ {
+ return $this->get_driver()->sql_query_limit($query, $total, $offset, $cache_ttl);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_query($query = '', $cache_ttl = 0)
+ {
+ return $this->get_driver()->sql_query($query, $cache_ttl);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function cast_expr_to_string($expression)
+ {
+ return $this->get_driver()->cast_expr_to_string($expression);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
+ {
+ throw new \Exception('Disabled method.');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_bit_and($column_name, $bit, $compare = '')
+ {
+ return $this->get_driver()->sql_bit_and($column_name, $bit, $compare);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_freeresult($query_id = false)
+ {
+ return $this->get_driver()->sql_freeresult($query_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_num_queries($cached = false)
+ {
+ return $this->get_driver()->sql_num_queries($cached);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_multi_insert($table, $sql_ary)
+ {
+ return $this->get_driver()->sql_multi_insert($table, $sql_ary);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_affectedrows()
+ {
+ return $this->get_driver()->sql_affectedrows();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_close()
+ {
+ return $this->get_driver()->sql_close();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_rowseek($rownum, &$query_id)
+ {
+ return $this->get_driver()->sql_rowseek($rownum, $query_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_escape($msg)
+ {
+ return $this->get_driver()->sql_escape($msg);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_like_expression($expression)
+ {
+ return $this->get_driver()->sql_like_expression($expression);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_report($mode, $query = '')
+ {
+ return $this->get_driver()->sql_report($mode, $query);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sql_in_set($field, $array, $negate = false, $allow_empty_set = false)
+ {
+ return $this->get_driver()->sql_in_set($field, $array, $negate, $allow_empty_set);
+ }
+}
diff --git a/phpBB/phpbb/db/driver/firebird.php b/phpBB/phpbb/db/driver/firebird.php
deleted file mode 100644
index c7b185a577..0000000000
--- a/phpBB/phpbb/db/driver/firebird.php
+++ /dev/null
@@ -1,526 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-namespace phpbb\db\driver;
-
-/**
-* Firebird/Interbase Database Abstraction Layer
-* Minimum Requirement is Firebird 2.1
-*/
-class firebird extends \phpbb\db\driver\driver
-{
- var $last_query_text = '';
- var $service_handle = false;
- var $affected_rows = 0;
- var $connect_error = '';
-
- /**
- * {@inheritDoc}
- */
- function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
- {
- $this->persistency = $persistency;
- $this->user = $sqluser;
- $this->server = $sqlserver . (($port) ? ':' . $port : '');
- $this->dbname = str_replace('\\', '/', $database);
-
- // There are three possibilities to connect to an interbase db
- if (!$this->server)
- {
- $use_database = $this->dbname;
- }
- else if (strpos($this->server, '//') === 0)
- {
- $use_database = $this->server . $this->dbname;
- }
- else
- {
- $use_database = $this->server . ':' . $this->dbname;
- }
-
- if ($this->persistency)
- {
- if (!function_exists('ibase_pconnect'))
- {
- $this->connect_error = 'ibase_pconnect function does not exist, is interbase extension installed?';
- return $this->sql_error('');
- }
- $this->db_connect_id = @ibase_pconnect($use_database, $this->user, $sqlpassword, false, false, 3);
- }
- else
- {
- if (!function_exists('ibase_connect'))
- {
- $this->connect_error = 'ibase_connect function does not exist, is interbase extension installed?';
- return $this->sql_error('');
- }
- $this->db_connect_id = @ibase_connect($use_database, $this->user, $sqlpassword, false, false, 3);
- }
-
- // Do not call ibase_service_attach if connection failed,
- // otherwise error message from ibase_(p)connect call will be clobbered.
- if ($this->db_connect_id && function_exists('ibase_service_attach') && $this->server)
- {
- $this->service_handle = @ibase_service_attach($this->server, $this->user, $sqlpassword);
- }
- else
- {
- $this->service_handle = false;
- }
-
- return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_server_info($raw = false, $use_cache = true)
- {
- /**
- * force $use_cache false. I didn't research why the caching code there is no caching code
- * but I assume its because the IB extension provides a direct method to access it
- * without a query.
- */
-
- $use_cache = false;
-
- if ($this->service_handle !== false && function_exists('ibase_server_info'))
- {
- return @ibase_server_info($this->service_handle, IBASE_SVC_SERVER_VERSION);
- }
-
- return ($raw) ? '2.1' : 'Firebird/Interbase';
- }
-
- /**
- * SQL Transaction
- * @access private
- */
- function _sql_transaction($status = 'begin')
- {
- switch ($status)
- {
- case 'begin':
- return true;
- break;
-
- case 'commit':
- return @ibase_commit();
- break;
-
- case 'rollback':
- return @ibase_rollback();
- break;
- }
-
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_query($query = '', $cache_ttl = 0)
- {
- if ($query != '')
- {
- global $cache;
-
- // EXPLAIN only in extra debug mode
- if (defined('DEBUG'))
- {
- $this->sql_report('start', $query);
- }
-
- $this->last_query_text = $query;
- $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
- $this->sql_add_num_queries($this->query_result);
-
- if ($this->query_result === false)
- {
- $array = array();
- // We overcome Firebird's 32767 char limit by binding vars
- if (strlen($query) > 32767)
- {
- if (preg_match('/^(INSERT INTO[^(]++)\\(([^()]+)\\) VALUES[^(]++\\((.*?)\\)$/s', $query, $regs))
- {
- if (strlen($regs[3]) > 32767)
- {
- preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER);
-
- $inserts = $vals[0];
- unset($vals);
-
- foreach ($inserts as $key => $value)
- {
- if (!empty($value) && $value[0] === "'" && strlen($value) > 32769) // check to see if this thing is greater than the max + 'x2
- {
- $inserts[$key] = '?';
- $array[] = str_replace("''", "'", substr($value, 1, -1));
- }
- }
-
- $query = $regs[1] . '(' . $regs[2] . ') VALUES (' . implode(', ', $inserts) . ')';
- }
- }
- else if (preg_match('/^(UPDATE ([\\w_]++)\\s+SET )([\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|\\d+)(?:,\\s*[\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+)\\s+(WHERE.*)$/s', $query, $data))
- {
- if (strlen($data[3]) > 32767)
- {
- $update = $data[1];
- $where = $data[4];
- preg_match_all('/(\\w++)\\s*=\\s*(\'(?:[^\']++|\'\')*+\'|[\d-.]++)/', $data[3], $temp, PREG_SET_ORDER);
- unset($data);
-
- $cols = array();
- foreach ($temp as $value)
- {
- if (!empty($value[2]) && $value[2][0] === "'" && strlen($value[2]) > 32769) // check to see if this thing is greater than the max + 'x2
- {
- $array[] = str_replace("''", "'", substr($value[2], 1, -1));
- $cols[] = $value[1] . '=?';
- }
- else
- {
- $cols[] = $value[1] . '=' . $value[2];
- }
- }
-
- $query = $update . implode(', ', $cols) . ' ' . $where;
- unset($cols);
- }
- }
- }
-
- if (!function_exists('ibase_affected_rows') && (preg_match('/^UPDATE ([\w_]++)\s+SET [\w_]++\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+)(?:,\s*[\w_]++\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+\s+(WHERE.*)?$/s', $query, $regs) || preg_match('/^DELETE FROM ([\w_]++)\s*(WHERE\s*.*)?$/s', $query, $regs)))
- {
- $affected_sql = 'SELECT COUNT(*) as num_rows_affected FROM ' . $regs[1];
- if (!empty($regs[2]))
- {
- $affected_sql .= ' ' . $regs[2];
- }
-
- if (!($temp_q_id = @ibase_query($this->db_connect_id, $affected_sql)))
- {
- return false;
- }
-
- $temp_result = @ibase_fetch_assoc($temp_q_id);
- @ibase_free_result($temp_q_id);
-
- $this->affected_rows = ($temp_result) ? $temp_result['NUM_ROWS_AFFECTED'] : false;
- }
-
- if (sizeof($array))
- {
- $p_query = @ibase_prepare($this->db_connect_id, $query);
- array_unshift($array, $p_query);
- $this->query_result = call_user_func_array('ibase_execute', $array);
- unset($array);
-
- if ($this->query_result === false)
- {
- $this->sql_error($query);
- }
- }
- else if (($this->query_result = @ibase_query($this->db_connect_id, $query)) === false)
- {
- $this->sql_error($query);
- }
-
- if (defined('DEBUG'))
- {
- $this->sql_report('stop', $query);
- }
-
- if (!$this->transaction)
- {
- if (function_exists('ibase_commit_ret'))
- {
- @ibase_commit_ret();
- }
- else
- {
- // way cooler than ibase_commit_ret :D
- @ibase_query('COMMIT RETAIN;');
- }
- }
-
- if ($cache && $cache_ttl)
- {
- $this->open_queries[(int) $this->query_result] = $this->query_result;
- $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
- }
- else if (strpos($query, 'SELECT') === 0 && $this->query_result)
- {
- $this->open_queries[(int) $this->query_result] = $this->query_result;
- }
- }
- else if (defined('DEBUG'))
- {
- $this->sql_report('fromcache', $query);
- }
- }
- else
- {
- return false;
- }
-
- return $this->query_result;
- }
-
- /**
- * Build LIMIT query
- */
- function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
- {
- $this->query_result = false;
-
- $query = 'SELECT FIRST ' . $total . ((!empty($offset)) ? ' SKIP ' . $offset : '') . substr($query, 6);
-
- return $this->sql_query($query, $cache_ttl);
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_affectedrows()
- {
- // PHP 5+ function
- if (function_exists('ibase_affected_rows'))
- {
- return ($this->db_connect_id) ? @ibase_affected_rows($this->db_connect_id) : false;
- }
- else
- {
- return $this->affected_rows;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_fetchrow($query_id = false)
- {
- global $cache;
-
- if ($query_id === false)
- {
- $query_id = $this->query_result;
- }
-
- if ($cache && $cache->sql_exists($query_id))
- {
- return $cache->sql_fetchrow($query_id);
- }
-
- if ($query_id === false)
- {
- return false;
- }
-
- $row = array();
- $cur_row = @ibase_fetch_object($query_id, IBASE_TEXT);
-
- if (!$cur_row)
- {
- return false;
- }
-
- foreach (get_object_vars($cur_row) as $key => $value)
- {
- $row[strtolower($key)] = (is_string($value)) ? trim(str_replace(array("\\0", "\\n"), array("\0", "\n"), $value)) : $value;
- }
-
- return (sizeof($row)) ? $row : false;
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_nextid()
- {
- $query_id = $this->query_result;
-
- if ($query_id !== false && $this->last_query_text != '')
- {
- if ($this->query_result && preg_match('#^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)#i', $this->last_query_text, $tablename))
- {
- $sql = 'SELECT GEN_ID(' . $tablename[1] . '_gen, 0) AS new_id FROM RDB$DATABASE';
-
- if (!($temp_q_id = @ibase_query($this->db_connect_id, $sql)))
- {
- return false;
- }
-
- $temp_result = @ibase_fetch_assoc($temp_q_id);
- @ibase_free_result($temp_q_id);
-
- return ($temp_result) ? $temp_result['NEW_ID'] : false;
- }
- }
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_freeresult($query_id = false)
- {
- global $cache;
-
- if ($query_id === false)
- {
- $query_id = $this->query_result;
- }
-
- if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
- {
- return $cache->sql_freeresult($query_id);
- }
-
- if (isset($this->open_queries[(int) $query_id]))
- {
- unset($this->open_queries[(int) $query_id]);
- return @ibase_free_result($query_id);
- }
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- function sql_escape($msg)
- {
- return str_replace(array("'", "\0"), array("''", ''), $msg);
- }
-
- /**
- * Build LIKE expression
- * @access private
- */
- function _sql_like_expression($expression)
- {
- return $expression . " ESCAPE '\\'";
- }
-
- /**
- * Build db-specific query data
- * @access private
- */
- function _sql_custom_build($stage, $data)
- {
- return $data;
- }
-
- function _sql_bit_and($column_name, $bit, $compare = '')
- {
- return 'BIN_AND(' . $column_name . ', ' . (1 << $bit) . ')' . (($compare) ? ' ' . $compare : '');
- }
-
- function _sql_bit_or($column_name, $bit, $compare = '')
- {
- return 'BIN_OR(' . $column_name . ', ' . (1 << $bit) . ')' . (($compare) ? ' ' . $compare : '');
- }
-
- /**
- * {@inheritDoc}
- */
- function cast_expr_to_bigint($expression)
- {
- // Precision must be from 1 to 18
- return 'CAST(' . $expression . ' as DECIMAL(18, 0))';
- }
-
- /**
- * {@inheritDoc}
- */
- function cast_expr_to_string($expression)
- {
- return 'CAST(' . $expression . ' as VARCHAR(255))';
- }
-
- /**
- * return sql error array
- * @access private
- */
- function _sql_error()
- {
- // Need special handling here because ibase_errmsg returns
- // connection errors, however if the interbase extension
- // is not installed then ibase_errmsg does not exist and
- // we cannot call it.
- if (function_exists('ibase_errmsg'))
- {
- $msg = @ibase_errmsg();
- if (!$msg)
- {
- $msg = $this->connect_error;
- }
- }
- else
- {
- $msg = $this->connect_error;
- }
- return array(
- 'message' => $msg,
- 'code' => (@function_exists('ibase_errcode') ? @ibase_errcode() : '')
- );
- }
-
- /**
- * Close sql connection
- * @access private
- */
- function _sql_close()
- {
- if ($this->service_handle !== false)
- {
- @ibase_service_detach($this->service_handle);
- }
-
- return @ibase_close($this->db_connect_id);
- }
-
- /**
- * Build db-specific report
- * @access private
- */
- function _sql_report($mode, $query = '')
- {
- switch ($mode)
- {
- case 'start':
- break;
-
- case 'fromcache':
- $endtime = explode(' ', microtime());
- $endtime = $endtime[0] + $endtime[1];
-
- $result = @ibase_query($this->db_connect_id, $query);
- while ($void = @ibase_fetch_object($result, IBASE_TEXT))
- {
- // Take the time spent on parsing rows into account
- }
- @ibase_free_result($result);
-
- $splittime = explode(' ', microtime());
- $splittime = $splittime[0] + $splittime[1];
-
- $this->sql_report('record_fromcache', $query, $endtime, $splittime);
-
- break;
- }
- }
-}
diff --git a/phpBB/phpbb/db/driver/mssql.php b/phpBB/phpbb/db/driver/mssql.php
index 2e56638617..268463a151 100644
--- a/phpBB/phpbb/db/driver/mssql.php
+++ b/phpBB/phpbb/db/driver/mssql.php
@@ -137,6 +137,10 @@ class mssql extends \phpbb\db\driver\driver
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
$this->sql_add_num_queries($this->query_result);
@@ -152,6 +156,10 @@ class mssql extends \phpbb\db\driver\driver
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/driver/mssql_odbc.php b/phpBB/phpbb/db/driver/mssql_odbc.php
index de90d878e7..8e5d4c7a4c 100644
--- a/phpBB/phpbb/db/driver/mssql_odbc.php
+++ b/phpBB/phpbb/db/driver/mssql_odbc.php
@@ -156,6 +156,10 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->last_query_text = $query;
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
@@ -172,6 +176,10 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/driver/mssqlnative.php b/phpBB/phpbb/db/driver/mssqlnative.php
index 9639bfa988..46a9b3a477 100644
--- a/phpBB/phpbb/db/driver/mssqlnative.php
+++ b/phpBB/phpbb/db/driver/mssqlnative.php
@@ -127,6 +127,10 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->last_query_text = $query;
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
@@ -145,6 +149,10 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
@@ -319,10 +327,10 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
{
foreach ($errors as $error)
{
- $error_message .= "SQLSTATE: " . $error[ 'SQLSTATE'] . "\n";
- $error_message .= "code: " . $error[ 'code'] . "\n";
+ $error_message .= "SQLSTATE: " . $error['SQLSTATE'] . "\n";
+ $error_message .= "code: " . $error['code'] . "\n";
$code = $error['code'];
- $error_message .= "message: " . $error[ 'message'] . "\n";
+ $error_message .= "message: " . $error['message'] . "\n";
}
$this->last_error_result = $error_message;
$error = $this->last_error_result;
diff --git a/phpBB/phpbb/db/driver/mysql.php b/phpBB/phpbb/db/driver/mysql.php
index 569bd4f10a..e93c7239e8 100644
--- a/phpBB/phpbb/db/driver/mysql.php
+++ b/phpBB/phpbb/db/driver/mysql.php
@@ -166,6 +166,10 @@ class mysql extends \phpbb\db\driver\mysql_base
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
$this->sql_add_num_queries($this->query_result);
@@ -181,6 +185,10 @@ class mysql extends \phpbb\db\driver\mysql_base
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/driver/mysqli.php b/phpBB/phpbb/db/driver/mysqli.php
index 58361ff0f8..2ed08211ad 100644
--- a/phpBB/phpbb/db/driver/mysqli.php
+++ b/phpBB/phpbb/db/driver/mysqli.php
@@ -61,7 +61,11 @@ class mysqli extends \phpbb\db\driver\mysql_base
}
$this->db_connect_id = mysqli_init();
- @mysqli_real_connect($this->db_connect_id, $this->server, $this->user, $sqlpassword, $this->dbname, $port, $socket, MYSQLI_CLIENT_FOUND_ROWS);
+
+ if (!@mysqli_real_connect($this->db_connect_id, $this->server, $this->user, $sqlpassword, $this->dbname, $port, $socket, MYSQLI_CLIENT_FOUND_ROWS))
+ {
+ $this->db_connect_id = '';
+ }
if ($this->db_connect_id && $this->dbname != '')
{
@@ -71,10 +75,17 @@ class mysqli extends \phpbb\db\driver\mysql_base
if (version_compare($this->sql_server_info(true), '5.0.2', '>='))
{
$result = @mysqli_query($this->db_connect_id, 'SELECT @@session.sql_mode AS sql_mode');
- $row = @mysqli_fetch_assoc($result);
- @mysqli_free_result($result);
+ if ($result !== null)
+ {
+ $row = @mysqli_fetch_assoc($result);
- $modes = array_map('trim', explode(',', $row['sql_mode']));
+ $modes = array_map('trim', explode(',', $row['sql_mode']));
+ }
+ else
+ {
+ $modes = array();
+ }
+ @mysqli_free_result($result);
// TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
if (!in_array('TRADITIONAL', $modes))
@@ -109,15 +120,18 @@ class mysqli extends \phpbb\db\driver\mysql_base
if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysqli_version')) === false)
{
$result = @mysqli_query($this->db_connect_id, 'SELECT VERSION() AS version');
- $row = @mysqli_fetch_assoc($result);
- @mysqli_free_result($result);
+ if ($result !== null)
+ {
+ $row = @mysqli_fetch_assoc($result);
- $this->sql_server_version = $row['version'];
+ $this->sql_server_version = $row['version'];
- if (!empty($cache) && $use_cache)
- {
- $cache->put('mysqli_version', $this->sql_server_version);
+ if (!empty($cache) && $use_cache)
+ {
+ $cache->put('mysqli_version', $this->sql_server_version);
+ }
}
+ @mysqli_free_result($result);
}
return ($raw) ? $this->sql_server_version : 'MySQL(i) ' . $this->sql_server_version;
@@ -165,6 +179,10 @@ class mysqli extends \phpbb\db\driver\mysql_base
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
$this->sql_add_num_queries($this->query_result);
@@ -180,6 +198,10 @@ class mysqli extends \phpbb\db\driver\mysql_base
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
@@ -224,7 +246,7 @@ class mysqli extends \phpbb\db\driver\mysql_base
return $cache->sql_fetchrow($query_id);
}
- if ($query_id !== false)
+ if ($query_id !== false && $query_id !== null)
{
$result = @mysqli_fetch_assoc($query_id);
return $result !== null ? $result : false;
@@ -434,9 +456,12 @@ class mysqli extends \phpbb\db\driver\mysql_base
$endtime = $endtime[0] + $endtime[1];
$result = @mysqli_query($this->db_connect_id, $query);
- while ($void = @mysqli_fetch_assoc($result))
+ if ($result !== null)
{
- // Take the time spent on parsing rows into account
+ while ($void = @mysqli_fetch_assoc($result))
+ {
+ // Take the time spent on parsing rows into account
+ }
}
@mysqli_free_result($result);
diff --git a/phpBB/phpbb/db/driver/oracle.php b/phpBB/phpbb/db/driver/oracle.php
index bfc5373e35..d1a186f1ba 100644
--- a/phpBB/phpbb/db/driver/oracle.php
+++ b/phpBB/phpbb/db/driver/oracle.php
@@ -253,6 +253,10 @@ class oracle extends \phpbb\db\driver\driver
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->last_query_text = $query;
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
@@ -430,6 +434,10 @@ class oracle extends \phpbb\db\driver\driver
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/driver/postgres.php b/phpBB/phpbb/db/driver/postgres.php
index a4aa9497ed..a67cd9f7c2 100644
--- a/phpBB/phpbb/db/driver/postgres.php
+++ b/phpBB/phpbb/db/driver/postgres.php
@@ -179,6 +179,10 @@ class postgres extends \phpbb\db\driver\driver
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->last_query_text = $query;
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
@@ -195,6 +199,10 @@ class postgres extends \phpbb\db\driver\driver
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/driver/sqlite.php b/phpBB/phpbb/db/driver/sqlite.php
index f4c5e240fc..2112e5ba2f 100644
--- a/phpBB/phpbb/db/driver/sqlite.php
+++ b/phpBB/phpbb/db/driver/sqlite.php
@@ -121,6 +121,10 @@ class sqlite extends \phpbb\db\driver\driver
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
$this->sql_add_num_queries($this->query_result);
@@ -136,6 +140,10 @@ class sqlite extends \phpbb\db\driver\driver
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/driver/sqlite3.php b/phpBB/phpbb/db/driver/sqlite3.php
index 36d8a83f4b..0922229e0a 100644
--- a/phpBB/phpbb/db/driver/sqlite3.php
+++ b/phpBB/phpbb/db/driver/sqlite3.php
@@ -122,6 +122,10 @@ class sqlite3 extends \phpbb\db\driver\driver
{
$this->sql_report('start', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->curtime = microtime(true);
+ }
$this->last_query_text = $query;
$this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
@@ -138,6 +142,10 @@ class sqlite3 extends \phpbb\db\driver\driver
{
$this->sql_report('stop', $query);
}
+ else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
+ {
+ $this->sql_time += microtime(true) - $this->curtime;
+ }
if ($cache && $cache_ttl)
{
diff --git a/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php b/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php
index 139dc95b28..648ae9ce96 100644
--- a/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php
+++ b/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php
@@ -37,16 +37,23 @@ class local_url_bbcode extends \phpbb\db\migration\migration
{
$sql = 'SELECT *
FROM ' . BBCODES_TABLE . '
- WHERE bbcode_match ' . $this->db->sql_like_expression($this->db->any_char . 'LOCAL_URL' . $this->db->any_char);
+ WHERE bbcode_match ' . $this->db->sql_like_expression($this->db->get_any_char() . 'LOCAL_URL' . $this->db->get_any_char());
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
if (!class_exists('acp_bbcodes'))
{
- global $phpEx;
- phpbb_require_updated('includes/acp/acp_bbcodes.' . $phpEx);
+ if (function_exists('phpbb_require_updated'))
+ {
+ phpbb_require_updated('includes/acp/acp_bbcodes.' . $this->php_ext);
+ }
+ else
+ {
+ require($this->phpbb_root_path . 'includes/acp/acp_bbcodes.' . $this->php_ext);
+ }
}
+
$bbcode_match = $row['bbcode_match'];
$bbcode_tpl = $row['bbcode_tpl'];
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php
index db3c587f82..9b08da0125 100644
--- a/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php
@@ -36,7 +36,7 @@ class release_3_0_4 extends \phpbb\db\migration\migration
public function rename_log_delete_topic()
{
- if ($this->db->sql_layer == 'oracle')
+ if ($this->db->get_sql_layer() == 'oracle')
{
// log_operation is CLOB - but we can change this later
$sql = 'UPDATE ' . $this->table_prefix . "log
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php
index d86c4d6986..1843c3f262 100644
--- a/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php
@@ -76,7 +76,7 @@ class release_3_0_7_rc1 extends \phpbb\db\migration\migration
{
// Delete all text-templates from the template_data
$sql = 'DELETE FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
- WHERE template_filename ' . $this->db->sql_like_expression($this->db->any_char . '.txt');
+ WHERE template_filename ' . $this->db->sql_like_expression($this->db->get_any_char() . '.txt');
$this->sql_query($sql);
}
}
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php
index 24340c8cf1..06e46d522f 100644
--- a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php
@@ -89,7 +89,7 @@ class release_3_0_9_rc1 extends \phpbb\db\migration\migration
// Update file extension group names to use language strings, again.
$sql = 'SELECT group_id, group_name
FROM ' . EXTENSION_GROUPS_TABLE . '
- WHERE group_name ' . $this->db->sql_like_expression('EXT_GROUP_' . $this->db->any_char);
+ WHERE group_name ' . $this->db->sql_like_expression('EXT_GROUP_' . $this->db->get_any_char());
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
diff --git a/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php b/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php
index bd682e2f7c..20bd547ac3 100644
--- a/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php
+++ b/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package migration
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
diff --git a/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php b/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php
index e255efb99d..c2dd09ddf6 100644
--- a/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php
+++ b/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package migration
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
diff --git a/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php b/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php
index df1560f5b1..4530ebe285 100644
--- a/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php
+++ b/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php
@@ -18,7 +18,7 @@ class mysql_fulltext_drop extends \phpbb\db\migration\migration
public function effectively_installed()
{
// This migration is irrelevant for all non-MySQL DBMSes.
- return strpos($this->db->sql_layer, 'mysql') === false;
+ return strpos($this->db->get_sql_layer(), 'mysql') === false;
}
static public function depends_on()
diff --git a/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php b/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php
index ca784656e7..ea442dfb1b 100644
--- a/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php
+++ b/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php
@@ -18,7 +18,7 @@ class postgres_fulltext_drop extends \phpbb\db\migration\migration
public function effectively_installed()
{
// This migration is irrelevant for all non-PostgreSQL DBMSes.
- return strpos($this->db->sql_layer, 'postgres') === false;
+ return strpos($this->db->get_sql_layer(), 'postgres') === false;
}
static public function depends_on()
diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php b/phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php
new file mode 100644
index 0000000000..5964e7a997
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class profilefield_facebook extends \phpbb\db\migration\profilefield_base_migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\profilefield_types',
+ '\phpbb\db\migration\data\v310\profilefield_show_novalue',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'create_custom_field'))),
+ );
+ }
+
+ protected $profilefield_name = 'phpbb_facebook';
+
+ protected $profilefield_database_type = array('VCHAR', '');
+
+ protected $profilefield_data = array(
+ 'field_name' => 'phpbb_facebook',
+ 'field_type' => 'profilefields.type.string',
+ 'field_ident' => 'phpbb_facebook',
+ 'field_length' => '20',
+ 'field_minlen' => '5',
+ 'field_maxlen' => '50',
+ 'field_novalue' => '',
+ 'field_default_value' => '',
+ 'field_validation' => '[\w.]+',
+ 'field_required' => 0,
+ 'field_show_novalue' => 0,
+ 'field_show_on_reg' => 0,
+ 'field_show_on_pm' => 1,
+ 'field_show_on_vt' => 1,
+ 'field_show_profile' => 1,
+ 'field_hide' => 0,
+ 'field_no_view' => 0,
+ 'field_active' => 1,
+ 'field_is_contact' => 1,
+ 'field_contact_desc' => 'VIEW_FACEBOOK_PROFILE',
+ 'field_contact_url' => 'http://facebook.com/%s/',
+ );
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php b/phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php
new file mode 100644
index 0000000000..9bef0a4c0b
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class profilefield_googleplus extends \phpbb\db\migration\profilefield_base_migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\profilefield_types',
+ '\phpbb\db\migration\data\v310\profilefield_show_novalue',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'create_custom_field'))),
+ );
+ }
+
+ protected $profilefield_name = 'phpbb_googleplus';
+
+ protected $profilefield_database_type = array('VCHAR', '');
+
+ protected $profilefield_data = array(
+ 'field_name' => 'phpbb_googleplus',
+ 'field_type' => 'profilefields.type.googleplus',
+ 'field_ident' => 'phpbb_googleplus',
+ 'field_length' => '20',
+ 'field_minlen' => '3',
+ 'field_maxlen' => '255',
+ 'field_novalue' => '',
+ 'field_default_value' => '',
+ 'field_validation' => '[\w]+',
+ 'field_required' => 0,
+ 'field_show_novalue' => 0,
+ 'field_show_on_reg' => 0,
+ 'field_show_on_pm' => 1,
+ 'field_show_on_vt' => 1,
+ 'field_show_profile' => 1,
+ 'field_hide' => 0,
+ 'field_no_view' => 0,
+ 'field_active' => 1,
+ 'field_is_contact' => 1,
+ 'field_contact_desc' => 'VIEW_GOOGLEPLUS_PROFILE',
+ 'field_contact_url' => 'http://plus.google.com/%s',
+ );
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_skype.php b/phpBB/phpbb/db/migration/data/v310/profilefield_skype.php
new file mode 100644
index 0000000000..9a5de9d0eb
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/profilefield_skype.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class profilefield_skype extends \phpbb\db\migration\profilefield_base_migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\profilefield_types',
+ '\phpbb\db\migration\data\v310\profilefield_show_novalue',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'create_custom_field'))),
+ );
+ }
+
+ protected $profilefield_name = 'phpbb_skype';
+
+ protected $profilefield_database_type = array('VCHAR', '');
+
+ protected $profilefield_data = array(
+ 'field_name' => 'phpbb_skype',
+ 'field_type' => 'profilefields.type.string',
+ 'field_ident' => 'phpbb_skype',
+ 'field_length' => '20',
+ 'field_minlen' => '6',
+ 'field_maxlen' => '32',
+ 'field_novalue' => '',
+ 'field_default_value' => '',
+ 'field_validation' => '[a-zA-Z][\w\.,\-_]+',
+ 'field_required' => 0,
+ 'field_show_novalue' => 0,
+ 'field_show_on_reg' => 0,
+ 'field_show_on_pm' => 1,
+ 'field_show_on_vt' => 1,
+ 'field_show_profile' => 1,
+ 'field_hide' => 0,
+ 'field_no_view' => 0,
+ 'field_active' => 1,
+ 'field_is_contact' => 1,
+ 'field_contact_desc' => 'VIEW_SKYPE_PROFILE',
+ 'field_contact_url' => 'skype:%s?userinfo',
+ );
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php b/phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php
new file mode 100644
index 0000000000..68d038f609
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class profilefield_twitter extends \phpbb\db\migration\profilefield_base_migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\profilefield_types',
+ '\phpbb\db\migration\data\v310\profilefield_show_novalue',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'create_custom_field'))),
+ );
+ }
+
+ protected $profilefield_name = 'phpbb_twitter';
+
+ protected $profilefield_database_type = array('VCHAR', '');
+
+ protected $profilefield_data = array(
+ 'field_name' => 'phpbb_twitter',
+ 'field_type' => 'profilefields.type.string',
+ 'field_ident' => 'phpbb_twitter',
+ 'field_length' => '20',
+ 'field_minlen' => '1',
+ 'field_maxlen' => '15',
+ 'field_novalue' => '',
+ 'field_default_value' => '',
+ 'field_validation' => '[\w_]+',
+ 'field_required' => 0,
+ 'field_show_novalue' => 0,
+ 'field_show_on_reg' => 0,
+ 'field_show_on_pm' => 1,
+ 'field_show_on_vt' => 1,
+ 'field_show_profile' => 1,
+ 'field_hide' => 0,
+ 'field_no_view' => 0,
+ 'field_active' => 1,
+ 'field_is_contact' => 1,
+ 'field_contact_desc' => 'VIEW_TWITTER_PROFILE',
+ 'field_contact_url' => 'http://twitter.com/%s',
+ );
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php b/phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php
new file mode 100644
index 0000000000..bb90c0aa5c
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class profilefield_youtube extends \phpbb\db\migration\profilefield_base_migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\profilefield_types',
+ '\phpbb\db\migration\data\v310\profilefield_show_novalue',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'create_custom_field'))),
+ );
+ }
+
+ protected $profilefield_name = 'phpbb_youtube';
+
+ protected $profilefield_database_type = array('VCHAR', '');
+
+ protected $profilefield_data = array(
+ 'field_name' => 'phpbb_youtube',
+ 'field_type' => 'profilefields.type.string',
+ 'field_ident' => 'phpbb_youtube',
+ 'field_length' => '20',
+ 'field_minlen' => '3',
+ 'field_maxlen' => '60',
+ 'field_novalue' => '',
+ 'field_default_value' => '',
+ 'field_validation' => '[a-zA-Z][\w\.,\-_]+',
+ 'field_required' => 0,
+ 'field_show_novalue' => 0,
+ 'field_show_on_reg' => 0,
+ 'field_show_on_pm' => 1,
+ 'field_show_on_vt' => 1,
+ 'field_show_profile' => 1,
+ 'field_hide' => 0,
+ 'field_no_view' => 0,
+ 'field_active' => 1,
+ 'field_is_contact' => 1,
+ 'field_contact_desc' => 'VIEW_YOUTUBE_CHANNEL',
+ 'field_contact_url' => 'http://youtube.com/user/%s',
+ );
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/rc1.php b/phpBB/phpbb/db/migration/data/v310/rc1.php
new file mode 100644
index 0000000000..10ba7fefff
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/rc1.php
@@ -0,0 +1,39 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class rc1 extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\beta4',
+ '\phpbb\db\migration\data\v310\contact_admin_acp_module',
+ '\phpbb\db\migration\data\v310\contact_admin_form',
+ '\phpbb\db\migration\data\v310\passwords_convert_p2',
+ '\phpbb\db\migration\data\v310\profilefield_facebook',
+ '\phpbb\db\migration\data\v310\profilefield_googleplus',
+ '\phpbb\db\migration\data\v310\profilefield_skype',
+ '\phpbb\db\migration\data\v310\profilefield_twitter',
+ '\phpbb\db\migration\data\v310\profilefield_youtube',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.1.0-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/migration.php b/phpBB/phpbb/db/migration/migration.php
index fdfc31da3a..5f120333e1 100644
--- a/phpBB/phpbb/db/migration/migration.php
+++ b/phpBB/phpbb/db/migration/migration.php
@@ -160,11 +160,11 @@ abstract class migration
else
{
$result = $this->db->sql_query($sql);
- if ($this->db->sql_error_triggered)
+ if ($this->db->get_sql_error_triggered())
{
$this->errors[] = array(
- 'sql' => $this->db->sql_error_sql,
- 'code' => $this->db->sql_error_returned,
+ 'sql' => $this->db->get_sql_error_sql(),
+ 'code' => $this->db->get_sql_error_returned(),
);
}
}
diff --git a/phpBB/phpbb/db/migration/profilefield_base_migration.php b/phpBB/phpbb/db/migration/profilefield_base_migration.php
index 9cdd5d0927..d416a9b228 100644
--- a/phpBB/phpbb/db/migration/profilefield_base_migration.php
+++ b/phpBB/phpbb/db/migration/profilefield_base_migration.php
@@ -79,12 +79,13 @@ abstract class profilefield_base_migration extends \phpbb\db\migration\migration
$sql = 'SELECT lang_id
FROM ' . LANG_TABLE;
$result = $this->db->sql_query($sql);
+ $lang_name = (strpos($this->profilefield_name, 'phpbb_') === 0) ? strtoupper(substr($this->profilefield_name, 6)) : strtoupper($this->profilefield_name);
while ($lang_id = (int) $this->db->sql_fetchfield('lang_id'))
{
$insert_buffer->insert(array(
'field_id' => $field_id,
'lang_id' => $lang_id,
- 'lang_name' => strtoupper(substr($this->profilefield_name, 6)),// Remove phpbb_ from field name
+ 'lang_name' => $lang_name,
'lang_explain' => '',
'lang_default_value' => '',
));
diff --git a/phpBB/phpbb/db/migration/schema_generator.php b/phpBB/phpbb/db/migration/schema_generator.php
index 818e27a362..91d8307d91 100644
--- a/phpBB/phpbb/db/migration/schema_generator.php
+++ b/phpBB/phpbb/db/migration/schema_generator.php
@@ -217,7 +217,7 @@ class schema_generator
* Check if one of the migrations files' dependencies can't be resolved
* by the supplied list of migrations
*
- * @throws UnexpectedValueException If a dependency can't be resolved
+ * @throws \UnexpectedValueException If a dependency can't be resolved
*/
protected function check_dependencies()
{
diff --git a/phpBB/phpbb/db/migration/tool/config.php b/phpBB/phpbb/db/migration/tool/config.php
index 1027b425ff..f93e7118c4 100644
--- a/phpBB/phpbb/db/migration/tool/config.php
+++ b/phpBB/phpbb/db/migration/tool/config.php
@@ -66,6 +66,7 @@ class config implements \phpbb\db\migration\tool\tool_interface
* like to update
* @param mixed $config_value The value of the config setting
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function update($config_name, $config_value)
{
@@ -87,6 +88,7 @@ class config implements \phpbb\db\migration\tool\tool_interface
* like to update
* @param mixed $config_value The value of the config setting
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function update_if_equals($compare, $config_name, $config_value)
{
diff --git a/phpBB/phpbb/db/migration/tool/module.php b/phpBB/phpbb/db/migration/tool/module.php
index 17deb1b19c..db43046a95 100644
--- a/phpBB/phpbb/db/migration/tool/module.php
+++ b/phpBB/phpbb/db/migration/tool/module.php
@@ -167,6 +167,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
* modules in that info file.
* path, specify that here
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function add($class, $parent = 0, $data = array())
{
@@ -331,6 +332,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
* @param int|string $module The module id|module_langname
* specify that here
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function remove($class, $parent = 0, $module = '')
{
@@ -466,6 +468,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
* @param string $class Module Class
* @param string $basename Module Basename
* @return array Module Information
+ * @throws \phpbb\db\migration\exception
*/
protected function get_module_info($class, $basename)
{
diff --git a/phpBB/phpbb/db/migration/tool/permission.php b/phpBB/phpbb/db/migration/tool/permission.php
index ba856fbeda..d2df27613a 100644
--- a/phpBB/phpbb/db/migration/tool/permission.php
+++ b/phpBB/phpbb/db/migration/tool/permission.php
@@ -283,6 +283,7 @@ class permission implements \phpbb\db\migration\tool\tool_interface
* @param string $old_role_name The old role name
* @param string $new_role_name The new role name
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function role_update($old_role_name, $new_role_name)
{
@@ -345,6 +346,7 @@ class permission implements \phpbb\db\migration\tool\tool_interface
* @param bool $has_permission True if you want to give them permission,
* false if you want to deny them permission
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function permission_set($name, $auth_option, $type = 'role', $has_permission = true)
{
@@ -490,6 +492,7 @@ class permission implements \phpbb\db\migration\tool\tool_interface
* auth_options you would like to set
* @param string $type The type (role|group)
* @return null
+ * @throws \phpbb\db\migration\exception
*/
public function permission_unset($name, $auth_option, $type = 'role')
{
diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php
index 5255c73c1c..8b089a060f 100644
--- a/phpBB/phpbb/db/migrator.php
+++ b/phpBB/phpbb/db/migrator.php
@@ -110,7 +110,7 @@ class migrator
FROM " . $this->migrations_table;
$result = $this->db->sql_query($sql);
- if (!$this->db->sql_error_triggered)
+ if (!$this->db->get_sql_error_triggered())
{
while ($migration = $this->db->sql_fetchrow($result))
{
@@ -167,8 +167,9 @@ class migrator
/**
* Attempts to apply a step of the given migration or one of its dependencies
*
- * @param string The class name of the migration
+ * @param string $name The class name of the migration
* @return bool Whether any update step was successfully run
+ * @throws \phpbb\db\migration\exception
*/
protected function try_apply($name)
{
@@ -302,7 +303,7 @@ class migrator
/**
* Attempts to revert a step of the given migration or one of its dependencies
*
- * @param string The class name of the migration
+ * @param string $name The class name of the migration
* @return bool Whether any update step was successfully run
*/
protected function try_revert($name)
@@ -368,6 +369,7 @@ class migrator
* @param bool|string $state Current state of the migration
* @param bool $revert true to revert a data step
* @return bool|string migration state. True if completed, serialized array if not finished
+ * @throws \phpbb\db\migration\exception
*/
protected function process_data_step($steps, $state, $revert = false)
{
@@ -464,6 +466,7 @@ class migrator
* @param mixed $last_result Result to pass to the callable (only for 'custom' method)
* @param bool $reverse False to install, True to attempt uninstallation by reversing the call
* @return array Array with parameters for call_user_func_array(), 0 is the callable, 1 is parameters
+ * @throws \phpbb\db\migration\exception
*/
protected function get_callable_from_step(array $step, $last_result = 0, $reverse = false)
{
@@ -722,6 +725,7 @@ class migrator
* to prevent errors (if including multiple directories, check
* with the last call to prevent throwing errors unnecessarily).
* @return array Array of migration names
+ * @throws \phpbb\db\migration\exception
*/
public function load_migrations(\phpbb\finder $finder, $path, $check_fulfillable = true)
{
diff --git a/phpBB/phpbb/db/sql_insert_buffer.php b/phpBB/phpbb/db/sql_insert_buffer.php
index 6b6f556571..14e3c54f09 100644
--- a/phpBB/phpbb/db/sql_insert_buffer.php
+++ b/phpBB/phpbb/db/sql_insert_buffer.php
@@ -92,7 +92,7 @@ class sql_insert_buffer
// Flush buffer if it is full or when DB does not support multi inserts.
// In the later case, the buffer will always only contain one row.
- if (!$this->db->multi_insert || sizeof($this->buffer) >= $this->max_buffered_rows)
+ if (!$this->db->get_multi_insert() || sizeof($this->buffer) >= $this->max_buffered_rows)
{
return $this->flush();
}
diff --git a/phpBB/phpbb/db/tools.php b/phpBB/phpbb/db/tools.php
index 3d065ede8e..18defc4535 100644
--- a/phpBB/phpbb/db/tools.php
+++ b/phpBB/phpbb/db/tools.php
@@ -109,36 +109,6 @@ class tools
'VARBINARY' => 'varbinary(255)',
),
- 'firebird' => array(
- 'INT:' => 'INTEGER',
- 'BINT' => 'DOUBLE PRECISION',
- 'UINT' => 'INTEGER',
- 'UINT:' => 'INTEGER',
- 'TINT:' => 'INTEGER',
- 'USINT' => 'INTEGER',
- 'BOOL' => 'INTEGER',
- 'VCHAR' => 'VARCHAR(255) CHARACTER SET NONE',
- 'VCHAR:' => 'VARCHAR(%d) CHARACTER SET NONE',
- 'CHAR:' => 'CHAR(%d) CHARACTER SET NONE',
- 'XSTEXT' => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
- 'STEXT' => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
- 'TEXT' => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
- 'MTEXT' => 'BLOB SUB_TYPE TEXT CHARACTER SET NONE',
- 'XSTEXT_UNI'=> 'VARCHAR(100) CHARACTER SET UTF8',
- 'STEXT_UNI' => 'VARCHAR(255) CHARACTER SET UTF8',
- 'TEXT_UNI' => 'BLOB SUB_TYPE TEXT CHARACTER SET UTF8',
- 'MTEXT_UNI' => 'BLOB SUB_TYPE TEXT CHARACTER SET UTF8',
- 'TIMESTAMP' => 'INTEGER',
- 'DECIMAL' => 'DOUBLE PRECISION',
- 'DECIMAL:' => 'DOUBLE PRECISION',
- 'PDECIMAL' => 'DOUBLE PRECISION',
- 'PDECIMAL:' => 'DOUBLE PRECISION',
- 'VCHAR_UNI' => 'VARCHAR(255) CHARACTER SET UTF8',
- 'VCHAR_UNI:'=> 'VARCHAR(%d) CHARACTER SET UTF8',
- 'VCHAR_CI' => 'VARCHAR(255) CHARACTER SET UTF8',
- 'VARBINARY' => 'CHAR(255) CHARACTER SET NONE',
- ),
-
'mssql' => array(
'INT:' => '[int]',
'BINT' => '[float]',
@@ -331,7 +301,7 @@ class tools
* A list of supported DBMS. We change this class to support more DBMS, the DBMS itself only need to follow some rules.
* @var array
*/
- var $supported_dbms = array('firebird', 'mssql', 'mssqlnative', 'mysql_40', 'mysql_41', 'oracle', 'postgres', 'sqlite', 'sqlite3');
+ var $supported_dbms = array('mssql', 'mssqlnative', 'mysql_40', 'mysql_41', 'oracle', 'postgres', 'sqlite', 'sqlite3');
/**
* This is set to true if user only wants to return the 'to-be-executed' SQL statement(s) (as an array).
@@ -353,7 +323,7 @@ class tools
$this->dbms_type_map = self::get_dbms_type_map();
// Determine mapping database type
- switch ($this->db->sql_layer)
+ switch ($this->db->get_sql_layer())
{
case 'mysql':
$this->sql_layer = 'mysql_40';
@@ -384,7 +354,7 @@ class tools
break;
default:
- $this->sql_layer = $this->db->sql_layer;
+ $this->sql_layer = $this->db->get_sql_layer();
break;
}
}
@@ -407,7 +377,7 @@ class tools
*/
function sql_list_tables()
{
- switch ($this->db->sql_layer)
+ switch ($this->db->get_sql_layer())
{
case 'mysql':
case 'mysql4':
@@ -441,13 +411,6 @@ class tools
FROM pg_stat_user_tables';
break;
- case 'firebird':
- $sql = 'SELECT rdb$relation_name
- FROM rdb$relations
- WHERE rdb$view_source is null
- AND rdb$system_flag = 0';
- break;
-
case 'oracle':
$sql = 'SELECT table_name
FROM USER_TABLES';
@@ -580,7 +543,6 @@ class tools
// Close the table for two DBMS and add to the statements
switch ($this->sql_layer)
{
- case 'firebird':
case 'mssql':
case 'mssqlnative':
$table_sql .= "\n);";
@@ -610,7 +572,6 @@ class tools
$table_sql .= ",\n\t PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ')';
break;
- case 'firebird':
case 'mssql':
case 'mssqlnative':
// We need the data here
@@ -685,19 +646,6 @@ class tools
$statements[] = $trigger;
}
break;
-
- case 'firebird':
- if ($create_sequence)
- {
- $statements[] = "CREATE GENERATOR {$table_name}_gen;";
- $statements[] = "SET GENERATOR {$table_name}_gen TO 0;";
-
- $trigger = "CREATE TRIGGER t_$table_name FOR $table_name\n";
- $trigger .= "BEFORE INSERT\nAS\nBEGIN\n";
- $trigger .= "\tNEW.{$create_sequence} = GEN_ID({$table_name}_gen, 1);\nEND;";
- $statements[] = $trigger;
- }
- break;
}
// Write Keys
@@ -763,7 +711,7 @@ class tools
$sqlite = false;
// For SQLite we need to perform the schema changes in a much more different way
- if (($this->db->sql_layer == 'sqlite' || $this->db->sql_layer == 'sqlite3') && $this->return_statements)
+ if (($this->db->get_sql_layer() == 'sqlite' || $this->db->get_sql_layer() == 'sqlite3') && $this->return_statements)
{
$sqlite_data = array();
$sqlite = true;
@@ -1174,12 +1122,6 @@ class tools
WHERE LOWER(table_name) = '" . strtolower($table) . "'";
break;
- case 'firebird':
- $sql = "SELECT RDB\$FIELD_NAME as FNAME
- FROM RDB\$RELATION_FIELDS
- WHERE RDB\$RELATION_NAME = '" . strtoupper($table) . "'";
- break;
-
case 'sqlite':
case 'sqlite3':
$sql = "SELECT sql
@@ -1278,15 +1220,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- $sql = "SELECT LOWER(RDB\$INDEX_NAME) as index_name
- FROM RDB\$INDICES
- WHERE RDB\$RELATION_NAME = '" . strtoupper($table_name) . "'
- AND RDB\$UNIQUE_FLAG IS NULL
- AND RDB\$FOREIGN_KEY IS NULL";
- $col = 'index_name';
- break;
-
case 'postgres':
$sql = "SELECT ic.relname as index_name
FROM pg_class bc, pg_class ic, pg_index i
@@ -1332,7 +1265,6 @@ class tools
// These DBMS prefix index name with the table name
switch ($this->sql_layer)
{
- case 'firebird':
case 'oracle':
case 'postgres':
case 'sqlite':
@@ -1385,15 +1317,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- $sql = "SELECT LOWER(RDB\$INDEX_NAME) as index_name
- FROM RDB\$INDICES
- WHERE RDB\$RELATION_NAME = '" . strtoupper($table_name) . "'
- AND RDB\$UNIQUE_FLAG IS NOT NULL
- AND RDB\$FOREIGN_KEY IS NULL";
- $col = 'index_name';
- break;
-
case 'postgres':
$sql = "SELECT ic.relname as index_name, i.indisunique
FROM pg_class bc, pg_class ic, pg_index i
@@ -1460,7 +1383,6 @@ class tools
}
break;
- case 'firebird':
case 'postgres':
case 'sqlite':
case 'sqlite3':
@@ -1536,32 +1458,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- $sql .= " {$column_type} ";
- $return_array['column_type_sql_type'] = " {$column_type} ";
-
- if (!is_null($column_data[1]))
- {
- $sql .= 'DEFAULT ' . ((is_numeric($column_data[1])) ? $column_data[1] : "'{$column_data[1]}'") . ' ';
- $return_array['column_type_sql_default'] = ((is_numeric($column_data[1])) ? $column_data[1] : "'{$column_data[1]}'") . ' ';
- }
-
- $sql .= 'NOT NULL';
-
- // This is a UNICODE column and thus should be given it's fair share
- if (preg_match('/^X?STEXT_UNI|VCHAR_(CI|UNI:?)/', $column_data[0]))
- {
- $sql .= ' COLLATE UNICODE';
- }
-
- $return_array['auto_increment'] = false;
- if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
- {
- $return_array['auto_increment'] = true;
- }
-
- break;
-
case 'mssql':
case 'mssqlnative':
$sql .= " {$column_type} ";
@@ -1772,11 +1668,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- // Does not support AFTER statement, only POSITION (and there you need the column position)
- $statements[] = 'ALTER TABLE ' . $table_name . ' ADD "' . strtoupper($column_name) . '" ' . $column_data['column_type_sql'];
- break;
-
case 'mssql':
case 'mssqlnative':
// Does not support AFTER, only through temporary table
@@ -1894,10 +1785,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- $statements[] = 'ALTER TABLE ' . $table_name . ' DROP "' . strtoupper($column_name) . '"';
- break;
-
case 'mssql':
case 'mssqlnative':
// We need the data here
@@ -1996,7 +1883,7 @@ class tools
$columns = implode(',', $column_list);
- $new_table_cols = trim(preg_replace('/' . $column_name . '[^,]+(?:,|$)/m', '', $new_table_cols));
+ $new_table_cols = trim(preg_replace('/' . $column_name . '\b[^,]+(?:,|$)/m', '', $new_table_cols));
if (substr($new_table_cols, -1) === ',')
{
// Remove the comma from the last entry again
@@ -2036,7 +1923,6 @@ class tools
$statements[] = 'DROP INDEX ' . $index_name . ' ON ' . $table_name;
break;
- case 'firebird':
case 'oracle':
case 'postgres':
case 'sqlite':
@@ -2065,21 +1951,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- $sql = 'SELECT RDB$GENERATOR_NAME as gen
- FROM RDB$GENERATORS
- WHERE RDB$SYSTEM_FLAG = 0
- AND RDB$GENERATOR_NAME = \'' . strtoupper($table_name) . "_GEN'";
- $result = $this->db->sql_query($sql);
-
- // does a generator exist?
- if ($row = $this->db->sql_fetchrow($result))
- {
- $statements[] = "DROP GENERATOR {$row['gen']};";
- }
- $this->db->sql_freeresult($result);
- break;
-
case 'oracle':
$sql = 'SELECT A.REFERENCED_NAME
FROM USER_DEPENDENCIES A, USER_TRIGGERS B
@@ -2125,7 +1996,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
case 'postgres':
case 'mysql_40':
case 'mysql_41':
@@ -2217,7 +2087,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
case 'postgres':
case 'oracle':
case 'sqlite':
@@ -2261,7 +2130,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
case 'postgres':
case 'oracle':
case 'sqlite':
@@ -2320,15 +2188,6 @@ class tools
{
switch ($this->sql_layer)
{
- case 'firebird':
- $sql = "SELECT LOWER(RDB\$INDEX_NAME) as index_name
- FROM RDB\$INDICES
- WHERE RDB\$RELATION_NAME = '" . strtoupper($table_name) . "'
- AND RDB\$UNIQUE_FLAG IS NULL
- AND RDB\$FOREIGN_KEY IS NULL";
- $col = 'index_name';
- break;
-
case 'postgres':
$sql = "SELECT ic.relname as index_name
FROM pg_class bc, pg_class ic, pg_index i
@@ -2373,7 +2232,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
case 'oracle':
case 'postgres':
case 'sqlite':
@@ -2400,20 +2258,6 @@ class tools
switch ($this->sql_layer)
{
- case 'firebird':
- // Change type...
- if (!empty($column_data['column_type_sql_default']))
- {
- $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN "' . strtoupper($column_name) . '" TYPE ' . ' ' . $column_data['column_type_sql_type'];
- $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN "' . strtoupper($column_name) . '" SET DEFAULT ' . ' ' . $column_data['column_type_sql_default'];
- }
- else
- {
- // TODO: try to change pkey without removing trigger, generator or constraints. ATM this query may fail.
- $statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN "' . strtoupper($column_name) . '" TYPE ' . ' ' . $column_data['column_type_sql_type'];
- }
- break;
-
case 'mssql':
case 'mssqlnative':
// We need the data here
@@ -2561,7 +2405,18 @@ class tools
foreach ($old_table_cols as $key => $declaration)
{
- $entities = preg_split('#\s+#', trim($declaration));
+ $declaration = trim($declaration);
+
+ // Check for the beginning of the constraint section and stop
+ if (preg_match('/[^\(]*\s*PRIMARY KEY\s+\(/', $declaration) ||
+ preg_match('/[^\(]*\s*UNIQUE\s+\(/', $declaration) ||
+ preg_match('/[^\(]*\s*FOREIGN KEY\s+\(/', $declaration) ||
+ preg_match('/[^\(]*\s*CHECK\s+\(/', $declaration))
+ {
+ break;
+ }
+
+ $entities = preg_split('#\s+#', $declaration);
$column_list[] = $entities[0];
if ($entities[0] == $column_name)
{
diff --git a/phpBB/phpbb/di/extension/config.php b/phpBB/phpbb/di/extension/config.php
index 403c9d50e7..a7d7284f85 100644
--- a/phpBB/phpbb/di/extension/config.php
+++ b/phpBB/phpbb/di/extension/config.php
@@ -15,8 +15,6 @@ namespace phpbb\di\extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
-use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
-use Symfony\Component\Config\FileLocator;
/**
* Container config extension
@@ -34,7 +32,7 @@ class config extends Extension
* @param array $config An array of configuration values
* @param ContainerBuilder $container A ContainerBuilder instance
*
- * @throws InvalidArgumentException When provided tag is not defined in this extension
+ * @throws \InvalidArgumentException When provided tag is not defined in this extension
*/
public function load(array $config, ContainerBuilder $container)
{
@@ -68,7 +66,7 @@ class config extends Extension
* Convert 3.0 ACM type to 3.1 cache driver class name
*
* @param string $acm_type ACM type
- * @return cache driver class
+ * @return string cache driver class
*/
protected function convert_30_acm_type($acm_type)
{
diff --git a/phpBB/phpbb/di/extension/core.php b/phpBB/phpbb/di/extension/core.php
index 72026f3b54..ca4fa5c082 100644
--- a/phpBB/phpbb/di/extension/core.php
+++ b/phpBB/phpbb/di/extension/core.php
@@ -45,7 +45,7 @@ class core extends Extension
* @param array $config An array of configuration values
* @param ContainerBuilder $container A ContainerBuilder instance
*
- * @throws InvalidArgumentException When provided tag is not defined in this extension
+ * @throws \InvalidArgumentException When provided tag is not defined in this extension
*/
public function load(array $config, ContainerBuilder $container)
{
diff --git a/phpBB/phpbb/di/extension/ext.php b/phpBB/phpbb/di/extension/ext.php
index 1205dffb53..718c992d2e 100644
--- a/phpBB/phpbb/di/extension/ext.php
+++ b/phpBB/phpbb/di/extension/ext.php
@@ -39,7 +39,7 @@ class ext extends Extension
* @param array $config An array of configuration values
* @param ContainerBuilder $container A ContainerBuilder instance
*
- * @throws InvalidArgumentException When provided tag is not defined in this extension
+ * @throws \InvalidArgumentException When provided tag is not defined in this extension
*/
public function load(array $config, ContainerBuilder $container)
{
diff --git a/phpBB/phpbb/di/pass/kernel_pass.php b/phpBB/phpbb/di/pass/kernel_pass.php
index 44d4fcd07f..c154c7532d 100644
--- a/phpBB/phpbb/di/pass/kernel_pass.php
+++ b/phpBB/phpbb/di/pass/kernel_pass.php
@@ -23,6 +23,7 @@ class kernel_pass implements CompilerPassInterface
*
* @param ContainerBuilder $container ContainerBuilder object
* @return null
+ * @throws \InvalidArgumentException
*/
public function process(ContainerBuilder $container)
{
diff --git a/phpBB/phpbb/event/dispatcher.php b/phpBB/phpbb/event/dispatcher.php
index 6a2f9008be..9a786022c2 100644
--- a/phpBB/phpbb/event/dispatcher.php
+++ b/phpBB/phpbb/event/dispatcher.php
@@ -29,8 +29,11 @@ use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
* extract($phpbb_dispatcher->trigger_event('core.index', compact($vars)));
*
*/
-class dispatcher extends ContainerAwareEventDispatcher
+class dispatcher extends ContainerAwareEventDispatcher implements dispatcher_interface
{
+ /**
+ * {@inheritdoc}
+ */
public function trigger_event($eventName, $data = array())
{
$event = new \phpbb\event\data($data);
diff --git a/phpBB/phpbb/event/dispatcher_interface.php b/phpBB/phpbb/event/dispatcher_interface.php
new file mode 100644
index 0000000000..50a3ef9101
--- /dev/null
+++ b/phpBB/phpbb/event/dispatcher_interface.php
@@ -0,0 +1,40 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\event;
+
+/**
+* Extension of the Symfony2 EventDispatcher
+*
+* It provides an additional `trigger_event` method, which
+* gives some syntactic sugar for dispatching events. Instead
+* of creating the event object, the method will do that for
+* you.
+*
+* Example:
+*
+* $vars = array('page_title');
+* extract($phpbb_dispatcher->trigger_event('core.index', compact($vars)));
+*
+*/
+interface dispatcher_interface extends \Symfony\Component\EventDispatcher\EventDispatcherInterface
+{
+ /**
+ * Construct and dispatch an event
+ *
+ * @param string $eventName The event name
+ * @param array $data An array containing the variables sending with the event
+ * @return mixed
+ */
+ public function trigger_event($eventName, $data = array());
+}
diff --git a/phpBB/phpbb/event/md_exporter.php b/phpBB/phpbb/event/md_exporter.php
index a11c2a457f..f7021875f3 100644
--- a/phpBB/phpbb/event/md_exporter.php
+++ b/phpBB/phpbb/event/md_exporter.php
@@ -227,7 +227,7 @@ class md_exporter
*/
public function validate_since($since)
{
- if (!preg_match('#^\d+\.\d+\.\d+(?:-(?:a|b|rc|pl)\d+)?$#', $since))
+ if (!preg_match('#^\d+\.\d+\.\d+(?:-(?:a|b|RC|pl)\d+)?$#', $since))
{
throw new \LogicException("Invalid since information found for event '{$this->current_event}'");
}
diff --git a/phpBB/phpbb/event/php_exporter.php b/phpBB/phpbb/event/php_exporter.php
index 3d2819a3a1..badbbb48fd 100644
--- a/phpBB/phpbb/event/php_exporter.php
+++ b/phpBB/phpbb/event/php_exporter.php
@@ -550,7 +550,7 @@ class php_exporter
public function validate_since($line)
{
$match = array();
- preg_match('#^\* @since (\d+\.\d+\.\d+(?:-(?:a|b|rc|pl)\d+)?)$#', ltrim($line, "\t"), $match);
+ preg_match('#^\* @since (\d+\.\d+\.\d+(?:-(?:a|b|RC|pl)\d+)?)$#', ltrim($line, "\t"), $match);
if (!isset($match[1]))
{
throw new \LogicException("Invalid '@since' information for event "
diff --git a/phpBB/phpbb/event/recursive_event_filter_iterator.php b/phpBB/phpbb/event/recursive_event_filter_iterator.php
index f65feff448..64e2e56f6a 100644
--- a/phpBB/phpbb/event/recursive_event_filter_iterator.php
+++ b/phpBB/phpbb/event/recursive_event_filter_iterator.php
@@ -39,7 +39,8 @@ class recursive_event_filter_iterator extends \RecursiveFilterIterator
*
* @return recursive_event_filter_iterator
*/
- public function getChildren() {
+ public function getChildren()
+ {
return new self($this->getInnerIterator()->getChildren(), $this->root_path);
}
diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php
index b83bb1b189..b19eb9f8a3 100644
--- a/phpBB/phpbb/extension/manager.php
+++ b/phpBB/phpbb/extension/manager.php
@@ -148,7 +148,7 @@ class manager
* Instantiates the metadata manager for the extension with the given name
*
* @param string $name The extension name
- * @param string $template The template manager
+ * @param \phpbb\template\template $template The template manager
* @return \phpbb\extension\metadata_manager Instance of the metadata manager
*/
public function create_extension_metadata_manager($name, \phpbb\template\template $template)
@@ -423,7 +423,7 @@ class manager
foreach ($iterator as $file_info)
{
- if ($file_info->isFile() && $file_info->getFilename() == 'ext.' . $this->php_ext)
+ if ($file_info->isFile() && $file_info->getFilename() == 'composer.json')
{
$ext_name = $iterator->getInnerIterator()->getSubPath();
$composer_file = $iterator->getPath() . '/composer.json';
@@ -515,7 +515,7 @@ class manager
* @param string $name Extension name to check NOTE: Can be user input
* @return bool Depending on whether or not the extension is available
*/
- public function available($name)
+ public function is_available($name)
{
return file_exists($this->get_extension_path($name, true));
}
@@ -526,12 +526,50 @@ class manager
* @param string $name Extension name to check
* @return bool Depending on whether or not the extension is enabled
*/
- public function enabled($name)
+ public function is_enabled($name)
{
return isset($this->extensions[$name]) && $this->extensions[$name]['ext_active'];
}
/**
+ * Check to see if a given extension is disabled
+ *
+ * @param string $name Extension name to check
+ * @return bool Depending on whether or not the extension is disabled
+ */
+ public function is_disabled($name)
+ {
+ return isset($this->extensions[$name]) && !$this->extensions[$name]['ext_active'];
+ }
+
+ /**
+ * Check to see if a given extension is configured
+ *
+ * All enabled and disabled extensions are considered configured. A purged
+ * extension that is no longer in the database is not configured.
+ *
+ * @param string $name Extension name to check
+ * @return bool Depending on whether or not the extension is configured
+ */
+ public function is_configured($name)
+ {
+ return isset($this->extensions[$name]);
+ }
+
+ /**
+ * Check to see if a given extension is purged
+ *
+ * An extension is purged if it is available, not enabled and not disabled.
+ *
+ * @param string $name Extension name to check
+ * @return bool Depending on whether or not the extension is purged
+ */
+ public function is_purged($name)
+ {
+ return $this->is_available($name) && !$this->is_configured($name);
+ }
+
+ /**
* Instantiates a \phpbb\finder.
*
* @param bool $use_all_available Should we load all extensions, or just enabled ones
diff --git a/phpBB/phpbb/extension/metadata_manager.php b/phpBB/phpbb/extension/metadata_manager.php
index 5c4e8fbf00..1051021ea7 100644
--- a/phpBB/phpbb/extension/metadata_manager.php
+++ b/phpBB/phpbb/extension/metadata_manager.php
@@ -90,11 +90,11 @@ class metadata_manager
}
/**
- * Processes and gets the metadata requested
- *
- * @param string $element All for all metadata that it has and is valid, otherwise specify which section you want by its shorthand term.
- * @return array Contains all of the requested metadata, throws an exception on failure
- */
+ * Processes and gets the metadata requested
+ *
+ * @param string $element All for all metadata that it has and is valid, otherwise specify which section you want by its shorthand term.
+ * @return array Contains all of the requested metadata, throws an exception on failure
+ */
public function get_metadata($element = 'all')
{
$this->set_metadata_file();
@@ -136,10 +136,10 @@ class metadata_manager
}
/**
- * Sets the filepath of the metadata file
- *
- * @return boolean Set to true if it exists, throws an exception on failure
- */
+ * Sets the filepath of the metadata file
+ *
+ * @throws \phpbb\extension\exception
+ */
private function set_metadata_file()
{
$ext_filepath = $this->extension_manager->get_extension_path($this->ext_name);
@@ -154,10 +154,11 @@ class metadata_manager
}
/**
- * Gets the contents of the composer.json file
- *
- * @return bool True if success, throws an exception on failure
- */
+ * Gets the contents of the composer.json file
+ *
+ * @return bool True if success, throws an exception on failure
+ * @throws \phpbb\extension\exception
+ */
private function fetch_metadata()
{
if (!file_exists($this->metadata_file))
@@ -183,10 +184,10 @@ class metadata_manager
}
/**
- * This array handles the cleaning of the array
- *
- * @return array Contains the cleaned metadata array
- */
+ * This array handles the cleaning of the array
+ *
+ * @return array Contains the cleaned metadata array
+ */
private function clean_metadata_array()
{
return $this->metadata;
@@ -199,6 +200,7 @@ class metadata_manager
* "display" for name, type, and authors
* "name", "type")
* @return Bool True if valid, throws an exception if invalid
+ * @throws \phpbb\extension\exception
*/
public function validate($name = 'display')
{
@@ -247,10 +249,11 @@ class metadata_manager
}
/**
- * Validates the contents of the authors field
- *
- * @return boolean True when passes validation, throws exception if invalid
- */
+ * Validates the contents of the authors field
+ *
+ * @return boolean True when passes validation, throws exception if invalid
+ * @throws \phpbb\extension\exception
+ */
public function validate_authors()
{
if (empty($this->metadata['authors']))
@@ -270,10 +273,10 @@ class metadata_manager
}
/**
- * This array handles the verification that this extension can be enabled on this board
- *
- * @return bool True if validation succeeded, False if failed
- */
+ * This array handles the verification that this extension can be enabled on this board
+ *
+ * @return bool True if validation succeeded, False if failed
+ */
public function validate_enable()
{
// Check for valid directory & phpBB, PHP versions
@@ -286,10 +289,10 @@ class metadata_manager
}
/**
- * Validates the most basic directory structure to ensure it follows <vendor>/<ext> convention.
- *
- * @return boolean True when passes validation
- */
+ * Validates the most basic directory structure to ensure it follows <vendor>/<ext> convention.
+ *
+ * @return boolean True when passes validation
+ */
public function validate_dir()
{
return (substr_count($this->ext_name, '/') === 1 && $this->ext_name == $this->get_metadata('name'));
@@ -297,13 +300,13 @@ class metadata_manager
/**
- * Validates the contents of the phpbb requirement field
- *
- * @return boolean True when passes validation
- */
+ * Validates the contents of the phpbb requirement field
+ *
+ * @return boolean True when passes validation
+ */
public function validate_require_phpbb()
{
- if (!isset($this->metadata['require']['phpbb/phpbb']))
+ if (!isset($this->metadata['extra']['soft-require']['phpbb/phpbb']))
{
return false;
}
@@ -312,10 +315,10 @@ class metadata_manager
}
/**
- * Validates the contents of the php requirement field
- *
- * @return boolean True when passes validation
- */
+ * Validates the contents of the php requirement field
+ *
+ * @return boolean True when passes validation
+ */
public function validate_require_php()
{
if (!isset($this->metadata['require']['php']))
@@ -348,10 +351,10 @@ class metadata_manager
}
/**
- * Outputs the metadata into the template
- *
- * @return null
- */
+ * Outputs the metadata into the template
+ *
+ * @return null
+ */
public function output_template_data()
{
$this->template->assign_vars(array(
@@ -366,7 +369,7 @@ class metadata_manager
'META_REQUIRE_PHP' => (isset($this->metadata['require']['php'])) ? htmlspecialchars($this->metadata['require']['php']) : '',
'META_REQUIRE_PHP_FAIL' => !$this->validate_require_php(),
- 'META_REQUIRE_PHPBB' => (isset($this->metadata['require']['phpbb/phpbb'])) ? htmlspecialchars($this->metadata['require']['phpbb/phpbb']) : '',
+ 'META_REQUIRE_PHPBB' => (isset($this->metadata['extra']['soft-require']['phpbb/phpbb'])) ? htmlspecialchars($this->metadata['extra']['soft-require']['phpbb/phpbb']) : '',
'META_REQUIRE_PHPBB_FAIL' => !$this->validate_require_phpbb(),
'META_DISPLAY_NAME' => (isset($this->metadata['extra']['display-name'])) ? htmlspecialchars($this->metadata['extra']['display-name']) : '',
diff --git a/phpBB/phpbb/extension/provider.php b/phpBB/phpbb/extension/provider.php
index e1d854df64..1c42cf7b5e 100644
--- a/phpBB/phpbb/extension/provider.php
+++ b/phpBB/phpbb/extension/provider.php
@@ -58,7 +58,7 @@ abstract class provider implements \IteratorAggregate
/**
* Retrieve an iterator over all items
*
- * @return ArrayIterator An iterator for the array of template paths
+ * @return \ArrayIterator An iterator for the array of template paths
*/
public function getIterator()
{
diff --git a/phpBB/phpbb/feed/base.php b/phpBB/phpbb/feed/base.php
index 36ecbbcc2e..e31854160a 100644
--- a/phpBB/phpbb/feed/base.php
+++ b/phpBB/phpbb/feed/base.php
@@ -70,15 +70,14 @@ abstract class base
/**
* Constructor
*
- * @param \phpbb\feed\helper $helper Feed helper
- * @param \phpbb\config\config $config Config object
+ * @param \phpbb\feed\helper $helper Feed helper
+ * @param \phpbb\config\config $config Config object
* @param \phpbb\db\driver\driver_interface $db Database connection
- * @param \phpbb\cache\driver\driver_interface $cache Cache object
- * @param \phpbb\user $user User object
- * @param \phpbb\auth\auth $auth Auth object
- * @param \phpbb\content_visibility $content_visibility Auth object
- * @param string $phpEx php file extension
- * @return null
+ * @param \phpbb\cache\driver\driver_interface $cache Cache object
+ * @param \phpbb\user $user User object
+ * @param \phpbb\auth\auth $auth Auth object
+ * @param \phpbb\content_visibility $content_visibility Auth object
+ * @param string $phpEx php file extension
*/
function __construct(\phpbb\feed\helper $helper, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, \phpbb\user $user, \phpbb\auth\auth $auth, \phpbb\content_visibility $content_visibility, $phpEx)
{
@@ -133,6 +132,9 @@ abstract class base
/**
* Set key
+ *
+ * @param string $key Key
+ * @param mixed $value Value
*/
function set($key, $value)
{
@@ -141,6 +143,9 @@ abstract class base
/**
* Get key
+ *
+ * @param string $key Key
+ * @return mixed
*/
function get($key)
{
diff --git a/phpBB/phpbb/feed/factory.php b/phpBB/phpbb/feed/factory.php
index 84b4d5d560..f364f06d03 100644
--- a/phpBB/phpbb/feed/factory.php
+++ b/phpBB/phpbb/feed/factory.php
@@ -13,6 +13,8 @@
namespace phpbb\feed;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
/**
* Factory class to return correct object
*/
@@ -20,7 +22,7 @@ class factory
{
/**
* Service container object
- * @var object
+ * @var ContainerInterface
*/
protected $container;
@@ -33,12 +35,11 @@ class factory
/**
* Constructor
*
- * @param objec $container Container object
- * @param \phpbb\config\config $config Config object
+ * @param ContainerInterface $container Container object
+ * @param \phpbb\config\config $config Config object
* @param \phpbb\db\driver\driver_interface $db Database connection
- * @return null
*/
- public function __construct($container, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db)
+ public function __construct(ContainerInterface $container, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db)
{
$this->container = $container;
$this->config = $config;
diff --git a/phpBB/phpbb/feed/helper.php b/phpBB/phpbb/feed/helper.php
index ed78f4893e..9741b752af 100644
--- a/phpBB/phpbb/feed/helper.php
+++ b/phpBB/phpbb/feed/helper.php
@@ -36,7 +36,7 @@ class helper
* @param \phpbb\config\config $config Config object
* @param \phpbb\user $user User object
* @param string $phpbb_root_path Root path
- * @return null
+ * @param string $phpEx PHP extension
*/
public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path, $phpEx)
{
diff --git a/phpBB/phpbb/feed/post_base.php b/phpBB/phpbb/feed/post_base.php
index fe11fd2a79..011775b6af 100644
--- a/phpBB/phpbb/feed/post_base.php
+++ b/phpBB/phpbb/feed/post_base.php
@@ -48,8 +48,8 @@ abstract class post_base extends \phpbb\feed\attachments_base
{
$item_row['statistics'] = $this->user->lang['POSTED'] . ' ' . $this->user->lang['POST_BY_AUTHOR'] . ' ' . $this->user_viewprofile($row)
. ' ' . $this->separator_stats . ' ' . $this->user->format_date($row[$this->get('published')])
- . (($this->is_moderator_approve_forum($row['forum_id']) && (int)$row['post_visibility'] === ITEM_UNAPPROVED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_UNAPPROVED'] : '')
- . (($this->is_moderator_approve_forum($row['forum_id']) && (int)$row['post_visibility'] === ITEM_DELETED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_DELETED'] : '');
+ . (($this->is_moderator_approve_forum($row['forum_id']) && (int) $row['post_visibility'] === ITEM_UNAPPROVED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_UNAPPROVED'] : '')
+ . (($this->is_moderator_approve_forum($row['forum_id']) && (int) $row['post_visibility'] === ITEM_DELETED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_DELETED'] : '');
}
}
}
diff --git a/phpBB/phpbb/feed/topic_base.php b/phpBB/phpbb/feed/topic_base.php
index 4fbb498272..f9ff368cba 100644
--- a/phpBB/phpbb/feed/topic_base.php
+++ b/phpBB/phpbb/feed/topic_base.php
@@ -52,11 +52,11 @@ abstract class topic_base extends \phpbb\feed\attachments_base
if ($this->is_moderator_approve_forum($row['forum_id']))
{
- if ( (int)$row['topic_visibility'] === ITEM_DELETED)
+ if ((int) $row['topic_visibility'] === ITEM_DELETED)
{
$item_row['statistics'] .= ' ' . $this->separator_stats . ' ' . $this->user->lang['TOPIC_DELETED'];
}
- else if ((int)$row['topic_visibility'] === ITEM_UNAPPROVED)
+ else if ((int) $row['topic_visibility'] === ITEM_UNAPPROVED)
{
$item_row['statistics'] .= ' ' . $this->separator_stats . ' ' . $this->user->lang['TOPIC_UNAPPROVED'];
}
diff --git a/phpBB/phpbb/filesystem.php b/phpBB/phpbb/filesystem.php
index 683a12ab76..77517082e5 100644
--- a/phpBB/phpbb/filesystem.php
+++ b/phpBB/phpbb/filesystem.php
@@ -35,7 +35,7 @@ class filesystem
continue;
}
- if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '..')
+ if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '.' && $filtered[sizeof($filtered) - 1] !== '..')
{
array_pop($filtered);
}
diff --git a/phpBB/phpbb/groupposition/legend.php b/phpBB/phpbb/groupposition/legend.php
index af903e363e..efea3389d4 100644
--- a/phpBB/phpbb/groupposition/legend.php
+++ b/phpBB/phpbb/groupposition/legend.php
@@ -53,7 +53,9 @@ class legend implements \phpbb\groupposition\groupposition_interface
/**
* Returns the group_legend for a given group, if the group exists.
*
- * {@inheritDoc}
+ * @param int $group_id group_id of the group to be selected
+ * @return int position of the group
+ * @throws \phpbb\groupposition\exception
*/
public function get_group_value($group_id)
{
@@ -76,7 +78,7 @@ class legend implements \phpbb\groupposition\groupposition_interface
/**
* Get number of groups, displayed on the legend
*
- * {@inheritDoc}
+ * @return int value of the last item displayed
*/
public function get_group_count()
{
@@ -91,8 +93,6 @@ class legend implements \phpbb\groupposition\groupposition_interface
}
/**
- * Adds a group by group_id
- *
* {@inheritDoc}
*/
public function add_group($group_id)
@@ -118,7 +118,9 @@ class legend implements \phpbb\groupposition\groupposition_interface
/**
* Deletes a group by setting the field to self::GROUP_DISABLED and closing the gap in the list.
*
- * {@inheritDoc}
+ * @param int $group_id group_id of the group to be deleted
+ * @param bool $skip_group Skip setting the value for this group, to save the query, when you need to update it anyway.
+ * @return bool True if the group was deleted successfully
*/
public function delete_group($group_id, $skip_group = false)
{
@@ -150,8 +152,6 @@ class legend implements \phpbb\groupposition\groupposition_interface
}
/**
- * Moves a group up by group_id
- *
* {@inheritDoc}
*/
public function move_up($group_id)
@@ -160,8 +160,6 @@ class legend implements \phpbb\groupposition\groupposition_interface
}
/**
- * Moves a group down by group_id
- *
* {@inheritDoc}
*/
public function move_down($group_id)
@@ -170,8 +168,6 @@ class legend implements \phpbb\groupposition\groupposition_interface
}
/**
- * Moves a group up/down
- *
* {@inheritDoc}
*/
public function move($group_id, $delta)
diff --git a/phpBB/phpbb/groupposition/teampage.php b/phpBB/phpbb/groupposition/teampage.php
index 3e675549bf..2985c51525 100644
--- a/phpBB/phpbb/groupposition/teampage.php
+++ b/phpBB/phpbb/groupposition/teampage.php
@@ -65,7 +65,9 @@ class teampage implements \phpbb\groupposition\groupposition_interface
/**
* Returns the teampage position for a given group, if the group exists.
*
- * {@inheritDoc}
+ * @param int $group_id group_id of the group to be selected
+ * @return int position of the group
+ * @throws \phpbb\groupposition\exception
*/
public function get_group_value($group_id)
{
@@ -93,6 +95,7 @@ class teampage implements \phpbb\groupposition\groupposition_interface
*
* @param int $group_id group_id of the group to be selected
* @return array Data row of the group
+ * @throws \phpbb\groupposition\exception
*/
public function get_group_values($group_id)
{
@@ -120,6 +123,7 @@ class teampage implements \phpbb\groupposition\groupposition_interface
*
* @param int $teampage_id Teampage_id of the selected item
* @return int Teampage position of the item
+ * @throws \phpbb\groupposition\exception
*/
public function get_teampage_value($teampage_id)
{
@@ -144,6 +148,7 @@ class teampage implements \phpbb\groupposition\groupposition_interface
*
* @param int $teampage_id Teampage_id of the selected item
* @return array Teampage row of the item
+ * @throws \phpbb\groupposition\exception
*/
public function get_teampage_values($teampage_id)
{
@@ -165,8 +170,6 @@ class teampage implements \phpbb\groupposition\groupposition_interface
/**
- * Get number of items displayed
- *
* {@inheritDoc}
*/
public function get_group_count()
@@ -182,8 +185,6 @@ class teampage implements \phpbb\groupposition\groupposition_interface
}
/**
- * Adds a group by group_id
- *
* {@inheritDoc}
*/
public function add_group($group_id)
@@ -288,7 +289,9 @@ class teampage implements \phpbb\groupposition\groupposition_interface
/**
* Deletes a group from the list and closes the gap in the position list.
*
- * {@inheritDoc}
+ * @param int $group_id group_id of the group to be deleted
+ * @param bool $skip_group Skip setting the value for this group, to save the query, when you need to update it anyway.
+ * @return bool True if the group was deleted successfully
*/
public function delete_group($group_id, $skip_group = false)
{
@@ -347,8 +350,6 @@ class teampage implements \phpbb\groupposition\groupposition_interface
}
/**
- * Moves a group up by group_id
- *
* {@inheritDoc}
*/
public function move_up($group_id)
@@ -359,7 +360,7 @@ class teampage implements \phpbb\groupposition\groupposition_interface
/**
* Moves an item up by teampage_id
*
- * @param int $group_id group_id of the group to be moved
+ * @param int $teampage_id teampage_id of the item to be move
* @return bool True if the group was moved successfully
*/
public function move_up_teampage($teampage_id)
@@ -368,8 +369,6 @@ class teampage implements \phpbb\groupposition\groupposition_interface
}
/**
- * Moves a group down by group_id
- *
* {@inheritDoc}
*/
public function move_down($group_id)
@@ -378,9 +377,9 @@ class teampage implements \phpbb\groupposition\groupposition_interface
}
/**
- * Movesan item down by teampage_id
+ * Moves an item down by teampage_id
*
- * @param int $group_id group_id of the group to be moved
+ * @param int $teampage_id teampage_id of the item to be moved
* @return bool True if the group was moved successfully
*/
public function move_down_teampage($teampage_id)
@@ -389,8 +388,6 @@ class teampage implements \phpbb\groupposition\groupposition_interface
}
/**
- * Moves a group up/down
- *
* {@inheritDoc}
*/
public function move($group_id, $delta)
diff --git a/phpBB/phpbb/lock/db.php b/phpBB/phpbb/lock/db.php
index e3c7e97792..85ba9a7aa3 100644
--- a/phpBB/phpbb/lock/db.php
+++ b/phpBB/phpbb/lock/db.php
@@ -54,8 +54,8 @@ class db
*
* You have to call acquire() to actually create the lock.
*
- * @param string $config_name A config variable to be used for locking
- * @param array $config The phpBB configuration
+ * @param string $config_name A config variable to be used for locking
+ * @param \phpbb\config\config $config The phpBB configuration
* @param \phpbb\db\driver\driver_interface $db A database connection
*/
public function __construct($config_name, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db)
diff --git a/phpBB/phpbb/log/log.php b/phpBB/phpbb/log/log.php
index 10efe5fd1c..c522c3273f 100644
--- a/phpBB/phpbb/log/log.php
+++ b/phpBB/phpbb/log/log.php
@@ -70,7 +70,7 @@ class log implements \phpbb\log\log_interface
/**
* Event dispatcher object
- * @var phpbb_dispatcher
+ * @var \phpbb\event\dispatcher_interface
*/
protected $dispatcher;
@@ -98,12 +98,11 @@ class log implements \phpbb\log\log_interface
* @param \phpbb\db\driver\driver_interface $db Database object
* @param \phpbb\user $user User object
* @param \phpbb\auth\auth $auth Auth object
- * @param \phpbb\event\dispatcher $phpbb_dispatcher Event dispatcher
+ * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher
* @param string $phpbb_root_path Root path
* @param string $relative_admin_path Relative admin root path
* @param string $php_ext PHP Extension
* @param string $log_table Name of the table we use to store our logs
- * @return null
*/
public function __construct($db, $user, $auth, $phpbb_dispatcher, $phpbb_root_path, $relative_admin_path, $php_ext, $log_table)
{
@@ -159,8 +158,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * This function returns the state of the log system.
- *
* {@inheritDoc}
*/
public function is_enabled($type = '')
@@ -173,12 +170,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * Disable log
- *
- * This function allows disabling the log system or parts of it, for this
- * page call. When add_log is called and the type is disabled,
- * the log will not be added to the database.
- *
* {@inheritDoc}
*/
public function disable($type = '')
@@ -201,10 +192,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * Enable log
- *
- * This function allows re-enabling the log system.
- *
* {@inheritDoc}
*/
public function enable($type = '')
@@ -227,8 +214,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * Adds a log to the database
- *
* {@inheritDoc}
*/
public function add($mode, $user_id, $log_ip, $log_operation, $log_time = false, $additional_data = array())
@@ -425,8 +410,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * Grab the logs from the database
- *
* {@inheritDoc}
*/
public function get_logs($mode, $count_logs = true, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $log_time = 0, $sort_by = 'l.log_time DESC', $keywords = '')
@@ -754,7 +737,7 @@ class log implements \phpbb\log\log_interface
for ($i = 0, $num_keywords = sizeof($keywords); $i < $num_keywords; $i++)
{
$keywords_pattern[] = preg_quote($keywords[$i], '#');
- $keywords[$i] = $this->db->sql_like_expression($this->db->any_char . $keywords[$i] . $this->db->any_char);
+ $keywords[$i] = $this->db->sql_like_expression($this->db->get_any_char() . $keywords[$i] . $this->db->get_any_char());
}
$keywords_pattern = '#' . implode('|', $keywords_pattern) . '#ui';
@@ -863,8 +846,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * Get total log count
- *
* {@inheritDoc}
*/
public function get_log_count()
@@ -873,8 +854,6 @@ class log implements \phpbb\log\log_interface
}
/**
- * Get offset of the last valid log page
- *
* {@inheritDoc}
*/
public function get_valid_offset()
diff --git a/phpBB/phpbb/message/admin_form.php b/phpBB/phpbb/message/admin_form.php
index b71b3fc535..93db59880c 100644
--- a/phpBB/phpbb/message/admin_form.php
+++ b/phpBB/phpbb/message/admin_form.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package message
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
@@ -12,8 +16,6 @@ namespace phpbb\message;
/**
* Class admin_form
* Displays a message to the user and allows him to send an email
-*
-* @package phpbb\message
*/
class admin_form extends form
{
diff --git a/phpBB/phpbb/message/form.php b/phpBB/phpbb/message/form.php
index d7a42c4080..076b41dc07 100644
--- a/phpBB/phpbb/message/form.php
+++ b/phpBB/phpbb/message/form.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package message
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
@@ -11,8 +15,6 @@ namespace phpbb\message;
/**
* Abstract class form
-*
-* @package phpbb\message
*/
abstract class form
{
diff --git a/phpBB/phpbb/message/message.php b/phpBB/phpbb/message/message.php
index 182995ba21..5fd24b542e 100644
--- a/phpBB/phpbb/message/message.php
+++ b/phpBB/phpbb/message/message.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package message
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
@@ -12,8 +16,6 @@ namespace phpbb\message;
/**
* Class message
* Holds all information for an email and sends it in the end
-*
-* @package phpbb\message
*/
class message
{
@@ -106,7 +108,7 @@ class message
/**
* Add a recipient from \phpbb\user
*
- * @param \phpbb\user $user
+ * @param array $user
* @return null
*/
public function add_recipient_from_user_row(array $user)
@@ -231,7 +233,7 @@ class message
* Send the email
*
* @param \messenger $messenger
- * @param string $phpEx
+ * @param string $contact
* @return null
*/
public function send(\messenger $messenger, $contact)
diff --git a/phpBB/phpbb/message/topic_form.php b/phpBB/phpbb/message/topic_form.php
index 3a35c35d21..1e0f2a1945 100644
--- a/phpBB/phpbb/message/topic_form.php
+++ b/phpBB/phpbb/message/topic_form.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package message
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
@@ -12,8 +16,6 @@ namespace phpbb\message;
/**
* Class topic_form
* Form used to send topics as notification emails
-*
-* @package phpbb\message
*/
class topic_form extends form
{
diff --git a/phpBB/phpbb/message/user_form.php b/phpBB/phpbb/message/user_form.php
index 7aa4b94def..007e575407 100644
--- a/phpBB/phpbb/message/user_form.php
+++ b/phpBB/phpbb/message/user_form.php
@@ -1,9 +1,13 @@
<?php
/**
*
-* @package message
-* @copyright (c) 2014 phpBB Group
-* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
*
*/
@@ -12,8 +16,6 @@ namespace phpbb\message;
/**
* Class user_form
* Allows users to send emails to other users
-*
-* @package phpbb\message
*/
class user_form extends form
{
diff --git a/phpBB/phpbb/mimetype/content_guesser.php b/phpBB/phpbb/mimetype/content_guesser.php
index 7c0177b57b..9c83e8dd73 100644
--- a/phpBB/phpbb/mimetype/content_guesser.php
+++ b/phpBB/phpbb/mimetype/content_guesser.php
@@ -16,7 +16,7 @@ namespace phpbb\mimetype;
class content_guesser extends guesser_base
{
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_supported()
{
@@ -24,7 +24,7 @@ class content_guesser extends guesser_base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function guess($file, $file_name = '')
{
diff --git a/phpBB/phpbb/mimetype/extension_guesser.php b/phpBB/phpbb/mimetype/extension_guesser.php
index 74bfeb97b6..9e36c07f91 100644
--- a/phpBB/phpbb/mimetype/extension_guesser.php
+++ b/phpBB/phpbb/mimetype/extension_guesser.php
@@ -470,7 +470,7 @@ class extension_guesser extends guesser_base
);
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_supported()
{
@@ -478,7 +478,7 @@ class extension_guesser extends guesser_base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function guess($file, $file_name = '')
{
diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php
index 6eb924b584..87b164b561 100644
--- a/phpBB/phpbb/mimetype/guesser.php
+++ b/phpBB/phpbb/mimetype/guesser.php
@@ -21,7 +21,7 @@ class guesser
const PRIORITY_DEFAULT = 0;
/**
- * @var mimetype guessers
+ * @var array guessers
*/
protected $guessers;
diff --git a/phpBB/phpbb/mimetype/guesser_base.php b/phpBB/phpbb/mimetype/guesser_base.php
index f26f207aff..225dfd57dc 100644
--- a/phpBB/phpbb/mimetype/guesser_base.php
+++ b/phpBB/phpbb/mimetype/guesser_base.php
@@ -21,7 +21,7 @@ abstract class guesser_base implements guesser_interface
protected $priority;
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_priority()
{
@@ -29,7 +29,7 @@ abstract class guesser_base implements guesser_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function set_priority($priority)
{
diff --git a/phpBB/phpbb/notification/manager.php b/phpBB/phpbb/notification/manager.php
index b787b624f6..74ef980445 100644
--- a/phpBB/phpbb/notification/manager.php
+++ b/phpBB/phpbb/notification/manager.php
@@ -13,6 +13,8 @@
namespace phpbb\notification;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
/**
* Notifications service class
*/
@@ -24,7 +26,7 @@ class manager
/** @var array */
protected $notification_methods;
- /** @var ContainerBuilder */
+ /** @var ContainerInterface */
protected $phpbb_container;
/** @var \phpbb\user_loader */
@@ -62,7 +64,7 @@ class manager
*
* @param array $notification_types
* @param array $notification_methods
- * @param ContainerBuilder $phpbb_container
+ * @param ContainerInterface $phpbb_container
* @param \phpbb\user_loader $user_loader
* @param \phpbb\config\config $config
* @param \phpbb\db\driver\driver_interface $db
@@ -74,7 +76,7 @@ class manager
* @param string $user_notifications_table
* @return \phpbb\notification\manager
*/
- public function __construct($notification_types, $notification_methods, $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table)
+ public function __construct($notification_types, $notification_methods, ContainerInterface $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table)
{
$this->notification_types = $notification_types;
$this->notification_methods = $notification_methods;
@@ -886,6 +888,7 @@ class manager
*
* @param string $notification_type_name The name
* @return int the notification_type_id
+ * @throws \phpbb\notification\exception
*/
public function get_notification_type_id($notification_type_name)
{
diff --git a/phpBB/phpbb/notification/type/base.php b/phpBB/phpbb/notification/type/base.php
index c1d4d0e257..910f51b3a6 100644
--- a/phpBB/phpbb/notification/type/base.php
+++ b/phpBB/phpbb/notification/type/base.php
@@ -308,16 +308,15 @@ abstract class base implements \phpbb\notification\type\type_interface
return array(
'NOTIFICATION_ID' => $this->notification_id,
-
+ 'STYLING' => $this->get_style_class(),
'AVATAR' => $this->get_avatar(),
-
'FORMATTED_TITLE' => $this->get_title(),
-
+ 'REFERENCE' => $this->get_reference(),
+ 'FORUM' => $this->get_forum(),
+ 'REASON' => $this->get_reason(),
'URL' => $this->get_url(),
'TIME' => $this->user->format_date($this->notification_time),
-
'UNREAD' => !$this->notification_read,
-
'U_MARK_READ' => (!$this->notification_read) ? $u_mark_read : '',
);
}
@@ -337,6 +336,16 @@ abstract class base implements \phpbb\notification\type\type_interface
}
/**
+ * Get the CSS style class of the notification (fall back)
+ *
+ * @return string
+ */
+ public function get_style_class()
+ {
+ return '';
+ }
+
+ /**
* Get the user's avatar (fall back)
*
* @return string
@@ -347,6 +356,36 @@ abstract class base implements \phpbb\notification\type\type_interface
}
/**
+ * Get the reference of the notifcation (fall back)
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return '';
+ }
+
+ /**
+ * Get the forum of the notification reference (fall back)
+ *
+ * @return string
+ */
+ public function get_forum()
+ {
+ return '';
+ }
+
+ /**
+ * Get the reason for the notifcation (fall back)
+ *
+ * @return string
+ */
+ public function get_reason()
+ {
+ return '';
+ }
+
+ /**
* Get the special items to load (fall back)
*
* @return array
diff --git a/phpBB/phpbb/notification/type/disapprove_post.php b/phpBB/phpbb/notification/type/disapprove_post.php
index b5f94f404f..7b18ed70ea 100644
--- a/phpBB/phpbb/notification/type/disapprove_post.php
+++ b/phpBB/phpbb/notification/type/disapprove_post.php
@@ -31,6 +31,16 @@ class disapprove_post extends \phpbb\notification\type\approve_post
}
/**
+ * Get the CSS style class of the notification
+ *
+ * @return string
+ */
+ public function get_style_class()
+ {
+ return 'notification-disapproved';
+ }
+
+ /**
* Language key used to output the text
*
* @var string
@@ -63,9 +73,31 @@ class disapprove_post extends \phpbb\notification\type\approve_post
*/
public function get_title()
{
+ return $this->user->lang($this->language_key);
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ censor_text($this->get_data('topic_title'))
+ );
+ }
+
+ /**
+ * Get the reason for the disapproval notification
+ *
+ * @return string
+ */
+ public function get_reason()
+ {
return $this->user->lang(
- $this->language_key,
- censor_text($this->get_data('topic_title')),
+ 'NOTIFICATION_REASON',
$this->get_data('disapprove_reason')
);
}
diff --git a/phpBB/phpbb/notification/type/disapprove_topic.php b/phpBB/phpbb/notification/type/disapprove_topic.php
index 8883c53294..3f87741807 100644
--- a/phpBB/phpbb/notification/type/disapprove_topic.php
+++ b/phpBB/phpbb/notification/type/disapprove_topic.php
@@ -31,6 +31,16 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
}
/**
+ * Get the CSS style class of the notification
+ *
+ * @return string
+ */
+ public function get_style_class()
+ {
+ return 'notification-disapproved';
+ }
+
+ /**
* Language key used to output the text
*
* @var string
@@ -63,9 +73,31 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
*/
public function get_title()
{
+ return $this->user->lang($this->language_key);
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ censor_text($this->get_data('topic_title'))
+ );
+ }
+
+ /**
+ * Get the reason for the disapproval notification
+ *
+ * @return string
+ */
+ public function get_reason()
+ {
return $this->user->lang(
- $this->language_key,
- censor_text($this->get_data('topic_title')),
+ 'NOTIFICATION_REASON',
$this->get_data('disapprove_reason')
);
}
diff --git a/phpBB/phpbb/notification/type/pm.php b/phpBB/phpbb/notification/type/pm.php
index 955d121cc6..4f54e93e06 100644
--- a/phpBB/phpbb/notification/type/pm.php
+++ b/phpBB/phpbb/notification/type/pm.php
@@ -111,7 +111,20 @@ class pm extends \phpbb\notification\type\base
{
$username = $this->user_loader->get_username($this->get_data('from_user_id'), 'no_profile');
- return $this->user->lang('NOTIFICATION_PM', $username, $this->get_data('message_subject'));
+ return $this->user->lang('NOTIFICATION_PM', $username);
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ $this->get_data('message_subject')
+ );
}
/**
diff --git a/phpBB/phpbb/notification/type/post.php b/phpBB/phpbb/notification/type/post.php
index c8760f904e..ee3a253e0f 100644
--- a/phpBB/phpbb/notification/type/post.php
+++ b/phpBB/phpbb/notification/type/post.php
@@ -225,12 +225,24 @@ class post extends \phpbb\notification\type\base
return $this->user->lang(
$this->language_key,
phpbb_generate_string_list($usernames, $this->user),
- censor_text($this->get_data('topic_title')),
$responders_cnt
);
}
/**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ censor_text($this->get_data('topic_title'))
+ );
+ }
+
+ /**
* Get email template
*
* @return string|bool
diff --git a/phpBB/phpbb/notification/type/report_pm.php b/phpBB/phpbb/notification/type/report_pm.php
index 03e89dd28e..2eb802eb4b 100644
--- a/phpBB/phpbb/notification/type/report_pm.php
+++ b/phpBB/phpbb/notification/type/report_pm.php
@@ -31,6 +31,16 @@ class report_pm extends \phpbb\notification\type\pm
}
/**
+ * Get the CSS style class of the notification
+ *
+ * @return string
+ */
+ public function get_style_class()
+ {
+ return 'notification-reported';
+ }
+
+ /**
* Language key used to output the text
*
* @var string
@@ -159,12 +169,36 @@ class report_pm extends \phpbb\notification\type\pm
$username = $this->user_loader->get_username($this->get_data('reporter_id'), 'no_profile');
+ return $this->user->lang(
+ $this->language_key,
+ $username
+ );
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ censor_text($this->get_data('message_subject'))
+ );
+ }
+
+ /**
+ * Get the reason for the notification
+ *
+ * @return string
+ */
+ public function get_reason()
+ {
if ($this->get_data('report_text'))
{
return $this->user->lang(
- $this->language_key,
- $username,
- censor_text($this->get_data('message_subject')),
+ 'NOTIFICATION_REASON',
$this->get_data('report_text')
);
}
@@ -172,17 +206,13 @@ class report_pm extends \phpbb\notification\type\pm
if (isset($this->user->lang[$this->get_data('reason_title')]))
{
return $this->user->lang(
- $this->language_key,
- $username,
- censor_text($this->get_data('message_subject')),
+ 'NOTIFICATION_REASON',
$this->user->lang[$this->get_data('reason_title')]
);
}
return $this->user->lang(
- $this->language_key,
- $username,
- censor_text($this->get_data('message_subject')),
+ 'NOTIFICATION_REASON',
$this->get_data('reason_description')
);
}
diff --git a/phpBB/phpbb/notification/type/report_pm_closed.php b/phpBB/phpbb/notification/type/report_pm_closed.php
index a646996f75..ed40df67f3 100644
--- a/phpBB/phpbb/notification/type/report_pm_closed.php
+++ b/phpBB/phpbb/notification/type/report_pm_closed.php
@@ -107,7 +107,19 @@ class report_pm_closed extends \phpbb\notification\type\pm
return $this->user->lang(
$this->language_key,
- $username,
+ $username
+ );
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
censor_text($this->get_data('message_subject'))
);
}
diff --git a/phpBB/phpbb/notification/type/report_post.php b/phpBB/phpbb/notification/type/report_post.php
index d5589a6756..024c8d9d42 100644
--- a/phpBB/phpbb/notification/type/report_post.php
+++ b/phpBB/phpbb/notification/type/report_post.php
@@ -30,6 +30,16 @@ class report_post extends \phpbb\notification\type\post_in_queue
}
/**
+ * Get the CSS style class of the notification
+ *
+ * @return string
+ */
+ public function get_style_class()
+ {
+ return 'notification-reported';
+ }
+
+ /**
* Language key used to output the text
*
* @var string
@@ -132,12 +142,36 @@ class report_post extends \phpbb\notification\type\post_in_queue
$username = $this->user_loader->get_username($this->get_data('reporter_id'), 'no_profile');
+ return $this->user->lang(
+ $this->language_key,
+ $username
+ );
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ censor_text($this->get_data('post_subject'))
+ );
+ }
+
+ /**
+ * Get the reason for the notification
+ *
+ * @return string
+ */
+ public function get_reason()
+ {
if ($this->get_data('report_text'))
{
return $this->user->lang(
- $this->language_key,
- $username,
- censor_text($this->get_data('post_subject')),
+ 'NOTIFICATION_REASON',
$this->get_data('report_text')
);
}
@@ -145,17 +179,13 @@ class report_post extends \phpbb\notification\type\post_in_queue
if (isset($this->user->lang[$this->get_data('reason_title')]))
{
return $this->user->lang(
- $this->language_key,
- $username,
- censor_text($this->get_data('post_subject')),
+ 'NOTIFICATION_REASON',
$this->user->lang[$this->get_data('reason_title')]
);
}
return $this->user->lang(
- $this->language_key,
- $username,
- censor_text($this->get_data('post_subject')),
+ 'NOTIFICATION_REASON',
$this->get_data('reason_description')
);
}
diff --git a/phpBB/phpbb/notification/type/report_post_closed.php b/phpBB/phpbb/notification/type/report_post_closed.php
index e76fa57036..a979af1fb0 100644
--- a/phpBB/phpbb/notification/type/report_post_closed.php
+++ b/phpBB/phpbb/notification/type/report_post_closed.php
@@ -114,7 +114,19 @@ class report_post_closed extends \phpbb\notification\type\post
return $this->user->lang(
$this->language_key,
- $username,
+ $username
+ );
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
censor_text($this->get_data('post_subject'))
);
}
diff --git a/phpBB/phpbb/notification/type/topic.php b/phpBB/phpbb/notification/type/topic.php
index 144c4e58a0..a512a12f20 100644
--- a/phpBB/phpbb/notification/type/topic.php
+++ b/phpBB/phpbb/notification/type/topic.php
@@ -151,8 +151,32 @@ class topic extends \phpbb\notification\type\base
return $this->user->lang(
$this->language_key,
- $username,
- censor_text($this->get_data('topic_title')),
+ $username
+ );
+ }
+
+ /**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_REFERENCE',
+ censor_text($this->get_data('topic_title'))
+ );
+ }
+
+ /**
+ * Get the forum of the notification reference
+ *
+ * @return string
+ */
+ public function get_forum()
+ {
+ return $this->user->lang(
+ 'NOTIFICATION_FORUM',
$this->get_data('forum_name')
);
}
diff --git a/phpBB/phpbb/notification/type/type_interface.php b/phpBB/phpbb/notification/type/type_interface.php
index c91c7078ad..5c5a110836 100644
--- a/phpBB/phpbb/notification/type/type_interface.php
+++ b/phpBB/phpbb/notification/type/type_interface.php
@@ -88,6 +88,13 @@ interface type_interface
public function load_special($data, $notifications);
/**
+ * Get the CSS style class of the notification
+ *
+ * @return string
+ */
+ public function get_style_class();
+
+ /**
* Get the HTML formatted title of this notification
*
* @return string
@@ -95,6 +102,20 @@ interface type_interface
public function get_title();
/**
+ * Get the HTML formatted reference of the notification
+ *
+ * @return string
+ */
+ public function get_reference();
+
+ /**
+ * Get the forum of the notification reference
+ *
+ * @return string
+ */
+ public function get_forum();
+
+ /**
* Get the url to this item
*
* @return string URL
diff --git a/phpBB/phpbb/pagination.php b/phpBB/phpbb/pagination.php
index 1d20b7f81c..8aba41d651 100644
--- a/phpBB/phpbb/pagination.php
+++ b/phpBB/phpbb/pagination.php
@@ -46,7 +46,7 @@ class pagination
* If you use page numbers inside your controller route, start name should be the string
* that should be removed for the first page (example: /page/%d)
* @param int $per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce
- * @return URL for the requested page
+ * @return string URL for the requested page
*/
protected function generate_page_link($base_url, $on_page, $start_name, $per_page)
{
diff --git a/phpBB/phpbb/passwords/driver/base.php b/phpBB/phpbb/passwords/driver/base.php
index 1d47180e55..fd07a61bf4 100644
--- a/phpBB/phpbb/passwords/driver/base.php
+++ b/phpBB/phpbb/passwords/driver/base.php
@@ -15,10 +15,10 @@ namespace phpbb\passwords\driver;
abstract class base implements driver_interface
{
- /** @var phpbb\config\config */
+ /** @var \phpbb\config\config */
protected $config;
- /** @var phpbb\passwords\driver\helper */
+ /** @var \phpbb\passwords\driver\helper */
protected $helper;
/** @var driver name */
@@ -37,7 +37,7 @@ abstract class base implements driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_supported()
{
@@ -45,7 +45,7 @@ abstract class base implements driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -53,7 +53,7 @@ abstract class base implements driver_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_settings_only($hash, $full = false)
{
diff --git a/phpBB/phpbb/passwords/driver/bcrypt.php b/phpBB/phpbb/passwords/driver/bcrypt.php
index de5840c7cf..23add37a56 100644
--- a/phpBB/phpbb/passwords/driver/bcrypt.php
+++ b/phpBB/phpbb/passwords/driver/bcrypt.php
@@ -18,7 +18,7 @@ class bcrypt extends base
const PREFIX = '$2a$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class bcrypt extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $salt = '')
{
@@ -58,7 +58,7 @@ class bcrypt extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
@@ -86,7 +86,7 @@ class bcrypt extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_settings_only($hash, $full = false)
{
diff --git a/phpBB/phpbb/passwords/driver/bcrypt_2y.php b/phpBB/phpbb/passwords/driver/bcrypt_2y.php
index 8b59037fca..c710e0d04a 100644
--- a/phpBB/phpbb/passwords/driver/bcrypt_2y.php
+++ b/phpBB/phpbb/passwords/driver/bcrypt_2y.php
@@ -18,7 +18,7 @@ class bcrypt_2y extends bcrypt
const PREFIX = '$2y$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class bcrypt_2y extends bcrypt
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_supported()
{
diff --git a/phpBB/phpbb/passwords/driver/bcrypt_wcf2.php b/phpBB/phpbb/passwords/driver/bcrypt_wcf2.php
index f706c7af69..2d6f897a7b 100644
--- a/phpBB/phpbb/passwords/driver/bcrypt_wcf2.php
+++ b/phpBB/phpbb/passwords/driver/bcrypt_wcf2.php
@@ -20,7 +20,7 @@ class bcrypt_wcf2 extends base
/** @var \phpbb\passwords\driver\bcrypt */
protected $bcrypt;
- /** @var phpbb\passwords\driver\helper */
+ /** @var \phpbb\passwords\driver\helper */
protected $helper;
/**
@@ -36,7 +36,7 @@ class bcrypt_wcf2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -44,7 +44,7 @@ class bcrypt_wcf2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -52,7 +52,7 @@ class bcrypt_wcf2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -61,7 +61,7 @@ class bcrypt_wcf2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/convert_password.php b/phpBB/phpbb/passwords/driver/convert_password.php
index 45d84f45c0..eb70434df2 100644
--- a/phpBB/phpbb/passwords/driver/convert_password.php
+++ b/phpBB/phpbb/passwords/driver/convert_password.php
@@ -18,7 +18,7 @@ class convert_password extends base
const PREFIX = '$CP$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class convert_password extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -34,7 +34,7 @@ class convert_password extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/driver_interface.php b/phpBB/phpbb/passwords/driver/driver_interface.php
index a257e71f23..3974484f13 100644
--- a/phpBB/phpbb/passwords/driver/driver_interface.php
+++ b/phpBB/phpbb/passwords/driver/driver_interface.php
@@ -51,7 +51,7 @@ interface driver_interface
*
* @param string $password The password to check
* @param string $hash The password hash to check against
- * @param string $user_row User's row in users table
+ * @param array $user_row User's row in users table
*
* @return bool True if password is correct, else false
*/
diff --git a/phpBB/phpbb/passwords/driver/helper.php b/phpBB/phpbb/passwords/driver/helper.php
index 85019bd5c9..2b3ebce53a 100644
--- a/phpBB/phpbb/passwords/driver/helper.php
+++ b/phpBB/phpbb/passwords/driver/helper.php
@@ -16,7 +16,7 @@ namespace phpbb\passwords\driver;
class helper
{
/**
- * @var phpbb\config\config
+ * @var \phpbb\config\config
*/
protected $config;
@@ -29,7 +29,7 @@ class helper
/**
* Construct a driver helper object
*
- * @param phpbb\config\config $config phpBB configuration
+ * @param \phpbb\config\config $config phpBB configuration
*/
public function __construct(\phpbb\config\config $config)
{
diff --git a/phpBB/phpbb/passwords/driver/md5_mybb.php b/phpBB/phpbb/passwords/driver/md5_mybb.php
index 0745bceb5e..61ea8dafd8 100644
--- a/phpBB/phpbb/passwords/driver/md5_mybb.php
+++ b/phpBB/phpbb/passwords/driver/md5_mybb.php
@@ -18,7 +18,7 @@ class md5_mybb extends base
const PREFIX = '$md5_mybb$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class md5_mybb extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -34,7 +34,7 @@ class md5_mybb extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -43,7 +43,7 @@ class md5_mybb extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/md5_phpbb2.php b/phpBB/phpbb/passwords/driver/md5_phpbb2.php
index de1993e8a1..86a4b62ea5 100644
--- a/phpBB/phpbb/passwords/driver/md5_phpbb2.php
+++ b/phpBB/phpbb/passwords/driver/md5_phpbb2.php
@@ -23,10 +23,10 @@ class md5_phpbb2 extends base
/** @var \phpbb\passwords\driver\salted_md5 */
protected $salted_md5;
- /** @var phpBB root path */
+ /** @var string phpBB root path */
protected $phpbb_root_path;
- /** @var php file extension */
+ /** @var string php file extension */
protected $php_ext;
/**
@@ -46,7 +46,7 @@ class md5_phpbb2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -54,7 +54,7 @@ class md5_phpbb2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -62,7 +62,7 @@ class md5_phpbb2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -71,7 +71,7 @@ class md5_phpbb2 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/md5_vb.php b/phpBB/phpbb/passwords/driver/md5_vb.php
index 440b9e39e9..c83c32a596 100644
--- a/phpBB/phpbb/passwords/driver/md5_vb.php
+++ b/phpBB/phpbb/passwords/driver/md5_vb.php
@@ -18,7 +18,7 @@ class md5_vb extends base
const PREFIX = '$md5_vb$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class md5_vb extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -34,7 +34,7 @@ class md5_vb extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -43,7 +43,7 @@ class md5_vb extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/phpass.php b/phpBB/phpbb/passwords/driver/phpass.php
index 44d9dc8fab..bef8355276 100644
--- a/phpBB/phpbb/passwords/driver/phpass.php
+++ b/phpBB/phpbb/passwords/driver/phpass.php
@@ -18,7 +18,7 @@ class phpass extends salted_md5
const PREFIX = '$P$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
diff --git a/phpBB/phpbb/passwords/driver/salted_md5.php b/phpBB/phpbb/passwords/driver/salted_md5.php
index b5f59754e1..97a2b9154b 100644
--- a/phpBB/phpbb/passwords/driver/salted_md5.php
+++ b/phpBB/phpbb/passwords/driver/salted_md5.php
@@ -46,7 +46,7 @@ class salted_md5 extends base
const PREFIX = '$H$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -54,7 +54,7 @@ class salted_md5 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -62,7 +62,7 @@ class salted_md5 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $setting = '')
{
@@ -98,7 +98,7 @@ class salted_md5 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
@@ -160,7 +160,7 @@ class salted_md5 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_settings_only($hash, $full = false)
{
diff --git a/phpBB/phpbb/passwords/driver/sha1.php b/phpBB/phpbb/passwords/driver/sha1.php
index 5d6c93f6a8..0852fd32fc 100644
--- a/phpBB/phpbb/passwords/driver/sha1.php
+++ b/phpBB/phpbb/passwords/driver/sha1.php
@@ -18,7 +18,7 @@ class sha1 extends base
const PREFIX = '$sha1$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class sha1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -34,7 +34,7 @@ class sha1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -43,7 +43,7 @@ class sha1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/sha1_smf.php b/phpBB/phpbb/passwords/driver/sha1_smf.php
index 3e3322d77f..ec64bd6afb 100644
--- a/phpBB/phpbb/passwords/driver/sha1_smf.php
+++ b/phpBB/phpbb/passwords/driver/sha1_smf.php
@@ -18,7 +18,7 @@ class sha1_smf extends base
const PREFIX = '$smf$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class sha1_smf extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -34,7 +34,7 @@ class sha1_smf extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -42,7 +42,7 @@ class sha1_smf extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/sha1_wcf1.php b/phpBB/phpbb/passwords/driver/sha1_wcf1.php
index 04a69705e9..919fa2bb71 100644
--- a/phpBB/phpbb/passwords/driver/sha1_wcf1.php
+++ b/phpBB/phpbb/passwords/driver/sha1_wcf1.php
@@ -18,7 +18,7 @@ class sha1_wcf1 extends base
const PREFIX = '$wcf1$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class sha1_wcf1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -34,7 +34,7 @@ class sha1_wcf1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -43,7 +43,7 @@ class sha1_wcf1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/driver/sha_xf1.php b/phpBB/phpbb/passwords/driver/sha_xf1.php
index 7ae0b90f51..7a1ea1450a 100644
--- a/phpBB/phpbb/passwords/driver/sha_xf1.php
+++ b/phpBB/phpbb/passwords/driver/sha_xf1.php
@@ -18,7 +18,7 @@ class sha_xf1 extends base
const PREFIX = '$xf1$';
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_prefix()
{
@@ -26,7 +26,7 @@ class sha_xf1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function is_legacy()
{
@@ -34,7 +34,7 @@ class sha_xf1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function hash($password, $user_row = '')
{
@@ -43,7 +43,7 @@ class sha_xf1 extends base
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function check($password, $hash, $user_row = array())
{
diff --git a/phpBB/phpbb/passwords/helper.php b/phpBB/phpbb/passwords/helper.php
index c6c5fb6d02..c2a49202cd 100644
--- a/phpBB/phpbb/passwords/helper.php
+++ b/phpBB/phpbb/passwords/helper.php
@@ -60,7 +60,7 @@ class helper
$data[$type] .= ($data[$type] !== '$') ? '\\' : '';
$data[$type] .= str_replace('$', '', $value);
}
- elseif ($type == 'settings')
+ else if ($type == 'settings')
{
$data[$type] .= ($data[$type] !== '$') ? '$' : '';
$data[$type] .= $value;
diff --git a/phpBB/phpbb/passwords/manager.php b/phpBB/phpbb/passwords/manager.php
index 0a349c4a14..fbb49d86a0 100644
--- a/phpBB/phpbb/passwords/manager.php
+++ b/phpBB/phpbb/passwords/manager.php
@@ -39,23 +39,23 @@ class manager
/**
* Passwords helper
- * @var phpbb\passwords\helper
+ * @var \phpbb\passwords\helper
*/
protected $helper;
/**
* phpBB configuration
- * @var phpbb\config\config
+ * @var \phpbb\config\config
*/
protected $config;
/**
* Construct a passwords object
*
- * @param phpbb\config\config $config phpBB configuration
+ * @param \phpbb\config\config $config phpBB configuration
* @param array $hashing_algorithms Hashing driver
* service collection
- * @param phpbb\passwords\helper $helper Passwords helper object
+ * @param \phpbb\passwords\helper $helper Passwords helper object
* @param string $defaults List of default driver types
*/
public function __construct(\phpbb\config\config $config, $hashing_algorithms, helper $helper, $defaults)
@@ -89,7 +89,7 @@ class manager
/**
* Fill algorithm type map
*
- * @param phpbb\di\service_collection $hashing_algorithms
+ * @param \phpbb\di\service_collection $hashing_algorithms
*/
protected function fill_type_map($hashing_algorithms)
{
diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php
index 0d83e7447e..b592cc4460 100644
--- a/phpBB/phpbb/path_helper.php
+++ b/phpBB/phpbb/path_helper.php
@@ -98,7 +98,7 @@ class path_helper
{
$path = substr($path, strlen($this->phpbb_root_path));
- return $this->get_web_root_path() . $path;
+ return $this->filesystem->clean_path($this->get_web_root_path() . $path);
}
return $path;
@@ -158,7 +158,7 @@ class path_helper
*/
if ($path_info === '/' && preg_match('/app\.' . $this->php_ext . '\/$/', $request_uri))
{
- return $this->web_root_path = $this->phpbb_root_path . '../';
+ return $this->web_root_path = $this->filesystem->clean_path('./../' . $this->phpbb_root_path);
}
/*
@@ -174,27 +174,20 @@ class path_helper
$corrections = substr_count($path_info, '/');
/*
- * If the script name (e.g. phpBB/app.php) exists in the
- * requestUri (e.g. phpBB/app.php/foo/template), then we
- * are have a non-rewritten URL.
+ * If the script name (e.g. phpBB/app.php) does not exists in the
+ * requestUri (e.g. phpBB/app.php/foo/template), then we are rewriting
+ * the URL. So we must reduce the slash count by 1.
*/
- if (strpos($request_uri, $script_name) === 0)
+ if (strpos($request_uri, $script_name) !== 0)
{
- /*
- * Append ../ to the end of the phpbb_root_path as many times
- * as / exists in path_info
- */
- return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $corrections);
+ $corrections--;
}
- /*
- * If we're here it means we're at a re-written path, so we must
- * correct the relative path for web URLs. We must append ../
- * to the end of the root path as many times as / exists in path_info
- * less one time (because the script, e.g. /app.php, doesn't exist in
- * the URL)
- */
- return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $corrections - 1);
+ // Prepend ../ to the phpbb_root_path as many times as / exists in path_info
+ $this->web_root_path = $this->filesystem->clean_path(
+ './' . str_repeat('../', $corrections) . $this->phpbb_root_path
+ );
+ return $this->web_root_path;
}
/**
@@ -317,7 +310,7 @@ class path_helper
*
* @param string $url URL to append parameters to
* @param array $new_params Parameters to add in the form of array(name => value)
- * @param string $is_amp Is the parameter separator &amp;. Defaults to true.
+ * @param bool $is_amp Is the parameter separator &amp;. Defaults to true.
* @return string Returns the new URL.
*/
public function append_url_params($url, $new_params, $is_amp = true)
diff --git a/phpBB/phpbb/permissions.php b/phpBB/phpbb/permissions.php
index 72d85cb094..9b3dcadf32 100644
--- a/phpBB/phpbb/permissions.php
+++ b/phpBB/phpbb/permissions.php
@@ -17,7 +17,7 @@ class permissions
{
/**
* Event dispatcher object
- * @var \phpbb\event\dispatcher
+ * @var \phpbb\event\dispatcher_interface
*/
protected $dispatcher;
@@ -30,11 +30,10 @@ class permissions
/**
* Constructor
*
- * @param \phpbb\event\dispatcher $phpbb_dispatcher Event dispatcher
+ * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher
* @param \phpbb\user $user User Object
- * @return null
*/
- public function __construct(\phpbb\event\dispatcher $phpbb_dispatcher, \phpbb\user $user)
+ public function __construct(\phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\user $user)
{
$this->dispatcher = $phpbb_dispatcher;
$this->user = $user;
diff --git a/phpBB/phpbb/plupload/plupload.php b/phpBB/phpbb/plupload/plupload.php
index 99278d40df..c610d49a63 100644
--- a/phpBB/phpbb/plupload/plupload.php
+++ b/phpBB/phpbb/plupload/plupload.php
@@ -69,8 +69,6 @@ class plupload
* @param \phpbb\user $user
* @param \phpbb\php\ini $php_ini
* @param \phpbb\mimetype\guesser $mimetype_guesser
- *
- * @return null
*/
public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\user $user, \phpbb\php\ini $php_ini, \phpbb\mimetype\guesser $mimetype_guesser)
{
diff --git a/phpBB/phpbb/profilefields/lang_helper.php b/phpBB/phpbb/profilefields/lang_helper.php
index c055931181..2e353722b2 100644
--- a/phpBB/phpbb/profilefields/lang_helper.php
+++ b/phpBB/phpbb/profilefields/lang_helper.php
@@ -49,43 +49,50 @@ class lang_helper
}
/**
- * Get language entries for options and store them here for later use
+ * Loads preview options into language entries for options
+ *
+ * @param int $field_id
+ * @param int $lang_id
+ * @param mixed $preview_options
*/
- public function get_option_lang($field_id, $lang_id, $field_type, $preview_options)
+ public function load_preview_options($field_id, $lang_id, $preview_options)
{
- if ($preview_options !== false)
- {
- $lang_options = (!is_array($preview_options)) ? explode("\n", $preview_options) : $preview_options;
+ $lang_options = (!is_array($preview_options)) ? explode("\n", $preview_options) : $preview_options;
- foreach ($lang_options as $num => $var)
+ foreach ($lang_options as $num => $var)
+ {
+ if (!isset($this->options_lang[$field_id]))
+ {
+ $this->options_lang[$field_id] = array();
+ }
+ if (!isset($this->options_lang[$field_id][$lang_id]))
{
- if (!isset($this->options_lang[$field_id]))
- {
- $this->options_lang[$field_id] = array();
- }
- if (!isset($this->options_lang[$field_id][$lang_id]))
- {
- $this->options_lang[$field_id][$lang_id] = array();
- }
- $this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
+ $this->options_lang[$field_id][$lang_id] = array();
}
+ $this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
}
- else
- {
- $sql = 'SELECT option_id, lang_value
+ }
+
+ /**
+ * Fetches language entries for options from DB
+ *
+ * @param int $lang_id
+ */
+ public function load_option_lang($lang_id)
+ {
+ $sql = 'SELECT field_id, option_id, lang_value
FROM ' . $this->language_table . '
- WHERE field_id = ' . (int) $field_id . '
- AND lang_id = ' . (int) $lang_id . "
- AND field_type = '" . $this->db->sql_escape($field_type) . "'
+ WHERE lang_id = ' . (int) $lang_id . "
ORDER BY option_id";
- $result = $this->db->sql_query($sql);
- while ($row = $this->db->sql_fetchrow($result))
- {
- $this->options_lang[$field_id][$lang_id][($row['option_id'] + 1)] = $row['lang_value'];
- }
- $this->db->sql_freeresult($result);
+ $result = $this->db->sql_query($sql);
+
+ while ($row = $this->db->sql_fetchrow($result))
+ {
+ $this->options_lang[$row['field_id']][$lang_id][($row['option_id'] + 1)] = $row['lang_value'];
}
+
+ $this->db->sql_freeresult($result);
}
/**
diff --git a/phpBB/phpbb/profilefields/manager.php b/phpBB/phpbb/profilefields/manager.php
index 490db0419a..f3b1676799 100644
--- a/phpBB/phpbb/profilefields/manager.php
+++ b/phpBB/phpbb/profilefields/manager.php
@@ -32,7 +32,7 @@ class manager
/**
* Event dispatcher object
- * @var \phpbb\event\dispatcher
+ * @var \phpbb\event\dispatcher_interface
*/
protected $dispatcher;
@@ -73,7 +73,7 @@ class manager
*
* @param \phpbb\auth\auth $auth Auth object
* @param \phpbb\db\driver\driver_interface $db Database object
- * @param \phpbb\event\dispatcher $dispatcher Event dispatcher object
+ * @param \phpbb\event\dispatcher_interface $dispatcher Event dispatcher object
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\di\service_collection $type_collection
@@ -82,7 +82,7 @@ class manager
* @param string $fields_language_table
* @param string $fields_data_table
*/
- public function __construct(\phpbb\auth\auth $auth, \phpbb\db\driver\driver_interface $db, \phpbb\event\dispatcher $dispatcher, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\di\service_collection $type_collection, \phpbb\user $user, $fields_table, $fields_language_table, $fields_data_table)
+ public function __construct(\phpbb\auth\auth $auth, \phpbb\db\driver\driver_interface $db, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\di\service_collection $type_collection, \phpbb\user $user, $fields_table, $fields_language_table, $fields_data_table)
{
$this->auth = $auth;
$this->db = $db;
@@ -389,6 +389,7 @@ class manager
{
$profile_field = $this->type_collection[$ident_ary['data']['field_type']];
$value = $profile_field->get_profile_value($ident_ary['value'], $ident_ary['data']);
+ $value_raw = $profile_field->get_profile_value_raw($ident_ary['value'], $ident_ary['data']);
if ($value === null)
{
@@ -412,26 +413,28 @@ class manager
}
$tpl_fields['row'] += array(
- 'PROFILE_' . strtoupper($ident) . '_IDENT' => $ident,
- 'PROFILE_' . strtoupper($ident) . '_VALUE' => $value,
- 'PROFILE_' . strtoupper($ident) . '_CONTACT'=> $contact_url,
- 'PROFILE_' . strtoupper($ident) . '_DESC' => $field_desc,
- 'PROFILE_' . strtoupper($ident) . '_TYPE' => $ident_ary['data']['field_type'],
- 'PROFILE_' . strtoupper($ident) . '_NAME' => $this->user->lang($ident_ary['data']['lang_name']),
- 'PROFILE_' . strtoupper($ident) . '_EXPLAIN'=> $this->user->lang($ident_ary['data']['lang_explain']),
+ 'PROFILE_' . strtoupper($ident) . '_IDENT' => $ident,
+ 'PROFILE_' . strtoupper($ident) . '_VALUE' => $value,
+ 'PROFILE_' . strtoupper($ident) . '_VALUE_RAW' => $value_raw,
+ 'PROFILE_' . strtoupper($ident) . '_CONTACT' => $contact_url,
+ 'PROFILE_' . strtoupper($ident) . '_DESC' => $field_desc,
+ 'PROFILE_' . strtoupper($ident) . '_TYPE' => $ident_ary['data']['field_type'],
+ 'PROFILE_' . strtoupper($ident) . '_NAME' => $this->user->lang($ident_ary['data']['lang_name']),
+ 'PROFILE_' . strtoupper($ident) . '_EXPLAIN' => $this->user->lang($ident_ary['data']['lang_explain']),
'S_PROFILE_' . strtoupper($ident) . '_CONTACT' => $ident_ary['data']['field_is_contact'],
'S_PROFILE_' . strtoupper($ident) => true,
);
$tpl_fields['blockrow'][] = array(
- 'PROFILE_FIELD_IDENT' => $ident,
- 'PROFILE_FIELD_VALUE' => $value,
- 'PROFILE_FIELD_CONTACT' => $contact_url,
- 'PROFILE_FIELD_DESC' => $field_desc,
- 'PROFILE_FIELD_TYPE' => $ident_ary['data']['field_type'],
- 'PROFILE_FIELD_NAME' => $this->user->lang($ident_ary['data']['lang_name']),
- 'PROFILE_FIELD_EXPLAIN' => $this->user->lang($ident_ary['data']['lang_explain']),
+ 'PROFILE_FIELD_IDENT' => $ident,
+ 'PROFILE_FIELD_VALUE' => $value,
+ 'PROFILE_FIELD_VALUE_RAW' => $value_raw,
+ 'PROFILE_FIELD_CONTACT' => $contact_url,
+ 'PROFILE_FIELD_DESC' => $field_desc,
+ 'PROFILE_FIELD_TYPE' => $ident_ary['data']['field_type'],
+ 'PROFILE_FIELD_NAME' => $this->user->lang($ident_ary['data']['lang_name']),
+ 'PROFILE_FIELD_EXPLAIN' => $this->user->lang($ident_ary['data']['lang_explain']),
'S_PROFILE_CONTACT' => $ident_ary['data']['field_is_contact'],
'S_PROFILE_' . strtoupper($ident) => true,
diff --git a/phpBB/phpbb/profilefields/type/type_base.php b/phpBB/phpbb/profilefields/type/type_base.php
index 3ca1274458..c770a0d93c 100644
--- a/phpBB/phpbb/profilefields/type/type_base.php
+++ b/phpBB/phpbb/profilefields/type/type_base.php
@@ -39,7 +39,6 @@ abstract class type_base implements type_interface
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
diff --git a/phpBB/phpbb/profilefields/type/type_bool.php b/phpBB/phpbb/profilefields/type/type_bool.php
index 8d3c0cad93..0582722833 100644
--- a/phpBB/phpbb/profilefields/type/type_bool.php
+++ b/phpBB/phpbb/profilefields/type/type_bool.php
@@ -46,7 +46,6 @@ class type_bool extends type_base
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\profilefields\lang_helper $lang_helper, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
@@ -156,7 +155,7 @@ class type_bool extends type_base
if (!$this->lang_helper->is_set($field_id, $lang_id))
{
- $this->lang_helper->get_option_lang($field_id, $lang_id, FIELD_BOOL, false);
+ $this->lang_helper->load_option_lang($lang_id);
}
if (!$field_value && $field_data['field_show_novalue'])
@@ -181,6 +180,24 @@ class type_bool extends type_base
/**
* {@inheritDoc}
*/
+ public function get_profile_value_raw($field_value, $field_data)
+ {
+ if ($field_value == $field_data['field_novalue'] && !$field_data['field_show_novalue'])
+ {
+ return null;
+ }
+
+ if (!$field_value && $field_data['field_show_novalue'])
+ {
+ $field_value = $field_data['field_novalue'];
+ }
+
+ return $field_value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
@@ -204,7 +221,14 @@ class type_bool extends type_base
{
if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1))
{
- $this->lang_helper->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], $this->get_service_name(), $preview_options);
+ if ($preview_options)
+ {
+ $this->lang_helper->load_preview_options($profile_row['field_id'], $profile_row['lang_id'], $preview_options);
+ }
+ else
+ {
+ $this->lang_helper->load_option_lang($profile_row['lang_id']);
+ }
}
$options = $this->lang_helper->get($profile_row['field_id'], $profile_row['lang_id']);
diff --git a/phpBB/phpbb/profilefields/type/type_date.php b/phpBB/phpbb/profilefields/type/type_date.php
index aedd6a56d6..90ac9a6703 100644
--- a/phpBB/phpbb/profilefields/type/type_date.php
+++ b/phpBB/phpbb/profilefields/type/type_date.php
@@ -39,7 +39,6 @@ class type_date extends type_base
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
@@ -209,6 +208,19 @@ class type_date extends type_base
/**
* {@inheritDoc}
*/
+ public function get_profile_value_raw($field_value, $field_data)
+ {
+ if (($field_value === '' || $field_value === null) && !$field_data['field_show_novalue'])
+ {
+ return null;
+ }
+
+ return $field_value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
diff --git a/phpBB/phpbb/profilefields/type/type_dropdown.php b/phpBB/phpbb/profilefields/type/type_dropdown.php
index 053a02d593..17ae89e1b2 100644
--- a/phpBB/phpbb/profilefields/type/type_dropdown.php
+++ b/phpBB/phpbb/profilefields/type/type_dropdown.php
@@ -46,7 +46,6 @@ class type_dropdown extends type_base
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\profilefields\lang_helper $lang_helper, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
@@ -136,7 +135,7 @@ class type_dropdown extends type_base
// retrieve option lang data if necessary
if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], 1))
{
- $this->lang_helper->get_option_lang($field_data['field_id'], $field_data['lang_id'], $this->get_service_name(), false);
+ $this->lang_helper->load_option_lang($field_data['lang_id']);
}
if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], $field_value))
@@ -161,7 +160,7 @@ class type_dropdown extends type_base
$lang_id = $field_data['lang_id'];
if (!$this->lang_helper->is_set($field_id, $lang_id))
{
- $this->lang_helper->get_option_lang($field_id, $lang_id, $this->get_service_name(), false);
+ $this->lang_helper->load_option_lang($lang_id);
}
if ($field_value == $field_data['field_novalue'] && !$field_data['field_show_novalue'])
@@ -190,6 +189,24 @@ class type_dropdown extends type_base
/**
* {@inheritDoc}
*/
+ public function get_profile_value_raw($field_value, $field_data)
+ {
+ if ($field_value == $field_data['field_novalue'] && !$field_data['field_show_novalue'])
+ {
+ return null;
+ }
+
+ if (!$field_value && $field_data['field_show_novalue'])
+ {
+ $field_value = $field_data['field_novalue'];
+ }
+
+ return $field_value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
@@ -200,7 +217,14 @@ class type_dropdown extends type_base
if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1))
{
- $this->lang_helper->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], $this->get_service_name(), $preview_options);
+ if ($preview_options)
+ {
+ $this->lang_helper->load_preview_options($profile_row['field_id'], $profile_row['lang_id'], $preview_options);
+ }
+ else
+ {
+ $this->lang_helper->load_option_lang($profile_row['lang_id']);
+ }
}
$profile_row['field_value'] = (int) $value;
diff --git a/phpBB/phpbb/profilefields/type/type_googleplus.php b/phpBB/phpbb/profilefields/type/type_googleplus.php
new file mode 100644
index 0000000000..df1bcc7f4b
--- /dev/null
+++ b/phpBB/phpbb/profilefields/type/type_googleplus.php
@@ -0,0 +1,58 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\profilefields\type;
+
+class type_googleplus extends type_string
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function get_service_name()
+ {
+ return 'profilefields.type.googleplus';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function get_default_option_values()
+ {
+ return array(
+ 'field_length' => 20,
+ 'field_minlen' => 3,
+ 'field_maxlen' => 255,
+ 'field_validation' => '[\w]+',
+ 'field_novalue' => '',
+ 'field_default_value' => '',
+ );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function get_profile_contact_value($field_value, $field_data)
+ {
+ if (!$field_value && !$field_data['field_show_novalue'])
+ {
+ return null;
+ }
+
+ if (!is_numeric($field_value))
+ {
+ $field_value = '+' . $field_value;
+ }
+
+ return $field_value;
+ }
+}
diff --git a/phpBB/phpbb/profilefields/type/type_int.php b/phpBB/phpbb/profilefields/type/type_int.php
index 8cbcf62b8c..dd08df94c1 100644
--- a/phpBB/phpbb/profilefields/type/type_int.php
+++ b/phpBB/phpbb/profilefields/type/type_int.php
@@ -39,7 +39,6 @@ class type_int extends type_base
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
@@ -155,6 +154,18 @@ class type_int extends type_base
/**
* {@inheritDoc}
*/
+ public function get_profile_value_raw($field_value, $field_data)
+ {
+ if (($field_value === '' || $field_value === null) && !$field_data['field_show_novalue'])
+ {
+ return null;
+ }
+ return (int) $field_value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function generate_field($profile_row, $preview_options = false)
{
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
diff --git a/phpBB/phpbb/profilefields/type/type_interface.php b/phpBB/phpbb/profilefields/type/type_interface.php
index 489e916fd5..2dd13fa480 100644
--- a/phpBB/phpbb/profilefields/type/type_interface.php
+++ b/phpBB/phpbb/profilefields/type/type_interface.php
@@ -94,6 +94,15 @@ interface type_interface
public function get_profile_value($field_value, $field_data);
/**
+ * Get Profile Value ID for display (the raw, unprocessed user data)
+ *
+ * @param mixed $field_value Field value as stored in the database
+ * @param array $field_data Array with requirements of the field
+ * @return mixed Field value ID to display
+ */
+ public function get_profile_value_raw($field_value, $field_data);
+
+ /**
* Get Profile Value for display
*
* When displaying a contact field, we don't want to have links already parsed and more
diff --git a/phpBB/phpbb/profilefields/type/type_string.php b/phpBB/phpbb/profilefields/type/type_string.php
index 7e994d700b..67befc457d 100644
--- a/phpBB/phpbb/profilefields/type/type_string.php
+++ b/phpBB/phpbb/profilefields/type/type_string.php
@@ -39,7 +39,6 @@ class type_string extends type_string_common
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
diff --git a/phpBB/phpbb/profilefields/type/type_string_common.php b/phpBB/phpbb/profilefields/type/type_string_common.php
index 7d0cb04d7c..c2b951b6c9 100644
--- a/phpBB/phpbb/profilefields/type/type_string_common.php
+++ b/phpBB/phpbb/profilefields/type/type_string_common.php
@@ -20,7 +20,9 @@ abstract class type_string_common extends type_base
'NUMBERS_ONLY' => '[0-9]+',
'ALPHA_ONLY' => '[\w]+',
'ALPHA_UNDERSCORE' => '[\w_]+',
+ 'ALPHA_DOTS' => '[\w.]+',
'ALPHA_SPACERS' => '[\w_\+\. \-\[\]]+',
+ 'ALPHA_PUNCTUATION' => '[a-zA-Z][\w\.,\-_]+',
);
/**
@@ -110,6 +112,19 @@ abstract class type_string_common extends type_base
/**
* {@inheritDoc}
*/
+ public function get_profile_value_raw($field_value, $field_data)
+ {
+ if (!$field_value && !$field_data['field_show_novalue'])
+ {
+ return null;
+ }
+
+ return $field_value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function get_profile_contact_value($field_value, $field_data)
{
if (!$field_value && !$field_data['field_show_novalue'])
diff --git a/phpBB/phpbb/profilefields/type/type_text.php b/phpBB/phpbb/profilefields/type/type_text.php
index 856573292f..bacf60a213 100644
--- a/phpBB/phpbb/profilefields/type/type_text.php
+++ b/phpBB/phpbb/profilefields/type/type_text.php
@@ -39,7 +39,6 @@ class type_text extends type_string_common
* @param \phpbb\request\request $request Request object
* @param \phpbb\template\template $template Template object
* @param \phpbb\user $user User object
- * @param string $language_table Table where the language strings are stored
*/
public function __construct(\phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user)
{
diff --git a/phpBB/phpbb/search/base.php b/phpBB/phpbb/search/base.php
index 861b1f9328..9395b6a273 100644
--- a/phpBB/phpbb/search/base.php
+++ b/phpBB/phpbb/search/base.php
@@ -282,7 +282,7 @@ class base
$sql_where = '';
foreach ($words as $word)
{
- $sql_where .= " OR search_keywords " . $db->sql_like_expression($db->any_char . $word . $db->any_char);
+ $sql_where .= " OR search_keywords " . $db->sql_like_expression($db->get_any_char() . $word . $db->get_any_char());
}
$sql = 'SELECT search_key
@@ -303,7 +303,7 @@ class base
$sql_where = '';
foreach ($authors as $author)
{
- $sql_where .= (($sql_where) ? ' OR ' : '') . 'search_authors ' . $db->sql_like_expression($db->any_char . ' ' . (int) $author . ' ' . $db->any_char);
+ $sql_where .= (($sql_where) ? ' OR ' : '') . 'search_authors ' . $db->sql_like_expression($db->get_any_char() . ' ' . (int) $author . ' ' . $db->get_any_char());
}
$sql = 'SELECT search_key
diff --git a/phpBB/phpbb/search/fulltext_mysql.php b/phpBB/phpbb/search/fulltext_mysql.php
index 3e8e492cd8..d4e7de31e5 100644
--- a/phpBB/phpbb/search/fulltext_mysql.php
+++ b/phpBB/phpbb/search/fulltext_mysql.php
@@ -140,7 +140,7 @@ class fulltext_mysql extends \phpbb\search\base
*/
public function init()
{
- if ($this->db->sql_layer != 'mysql4' && $this->db->sql_layer != 'mysqli')
+ if ($this->db->get_sql_layer() != 'mysql4' && $this->db->get_sql_layer() != 'mysqli')
{
return $this->user->lang['FULLTEXT_MYSQL_INCOMPATIBLE_DATABASE'];
}
@@ -764,7 +764,7 @@ class fulltext_mysql extends \phpbb\search\base
if (!isset($this->stats['post_subject']))
{
- if ($this->db->sql_layer == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
+ if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{
$alter[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
}
@@ -777,7 +777,7 @@ class fulltext_mysql extends \phpbb\search\base
if (!isset($this->stats['post_content']))
{
- if ($this->db->sql_layer == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
+ if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{
$alter[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
}
@@ -872,7 +872,7 @@ class fulltext_mysql extends \phpbb\search\base
*/
protected function get_stats()
{
- if (strpos($this->db->sql_layer, 'mysql') === false)
+ if (strpos($this->db->get_sql_layer(), 'mysql') === false)
{
$this->stats = array();
return;
diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php
index f7b1751a51..48b0f077c7 100644
--- a/phpBB/phpbb/search/fulltext_native.php
+++ b/phpBB/phpbb/search/fulltext_native.php
@@ -758,7 +758,7 @@ class fulltext_native extends \phpbb\search\base
);
}
- switch ($this->db->sql_layer)
+ switch ($this->db->get_sql_layer())
{
case 'mysql4':
case 'mysqli':
@@ -978,7 +978,7 @@ class fulltext_native extends \phpbb\search\base
// If the cache was completely empty count the results
if (!$total_results)
{
- switch ($this->db->sql_layer)
+ switch ($this->db->get_sql_layer())
{
case 'mysql4':
case 'mysqli':
@@ -1000,7 +1000,7 @@ class fulltext_native extends \phpbb\search\base
}
else
{
- if ($this->db->sql_layer == 'sqlite' || $this->db->sql_layer == 'sqlite3')
+ if ($this->db->get_sql_layer() == 'sqlite' || $this->db->get_sql_layer() == 'sqlite3')
{
$sql = 'SELECT COUNT(topic_id) as total_results
FROM (SELECT DISTINCT t.topic_id';
@@ -1017,7 +1017,7 @@ class fulltext_native extends \phpbb\search\base
$post_visibility
$sql_fora
AND t.topic_id = p.topic_id
- $sql_time" . (($this->db->sql_layer == 'sqlite' || $this->db->sql_layer == 'sqlite3') ? ')' : '');
+ $sql_time" . (($this->db->get_sql_layer() == 'sqlite' || $this->db->get_sql_layer() == 'sqlite3') ? ')' : '');
}
$result = $this->db->sql_query($sql);
@@ -1481,11 +1481,10 @@ class fulltext_native extends \phpbb\search\base
*/
public function delete_index($acp_module, $u_action)
{
- switch ($this->db->sql_layer)
+ switch ($this->db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
- case 'firebird':
$this->db->sql_query('DELETE FROM ' . SEARCH_WORDLIST_TABLE);
$this->db->sql_query('DELETE FROM ' . SEARCH_WORDMATCH_TABLE);
$this->db->sql_query('DELETE FROM ' . SEARCH_RESULTS_TABLE);
diff --git a/phpBB/phpbb/search/fulltext_postgres.php b/phpBB/phpbb/search/fulltext_postgres.php
index 49d528c8ba..b3e7f51f87 100644
--- a/phpBB/phpbb/search/fulltext_postgres.php
+++ b/phpBB/phpbb/search/fulltext_postgres.php
@@ -31,18 +31,6 @@ class fulltext_postgres extends \phpbb\search\base
protected $split_words = array();
/**
- * True if PostgreSQL version supports tsearch
- * @var boolean
- */
- protected $tsearch_usable = false;
-
- /**
- * Stores the PostgreSQL version
- * @var string
- */
- protected $version;
-
- /**
* Stores the tsearch query
* @var string
*/
@@ -107,16 +95,6 @@ class fulltext_postgres extends \phpbb\search\base
$this->word_length = array('min' => $this->config['fulltext_postgres_min_word_len'], 'max' => $this->config['fulltext_postgres_max_word_len']);
- if ($this->db->sql_layer == 'postgres')
- {
- $pgsql_version = explode(',', substr($this->db->sql_server_info(), 10));
- $this->version = trim($pgsql_version[0]);
- if (version_compare($this->version, '8.3', '>='))
- {
- $this->tsearch_usable = true;
- }
- }
-
/**
* Load the UTF tools
*/
@@ -185,16 +163,11 @@ class fulltext_postgres extends \phpbb\search\base
*/
public function init()
{
- if ($this->db->sql_layer != 'postgres')
+ if ($this->db->get_sql_layer() != 'postgres')
{
return $this->user->lang['FULLTEXT_POSTGRES_INCOMPATIBLE_DATABASE'];
}
- if (!$this->tsearch_usable)
- {
- return $this->user->lang['FULLTEXT_POSTGRES_TS_NOT_USABLE'];
- }
-
return false;
}
@@ -263,12 +236,12 @@ class fulltext_postgres extends \phpbb\search\base
$this->search_query .= $word . ' ';
$this->tsearch_query .= '&' . substr($word, 1) . ' ';
}
- elseif (strpos($word, '-') === 0)
+ else if (strpos($word, '-') === 0)
{
$this->search_query .= $word . ' ';
$this->tsearch_query .= '&!' . substr($word, 1) . ' ';
}
- elseif (strpos($word, '|') === 0)
+ else if (strpos($word, '|') === 0)
{
$this->search_query .= $word . ' ';
$this->tsearch_query .= '|' . substr($word, 1) . ' ';
@@ -869,7 +842,7 @@ class fulltext_postgres extends \phpbb\search\base
*/
protected function get_stats()
{
- if ($this->db->sql_layer != 'postgres')
+ if ($this->db->get_sql_layer() != 'postgres')
{
$this->stats = array();
return;
@@ -913,13 +886,13 @@ class fulltext_postgres extends \phpbb\search\base
$tpl = '
<dl>
<dt><label>' . $this->user->lang['FULLTEXT_POSTGRES_VERSION_CHECK'] . '</label><br /><span>' . $this->user->lang['FULLTEXT_POSTGRES_VERSION_CHECK_EXPLAIN'] . '</span></dt>
- <dd>' . (($this->tsearch_usable) ? $this->user->lang['YES'] : $this->user->lang['NO']) . ' (PostgreSQL ' . $this->version . ')</dd>
+ <dd>' . (($this->db->get_sql_layer() == 'postgres') ? $this->user->lang['YES'] : $this->user->lang['NO']) . '</dd>
</dl>
<dl>
<dt><label>' . $this->user->lang['FULLTEXT_POSTGRES_TS_NAME'] . '</label><br /><span>' . $this->user->lang['FULLTEXT_POSTGRES_TS_NAME_EXPLAIN'] . '</span></dt>
<dd><select name="config[fulltext_postgres_ts_name]">';
- if ($this->db->sql_layer == 'postgres' && $this->tsearch_usable)
+ if ($this->db->get_sql_layer() == 'postgres')
{
$sql = 'SELECT cfgname AS ts_name
FROM pg_ts_config';
diff --git a/phpBB/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php
index c6c636562e..78c11f1180 100644
--- a/phpBB/phpbb/search/fulltext_sphinx.php
+++ b/phpBB/phpbb/search/fulltext_sphinx.php
@@ -199,7 +199,7 @@ class fulltext_sphinx
*/
public function init()
{
- if ($this->db->sql_layer != 'mysql' && $this->db->sql_layer != 'mysql4' && $this->db->sql_layer != 'mysqli' && $this->db->sql_layer != 'postgres')
+ if ($this->db->get_sql_layer() != 'mysql' && $this->db->get_sql_layer() != 'mysql4' && $this->db->get_sql_layer() != 'mysqli' && $this->db->get_sql_layer() != 'postgres')
{
return $this->user->lang['FULLTEXT_SPHINX_WRONG_DATABASE'];
}
@@ -218,11 +218,11 @@ class fulltext_sphinx
protected function config_generate()
{
// Check if Database is supported by Sphinx
- if ($this->db->sql_layer =='mysql' || $this->db->sql_layer == 'mysql4' || $this->db->sql_layer == 'mysqli')
+ if ($this->db->get_sql_layer() =='mysql' || $this->db->get_sql_layer() == 'mysql4' || $this->db->get_sql_layer() == 'mysqli')
{
$this->dbtype = 'mysql';
}
- else if ($this->db->sql_layer == 'postgres')
+ else if ($this->db->get_sql_layer() == 'postgres')
{
$this->dbtype = 'pgsql';
}
@@ -693,7 +693,7 @@ class fulltext_sphinx
{
if ($mode == 'edit')
{
- $this->sphinx->UpdateAttributes($this->indexes, array('forum_id', 'poster_id'), array((int)$post_id => array((int)$forum_id, (int)$poster_id)));
+ $this->sphinx->UpdateAttributes($this->indexes, array('forum_id', 'poster_id'), array((int) $post_id => array((int) $forum_id, (int) $poster_id)));
}
else if ($mode != 'post' && $post_id)
{
@@ -718,7 +718,7 @@ class fulltext_sphinx
$post_time = time();
while ($row = $this->db->sql_fetchrow($result))
{
- $post_updates[(int)$row['post_id']] = array($post_time);
+ $post_updates[(int) $row['post_id']] = array($post_time);
}
$this->db->sql_freeresult($result);
diff --git a/phpBB/phpbb/symfony_request.php b/phpBB/phpbb/symfony_request.php
index 62e155aa23..bf9ddec493 100644
--- a/phpBB/phpbb/symfony_request.php
+++ b/phpBB/phpbb/symfony_request.php
@@ -20,7 +20,7 @@ class symfony_request extends Request
/**
* Constructor
*
- * @param phpbb\request\request_interface $phpbb_request
+ * @param \phpbb\request\request_interface $phpbb_request
*/
public function __construct(\phpbb\request\request_interface $phpbb_request)
{
diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php
index 8df6c8b492..0a32879943 100644
--- a/phpBB/phpbb/template/context.php
+++ b/phpBB/phpbb/template/context.php
@@ -55,6 +55,7 @@ class context
*
* @param string $varname Variable name
* @param string $varval Value to assign to variable
+ * @return true
*/
public function assign_var($varname, $varval)
{
@@ -70,6 +71,7 @@ class context
*
* @param string $varname Variable name
* @param string $varval Value to append to variable
+ * @return true
*/
public function append_var($varname, $varval)
{
@@ -117,6 +119,7 @@ class context
*
* @param string $blockname Name of block to assign $vararray to
* @param array $vararray A hash of variable name => value pairs
+ * @return true
*/
public function assign_block_vars($blockname, array $vararray)
{
@@ -206,6 +209,7 @@ class context
*
* @param string $blockname Name of block to assign $block_vars_array to
* @param array $block_vars_array An array of hashes of variable name => value pairs
+ * @return true
*/
public function assign_block_vars_array($blockname, array $block_vars_array)
{
@@ -374,6 +378,7 @@ class context
* Reset/empty complete block
*
* @param string $blockname Name of block to destroy
+ * @return true
*/
public function destroy_block_vars($blockname)
{
diff --git a/phpBB/phpbb/template/template.php b/phpBB/phpbb/template/template.php
index 374f9e9359..041ecb12e4 100644
--- a/phpBB/phpbb/template/template.php
+++ b/phpBB/phpbb/template/template.php
@@ -175,6 +175,7 @@ interface template
/**
* Get path to template for handle (required for BBCode parser)
*
+ * @param string $handle Handle to retrieve the source file
* @return string
*/
public function get_source_file_for_handle($handle);
diff --git a/phpBB/phpbb/template/twig/environment.php b/phpBB/phpbb/template/twig/environment.php
index d71c02967c..8d25153e14 100644
--- a/phpBB/phpbb/template/twig/environment.php
+++ b/phpBB/phpbb/template/twig/environment.php
@@ -40,7 +40,7 @@ class environment extends \Twig_Environment
* @param \phpbb\path_helper
* @param \phpbb\extension\manager
* @param string $phpbb_root_path
- * @param Twig_LoaderInterface $loader
+ * @param \Twig_LoaderInterface $loader
* @param array $options Array of options to pass to Twig
*/
public function __construct($phpbb_config, \phpbb\path_helper $path_helper, \phpbb\extension\manager $extension_manager = null, \Twig_LoaderInterface $loader = null, $options = array())
@@ -122,7 +122,7 @@ class environment extends \Twig_Environment
* Set the namespace look up order to load templates from
*
* @param array $namespace
- * @return Twig_Environment
+ * @return \Twig_Environment
*/
public function setNamespaceLookUpOrder($namespace)
{
@@ -132,12 +132,13 @@ class environment extends \Twig_Environment
}
/**
- * Loads a template by name.
- *
- * @param string $name The template name
- * @param integer $index The index if it is an embedded template
- * @return Twig_TemplateInterface A template instance representing the given template name
- */
+ * Loads a template by name.
+ *
+ * @param string $name The template name
+ * @param integer $index The index if it is an embedded template
+ * @return \Twig_TemplateInterface A template instance representing the given template name
+ * @throws \Twig_Error_Loader
+ */
public function loadTemplate($name, $index = null)
{
if (strpos($name, '@') === false)
@@ -168,11 +169,12 @@ class environment extends \Twig_Environment
}
/**
- * Finds a template by name.
- *
- * @param string $name The template name
- * @return string
- */
+ * Finds a template by name.
+ *
+ * @param string $name The template name
+ * @return string
+ * @throws \Twig_Error_Loader
+ */
public function findTemplate($name)
{
if (strpos($name, '@') === false)
@@ -188,7 +190,7 @@ class environment extends \Twig_Environment
return parent::getLoader()->getCacheKey('@' . $namespace . '/' . $name);
}
- catch (Twig_Error_Loader $e)
+ catch (\Twig_Error_Loader $e)
{
}
}
diff --git a/phpBB/phpbb/template/twig/extension.php b/phpBB/phpbb/template/twig/extension.php
index a357db30a5..8f523684dd 100644
--- a/phpBB/phpbb/template/twig/extension.php
+++ b/phpBB/phpbb/template/twig/extension.php
@@ -127,7 +127,7 @@ class extension extends \Twig_Extension
/**
* Grabs a subset of a loop
*
- * @param Twig_Environment $env A Twig_Environment instance
+ * @param \Twig_Environment $env A Twig_Environment instance
* @param mixed $item A variable
* @param integer $start Start of the subset
* @param integer $end End of the subset
diff --git a/phpBB/phpbb/template/twig/lexer.php b/phpBB/phpbb/template/twig/lexer.php
index cceefda7ef..c5dc7273ba 100644
--- a/phpBB/phpbb/template/twig/lexer.php
+++ b/phpBB/phpbb/template/twig/lexer.php
@@ -285,7 +285,7 @@ class lexer extends \Twig_Lexer
return "<!-- {$matches[1]}IF{$inner}-->";
};
- return preg_replace_callback('#<!-- (ELSE)?IF((.*?) \(*!?[\$|\.]([^\s]+)(.*?))-->#', $callback, $code);
+ return preg_replace_callback('#<!-- (ELSE)?IF((.*?) (?:\(*!?[\$|\.]([^\s]+)(.*?))?)-->#', $callback, $code);
}
/**
diff --git a/phpBB/phpbb/template/twig/loader.php b/phpBB/phpbb/template/twig/loader.php
index 851eb9ddd0..2f8ffaa776 100644
--- a/phpBB/phpbb/template/twig/loader.php
+++ b/phpBB/phpbb/template/twig/loader.php
@@ -24,7 +24,7 @@ class loader extends \Twig_Loader_Filesystem
* Set safe directories
*
* @param array $directories Array of directories that are safe (empty to clear)
- * @return Twig_Loader_Filesystem
+ * @return \Twig_Loader_Filesystem
*/
public function setSafeDirectories($directories = array())
{
@@ -45,7 +45,7 @@ class loader extends \Twig_Loader_Filesystem
* Add safe directory
*
* @param string $directory Directory that should be added
- * @return Twig_Loader_Filesystem
+ * @return \Twig_Loader_Filesystem
*/
public function addSafeDirectory($directory)
{
@@ -110,7 +110,7 @@ class loader extends \Twig_Loader_Filesystem
// Try validating the name (which may throw an exception)
parent::validateName($name);
}
- catch (Twig_Error_Loader $e)
+ catch (\Twig_Error_Loader $e)
{
if (strpos($e->getRawMessage(), 'Looks like you try to load a template outside configured directories') === 0)
{
diff --git a/phpBB/phpbb/template/twig/node/definenode.php b/phpBB/phpbb/template/twig/node/definenode.php
index fe336d4129..695ec4281f 100644
--- a/phpBB/phpbb/template/twig/node/definenode.php
+++ b/phpBB/phpbb/template/twig/node/definenode.php
@@ -23,10 +23,10 @@ class definenode extends \Twig_Node
}
/**
- * Compiles the node to PHP.
- *
- * @param Twig_Compiler A Twig_Compiler instance
- */
+ * Compiles the node to PHP.
+ *
+ * @param \Twig_Compiler A Twig_Compiler instance
+ */
public function compile(\Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
diff --git a/phpBB/phpbb/template/twig/node/event.php b/phpBB/phpbb/template/twig/node/event.php
index b551d7a75e..8fc4ba4775 100644
--- a/phpBB/phpbb/template/twig/node/event.php
+++ b/phpBB/phpbb/template/twig/node/event.php
@@ -17,12 +17,12 @@ namespace phpbb\template\twig\node;
class event extends \Twig_Node
{
/**
- * The subdirectory in which all template listener files must be placed
- * @var string
- */
+ * The subdirectory in which all template listener files must be placed
+ * @var string
+ */
protected $listener_directory = 'event/';
- /** @var Twig_Environment */
+ /** @var \Twig_Environment */
protected $environment;
public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $lineno, $tag = null)
@@ -33,10 +33,10 @@ class event extends \Twig_Node
}
/**
- * Compiles the node to PHP.
- *
- * @param Twig_Compiler A Twig_Compiler instance
- */
+ * Compiles the node to PHP.
+ *
+ * @param \Twig_Compiler A Twig_Compiler instance
+ */
public function compile(\Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
diff --git a/phpBB/phpbb/template/twig/node/includeasset.php b/phpBB/phpbb/template/twig/node/includeasset.php
index c41d4d03f3..15195a226b 100644
--- a/phpBB/phpbb/template/twig/node/includeasset.php
+++ b/phpBB/phpbb/template/twig/node/includeasset.php
@@ -15,7 +15,7 @@ namespace phpbb\template\twig\node;
abstract class includeasset extends \Twig_Node
{
- /** @var Twig_Environment */
+ /** @var \Twig_Environment */
protected $environment;
public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $lineno, $tag = null)
@@ -25,10 +25,10 @@ abstract class includeasset extends \Twig_Node
parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
}
/**
- * Compiles the node to PHP.
- *
- * @param Twig_Compiler A Twig_Compiler instance
- */
+ * Compiles the node to PHP.
+ *
+ * @param \Twig_Compiler A Twig_Compiler instance
+ */
public function compile(\Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
@@ -74,7 +74,7 @@ abstract class includeasset extends \Twig_Node
/**
* Append the output code for the asset
*
- * @param Twig_Compiler A Twig_Compiler instance
+ * @param \Twig_Compiler A Twig_Compiler instance
* @return null
*/
abstract protected function append_asset(\Twig_Compiler $compiler);
diff --git a/phpBB/phpbb/template/twig/node/includenode.php b/phpBB/phpbb/template/twig/node/includenode.php
index 141c9ffe66..42428b6106 100644
--- a/phpBB/phpbb/template/twig/node/includenode.php
+++ b/phpBB/phpbb/template/twig/node/includenode.php
@@ -17,10 +17,10 @@ namespace phpbb\template\twig\node;
class includenode extends \Twig_Node_Include
{
/**
- * Compiles the node to PHP.
- *
- * @param Twig_Compiler A Twig_Compiler instance
- */
+ * Compiles the node to PHP.
+ *
+ * @param \Twig_Compiler A Twig_Compiler instance
+ */
public function compile(\Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
diff --git a/phpBB/phpbb/template/twig/node/includephp.php b/phpBB/phpbb/template/twig/node/includephp.php
index e7df11c74e..826617e8e8 100644
--- a/phpBB/phpbb/template/twig/node/includephp.php
+++ b/phpBB/phpbb/template/twig/node/includephp.php
@@ -17,7 +17,7 @@ namespace phpbb\template\twig\node;
class includephp extends \Twig_Node
{
- /** @var Twig_Environment */
+ /** @var \Twig_Environment */
protected $environment;
public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $lineno, $ignoreMissing = false, $tag = null)
@@ -28,10 +28,10 @@ class includephp extends \Twig_Node
}
/**
- * Compiles the node to PHP.
- *
- * @param Twig_Compiler A Twig_Compiler instance
- */
+ * Compiles the node to PHP.
+ *
+ * @param \Twig_Compiler A Twig_Compiler instance
+ */
public function compile(\Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
diff --git a/phpBB/phpbb/template/twig/node/php.php b/phpBB/phpbb/template/twig/node/php.php
index de3a8a4af1..3a24513dca 100644
--- a/phpBB/phpbb/template/twig/node/php.php
+++ b/phpBB/phpbb/template/twig/node/php.php
@@ -16,7 +16,7 @@ namespace phpbb\template\twig\node;
class php extends \Twig_Node
{
- /** @var Twig_Environment */
+ /** @var \Twig_Environment */
protected $environment;
public function __construct(\Twig_Node_Text $text, \phpbb\template\twig\environment $environment, $lineno, $tag = null)
@@ -27,10 +27,10 @@ class php extends \Twig_Node
}
/**
- * Compiles the node to PHP.
- *
- * @param Twig_Compiler A Twig_Compiler instance
- */
+ * Compiles the node to PHP.
+ *
+ * @param \Twig_Compiler A Twig_Compiler instance
+ */
public function compile(\Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
diff --git a/phpBB/phpbb/template/twig/tokenparser/defineparser.php b/phpBB/phpbb/template/twig/tokenparser/defineparser.php
index 48c4853fe8..cfee84a363 100644
--- a/phpBB/phpbb/template/twig/tokenparser/defineparser.php
+++ b/phpBB/phpbb/template/twig/tokenparser/defineparser.php
@@ -18,12 +18,14 @@ namespace phpbb\template\twig\tokenparser;
class defineparser extends \Twig_TokenParser
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ * @throws \Twig_Error_Syntax
+ * @throws \phpbb\template\twig\node\definenode
+ */
public function parse(\Twig_Token $token)
{
$lineno = $token->getLine();
@@ -61,10 +63,10 @@ class defineparser extends \Twig_TokenParser
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'DEFINE';
diff --git a/phpBB/phpbb/template/twig/tokenparser/event.php b/phpBB/phpbb/template/twig/tokenparser/event.php
index 05b963f3e8..4c7c8e07d9 100644
--- a/phpBB/phpbb/template/twig/tokenparser/event.php
+++ b/phpBB/phpbb/template/twig/tokenparser/event.php
@@ -17,12 +17,12 @@ namespace phpbb\template\twig\tokenparser;
class event extends \Twig_TokenParser
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ */
public function parse(\Twig_Token $token)
{
$expr = $this->parser->getExpressionParser()->parseExpression();
@@ -34,10 +34,10 @@ class event extends \Twig_TokenParser
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'EVENT';
diff --git a/phpBB/phpbb/template/twig/tokenparser/includecss.php b/phpBB/phpbb/template/twig/tokenparser/includecss.php
index c7d2bb712e..1f30811754 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includecss.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includecss.php
@@ -16,12 +16,12 @@ namespace phpbb\template\twig\tokenparser;
class includecss extends \Twig_TokenParser
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ */
public function parse(\Twig_Token $token)
{
$expr = $this->parser->getExpressionParser()->parseExpression();
@@ -33,10 +33,10 @@ class includecss extends \Twig_TokenParser
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'INCLUDECSS';
diff --git a/phpBB/phpbb/template/twig/tokenparser/includejs.php b/phpBB/phpbb/template/twig/tokenparser/includejs.php
index 0c32692209..4156048e42 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includejs.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includejs.php
@@ -17,12 +17,12 @@ namespace phpbb\template\twig\tokenparser;
class includejs extends \Twig_TokenParser
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ */
public function parse(\Twig_Token $token)
{
$expr = $this->parser->getExpressionParser()->parseExpression();
@@ -34,10 +34,10 @@ class includejs extends \Twig_TokenParser
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'INCLUDEJS';
diff --git a/phpBB/phpbb/template/twig/tokenparser/includeparser.php b/phpBB/phpbb/template/twig/tokenparser/includeparser.php
index e9f4db0890..6ee78e5562 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includeparser.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includeparser.php
@@ -18,12 +18,12 @@ namespace phpbb\template\twig\tokenparser;
class includeparser extends \Twig_TokenParser_Include
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ */
public function parse(\Twig_Token $token)
{
$expr = $this->parser->getExpressionParser()->parseExpression();
@@ -34,10 +34,10 @@ class includeparser extends \Twig_TokenParser_Include
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'INCLUDE';
diff --git a/phpBB/phpbb/template/twig/tokenparser/includephp.php b/phpBB/phpbb/template/twig/tokenparser/includephp.php
index f745c320c2..38196c5290 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includephp.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includephp.php
@@ -18,12 +18,12 @@ namespace phpbb\template\twig\tokenparser;
class includephp extends \Twig_TokenParser
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ */
public function parse(\Twig_Token $token)
{
$expr = $this->parser->getExpressionParser()->parseExpression();
@@ -44,10 +44,10 @@ class includephp extends \Twig_TokenParser
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'INCLUDEPHP';
diff --git a/phpBB/phpbb/template/twig/tokenparser/php.php b/phpBB/phpbb/template/twig/tokenparser/php.php
index 0546a2d93f..557a70cca1 100644
--- a/phpBB/phpbb/template/twig/tokenparser/php.php
+++ b/phpBB/phpbb/template/twig/tokenparser/php.php
@@ -17,12 +17,12 @@ namespace phpbb\template\twig\tokenparser;
class php extends \Twig_TokenParser
{
/**
- * Parses a token and returns a node.
- *
- * @param Twig_Token $token A Twig_Token instance
- *
- * @return Twig_NodeInterface A Twig_NodeInterface instance
- */
+ * Parses a token and returns a node.
+ *
+ * @param \Twig_Token $token A Twig_Token instance
+ *
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
+ */
public function parse(\Twig_Token $token)
{
$stream = $this->parser->getStream();
@@ -42,10 +42,10 @@ class php extends \Twig_TokenParser
}
/**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
+ * Gets the tag name associated with this token parser.
+ *
+ * @return string The tag name
+ */
public function getTag()
{
return 'PHP';
diff --git a/phpBB/phpbb/template/twig/twig.php b/phpBB/phpbb/template/twig/twig.php
index bf27dd5f20..5e2057f818 100644
--- a/phpBB/phpbb/template/twig/twig.php
+++ b/phpBB/phpbb/template/twig/twig.php
@@ -67,7 +67,7 @@ class twig extends \phpbb\template\base
/**
* Twig Environment
*
- * @var Twig_Environment
+ * @var \Twig_Environment
*/
protected $twig;
@@ -347,9 +347,7 @@ class twig extends \phpbb\template\base
}
/**
- * Get path to template for handle (required for BBCode parser)
- *
- * @return string
+ * {@inheritdoc}
*/
public function get_source_file_for_handle($handle)
{
diff --git a/phpBB/phpbb/tree/nestedset.php b/phpBB/phpbb/tree/nestedset.php
index 7a26c81b0e..57d109652e 100644
--- a/phpBB/phpbb/tree/nestedset.php
+++ b/phpBB/phpbb/tree/nestedset.php
@@ -103,7 +103,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
*
* @return bool True if the lock was acquired, false if it has been acquired previously
*
- * @throws RuntimeException If the lock could not be acquired
+ * @throws \RuntimeException If the lock could not be acquired
*/
protected function acquire_lock()
{
@@ -121,7 +121,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function insert(array $additional_data)
{
@@ -176,6 +176,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
*
* @param int $item_id The item to be deleted
* @return array Item ids that have been removed
+ * @throws \OutOfBoundsException
*/
protected function remove_item_from_nestedset($item_id)
{
@@ -199,7 +200,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function delete($item_id)
{
@@ -214,7 +215,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function move($item_id, $delta)
{
@@ -332,7 +333,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function move_down($item_id)
{
@@ -340,7 +341,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function move_up($item_id)
{
@@ -348,7 +349,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function move_children($current_parent_id, $new_parent_id)
{
@@ -454,7 +455,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function change_parent($item_id, $new_parent_id)
{
@@ -553,7 +554,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_path_and_subtree_data($item_id, $order_asc = true, $include_item = true)
{
@@ -564,7 +565,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_path_data($item_id, $order_asc = true, $include_item = true)
{
@@ -574,7 +575,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
}
/**
- * @inheritdoc
+ * {@inheritdoc}
*/
public function get_subtree_data($item_id, $order_asc = true, $include_item = true)
{
diff --git a/phpBB/phpbb/viewonline_helper.php b/phpBB/phpbb/viewonline_helper.php
new file mode 100644
index 0000000000..3fc33119a3
--- /dev/null
+++ b/phpBB/phpbb/viewonline_helper.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb;
+
+/**
+* Class to handle viewonline related tasks
+*/
+class viewonline_helper
+{
+ /**
+ * Get user page
+ *
+ * @param string $session_page User's session page
+ * @return array Match array filled by preg_match()
+ */
+ public function get_user_page($session_page)
+ {
+ preg_match('#^([./\\]*+[a-z0-9/_-]+)#i', $session_page, $on_page);
+ if (empty($on_page))
+ {
+ $on_page[1] = '';
+ }
+
+ return $on_page;
+ }
+}
diff --git a/phpBB/posting.php b/phpBB/posting.php
index 60bb595da6..70df052099 100644
--- a/phpBB/posting.php
+++ b/phpBB/posting.php
@@ -195,7 +195,7 @@ switch ($mode)
}
else
{
- upload_popup();
+ phpbb_upload_popup();
return;
}
break;
@@ -233,7 +233,7 @@ if ($auth->acl_get('m_approve', $forum_id) && ((($mode == 'reply' || $mode == 'b
if ($mode == 'popup')
{
- upload_popup($post_data['forum_style']);
+ phpbb_upload_popup($post_data['forum_style']);
return;
}
@@ -439,7 +439,7 @@ if ($mode == 'delete' || $mode == 'soft_delete')
$allow_reason = $auth->acl_get('m_softdelete', $forum_id) || ($auth->acl_gets('m_delete', 'f_delete', $forum_id) && $auth->acl_gets('m_softdelete', 'f_softdelete', $forum_id));
$soft_delete_reason = ($mode == 'soft_delete' && $allow_reason) ? $request->variable('delete_reason', '', true) : '';
- handle_post_delete($forum_id, $topic_id, $post_id, $post_data, ($mode == 'soft_delete'), $soft_delete_reason);
+ phpbb_handle_post_delete($forum_id, $topic_id, $post_id, $post_data, ($mode == 'soft_delete'), $soft_delete_reason);
return;
}
@@ -1028,6 +1028,14 @@ if ($submit || $preview || $refresh)
$error[] = $user->lang['EMPTY_SUBJECT'];
}
+ // Check for out-of-bounds characters that are currently
+ // not supported by utf8_bin in MySQL
+ if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $post_data['post_subject'], $matches))
+ {
+ $character_list = implode('<br />', $matches[0]);
+ $error[] = $user->lang('UNSUPPORTED_CHARACTERS_SUBJECT', $character_list);
+ }
+
$post_data['poll_last_vote'] = (isset($post_data['poll_last_vote'])) ? $post_data['poll_last_vote'] : 0;
if ($post_data['poll_option_text'] &&
@@ -1251,7 +1259,7 @@ if ($submit || $preview || $refresh)
{
$allow_reason = $auth->acl_get('m_softdelete', $forum_id) || ($auth->acl_gets('m_delete', 'f_delete', $forum_id) && $auth->acl_gets('m_softdelete', 'f_softdelete', $forum_id));
$soft_delete_reason = (!$request->is_set_post('delete_permanent') && $allow_reason) ? $request->variable('delete_reason', '', true) : '';
- handle_post_delete($forum_id, $topic_id, $post_id, $post_data, !$request->is_set_post('delete_permanent'), $soft_delete_reason);
+ phpbb_handle_post_delete($forum_id, $topic_id, $post_id, $post_data, !$request->is_set_post('delete_permanent'), $soft_delete_reason);
return;
}
@@ -1714,137 +1722,3 @@ if ($mode == 'reply' || $mode == 'quote')
}
page_footer();
-
-/**
-* Show upload popup (progress bar)
-*/
-function upload_popup($forum_style = 0)
-{
- global $template, $user;
-
- ($forum_style) ? $user->setup('posting', $forum_style) : $user->setup('posting');
-
- page_header($user->lang['PROGRESS_BAR']);
-
- $template->set_filenames(array(
- 'popup' => 'posting_progress_bar.html')
- );
-
- $template->assign_vars(array(
- 'PROGRESS_BAR' => $user->img('upload_bar', $user->lang['UPLOAD_IN_PROGRESS']))
- );
-
- $template->display('popup');
-
- garbage_collection();
- exit_handler();
-}
-
-/**
-* Do the various checks required for removing posts as well as removing it
-*/
-function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft = false, $soft_delete_reason = '')
-{
- global $user, $db, $auth, $config, $request;
- global $phpbb_root_path, $phpEx;
-
- $perm_check = ($is_soft) ? 'softdelete' : 'delete';
-
- // If moderator removing post or user itself removing post, present a confirmation screen
- if ($auth->acl_get("m_$perm_check", $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get("f_$perm_check", $forum_id) && $post_id == $post_data['topic_last_post_id'] && !$post_data['post_edit_locked'] && ($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])))
- {
- $s_hidden_fields = array(
- 'p' => $post_id,
- 'f' => $forum_id,
- 'mode' => ($is_soft) ? 'soft_delete' : 'delete',
- );
-
- if (confirm_box(true))
- {
- $data = array(
- 'topic_first_post_id' => $post_data['topic_first_post_id'],
- 'topic_last_post_id' => $post_data['topic_last_post_id'],
- 'topic_posts_approved' => $post_data['topic_posts_approved'],
- 'topic_posts_unapproved' => $post_data['topic_posts_unapproved'],
- 'topic_posts_softdeleted' => $post_data['topic_posts_softdeleted'],
- 'topic_visibility' => $post_data['topic_visibility'],
- 'topic_type' => $post_data['topic_type'],
- 'post_visibility' => $post_data['post_visibility'],
- 'post_reported' => $post_data['post_reported'],
- 'post_time' => $post_data['post_time'],
- 'poster_id' => $post_data['poster_id'],
- 'post_postcount' => $post_data['post_postcount'],
- );
-
- $next_post_id = delete_post($forum_id, $topic_id, $post_id, $data, $is_soft, $soft_delete_reason);
- $post_username = ($post_data['poster_id'] == ANONYMOUS && !empty($post_data['post_username'])) ? $post_data['post_username'] : $post_data['username'];
-
- if ($next_post_id === false)
- {
- add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), $post_data['topic_title'], $post_username, $soft_delete_reason);
-
- $meta_info = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id");
- $message = $user->lang['POST_DELETED'];
- }
- else
- {
- add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), $post_data['post_subject'], $post_username, $soft_delete_reason);
-
- $meta_info = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p=$next_post_id") . "#p$next_post_id";
- $message = $user->lang['POST_DELETED'];
-
- if (!$request->is_ajax())
- {
- $message .= '<br /><br />' . $user->lang('RETURN_TOPIC', '<a href="' . $meta_info . '">', '</a>');
- }
- }
-
- meta_refresh(3, $meta_info);
- if (!$request->is_ajax())
- {
- $message .= '<br /><br />' . $user->lang('RETURN_FORUM', '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
- }
- trigger_error($message);
- }
- else
- {
- global $user, $template, $request;
-
- $can_delete = $auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id));
- $can_softdelete = $auth->acl_get('m_softdelete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_softdelete', $forum_id));
-
- $template->assign_vars(array(
- 'S_SOFTDELETED' => $post_data['post_visibility'] == ITEM_DELETED,
- 'S_CHECKED_PERMANENT' => $request->is_set_post('delete_permanent') ? ' checked="checked"' : '',
- 'S_ALLOWED_DELETE' => $can_delete,
- 'S_ALLOWED_SOFTDELETE' => $can_softdelete,
- ));
-
- $l_confirm = 'DELETE_POST';
- if ($post_data['post_visibility'] == ITEM_DELETED)
- {
- $l_confirm .= '_PERMANENTLY';
- $s_hidden_fields['delete_permanent'] = '1';
- }
- else if (!$can_softdelete)
- {
- $s_hidden_fields['delete_permanent'] = '1';
- }
-
- confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html');
- }
- }
-
- // If we are here the user is not able to delete - present the correct error message
- if ($post_data['poster_id'] != $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id))
- {
- trigger_error('DELETE_OWN_POSTS');
- }
-
- if ($post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id) && $post_id != $post_data['topic_last_post_id'])
- {
- trigger_error('CANNOT_DELETE_REPLIED');
- }
-
- trigger_error('USER_CANNOT_DELETE');
-}
diff --git a/phpBB/search.php b/phpBB/search.php
index 91ea21909d..071db30f3d 100644
--- a/phpBB/search.php
+++ b/phpBB/search.php
@@ -145,7 +145,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
trigger_error($user->lang('TOO_FEW_AUTHOR_CHARS', (int) $config['min_search_author_chars']));
}
- $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
+ $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
$sql = 'SELECT user_id
FROM ' . USERS_TABLE . "
@@ -159,7 +159,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
}
$db->sql_freeresult($result);
- $sql_where = (strpos($author, '*') !== false) ? ' post_username ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " post_username = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
+ $sql_where = (strpos($author, '*') !== false) ? ' post_username ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " post_username = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
$sql = 'SELECT 1 as guest_post
FROM ' . POSTS_TABLE . "
@@ -172,7 +172,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
if ($found_guest_post)
{
$author_id_ary[] = ANONYMOUS;
- $sql_author_match = (strpos($author, '*') !== false) ? ' ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
+ $sql_author_match = (strpos($author, '*') !== false) ? ' ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
}
if (!sizeof($author_id_ary))
@@ -923,16 +923,19 @@ if ($keywords || $author || $author_id || $search_id || $submit)
* @var array attachments Array with posts attachments data
* @var string hilit String to highlight
* @var array rowset Array with the search results data
+ * @var string show_results String indicating the show results mode
* @var array topic_tracking_info Array with the topics tracking data
* @var string u_hilit Highlight string to be injected into URL
* @var string view Search results view mode
* @var array zebra Array with zebra data for the current user
* @since 3.1.0-b4
+ * @changed 3.1.0-b5 Added var show_results
*/
$vars = array(
'attachments',
'hilit',
'rowset',
+ 'show_results',
'topic_tracking_info',
'u_hilit',
'view',
@@ -1256,7 +1259,7 @@ $s_characters .= '<option value="0">0</option>';
$s_characters .= '<option value="25">25</option>';
$s_characters .= '<option value="50">50</option>';
-for ($i = 100; $i <= 1000 ; $i += 100)
+for ($i = 100; $i <= 1000; $i += 100)
{
$selected = ($i == 300) ? ' selected="selected"' : '';
$s_characters .= '<option value="' . $i . '"' . $selected . '>' . $i . '</option>';
@@ -1293,7 +1296,7 @@ $template->assign_vars(array(
if ($auth->acl_get('a_search'))
{
// Handle large objects differently for Oracle and MSSQL
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'oracle':
$sql = 'SELECT search_time, search_keywords
diff --git a/phpBB/styles/prosilver/style.cfg b/phpBB/styles/prosilver/style.cfg
index f3dd72cb52..b75207bd70 100644
--- a/phpBB/styles/prosilver/style.cfg
+++ b/phpBB/styles/prosilver/style.cfg
@@ -21,8 +21,8 @@
# General Information about this style
name = prosilver
copyright = © phpBB Limited, 2007
-style_version = 3.1.0-b4
-phpbb_version = 3.1.0-b4
+style_version = 3.1.0-RC1
+phpbb_version = 3.1.0-RC1
# Defining a different template bitfield
# template_bitfield = lNg=
diff --git a/phpBB/styles/prosilver/template/ajax.js b/phpBB/styles/prosilver/template/ajax.js
index e9f8064b9e..70bc703582 100644
--- a/phpBB/styles/prosilver/template/ajax.js
+++ b/phpBB/styles/prosilver/template/ajax.js
@@ -356,37 +356,6 @@ $('.display_post').click(function(e) {
$('#post_hidden' + post_id).hide();
});
-
-
-/**
- * This AJAXifies the quick-mod tools. The reason it cannot be a standard
- * callback / data attribute is that it requires filtering - some of the options
- * can be ajaxified, while others cannot.
- */
-phpbb.ajaxify({
- selector: '#quickmodform',
- refresh: true,
- filter: function (data) {
- var action = $('#quick-mod-select').val();
-
- if (action === 'make_normal') {
- return $(this).find('select option[value="make_global"]').length > 0;
- } else if (action === 'lock' || action === 'unlock') {
- return true;
- }
-
- if (action === 'delete_topic' || action === 'make_sticky' || action === 'make_announce' || action === 'make_global') {
- return true;
- }
-
- return false;
- }
-});
-
-$('#quick-mod-select').change(function () {
- $('#quickmodform').submit();
-});
-
$('#delete_permanent').click(function () {
if ($(this).prop('checked')) {
$('#delete_reason').hide();
diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js
index 3d42439c1d..4929e14ef7 100644
--- a/phpBB/styles/prosilver/template/forum_fn.js
+++ b/phpBB/styles/prosilver/template/forum_fn.js
@@ -378,47 +378,11 @@ function parse_document(container)
});
/**
- * Dropdowns
- */
- container.find('.dropdown-container').each(function() {
- var $this = $(this),
- trigger = $this.find('.dropdown-trigger:first'),
- contents = $this.find('.dropdown'),
- options = {
- direction: 'auto',
- verticalDirection: 'auto'
- },
- data;
-
- if (!trigger.length) {
- data = $this.attr('data-dropdown-trigger');
- trigger = data ? $this.children(data) : $this.children('a:first');
- }
-
- if (!contents.length) {
- data = $this.attr('data-dropdown-contents');
- contents = data ? $this.children(data) : $this.children('div:first');
- }
-
- if (!trigger.length || !contents.length) return;
-
- if ($this.hasClass('dropdown-up')) options.verticalDirection = 'up';
- if ($this.hasClass('dropdown-down')) options.verticalDirection = 'down';
- if ($this.hasClass('dropdown-left')) options.direction = 'left';
- if ($this.hasClass('dropdown-right')) options.direction = 'right';
-
- phpbb.registerDropdown(trigger, contents, options);
- });
-
- /**
* Adjust HTML code for IE8 and older versions
*/
if (oldBrowser) {
// Fix .linklist.bulletin lists
- container.find('ul.linklist.bulletin li:first-child, ul.linklist.bulletin li.rightside:last-child').addClass('no-bulletin');
-
- // Do not run functions below for old browsers
- return;
+ container.find('ul.linklist.bulletin > li:first-child, ul.linklist.bulletin > li.rightside:last-child').addClass('no-bulletin');
}
/**
@@ -516,6 +480,167 @@ function parse_document(container)
});
/**
+ * Responsive link lists
+ */
+ container.find('.linklist:not(.navlinks, [data-skip-responsive]), .postbody .post-buttons:not([data-skip-responsive])').each(function() {
+ var $this = $(this),
+ $body = $('body'),
+ filterSkip = '.breadcrumbs, [data-skip-responsive]',
+ filterLast = '.edit-icon, .quote-icon, [data-last-responsive]',
+ persist = $this.attr('id') == 'nav-main',
+ allLinks = $this.children(),
+ links = allLinks.not(filterSkip),
+ html = '<li class="responsive-menu" style="display:none;"><a href="javascript:void(0);" class="responsive-menu-link">&nbsp;</a><div class="dropdown" style="display:none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>',
+ filterLastList = links.filter(filterLast),
+ slack = 1; // Vertical slack space (in pixels). Determines how sensitive the script is in determining whether a line-break has occured.
+
+ if (!persist) {
+ if (links.is('.rightside'))
+ {
+ links.filter('.rightside:first').before(html);
+ $this.children('.responsive-menu').addClass('rightside');
+ }
+ else
+ {
+ $this.append(html);
+ }
+ }
+
+ var item = $this.children('.responsive-menu'),
+ menu = item.find('.dropdown-contents'),
+ lastWidth = false,
+ compact = false,
+ responsive = false,
+ copied = false;
+
+ function check() {
+ var width = $body.width();
+ if (responsive && width <= lastWidth) {
+ return;
+ }
+
+ // Unhide the quick-links menu if it has content
+ if (persist) {
+ item.addClass('hidden');
+ if (menu.find('li:not(.separator, .clone)').length || (responsive && menu.find('li.clone').length)) {
+ item.removeClass('hidden');
+ }
+ }
+
+ // Reset responsive and compact layout
+ if (responsive) {
+ responsive = false;
+ $this.removeClass('responsive');
+ links.css('display', '');
+ if (!persist) item.css('display', 'none');
+ }
+
+ if (compact) {
+ compact = false;
+ $this.removeClass('compact');
+ }
+
+ // Find tallest element
+ var maxHeight = 0;
+ allLinks.each(function() {
+ if (!$(this).height()) return;
+ maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
+ });
+
+ if (maxHeight < 1) {
+ return;
+ }
+
+ // Nothing to resize if block's height is not bigger than tallest element's height
+ if ($this.height() <= (maxHeight + slack)) {
+ return;
+ }
+
+ // Enable compact layout, find tallest element, compare to height of whole block
+ compact = true;
+ $this.addClass('compact');
+
+ var compactMaxHeight = 0;
+ allLinks.each(function() {
+ if (!$(this).height()) return;
+ compactMaxHeight = Math.max(compactMaxHeight, $(this).outerHeight(true));
+ });
+
+ if ($this.height() <= (maxHeight + slack)) {
+ return;
+ }
+
+ // Compact layout did not resize block enough, switch to responsive layout
+ compact = false;
+ $this.removeClass('compact');
+ responsive = true;
+
+ if (!copied) {
+ var clone = links.clone(true);
+ clone.filter('.rightside').each(function() {
+ if (persist) $(this).addClass('clone');
+ menu.prepend(this);
+ });
+
+ if (persist) {
+ menu.prepend(clone.not('.rightside').addClass('clone'));
+ } else {
+ menu.prepend(clone.not('.rightside'));
+ }
+
+ menu.find('li.leftside, li.rightside').removeClass('leftside rightside');
+ menu.find('.inputbox').parents('li:first').css('white-space', 'normal');
+
+ if ($this.hasClass('post-buttons')) {
+ $('.button', menu).removeClass('button icon-button');
+ $('.responsive-menu-link', item).addClass('button icon-button').prepend('<span></span>');
+ }
+ copied = true;
+ }
+ else {
+ menu.children().css('display', '');
+ }
+
+ item.css('display', '');
+ $this.addClass('responsive');
+
+ // Try to not hide filtered items
+ if (filterLastList.length) {
+ links.not(filterLast).css('display', 'none');
+
+ maxHeight = 0;
+ filterLastList.each(function() {
+ if (!$(this).height()) return;
+ maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
+ });
+
+ if ($this.height() <= (maxHeight + slack)) {
+ menu.children().filter(filterLast).css('display', 'none');
+ return;
+ }
+ }
+
+ // If even responsive isn't enough, use both responsive and compact at same time
+ compact = true;
+ $this.addClass('compact');
+
+ links.css('display', 'none');
+ }
+
+ if (!persist) phpbb.registerDropdown(item.find('a.responsive-menu-link'), item.find('.dropdown'));
+
+ check();
+ $(window).resize(check);
+ });
+
+ /**
+ * Do not run functions below for old browsers
+ */
+ if (oldBrowser) {
+ return;
+ }
+
+ /**
* Adjust topiclist lists with check boxes
*/
container.find('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark');
@@ -700,136 +825,6 @@ function parse_document(container)
});
/**
- * Responsive link lists
- */
- container.find('.linklist:not(.navlinks, [data-skip-responsive]), .postbody .post-buttons:not([data-skip-responsive])').each(function() {
- var $this = $(this),
- $body = $('body'),
- filterSkip = '.breadcrumbs, [data-skip-responsive]',
- filterLast = '.pagination, .icon-notifications, .icon-pm, .icon-logout, .icon-login, .mark-read, .edit-icon, .quote-icon',
- allLinks = $this.children(),
- links = allLinks.not(filterSkip),
- html = '<li class="responsive-menu" style="display:none;"><a href="javascript:void(0);" class="responsive-menu-link">&nbsp;</a><div class="dropdown" style="display:none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>',
- filterLastList = links.filter(filterLast);
-
- if (links.is('.rightside'))
- {
- links.filter('.rightside:first').before(html);
- }
- else
- {
- $this.append(html);
- }
-
- var item = $this.children('.responsive-menu'),
- menu = item.find('.dropdown-contents'),
- lastWidth = false,
- compact = false,
- responsive = false,
- copied = false;
-
- function check() {
- var width = $body.width();
- if (responsive && width <= lastWidth) {
- return;
- }
-
- // Reset responsive and compact layout
- if (responsive) {
- responsive = false;
- $this.removeClass('responsive');
- links.css('display', '');
- item.css('display', 'none');
- }
-
- if (compact) {
- compact = false;
- $this.removeClass('compact');
- }
-
- // Find tallest element
- var maxHeight = 0;
- allLinks.each(function() {
- if (!$(this).height()) return;
- maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
- });
-
- if (maxHeight < 1) {
- return;
- }
-
- // Nothing to resize if block's height is not bigger than tallest element's height
- if ($this.height() <= maxHeight) {
- return;
- }
-
- // Enable compact layout, find tallest element, compare to height of whole block
- compact = true;
- $this.addClass('compact');
-
- var compactMaxHeight = 0;
- allLinks.each(function() {
- if (!$(this).height()) return;
- compactMaxHeight = Math.max(compactMaxHeight, $(this).outerHeight(true));
- });
-
- if ($this.height() <= maxHeight) {
- return;
- }
-
- // Compact layout did not resize block enough, switch to responsive layout
- compact = false;
- $this.removeClass('compact');
- responsive = true;
-
- if (!copied) {
- var clone = links.clone(true);
- clone.filter('.rightside').each(function() {
- menu.prepend(this);
- });
- menu.prepend(clone.not('.rightside'));
- menu.find('li.leftside, li.rightside').removeClass('leftside rightside');
- menu.find('.inputbox').parents('li:first').css('white-space', 'normal');
-
- if ($this.hasClass('post-buttons')) {
- $('.button', menu).removeClass('button icon-button');
- $('.responsive-menu-link', item).addClass('button icon-button').prepend('<span></span>');
- }
- copied = true;
- }
- else {
- menu.children().css('display', '');
- }
-
- item.css('display', '');
- $this.addClass('responsive');
-
- // Try to not hide filtered items
- if (filterLastList.length) {
- links.not(filterLast).css('display', 'none');
-
- maxHeight = 0;
- filterLastList.each(function() {
- if (!$(this).height()) return;
- maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
- });
-
- if ($this.height() <= maxHeight) {
- menu.children().filter(filterLast).css('display', 'none');
- return;
- }
- }
-
- links.css('display', 'none');
- }
-
- phpbb.registerDropdown(item.find('a.responsive-menu-link'), item.find('.dropdown'));
-
- check();
- $(window).resize(check);
- });
-
- /**
* Responsive tabs
*/
container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() {
@@ -838,7 +833,7 @@ function parse_document(container)
ul = $this.children(),
tabs = ul.children().not('[data-skip-responsive]'),
links = tabs.children('a'),
- item = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span>&nbsp;</span></a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
+ item = ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
menu = item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
@@ -880,7 +875,7 @@ function parse_document(container)
for (i = total - 1; i >= 0; i --) {
tab = availableTabs.eq(i);
- menu.prepend(tab.clone(true));
+ menu.prepend(tab.clone(true).removeClass('tab'));
tab.hide();
if ($this.height() <= maxHeight) {
menu.find('a').click(function() { check(true); });
diff --git a/phpBB/styles/prosilver/template/index_body.html b/phpBB/styles/prosilver/template/index_body.html
index f9c5b4cf20..1e1eb22c6f 100644
--- a/phpBB/styles/prosilver/template/index_body.html
+++ b/phpBB/styles/prosilver/template/index_body.html
@@ -1,27 +1,15 @@
<!-- INCLUDE overall_header.html -->
-<p class="{S_CONTENT_FLOW_END} responsive-center<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
-<!-- IF S_USER_LOGGED_IN --><p class="responsive-center">{CURRENT_TIME}<!-- IF U_MCP or U_ACP --> <br />[&nbsp;<!-- IF U_ACP --><a href="{U_ACP}" title="{L_ACP}" data-responsive-text="{L_ACP_SHORT}">{L_ACP}</a><!-- IF U_MCP -->&nbsp;|&nbsp;<!-- ENDIF --><!-- ENDIF --><!-- IF U_MCP --><a href="{U_MCP}" title="{L_MCP}" data-responsive-text="{L_MCP_SHORT}">{L_MCP}</a><!-- ENDIF -->&nbsp;]<!-- ENDIF --></p><!-- ENDIF -->
+<p class="{S_CONTENT_FLOW_END} responsive-center time<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
+<!-- IF S_USER_LOGGED_IN --><p class="responsive-center time">{CURRENT_TIME}</p><!-- ENDIF -->
-<!-- EVENT index_body_linklist_before -->
-
-<!-- IF S_DISPLAY_SEARCH or (S_USER_LOGGED_IN and not S_IS_BOT) -->
-<ul class="linklist bulletin">
- <!-- IF S_DISPLAY_SEARCH -->
- <li><a href="{U_SEARCH_UNANSWERED}">{L_SEARCH_UNANSWERED}</a></li>
- <!-- IF S_LOAD_UNREADS -->
- <li><a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a></li>
- <!-- ENDIF -->
- <!-- IF S_USER_LOGGED_IN -->
- <li><a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a></li>
- <!-- ENDIF -->
- <li><a href="{U_SEARCH_ACTIVE_TOPICS}">{L_SEARCH_ACTIVE_TOPICS}</a></li>
- <!-- ENDIF -->
- <!-- IF not S_IS_BOT and U_MARK_FORUMS --><li class="rightside mark-read"><a href="{U_MARK_FORUMS}" accesskey="m" data-ajax="mark_forums_read">{L_MARK_FORUMS_READ}</a></li><!-- ENDIF -->
-</ul>
+<!-- EVENT index_body_markforums_before -->
+<!-- IF U_MARK_FORUMS -->
+ <div class="action-bar compact">
+ <a href="{U_MARK_FORUMS}" class="mark-read rightside" accesskey="m" data-ajax="mark_forums_read">{L_MARK_FORUMS_READ}</a>
+ </div>
<!-- ENDIF -->
-
-<!-- EVENT index_body_linklist_after -->
+<!-- EVENT index_body_markforums_after -->
<!-- INCLUDE forumlist_body.html -->
diff --git a/phpBB/styles/prosilver/template/jumpbox.html b/phpBB/styles/prosilver/template/jumpbox.html
index 47d322407d..44b479ab3f 100644
--- a/phpBB/styles/prosilver/template/jumpbox.html
+++ b/phpBB/styles/prosilver/template/jumpbox.html
@@ -10,24 +10,22 @@
<!-- ENDIF -->
<!-- IF S_DISPLAY_JUMPBOX -->
- <form method="get" id="jumpbox" action="{S_JUMPBOX_ACTION}" onsubmit="if(this.f.value == -1){return false;}">
- <!-- IF $CUSTOM_FIELDSET_CLASS -->
- <fieldset class="{$CUSTOM_FIELDSET_CLASS}">
- <!-- ELSE -->
- <fieldset class="jumpbox">
- <!-- ENDIF -->
- {HIDDEN_FIELDS_FOR_JUMPBOX}
- <label for="f" accesskey="j"><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->{L_COLON}</label>
- <select name="f" id="f" onchange="if(this.options[this.selectedIndex].value != -1){ document.forms['jumpbox'].submit() }">
+ <div class="dropdown-container dropdown-container-{S_CONTENT_FLOW_END}<!-- IF not S_IN_MCP --> dropdown-up<!-- ENDIF --> dropdown-{S_CONTENT_FLOW_BEGIN} dropdown-button-control" id="jumpbox">
+ <span title="<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->" class="dropdown-trigger button dropdown-select">
+ <!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->
+ </span>
+ <div class="dropdown hidden">
+ <div class="pointer"><div class="pointer-inner"></div></div>
+ <ul class="dropdown-contents">
<!-- BEGIN jumpbox_forums -->
- <!-- IF jumpbox_forums.S_FORUM_COUNT == 1 --><option value="-1">------------------</option><!-- ENDIF -->
- <option value="{jumpbox_forums.FORUM_ID}"{jumpbox_forums.SELECTED}><!-- BEGIN level -->&nbsp; &nbsp;<!-- END level -->{jumpbox_forums.FORUM_NAME}</option>
+ <!-- IF jumpbox_forums.FORUM_ID neq -1 -->
+ <li><!-- BEGIN level -->&nbsp; &nbsp;<!-- END level --><a href="{jumpbox_forums.LINK}">{jumpbox_forums.FORUM_NAME}</a></li>
+ <!-- ENDIF -->
<!-- END jumpbox_forums -->
- </select>
- <input type="submit" value="{L_GO}" class="button2" />
- </fieldset>
- </form>
+ </ul>
+ </div>
+ </div>
<!-- ELSE -->
<br /><br />
diff --git a/phpBB/styles/prosilver/template/mcp_forum.html b/phpBB/styles/prosilver/template/mcp_forum.html
index c9f81a4099..8fdec01212 100644
--- a/phpBB/styles/prosilver/template/mcp_forum.html
+++ b/phpBB/styles/prosilver/template/mcp_forum.html
@@ -48,6 +48,13 @@
<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF -->
<!-- IF topicrow.S_MOVED_TOPIC and S_CAN_DELETE -->&nbsp;<a href="{topicrow.U_DELETE_TOPIC}" class="topictitle">[ {L_DELETE_SHADOW_TOPIC} ]</a><!-- ENDIF -->
<br />
+
+ <div class="responsive-show" style="display: none;">
+ <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+ {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; {topicrow.LAST_POST_TIME}<br />
+ </div>
+ <span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong></span>
+
<!-- IF .topicrow.pagination -->
<div class="pagination">
<ul>
@@ -62,15 +69,11 @@
</ul>
</div>
<!-- ENDIF -->
+
<div class="responsive-hide">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
</div>
- <div class="responsive-show" style="display: none;">
- <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
- {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; {topicrow.LAST_POST_TIME}<br />
- {L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong>
- </div>
</div>
</dt>
diff --git a/phpBB/styles/prosilver/template/mcp_header.html b/phpBB/styles/prosilver/template/mcp_header.html
index bdfa254741..69239887e3 100644
--- a/phpBB/styles/prosilver/template/mcp_header.html
+++ b/phpBB/styles/prosilver/template/mcp_header.html
@@ -11,7 +11,7 @@
<div id="tabs">
<ul>
<!-- BEGIN l_block1 -->
- <li<!-- IF l_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{l_block1.U_TITLE}"><span>{l_block1.L_TITLE}</span></a></li>
+ <li class="tab<!-- IF l_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{l_block1.U_TITLE}">{l_block1.L_TITLE}</a></li>
<!-- END l_block1 -->
</ul>
</div>
@@ -22,7 +22,7 @@
<div style="width: 100%;">
<div id="cp-menu">
- <div id="navigation">
+ <div id="navigation" role="navigation">
<ul>
<!-- BEGIN l_block1 -->
<!-- IF l_block1.S_SELECTED -->
diff --git a/phpBB/styles/prosilver/template/mcp_topic.html b/phpBB/styles/prosilver/template/mcp_topic.html
index a83b42dba0..6bf6af1b78 100644
--- a/phpBB/styles/prosilver/template/mcp_topic.html
+++ b/phpBB/styles/prosilver/template/mcp_topic.html
@@ -11,16 +11,16 @@
<!-- DEFINE $SHOW_PANEL = 'display-panel' -->
<!-- ENDIF -->
-<div id="minitabs" class="sub-panels" data-show-panel="{$SHOW_PANEL}">
+<div id="minitabs" class="sub-panels" data-show-panel="{$SHOW_PANEL}" role="tablist">
<ul>
- <li id="display-panel-tab"<!-- IF not S_MERGE_VIEW --> class="activetab"<!-- ENDIF -->>
- <a href="#minitabs" data-subpanel="display-panel"><span>{L_DISPLAY_OPTIONS}</span></a>
+ <li id="display-panel-tab" class="tab<!-- IF not S_MERGE_VIEW --> activetab<!-- ENDIF -->">
+ <a href="#minitabs" data-subpanel="display-panel" role="tab" aria-controls="display-panel">{L_DISPLAY_OPTIONS}</a>
</li>
- <li id="split-panel-tab">
- <a href="#minitabs" data-subpanel="split-panel"><span>{L_SPLIT_TOPIC}</span></a>
+ <li id="split-panel-tab" class="tab">
+ <a href="#minitabs" data-subpanel="split-panel" role="tab" aria-controls="split-panel">{L_SPLIT_TOPIC}</a>
</li>
- <li id="merge-panel-tab"<!-- IF S_MERGE_VIEW --> class="activetab"<!-- ENDIF -->>
- <a href="#minitabs" data-subpanel="merge-panel"><span>{L_MERGE_POSTS}</span></a>
+ <li id="merge-panel-tab" class="tab<!-- IF S_MERGE_VIEW --> activetab<!-- ENDIF -->">
+ <a href="#minitabs" data-subpanel="merge-panel" role="tab" aria-controls="merge-panel">{L_MERGE_POSTS}</a>
</li>
</ul>
</div>
@@ -31,7 +31,7 @@
<div class="panel">
<div class="inner">
- <fieldset id="display-panel" class="fields2">
+ <fieldset id="display-panel" class="fields2" role="tabpanel">
<dl>
<dt><label for="posts_per_page">{L_POSTS_PER_PAGE}{L_COLON}</label><br /><span>{L_POSTS_PER_PAGE_EXPLAIN}</span></dt>
<dd><input class="inputbox autowidth" type="number" min="1" name="posts_per_page" id="posts_per_page" size="6" value="{POSTS_PER_PAGE}" /></dd>
@@ -43,7 +43,7 @@
</fieldset>
<!-- IF S_CAN_SPLIT -->
- <fieldset id="split-panel" class="fields2">
+ <fieldset id="split-panel" class="fields2" role="tabpanel">
<p>{L_SPLIT_TOPIC_EXPLAIN}</p>
<!-- IF S_SHOW_TOPIC_ICONS -->
@@ -66,7 +66,7 @@
<!-- ENDIF -->
<!-- IF S_CAN_MERGE -->
- <fieldset id="merge-panel" class="fields2">
+ <fieldset id="merge-panel" class="fields2" role="tabpanel">
<p>{L_MERGE_TOPIC_EXPLAIN}</p>
<dl>
<dt><label for="to_topic_id">{L_MERGE_TOPIC_ID}{L_COLON}</label></dt>
diff --git a/phpBB/styles/prosilver/template/memberlist_search.html b/phpBB/styles/prosilver/template/memberlist_search.html
index f4439b6934..4c14baf2b6 100644
--- a/phpBB/styles/prosilver/template/memberlist_search.html
+++ b/phpBB/styles/prosilver/template/memberlist_search.html
@@ -10,9 +10,9 @@
<dl style="overflow: visible;">
<dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
<dd>
+ <!-- IF U_LIVE_SEARCH --><div class="dropdown-container dropdown-{S_CONTENT_FLOW_END}"><!-- ENDIF -->
<input type="text" name="username" id="username" value="{USERNAME}" class="inputbox"<!-- IF U_LIVE_SEARCH --> autocomplete="off" data-filter="phpbb.search.filter" data-ajax="member_search" data-min-length="3" data-url="{U_LIVE_SEARCH}" data-results="#user-search" data-overlay="false"<!-- ENDIF --> />
<!-- IF U_LIVE_SEARCH -->
- <div class="dropdown-container">
<div class="dropdown live-search hidden" id="user-search">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents search-results">
diff --git a/phpBB/styles/prosilver/template/navbar_footer.html b/phpBB/styles/prosilver/template/navbar_footer.html
index 6912ee242e..675322c56c 100644
--- a/phpBB/styles/prosilver/template/navbar_footer.html
+++ b/phpBB/styles/prosilver/template/navbar_footer.html
@@ -1,23 +1,25 @@
<div class="navbar">
<div class="inner">
- <ul class="linklist bulletin">
- <li class="small-icon icon-home breadcrumbs">
- <!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}">{L_SITE_HOME}</a></span><!-- ENDIF -->
- <span class="crumb"><a href="{U_INDEX}">{L_INDEX}</a></span>
+ <ul id="nav-footer" class="linklist bulletin" role="menubar">
+ <li class="small-icon icon-home breadcrumbs" role="navigation">
+ <!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}" data-navbar-reference="home">{L_SITE_HOME}</a></span><!-- ENDIF -->
+ <span class="crumb"><a href="{U_INDEX}" data-navbar-reference="index">{L_INDEX}</a></span>
<!-- EVENT overall_footer_breadcrumb_append -->
</li>
- <!-- IF not S_IS_BOT -->
- <!-- IF U_WATCH_FORUM_LINK --><li class="small-icon icon-<!-- IF S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->"><a href="{U_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_FORUM_TOGGLE}" data-toggle-url="{U_WATCH_FORUM_TOGGLE}">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
- <!-- ENDIF -->
+ <!-- IF U_WATCH_FORUM_LINK and not S_IS_BOT --><li class="small-icon icon-<!-- IF S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-last-responsive="true"><a href="{U_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_FORUM_TOGGLE}" data-toggle-url="{U_WATCH_FORUM_TOGGLE}">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
+
<!-- EVENT overall_footer_timezone_before -->
<li class="rightside">{S_TIMEZONE}</li>
<!-- EVENT overall_footer_timezone_after -->
- <!-- IF not S_IS_BOT --><li class="rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF -->
+ <!-- IF not S_IS_BOT -->
+ <li class="small-icon icon-delete-cookies rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true" role="menuitem">{L_DELETE_COOKIES}</a></li>
+ <!-- IF S_DISPLAY_MEMBERLIST --><li class="small-icon icon-members rightside" data-last-responsive="true"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}" role="menuitem">{L_MEMBERLIST}</a></li><!-- ENDIF -->
+ <!-- ENDIF -->
<!-- EVENT overall_footer_teamlink_before -->
- <!-- IF U_TEAM --><li class="rightside"><a href="{U_TEAM}">{L_THE_TEAM}</a></li><!-- ENDIF -->
- <!-- IF U_CONTACT_US --><li class="rightside"><a href="{U_CONTACT_US}">{L_CONTACT_US}</a></li><!-- ENDIF -->
+ <!-- IF U_TEAM --><li class="small-icon icon-team rightside" data-last-responsive="true"><a href="{U_TEAM}" role="menuitem">{L_THE_TEAM}</a></li><!-- ENDIF -->
<!-- EVENT overall_footer_teamlink_after -->
+ <!-- IF U_CONTACT_US --><li class="small-icon icon-contact rightside" data-last-responsive="true"><a href="{U_CONTACT_US}" role="menuitem">{L_CONTACT_US}</a></li><!-- ENDIF -->
</ul>
</div>
diff --git a/phpBB/styles/prosilver/template/navbar_header.html b/phpBB/styles/prosilver/template/navbar_header.html
index 804fa5b2aa..cb646f25e4 100644
--- a/phpBB/styles/prosilver/template/navbar_header.html
+++ b/phpBB/styles/prosilver/template/navbar_header.html
@@ -1,51 +1,102 @@
-<div class="navbar">
+<div class="navbar" role="navigation">
<div class="inner">
- <ul class="linklist navlinks">
- <!-- DEFINE $MICRODATA = ' itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""' -->
- <li class="small-icon icon-home breadcrumbs">
- <!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}"{$MICRODATA}>{L_SITE_HOME}</a></span><!-- ENDIF -->
- <span class="crumb"><a href="{U_INDEX}" accesskey="h"{$MICRODATA}>{L_INDEX}</a></span>
- <!-- BEGIN navlinks --><!-- EVENT overall_header_navlink_prepend --><span class="crumb"><a href="{navlinks.U_VIEW_FORUM}"{$MICRODATA}>{navlinks.FORUM_NAME}</a></span><!-- EVENT overall_header_navlink_append --><!-- END navlinks -->
- <!-- EVENT overall_header_breadcrumb_append -->
+ <ul id="nav-main" class="linklist bulletin" role="menubar">
+
+ <li id="quick-links" class="small-icon responsive-menu dropdown-container<!-- IF not S_DISPLAY_QUICK_LINKS and not S_DISPLAY_SEARCH --> hidden<!-- ENDIF -->" data-skip-responsive="true">
+ <a href="#" class="responsive-menu-link dropdown-trigger">{L_QUICK_LINKS}</a>
+ <div class="dropdown hidden">
+ <div class="pointer"><div class="pointer-inner"></div></div>
+ <ul class="dropdown-contents" role="menu">
+ <!-- EVENT navbar_header_quick_links_before -->
+
+ <!-- IF S_DISPLAY_SEARCH -->
+ <li class="separator"></li>
+ <!-- IF S_REGISTERED_USER -->
+ <li class="small-icon icon-search-self"><a href="{U_SEARCH_SELF}" role="menuitem">{L_SEARCH_SELF}</a></li>
+ <!-- ENDIF -->
+ <!-- IF S_USER_LOGGED_IN -->
+ <li class="small-icon icon-search-new"><a href="{U_SEARCH_NEW}" role="menuitem">{L_SEARCH_NEW}</a></li>
+ <!-- ENDIF -->
+ <!-- IF S_LOAD_UNREADS -->
+ <li class="small-icon icon-search-unread"><a href="{U_SEARCH_UNREAD}" role="menuitem">{L_SEARCH_UNREAD}</a></li>
+ <!-- ENDIF -->
+ <li class="small-icon icon-search-unanswered"><a href="{U_SEARCH_UNANSWERED}" role="menuitem">{L_SEARCH_UNANSWERED}</a></li>
+ <li class="small-icon icon-search-active"><a href="{U_SEARCH_ACTIVE_TOPICS}" role="menuitem">{L_SEARCH_ACTIVE_TOPICS}</a></li>
+ <!-- ENDIF -->
+ <li class="separator"></li>
+
+ <!-- EVENT navbar_header_quick_links_after -->
+ </ul>
+ </div>
</li>
- <!-- IF S_REGISTERED_USER --><li id="username_logged_in" class="rightside"><!-- IF CURRENT_USER_AVATAR --><a href="{U_USER_PROFILE}" class="header-avatar">{CURRENT_USER_AVATAR}</a> <!-- ENDIF -->{CURRENT_USERNAME_FULL}</li><!-- ENDIF -->
- <!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH --><li class="responsive-search rightside" style="display: none;"><a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}">{L_SEARCH}</a></li><!-- ENDIF -->
- </ul>
+ <!-- EVENT overall_header_navigation_prepend -->
+ <li class="small-icon icon-faq" <!-- IF not S_USER_LOGGED_IN -->data-skip-responsive="true"<!-- ELSE -->data-last-responsive="true"<!-- ENDIF -->><a href="{U_FAQ}" title="{L_FAQ_EXPLAIN}" role="menuitem">{L_FAQ}</a></li>
+ <!-- EVENT overall_header_navigation_append -->
+ <!-- IF U_ACP --><li class="small-icon icon-acp" data-skip-responsive="true"><a href="{U_ACP}" title="{L_ACP}" role="menuitem">{L_ACP_SHORT}</a></li><!-- ENDIF -->
+ <!-- IF U_MCP --><li class="small-icon icon-mcp" data-skip-responsive="true"><a href="{U_MCP}" title="{L_MCP}" role="menuitem">{L_MCP_SHORT}</a></li><!-- ENDIF -->
- <ul class="linklist bulletin">
- <!-- IF not S_IS_BOT and S_USER_LOGGED_IN -->
- <!-- IF S_NOTIFICATIONS_DISPLAY -->
- <li class="small-icon icon-notification" data-skip-responsive="true">
- <a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button"><span>{L_NOTIFICATIONS} [</span><strong>{NOTIFICATIONS_COUNT}</strong><span>]</span></a>
- <!-- INCLUDE notification_dropdown.html -->
+ <!-- IF S_REGISTERED_USER -->
+ <li id="username_logged_in" class="rightside <!-- IF CURRENT_USER_AVATAR --> no-bulletin<!-- ENDIF -->" data-skip-responsive="true">
+ <!-- EVENT navbar_header_username_prepend -->
+ <div class="header-profile dropdown-container">
+ <a href="{U_PROFILE}" class="header-avatar dropdown-trigger"><!-- IF CURRENT_USER_AVATAR -->{CURRENT_USER_AVATAR} <!-- ENDIF -->{CURRENT_USERNAME_SIMPLE}</a>
+ <div class="dropdown hidden">
+ <div class="pointer"><div class="pointer-inner"></div></div>
+ <ul class="dropdown-contents" role="menu">
+ <!-- IF U_RESTORE_PERMISSIONS --><li class="small-icon icon-restore-permissions"><a href="{U_RESTORE_PERMISSIONS}">{L_RESTORE_PERMISSIONS}</a></li><!-- ENDIF -->
+
+ <!-- EVENT navbar_header_profile_list_before -->
+
+ <li class="small-icon icon-ucp"><a href="{U_PROFILE}" title="{L_PROFILE}" role="menuitem">{L_PROFILE}</a></li>
+ <li class="small-icon icon-profile"><a href="{U_USER_PROFILE}" title="{L_READ_PROFILE}" role="menuitem">{L_READ_PROFILE}</a></li>
+
+ <!-- EVENT navbar_header_profile_list_after -->
+
+ <li class="separator"></li>
+ <li class="small-icon icon-logout"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">{L_LOGIN_LOGOUT}</a></li>
+ </ul>
+ </div>
+ </div>
+ <!-- EVENT navbar_header_username_append -->
</li>
- <!-- ENDIF -->
<!-- IF S_DISPLAY_PM -->
- <li class="small-icon icon-pm">
- <a href="{U_PRIVATEMSGS}"><span>{L_PRIVATE_MESSAGES} [</span><strong>{PRIVATE_MESSAGE_COUNT}</strong><span>]</span></a>
+ <li class="small-icon icon-pm rightside" data-skip-responsive="true">
+ <a href="{U_PRIVATEMSGS}" role="menuitem"><span>{L_PRIVATE_MESSAGES} [</span><strong>{PRIVATE_MESSAGE_COUNT}</strong><span>]</span></a>
</li>
<!-- ENDIF -->
- <li class="small-icon icon-ucp">
- <a href="{U_PROFILE}" title="{L_PROFILE}" accesskey="e">{L_PROFILE}</a>
- </li>
- <!-- IF S_DISPLAY_SEARCH -->
- <li class="icon-search-self"><a href="{U_SEARCH_SELF}">{L_SEARCH_SELF}</a></li>
+ <!-- IF S_NOTIFICATIONS_DISPLAY -->
+ <li class="small-icon icon-notification dropdown-container dropdown-{S_CONTENT_FLOW_END} rightside" data-skip-responsive="true">
+ <a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button" class="dropdown-trigger"><span>{L_NOTIFICATIONS} [</span><strong>{NOTIFICATIONS_COUNT}</strong><span>]</span></a>
+ <!-- INCLUDE notification_dropdown.html -->
+ </li>
<!-- ENDIF -->
- <!-- IF U_RESTORE_PERMISSIONS -->
- <li class="icon-restore-permissions"><a href="{U_RESTORE_PERMISSIONS}">{L_RESTORE_PERMISSIONS}</a></li>
+ <!-- ELSE -->
+ <li class="small-icon icon-logout rightside" data-skip-responsive="true"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">{L_LOGIN_LOGOUT}</a></li>
+ <!-- IF S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) -->
+ <li class="small-icon icon-register rightside" data-skip-responsive="true"><a href="{U_REGISTER}" role="menuitem">{L_REGISTER}</a></li>
<!-- ENDIF -->
+ <!-- EVENT navbar_header_logged_out_content -->
<!-- ENDIF -->
+ </ul>
- <!-- EVENT overall_header_navigation_append -->
- <!-- IF not S_IS_BOT -->
- <li class="small-icon icon-logout rightside no-bulletin"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x">{L_LOGIN_LOGOUT}</a></li>
- <!-- IF not S_USER_LOGGED_IN and S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) --><li class="small-icon icon-register rightside no-bulletin"><a href="{U_REGISTER}">{L_REGISTER}</a></li><!-- ENDIF -->
- <!-- IF S_DISPLAY_MEMBERLIST --><li class="small-icon icon-members rightside no-bulletin"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}">{L_MEMBERLIST}</a></li><!-- ENDIF -->
+ <ul id="nav-breadcrumbs" class="linklist navlinks" role="menubar">
+ <!-- DEFINE $MICRODATA = ' itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""' -->
+ <li class="small-icon icon-home breadcrumbs" role="navigation">
+ <!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}"{$MICRODATA} data-navbar-reference="home">{L_SITE_HOME}</a></span><!-- ENDIF -->
+ <span class="crumb"><a href="{U_INDEX}" accesskey="h"{$MICRODATA} data-navbar-reference="index">{L_INDEX}</a></span>
+ <!-- BEGIN navlinks -->
+ <!-- EVENT overall_header_navlink_prepend -->
+ <span class="crumb"><a href="{navlinks.U_VIEW_FORUM}"{$MICRODATA}<!-- IF navlinks.MICRODATA --> {navlinks.MICRODATA}<!-- ENDIF -->>{navlinks.FORUM_NAME}</a></span>
+ <!-- EVENT overall_header_navlink_append -->
+ <!-- END navlinks -->
+ <!-- EVENT overall_header_breadcrumb_append -->
+ </li>
+
+ <!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH -->
+ <li class="rightside responsive-search" style="display: none;"><a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}" role="menuitem">{L_SEARCH}</a></li>
<!-- ENDIF -->
- <li class="small-icon icon-faq rightside no-bulletin"><a href="{U_FAQ}" title="{L_FAQ_EXPLAIN}">{L_FAQ}</a></li>
- <!-- EVENT overall_header_navigation_prepend -->
</ul>
</div>
diff --git a/phpBB/styles/prosilver/template/notification_dropdown.html b/phpBB/styles/prosilver/template/notification_dropdown.html
index db4d5bade7..13d90a9d38 100644
--- a/phpBB/styles/prosilver/template/notification_dropdown.html
+++ b/phpBB/styles/prosilver/template/notification_dropdown.html
@@ -18,14 +18,17 @@
</li>
<!-- ENDIF -->
<!-- BEGIN notifications -->
- <li class="<!-- IF notifications.UNREAD --> bg2<!-- ENDIF -->">
+ <li class="<!-- IF notifications.UNREAD --> bg2<!-- ENDIF --><!-- IF notifications.STYLING --> {notifications.STYLING}<!-- ENDIF --><!-- IF not notifications.URL --> no-url<!-- ENDIF -->">
<!-- IF notifications.URL -->
- <a href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}" data-real-url="{notifications.URL}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->">
+ <a class="notification-block" href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}" data-real-url="{notifications.URL}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->">
<!-- ENDIF -->
<!-- IF notifications.AVATAR -->{notifications.AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF -->
<div class="notification_text">
- <p>{notifications.FORMATTED_TITLE}</p>
- <p>&raquo; {notifications.TIME}</p>
+ <p class="notification-title">{notifications.FORMATTED_TITLE}</p>
+ <!-- IF notifications.REFERENCE --><p class="notification-reference">{notifications.REFERENCE}</p><!-- ENDIF -->
+ <!-- IF notifications.FORUM --><p class="notification-forum">{notifications.FORUM}</p><!-- ENDIF -->
+ <!-- IF notifications.REASON --><p class="notification-reason">{notifications.REASON}</p><!-- ENDIF -->
+ <p class="notification-time">{notifications.TIME}</p>
</div>
<!-- IF notifications.URL --></a><!-- ENDIF -->
<!-- IF notifications.UNREAD -->
diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html
index e5371e792e..df09fc6a30 100644
--- a/phpBB/styles/prosilver/template/overall_header.html
+++ b/phpBB/styles/prosilver/template/overall_header.html
@@ -63,7 +63,7 @@
<div class="inner">
<div id="site-description">
- <a href="<!-- IF U_SITE_HOME -->{U_SITE_HOME}<!-- ELSE -->{U_INDEX}<!-- ENDIF -->" title="<!-- IF U_SITE_HOME -->{L_SITE_HOME}<!-- ELSE -->{L_INDEX}<!-- ENDIF -->" id="logo">{SITE_LOGO_IMG}</a>
+ <a id="logo" class="logo" href="<!-- IF U_SITE_HOME -->{U_SITE_HOME}<!-- ELSE -->{U_INDEX}<!-- ENDIF -->" title="<!-- IF U_SITE_HOME -->{L_SITE_HOME}<!-- ELSE -->{L_INDEX}<!-- ENDIF -->">{SITE_LOGO_IMG}</a>
<h1>{SITENAME}</h1>
<p>{SITE_DESCRIPTION}</p>
<p class="skiplink"><a href="#start_here">{L_SKIP}</a></p>
diff --git a/phpBB/styles/prosilver/template/pagination.html b/phpBB/styles/prosilver/template/pagination.html
index cde183291d..cb2c09bff7 100644
--- a/phpBB/styles/prosilver/template/pagination.html
+++ b/phpBB/styles/prosilver/template/pagination.html
@@ -7,7 +7,7 @@
<ul class="dropdown-contents">
<li>{L_JUMP_TO_PAGE}{L_COLON}</li>
<li class="page-jump-form">
- <input type="text" name="page-number" maxlength="6" title="{L_SEARCH_KEYWORDS}" class="inputbox tiny" value="" data-per-page="{PER_PAGE}" data-base-url="{BASE_URL|e('html_attr')}" data-start-name="{START_NAME}" />
+ <input type="number" name="page-number" maxlength="6" title="{L_JUMP_PAGE}" class="inputbox tiny" data-per-page="{PER_PAGE}" data-base-url="{BASE_URL|e('html_attr')}" data-start-name="{START_NAME}" />
<input class="button2" value="{L_GO}" type="button" />
</li>
</ul>
diff --git a/phpBB/styles/prosilver/template/posting_attach_body.html b/phpBB/styles/prosilver/template/posting_attach_body.html
index 4ad66656b2..81b2c2bf41 100644
--- a/phpBB/styles/prosilver/template/posting_attach_body.html
+++ b/phpBB/styles/prosilver/template/posting_attach_body.html
@@ -23,7 +23,7 @@
<div class="panel<!-- IF not .attach_row --> hidden<!-- ENDIF -->" id="file-list-container">
<div class="inner">
- <table class="table1 zebra-list">
+ <table class="table1 zebra-list fixed-width-table">
<thead>
<tr>
<th class="attach-name">{L_PLUPLOAD_FILENAME}</th>
diff --git a/phpBB/styles/prosilver/template/posting_editor.html b/phpBB/styles/prosilver/template/posting_editor.html
index 081c267a94..25e3be3bcb 100644
--- a/phpBB/styles/prosilver/template/posting_editor.html
+++ b/phpBB/styles/prosilver/template/posting_editor.html
@@ -99,19 +99,21 @@
<!-- ENDIF -->
<!-- IF not S_PRIVMSGS and not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
- <div id="tabs" class="sub-panels" data-show-panel="<!-- IF SHOW_PANEL -->{SHOW_PANEL}<!-- ELSE -->options-panel<!-- ENDIF -->">
+ <div id="tabs" class="sub-panels" data-show-panel="<!-- IF SHOW_PANEL -->{SHOW_PANEL}<!-- ELSE -->options-panel<!-- ENDIF -->" role="tablist">
<ul>
- <li id="options-panel-tab" class="activetab"><a href="#tabs" data-subpanel="options-panel"><span>{L_OPTIONS}</span></a></li>
+ <li id="options-panel-tab" class="tab activetab"><a href="#tabs" data-subpanel="options-panel" role="tab" aria-controls="options-panel"><span>{L_OPTIONS}</span></a></li>
<!-- IF S_SHOW_ATTACH_BOX -->
- <li id="attach-panel-tab">
- <a href="#tabs" data-subpanel="attach-panel">
- <span>
- {L_ATTACHMENTS} <strong id="file-total-progress"><strong id="file-total-progress-bar"></strong></strong>
- </span>
+ <li id="attach-panel-tab" class="tab">
+ <a href="#tabs" data-subpanel="attach-panel" role="tab" aria-controls="attach-panel">
+ {L_ATTACHMENTS} <strong id="file-total-progress"><strong id="file-total-progress-bar"></strong></strong>
</a>
</li>
<!-- ENDIF -->
- <!-- IF S_SHOW_POLL_BOX || S_POLL_DELETE --><li id="poll-panel-tab"><a href="#tabs" data-subpanel="poll-panel"><span>{L_ADD_POLL}</span></a></li><!-- ENDIF -->
+ <!-- IF S_SHOW_POLL_BOX || S_POLL_DELETE -->
+ <li id="poll-panel-tab" class="tab">
+ <a href="#tabs" data-subpanel="poll-panel" role="tab" aria-controls="poll-panel">{L_ADD_POLL}</a>
+ </li>
+ <!-- ENDIF -->
</ul>
</div>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/ucp_avatar_options.html b/phpBB/styles/prosilver/template/ucp_avatar_options.html
index 4b4581a59c..ca077fdf5b 100644
--- a/phpBB/styles/prosilver/template/ucp_avatar_options.html
+++ b/phpBB/styles/prosilver/template/ucp_avatar_options.html
@@ -17,7 +17,7 @@
<dl>
<dt><label>{L_AVATAR_TYPE}{L_COLON}</label></dt>
<dd><select name="avatar_driver" id="avatar_driver" data-togglable-settings="true">
- <option value="">{L_NO_AVATAR_CATEGORY}</option>
+ <option value="">{L_NO_AVATAR}</option>
<!-- BEGIN avatar_drivers -->
<option value="{avatar_drivers.DRIVER}"<!-- IF avatar_drivers.SELECTED --> selected="selected"<!-- ENDIF --> data-toggle-setting="#avatar_option_{avatar_drivers.DRIVER}">{avatar_drivers.L_TITLE}</option>
<!-- END avatar_drivers -->
diff --git a/phpBB/styles/prosilver/template/ucp_header.html b/phpBB/styles/prosilver/template/ucp_header.html
index 102ea5a3a0..a17f145cbc 100644
--- a/phpBB/styles/prosilver/template/ucp_header.html
+++ b/phpBB/styles/prosilver/template/ucp_header.html
@@ -5,7 +5,7 @@
<div id="tabs">
<ul>
<!-- BEGIN t_block1 -->
- <li <!-- IF t_block1.S_SELECTED -->class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li>
+ <li class="tab<!-- IF t_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{t_block1.U_TITLE}">{t_block1.L_TITLE}</a></li>
<!-- END t_block1 -->
</ul>
</div>
@@ -20,7 +20,7 @@
<div style="width: 100%;">
<div id="cp-menu">
- <div id="navigation">
+ <div id="navigation" role="navigation">
<!-- IF S_PRIVMSGS -->
<!-- BEGIN t_block2 -->
diff --git a/phpBB/styles/prosilver/template/ucp_notifications.html b/phpBB/styles/prosilver/template/ucp_notifications.html
index 8910769cce..500bae0c47 100644
--- a/phpBB/styles/prosilver/template/ucp_notifications.html
+++ b/phpBB/styles/prosilver/template/ucp_notifications.html
@@ -65,19 +65,18 @@
</ul>
<ul class="topiclist cplist two-columns">
<!-- BEGIN notification_list -->
- <li class="row<!-- IF notification_list.UNREAD --> bg3<!-- ELSE --><!-- IF notification_list.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- ENDIF -->">
+ <li class="row<!-- IF notification_list.UNREAD --> bg3<!-- ELSE --><!-- IF notification_list.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- ENDIF --><!-- IF notification_list.STYLING --> {notification_list.STYLING}<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<!-- IF notification_list.AVATAR -->{notification_list.AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF -->
<div class="notifications">
<!-- IF notification_list.URL --><a href="<!-- IF notification_list.UNREAD -->{notification_list.U_MARK_READ}<!-- ELSE -->{notification_list.URL}<!-- ENDIF -->"><!-- ENDIF -->
- <p class="notifications_title">{notification_list.FORMATTED_TITLE}</p>
- <!-- IF notification_list.URL --></a><!-- ENDIF -->
+ <p class="notifications_title">{notification_list.FORMATTED_TITLE}<!-- IF notification_list.REFERENCE --> {notification_list.REFERENCE}<!-- ENDIF --></p>
+ <!-- IF notification_list.URL --></a><!-- ENDIF -->
+ <!-- IF notification_list.FORUM --><p class="notifications_forum">{notification_list.FORUM}</p><!-- ENDIF -->
+ <!-- IF notification_list.REASON --><p class="notifications_reason">{notification_list.REASON}</p><!-- ENDIF -->
<p class="notifications_time">{notification_list.TIME}</p>
- <!-- IF not notification_list.URL and notification_list.U_MARK_READ -->
- <p><a href="{notification_list.U_MARK_READ}">{L_MARK_READ}</a></p>
- <!-- ENDIF -->
</div>
</div>
</dt>
diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
index 84ab6ecb44..9f33bc04f7 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
@@ -38,7 +38,7 @@
<dd class="profile-contact">
<strong>{L_CONTACT}{L_COLON}</strong>
<div class="dropdown-container dropdown-left">
- <a href="#" class="dropdown-trigger"><span class="imageset icon_contact"></span></a>
+ <a href="#" class="dropdown-trigger"><span class="imageset icon_contact" title="{CONTACT_USER}">{CONTACT_USER}</span></a>
<div class="dropdown hidden">
<div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents contact-icons">
@@ -49,7 +49,7 @@
<div>
<!-- ENDIF -->
<a href="<!-- IF contact.U_CONTACT -->{contact.U_CONTACT}<!-- ELSE -->{contact.U_PROFILE_AUTHOR}<!-- ENDIF -->" title="{contact.NAME}"<!-- IF $S_LAST_CELL --> class="last-cell"<!-- ENDIF --><!-- IF contact.ID eq 'jabber' --> onclick="popup(this.href, 550, 320); return false;"<!-- ENDIF -->>
- <span class="contact-icon {contact.ID}-icon"></span>
+ <span class="contact-icon {contact.ID}-icon">{contact.NAME}</span>
</a>
<!-- IF REMAINDER eq 3 or contact.S_LAST_ROW -->
</div>
diff --git a/phpBB/styles/prosilver/template/ucp_register.html b/phpBB/styles/prosilver/template/ucp_register.html
index b27003faab..020f69cb26 100644
--- a/phpBB/styles/prosilver/template/ucp_register.html
+++ b/phpBB/styles/prosilver/template/ucp_register.html
@@ -26,6 +26,7 @@
<!-- IF L_REG_COND -->
<dl><dd><strong>{L_REG_COND}</strong></dd></dl>
<!-- ENDIF -->
+ <!-- EVENT ucp_register_credentials_before -->
<dl>
<dt><label for="username">{L_USERNAME}{L_COLON}</label><br /><span>{L_USERNAME_EXPLAIN}</span></dt>
<dd><input type="text" tabindex="1" name="username" id="username" size="25" value="{USERNAME}" class="inputbox autowidth" title="{L_USERNAME}" /></dd>
@@ -43,8 +44,10 @@
<dd><input type="password" tabindex="5" name="password_confirm" id="password_confirm" size="25" value="{PASSWORD_CONFIRM}" class="inputbox autowidth" title="{L_CONFIRM_PASSWORD}" /></dd>
</dl>
+ <!-- EVENT ucp_register_credentials_after -->
<hr />
+ <!-- EVENT ucp_register_options_before -->
<dl>
<dt><label for="lang">{L_LANGUAGE}{L_COLON}</label></dt>
<dd><select name="lang" id="lang" onchange="change_language(this.value); return false;" tabindex="6" title="{L_LANGUAGE}">{S_LANG_OPTIONS}</select></dd>
@@ -52,6 +55,7 @@
<!-- INCLUDE timezone_option.html -->
+ <!-- EVENT ucp_register_profile_fields_before -->
<!-- IF .profile_fields -->
<dl><dd><strong>{L_ITEMS_REQUIRED}</strong></dd></dl>
@@ -65,6 +69,7 @@
<!-- END profile_fields -->
<!-- ENDIF -->
+ <!-- EVENT ucp_register_profile_fields_after -->
</fieldset>
</div>
</div>
diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html
index c44e830b9c..e8c50f79b2 100644
--- a/phpBB/styles/prosilver/template/viewforum_body.html
+++ b/phpBB/styles/prosilver/template/viewforum_body.html
@@ -1,5 +1,5 @@
<!-- INCLUDE overall_header.html -->
-<!-- IF U_MCP or U_ACP --><p class="responsive-center">[&nbsp;<!-- IF U_ACP --><a href="{U_ACP}" title="{L_ACP}" data-responsive-text="{L_ACP_SHORT}">{L_ACP}</a><!-- IF U_MCP -->&nbsp;|&nbsp;<!-- ENDIF --><!-- ENDIF --><!-- IF U_MCP --><a href="{U_MCP}" title="{L_MCP}" data-responsive-text="{L_MCP_SHORT}">{L_MCP}</a><!-- ENDIF -->&nbsp;]</p><!-- ENDIF -->
+
<h2 class="forum-title"><!-- EVENT viewforum_forum_name_prepend --><a href="{U_VIEW_FORUM}">{FORUM_NAME}</a><!-- EVENT viewforum_forum_name_append --></h2>
<!-- IF FORUM_DESC or MODERATORS or U_MCP -->
@@ -27,15 +27,15 @@
<!-- IF S_HAS_SUBFORUM -->
<!-- IF not S_IS_BOT and U_MARK_FORUMS -->
-<ul class="linklist">
- <li class="rightside mark-read"><a href="{U_MARK_FORUMS}" data-ajax="mark_forums_read">{L_MARK_SUBFORUMS_READ}</a></li>
-</ul>
+ <div class="action-bar compact">
+ <a href="{U_MARK_FORUMS}" class="mark-read rightside" data-ajax="mark_forums_read">{L_MARK_SUBFORUMS_READ}</a>
+ </div>
<!-- ENDIF -->
<!-- INCLUDE forumlist_body.html -->
<!-- ENDIF -->
<!-- IF S_DISPLAY_POST_INFO or .pagination or TOTAL_POSTS or TOTAL_TOPICS -->
- <div class="action-bar top" <!-- IF S_HAS_SUBFORUM -->style="margin-top: 2em;"<!-- ENDIF -->>
+ <div class="action-bar top">
<!-- IF not S_IS_BOT and S_DISPLAY_POST_INFO -->
<div class="buttons">
@@ -150,6 +150,15 @@
<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
<!-- IF topicrow.S_TOPIC_DELETED --><a href="{topicrow.U_MCP_QUEUE}">{DELETED_IMG}</a> <!-- ENDIF -->
<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
+
+ <!-- IF not S_IS_BOT -->
+ <div class="responsive-show" style="display: none;">
+ {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
+ <!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --><br />{L_POSTED} {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
+ </div>
+ <!-- IF topicrow.REPLIES --><span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong></span><!-- ENDIF -->
+ <!-- ENDIF -->
+
<!-- IF .topicrow.pagination -->
<div class="pagination">
<ul>
@@ -164,19 +173,13 @@
</ul>
</div>
<!-- ENDIF -->
+
<div class="responsive-hide">
<!-- IF topicrow.S_HAS_POLL -->{POLL_IMG} <!-- ENDIF -->
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
<!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --> &raquo; {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
</div>
- <!-- IF not S_IS_BOT -->
- <div class="responsive-show" style="display: none;">
- {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
- <!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --><br />{L_POSTED} {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
- <!-- IF topicrow.REPLIES --><br />{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong><!-- ENDIF -->
- </div>
- <!-- ENDIF -->
<!-- EVENT topiclist_row_append -->
</div>
diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html
index 38836f3ee4..b764979f97 100644
--- a/phpBB/styles/prosilver/template/viewtopic_body.html
+++ b/phpBB/styles/prosilver/template/viewtopic_body.html
@@ -1,5 +1,5 @@
<!-- INCLUDE overall_header.html -->
-<!-- IF U_MCP or U_ACP --><p class="responsive-center">[&nbsp;<!-- IF U_ACP --><a href="{U_ACP}" title="{L_ACP}" data-responsive-text="{L_ACP_SHORT}">{L_ACP}</a><!-- IF U_MCP -->&nbsp;|&nbsp;<!-- ENDIF --><!-- ENDIF --><!-- IF U_MCP --><a href="{U_MCP}" title="{L_MCP}" data-responsive-text="{L_MCP_SHORT}">{L_MCP}</a><!-- ENDIF -->&nbsp;]</p><!-- ENDIF -->
+
<h2 class="topic-title"><!-- EVENT viewtopic_topic_title_prepend --><a href="{U_VIEW_TOPIC}">{TOPIC_TITLE}</a><!-- EVENT viewtopic_topic_title_append --></h2>
<!-- NOTE: remove the style="display: none" when you want to have the forum description on the topic body -->
<!-- IF FORUM_DESC --><div style="display: none !important;">{FORUM_DESC}<br /></div><!-- ENDIF -->
@@ -155,7 +155,7 @@
<dd class="profile-contact">
<strong>{L_CONTACT}{L_COLON}</strong>
<div class="dropdown-container dropdown-left">
- <a href="#" class="dropdown-trigger"><span class="imageset icon_contact"></span></a>
+ <a href="#" class="dropdown-trigger"><span class="imageset icon_contact" title="{postrow.CONTACT_USER}">{postrow.CONTACT_USER}</span></a>
<div class="dropdown hidden">
<div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents contact-icons">
@@ -166,7 +166,7 @@
<div>
<!-- ENDIF -->
<a href="<!-- IF postrow.contact.U_CONTACT -->{postrow.contact.U_CONTACT}<!-- ELSE -->{postrow.contact.U_PROFILE_AUTHOR}<!-- ENDIF -->" title="{postrow.contact.NAME}"<!-- IF $S_LAST_CELL --> class="last-cell"<!-- ENDIF --><!-- IF postrow.contact.ID eq 'jabber' --> onclick="popup(this.href, 550, 320); return false;"<!-- ENDIF -->>
- <span class="contact-icon {postrow.contact.ID}-icon"></span>
+ <span class="contact-icon {postrow.contact.ID}-icon">{postrow.contact.NAME}</span>
</a>
<!-- IF REMAINDER eq 3 or postrow.contact.S_LAST_ROW -->
</div>
@@ -350,6 +350,21 @@
<!-- INCLUDE viewtopic_topic_tools.html -->
+ <!-- IF .quickmod -->
+ <div class="dropdown-container dropdown-container-{S_CONTENT_FLOW_BEGIN} dropdown-up dropdown-{S_CONTENT_FLOW_END} dropdown-button-control" id="quickmod">
+ <span title="{L_QUICK_MOD}" class="dropdown-trigger button icon-button modtools-icon dropdown-select">{L_QUICK_MOD}</span>
+ <div class="dropdown hidden">
+ <div class="pointer"><div class="pointer-inner"></div></div>
+ <ul class="dropdown-contents">
+ <!-- BEGIN quickmod -->
+ <!-- DEFINE $QUICKMOD_AJAX = (quickmod.VALUE in ['lock', 'unlock', 'delete_topic', 'restore_topic', 'make_normal', 'make_sticky', 'make_announce', 'make_global']) -->
+ <li><a href="{quickmod.LINK}"<!-- IF $QUICKMOD_AJAX --> data-ajax="true" data-refresh="true"<!-- ENDIF -->>{quickmod.TITLE}</a></li>
+ <!-- END quickmod -->
+ </ul>
+ </div>
+ </div>
+ <!-- ENDIF -->
+
<!-- IF .pagination or TOTAL_POSTS -->
<div class="pagination">
{TOTAL_POSTS}
@@ -366,21 +381,6 @@
<!-- EVENT viewtopic_body_footer_before -->
<!-- INCLUDE jumpbox.html -->
-<!-- IF .quickmod -->
- <form method="post" action="{S_MOD_ACTION}" id="quickmodform">
- <fieldset class="quickmod">
- <label for="quick-mod-select">{L_QUICK_MOD}{L_COLON}</label>
- <select name="action" id="quick-mod-select">
- <!-- BEGIN quickmod -->
- <option value="{quickmod.VALUE}">{quickmod.TITLE}</option>
- <!-- END quickmod -->
- </select>
- <input type="submit" value="{L_GO}" class="button2" />
- {S_FORM_TOKEN}
- </fieldset>
- </form>
-<!-- ENDIF -->
-
<!-- IF S_DISPLAY_ONLINE_LIST -->
<div class="stat-block online-list">
<h3><!-- IF U_VIEWONLINE --><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a><!-- ELSE -->{L_WHO_IS_ONLINE}<!-- ENDIF --></h3>
diff --git a/phpBB/styles/prosilver/template/viewtopic_topic_tools.html b/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
index 5394c00f6a..2a34ebd446 100644
--- a/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
+++ b/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
@@ -7,16 +7,12 @@
<!-- EVENT viewtopic_topic_tools_before -->
<!-- IF U_WATCH_TOPIC -->
<li class="small-icon icon-<!-- IF S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->">
- <a href="{U_WATCH_TOPIC}" class="watch-topic-link" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}" data-update-all=".watch-topic-link">
- {S_WATCH_TOPIC_TITLE}
- </a>
+ <a href="{U_WATCH_TOPIC}" class="watch-topic-link" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}" data-update-all=".watch-topic-link">{S_WATCH_TOPIC_TITLE}</a>
</li>
<!-- ENDIF -->
<!-- IF U_BOOKMARK_TOPIC -->
<li class="small-icon icon-bookmark">
- <a href="{U_BOOKMARK_TOPIC}" class="bookmark-link" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}" data-update-all=".bookmark-link">
- {S_BOOKMARK_TOPIC}
- </a>
+ <a href="{U_BOOKMARK_TOPIC}" class="bookmark-link" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}" data-update-all=".bookmark-link">{S_BOOKMARK_TOPIC}</a>
</li>
<!-- ENDIF -->
<!-- IF U_BUMP_TOPIC --><li class="small-icon icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/theme/bidi.css b/phpBB/styles/prosilver/theme/bidi.css
index f3902b363d..bc9e4b3965 100644
--- a/phpBB/styles/prosilver/theme/bidi.css
+++ b/phpBB/styles/prosilver/theme/bidi.css
@@ -2,7 +2,7 @@
---------------------------------------- */
/**
-* common.css
+* common.css
*/
.rtl h1 {
margin-right: 0;
@@ -20,7 +20,7 @@
/* Main blocks
---------------------------------------- */
-.rtl #logo {
+.rtl .logo {
float: right;
padding: 10px 10px 0 13px;
}
@@ -59,20 +59,20 @@
/* Horizontal lists
----------------------------------------*/
-.rtl ul.linklist li {
+.rtl ul.linklist > li {
float: right;
margin-right: 0;
- margin-left: 5px;
+ margin-left: 7px;
}
-.rtl ul.linklist li.rightside, .rtl p.rightside {
+.rtl ul.linklist > li.rightside, .rtl p.rightside, .rtl a.rightside {
float: left;
- margin-right: 5px;
+ margin-right: 7px;
margin-left: 0;
text-align: left;
}
-.rtl ul.leftside li, .rtl ul.rightside li {
+.rtl ul.leftside > li, .rtl ul.rightside > li {
float: left;
}
@@ -92,11 +92,16 @@
/* Bulletin icons for list items
----------------------------------------*/
-.rtl ul.linklist.bulletin li:before {
+.rtl ul.linklist.bulletin > li:before {
padding-left: 4px;
padding-right: 0;
}
+.rtl ul.linklist li.responsive-menu a.responsive-menu-link:before {
+ left: auto;
+ right: 0;
+}
+
/* Dropdown menu
---------------------------------------- */
.rtl .dropdown-container.topic-tools {
@@ -112,6 +117,36 @@
padding-right: 10px;
}
+.rtl .dropdown-extended .header {
+ text-align: right;
+}
+
+.rtl .dropdown-extended .header .header_settings {
+ float: left;
+}
+
+/* Notifications
+----------------------------------------*/
+.rtl .notification_list ul li img {
+ float: right;
+ margin-left: 5px;
+ margin-right: 0;
+}
+
+.rtl .notification_list div.notifications {
+ margin-left: 0;
+ margin-right: 50px;
+}
+
+.rtl .notification_text {
+ margin-left: 0;
+ margin-right: 58px;
+}
+
+.rtl .notification_list p.notification-time {
+ text-align: left;
+}
+
/* Responsive breadcrumbs
----------------------------------------*/
.rtl .breadcrumbs .crumb {
@@ -154,7 +189,7 @@
/* Misc layout styles
---------------------------------------- */
-/* column[1-2] styles are containers for two column layouts
+/* column[1-2] styles are containers for two column layouts
Also see tweaks.css */
.rtl .column1 {
float: right;
@@ -250,12 +285,15 @@
text-align: left;
}
-.rtl .forabg {
- width: 99%; /* fix for IE6 */
+.rtl #quick-links {
+ margin-left: 7px;
+ margin-right: 0;
}
-.rtl .forumbg {
- width: 99%; /* fix for IE6 */
+.rtl .header-avatar span:after {
+ float: left;
+ padding-left: 0;
+ padding-right: 2px;
}
.rtl .member-search {
@@ -317,7 +355,7 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
.rtl ul.topiclist.missing-column dt {
margin-right: 0;
- margin-left: -330px;
+ margin-left: -345px;
}
.rtl ul.topiclist.two-long-columns dt {
@@ -350,10 +388,6 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
margin-left: 80px;
}
-.rtl ul.topiclist dl {
- position: static; /* fix for IE6 */
-}
-
.rtl ul.topiclist dd {
float: right;
border-right-width: 1px;
@@ -402,14 +436,10 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
}
.rtl dl.icon dt .list-inner {
- padding-left: 0;
+ padding-left: 5px;
padding-right: 45px; /* Space for folder icon */
}
-.rtl dl.icon dt { /* fix for topic row icon links */
- position: relative;
-}
-
.rtl dl a.icon-link { /* topic row icon links */
display: inline-block;
left: auto;
@@ -418,7 +448,7 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
margin-right: 2px;
}
-.rtl dd.lastpost span, .rtl ul.topiclist dd.info span, .rtl ul.topiclist dd.time span, .rtl dd.redirect span, .rtl dd.moderation span {
+.rtl dd.lastpost > span, .rtl ul.topiclist dd.info > span, .rtl ul.topiclist dd.time > span, .rtl dd.redirect > span, .rtl dd.moderation > span {
padding-left: 0;
padding-right: 5px;
}
@@ -598,7 +628,8 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
---------------------------------------- */
.rtl .small-icon {
background-position: 100% 50%;
- padding: 0 19px 0 0;
+ padding-left: 0;
+ padding-right: 19px;
}
.rtl ul.linklist li.small-icon {
@@ -619,6 +650,19 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
margin-right: 0;
}
+/* Poster contact icons
+ ----------------------------------------*/
+.rtl .contact-icons a {
+ border-left-width: 1px;
+ border-left-style: dotted;
+ border-right: none;
+ float: right;
+}
+
+.rtl .contact-icons .last-cell {
+ border-left: none;
+}
+
/**
* cp.css
*/
@@ -653,34 +697,63 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
/* CP tabbed menu
----------------------------------------*/
.rtl #tabs {
- margin: 20px 7px -1px 0;
+ margin-left: 0;
+ margin-right: 7px;
}
-.rtl #tabs a {
+.rtl #tabs .tab {
float: right;
}
-/*.rtl #tabs a span {
- float: right;
-}*/
+.rtl #tabs .tab > a {
+ margin-left: 1px;
+ margin-right: 0;
+}
/* Mini tabbed menu used in MCP
----------------------------------------*/
.rtl #minitabs {
+ float: left;
margin-right: 0;
margin-left: 7px;
}
-.rtl .tabs-container #minitabs {
+.rtl #minitabs .tab {
float: left;
}
-.rtl #minitabs li {
- float: left;
+.rtl #minitabs .tab > a {
margin-right: 2px;
margin-left: 0;
}
+/* Responsive tabs
+----------------------------------------*/
+.rtl #tabs .dropdown {
+ margin-left: -2px;
+}
+
+.rtl #tabs .dropdown li {
+ text-align: left;
+}
+
+.rtl #minitabs .dropdown {
+ margin-left: -4px;
+}
+
+.rtl #minitabs .dropdown li {
+ text-align: right;
+}
+
+/* Responsive *CP navigation
+----------------------------------------*/
+@media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
+{
+ .rtl #cp-menu, .rtl #navigation, .rtl #cp-main {
+ float: none;
+ }
+}
+
/* UCP navigation menu
----------------------------------------*/
@@ -731,6 +804,15 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
float: right;
}
+/* Responsive *CP navigation
+----------------------------------------*/
+@media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
+{
+ .rtl #cp-menu, .rtl #navigation, .rtl #cp-main {
+ float: none;
+ }
+}
+
/**
* forms.css
*/
@@ -878,10 +960,6 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
}
/* Former imageset */
-.rtl .imageset.site_logo {
- padding-right: 139px;
- padding-left: 0;
-}
.rtl .imageset.forum_link, .rtl .imageset.forum_read, .rtl .imageset.forum_read_locked, .rtl .imageset.forum_read_subforum, .rtl .imageset.forum_unread, .rtl .imageset.forum_unread_locked, .rtl .imageset.forum_unread_subforum, .rtl .imageset.topic_moved, .rtl .imageset.topic_read, .rtl .imageset.topic_read_mine, .rtl .imageset.topic_read_hot, .rtl .imageset.topic_read_hot_mine, .rtl .imageset.topic_read_locked, .rtl .imageset.topic_read_locked_mine, .rtl .imageset.topic_unread, .rtl .imageset.topic_unread_mine, .rtl .imageset.topic_unread_hot, .rtl .imageset.topic_unread_hot_mine, .rtl .imageset.topic_unread_locked, .rtl .imageset.topic_unread_locked_mine, .rtl .imageset.sticky_read, .rtl .imageset.sticky_read_mine, .rtl .imageset.sticky_read_locked, .rtl .imageset.sticky_read_locked_mine, .rtl .imageset.sticky_unread, .rtl .imageset.sticky_unread_mine, .rtl .imageset.sticky_unread_locked, .rtl .imageset.sticky_unread_locked_mine, .rtl .imageset.announce_read, .rtl .imageset.announce_read_mine, .rtl .imageset.announce_read_locked, .rtl .imageset.announce_read_locked_mine, .rtl .imageset.announce_unread, .rtl .imageset.announce_unread_mine, .rtl .imageset.announce_unread_locked, .rtl .imageset.announce_unread_locked_mine, .rtl .imageset.global_read, .rtl .imageset.global_read_mine, .rtl .imageset.global_read_locked, .rtl .imageset.global_read_locked_mine, .rtl .imageset.global_unread, .rtl .imageset.global_unread_mine, .rtl .imageset.global_unread_locked, .rtl .imageset.global_unread_locked_mine, .rtl .imageset.pm_read, .rtl .imageset.pm_unread {
padding-right: 27px;
padding-left: 0;
@@ -906,3 +984,104 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
padding-right: 16px;
padding-left: 0;
}
+
+/**
+* plupload.css
+*/
+
+.rtl .attach-controls {
+ float: left;
+}
+
+/**
+* responsive.css
+*/
+@media only screen and (max-width: 700px), only screen and (max-device-width: 700px)
+{
+ /* .topiclist lists
+ ----------------------------------------*/
+ .rtl ul.topiclist li.header dt, .rtl ul.topiclist li.header dt .list-inner {
+ margin-left: 0 !important;
+ padding-left: 0;
+ }
+
+ .rtl ul.topiclist dt, .rtl ul.topiclist dt .list-inner,
+ .rtl ul.topiclist.missing-column dt, .rtl ul.topiclist.missing-column dt .list-inner,
+ .rtl ul.topiclist.two-long-columns dt, .rtl ul.topiclist.two-long-columns dt .list-inner,
+ .rtl ul.topiclist.two-columns dt, .rtl ul.topiclist.two-columns dt .list-inner {
+ margin-left: 0;
+ }
+
+ .rtl ul.topiclist dt .list-inner.with-mark {
+ padding-left: 34px;
+ }
+
+ /* Forums and topics lists
+ ----------------------------------------*/
+ .rtl ul.topiclist.forums dt {
+ margin-left: -250px;
+ }
+ .rtl ul.topiclist.forums dt .list-inner {
+ margin-left: 250px;
+ }
+
+ .rtl ul.topiclist dd.mark {
+ left: 5px;
+ right: auto;
+ text-align: right;
+ }
+
+ @media only screen and (max-width: 550px), only screen and (max-device-width: 550px)
+ {
+ .rtl ul.topiclist.forums dt {
+ margin-left: 0;
+ }
+
+ .rtl ul.topiclist.forums dt .list-inner {
+ margin-left: 0;
+ }
+ }
+
+ .rtl table.responsive.show-header thead, .rtl table.responsive.show-header th:first-child {
+ text-align: right !important;
+ }
+
+ .rtl table.responsive td {
+ text-align: right !important;
+ }
+
+ /* User profile
+ ----------------------------------------*/
+ .rtl .column1, .rtl .column2, .rtl .left-box.profile-details {
+ float: none;
+ }
+
+ @media only screen and (max-width: 500px), only screen and (max-device-width: 500px)
+ {
+ .rtl dl.details dt, .rtl dl.details dd {
+ float: none;
+ text-align: right;
+ }
+
+ .rtl dl.details dd {
+ margin-left: 0;
+ margin-right: 20px;
+ }
+ }
+
+ /* Post
+ ----------------------------------------*/
+ .rtl .postprofile, .rtl .postbody, .rtl .search .postbody {
+ float: none;
+ }
+
+ .rtl .post .postprofile {
+ border-width: 0 0 1px 0;
+ }
+
+ .rtl .postprofile .avatar {
+ float: right;
+ margin-left: 5px;
+ margin-right: 0;
+ }
+}
diff --git a/phpBB/styles/prosilver/theme/buttons.css b/phpBB/styles/prosilver/theme/buttons.css
index 19cb547bd4..18c71d251e 100644
--- a/phpBB/styles/prosilver/theme/buttons.css
+++ b/phpBB/styles/prosilver/theme/buttons.css
@@ -21,8 +21,8 @@
vertical-align: bottom;
}
-.icon-button.dropdown-select {
- padding-right: 28px;
+.dropdown-select {
+ padding-right: 24px;
}
.icon-button:before {
@@ -35,6 +35,10 @@
width: 12px;
}
+.dropdown-select.icon-button:before {
+ margin-right: 4px;
+}
+
.dropdown-select:after {
background-position: -103px 10px;
border-left: 1px solid;
@@ -58,6 +62,10 @@
margin-right: 5px;
}
+#jumpbox .dropdown-select {
+ margin: 0;
+}
+
/* Big button images */
.reply-icon:before, .pmreply-icon:before { background-position: -20px 0; }
.reply-icon:hover:before, .pmreply-icon:hover:before { background-position: -20px -20px; }
@@ -73,7 +81,11 @@
.forwardpm-icon:before { background-position: -40px 0; }
.forwardpm-icon:hover:before { background-position: -40px -20px; }
-.tools-icon:before {
+.modtools-icon {
+ font-size: 0;
+}
+
+.tools-icon:before, .modtools-icon:before {
background-position: -80px 0;
height: 16px;
margin-top: 2px;
@@ -83,6 +95,10 @@
.dropdown-visible .tools-icon:before,
.nojs .dropdown-container:hover .tools-icon:before { background-position: -80px -20px; }
+.modtools-icon:before { background-position: -225px 0; }
+.dropdown-visible .modtools-icon:before,
+.nojs .dropdown-container:hover .modtools-icon:before { background-position: -225px -20px; }
+
/* Icon images
---------------------------------------- */
.small-icon {
@@ -96,7 +112,7 @@ ul.linklist li.small-icon {
padding-left: 0;
}
-ul.linklist.bulletin li.small-icon:before {
+ul.linklist.bulletin > li.small-icon:before {
display: none;
}
@@ -105,6 +121,7 @@ ul.linklist.bulletin li.small-icon:before {
.contact-icons.dropdown-contents {
min-width: 0;
padding: 0;
+ font-size: 0;
}
.contact-icon {
@@ -143,7 +160,7 @@ ul.linklist.bulletin li.small-icon:before {
.phpbb_website-icon { background-position: -40px 0; }
.phpbb_youtube-icon { background-position: -98px 0; }
.phpbb_facebook-icon { background-position: -119px 0; }
-.phpbb_google_plus-icon { background-position: -140px 0; }
+.phpbb_googleplus-icon { background-position: -140px 0; }
.phpbb_skype-icon { background-position: -161px 0; }
.phpbb_twitter-icon { background-position: -203px 0; }
.phpbb_yahoo-icon { background-position: -224px 0; }
@@ -156,7 +173,7 @@ ul.linklist.bulletin li.small-icon:before {
margin-top: 2px;
}
-.post-buttons li {
+.post-buttons > li {
float: left;
margin-right: 3px;
}
diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css
index 875e61020b..fce66f7efb 100644
--- a/phpBB/styles/prosilver/theme/colours.css
+++ b/phpBB/styles/prosilver/theme/colours.css
@@ -5,7 +5,7 @@ Colours and backgrounds for common.css
html, body {
color: #536482;
- background-color: #FFFFFF;
+ background-color: #F5F7FA;
}
h1 {
@@ -43,6 +43,11 @@ hr {
/* Round cornered boxes and backgrounds
---------------------------------------- */
+#wrap {
+ background-color: #FFF;
+ border-color: #E6E9ED;
+}
+
.headerbar {
background-color: #12A3EB;
background-image: url("./images/bg_header.gif");
@@ -106,7 +111,7 @@ table.zebra-list tr:nth-child(even) td, ul.zebra-list li:nth-child(even) {
----------------------------------------*/
ul.navlinks {
- border-bottom-color: #FFFFFF;
+ border-top-color: #FFFFFF;
}
/* Table styles
@@ -223,15 +228,15 @@ p.post-notice {
background-image: none;
}
-p.post-notice.deleted:before {
+p.post-notice.deleted:before {
background-image: url("./images/icon_topic_deleted.png");
}
-p.post-notice.unapproved:before {
+p.post-notice.unapproved:before {
background-image: url("./images/icon_topic_unapproved.gif");
}
-p.post-notice.reported:before, p.post-notice.error:before {
+p.post-notice.reported:before, p.post-notice.error:before {
background-image: url("./images/icon_topic_reported.gif");
}
@@ -241,16 +246,10 @@ Colours and backgrounds for links.css
-------------------------------------------------------------- */
a { color: #105289; }
-a:visited { color: #105289; }
a:hover { color: #D31141; }
-a:active { color: #368AD2; }
/* Links on gradient backgrounds */
-#search-box a:link, .navbg a:link, .forumbg .header a:link, .forabg .header a:link, th a:link {
- color: #FFFFFF;
-}
-
-#search-box a:visited, .navbg a:visited, .forumbg .header a:visited, .forabg .header a:visited, th a:visited {
+#search-box a, .navbg a, .forumbg .header a, .forabg .header a, th a {
color: #FFFFFF;
}
@@ -258,44 +257,11 @@ a:active { color: #368AD2; }
color: #A8D8FF;
}
-#search-box a:active, .navbg a:active, .forumbg .header a:active, .forabg .header a:active, th a:active {
- color: #C8E6FF;
-}
-
/* Notification mark read link */
.dropdown-extended a.mark_read {
background-color: #FFFFFF;
}
-/* Links for forum/topic lists */
-a.forumtitle {
- color: #105289;
-}
-
-/* a.forumtitle:visited { color: #105289; } */
-
-a.forumtitle:hover {
- color: #BC2A4D;
-}
-
-a.forumtitle:active {
- color: #105289;
-}
-
-a.topictitle {
- color: #105289;
-}
-
-/* a.topictitle:visited { color: #368AD2; } */
-
-a.topictitle:hover {
- color: #BC2A4D;
-}
-
-a.topictitle:active {
- color: #105289;
-}
-
/* Post body links */
.postlink {
color: #368AD2;
@@ -307,41 +273,15 @@ a.topictitle:active {
border-bottom-color: #5D8FBD;
}
-.postlink:active {
- color: #368AD2;
-}
-
.postlink:hover {
background-color: #D0E4F6;
color: #0D4473;
}
-.signature a, .signature a:visited, .signature a:hover, .signature a:active {
+.signature a, .signature a:hover {
background-color: transparent;
}
-/* Profile links */
-.postprofile a:link, .postprofile a:visited, .postprofile dt.author a {
- color: #105289;
-}
-
-.postprofile a:hover, .postprofile dt.author a:hover {
- color: #D31141;
-}
-
-.postprofile a:active {
- color: #105289;
-}
-
-/* Profile searchresults */
-.search .postprofile a {
- color: #105289;
-}
-
-.search .postprofile a:hover {
- color: #D31141;
-}
-
/* Back to top of page */
a.top {
background-image: url("./images/icon_back_top.gif");
@@ -369,7 +309,6 @@ a.arrow-right:hover {
color: #368AD2;
}
-
/*
--------------------------------------------------------------
Colours and backgrounds for content.css
@@ -658,7 +597,7 @@ dd.profile-warnings {
--------------------------------------------------------------
Colours and backgrounds for buttons.css
-------------------------------------------------------------- */
-.button, .button:visited {
+.button {
border-color: #C7C3BF;
background-color: #FFFFFF;
background-image: -moz-linear-gradient(top, #FFFFFF, #E9E9E9);
@@ -668,7 +607,11 @@ Colours and backgrounds for buttons.css
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFFFFF', EndColorStr='#E9E9E9')";
box-shadow: 0 0 0 1px #FFFFFF inset;
-webkit-box-shadow: 0 0 0 1px #FFFFFF inset;
- color: #BC2A4D;
+ color: #D31141;
+}
+
+.dropdown-select, .dropdown-select:visited {
+ color: #536482;
}
.button:hover, .dropdown-visible .dropdown-select, .nojs .dropdown-container:hover .dropdown-select {
@@ -694,24 +637,37 @@ Colours and backgrounds for buttons.css
/* Icon images
---------------------------------------- */
-.icon-faq { background-image: url("./images/icon_faq.gif"); }
-.icon-members { background-image: url("./images/icon_members.gif"); }
-.icon-home { background-image: url("./images/icon_home.gif"); }
-.icon-ucp { background-image: url("./images/icon_ucp.gif"); }
-.icon-register { background-image: url("./images/icon_register.gif"); }
-.icon-logout { background-image: url("./images/icon_logout.gif"); }
-.icon-bookmark { background-image: url("./images/icon_bookmark.gif"); }
-.icon-bump { background-image: url("./images/icon_bump.gif"); }
-.icon-subscribe { background-image: url("./images/icon_subscribe.gif"); }
-.icon-unsubscribe { background-image: url("./images/icon_unsubscribe.gif"); }
-.icon-pages { background-image: url("./images/icon_pages.gif"); }
+.icon-acp { background-image: url("./images/icon_acp.gif"); }
+.icon-bookmark { background-image: url("./images/icon_bookmark.gif"); }
+.icon-bump { background-image: url("./images/icon_bump.gif"); }
+.icon-contact { background-image: url("./images/icon_pm.gif"); }
+.icon-delete-cookies { background-image: url("./images/icon_delete_cookies.gif"); }
+.icon-download { background-image: url("./images/icon_download.gif"); }
+.icon-faq { background-image: url("./images/icon_faq.gif"); }
+.icon-home { background-image: url("./images/icon_home.gif"); }
+.icon-logout { background-image: url("./images/icon_logout.gif"); }
+.icon-mark { background-image: url("./images/icon_mark.gif"); }
+.icon-mcp { background-image: url("./images/icon_mcp.gif"); }
+.icon-members { background-image: url("./images/icon_members.gif"); }
+.icon-notification { background-image: url("./images/icon_notification.gif"); }
+.icon-pages { background-image: url("./images/icon_pages.gif"); }
+.icon-pm { background-image: url("./images/icon_pm.gif"); }
+.icon-print { background-image: url("./images/icon_print.gif"); }
+.icon-profile { background-image: url("./images/icon_profile.gif"); }
+.icon-quick-links { background-image: url("./images/icon_quick_links.gif"); }
+.icon-register { background-image: url("./images/icon_register.gif"); }
.icon-search, .responsive-search a { background-image: url("./images/icon_search.gif"); }
-.icon-notification { background-image: url("./images/icon_notification.gif"); }
-.icon-pm { background-image: url("./images/icon_pm.gif"); }
-.icon-download { background-image: url("./images/icon_download.gif"); }
-.icon-mark { background-image: url("./images/icon_mark.gif"); }
-.icon-sendemail { background-image: url("./images/icon_sendemail.gif"); }
-.icon-print { background-image: url("./images/icon_print.gif"); }
+.icon-search-active { background-image: url("./images/subforum_read.gif"); }
+.icon-search-advanced { background-image: url("./images/icon_search_adv.gif"); }
+.icon-search-new { background-image: url("./images/subforum_unread.gif"); }
+.icon-search-self { background-image: url("./images/icon_topic_latest.gif"); }
+.icon-search-unanswered { background-image: url("./images/icon_post_target.gif"); }
+.icon-search-unread { background-image: url("./images/subforum_unread.gif"); }
+.icon-sendemail { background-image: url("./images/icon_sendemail.gif"); }
+.icon-subscribe { background-image: url("./images/icon_subscribe.gif"); }
+.icon-team { background-image: url("./images/icon_team.gif"); }
+.icon-ucp { background-image: url("./images/icon_ucp.gif"); }
+.icon-unsubscribe { background-image: url("./images/icon_unsubscribe.gif"); }
/* Profile & navigation icons */
.contact-icon { background-image: url("./images/icons_contact.png"); }
@@ -807,53 +763,55 @@ ul.cplist {
/* CP tabbed menu
----------------------------------------*/
-#tabs a {
- background-image: url("./images/bg_tabs1.gif");
-}
-
-#tabs a span {
- background-image: url("./images/bg_tabs2.gif");
+#tabs .tab > a {
+ background: #BACCD9;
color: #536482;
}
-#tabs a:hover span {
- color: #BC2A4D;
-}
-
-#tabs .activetab a {
- border-bottom-color: #CADCEB;
+#tabs .tab > a:hover {
+ background: #DDEDFB;
+ color: #D31141;
}
-#tabs .activetab a span {
+#tabs .activetab > a,
+#tabs .activetab > a:hover {
+ background: #CADCEB;
+ background: -moz-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #E2F2FF), color-stop(100%, #CADCEB));
+ background: -webkit-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
+ background: -o-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
+ background: -ms-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
+ background: linear-gradient(to bottom, #E2F2FF 0%, #CADCEB 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#E2F2FF', endColorstr='#CADCEB', GradientType=0 );
+ border-color: #CADCEB;
+ box-shadow: 0 1px 1px #F2F9FF inset;
color: #333333;
}
-#tabs .activetab a:hover span {
+#tabs .activetab > a:hover {
color: #000000;
}
/* Mini tabbed menu used in MCP
----------------------------------------*/
-#minitabs li {
+#minitabs .tab > a {
background-color: #E1EBF2;
}
-#minitabs li.activetab {
+#minitabs .activetab > a,
+#minitabs .activetab > a:hover {
background-color: #F9F9F9;
-}
-
-#minitabs li.activetab a span, #minitabs li.activetab a:hover span {
color: #333333;
}
/* Responsive tabs
----------------------------------------*/
-.responsive-tab .responsive-tab-link span:before {
+.responsive-tab .responsive-tab-link:before {
border-color: #536482;
}
-.responsive-tab .responsive-tab-link:hover span:before {
- border-color: #BC2A4D;
+.responsive-tab .responsive-tab-link:hover:before {
+ border-color: #D31141;
}
/* UCP navigation menu
@@ -862,35 +820,47 @@ ul.cplist {
/* Link styles for the sub-section links */
#navigation a {
color: #333;
- background-color: #B2C2CF;
- background-image: url("./images/bg_menu.gif");
+ background: #B4C4D1;
+ background: -moz-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
+ background: -webkit-gradient(left top, right top, color-stop(50%, #B4C4D1), color-stop(100%, #CADCEB));
+ background: -webkit-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
+ background: -o-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
+ background: -ms-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
+ background: linear-gradient(to right, #B4C4D1 50%, #CADCEB 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#B4C4D1', endColorstr='#CADCEB', GradientType=1 );
}
.rtl #navigation a {
- background-image: url("./images/bg_menu_rtl.gif");
- background-position: 0 100%;
+ background: #B4C4D1;
+ background: -moz-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
+ background: -webkit-gradient(left top, right top, color-stop(0%, #CADCEB), color-stop(50%, #B4C4D1));
+ background: -webkit-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
+ background: -o-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
+ background: -ms-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
+ background: linear-gradient(to right, #CADCEB 0%, #B4C4D1 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#CADCEB', endColorstr='#B4C4D1', GradientType=1 );
}
#navigation a:hover {
- background-image: none;
- background-color: #aabac6;
+ background: #AABAC6;
color: #BC2A4D;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
#navigation #active-subsection a {
+ background: #F9F9F9;
color: #D31141;
- background-color: #F9F9F9;
- background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
#navigation #active-subsection a:hover {
color: #D31141;
}
-@media only screen and (max-width: 700px), only screen and (max-device-width: 700px)
+@media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
{
#navigation a, .rtl #navigation a {
- background-image: none;
+ background: #B2C2CF;
}
}
@@ -1065,7 +1035,7 @@ a.button2, input.button2, input.button3 {
}
/* <a> button in the style of the form buttons */
-a.button1, a.button1:link, a.button1:visited, a.button1:active, a.button2, a.button2:link, a.button2:visited, a.button2:active {
+a.button1, a.button2 {
color: #000000;
}
@@ -1108,7 +1078,7 @@ input.disabled {
}
.dropdown-extended ul li {
- border-bottom-color: #B9B9B9;
+ border-top-color: #B9B9B9;
}
.dropdown-extended ul li:hover {
@@ -1144,7 +1114,7 @@ input.disabled {
border-color: #FFF transparent;
}
-.dropdown-extended .pointer-inner, #minitabs .pointer-inner {
+.dropdown-extended .pointer-inner {
border-color: #F1F8FF transparent;
}
@@ -1170,6 +1140,17 @@ ul.linklist li.responsive-menu a.responsive-menu-link:hover:before, ul.linklist
border-color: #DCDCDC;
}
-#minitabs .dropdown-contents {
- background-color: #F1F8FF;
+.dropdown li.separator {
+ border-color: #DCDCDC;
+}
+
+/* Notifications
+---------------------------------------- */
+
+.notification_list p.notification-time {
+ color: #4C5D77;
+}
+
+li.notification-reported strong, li.notification-disapproved strong {
+ color: #D31141;
}
diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css
index aa28cd6962..e33bf99965 100644
--- a/phpBB/styles/prosilver/theme/common.css
+++ b/phpBB/styles/prosilver/theme/common.css
@@ -175,8 +175,18 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
/* Main blocks
---------------------------------------- */
#wrap {
- padding: 0 20px;
- min-width: 650px;
+ border: 1px solid transparent;
+ border-radius: 8px;
+ margin: 0 auto;
+ max-width: 1152px;
+ min-width: 625px;
+ padding: 15px;
+}
+
+@media only screen and (max-width: 1220px), only screen and (max-device-width: 1220px) {
+ #wrap {
+ margin: 0 12px;
+ }
}
#simple-wrap {
@@ -196,13 +206,13 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
margin-top: 20px;
}
-#logo {
+.logo {
float: left;
width: auto;
padding: 10px 13px 0 10px;
}
-a#logo:hover {
+.logo:hover {
text-decoration: none;
}
@@ -261,7 +271,7 @@ a#logo:hover {
}
.navbar {
- padding: 5px 10px 5px 10px;
+ padding: 3px 10px;
border-radius: 7px;
}
@@ -307,6 +317,10 @@ a#logo:hover {
/* Horizontal lists
----------------------------------------*/
+.navbar ul.linklist {
+ padding: 2px 0;
+}
+
ul.linklist {
display: block;
margin: 0;
@@ -322,29 +336,25 @@ ul.linklist:after {
padding: 5px 10px;
}
-ul.linklist li {
- display: block;
- list-style-type: none;
+ul.linklist > li {
float: left;
- width: auto;
- margin-right: 5px;
font-size: 1.1em;
line-height: 2.2em;
+ list-style-type: none;
+ margin-right: 7px;
padding-top: 1px;
+ width: auto;
}
-ul.linklist li.rightside, p.rightside {
+ul.linklist > li.rightside, p.rightside, a.rightside {
float: right;
margin-right: 0;
- margin-left: 5px;
+ margin-left: 7px;
text-align: right;
}
ul.navlinks {
- padding-bottom: 1px;
- margin-bottom: 1px;
- border-bottom: 1px solid transparent;
- font-weight: bold;
+ border-top: 1px solid transparent;
}
ul.leftside {
@@ -372,7 +382,7 @@ ul.linklist li.responsive-menu a.responsive-menu-link {
font-size: 16px;
position: relative;
width: 16px;
- line-height: 16.5px;
+ line-height: 20px;
text-decoration: none;
}
@@ -403,27 +413,18 @@ li.responsive-menu.dropdown-left .dropdown {
right: -6px;
}
-li.responsive-menu .dropdown .dropdown-contents {
- padding: 0 5px;
-}
-
-ul.linklist .dropdown-down .dropdown {
+ul.linklist .dropdown {
top: 22px;
}
ul.linklist .dropdown-up .dropdown {
bottom: 18px;
+ top: auto;
}
-ul.linklist .dropdown li {
- clear: both;
-}
-
-
-
/* Bulletin icons for list items
----------------------------------------*/
-ul.linklist.bulletin li:before {
+ul.linklist.bulletin > li:before {
display: inline-block;
content: "\2022";
font-size: inherit;
@@ -431,11 +432,12 @@ ul.linklist.bulletin li:before {
padding-right: 4px;
}
-ul.linklist.bulletin li:first-child:before, ul.linklist.bulletin li.rightside:last-child:before {
+ul.linklist.bulletin > li:first-child:before,
+ul.linklist.bulletin > li.rightside:last-child:before {
content: none;
}
-ul.linklist.bulletin li.no-bulletin:before {
+ul.linklist.bulletin > li.no-bulletin:before {
content: none;
}
@@ -443,20 +445,46 @@ ul.linklist.bulletin li.no-bulletin:before {
display: none !important;
}
-/* Avatar in overall_header.html */
+/* Profile in overall_header.html */
+.header-profile {
+ display: inline-block;
+ vertical-align: top;
+}
+
+.header-avatar:hover {
+ text-decoration: none;
+}
+
.header-avatar img {
margin-bottom: 2px;
- max-height: 25px;
+ max-height: 20px;
vertical-align: middle;
width: auto;
}
+.header-avatar span:after {
+ content: '\25BC';
+ display: inline-block;
+ font-size: 9px;
+ float: right;
+ padding-left: 2px;
+ opacity: 0.7;
+}
+
/* Dropdown menu
----------------------------------------*/
.dropdown-container {
position: relative;
}
+.dropdown-container-right {
+ float: right;
+}
+
+.dropdown-container-left {
+ float: left;
+}
+
.nojs .dropdown-container:hover .dropdown {
display: block !important;
}
@@ -556,14 +584,14 @@ ul.linklist.bulletin li.no-bulletin:before {
padding: 5px;
position: relative;
min-width: 40px;
- max-height: 200px;
+ max-height: 300px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.dropdown li {
- border-bottom: 1px dotted transparent;
+ border-top: 1px dotted transparent;
float: none !important;
line-height: normal !important;
font-size: 1em !important;
@@ -575,8 +603,16 @@ ul.linklist.bulletin li.no-bulletin:before {
text-align: left;
}
-.dropdown li:last-child, .dropdown li li {
- border-bottom: 0;
+.dropdown-contents > li {
+ padding-right: 15px;
+}
+
+.dropdown-nonscroll > li {
+ padding-right: 0;
+}
+
+.dropdown li:first-child, .dropdown li.separator + li, .dropdown li li {
+ border-top: 0;
}
.dropdown li li:first-child {
@@ -596,7 +632,13 @@ ul.linklist.bulletin li.no-bulletin:before {
white-space: normal;
}
-.dropdown li:before, .dropdown li:after {
+.dropdown li.separator {
+ border-top: 1px solid transparent;
+ margin: 4px 0;
+ padding: 0;
+}
+
+.dropdown li.separator:first-child, .dropdown li.separator:last-child {
display: none !important;
}
@@ -604,6 +646,7 @@ ul.linklist.bulletin li.no-bulletin:before {
----------------------------------------*/
.breadcrumbs .crumb {
float: left;
+ font-weight: bold;
word-wrap: normal;
}
@@ -809,6 +852,10 @@ fieldset.fields1 dl.pmlist dd.recipients {
margin: 4px 0;
}
+.forabg + .action-bar {
+ margin-top: 2em;
+}
+
.action-bar:after {
clear: both;
content: '';
@@ -912,14 +959,14 @@ fieldset.fields1 dl.pmlist dd.recipients {
.phpbb_alert {
border: 1px solid transparent;
display: none;
- left: 0;
+ left: 0;
padding: 0 25px 20px 25px;
position: fixed;
- right: 0;
+ right: 0;
top: 150px;
z-index: 50;
width: 620px;
- margin: 0 auto;
+ margin: 0 auto;
}
@media only screen and (max-height: 500px), only screen and (max-device-width: 500px)
@@ -1062,6 +1109,14 @@ form > p.post-notice strong {
line-height: 20px;
}
+#jumpbox {
+ margin: 5px 0;
+}
+
+.stat-block {
+ clear: both;
+}
+
#top {
position: absolute;
top: -20px;
@@ -1099,11 +1154,7 @@ form > p.post-notice strong {
.dropdown-extended {
display: none;
- position: absolute;
- left: 0;
- width: 330px;
z-index: 1;
- top: 22px;
}
.dropdown-extended ul {
@@ -1115,26 +1166,32 @@ form > p.post-notice strong {
.dropdown-extended ul li {
padding: 0;
- margin: 0;
+ margin: 0 !important;
float: none;
- border-bottom: 1px solid;
+ border-top: 1px solid;
list-style-type: none;
font-size: 0.95em;
clear: both;
position: relative;
}
-.dropdown-extended ul li.no_notifications {
- padding: 10px;
+.dropdown-extended ul li:first-child {
+ border-top: none;
}
-.dropdown-extended ul li:before, .dropdown-extended ul li:after {
- display: none;
+.dropdown-extended ul li.no_notifications {
+ padding: 10px;
}
.dropdown-extended .dropdown-contents {
max-height: none;
padding: 0;
+ position: absolute;
+ width: 340px;
+}
+
+.nojs .dropdown-extended .dropdown-contents {
+ position: relative;
}
.dropdown-extended .header {
@@ -1142,8 +1199,9 @@ form > p.post-notice strong {
font-family: Arial, "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 11px;
font-weight: bold;
+ text-align: left;
text-shadow: 1px 1px 1px white;
- text-transform: uppercase;
+ text-transform: uppercase;
line-height: 30px;
border-bottom: 1px solid;
border-radius: 5px 5px 0 0;
@@ -1160,8 +1218,8 @@ form > p.post-notice strong {
font-size: 1.1em;
}
-.dropdown-extended ul li a{
- padding: 10px;
+.dropdown-extended ul li a, .dropdown-extended ul li.no-url {
+ padding: 8px;
}
.dropdown-extended .footer > a {
@@ -1176,28 +1234,55 @@ form > p.post-notice strong {
.notification_list ul li img {
float: left;
max-height: 50px;
+ max-width: 50px;
width: auto !important;
height: auto !important;
margin-right: 5px;
}
.notification_list ul li p {
- margin: 0;
+ margin-bottom: 4px;
font-size: 1em;
}
+.notification_list p.notification-reference,
+.notification_list p.notification-location,
+.notification_list li a p.notification-reason {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.notification_list p.notification-time {
+ font-size: 10px;
+ margin: 0;
+ text-align: right;
+}
+
.notification_list div.notifications {
+ margin-left: 50px;
padding: 5px;
}
+.notification_list div.notifications a {
+ display: block;
+}
+
.notification_list p.notifications_title {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
font-size: 13px !important;
+}
+
+.notification_list p.notifications_title strong {
font-weight: bold;
}
.notification_list p.notifications_time {
- font-size: 11px !important;
+ font-size: 10px !important;
+}
+
+.notification_text {
+ margin-left: 58px;
}
.notification_text:after {
@@ -1206,6 +1291,30 @@ form > p.post-notice strong {
display: block;
}
+/* Navbar specific list items
+----------------------------------------*/
+
+#quick-links {
+ margin: 0 7px 0 0;
+}
+
+#quick-links a.responsive-menu-link {
+ display: block;
+ font-size: inherit;
+ line-height: inherit;
+ margin: 0;
+ width: auto;
+}
+
+#quick-links a.responsive-menu-link:before {
+ font-size: 16px;
+ line-height: 16.5px;
+}
+
+.compact #quick-links a.responsive-menu-link {
+ font-size: 0;
+}
+
.compact .icon-notification > a > span, .compact .icon-pm > a > span {
display: none;
}
@@ -1225,3 +1334,19 @@ form > p.post-notice strong {
.dropdown-page-jump input.tiny {
width: 50px;
}
+
+.dropdown .clone {
+ display: none;
+}
+
+.responsive .dropdown .clone {
+ display: inherit;
+}
+
+.dropdown .clone + li.separator {
+ display: none;
+}
+
+.responsive .dropdown .clone + li.separator {
+ display: inherit;
+}
diff --git a/phpBB/styles/prosilver/theme/content.css b/phpBB/styles/prosilver/theme/content.css
index 9d87d3217f..a014f57d47 100644
--- a/phpBB/styles/prosilver/theme/content.css
+++ b/phpBB/styles/prosilver/theme/content.css
@@ -210,7 +210,7 @@ dd.time {
line-height: 200%;
}
-dd.lastpost span, ul.topiclist dd.info span, ul.topiclist dd.time span, dd.redirect span, dd.moderation span {
+dd.lastpost > span, ul.topiclist dd.info > span, ul.topiclist dd.time > span, dd.redirect > span, dd.moderation > span {
display: block;
padding-left: 5px;
}
@@ -267,7 +267,7 @@ dd.option {
}
.postbody img.postimage {
- max-width: 99%;
+ max-width: 100%;
}
.search .postbody {
@@ -351,10 +351,6 @@ dd.option {
line-height: 1.4em;
}
-span.corners-top, span.corners-bottom {
- display: none;
-}
-
dl.faq {
font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
font-size: 1.1em;
@@ -462,7 +458,7 @@ blockquote {
blockquote blockquote {
/* Nested quotes */
font-size: 1em;
- margin: 0.5em 1px 0 15px;
+ margin: 0.5em 1px 0 15px;
}
blockquote cite {
@@ -519,7 +515,7 @@ blockquote .codebox {
----------------------------------------*/
.attachbox {
float: left;
- width: auto;
+ width: auto;
max-width: 100%;
margin: 5px 5px 5px 0;
padding: 6px;
@@ -596,12 +592,13 @@ dl.file dt {
dl.file dd {
margin: 0;
- padding: 0;
+ padding: 0;
}
dl.thumbnail img {
padding: 3px;
border: 1px solid transparent;
+ box-sizing: border-box;
}
dl.thumbnail dd {
@@ -734,14 +731,16 @@ dd.profile-contact {
.profile-contact .dropdown-container {
display: inline-block;
- text-align: left;
- width: 30px;
}
.profile-contact .icon_contact {
vertical-align: middle;
}
+.profile-contact .dropdown {
+ margin-right: -14px;
+}
+
.online {
background-image: none;
background-position: 100% 0;
@@ -801,6 +800,10 @@ div.dl_links {
white-space: nowrap;
}
+table.fixed-width-table {
+ table-layout: fixed;
+}
+
/* Show scrollbars for items with overflow on iOS devices
----------------------------------------*/
.postbody .content::-webkit-scrollbar, #topicreview::-webkit-scrollbar, #post_details::-webkit-scrollbar, .codebox code::-webkit-scrollbar, .attachbox dd::-webkit-scrollbar, .attach-image::-webkit-scrollbar, .dropdown-extended ul::-webkit-scrollbar {
diff --git a/phpBB/styles/prosilver/theme/cp.css b/phpBB/styles/prosilver/theme/cp.css
index 452c2c625e..5149a16ec9 100644
--- a/phpBB/styles/prosilver/theme/cp.css
+++ b/phpBB/styles/prosilver/theme/cp.css
@@ -97,117 +97,82 @@ ul.cplist {
}
.tabs-container:after {
- display: block;
clear: both;
content: '';
+ display: block;
}
-/* CP tabbed menu
+/* CP tabs shared
----------------------------------------*/
-#tabs {
+#tabs, #minitabs {
line-height: normal;
- margin: 20px 0 -1px 7px;
- *overflow: hidden;
}
-#tabs ul {
- margin:0;
- padding: 0;
+#tabs > ul, #minitabs > ul {
list-style: none;
+ margin: 0;
+ padding: 0;
+ position: relative;
}
-#tabs ul:after {
+#tabs > ul:after, #minitabs > ul:after {
+ clear: both;
content: '';
display: block;
- clear: both;
}
-#tabs li {
- display: inline;
- margin: 0;
- padding: 0;
+#tabs .tab, #minitabs .tab {
+ display: inline-block;
+ float: left;
font-size: 1em;
font-weight: bold;
+ line-height: 14px;
}
-#tabs a {
- float: left;
- background: none no-repeat 0% -35px;
- margin: 0 1px 0 0;
- padding: 0 0 0 5px;
- text-decoration: none;
+#tabs .tab > a, #minitabs .tab > a {
+ display: block;
+ padding: 5px 9px;
position: relative;
+ text-decoration: none;
+ white-space: nowrap;
cursor: pointer;
}
-#tabs a span {
- float: left;
- display: block;
- background: none no-repeat 100% -35px;
- padding: 6px 10px 6px 5px;
- white-space: nowrap;
+/* CP tabbed menu
+----------------------------------------*/
+#tabs {
+ margin: 20px 0 0 7px;
}
-#tabs .activetab a {
- background-position: 0 0;
- border-bottom: 1px solid transparent;
+#tabs .tab > a {
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0;
+ margin: 1px 1px 0 0;
}
-#tabs .activetab a span {
- background-position: 100% 0;
+#tabs .activetab > a {
+ margin-top: 0;
padding-bottom: 7px;
}
-#tabs a:hover {
- background-position: 0 -70px;
-}
-
-#tabs a:hover span {
- background-position:100% -70px;
-}
-
-#tabs .activetab a:hover {
- background-position: 0 0;
-}
-
-#tabs .activetab a:hover span {
- background-position: 100% 0;
-}
-
/* Mini tabbed menu used in MCP
----------------------------------------*/
#minitabs {
- line-height: normal;
- margin: -20px 7px 0 0;
-}
-
-.tabs-container #minitabs {
float: right;
- margin-top: 19px;
+ margin: 15px 7px 0 0;
max-width: 50%;
}
-#minitabs ul {
- margin:0;
- padding: 0;
- list-style: none;
-}
-
-#minitabs li {
- display: block;
+#minitabs .tab {
float: right;
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
- padding: 5px 10px 4px 10px;
- font-size: 1em;
- font-weight: bold;
- margin-left: 2px;
}
-#minitabs a {
+#minitabs .tab > a {
+ border-radius: 5px 5px 0 0;
+ margin-left: 2px;
}
-#minitabs a:hover {
+#minitabs .tab > a:hover {
text-decoration: none;
}
@@ -217,8 +182,8 @@ ul.cplist {
position: relative;
}
-.responsive-tab .responsive-tab-link span {
- display: inline-block;
+.responsive-tab > a.responsive-tab-link {
+ display: block;
font-size: 16px;
position: relative;
width: 16px;
@@ -226,80 +191,41 @@ ul.cplist {
text-decoration: none;
}
-#minitabs .responsive-tab .responsive-tab-link span {
- display: block;
-}
-
-.responsive-tab .responsive-tab-link span:before {
+.responsive-tab .responsive-tab-link:before {
content: '';
position: absolute;
- left: 5px;
- top: 8px;
+ left: 10px;
+ top: 7px;
height: .125em;
width: 14px;
border-bottom: 0.125em solid transparent;
border-top: 0.375em double transparent;
}
-#minitabs .responsive-tab .responsive-tab-link span:before {
- left: 0;
- top: 2px;
-}
-
-#tabs ul, #minitabs ul {
- position: relative;
-}
-
#tabs .dropdown, #minitabs .dropdown {
- top: 29px;
- margin-right: -1px;
+ top: 20px;
+ margin-right: -2px;
+ font-size: 1.1em;
+ font-weight: normal;
}
#minitabs .dropdown {
- top: 18px;
+ margin-right: -4px;
}
#tabs .dropdown-up .dropdown, #minitabs .dropdown-up .dropdown {
- bottom: -5px;
+ bottom: 20px;
top: auto;
}
-#minitabs .dropdown-up .dropdown {
- bottom: 18px;
-}
-
-#tabs .dropdown-right .dropdown, #minitabs .dropdown-right .dropdown {
- margin-left: -41px;
-}
-
-#tabs .dropdown li, #minitabs .dropdown li {
- display: block !important;
- background: transparent none;
- padding: 0;
-}
-
-.tabs-container #minitabs .dropdown a span {
- display: block;
-}
-
-#tabs .dropdown a, #tabs .dropdown a span, #minitabs .dropdown a, #minitabs .dropdown a span {
- background: transparent;
- float: none;
- margin: 0;
- padding: 0;
+#tabs .dropdown li {
text-align: right;
}
-.tabs-container #minitabs .dropdown a span {
+#minitabs .dropdown li {
text-align: left;
}
-#tabs .dropdown a span, #minitabs .dropdown a span {
- padding: 5px 8px;
- color: inherit !important;
-}
-
-
/* UCP navigation menu
----------------------------------------*/
/* Container for sub-navigation list */
@@ -309,15 +235,15 @@ ul.cplist {
}
#navigation ul {
- list-style:none;
+ list-style: none;
}
/* Default list state */
#navigation li {
+ display: inline;
+ font-weight: bold;
margin: 1px 0;
padding: 0;
- font-weight: bold;
- display: inline;
}
/* Link styles for the sub-section links */
@@ -326,18 +252,10 @@ ul.cplist {
padding: 5px;
margin: 1px 0;
text-decoration: none;
- font-weight: bold;
- background: transparent none repeat-y 100% 0;
}
#navigation a:hover {
text-decoration: none;
- background-image: none;
-}
-
-#navigation #active-subsection a {
- display: block;
- background-image: none;
}
/* Preferences pane layout
@@ -403,7 +321,7 @@ ol.def-rules li {
border-right-color: transparent;
}
-.pmlist li.pm_marked_colour, .pm_marked_colour,
+.pmlist li.pm_marked_colour, .pm_marked_colour,
.pmlist li.pm_replied_colour, .pm_replied_colour,
.pmlist li.pm_friend_colour, .pm_friend_colour,
.pmlist li.pm_foe_colour, .pm_foe_colour {
@@ -436,7 +354,7 @@ ol.def-rules li {
@media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
{
.nojs #tabs a span, .nojs #minitabs a span {
- max-width: 40px;
+ max-width: 40px;
overflow: hidden;
text-overflow: ellipsis;
letter-spacing: -.5px;
@@ -448,8 +366,8 @@ ol.def-rules li {
margin: 0;
}
- #navigation {
- padding: 0;
+ #navigation {
+ padding: 0;
margin: 0 auto;
max-width: 320px;
}
diff --git a/phpBB/styles/prosilver/theme/forms.css b/phpBB/styles/prosilver/theme/forms.css
index 0c0a3e5ca9..f0effa01c4 100644
--- a/phpBB/styles/prosilver/theme/forms.css
+++ b/phpBB/styles/prosilver/theme/forms.css
@@ -68,7 +68,7 @@ fieldset dl {
}
fieldset dt {
- float: left;
+ float: left;
width: 40%;
text-align: left;
display: block;
@@ -201,24 +201,6 @@ fieldset.forum-selection2 {
float: right;
}
-/* Jumpbox */
-fieldset.jumpbox {
- text-align: right;
- margin-top: 15px;
- min-height: 2.5em;
-}
-
-fieldset.jumpbox select {
- max-width: 50%;
-}
-
-fieldset.quickmod {
- width: 50%;
- float: right;
- text-align: right;
- height: 2.5em;
-}
-
/* Submit button fieldset */
fieldset.submit-buttons {
text-align: center;
@@ -294,6 +276,10 @@ textarea.inputbox {
width: auto !important;
}
+input[type="number"] {
+ -moz-padding-end: inherit;
+}
+
input[type="search"] {
-webkit-appearance: textfield;
-webkit-box-sizing: content-box;
@@ -331,8 +317,8 @@ input.button3 {
font-variant: small-caps;
}
-input[type="button"], input[type="submit"], input[type="reset"], input[type="checkbox"], input[type="radio"] {
- cursor: pointer;
+input[type="button"], input[type="submit"], input[type="reset"], input[type="checkbox"], input[type="radio"] {
+ cursor: pointer;
}
/* Alternative button */
diff --git a/phpBB/styles/prosilver/theme/images/bg_menu.gif b/phpBB/styles/prosilver/theme/images/bg_menu.gif
deleted file mode 100644
index 4a9f5a9174..0000000000
--- a/phpBB/styles/prosilver/theme/images/bg_menu.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/bg_menu_rtl.gif b/phpBB/styles/prosilver/theme/images/bg_menu_rtl.gif
deleted file mode 100644
index 10add09a17..0000000000
--- a/phpBB/styles/prosilver/theme/images/bg_menu_rtl.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/bg_tabs1.gif b/phpBB/styles/prosilver/theme/images/bg_tabs1.gif
deleted file mode 100644
index 335a72c711..0000000000
--- a/phpBB/styles/prosilver/theme/images/bg_tabs1.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/bg_tabs2.gif b/phpBB/styles/prosilver/theme/images/bg_tabs2.gif
deleted file mode 100644
index a2142d5432..0000000000
--- a/phpBB/styles/prosilver/theme/images/bg_tabs2.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/corners_left2.gif b/phpBB/styles/prosilver/theme/images/corners_left2.gif
deleted file mode 100644
index fa27ce3ba2..0000000000
--- a/phpBB/styles/prosilver/theme/images/corners_left2.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/corners_right2.gif b/phpBB/styles/prosilver/theme/images/corners_right2.gif
deleted file mode 100644
index 2d689446ee..0000000000
--- a/phpBB/styles/prosilver/theme/images/corners_right2.gif
+++ /dev/null
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icon_acp.gif b/phpBB/styles/prosilver/theme/images/icon_acp.gif
new file mode 100644
index 0000000000..3afa98ee8f
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/icon_acp.gif
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icon_delete_cookies.gif b/phpBB/styles/prosilver/theme/images/icon_delete_cookies.gif
new file mode 100644
index 0000000000..f7665ebff8
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/icon_delete_cookies.gif
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icon_mcp.gif b/phpBB/styles/prosilver/theme/images/icon_mcp.gif
new file mode 100644
index 0000000000..80de2e53f7
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/icon_mcp.gif
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icon_profile.gif b/phpBB/styles/prosilver/theme/images/icon_profile.gif
new file mode 100644
index 0000000000..a0ec098460
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/icon_profile.gif
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icon_team.gif b/phpBB/styles/prosilver/theme/images/icon_team.gif
new file mode 100644
index 0000000000..613158257b
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/icon_team.gif
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icons_button.png b/phpBB/styles/prosilver/theme/images/icons_button.png
index a45a0cc2ba..da9ae6f1b4 100644
--- a/phpBB/styles/prosilver/theme/images/icons_button.png
+++ b/phpBB/styles/prosilver/theme/images/icons_button.png
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/links.css b/phpBB/styles/prosilver/theme/links.css
index 86cdf9c10e..890f854baa 100644
--- a/phpBB/styles/prosilver/theme/links.css
+++ b/phpBB/styles/prosilver/theme/links.css
@@ -5,19 +5,10 @@
a {
direction: ltr;
unicode-bidi: embed;
-}
-
-a:link, a:visited {
text-decoration: none;
}
-a:hover {
- text-decoration: underline;
-}
-
-a:active {
- text-decoration: none;
-}
+a:hover { text-decoration: underline; }
/* Coloured usernames */
.username-coloured {
@@ -27,11 +18,7 @@ a:active {
}
/* Links on gradient backgrounds */
-#search-box a:link, .navbg a:link, .forumbg .header a:link, .forabg .header a:link, th a:link {
- text-decoration: none;
-}
-
-#search-box a:visited, .navbg a:visited, .forumbg .header a:visited, .forabg .header a:visited, th a:visited {
+#search-box a, .navbg a, .forumbg .header a, .forabg .header a, th a {
text-decoration: none;
}
@@ -39,10 +26,6 @@ a:active {
text-decoration: underline;
}
-#search-box a:active, .navbg a:active, .forumbg .header a:active, .forabg .header a:active, th a:active {
- text-decoration: none;
-}
-
/* Navigation bar links */
ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
display: inline-block;
@@ -62,6 +45,9 @@ ul.linklist li.small-icon > a, ul.linklist li.breadcrumbs span:first-child > a {
top: 50%;
width: 30px;
height: 40px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
}
.dropdown-extended li:hover a.mark_read {
@@ -115,13 +101,13 @@ a.lastsubject:hover {
text-decoration: none;
}
-.signature a, .signature a:visited, .signature a:hover, .signature a:active {
+.signature a, .signature a:hover {
border: none;
text-decoration: underline;
}
/* Profile links */
-.postprofile a:link, .postprofile a:visited, .postprofile dt.author a {
+.postprofile a, .postprofile dt.author a {
font-weight: bold;
text-decoration: none;
}
@@ -130,22 +116,14 @@ a.lastsubject:hover {
text-decoration: underline;
}
-/* CSS spec requires a:link, a:visited, a:hover and a:active rules to be specified in this order. */
-/* See http://www.phpbb.com/bugs/phpbb3/59685 */
-.postprofile a:active {
- font-weight: bold;
- text-decoration: none;
-}
-
-
-/* Profile searchresults */
+/* Profile searchresults */
.search .postprofile a {
- text-decoration: none;
+ text-decoration: none;
font-weight: normal;
}
.search .postprofile a:hover {
- text-decoration: underline;
+ text-decoration: underline;
}
/* Back to top of page */
@@ -179,7 +157,7 @@ a.arrow-down { background: none no-repeat right center; }
a.arrow-left { background: none no-repeat 3px 60%; }
a.arrow-right { background: none no-repeat 95% 60%; }
-a.arrow-up, a.arrow-up:link, a.arrow-up:active, a.arrow-up:visited {
+a.arrow-up {
padding-left: 10px;
text-decoration: none;
border-bottom-width: 0;
@@ -189,7 +167,7 @@ a.arrow-up:hover {
background-position: left top;
}
-a.arrow-down, a.arrow-down:link, a.arrow-down:active, a.arrow-down:visited {
+a.arrow-down {
padding-right: 10px;
}
@@ -198,7 +176,7 @@ a.arrow-down:hover {
text-decoration: none;
}
-a.arrow-left, a.arrow-left:active, a.arrow-left:visited {
+a.arrow-left {
padding-left: 12px;
}
@@ -207,7 +185,7 @@ a.arrow-left:hover {
background-position: 0 60%;
}
-a.arrow-right, a.arrow-right:active, a.arrow-right:visited {
+a.arrow-right {
padding-right: 12px;
}
diff --git a/phpBB/styles/prosilver/theme/print.css b/phpBB/styles/prosilver/theme/print.css
index 88de620493..34129c92e8 100644
--- a/phpBB/styles/prosilver/theme/print.css
+++ b/phpBB/styles/prosilver/theme/print.css
@@ -91,11 +91,11 @@ hr {
}
/* Dont want to print url for names or titles in content area */
-.postbody .author a:link, .postbody .author a:visited,
-html>body .postbody .author a:link:after,
+.postbody .author a:link, .postbody .author a:visited,
+html>body .postbody .author a:link:after,
html>body .postbody .author a:visited:after,
-.postquote .quote-by a:link, .postquote .quote-by a:visited,
-html>body .postquote .quote-by a:link:after,
+.postquote .quote-by a:link, .postquote .quote-by a:visited,
+html>body .postquote .quote-by a:link:after,
html>body .postquote .quote-by a:visited:after,
html>body .postbody h1 a:link:after, html>body .postbody h2 a:link:after {
text-decoration: none;
@@ -119,7 +119,7 @@ html>body .postbody h1 a:link:after, html>body .postbody h2 a:link:after {
.postquote img { display: none; }
.postquote span { display: block; }
.postquote span .postquote { font-size: 100%; }
-.quote-by, blockquote cite {
+.quote-by, blockquote cite {
color: black;
display : block;
font-weight: bold;
diff --git a/phpBB/styles/prosilver/theme/responsive.css b/phpBB/styles/prosilver/theme/responsive.css
index 7117e2c435..241b4d132e 100644
--- a/phpBB/styles/prosilver/theme/responsive.css
+++ b/phpBB/styles/prosilver/theme/responsive.css
@@ -13,12 +13,15 @@ html {
}
body {
- padding: 0 5px;
+ padding: 0;
}
#wrap {
- min-width: 300px;
- padding: 0;
+ border: none;
+ border-radius: 0;
+ margin: 0;
+ min-width: 290px;
+ padding: 0 5px;
}
/* Common block wrappers
@@ -41,7 +44,7 @@ body {
text-align: center;
}
-#logo {
+.logo {
/* change display value to inline-block to show logo */
display: none;
float: none;
@@ -73,7 +76,7 @@ body {
.responsive-search a {
display: block;
width: 16px;
- height: 18px;
+ height: 22px;
text-indent: 99px;
overflow: hidden;
background-position: 50% 50%;
@@ -119,23 +122,23 @@ ul.topiclist li.header dt .list-inner {
min-height: 0;
}
-ul.topiclist dd {
- display: none;
+ul.topiclist dd {
+ display: none;
}
-ul.topiclist dd.mark {
- display: block;
+ul.topiclist dd.mark {
+ display: block;
}
/* Forums and topics lists
----------------------------------------*/
-ul.topiclist.forums dt, ul.topiclist.topics dt {
+ul.topiclist.forums dt {
margin-right: -250px;
}
-ul.topiclist.forums dt .list-inner, ul.topiclist.topics dt .list-inner {
+ul.topiclist.forums dt .list-inner {
margin-right: 250px;
}
-ul.topiclist.forums dd.lastpost, ul.topiclist.topics dd.lastpost {
+ul.topiclist.forums dd.lastpost {
display: block;
}
@@ -160,15 +163,15 @@ ul.topiclist.forums dd.topics dfn, ul.topiclist.topics dd.posts dfn {
@media only screen and (max-width: 550px), only screen and (max-device-width: 550px)
{
- ul.topiclist.forums dt, ul.topiclist.topics dt {
+ ul.topiclist.forums dt {
margin-right: 0;
}
- ul.topiclist.forums dt .list-inner, ul.topiclist.topics dt .list-inner {
+ ul.topiclist.forums dt .list-inner {
margin-right: 0;
}
- ul.topiclist.forums dd.lastpost, ul.topiclist.topics dd.lastpost {
+ ul.topiclist.forums dd.lastpost {
display: none;
}
}
@@ -190,8 +193,8 @@ ul.topiclist li.row dt a.subforum {
----------------------------------------*/
@media only screen and (max-width: 350px), only screen and (max-device-width: 350px)
{
- .dropdown-extended {
- width: 250px;
+ .dropdown-extended .dropdown-contents {
+ width: auto;
}
}
@@ -201,8 +204,8 @@ ul.topiclist li.row dt a.subforum {
margin: 5px 0 0;
}
-.row .pagination > ul {
- margin-top: 0;
+.row .pagination .ellipsis + li {
+ display: none !important;
}
/* Responsive tables
@@ -367,7 +370,7 @@ fieldset.quick-login label[for="autologin"] {
dl.details dt, dl.details dd {
width: auto;
float: none;
- text-align: left;
+ text-align: left;
}
dl.details dd {
@@ -457,11 +460,6 @@ p.rightside {
margin-bottom: 0;
}
-.column1, .column2 {
- width: auto;
- float: none;
-}
-
fieldset.quickmod {
width: auto;
float: none;
diff --git a/phpBB/styles/prosilver/theme/tweaks.css b/phpBB/styles/prosilver/theme/tweaks.css
index 9a8ed5d399..ea0c66d20a 100644
--- a/phpBB/styles/prosilver/theme/tweaks.css
+++ b/phpBB/styles/prosilver/theme/tweaks.css
@@ -1,6 +1,6 @@
/* Style Sheet Tweaks
-These style definitions are IE 7 and 8 specific
+These style definitions are IE 7 and 8 specific
tweaks required due to its poor CSS support.
-------------------------------------------------*/
@@ -14,9 +14,9 @@ ul.linklist {
}
/* Align checkboxes/radio buttons nicely */
-dd label input {
- vertical-align: text-bottom;
- *vertical-align: middle;
+dd label input {
+ vertical-align: text-bottom;
+ *vertical-align: middle;
}
/* Simple fix so forum and topic lists always have a height set */
@@ -69,5 +69,5 @@ dd.option {
/* Fixes header-avatar aspect-ratio in IE8 */
.header-avatar img {
- height: 25px;
+ height: 20px;
}
diff --git a/phpBB/styles/subsilver2/style.cfg b/phpBB/styles/subsilver2/style.cfg
index b9e77bfb4f..9a0c77b627 100644
--- a/phpBB/styles/subsilver2/style.cfg
+++ b/phpBB/styles/subsilver2/style.cfg
@@ -21,8 +21,8 @@
# General Information about this style
name = subsilver2
copyright = © 2005 phpBB Limited
-style_version = 3.1.0-b4
-phpbb_version = 3.1.0-b4
+style_version = 3.1.0-RC1
+phpbb_version = 3.1.0-RC1
# Defining a different template bitfield
# template_bitfield = lNg=
diff --git a/phpBB/styles/subsilver2/template/breadcrumbs.html b/phpBB/styles/subsilver2/template/breadcrumbs.html
index 646525c206..3aa05bc0eb 100644
--- a/phpBB/styles/subsilver2/template/breadcrumbs.html
+++ b/phpBB/styles/subsilver2/template/breadcrumbs.html
@@ -2,7 +2,7 @@
<table class="tablebg" width="100%" cellspacing="1" cellpadding="0" style="margin-top: 5px;">
<tr>
<td class="row1">
- <p class="breadcrumbs"><!-- IF U_SITE_HOME --><a href="{U_SITE_HOME}"{$MICRODATA}>{L_SITE_HOME}</a> <strong>&#187;</strong> <!-- ENDIF --><a href="{U_INDEX}"{$MICRODATA}>{L_INDEX}</a><!-- BEGIN navlinks --><!-- EVENT overall_header_navlink_prepend --> &#187; <a href="{navlinks.U_VIEW_FORUM}"{$MICRODATA}>{navlinks.FORUM_NAME}</a><!-- EVENT overall_header_navlink_append --><!-- END navlinks -->
+ <p class="breadcrumbs"><!-- IF U_SITE_HOME --><a href="{U_SITE_HOME}"{$MICRODATA} data-navbar-reference="home">{L_SITE_HOME}</a> <strong>&#187;</strong> <!-- ENDIF --><a href="{U_INDEX}"{$MICRODATA} data-navbar-reference="index">{L_INDEX}</a><!-- BEGIN navlinks --><!-- EVENT overall_header_navlink_prepend --> &#187; <a href="{navlinks.U_VIEW_FORUM}"{$MICRODATA}<!-- IF navlinks.MICRODATA --> {navlinks.MICRODATA}<!-- ENDIF -->>{navlinks.FORUM_NAME}</a><!-- EVENT overall_header_navlink_append --><!-- END navlinks -->
<!-- EVENT overall_header_breadcrumb_append --></p>
<!-- EVENT overall_footer_timezone_before -->
<p class="datetime">{S_TIMEZONE}</p>
diff --git a/phpBB/styles/subsilver2/template/index_body.html b/phpBB/styles/subsilver2/template/index_body.html
index 2fdd0c77c1..1a2786015f 100644
--- a/phpBB/styles/subsilver2/template/index_body.html
+++ b/phpBB/styles/subsilver2/template/index_body.html
@@ -1,6 +1,6 @@
<!-- INCLUDE overall_header.html -->
-<!-- EVENT index_body_linklist_before -->
+<!-- EVENT index_body_markforums_before -->
<!-- IF U_MCP or U_ACP -->
<div id="pageheader">
@@ -10,7 +10,7 @@
<br clear="all" /><br />
<!-- ENDIF -->
-<!-- EVENT index_body_linklist_after -->
+<!-- EVENT index_body_markforums_after -->
<!-- INCLUDE forumlist_body.html -->
diff --git a/phpBB/styles/subsilver2/template/overall_header.html b/phpBB/styles/subsilver2/template/overall_header.html
index 314e284155..711ce66362 100644
--- a/phpBB/styles/subsilver2/template/overall_header.html
+++ b/phpBB/styles/subsilver2/template/overall_header.html
@@ -156,17 +156,20 @@ function marklist(id, name, state)
<div id="menubar">
<table width="100%" cellspacing="0">
<tr>
- <td class="genmed">
+ <td class="genmed dropdown-container">
<!-- IF S_NOTIFICATIONS_DISPLAY and not S_IS_BOT and S_USER_LOGGED_IN -->
- <a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button"><img src="{T_THEME_PATH}/images/icon_mini_notification.gif" width="12" height="13" alt="*" /> {L_NOTIFICATIONS} [<strong>{NOTIFICATIONS_COUNT}</strong>]</a>&nbsp;
- <div id="notification_list" class="notification_list">
+ <a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button" class="dropdown-trigger">
+ <img src="{T_THEME_PATH}/images/icon_mini_notification.gif" width="12" height="13" alt="*" />
+ {L_NOTIFICATIONS} [<strong>{NOTIFICATIONS_COUNT}</strong>]
+ </a>&nbsp;
+ <div id="notification_list" class="notification_list dropdown">
<div class="row1 header">
{L_NOTIFICATIONS}
<span class="header_settings"><a href="{U_NOTIFICATION_SETTINGS}">{L_SETTINGS}</a></span>
</div>
<div class="notification_scroll">
- <table class="tablebg" width="310" cellspacing="1">
+ <table class="tablebg" cellspacing="1">
<!-- BEGIN notifications -->
<tr class="row<!-- IF notifications.UNREAD -->2<!-- ELSE -->1<!-- ENDIF -->">
<td width="50">
@@ -177,7 +180,11 @@ function marklist(id, name, state)
<!-- IF notifications.URL --><a href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->"><!-- ENDIF -->
{notifications.FORMATTED_TITLE}
<!-- IF notifications.URL --></a><!-- ENDIF -->
- <br />&raquo; {notifications.TIME}
+
+ <!-- IF notifications.REFERENCE --><br /><span class="notification-reference">{notifications.REFERENCE}</span><!-- ENDIF -->
+ <!-- IF notifications.FORUM --><br /><span class="notification-forum">{notifications.FORUM}</span><!-- ENDIF -->
+ <!-- IF notifications.REASON --><br /><span class="notification-reason">{notifications.REASON}</span><!-- ENDIF -->
+ <br /><span class="notification-time">{notifications.TIME}</span>
<!-- IF not notifications.URL and notifications.UNREAD -->
<br /><a href="{notifications.U_MARK_READ}">{L_MARK_READ}</a>
<!-- ENDIF -->
diff --git a/phpBB/styles/subsilver2/template/ucp_groups_manage.html b/phpBB/styles/subsilver2/template/ucp_groups_manage.html
index 3099fcb1d8..55c1c20528 100644
--- a/phpBB/styles/subsilver2/template/ucp_groups_manage.html
+++ b/phpBB/styles/subsilver2/template/ucp_groups_manage.html
@@ -78,7 +78,7 @@
<td class="row1" width="35%"><b class="genmed">{L_AVATAR_TYPE}{L_COLON}</b></td>
<td class="row2">
<select name="avatar_driver" id="avatar_driver">
- <option value="">{L_NO_AVATAR_CATEGORY}</option>
+ <option value="">{L_NO_AVATAR}</option>
<!-- BEGIN avatar_drivers -->
<option value="{avatar_drivers.DRIVER}"<!-- IF avatar_drivers.SELECTED --> selected="selected"<!-- ENDIF -->>{avatar_drivers.L_TITLE}</option>
<!-- END avatar_drivers -->
diff --git a/phpBB/styles/subsilver2/template/ucp_notifications.html b/phpBB/styles/subsilver2/template/ucp_notifications.html
index 64e21ec4a6..b0d2925b68 100644
--- a/phpBB/styles/subsilver2/template/ucp_notifications.html
+++ b/phpBB/styles/subsilver2/template/ucp_notifications.html
@@ -92,9 +92,11 @@
<td valign="top">
<span class="gen">
<!-- IF notification_list.URL --><a href="<!-- IF notification_list.UNREAD -->{notification_list.U_MARK_READ}<!-- ELSE -->{notification_list.URL}<!-- ENDIF -->"><!-- ENDIF -->
- <strong>{notification_list.FORMATTED_TITLE}</strong>
+ {notification_list.FORMATTED_TITLE}<!-- IF notification_list.REFERENCE --> {notification_list.REFERENCE}<!-- ENDIF -->
<!-- IF notification_list.URL --></a><!-- ENDIF --><br />
- {notification_list.TIME}
+ <!-- IF notification_list.FORUM --><span class="notifications_forum">{notification_list.FORUM}</span><br /><!-- ENDIF -->
+ <!-- IF notification_list.REASON --><span class="notifications_reason">{notification_list.REASON}</span><br /><!-- ENDIF -->
+ <span class="notifications_time">{notification_list.TIME}</span>
</span>
</td>
<td align="center">
diff --git a/phpBB/styles/subsilver2/template/ucp_profile_avatar.html b/phpBB/styles/subsilver2/template/ucp_profile_avatar.html
index 07b3edb498..fc52c149c6 100644
--- a/phpBB/styles/subsilver2/template/ucp_profile_avatar.html
+++ b/phpBB/styles/subsilver2/template/ucp_profile_avatar.html
@@ -28,7 +28,7 @@
<td class="row1" width="35%"><b class="genmed">{L_AVATAR_TYPE}{L_COLON}</b></td>
<td class="row2">
<select name="avatar_driver" id="avatar_driver" data-togglable-settings="true">
- <option value="">{L_NO_AVATAR_CATEGORY}</option>
+ <option value="">{L_NO_AVATAR}</option>
<!-- BEGIN avatar_drivers -->
<option value="{avatar_drivers.DRIVER}"<!-- IF avatar_drivers.SELECTED --> selected="selected"<!-- ENDIF --> data-toggle-setting=".avatar_option_{avatar_drivers.DRIVER}">{avatar_drivers.L_TITLE}</option>
<!-- END avatar_drivers -->
diff --git a/phpBB/styles/subsilver2/template/ucp_register.html b/phpBB/styles/subsilver2/template/ucp_register.html
index 1d55b952e5..162fa2a020 100644
--- a/phpBB/styles/subsilver2/template/ucp_register.html
+++ b/phpBB/styles/subsilver2/template/ucp_register.html
@@ -34,6 +34,7 @@
</tr>
<!-- ENDIF -->
+<!-- EVENT ucp_register_credentials_before -->
<tr>
<td class="row1" width="38%"><b class="genmed">{L_USERNAME}{L_COLON} </b><br /><span class="gensmall">{L_USERNAME_EXPLAIN}</span></td>
<td class="row2"><input class="post" type="text" name="username" size="25" value="{USERNAME}" /></td>
@@ -50,6 +51,8 @@
<td class="row1"><b class="genmed">{L_CONFIRM_PASSWORD}{L_COLON} </b></td>
<td class="row2"><input class="post" type="password" name="password_confirm" size="25" value="{PASSWORD_CONFIRM}" /></td>
</tr>
+<!-- EVENT ucp_register_credentials_after -->
+<!-- EVENT ucp_register_options_before -->
<tr>
<td class="row1"><b class="genmed">{L_LANGUAGE}{L_COLON} </b></td>
<td class="row2"><select name="lang" onchange="change_language(this.value); return false;">{S_LANG_OPTIONS}</select></td>
@@ -57,6 +60,7 @@
<!-- INCLUDE timezone_option.html -->
+<!-- EVENT ucp_register_profile_fields_before -->
<!-- IF .profile_fields -->
<tr>
<td class="row2" colspan="2"><span class="gensmall">{L_ITEMS_REQUIRED}</span></td>
@@ -73,7 +77,7 @@
<!-- END profile_fields -->
<!-- ENDIF -->
-
+<!-- EVENT ucp_register_profile_fields_after -->
<!-- IF CAPTCHA_TEMPLATE -->
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
<!-- ENDIF -->
diff --git a/phpBB/styles/subsilver2/theme/stylesheet.css b/phpBB/styles/subsilver2/theme/stylesheet.css
index e69eec4f14..3c7ff23db5 100644
--- a/phpBB/styles/subsilver2/theme/stylesheet.css
+++ b/phpBB/styles/subsilver2/theme/stylesheet.css
@@ -632,7 +632,7 @@ input:focus, select:focus, textarea:focus {
}
.postimage {
- max-width: 99%;
+ max-width: 100%;
}
.syntaxbg {
@@ -1189,12 +1189,21 @@ a.imageset {
overflow-x: hidden;
}
+#notification_list table {
+ width: 100%;
+}
+
#notification_list .notification_title {
- padding: 5px;
+ padding: 3px;
+}
+
+#notification_list .notification_title:after {
+ clear: both;
+ content: '';
+ display: block;
}
#notification_list .header {
- width: 298px;
padding: 5px;
font-weight: bold;
border: 1px solid #A9B8C2;
@@ -1208,7 +1217,6 @@ a.imageset {
}
#notification_list .footer {
- width: 300px;
text-align: center;
font-size: 1.2em;
border: 1px solid #A9B8C2;
@@ -1223,3 +1231,12 @@ a.imageset {
#notification_list .footer > a {
display: block;
}
+
+#notification_list .notification-time {
+ font-size: 0.9em;
+ float: right;
+}
+
+.notification_list .notifications_time {
+ font-size: 0.8em;
+}
diff --git a/phpBB/ucp.php b/phpBB/ucp.php
index 4c7723b0ac..182bc2e285 100644
--- a/phpBB/ucp.php
+++ b/phpBB/ucp.php
@@ -357,23 +357,3 @@ $module->assign_tpl_vars(append_sid("{$phpbb_root_path}ucp.$phpEx"));
// Generate the page, do not display/query online list
$module->display($module->get_page_title());
-
-/**
-* Function for assigning a template var if the zebra module got included
-*/
-function _module_zebra($mode, &$module_row)
-{
- global $template;
-
- $template->assign_var('S_ZEBRA_ENABLED', true);
-
- if ($mode == 'friends')
- {
- $template->assign_var('S_ZEBRA_FRIENDS_ENABLED', true);
- }
-
- if ($mode == 'foes')
- {
- $template->assign_var('S_ZEBRA_FOES_ENABLED', true);
- }
-}
diff --git a/phpBB/viewonline.php b/phpBB/viewonline.php
index 43b5f7f001..4c897c58aa 100644
--- a/phpBB/viewonline.php
+++ b/phpBB/viewonline.php
@@ -44,6 +44,7 @@ if (!$auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel'))
}
$pagination = $phpbb_container->get('pagination');
+$viewonline_helper = $phpbb_container->get('viewonline_helper');
$sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_JOINED'], 'c' => $user->lang['SORT_LOCATION']);
$sort_key_sql = array('a' => 'u.username_clean', 'b' => 's.session_time', 'c' => 's.session_page');
@@ -102,7 +103,7 @@ $guest_counter = 0;
// Get number of online guests (if we do not display them)
if (!$show_guests)
{
- switch ($db->sql_layer)
+ switch ($db->get_sql_layer())
{
case 'sqlite':
case 'sqlite3':
@@ -213,11 +214,7 @@ while ($row = $db->sql_fetchrow($result))
continue;
}
- preg_match('#^([a-z0-9/_-]+)#i', $row['session_page'], $on_page);
- if (!sizeof($on_page))
- {
- $on_page[1] = '';
- }
+ $on_page = $viewonline_helper->get_user_page($row['session_page']);
switch ($on_page[1])
{
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index d13d4b444f..23f2fe8e3d 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -523,6 +523,19 @@ gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);
// Quick mod tools
$allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false;
+$s_quickmod_action = append_sid(
+ "{$phpbb_root_path}mcp.$phpEx",
+ array(
+ 'f' => $forum_id,
+ 't' => $topic_id,
+ 'start' => $start,
+ 'quickmod' => 1,
+ 'redirect' => urlencode(str_replace('&amp;', '&', $viewtopic_url)),
+ ),
+ true,
+ $user->session_id
+);
+
$quickmod_array = array(
// 'key' => array('LANG_KEY', $userHasPermissions),
@@ -546,7 +559,7 @@ foreach($quickmod_array as $option => $qm_ary)
{
if (!empty($qm_ary[1]))
{
- phpbb_add_quickmod_option($option, $qm_ary[0]);
+ phpbb_add_quickmod_option($s_quickmod_action, $option, $qm_ary[0]);
}
}
@@ -631,7 +644,7 @@ $template->assign_vars(array(
'S_SELECT_SORT_DAYS' => $s_limit_days,
'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
'S_TOPIC_ACTION' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start")),
- 'S_MOD_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . "&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
+ 'S_MOD_ACTION' => $s_quickmod_action,
'L_RETURN_TO_FORUM' => $user->lang('RETURN_TO', $topic_data['forum_name']),
'S_VIEWTOPIC' => true,
@@ -1141,6 +1154,7 @@ while ($row = $db->sql_fetchrow($result))
'username' => $row['username'],
'user_colour' => $row['user_colour'],
+ 'contact_user' => '',
'warnings' => 0,
'allow_pm' => 0,
@@ -1198,6 +1212,7 @@ while ($row = $db->sql_fetchrow($result))
'username' => $row['username'],
'user_colour' => $row['user_colour'],
+ 'contact_user' => $user->lang('CONTACT_USER', get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['username'])),
'online' => false,
'jabber' => ($row['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=jabber&amp;u=$poster_id") : '',
@@ -1699,6 +1714,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
'POSTER_AVATAR' => $user_cache[$poster_id]['avatar'],
'POSTER_WARNINGS' => $auth->acl_get('m_warn') ? $user_cache[$poster_id]['warnings'] : '',
'POSTER_AGE' => $user_cache[$poster_id]['age'],
+ 'CONTACT_USER' => $user_cache[$poster_id]['contact_user'],
'POST_DATE' => $user->format_date($row['post_time'], false, ($view == 'print') ? true : false),
'POST_SUBJECT' => $row['post_subject'],
diff --git a/tests/RUNNING_TESTS.md b/tests/RUNNING_TESTS.md
index d638c86859..afd7caa709 100644
--- a/tests/RUNNING_TESTS.md
+++ b/tests/RUNNING_TESTS.md
@@ -32,7 +32,6 @@ will be skipped:
- apc (APC cache driver)
- bz2 (compress tests)
-- interbase, pdo_firebird (Firebird database driver)
- mysql, pdo_mysql (MySQL database driver)
- mysqli, pdo_mysql (MySQLi database driver)
- pcntl (flock class)
@@ -82,16 +81,10 @@ Special Database Cases
----------------------
In order to run tests on some of the databases that we support, it will be
necessary to provide a custom DSN string in test_config.php. This is only
-needed for MSSQL 2000+ (PHP module), MSSQL via ODBC, and Firebird when
-PDO_Firebird does not work on your system
-(https://bugs.php.net/bug.php?id=61183). The variable must be named `$custom_dsn`.
+needed for MSSQL 2000+ (PHP module) and MSSQL via ODBC. The variable must be
+named `$custom_dsn`.
-Examples:
-Firebird using http://www.firebirdsql.org/en/odbc-driver/
-
- $custom_dsn = "Driver={Firebird/InterBase(r) driver};dbname=$dbhost:$dbname";
-
-MSSQL
+Example MSSQL:
$custom_dsn = "Driver={SQL Server Native Client 10.0};Server=$dbhost;Database=$dbname";
diff --git a/tests/auth/fixtures/oauth_tokens.xml b/tests/auth/fixtures/oauth_tokens.xml
index 9bfb5a4422..6c82e94e62 100644
--- a/tests/auth/fixtures/oauth_tokens.xml
+++ b/tests/auth/fixtures/oauth_tokens.xml
@@ -5,6 +5,12 @@
<column>session_id</column>
<column>provider</column>
<column>oauth_token</column>
+ <row>
+ <value>1</value>
+ <value>abcd</value>
+ <value>auth.provider.oauth.service.testing</value>
+ <value>{"token_class":"phpbb_not_a_token","accessToken":"error","refreshToken":0,"endOfLife":null,"extraParams":null}</value>
+ </row>
</table>
</dataset>
diff --git a/tests/auth/phpbb_not_a_token.php b/tests/auth/phpbb_not_a_token.php
new file mode 100644
index 0000000000..61cc14fa10
--- /dev/null
+++ b/tests/auth/phpbb_not_a_token.php
@@ -0,0 +1,23 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_not_a_token
+{
+ public function __construct($param1, $param2, $param3, $param4)
+ {
+ }
+
+ public function setEndOfLife()
+ {
+ }
+}
diff --git a/tests/auth/provider_oauth_token_storage_test.php b/tests/auth/provider_oauth_token_storage_test.php
index ec28e546bd..45daa9816b 100644
--- a/tests/auth/provider_oauth_token_storage_test.php
+++ b/tests/auth/provider_oauth_token_storage_test.php
@@ -13,6 +13,8 @@
use OAuth\OAuth2\Token\StdOAuth2Token;
+require_once dirname(__FILE__) . '/phpbb_not_a_token.php';
+
class phpbb_auth_provider_oauth_token_storage_test extends phpbb_database_test_case
{
protected $db;
@@ -73,6 +75,22 @@ class phpbb_auth_provider_oauth_token_storage_test extends phpbb_database_test_c
$this->assertEquals($token, $stored_token);
}
+ public function test_retrieveAccessToken_wrong_token()
+ {
+ $this->user->data['session_id'] = 'abcd';
+ try
+ {
+ $this->token_storage->retrieveAccessToken($this->service_name);
+ $this->fail('The token can not be deserialized and an exception should be thrown.');
+ }
+ catch (\OAuth\Common\Storage\Exception\TokenNotFoundException $e)
+ {
+ }
+
+ $row = $this->get_token_row_by_session_id('abcd');
+ $this->assertFalse($row);
+ }
+
public function test_retrieveAccessToken_from_db()
{
$expected_token = new StdOAuth2Token('access', 'refresh', StdOAuth2Token::EOL_NEVER_EXPIRES);
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index bb4a703cc3..2856ba02bb 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -31,4 +31,5 @@ require_once 'test_framework/phpbb_test_case_helpers.php';
require_once 'test_framework/phpbb_test_case.php';
require_once 'test_framework/phpbb_database_test_case.php';
require_once 'test_framework/phpbb_database_test_connection_manager.php';
+require_once 'test_framework/phpbb_mink_test_case.php';
require_once 'test_framework/phpbb_functional_test_case.php';
diff --git a/tests/console/cron/cron_list_test.php b/tests/console/cron/cron_list_test.php
index 46705a585f..f04c14e847 100644
--- a/tests/console/cron/cron_list_test.php
+++ b/tests/console/cron/cron_list_test.php
@@ -98,6 +98,6 @@ class phpbb_console_command_cron_list_test extends phpbb_test_case
$this->get_cron_manager($tasks);
$this->command_tester = $this->get_command_tester();
- $this->command_tester->execute(array('command' => $this->command_name, '--no-ansi' => true));
+ $this->command_tester->execute(array('command' => $this->command_name), array('decorated' => false));
}
}
diff --git a/tests/content_visibility/delete_post_test.php b/tests/content_visibility/delete_post_test.php
index e0a2a3d402..99068729df 100644
--- a/tests/content_visibility/delete_post_test.php
+++ b/tests/content_visibility/delete_post_test.php
@@ -266,7 +266,7 @@ class phpbb_content_visibility_delete_post_test extends phpbb_database_test_case
*/
public function test_delete_post($forum_id, $topic_id, $post_id, $data, $is_soft, $reason, $expected_posts, $expected_topic, $expected_forum)
{
- global $auth, $cache, $config, $db, $phpbb_container, $phpbb_root_path, $phpEx;
+ global $auth, $cache, $config, $db, $phpbb_container, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
$config['search_type'] = 'phpbb_mock_search';
$cache = new phpbb_mock_cache;
@@ -283,6 +283,8 @@ class phpbb_content_visibility_delete_post_test extends phpbb_database_test_case
)));
$user = $this->getMock('\phpbb\user');
+ $phpbb_dispatcher = new phpbb_mock_event_dispatcher();
+
$phpbb_container = new phpbb_mock_container_builder();
$phpbb_container->set('notification_manager', new phpbb_mock_notification_manager());
$phpbb_container->set('content.visibility', new \phpbb\content_visibility($auth, $db, $user, $phpbb_root_path, $phpEx, FORUMS_TABLE, POSTS_TABLE, TOPICS_TABLE, USERS_TABLE));
diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php
index 320eac3bf3..f3c6888c8d 100644
--- a/tests/dbal/db_tools_test.php
+++ b/tests/dbal/db_tools_test.php
@@ -239,6 +239,24 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
$this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012'));
}
+ public function test_column_change_with_composite_primary()
+ {
+ // Remove the old primary key
+ $this->assertTrue($this->tools->sql_column_remove('prefix_table_name', 'c_id'));
+ $this->assertTrue($this->tools->sql_column_add('prefix_table_name', 'c_id', array('UINT', 0)));
+
+ // Create a composite key
+ $this->assertTrue($this->tools->sql_create_primary_key('prefix_table_name', array('c_id', 'c_uint')));
+
+ // Create column
+ $this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12643'));
+ $this->assertTrue($this->tools->sql_column_add('prefix_table_name', 'c_bug_12643', array('DECIMAL', 0)));
+ $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12643'));
+
+ // Change type from int to string
+ $this->assertTrue($this->tools->sql_column_change('prefix_table_name', 'c_bug_12643', array('VCHAR:100', '')));
+ }
+
public function test_column_remove()
{
$this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_int_size'));
@@ -248,6 +266,17 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
$this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_int_size'));
}
+ public function test_column_remove_similar_name()
+ {
+ $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_vchar'));
+ $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_vchar_size'));
+
+ $this->assertTrue($this->tools->sql_column_remove('prefix_table_name', 'c_vchar'));
+
+ $this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_vchar'));
+ $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_vchar_size'));
+ }
+
public function test_column_remove_with_index()
{
// Create column
diff --git a/tests/dbal/order_lower_test.php b/tests/dbal/order_lower_test.php
index b7a69c7c5d..b101d28c7d 100644
--- a/tests/dbal/order_lower_test.php
+++ b/tests/dbal/order_lower_test.php
@@ -22,7 +22,7 @@ class phpbb_dbal_order_lower_test extends phpbb_database_test_case
{
$db = $this->new_dbal();
- if (strpos($db->sql_layer, 'mysql') === 0 && version_compare($db->sql_server_info(true, false), '5.6', '>='))
+ if (strpos($db->get_sql_layer(), 'mysql') === 0 && version_compare($db->sql_server_info(true, false), '5.6', '>='))
{
$this->markTestSkipped('MySQL 5.6 fails to order things correctly. See also: http://tracker.phpbb.com/browse/PHPBB3-11571 http://bugs.mysql.com/bug.php?id=69005');
}
diff --git a/tests/dbal/select_test.php b/tests/dbal/select_test.php
index 7cac4d6a3b..e480716a49 100644
--- a/tests/dbal/select_test.php
+++ b/tests/dbal/select_test.php
@@ -219,8 +219,8 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
{
$db = $this->new_dbal();
- $like_expression = str_replace('*', $db->any_char, $like_expression);
- $like_expression = str_replace('#', $db->one_char, $like_expression);
+ $like_expression = str_replace('*', $db->get_any_char(), $like_expression);
+ $like_expression = str_replace('#', $db->get_one_char(), $like_expression);
$where = ($like_expression) ? 'username_clean ' . $db->sql_like_expression($like_expression) : '';
$result = $db->sql_query('SELECT username_clean
diff --git a/tests/dbal/sql_insert_buffer_test.php b/tests/dbal/sql_insert_buffer_test.php
index 2f9ed0008f..eae0abceba 100644
--- a/tests/dbal/sql_insert_buffer_test.php
+++ b/tests/dbal/sql_insert_buffer_test.php
@@ -32,7 +32,7 @@ class phpbb_dbal_sql_insert_buffer_test extends phpbb_database_test_case
public function test_multi_insert_disabled_insert_and_flush()
{
- $this->db->multi_insert = false;
+ $this->db->set_multi_insert(false);
$this->assertTrue($this->buffer->insert($this->get_row(1)));
$this->assert_config_count(3);
$this->assertFalse($this->buffer->flush());
@@ -50,7 +50,7 @@ class phpbb_dbal_sql_insert_buffer_test extends phpbb_database_test_case
public function test_multi_insert_disabled_insert_with_flush()
{
- $this->db->multi_insert = false;
+ $this->db->set_multi_insert(false);
$this->assertTrue($this->buffer->insert($this->get_row(1)));
$this->assert_config_count(3);
$this->assertTrue($this->buffer->insert($this->get_row(2)));
@@ -68,7 +68,7 @@ class phpbb_dbal_sql_insert_buffer_test extends phpbb_database_test_case
public function test_multi_insert_disabled_insert_all_and_flush()
{
- $this->db->multi_insert = false;
+ $this->db->set_multi_insert(false);
$this->assertTrue($this->buffer->insert_all($this->get_rows(3)));
$this->assert_config_count(5);
}
@@ -93,7 +93,7 @@ class phpbb_dbal_sql_insert_buffer_test extends phpbb_database_test_case
protected function check_multi_insert_support()
{
- if (!$this->db->multi_insert)
+ if (!$this->db->get_multi_insert())
{
$this->markTestSkipped('Database does not support multi_insert');
}
diff --git a/tests/event/php_exporter_test.php b/tests/event/php_exporter_test.php
index 823d90b63f..b52d68e305 100644
--- a/tests/event/php_exporter_test.php
+++ b/tests/event/php_exporter_test.php
@@ -118,6 +118,7 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
array('* @since 3.1.0-a1', '3.1.0-a1'),
array('* @since 3.1.0-b3', '3.1.0-b3'),
array(' * @since 3.1.0-b3', '3.1.0-b3'),
+ array('* @since 3.1.0-RC2', '3.1.0-RC2'),
);
}
@@ -137,6 +138,7 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
array('* @since 3.1.0-a1 bertie is cool'),
array('bertie* @since 3.1.0-a1'),
array('* @since 3.1-A2'),
+ array('* @since 3.1.0-rc1'),
);
}
diff --git a/tests/extension/ext/barfoo/composer.json b/tests/extension/ext/barfoo/composer.json
index d88fd413c9..05bb099707 100644
--- a/tests/extension/ext/barfoo/composer.json
+++ b/tests/extension/ext/barfoo/composer.json
@@ -13,10 +13,12 @@
"role": "N/A"
}],
"require": {
- "php": ">=5.3",
- "phpbb/phpbb": "3.1.*@dev"
+ "php": ">=5.3"
},
"extra": {
- "display-name": "phpBB BarFoo Extension"
+ "display-name": "phpBB BarFoo Extension",
+ "soft-require": {
+ "phpbb/phpbb": "3.1.*@dev"
+ }
}
}
diff --git a/tests/extension/ext/vendor/moo/composer.json b/tests/extension/ext/vendor/moo/composer.json
index b8fc544c01..d49aab47cd 100644
--- a/tests/extension/ext/vendor/moo/composer.json
+++ b/tests/extension/ext/vendor/moo/composer.json
@@ -13,10 +13,12 @@
"role": "N/A"
}],
"require": {
- "php": ">=5.3",
- "phpbb/phpbb": "3.1.*@dev"
+ "php": ">=5.3"
},
"extra": {
- "display-name": "phpBB Moo Extension"
+ "display-name": "phpBB Moo Extension",
+ "soft-require": {
+ "phpbb/phpbb": "3.1.*@dev"
+ }
}
}
diff --git a/tests/extension/ext/vendor2/bar/composer.json b/tests/extension/ext/vendor2/bar/composer.json
index 215e7d59db..9d2ed86a0c 100644
--- a/tests/extension/ext/vendor2/bar/composer.json
+++ b/tests/extension/ext/vendor2/bar/composer.json
@@ -12,10 +12,12 @@
"role": "N/A"
}],
"require": {
- "php": ">=5.3",
- "phpbb/phpbb": "3.1.*@dev"
+ "php": ">=5.3"
},
"extra": {
- "display-name": "phpBB Bar Extension"
+ "display-name": "phpBB Bar Extension",
+ "soft-require": {
+ "phpbb/phpbb": "3.1.*@dev"
+ }
}
}
diff --git a/tests/extension/ext/vendor2/foo/composer.json b/tests/extension/ext/vendor2/foo/composer.json
index 7b2a80f5d3..efcdfc338f 100644
--- a/tests/extension/ext/vendor2/foo/composer.json
+++ b/tests/extension/ext/vendor2/foo/composer.json
@@ -12,10 +12,12 @@
"role": "N/A"
}],
"require": {
- "php": ">=5.3",
- "phpbb/phpbb": "3.1.*@dev"
+ "php": ">=5.3"
},
"extra": {
- "display-name": "phpBB Foo Extension"
+ "display-name": "phpBB Foo Extension",
+ "soft-require": {
+ "phpbb/phpbb": "3.1.*@dev"
+ }
}
}
diff --git a/tests/extension/manager_test.php b/tests/extension/manager_test.php
index d9f8fbd1a4..230c90c7c7 100644
--- a/tests/extension/manager_test.php
+++ b/tests/extension/manager_test.php
@@ -32,22 +32,62 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
$this->extension_manager = $this->create_extension_manager();
}
- public function test_available()
+ public function test_all_available()
{
// barfoo and vendor3/bar should not listed due to missing composer.json. barfoo also has incorrect dir structure.
$this->assertEquals(array('vendor/moo', 'vendor2/bar', 'vendor2/foo'), array_keys($this->extension_manager->all_available()));
}
- public function test_enabled()
+ public function test_all_enabled()
{
$this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
}
- public function test_configured()
+ public function test_all_configured()
{
$this->assertEquals(array('vendor/moo', 'vendor2/foo'), array_keys($this->extension_manager->all_configured()));
}
+ public function test_is_enabled()
+ {
+ $this->assertSame(true, $this->extension_manager->is_enabled('vendor2/foo'));
+ $this->assertSame(false, $this->extension_manager->is_enabled('vendor/moo'));
+ $this->assertSame(false, $this->extension_manager->is_enabled('vendor2/bar'));
+ $this->assertSame(false, $this->extension_manager->is_enabled('bertie/worlddominationplan'));
+ }
+
+ public function test_is_disabled()
+ {
+ $this->assertSame(false, $this->extension_manager->is_disabled('vendor2/foo'));
+ $this->assertSame(true, $this->extension_manager->is_disabled('vendor/moo'));
+ $this->assertSame(false, $this->extension_manager->is_disabled('vendor2/bar'));
+ $this->assertSame(false, $this->extension_manager->is_disabled('bertie/worlddominationplan'));
+ }
+
+ public function test_is_purged()
+ {
+ $this->assertSame(false, $this->extension_manager->is_purged('vendor2/foo'));
+ $this->assertSame(false, $this->extension_manager->is_purged('vendor/moo'));
+ $this->assertSame(true, $this->extension_manager->is_purged('vendor2/bar'));
+ $this->assertSame(false, $this->extension_manager->is_purged('bertie/worlddominationplan'));
+ }
+
+ public function test_is_configured()
+ {
+ $this->assertSame(true, $this->extension_manager->is_configured('vendor2/foo'));
+ $this->assertSame(true, $this->extension_manager->is_configured('vendor/moo'));
+ $this->assertSame(false, $this->extension_manager->is_configured('vendor2/bar'));
+ $this->assertSame(false, $this->extension_manager->is_configured('bertie/worlddominationplan'));
+ }
+
+ public function test_is_available()
+ {
+ $this->assertSame(true, $this->extension_manager->is_available('vendor2/foo'));
+ $this->assertSame(true, $this->extension_manager->is_available('vendor/moo'));
+ $this->assertSame(true, $this->extension_manager->is_available('vendor2/bar'));
+ $this->assertSame(false, $this->extension_manager->is_available('bertie/worlddominationplan'));
+ }
+
public function test_enable()
{
vendor2\bar\ext::$state = 0;
diff --git a/tests/extension/metadata_manager_test.php b/tests/extension/metadata_manager_test.php
index 3678ac0a3f..6b6ea80d82 100644
--- a/tests/extension/metadata_manager_test.php
+++ b/tests/extension/metadata_manager_test.php
@@ -19,8 +19,11 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
protected $cache;
protected $config;
protected $db;
+ protected $db_tools;
+ protected $table_prefix;
protected $phpbb_root_path;
protected $phpEx;
+ protected $migrator;
protected $template;
protected $user;
@@ -70,7 +73,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
new \phpbb\db\migration\helper()
);
$container = new phpbb_mock_container_builder();
- $container->set('migrator', $migrator);
+ $container->set('migrator', $this->migrator);
$this->extension_manager = new \phpbb\extension\manager(
$container,
@@ -96,9 +99,10 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
{
$manager->get_metadata();
}
- catch(\phpbb\extension\exception $e){}
-
- $this->assertEquals((string) $e, $this->user->lang('FILE_NOT_FOUND', $this->phpbb_root_path . $this->extension_manager->get_extension_path($ext_name) . 'composer.json'));
+ catch (\phpbb\extension\exception $e)
+ {
+ $this->assertEquals((string) $e, $this->user->lang('FILE_NOT_FOUND', $this->phpbb_root_path . $this->extension_manager->get_extension_path($ext_name) . 'composer.json'));
+ }
}
// Should be the same as a direct json_decode of the composer.json file
@@ -112,7 +116,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
{
$metadata = $manager->get_metadata();
}
- catch(\phpbb\extension\exception $e)
+ catch (\phpbb\extension\exception $e)
{
$this->fail($e);
}
@@ -122,64 +126,42 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
$this->assertEquals($metadata, $json);
}
- public function test_validator_non_existant()
+ public function validator_non_existing_data()
{
- $ext_name = 'validator';
-
- $manager = $this->get_metadata_manager($ext_name);
-
- // Non-existant data
- try
- {
- $manager->validate('name');
-
- $this->fail('Exception not triggered');
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', 'name'));
- }
-
- try
- {
- $manager->validate('type');
-
- $this->fail('Exception not triggered');
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', 'type'));
- }
-
- try
- {
- $manager->validate('license');
-
- $this->fail('Exception not triggered');
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', 'license'));
- }
+ return array(
+ array('name'),
+ array('type'),
+ array('license'),
+ array('version'),
+ );
+ }
+ /**
+ * @dataProvider validator_non_existing_data
+ */
+ public function test_validator_non_existing($field_name)
+ {
+ $manager = $this->get_metadata_manager('validator');
try
{
- $manager->validate('version');
-
+ $manager->validate($field_name);
$this->fail('Exception not triggered');
}
catch(\phpbb\extension\exception $e)
{
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', 'version'));
+ $this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', $field_name));
}
+ }
+ public function test_validator_non_existing_authors()
+ {
+ $manager = $this->get_metadata_manager('validator');
try
{
$manager->validate_authors();
-
$this->fail('Exception not triggered');
}
- catch(\phpbb\extension\exception $e)
+ catch (\phpbb\extension\exception $e)
{
$this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', 'authors'));
}
@@ -193,72 +175,44 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
try
{
$manager->validate_authors();
-
$this->fail('Exception not triggered');
}
- catch(\phpbb\extension\exception $e)
+ catch (\phpbb\extension\exception $e)
{
$this->assertEquals((string) $e, $this->user->lang('META_FIELD_NOT_SET', 'author name'));
}
}
-
- public function test_validator_invalid()
+ public function validator_invalid_data()
{
- $ext_name = 'validator';
+ return array(
+ array('name', 'asdf'),
+ array('type', 'asdf'),
+ array('license', ''),
+ array('version', ''),
+ );
+ }
- $manager = $this->get_metadata_manager($ext_name);
+ /**
+ * @dataProvider validator_invalid_data
+ */
+ public function test_validator_invalid($field_name, $field_value)
+ {
+ $manager = $this->get_metadata_manager('validator');
// Invalid data
$manager->set_metadata(array(
- 'name' => 'asdf',
- 'type' => 'asdf',
- 'license' => '',
- 'version' => '',
+ $field_name => $field_value,
));
try
{
- $manager->validate('name');
-
+ $manager->validate($field_name);
$this->fail('Exception not triggered');
}
catch(\phpbb\extension\exception $e)
{
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_INVALID', 'name'));
- }
-
- try
- {
- $manager->validate('type');
-
- $this->fail('Exception not triggered');
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_INVALID', 'type'));
- }
-
- try
- {
- $manager->validate('license');
-
- $this->fail('Exception not triggered');
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_INVALID', 'license'));
- }
-
- try
- {
- $manager->validate('version');
-
- $this->fail('Exception not triggered');
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->assertEquals((string) $e, $this->user->lang('META_FIELD_INVALID', 'version'));
+ $this->assertEquals((string) $e, $this->user->lang('META_FIELD_INVALID', $field_name));
}
}
@@ -286,143 +240,83 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
}
}
-
- public function test_validator_requirements()
+ public function validator_requirements_data()
{
- $ext_name = 'validator';
-
- $manager = $this->get_metadata_manager($ext_name);
- // Too high of requirements
- $manager->merge_metadata(array(
- 'require' => array(
- 'php' => '10.0.0',
- 'phpbb/phpbb' => '3.2.0', // config is set to 3.1.0
+ return array(
+ array(
+ '10.0.0',
+ '100.2.0',
+ false,
+ false,
+ 'Versions are not compared at the moment',
),
- ));
-
- try
- {
- //$this->assertEquals(false, $manager->validate_require_php());
- //$this->assertEquals(false, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->fail($e);
- }
-
-
- // Too high of requirements
- $manager->merge_metadata(array(
- 'require' => array(
- 'php' => '5.3.0',
- 'phpbb/phpbb' => '3.1.0-beta', // config is set to 3.1.0
+ array(
+ '5.3.0',
+ '3.1.0-beta',
+ true,
+ true,
),
- ));
-
- try
- {
- $this->assertEquals(true, $manager->validate_require_php());
- $this->assertEquals(true, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->fail($e);
- }
-
-
- // Too high of requirements
- $manager->merge_metadata(array(
- 'require' => array(
- 'php' => '>' . phpversion(),
- 'phpbb/phpbb' => '>3.1.0', // config is set to 3.1.0
+ array(
+ '>' . phpversion(),
+ '>3.1.0',
+ false,
+ false,
+ 'Versions are not compared at the moment',
),
- ));
-
- try
- {
- //$this->assertEquals(false, $manager->validate_require_php());
- //$this->assertEquals(false, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->fail($e);
- }
-
-
- // Too high of current install
- $manager->merge_metadata(array(
- 'require' => array(
- 'php' => '<' . phpversion(),
- 'phpbb/phpbb' => '<3.1.0', // config is set to 3.1.0
+ array(
+ '<' . phpversion(),
+ '<3.1.0',
+ false,
+ false,
+ 'Versions are not compared at the moment',
),
- ));
-
- try
- {
- //$this->assertEquals(false, $manager->validate_require_php());
- //$this->assertEquals(false, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->fail($e);
- }
-
-
- // Matching requirements
- $manager->merge_metadata(array(
- 'require' => array(
- 'php' => phpversion(),
- 'phpbb/phpbb' => '3.1.0', // config is set to 3.1.0
+ array(
+ phpversion(),
+ '3.1.0',
+ true,
+ true,
),
- ));
-
- try
- {
- $this->assertEquals(true, $manager->validate_require_php());
- $this->assertEquals(true, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->fail($e);
- }
-
-
- // Matching requirements
- $manager->merge_metadata(array(
- 'require' => array(
- 'php' => '>=' . phpversion(),
- 'phpbb/phpbb' => '>=3.1.0', // config is set to 3.1.0
+ array(
+ '>=' . phpversion(),
+ '>=3.1.0',
+ true,
+ true,
),
- ));
+ array(
+ '<=' . phpversion(),
+ '<=3.1.0',
+ true,
+ true,
+ ),
+ );
+ }
- try
- {
- $this->assertEquals(true, $manager->validate_require_php());
- $this->assertEquals(true, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
+ /**
+ * @dataProvider validator_requirements_data
+ */
+ public function test_validator_requirements($php_version, $phpbb_version, $expected_php, $expected_phpbb, $incomplete_reason = '')
+ {
+ if ($incomplete_reason)
{
- $this->fail($e);
+ $this->markTestIncomplete($incomplete_reason);
}
-
- // Matching requirements
+ $ext_name = 'validator';
+ $manager = $this->get_metadata_manager($ext_name);
+ // Too high of requirements
$manager->merge_metadata(array(
'require' => array(
- 'php' => '<=' . phpversion(),
- 'phpbb/phpbb' => '<=3.1.0', // config is set to 3.1.0
+ 'php' => $php_version,
+ ),
+ 'extra' => array(
+ 'soft-require' => array(
+ 'phpbb/phpbb' => $phpbb_version, // config is set to 3.1.0
+ ),
),
));
- try
- {
- $this->assertEquals(true, $manager->validate_require_php());
- $this->assertEquals(true, $manager->validate_require_phpbb());
- }
- catch(\phpbb\extension\exception $e)
- {
- $this->fail($e);
- }
+ $this->assertEquals($expected_php, $manager->validate_require_php());
+ $this->assertEquals($expected_phpbb, $manager->validate_require_phpbb());
}
/**
diff --git a/tests/filesystem/clean_path_test.php b/tests/filesystem/clean_path_test.php
index 1aef0d8a0c..c585b17155 100644
--- a/tests/filesystem/clean_path_test.php
+++ b/tests/filesystem/clean_path_test.php
@@ -32,6 +32,8 @@ class phpbb_filesystem_clean_path_test extends phpbb_test_case
array('foo/bar/.', 'foo/bar'),
array('./foo/bar', './foo/bar'),
array('../foo/bar', '../foo/bar'),
+ array('./../foo/bar', './../foo/bar'),
+ array('././../foo/bar', './../foo/bar'),
array('one/two/three', 'one/two/three'),
array('one/two/../three', 'one/three'),
array('one/../two/three', 'two/three'),
diff --git a/tests/functional/download_test.php b/tests/functional/download_test.php
index dbf197fcfa..6a6df14c81 100644
--- a/tests/functional/download_test.php
+++ b/tests/functional/download_test.php
@@ -205,12 +205,8 @@ class phpbb_functional_download_test extends phpbb_functional_test_case
),
));
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Download Topic #1']}&sid={$this->sid}");
-
$this->add_lang('posting');
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('delete_topic');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Download Topic #1'], 'DELETE_TOPIC');
$this->assertContainsLang('DELETE_PERMANENTLY', $crawler->text());
$this->add_lang('mcp');
diff --git a/tests/functional/feed_test.php b/tests/functional/feed_test.php
index a474ecf27f..7aa2d0da7d 100644
--- a/tests/functional/feed_test.php
+++ b/tests/functional/feed_test.php
@@ -619,12 +619,8 @@ class phpbb_functional_feed_test extends phpbb_functional_test_case
),
));
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Feeds #1 - Topic #2']}&sid={$this->sid}");
-
$this->add_lang('posting');
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('delete_topic');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Feeds #1 - Topic #2'], 'DELETE_TOPIC');
$this->assertContainsLang('DELETE_PERMANENTLY', $crawler->text());
$this->add_lang('mcp');
diff --git a/tests/functional/fileupload_form_test.php b/tests/functional/fileupload_form_test.php
index cf36a0523f..b9d55fbd3c 100644
--- a/tests/functional/fileupload_form_test.php
+++ b/tests/functional/fileupload_form_test.php
@@ -42,6 +42,8 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case
unlink($fileinfo->getPathname());
}
+
+ parent::tearDown();
}
private function upload_file($filename, $mimetype)
diff --git a/tests/functional/fileupload_remote_test.php b/tests/functional/fileupload_remote_test.php
index f904258a5c..b170fc051f 100644
--- a/tests/functional/fileupload_remote_test.php
+++ b/tests/functional/fileupload_remote_test.php
@@ -43,6 +43,8 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
global $config, $user;
$user = null;
$config = array();
+
+ parent::tearDown();
}
public function test_invalid_extension()
diff --git a/tests/functional/fixtures/ext/foo/bar/composer.json b/tests/functional/fixtures/ext/foo/bar/composer.json
index 2f91426d2a..f0c7f0e6c1 100644
--- a/tests/functional/fixtures/ext/foo/bar/composer.json
+++ b/tests/functional/fixtures/ext/foo/bar/composer.json
@@ -13,10 +13,12 @@
"role": "Developer"
}],
"require": {
- "php": ">=5.3",
- "phpbb/phpbb": "3.1.*@dev"
+ "php": ">=5.3"
},
"extra": {
- "display-name": "phpBB 3.1 Extension Testing"
+ "display-name": "phpBB 3.1 Extension Testing",
+ "soft-require": {
+ "phpbb/phpbb": "3.1.*@dev"
+ }
}
}
diff --git a/tests/functional/forgot_password_test.php b/tests/functional/forgot_password_test.php
index 64fa19557f..c95efc5b2e 100644
--- a/tests/functional/forgot_password_test.php
+++ b/tests/functional/forgot_password_test.php
@@ -57,5 +57,7 @@ class phpbb_functional_forgot_password_test extends phpbb_functional_test_case
'config[allow_password_reset]' => 1,
));
$crawler = self::submit($form);
+
+ parent::tearDown();
}
}
diff --git a/tests/functional/jumpbox_test.php b/tests/functional/jumpbox_test.php
index 9eddcb6bf6..f5a671b1b9 100644
--- a/tests/functional/jumpbox_test.php
+++ b/tests/functional/jumpbox_test.php
@@ -20,18 +20,16 @@ class phpbb_functional_jumpbox_test extends phpbb_functional_test_case
{
$this->login();
- $crawler = self::request('GET', "viewtopic.php?t=1&sid={$this->sid}");
- $form = $crawler->filter('#quickmodform')->selectButton($this->lang('GO'))->form(array(
- 'action' => 'merge_topic',
- ));
+ $this->crawler = $this->get_quickmod_page(1, 'MERGE_TOPIC');
+ $this->check_valid_jump('Your first forum');
- $crawler = self::submit($form);
- $this->assertContains($this->lang('FORUM') . ': Your first forum', $crawler->filter('#cp-main h2')->text());
- $form = $crawler->filter('#jumpbox')->selectButton($this->lang('GO'))->form(array(
- 'f' => 1,
- ));
+ $link = $this->crawler->filter('#jumpbox')->selectLink('Your first category')->link()->getUri();
+ $this->crawler = self::request('GET', substr($link, strpos($link, 'mcp.')));
+ $this->check_valid_jump('Your first category');
+ }
- $crawler = self::submit($form);
- $this->assertContains($this->lang('FORUM') . ': Your first category', $crawler->filter('#cp-main h2')->text());
+ protected function check_valid_jump($forum)
+ {
+ $this->assertContains($this->lang('FORUM') . ": $forum", $this->crawler->filter('#cp-main h2')->text(), $this->crawler->text());
}
}
diff --git a/tests/functional/mcp_test.php b/tests/functional/mcp_test.php
index e4d950ef34..31d835f4fa 100644
--- a/tests/functional/mcp_test.php
+++ b/tests/functional/mcp_test.php
@@ -35,11 +35,7 @@ class phpbb_functional_mcp_test extends phpbb_functional_test_case
public function test_handle_quickmod($crawler)
{
// Test moving a post
- $form = $crawler->selectButton('Go')->eq(1)->form();
- $form['action']->select('merge');
- $crawler = self::submit($form);
-
- return $crawler;
+ return $this->get_quickmod_page(0, 'MERGE_POSTS', $crawler);
}
/**
diff --git a/tests/functional/plupload_test.php b/tests/functional/plupload_test.php
index ee71597ffc..d9faec035c 100644
--- a/tests/functional/plupload_test.php
+++ b/tests/functional/plupload_test.php
@@ -57,6 +57,8 @@ class phpbb_functional_plupload_test extends phpbb_functional_test_case
unlink($fileinfo->getPathname());
}
+
+ parent::tearDown();
}
public function get_urls()
diff --git a/tests/functional/posting_test.php b/tests/functional/posting_test.php
index 2611ef7bf1..fd802eed45 100644
--- a/tests/functional/posting_test.php
+++ b/tests/functional/posting_test.php
@@ -36,4 +36,27 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
$crawler = self::request('GET', "posting.php?mode=quote&f=2&t={$post2['topic_id']}&p={$post2['post_id']}&sid={$this->sid}");
$this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());
}
+
+ public function test_unsupported_characters()
+ {
+ $this->login();
+
+ $this->add_lang('posting');
+
+ self::create_post(2,
+ 1,
+ 'Unsupported characters',
+ "This is a test with these weird characters: \xF0\x9F\x88\xB3 \xF0\x9F\x9A\xB6",
+ array(),
+ 'Your message contains the following unsupported characters'
+ );
+
+ self::create_post(2,
+ 1,
+ "Unsupported: \xF0\x9F\x88\xB3 \xF0\x9F\x9A\xB6",
+ 'This is a test with emoji characters in the topic title.',
+ array(),
+ 'Your subject contains the following unsupported characters'
+ );
+ }
}
diff --git a/tests/functional/ucp_profile_test.php b/tests/functional/ucp_profile_test.php
index ea08eece78..e7abba9255 100644
--- a/tests/functional/ucp_profile_test.php
+++ b/tests/functional/ucp_profile_test.php
@@ -25,13 +25,25 @@ class phpbb_functional_ucp_profile_test extends phpbb_functional_test_case
$this->assertContainsLang('UCP_PROFILE_PROFILE_INFO', $crawler->filter('#cp-main h2')->text());
$form = $crawler->selectButton('Submit')->form(array(
+ 'pf_phpbb_facebook' => 'phpbb',
+ 'pf_phpbb_googleplus' => 'phpbb',
'pf_phpbb_location' => 'Bertie´s Empire',
+ 'pf_phpbb_skype' => 'phpbb.skype.account',
+ 'pf_phpbb_twitter' => 'phpbb_twitter',
+ 'pf_phpbb_youtube' => 'phpbb.youtube',
));
+
$crawler = self::submit($form);
$this->assertContainsLang('PROFILE_UPDATED', $crawler->filter('#message')->text());
$crawler = self::request('GET', 'ucp.php?i=ucp_profile&mode=profile_info');
$form = $crawler->selectButton('Submit')->form();
+
+ $this->assertEquals('phpbb', $form->get('pf_phpbb_facebook')->getValue());
+ $this->assertEquals('phpbb', $form->get('pf_phpbb_googleplus')->getValue());
$this->assertEquals('Bertie´s Empire', $form->get('pf_phpbb_location')->getValue());
+ $this->assertEquals('phpbb.skype.account', $form->get('pf_phpbb_skype')->getValue());
+ $this->assertEquals('phpbb_twitter', $form->get('pf_phpbb_twitter')->getValue());
+ $this->assertEquals('phpbb.youtube', $form->get('pf_phpbb_youtube')->getValue());
}
}
diff --git a/tests/functional/visibility_softdelete_test.php b/tests/functional/visibility_softdelete_test.php
index 5b5f09905c..794f0cde68 100644
--- a/tests/functional/visibility_softdelete_test.php
+++ b/tests/functional/visibility_softdelete_test.php
@@ -186,11 +186,7 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
'forum_last_post_id' => 0,
), 'before moving #2');
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
-
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('move');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'MOVE_TOPIC');
$this->assertContainsLang('SELECT_DESTINATION_FORUM', $crawler->text());
$this->add_lang('mcp');
@@ -261,12 +257,8 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
'forum_last_post_id' => $this->data['posts']['Soft Delete Topic #1'],
), 'before softdeleting #2');
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
-
$this->add_lang('posting');
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('delete_topic');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'DELETE_TOPIC');
$this->assertContainsLang('DELETE_PERMANENTLY', $crawler->text());
$this->add_lang('mcp');
@@ -336,11 +328,7 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
'forum_last_post_id' => 0,
), 'before moving #2');
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
-
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('move');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'MOVE_TOPIC');
$this->assertContainsLang('SELECT_DESTINATION_FORUM', $crawler->text());
$this->add_lang('mcp');
@@ -484,12 +472,9 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
'forum_last_post_id' => 0,
), 'before splitting #2');
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'SPLIT_TOPIC');
$this->add_lang('mcp');
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('split');
- $crawler = self::submit($form);
$this->assertContainsLang('SPLIT_TOPIC_EXPLAIN', $crawler->text());
$form = $crawler->selectButton('Submit')->form(array(
@@ -546,12 +531,7 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
),
));
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #2']}&sid={$this->sid}");
-
- $form = $crawler->selectButton('Go')->eq(1)->form();
- $form['action']->select('move');
- $crawler = self::submit($form);
-
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #2'], 'MOVE_TOPIC');
$form = $crawler->selectButton('Yes')->form();
$form['to_forum_id']->select($this->data['forums']['Soft Delete #1']);
$crawler = self::submit($form);
@@ -605,9 +585,7 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
$this->assertContainsLang('BOOKMARK_ADDED', $crawler_bookmark->text());
$this->add_lang('mcp');
- $form = $crawler->selectButton('Go')->eq(1)->form();
- $form['action']->select('merge_topic');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #2'], 'MERGE_TOPIC', $crawler);
$this->assertContainsLang('SELECT_MERGE', $crawler->text());
$crawler = self::request('GET', "mcp.php?f={$this->data['forums']['Soft Delete #1']}&t={$this->data['topics']['Soft Delete Topic #2']}&i=main&mode=forum_view&action=merge_topic&to_topic_id={$this->data['topics']['Soft Delete Topic #1']}");
@@ -670,12 +648,8 @@ class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_
'forum_last_post_id' => 0,
), 'before forking #2');
- $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
-
$this->add_lang('mcp');
- $form = $crawler->selectButton('Go')->eq(2)->form();
- $form['action']->select('fork');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'FORK_TOPIC');
$this->assertContainsLang('FORK_TOPIC', $crawler->text());
$form = $crawler->selectButton('Yes')->form();
diff --git a/tests/functions/convert_30_dbms_to_31_test.php b/tests/functions/convert_30_dbms_to_31_test.php
index 9647eb341c..a3992aef5c 100644
--- a/tests/functions/convert_30_dbms_to_31_test.php
+++ b/tests/functions/convert_30_dbms_to_31_test.php
@@ -18,7 +18,6 @@ class phpbb_convert_30_dbms_to_31_test extends phpbb_test_case
public function convert_30_dbms_to_31_data()
{
return array(
- array('firebird'),
array('mssql'),
array('mssql_odbc'),
array('mssqlnative'),
diff --git a/tests/functions/obtain_online_test.php b/tests/functions/obtain_online_test.php
index 830b52fb4c..e793a4eb82 100644
--- a/tests/functions/obtain_online_test.php
+++ b/tests/functions/obtain_online_test.php
@@ -128,19 +128,19 @@ class phpbb_functions_obtain_online_test extends phpbb_database_test_case
{
return array(
array(0, false, array(
- 'online_userlist' => 'REGISTERED_USERS 2, 3',
+ 'online_userlist' => 'REGISTERED_USERS <span class="username">2</span>, <span class="username">3</span>',
'l_online_users' => 'ONLINE_USERS_TOTAL 5 REG_USERS_TOTAL 2 HIDDEN_USERS_TOTAL 3',
)),
array(0, true, array(
- 'online_userlist' => 'REGISTERED_USERS 2, 3',
+ 'online_userlist' => 'REGISTERED_USERS <span class="username">2</span>, <span class="username">3</span>',
'l_online_users' => 'ONLINE_USERS_TOTAL_GUESTS 7 REG_USERS_TOTAL 2 HIDDEN_USERS_TOTAL 3 GUEST_USERS_TOTAL 2',
)),
array(1, false, array(
- 'online_userlist' => 'BROWSING_FORUM 3',
+ 'online_userlist' => 'BROWSING_FORUM <span class="username">3</span>',
'l_online_users' => 'ONLINE_USERS_TOTAL 2 REG_USERS_TOTAL 1 HIDDEN_USERS_TOTAL 1',
)),
array(1, true, array(
- 'online_userlist' => 'BROWSING_FORUM_GUESTS 1 3',
+ 'online_userlist' => 'BROWSING_FORUM_GUESTS 1 <span class="username">3</span>',
'l_online_users' => 'ONLINE_USERS_TOTAL_GUESTS 3 REG_USERS_TOTAL 1 HIDDEN_USERS_TOTAL 1 GUEST_USERS_TOTAL 1',
)),
array(2, false, array(
diff --git a/tests/functions_content/get_username_string_test.php b/tests/functions_content/get_username_string_test.php
index 502796d1df..01ec97f6a4 100644
--- a/tests/functions_content/get_username_string_test.php
+++ b/tests/functions_content/get_username_string_test.php
@@ -94,11 +94,11 @@ class phpbb_functions_content_get_username_string_test extends phpbb_test_case
global $phpbb_root_path, $phpEx;
return array(
- array(0, '', '', false, false, 'Guest'),
- array(ANONYMOUS, 'Anonymous', '', false, false, 'Anonymous'),
+ array(0, '', '', false, false, '<span class="username">Guest</span>'),
+ array(ANONYMOUS, 'Anonymous', '', false, false, '<span class="username">Anonymous</span>'),
array(2, 'Administrator', 'FF0000', false, false, '<a href="' . $phpbb_root_path . 'memberlist.' . $phpEx . '?mode=viewprofile&amp;u=2" style="color: #FF0000;" class="username-coloured">Administrator</a>'),
- array(5, 'User5', '', false, 'http://www.example.org/user.php?mode=show', '<a href="http://www.example.org/user.php?mode=show&amp;u=5">User5</a>'),
- array(8, 'Eight', '', false, false, '<a href="' . $phpbb_root_path . 'memberlist.php?mode=viewprofile&amp;u=8">Eight</a>'),
+ array(5, 'User5', '', false, 'http://www.example.org/user.php?mode=show', '<a href="http://www.example.org/user.php?mode=show&amp;u=5" class="username">User5</a>'),
+ array(8, 'Eight', '', false, false, '<a href="' . $phpbb_root_path . 'memberlist.php?mode=viewprofile&amp;u=8" class="username">Eight</a>'),
);
}
@@ -113,10 +113,10 @@ class phpbb_functions_content_get_username_string_test extends phpbb_test_case
public function get_username_string_no_profile_data()
{
return array(
- array(ANONYMOUS, 'Anonymous', '', false, false, 'Anonymous'),
- array(ANONYMOUS, 'Anonymous', '', '', false, 'Guest'),
+ array(ANONYMOUS, 'Anonymous', '', false, false, '<span class="username">Anonymous</span>'),
+ array(ANONYMOUS, 'Anonymous', '', '', false, '<span class="username">Guest</span>'),
array(2, 'Administrator', 'FF0000', false, false, '<span style="color: #FF0000;" class="username-coloured">Administrator</span>'),
- array(8, 'Eight', '', false, false, 'Eight'),
+ array(8, 'Eight', '', false, false, '<span class="username">Eight</span>'),
);
}
diff --git a/tests/log/function_view_log_test.php b/tests/log/function_view_log_test.php
index b7e60c7393..02e0b3912f 100644
--- a/tests/log/function_view_log_test.php
+++ b/tests/log/function_view_log_test.php
@@ -40,7 +40,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -59,7 +59,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -78,7 +78,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -97,7 +97,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -118,7 +118,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -139,7 +139,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -160,7 +160,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -177,11 +177,11 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'reportee_id' => 2,
'reportee_username' => 'admin',
- 'reportee_username_full'=> 'admin',
+ 'reportee_username_full'=> '<span class="username">admin</span>',
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -196,11 +196,11 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'reportee_id' => 1,
'reportee_username' => 'Anonymous',
- 'reportee_username_full'=> 'Anonymous',
+ 'reportee_username_full'=> '<span class="username">Anonymous</span>',
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -219,7 +219,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
@@ -238,7 +238,7 @@ class phpbb_log_function_view_log_test extends phpbb_database_test_case
'user_id' => 1,
'username' => 'Anonymous',
- 'username_full' => 'Anonymous',
+ 'username_full' => '<span class="username">Anonymous</span>',
'ip' => '127.0.0.1',
'time' => 1,
diff --git a/tests/notification/user_list_trim_test.php b/tests/notification/user_list_trim_test.php
index 7e0add2bb5..851c9ec221 100644
--- a/tests/notification/user_list_trim_test.php
+++ b/tests/notification/user_list_trim_test.php
@@ -75,7 +75,7 @@ class phpbb_notification_user_list_trim_test extends phpbb_database_test_case
'post_username' => 'A',
'responders' => null,
),
- 'A replied to the topic “Test”.',
+ '<strong>Reply</strong> from A in topic:',
),
array(
array(
@@ -86,7 +86,7 @@ class phpbb_notification_user_list_trim_test extends phpbb_database_test_case
array('username' => '', 'poster_id' => 3),
),
),
- 'A and B replied to the topic “Test”.',
+ '<strong>Reply</strong> from A and <span class="username">B</span> in topic:',
),
array(
array(
@@ -98,7 +98,7 @@ class phpbb_notification_user_list_trim_test extends phpbb_database_test_case
array('username' => '', 'poster_id' => 4),
),
),
- 'A, B, and C replied to the topic “Test”.',
+ '<strong>Reply</strong> from A, <span class="username">B</span>, and <span class="username">C</span> in topic:',
),
array(
array(
@@ -111,7 +111,7 @@ class phpbb_notification_user_list_trim_test extends phpbb_database_test_case
array('username' => '', 'poster_id' => 5),
),
),
- 'A, B, C, and D replied to the topic “Test”.',
+ '<strong>Reply</strong> from A, <span class="username">B</span>, <span class="username">C</span>, and <span class="username">D</span> in topic:',
),
array(
array(
@@ -125,7 +125,7 @@ class phpbb_notification_user_list_trim_test extends phpbb_database_test_case
array('username' => '', 'poster_id' => 6),
),
),
- 'A, B, C, and 2 others replied to the topic “Test”.',
+ '<strong>Reply</strong> from A, <span class="username">B</span>, <span class="username">C</span>, and 2 others in topic:',
),
);
}
diff --git a/tests/path_helper/path_helper_test.php b/tests/path_helper/path_helper_test.php
index a3ad901379..9866cb6efe 100644
--- a/tests/path_helper/path_helper_test.php
+++ b/tests/path_helper/path_helper_test.php
@@ -13,6 +13,7 @@
class phpbb_path_helper_test extends phpbb_test_case
{
+ /** @var \phpbb\path_helper */
protected $path_helper;
protected $phpbb_root_path = '';
@@ -20,7 +21,8 @@ class phpbb_path_helper_test extends phpbb_test_case
{
parent::setUp();
- $this->set_phpbb_root_path();
+ $filesystem = new \phpbb\filesystem();
+ $this->set_phpbb_root_path($filesystem);
$this->path_helper = new \phpbb\path_helper(
new \phpbb\symfony_request(
@@ -40,9 +42,9 @@ class phpbb_path_helper_test extends phpbb_test_case
* any time we wish to use it in one of these functions (and
* also in general for everything else)
*/
- public function set_phpbb_root_path()
+ public function set_phpbb_root_path($filesystem)
{
- $this->phpbb_root_path = dirname(__FILE__) . './../../phpBB/';
+ $this->phpbb_root_path = $filesystem->clean_path(dirname(__FILE__) . '/../../phpBB/');
}
public function test_get_web_root_path()
@@ -53,7 +55,8 @@ class phpbb_path_helper_test extends phpbb_test_case
public function basic_update_web_root_path_data()
{
- $this->set_phpbb_root_path();
+ $filesystem = new \phpbb\filesystem();
+ $this->set_phpbb_root_path($filesystem);
return array(
array(
@@ -71,7 +74,7 @@ class phpbb_path_helper_test extends phpbb_test_case
),
array(
$this->phpbb_root_path . $this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . $this->phpbb_root_path . 'test.php',
+ $filesystem->clean_path($this->phpbb_root_path . $this->phpbb_root_path . 'test.php'),
),
);
}
@@ -81,51 +84,55 @@ class phpbb_path_helper_test extends phpbb_test_case
*/
public function test_basic_update_web_root_path($input, $expected)
{
- $this->assertEquals($expected, $this->path_helper->update_web_root_path($input, $symfony_request));
+ $this->assertEquals($expected, $this->path_helper->update_web_root_path($input));
}
public function update_web_root_path_data()
{
- $this->set_phpbb_root_path();
+ $this->set_phpbb_root_path(new \phpbb\filesystem());
return array(
array(
$this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . 'test.php',
'/',
+ null,
+ null,
+ '',
),
array(
$this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . '../test.php',
'//',
+ null,
+ null,
+ './../',
),
array(
$this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . '../test.php',
'//',
'foo/bar.php',
'bar.php',
+ './../',
),
array(
$this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . '../../test.php',
'/foo/template',
'/phpbb3-fork/phpBB/app.php/foo/template',
'/phpbb3-fork/phpBB/app.php',
+ './../../',
),
array(
$this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . '../test.php',
'/foo/template',
'/phpbb3-fork/phpBB/foo/template',
'/phpbb3-fork/phpBB/app.php',
+ './../',
),
array(
$this->phpbb_root_path . 'test.php',
- $this->phpbb_root_path . '../test.php',
'/',
'/phpbb3-fork/phpBB/app.php/',
'/phpbb3-fork/phpBB/app.php',
+ './../',
),
);
}
@@ -133,9 +140,9 @@ class phpbb_path_helper_test extends phpbb_test_case
/**
* @dataProvider update_web_root_path_data
*/
- public function test_update_web_root_path($input, $expected, $getPathInfo, $getRequestUri = null, $getScriptName = null)
+ public function test_update_web_root_path($input, $getPathInfo, $getRequestUri, $getScriptName, $correction)
{
- $symfony_request = $this->getMock("\phpbb\symfony_request", array(), array(
+ $symfony_request = $this->getMock('\phpbb\symfony_request', array(), array(
new phpbb_mock_request(),
));
$symfony_request->expects($this->any())
@@ -155,7 +162,7 @@ class phpbb_path_helper_test extends phpbb_test_case
'php'
);
- $this->assertEquals($expected, $path_helper->update_web_root_path($input, $symfony_request));
+ $this->assertEquals($correction . $input, $path_helper->update_web_root_path($input, $symfony_request));
}
public function clean_url_data()
diff --git a/tests/profile/custom_string_test.php b/tests/profile/custom_string_test.php
deleted file mode 100644
index 9e45d05ae3..0000000000
--- a/tests/profile/custom_string_test.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
-
-class phpbb_profile_custom_string_test extends phpbb_database_test_case
-{
- public function getDataSet()
- {
- return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/profile_fields.xml');
- }
-
- static public function string_fields()
- {
- return array(
- // note, there is an offset of 1 between option_id (0-indexed)
- // in the database and values (1-indexed) to avoid problems with
- // transmitting 0 in an HTML form
- // required, value, validation, expected, description
- array(
- 1,
- 'H3110',
- '[0-9]+',
- 'FIELD_INVALID_CHARS_NUMBERS_ONLY-field',
- 'Required field should reject characters in a numbers-only field',
- ),
- array(
- 1,
- 'This string is too long',
- '.*',
- 'FIELD_TOO_LONG-10-field',
- 'Required field should reject a field too long',
- ),
- array(
- 0,
- '&lt;&gt;&quot;&amp;%&amp;&gt;&lt;&gt;',
- '.*',
- false,
- 'Optional field should accept html entities',
- ),
- array(
- 1,
- 'ö ä ü ß',
- '.*',
- false,
- 'Required field should accept UTF-8 string',
- ),
- array(
- 1,
- 'This ö ä string has to b',
- '.*',
- 'FIELD_TOO_LONG-10-field',
- 'Required field should reject an UTF-8 string which is too long',
- ),
- array(
- 1,
- 'ö äö äö ä',
- '[\w]+',
- 'FIELD_INVALID_CHARS_ALPHA_ONLY-field',
- 'Required field should reject UTF-8 in alpha only field',
- ),
- array(
- 1,
- 'Hello',
- '[\w]+',
- false,
- 'Required field should accept a characters only field',
- ),
- );
- }
-
- /**
- * @dataProvider string_fields
- */
- public function test_string_validate($field_required, $field_value, $field_validation, $expected, $description)
- {
- $db = $this->new_dbal();
-
- $field_data = array(
- 'field_id' => 1,
- 'lang_id' => 1,
- 'lang_name' => 'field',
- 'field_novalue' => 1,
- 'field_required' => $field_required,
- 'field_maxlen' => 10,
- 'field_validation' => $field_validation,
- );
- $user = $this->getMock('\phpbb\user');
- $user->expects($this->any())
- ->method('lang')
- ->will($this->returnCallback(array($this, 'return_callback_implode')));
-
- $request = $this->getMock('\phpbb\request\request');
- $template = $this->getMock('\phpbb\template\template');
-
- $cp = new \phpbb\profilefields\type\type_string(
- $request,
- $template,
- $user
- );
- $result = $cp->validate_profile_field($field_value, $field_data);
-
- $this->assertEquals($expected, $result, $description);
- }
-
- public function return_callback_implode()
- {
- return implode('-', func_get_args());
- }
-}
diff --git a/tests/profile/custom_test.php b/tests/profile/custom_test.php
deleted file mode 100644
index 8570e8e6ee..0000000000
--- a/tests/profile/custom_test.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-class phpbb_profile_custom_test extends phpbb_database_test_case
-{
- public function getDataSet()
- {
- return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/profile_fields.xml');
- }
-
- static public function dropdown_fields()
- {
- return array(
- // note, there is an offset of 1 between option_id (0-indexed)
- // in the database and values (1-indexed) to avoid problems with
- // transmitting 0 in an HTML form
- // required, value, expected
- array(1, '0', 'FIELD_INVALID_VALUE-field', 'Required field should throw error for out-of-range value'),
- array(1, '1', 'FIELD_REQUIRED-field', 'Required field should throw error for default value'),
- array(1, '2', false, 'Required field should accept non-default value'),
- array(0, '0', 'FIELD_INVALID_VALUE-field', 'Optional field should throw error for out-of-range value'),
- array(0, '1', false, 'Optional field should accept default value'),
- array(0, '2', false, 'Optional field should accept non-default value'),
- );
- }
-
- /**
- * @dataProvider dropdown_fields
- */
- public function test_dropdown_validate($field_required, $field_value, $expected, $description)
- {
- global $db, $table_prefix;
- $db = $this->new_dbal();
-
- $field_data = array(
- 'field_id' => 1,
- 'lang_id' => 1,
- 'lang_name' => 'field',
- 'field_novalue' => 1,
- 'field_required' => $field_required,
- );
- $user = $this->getMock('\phpbb\user');
- $user->expects($this->any())
- ->method('lang')
- ->will($this->returnCallback(array($this, 'return_callback_implode')));
-
- $request = $this->getMock('\phpbb\request\request');
- $template = $this->getMock('\phpbb\template\template');
-
- $cp = new \phpbb\profilefields\type\type_dropdown(
- new \phpbb\profilefields\lang_helper($db, $table_prefix . 'profile_fields_lang'),
- $request,
- $template,
- $user
- );
- $result = $cp->validate_profile_field($field_value, $field_data);
-
- $this->assertEquals($expected, $result, $description);
- }
-
- public function return_callback_implode()
- {
- return implode('-', func_get_args());
- }
-}
diff --git a/tests/profile/fixtures/profile_fields.xml b/tests/profile/fixtures/profile_fields.xml
deleted file mode 100644
index e0c260bbf5..0000000000
--- a/tests/profile/fixtures/profile_fields.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<dataset>
- <table name="phpbb_profile_fields_lang">
- <column>field_id</column>
- <column>lang_id</column>
- <column>option_id</column>
- <column>field_type</column>
- <column>lang_value</column>
- <row>
- <value>1</value>
- <value>1</value>
- <value>0</value>
- <value>profilefields.type.dropdown</value>
- <value>Default Option</value>
- </row>
- <row>
- <value>1</value>
- <value>1</value>
- <value>1</value>
- <value>profilefields.type.dropdown</value>
- <value>First Alternative</value>
- </row>
- <row>
- <value>1</value>
- <value>1</value>
- <value>2</value>
- <value>profilefields.type.dropdown</value>
- <value>Third Alternative</value>
- </row>
- </table>
-</dataset>
diff --git a/tests/profile/get_profile_value_test.php b/tests/profile/get_profile_value_test.php
deleted file mode 100644
index 7a4a4ab5c2..0000000000
--- a/tests/profile/get_profile_value_test.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
-
-class phpbb_profile_get_profile_value_test extends phpbb_test_case
-{
- static public function get_profile_value_int_data()
- {
- return array(
- array('\phpbb\profilefields\type\type_int', '10', true, 10),
- array('\phpbb\profilefields\type\type_int', '0', true, 0),
- array('\phpbb\profilefields\type\type_int', '', true, 0),
- array('\phpbb\profilefields\type\type_int', null, true, 0),
- array('\phpbb\profilefields\type\type_int', '10', false, 10),
- array('\phpbb\profilefields\type\type_int', '0', false, 0),
- array('\phpbb\profilefields\type\type_int', '', false, null),
- array('\phpbb\profilefields\type\type_int', null, false, null),
- );
- }
-
- /**
- * @dataProvider get_profile_value_int_data
- */
- public function test_get_profile_value_int($type, $value, $show_novalue, $expected)
- {
- $cp = new $type(
- $this->getMock('\phpbb\request\request'),
- $this->getMock('\phpbb\template\template'),
- $this->getMock('\phpbb\user')
- );
-
- $this->assertSame($expected, $cp->get_profile_value($value, array(
- 'field_type' => $type,
- 'field_show_novalue' => $show_novalue,
- )));
- }
-}
diff --git a/tests/profilefields/type_bool_test.php b/tests/profilefields/type_bool_test.php
new file mode 100644
index 0000000000..bdab179c8c
--- /dev/null
+++ b/tests/profilefields/type_bool_test.php
@@ -0,0 +1,195 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_profilefield_type_bool_test extends phpbb_test_case
+{
+ protected $cp;
+ protected $field_options = array();
+ protected $options = array();
+
+ /**
+ * Sets up basic test objects
+ *
+ * @access public
+ * @return void
+ */
+ public function setUp()
+ {
+ $user = $this->getMock('\phpbb\user');
+ $user->expects($this->any())
+ ->method('lang')
+ ->will($this->returnCallback(array($this, 'return_callback_implode')));
+
+ $lang = $this->getMock('\phpbb\profilefields\lang_helper', array(), array(null, null));
+
+ $lang->expects($this->any())
+ ->method('get_options_lang');
+
+ $lang->expects($this->any())
+ ->method('is_set')
+ ->will($this->returnCallback(array($this, 'is_set_callback')));
+
+ $lang->expects($this->any())
+ ->method('get')
+ ->will($this->returnCallback(array($this, 'get')));
+
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $this->cp = new \phpbb\profilefields\type\type_bool(
+ $lang,
+ $request,
+ $template,
+ $user
+ );
+
+ $this->field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_bool',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ 'field_default_value' => 1,
+ 'field_length' => 1,
+ );
+
+ $this->options = array(
+ 0 => 'Yes',
+ 1 => 'No',
+ );
+ }
+
+ public function validate_profile_field_data()
+ {
+ return array(
+ array(
+ false,
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should not accept empty values for required fields',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider validate_profile_field_data
+ */
+ public function test_validate_profile_field($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->validate_profile_field($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_data()
+ {
+ return array(
+ array(
+ false,
+ array('field_show_novalue' => true),
+ 'No',
+ 'Field should output the default value',
+ ),
+ array(
+ false,
+ array('field_show_novalue' => false, 'field_length' => 2),
+ null,
+ 'Field should not show anything for empty value',
+ ),
+ array(
+ 0,
+ array(),
+ 'Yes',
+ 'Field should show the set value',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_data
+ */
+ public function test_get_profile_value($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_raw_data()
+ {
+ return array(
+ array(
+ '4',
+ array('field_show_novalue' => true),
+ '4',
+ 'Field should return the correct raw value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should return correct raw value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ null,
+ 'Field should return correct raw value',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => false),
+ null,
+ 'Field should return correct raw value',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => true),
+ null,
+ 'Field should return correct raw value',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_raw_data
+ */
+ public function test_get_profile_value_raw($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value_raw($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function is_set_callback($field_id, $lang_id, $field_value)
+ {
+ return isset($this->options[$field_value]);
+ }
+
+ public function get($field_id, $lang_id, $field_value)
+ {
+ return $this->options[$field_value];
+ }
+
+ public function return_callback_implode()
+ {
+ return implode('-', func_get_args());
+ }
+}
diff --git a/tests/profilefields/type_date_test.php b/tests/profilefields/type_date_test.php
new file mode 100644
index 0000000000..0ad2cde9fe
--- /dev/null
+++ b/tests/profilefields/type_date_test.php
@@ -0,0 +1,228 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_profilefield_type_date_test extends phpbb_test_case
+{
+ protected $cp;
+ protected $field_options;
+ protected $user;
+
+ /**
+ * Sets up basic test objects
+ *
+ * @access public
+ * @return null
+ */
+ public function setUp()
+ {
+ $this->user = $this->getMock('\phpbb\user');
+ $this->user->expects($this->any())
+ ->method('lang')
+ ->will($this->returnCallback(array($this, 'return_callback_implode')));
+
+ $this->user->expects($this->any())
+ ->method('create_datetime')
+ ->will($this->returnCallback(array($this, 'create_datetime_callback')));
+
+ $this->user->timezone = new DateTimeZone('UTC');
+ $this->user->lang = array(
+ 'datetime' => array(),
+ 'DATE_FORMAT' => 'm/d/Y',
+ );
+
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $this->cp = new \phpbb\profilefields\type\type_date(
+ $request,
+ $template,
+ $this->user
+ );
+
+ $this->field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_date',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ );
+ }
+
+ public function profile_value_data()
+ {
+ return array(
+ array(
+ '01-01-2009',
+ array('field_show_novalue' => true),
+ '01/01/2009',
+ 'Field should output the correctly formatted date',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => false),
+ null,
+ 'Field should leave empty value as is',
+ ),
+ array(
+ 'None',
+ array('field_show_novalue' => true),
+ 'None',
+ 'Field should leave invalid value as is',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_data
+ */
+ public function test_get_profile_value($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function validate_profile_field_data()
+ {
+ return array(
+ array(
+ '',
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should reject value for being empty',
+ ),
+ array(
+ '0125',
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ '01-01-2012',
+ array(),
+ false,
+ 'Field should accept a valid value',
+ ),
+ array(
+ '40-05-2009',
+ array(),
+ 'FIELD_INVALID_DATE-field',
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ '12-30-2012',
+ array(),
+ 'FIELD_INVALID_DATE-field',
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ 'string',
+ array(),
+ false,
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ 'string',
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ 100,
+ array(),
+ false,
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ 100,
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should reject value for being invalid',
+ ),
+ array(
+ null,
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should reject value for being empty',
+ ),
+ array(
+ true,
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should reject value for being empty',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider validate_profile_field_data
+ */
+ public function test_validate_profile_field($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->validate_profile_field($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_raw_data()
+ {
+ return array(
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should return the correct raw value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ '',
+ 'Field should return correct raw value',
+ ),
+ array(
+ '12/06/2014',
+ array('field_show_novalue' => true),
+ '12/06/2014',
+ 'Field should return correct raw value',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_raw_data
+ */
+ public function test_get_profile_value_raw($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value_raw($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function return_callback_implode()
+ {
+ return implode('-', func_get_args());
+ }
+
+ public function create_datetime_callback($time = 'now', \DateTimeZone $timezone = null)
+ {
+ $timezone = $timezone ?: $this->user->timezone;
+ return new \phpbb\datetime($this->user, $time, $timezone);
+ }
+}
diff --git a/tests/profilefields/type_dropdown_test.php b/tests/profilefields/type_dropdown_test.php
new file mode 100644
index 0000000000..ebecbf97f0
--- /dev/null
+++ b/tests/profilefields/type_dropdown_test.php
@@ -0,0 +1,235 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_profilefield_type_dropdown_test extends phpbb_test_case
+{
+ protected $cp;
+ protected $field_options = array();
+ protected $dropdown_options = array();
+
+ /**
+ * Sets up basic test objects
+ *
+ * @access public
+ * @return null
+ */
+ public function setUp()
+ {
+ $user = $this->getMock('\phpbb\user');
+ $user->expects($this->any())
+ ->method('lang')
+ ->will($this->returnCallback(array($this, 'return_callback_implode')));
+
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $lang = $this->getMock('\phpbb\profilefields\lang_helper', array(), array(null, null));
+
+ $lang->expects($this->any())
+ ->method('get_options_lang');
+
+ $lang->expects($this->any())
+ ->method('is_set')
+ ->will($this->returnCallback(array($this, 'is_set_callback')));
+
+ $lang->expects($this->any())
+ ->method('get')
+ ->will($this->returnCallback(array($this, 'get')));
+
+ $this->cp = new \phpbb\profilefields\type\type_dropdown(
+ $lang,
+ $request,
+ $template,
+ $user
+ );
+
+ $this->field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_dropdown',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ 'field_validation' => '.*',
+ 'field_novalue' => 0,
+ );
+
+ $this->dropdown_options = array(
+ 0 => '<No Value>',
+ 1 => 'Option 1',
+ 2 => 'Option 2',
+ 3 => 'Option 3',
+ 4 => 'Option 4',
+ );
+ }
+
+ public function validate_profile_field_data()
+ {
+ return array(
+ array(
+ 7,
+ array(),
+ 'FIELD_INVALID_VALUE-field',
+ 'Invalid value should throw error',
+ ),
+ array(
+ true,
+ array('field_required' => true),
+ false,
+ 'Boolean would evaluate to 1 and hence correct value',
+ ),
+ array(
+ 'string',
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'String should be rejected for value',
+ ),
+ array(
+ 2,
+ array(),
+ false,
+ 'Valid value should not throw error'
+ ),
+ array(
+ 0,
+ array(),
+ false,
+ 'Empty value should be acceptible',
+ ),
+ array(
+ 0,
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Required field should not accept empty value',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider validate_profile_field_data
+ */
+ public function test_validate_profile_field($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->validate_profile_field($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_data()
+ {
+ return array(
+ array(
+ 1,
+ array('field_show_novalue' => true),
+ 'Option 1',
+ 'Field should output the given value',
+ ),
+ array(
+ 4,
+ array('field_show_novalue' => false),
+ 'Option 4',
+ 'Field should output the given value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ '<No Value>',
+ 'Field should output nothing for empty value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should simply output null for empty value',
+ ),
+ );
+ }
+
+
+ /**
+ * @dataProvider profile_value_data
+ */
+ public function test_get_profile_value($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_raw_data()
+ {
+ return array(
+ array(
+ '4',
+ array('field_show_novalue' => true),
+ '4',
+ 'Field should return the correct raw value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should null for empty value without show_novalue',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should return 0 for empty value with show_novalue',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => false),
+ null,
+ 'Field should return correct raw value',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should return 0 for empty value with show_novalue',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_raw_data
+ */
+ public function test_get_profile_value_raw($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value_raw($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function is_set_callback($field_id, $lang_id, $field_value)
+ {
+ return isset($this->dropdown_options[$field_value]);
+ }
+
+ public function get($field_id, $lang_id, $field_value)
+ {
+ return $this->dropdown_options[$field_value];
+ }
+
+ public function return_callback_implode()
+ {
+ return implode('-', func_get_args());
+ }
+}
diff --git a/tests/profilefields/type_googleplus_test.php b/tests/profilefields/type_googleplus_test.php
new file mode 100644
index 0000000000..fdbdd86553
--- /dev/null
+++ b/tests/profilefields/type_googleplus_test.php
@@ -0,0 +1,62 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_profilefield_type_googleplus_test extends phpbb_test_case
+{
+ public function get_profile_contact_value_data()
+ {
+ return array(
+ array(
+ '112010191010100',
+ array(),
+ '112010191010100',
+ 'Field should return a numerical Google+ ID as is',
+ ),
+ array(
+ 'TestUsername',
+ array(),
+ '+TestUsername',
+ 'Field should return a string Google+ ID with a + prefixed',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider get_profile_contact_value_data
+ */
+ public function test_get_profile_contact_value($value, $field_options, $expected, $description)
+ {
+ $user = $this->getMock('\phpbb\user');
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $field = new \phpbb\profilefields\type\type_googleplus(
+ $request,
+ $template,
+ $user
+ );
+
+ $default_field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_googleplus',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ 'field_validation' => '[\w]+',
+ );
+ $field_options = array_merge($default_field_options, $field_options);
+
+ $this->assertSame($expected, $field->get_profile_contact_value($value, $field_options), $description);
+ }
+}
diff --git a/tests/profilefields/type_int_test.php b/tests/profilefields/type_int_test.php
new file mode 100644
index 0000000000..ac48c10a84
--- /dev/null
+++ b/tests/profilefields/type_int_test.php
@@ -0,0 +1,236 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_profilefield_type_int_test extends phpbb_test_case
+{
+ protected $cp;
+ protected $field_options;
+
+ /**
+ * Sets up basic test objects
+ *
+ * @access public
+ * @return null
+ */
+ public function setUp()
+ {
+ $user = $this->getMock('\phpbb\user');
+ $user->expects($this->any())
+ ->method('lang')
+ ->will($this->returnCallback(array($this, 'return_callback_implode')));
+
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $this->cp = new \phpbb\profilefields\type\type_int(
+ $request,
+ $template,
+ $user
+ );
+
+ $this->field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_int',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ );
+ }
+
+ public function profile_value_data()
+ {
+ return array(
+ array(
+ '10',
+ array('field_show_novalue' => true),
+ 10,
+ 'Field should output integer value of given input',
+ ),
+ array(
+ '0',
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should output integer value of given input',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should translate empty value to 0 as integer',
+ false,
+ ),
+ array(
+ null,
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should translate null value to 0 as integer',
+ ),
+ array(
+ '10',
+ array('field_show_novalue' => false),
+ 10,
+ 'Field should output integer value of given input',
+ ),
+ array(
+ '0',
+ array('field_show_novalue' => false),
+ 0,
+ 'Field should output integer value of given input',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should leave empty value as is',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => false),
+ null,
+ 'Field should leave empty value as is',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_data
+ */
+ public function test_get_profile_value($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function validate_profile_field_data()
+ {
+ return array(
+ array(
+ '15',
+ array('field_minlen' => 10, 'field_maxlen' => 20, 'field_required' => true),
+ false,
+ 'Field should accept input of correct boundaries',
+ ),
+ array(
+ '556476',
+ array('field_maxlen' => 50000, 'field_required' => true),
+ 'FIELD_TOO_LARGE-50000-field',
+ 'Field should reject value of greater value than max',
+ ),
+ array(
+ '9',
+ array('field_minlen' => 10, 'field_required' => true),
+ 'FIELD_TOO_SMALL-10-field',
+ 'Field should reject value which is less than defined minimum',
+ ),
+ array(
+ true,
+ array('field_maxlen' => 20),
+ false,
+ 'Field should accept correct boolean value',
+ ),
+ array(
+ 'string',
+ array('field_maxlen' => 10, 'field_required' => true),
+ false,
+ 'Field should accept correct string value',
+ ),
+ array(
+ null,
+ array('field_minlen' => 1, 'field_maxlen' => 10, 'field_required' => true),
+ 'FIELD_TOO_SMALL-1-field',
+ 'Field should not accept an empty value',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider validate_profile_field_data
+ */
+ public function test_validate_profile_field($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->validate_profile_field($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_raw_data()
+ {
+ return array(
+ array(
+ '10',
+ array('field_show_novalue' => true),
+ 10,
+ 'Field should return the correct raw value',
+ ),
+ array(
+ '0',
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should return correct raw value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should return correct raw value',
+ ),
+ array(
+ '10',
+ array('field_show_novalue' => false),
+ 10,
+ 'Field should return the correct raw value',
+ ),
+ array(
+ '0',
+ array('field_show_novalue' => false),
+ 0,
+ 'Field should return correct raw value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should return correct raw value',
+ ),
+ array(
+ 'string',
+ array('field_show_novalue' => false),
+ 0,
+ 'Field should return int cast of passed string'
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_raw_data
+ */
+ public function test_get_profile_value_raw($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value_raw($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function return_callback_implode()
+ {
+ return implode('-', func_get_args());
+ }
+}
diff --git a/tests/profilefields/type_string_test.php b/tests/profilefields/type_string_test.php
new file mode 100644
index 0000000000..f6c14ee38b
--- /dev/null
+++ b/tests/profilefields/type_string_test.php
@@ -0,0 +1,286 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
+
+class phpbb_profilefield_type_string_test extends phpbb_test_case
+{
+ protected $cp;
+ protected $field_options;
+
+ /**
+ * Sets up basic test objects
+ *
+ * @access public
+ * @return null
+ */
+ public function setUp()
+ {
+ global $request, $user, $cache;
+
+ $user = $this->getMock('\phpbb\user');
+ $cache = new phpbb_mock_cache;
+ $user->expects($this->any())
+ ->method('lang')
+ ->will($this->returnCallback(array($this, 'return_callback_implode')));
+
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $this->cp = new \phpbb\profilefields\type\type_string(
+ $request,
+ $template,
+ $user
+ );
+
+ $this->field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_string',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ 'field_validation' => '.*',
+ );
+ }
+
+ public function validate_profile_field_data()
+ {
+ return array(
+ array(
+ '',
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should not accept empty values for required fields',
+ ),
+ array(
+ null,
+ array('field_required' => true),
+ 'FIELD_REQUIRED-field',
+ 'Field should not accept empty values for required field',
+ ),
+ array(
+ 0,
+ array('field_required' => true),
+ false,
+ 'Field should accept a non-empty input',
+ ),
+ array(
+ 'false',
+ array('field_required' => true),
+ false,
+ 'Field should accept a non-empty input',
+ ),
+ array(
+ 10,
+ array('field_required' => true),
+ false,
+ 'Field should accept a non-empty input',
+ ),
+ array(
+ 'tas',
+ array('field_minlen' => 2, 'field_maxlen' => 5),
+ false,
+ 'Field should accept value of correct length',
+ ),
+ array(
+ 't',
+ array('field_minlen' => 2, 'field_maxlen' => 5),
+ 'FIELD_TOO_SHORT-2-field',
+ 'Field should reject value of incorrect length',
+ ),
+ array(
+ 'this is a long string',
+ array('field_minlen' => 2, 'field_maxlen' => 5),
+ 'FIELD_TOO_LONG-5-field',
+ 'Field should reject value of incorrect length',
+ ),
+ array(
+ 'H3110',
+ array('field_validation' => '[0-9]+'),
+ 'FIELD_INVALID_CHARS_NUMBERS_ONLY-field',
+ 'Required field should reject characters in a numbers-only field',
+ ),
+ array(
+ '&lt;&gt;&quot;&amp;%&amp;&gt;&lt;&gt;',
+ array('field_maxlen' => 10, 'field_minlen' => 2),
+ false,
+ 'Optional field should accept html entities',
+ ),
+ array(
+ 'ö ä ü ß',
+ array(),
+ false,
+ 'Required field should accept UTF-8 string',
+ ),
+ array(
+ 'This ö ä string has to b',
+ array('field_maxlen' => 10),
+ 'FIELD_TOO_LONG-10-field',
+ 'Required field should reject an UTF-8 string which is too long',
+ ),
+ array(
+ 'ö äö äö ä',
+ array('field_validation' => '[\w]+'),
+ 'FIELD_INVALID_CHARS_ALPHA_ONLY-field',
+ 'Required field should reject UTF-8 in alpha only field',
+ ),
+ array(
+ 'Hello',
+ array('field_validation' => '[\w]+'),
+ false,
+ 'Required field should accept a characters only field',
+ ),
+ array(
+ 'Valid.Username123',
+ array('field_validation' => '[\w.]+'),
+ false,
+ 'Required field should accept a alphanumeric field with dots',
+ ),
+ array(
+ 'Invalid.,username123',
+ array('field_validation' => '[\w.]+'),
+ 'FIELD_INVALID_CHARS_ALPHA_DOTS-field',
+ 'Required field should reject field with comma',
+ ),
+ array(
+ 'skype.test.name,_this',
+ array('field_validation' => '[a-zA-Z][\w\.,\-_]+'),
+ false,
+ 'Required field should accept alphanumeric field with punctuations',
+ ),
+ array(
+ '1skype.this.should.faila',
+ array('field_validation' => '[a-zA-Z][\w\.,\-_]+'),
+ 'FIELD_INVALID_CHARS_ALPHA_PUNCTUATION-field',
+ 'Required field should reject field having invalid input for the given validation',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider validate_profile_field_data
+ */
+ public function test_validate_profile_field($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->validate_profile_field($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_data()
+ {
+ return array(
+ array(
+ 'test',
+ array('field_show_novalue' => true),
+ 'test',
+ 'Field should output the given value',
+ ),
+ array(
+ 'test',
+ array('field_show_novalue' => false),
+ 'test',
+ 'Field should output the given value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => true),
+ '',
+ 'Field should output nothing for empty value',
+ ),
+ array(
+ '',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should simply output null for empty vlaue',
+ ),
+ );
+ }
+
+
+ /**
+ * @dataProvider profile_value_data
+ */
+ public function test_get_profile_value($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_raw_data()
+ {
+ return array(
+ array(
+ '[b]bbcode test[/b]',
+ array('field_show_novalue' => true),
+ '[b]bbcode test[/b]',
+ 'Field should return the correct raw value',
+ ),
+ array(
+ '[b]bbcode test[/b]',
+ array('field_show_novalue' => false),
+ '[b]bbcode test[/b]',
+ 'Field should return correct raw value',
+ ),
+ array(
+ 125,
+ array('field_show_novalue' => false),
+ 125,
+ 'Field should return value of integer as is',
+ ),
+ array(
+ 0,
+ array('field_show_novalue' => false),
+ null,
+ 'Field should return null for empty integer without show_novalue',
+ ),
+ array(
+ 0,
+ array('field_show_novalue' => true),
+ 0,
+ 'Field should return 0 for empty integer with show_novalue',
+ ),
+ array(
+ null,
+ array('field_show_novalue' => true),
+ null,
+ 'field should return null value as is',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_raw_data
+ */
+ public function test_get_profile_value_raw($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value_raw($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function return_callback_implode()
+ {
+ return implode('-', func_get_args());
+ }
+}
diff --git a/tests/profilefields/type_url_test.php b/tests/profilefields/type_url_test.php
new file mode 100644
index 0000000000..a45a28e7c7
--- /dev/null
+++ b/tests/profilefields/type_url_test.php
@@ -0,0 +1,141 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+
+class phpbb_profilefield_type_url_test extends phpbb_test_case
+{
+ protected $cp;
+ protected $field_options;
+
+ /**
+ * Sets up basic test objects
+ *
+ * @access public
+ * @return null
+ */
+ public function setUp()
+ {
+ $user = $this->getMock('\phpbb\user');
+ $user->expects($this->any())
+ ->method('lang')
+ ->will($this->returnCallback(array($this, 'return_callback_implode')));
+
+ $request = $this->getMock('\phpbb\request\request');
+ $template = $this->getMock('\phpbb\template\template');
+
+ $this->cp = new \phpbb\profilefields\type\type_url(
+ $request,
+ $template,
+ $user
+ );
+
+ $this->field_options = array(
+ 'field_type' => '\phpbb\profilefields\type\type_url',
+ 'field_name' => 'field',
+ 'field_id' => 1,
+ 'lang_id' => 1,
+ 'lang_name' => 'field',
+ 'field_required' => false,
+ );
+ }
+
+ public function validate_profile_field_data()
+ {
+ return array(
+ array(
+ '',
+ array('field_required' => true),
+ 'FIELD_INVALID_URL-field',
+ 'Field should reject empty field that is required',
+ ),
+ array(
+ 'invalidURL',
+ array(),
+ 'FIELD_INVALID_URL-field',
+ 'Field should reject invalid input',
+ ),
+ array(
+ 'http://onetwothree.example.io',
+ array(),
+ false,
+ 'Field should accept valid URL',
+ ),
+ array(
+ 'http://example.com/index.html?param1=test&param2=awesome',
+ array(),
+ false,
+ 'Field should accept valid URL',
+ ),
+ array(
+ 'http://example.com/index.html/test/path?document=get',
+ array(),
+ false,
+ 'Field should accept valid URL',
+ ),
+ array(
+ 'http://example.com/index.html/test/path?document[]=DocType%20test&document[]=AnotherDoc',
+ array(),
+ 'FIELD_INVALID_URL-field',
+ 'Field should reject invalid URL having multi value parameters',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider validate_profile_field_data
+ */
+ public function test_validate_profile_field($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->validate_profile_field($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function profile_value_raw_data()
+ {
+ return array(
+ array(
+ 'http://example.com',
+ array('field_show_novalue' => true),
+ 'http://example.com',
+ 'Field should return the correct raw value',
+ ),
+ array(
+ 'http://example.com',
+ array('field_show_novalue' => false),
+ 'http://example.com',
+ 'Field should return correct raw value',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider profile_value_raw_data
+ */
+ public function test_get_profile_value_raw($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value_raw($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
+ public function return_callback_implode()
+ {
+ return implode('-', func_get_args());
+ }
+}
diff --git a/tests/template/template_test.php b/tests/template/template_test.php
index 4f5b7629d5..0bbfe3848d 100644
--- a/tests/template/template_test.php
+++ b/tests/template/template_test.php
@@ -352,6 +352,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(),
"13FOOBAR|foobar",
),
+ array(
+ 'if_nested_tags.html',
+ array('S_VALUE' => true,),
+ array(),
+ array(),
+ 'inner_value',
+ ),
);
}
diff --git a/tests/template/templates/if_nested_tags.html b/tests/template/templates/if_nested_tags.html
new file mode 100644
index 0000000000..0348a31a8d
--- /dev/null
+++ b/tests/template/templates/if_nested_tags.html
@@ -0,0 +1 @@
+<!-- IF S_VALUE --><!-- DEFINE $INNER_VALUE = 'inner_value' --><!-- ENDIF -->{$INNER_VALUE}
diff --git a/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php b/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php
index 22d55b4ed5..db31edc984 100644
--- a/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php
+++ b/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php
@@ -25,7 +25,7 @@ if (!class_exists('PDO'))
*/
class phpbb_database_connection_odbc_pdo_wrapper extends PDO
{
- // Name of the driver being used (i.e. mssql, firebird)
+ // Name of the driver being used (i.e. mssql)
public $driver = '';
// Version number of driver since PDO::getAttribute(PDO::ATTR_CLIENT_VERSION) is pretty useless for this
diff --git a/tests/test_framework/phpbb_database_test_case.php b/tests/test_framework/phpbb_database_test_case.php
index 1f3a564205..46276bcfcb 100644
--- a/tests/test_framework/phpbb_database_test_case.php
+++ b/tests/test_framework/phpbb_database_test_case.php
@@ -145,25 +145,7 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
public function createXMLDataSet($path)
{
- $db_config = $this->get_database_config();
-
- // Firebird requires table and column names to be uppercase
- if ($db_config['dbms'] == 'phpbb\db\driver\firebird')
- {
- $xml_data = file_get_contents($path);
- $xml_data = preg_replace_callback('/(?:(<table name="))([a-z_]+)(?:(">))/', 'phpbb_database_test_case::to_upper', $xml_data);
- $xml_data = preg_replace_callback('/(?:(<column>))([a-z_]+)(?:(<\/column>))/', 'phpbb_database_test_case::to_upper', $xml_data);
-
- $new_fixture = tmpfile();
- fwrite($new_fixture, $xml_data);
- fseek($new_fixture, 0);
-
- $meta_data = stream_get_meta_data($new_fixture);
- $path = $meta_data['uri'];
- }
-
$this->fixture_xml_data = parent::createXMLDataSet($path);
-
return $this->fixture_xml_data;
}
@@ -244,19 +226,6 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
return new phpbb_database_test_connection_manager($config);
}
- /**
- * Converts a match in the middle of a string to uppercase.
- * This is necessary for transforming the fixture information for Firebird tests
- *
- * @param $matches The array of matches from a regular expression
- *
- * @return string The string with the specified match converted to uppercase
- */
- static public function to_upper($matches)
- {
- return $matches[1] . strtoupper($matches[2]) . $matches[3];
- }
-
public function assert_array_content_equals($one, $two)
{
// http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
diff --git a/tests/test_framework/phpbb_database_test_connection_manager.php b/tests/test_framework/phpbb_database_test_connection_manager.php
index b73b05025e..92e2080dba 100644
--- a/tests/test_framework/phpbb_database_test_connection_manager.php
+++ b/tests/test_framework/phpbb_database_test_connection_manager.php
@@ -116,7 +116,7 @@ class phpbb_database_test_connection_manager
// These require different connection strings on the phpBB side than they do in PDO
// so you must provide a DSN string for ODBC separately
- if (!empty($this->config['custom_dsn']) && ($this->config['dbms'] == 'phpbb\db\driver\mssql' || $this->config['dbms'] == 'phpbb\db\driver\firebird'))
+ if (!empty($this->config['custom_dsn']) && $this->config['dbms'] == 'phpbb\db\driver\mssql')
{
$dsn = 'odbc:' . $this->config['custom_dsn'];
}
@@ -130,14 +130,6 @@ class phpbb_database_test_connection_manager
$this->pdo = new phpbb_database_connection_odbc_pdo_wrapper('mssql', 0, $dsn, $this->config['dbuser'], $this->config['dbpasswd']);
break;
- case 'phpbb\db\driver\firebird':
- if (!empty($this->config['custom_dsn']))
- {
- $this->pdo = new phpbb_database_connection_odbc_pdo_wrapper('firebird', 0, $dsn, $this->config['dbuser'], $this->config['dbpasswd']);
- break;
- }
- // Fall through if they're using the firebird PDO driver and not the generic ODBC driver
-
default:
$this->pdo = new PDO($dsn, $this->config['dbuser'], $this->config['dbpasswd']);
break;
@@ -197,7 +189,6 @@ class phpbb_database_test_connection_manager
{
case 'phpbb\db\driver\sqlite':
case 'phpbb\db\driver\sqlite3':
- case 'phpbb\db\driver\firebird':
$this->connect();
// Drop all of the tables
foreach ($this->get_tables() as $table)
@@ -298,13 +289,6 @@ class phpbb_database_test_connection_manager
FROM pg_stat_user_tables';
break;
- case 'phpbb\db\driver\firebird':
- $sql = 'SELECT rdb$relation_name
- FROM rdb$relations
- WHERE rdb$view_source is null
- AND rdb$system_flag = 0';
- break;
-
case 'phpbb\db\driver\oracle':
$sql = 'SELECT table_name
FROM USER_TABLES';
@@ -358,14 +342,17 @@ class phpbb_database_test_connection_manager
$filename = $directory . $schema . '_schema.sql';
- $queries = file_get_contents($filename);
- $sql = phpbb_remove_comments($queries);
+ if (file_exists($filename))
+ {
+ $queries = file_get_contents($filename);
+ $sql = phpbb_remove_comments($queries);
- $sql = split_sql_file($sql, $this->dbms['DELIM']);
+ $sql = split_sql_file($sql, $this->dbms['DELIM']);
- foreach ($sql as $query)
- {
- $this->pdo->exec($query);
+ foreach ($sql as $query)
+ {
+ $this->pdo->exec($query);
+ }
}
// Ok we have the db info go ahead and work on building the table
@@ -404,11 +391,6 @@ class phpbb_database_test_connection_manager
protected function get_dbms_data($dbms)
{
$available_dbms = array(
- 'phpbb\db\driver\firebird' => array(
- 'SCHEMA' => 'firebird',
- 'DELIM' => ';;',
- 'PDO' => 'firebird',
- ),
'phpbb\db\driver\mysqli' => array(
'SCHEMA' => 'mysql_41',
'DELIM' => ';',
@@ -478,18 +460,6 @@ class phpbb_database_test_connection_manager
switch ($this->config['dbms'])
{
- case 'phpbb\db\driver\firebird':
- $sql = 'SELECT RDB$GENERATOR_NAME
- FROM RDB$GENERATORS
- WHERE RDB$SYSTEM_FLAG = 0';
- $result = $this->pdo->query($sql);
-
- while ($row = $result->fetch(PDO::FETCH_NUM))
- {
- $queries[] = 'DROP GENERATOR ' . current($row);
- }
- break;
-
case 'phpbb\db\driver\oracle':
$sql = 'SELECT sequence_name
FROM USER_SEQUENCES';
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index e4504a5f8d..07ef826abf 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -11,14 +11,12 @@
*
*/
use Symfony\Component\BrowserKit\CookieJar;
+use Behat\Mink\Driver\Goutte\Client;
+use Behat\Mink\Driver\GoutteDriver;
-require_once __DIR__ . '/../../phpBB/includes/functions_install.php';
-
-class phpbb_functional_test_case extends phpbb_test_case
+class phpbb_functional_test_case extends phpbb_mink_test_case
{
- static protected $client;
static protected $cookieJar;
- static protected $root_url;
protected $cache = null;
protected $db = null;
@@ -36,7 +34,6 @@ class phpbb_functional_test_case extends phpbb_test_case
*/
protected $lang = array();
- static protected $config = array();
static protected $already_installed = false;
static public function setUpBeforeClass()
@@ -46,6 +43,24 @@ class phpbb_functional_test_case extends phpbb_test_case
self::$config = phpbb_test_case_helpers::get_test_config();
self::$root_url = self::$config['phpbb_functional_url'];
+ self::$cookieJar = new CookieJar;
+ self::$client = new Client(array(), null, self::$cookieJar);
+
+ $client_options = array(
+ Guzzle\Http\Client::DISABLE_REDIRECTS => true,
+ 'curl.options' => array(
+ CURLOPT_TIMEOUT => 120,
+ ),
+ );
+
+ self::$client->setClient(new Guzzle\Http\Client('', $client_options));
+
+ // Reset the curl handle because it is 0 at this point and not a valid
+ // resource
+ self::$client->getClient()->getCurlMulti()->reset(true);
+
+ self::$driver = new GoutteDriver(self::$client);
+
// Important: this is used both for installation and by
// test cases for querying the tables.
// Therefore table prefix must be set before a board is
@@ -78,12 +93,6 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->bootstrap();
- self::$cookieJar = new CookieJar;
- self::$client = new Goutte\Client(array(), null, self::$cookieJar);
- // Reset the curl handle because it is 0 at this point and not a valid
- // resource
- self::$client->getClient()->getCurlMulti()->reset(true);
-
// Clear the language array so that things
// that were added in other tests are gone
$this->lang = array();
@@ -110,13 +119,14 @@ class phpbb_functional_test_case extends phpbb_test_case
protected function tearDown()
{
- parent::tearDown();
-
if ($this->db instanceof \phpbb\db\driver\driver_interface)
{
// Close the database connections again this test
$this->db->sql_close();
}
+
+ self::$cookieJar->clear();
+ parent::tearDown();
}
/**
@@ -256,144 +266,6 @@ class phpbb_functional_test_case extends phpbb_test_case
return $extension_manager;
}
- static protected function install_board()
- {
- global $phpbb_root_path, $phpEx;
-
- self::recreate_database(self::$config);
-
- $config_file = $phpbb_root_path . "config.$phpEx";
- $config_file_dev = $phpbb_root_path . "config_dev.$phpEx";
- $config_file_test = $phpbb_root_path . "config_test.$phpEx";
-
- if (file_exists($config_file))
- {
- if (!file_exists($config_file_dev))
- {
- rename($config_file, $config_file_dev);
- }
- else
- {
- unlink($config_file);
- }
- }
-
- self::$cookieJar = new CookieJar;
- self::$client = new Goutte\Client(array(), null, self::$cookieJar);
- // Set client manually so we can increase the cURL timeout
- self::$client->setClient(new Guzzle\Http\Client('', array(
- Guzzle\Http\Client::DISABLE_REDIRECTS => true,
- 'curl.options' => array(
- CURLOPT_TIMEOUT => 120,
- ),
- )));
-
- // Reset the curl handle because it is 0 at this point and not a valid
- // resource
- self::$client->getClient()->getCurlMulti()->reset(true);
-
- $parseURL = parse_url(self::$config['phpbb_functional_url']);
-
- $crawler = self::request('GET', 'install/index.php?mode=install');
- self::assertContains('Welcome to Installation', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form();
-
- // install/index.php?mode=install&sub=requirements
- $crawler = self::submit($form);
- self::assertContains('Installation compatibility', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form();
-
- // install/index.php?mode=install&sub=database
- $crawler = self::submit($form);
- self::assertContains('Database configuration', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form(array(
- // Installer uses 3.0-style dbms name
- 'dbms' => str_replace('phpbb\db\driver\\', '', self::$config['dbms']),
- 'dbhost' => self::$config['dbhost'],
- 'dbport' => self::$config['dbport'],
- 'dbname' => self::$config['dbname'],
- 'dbuser' => self::$config['dbuser'],
- 'dbpasswd' => self::$config['dbpasswd'],
- 'table_prefix' => self::$config['table_prefix'],
- ));
-
- // install/index.php?mode=install&sub=database
- $crawler = self::submit($form);
- self::assertContains('Successful connection', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form();
-
- // install/index.php?mode=install&sub=administrator
- $crawler = self::submit($form);
- self::assertContains('Administrator configuration', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form(array(
- 'default_lang' => 'en',
- 'admin_name' => 'admin',
- 'admin_pass1' => 'adminadmin',
- 'admin_pass2' => 'adminadmin',
- 'board_email' => 'nobody@example.com',
- ));
-
- // install/index.php?mode=install&sub=administrator
- $crawler = self::submit($form);
- self::assertContains('Tests passed', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form();
-
- // We have to skip install/index.php?mode=install&sub=config_file
- // because that step will create a config.php file if phpBB has the
- // permission to do so. We have to create the config file on our own
- // in order to get the DEBUG constants defined.
- $config_php_data = phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, false, true);
- $config_created = file_put_contents($config_file, $config_php_data) !== false;
- if (!$config_created)
- {
- self::markTestSkipped("Could not write $config_file file.");
- }
-
- // We also have to create a install lock that is normally created by
- // the installer. The file will be removed by the final step of the
- // installer.
- $install_lock_file = $phpbb_root_path . 'cache/install_lock';
- $lock_created = file_put_contents($install_lock_file, '') !== false;
- if (!$lock_created)
- {
- self::markTestSkipped("Could not create $lock_created file.");
- }
- @chmod($install_lock_file, 0666);
-
- // install/index.php?mode=install&sub=advanced
- $form_data = $form->getValues();
- unset($form_data['submit']);
-
- $crawler = self::request('POST', 'install/index.php?mode=install&sub=advanced', $form_data);
- self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form(array(
- 'email_enable' => true,
- 'smtp_delivery' => true,
- 'smtp_host' => 'nxdomain.phpbb.com',
- 'smtp_auth' => 'PLAIN',
- 'smtp_user' => 'nxuser',
- 'smtp_pass' => 'nxpass',
- 'cookie_secure' => false,
- 'force_server_vars' => false,
- 'server_protocol' => $parseURL['scheme'] . '://',
- 'server_name' => 'localhost',
- 'server_port' => isset($parseURL['port']) ? (int) $parseURL['port'] : 80,
- 'script_path' => $parseURL['path'],
- ));
-
- // install/index.php?mode=install&sub=create_table
- $crawler = self::submit($form);
- self::assertContains('The database tables used by phpBB', $crawler->filter('#main')->text());
- self::assertContains('have been created and populated with some initial data.', $crawler->filter('#main')->text());
- $form = $crawler->selectButton('submit')->form();
-
- // install/index.php?mode=install&sub=final
- $crawler = self::submit($form);
- self::assertContains('You have successfully installed', $crawler->text());
-
- copy($config_file, $config_file_test);
- }
-
public function install_ext($extension)
{
$this->login();
@@ -412,12 +284,6 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->logout();
}
- static private function recreate_database($config)
- {
- $db_conn_mgr = new phpbb_database_test_connection_manager($config);
- $db_conn_mgr->recreate_db();
- }
-
/**
* Creates a new style
*
@@ -1076,9 +942,17 @@ class phpbb_functional_test_case extends phpbb_test_case
if ($expected !== '')
{
- $this->assertContainsLang($expected, $crawler->filter('html')->text());
+ if (isset($this->lang[$expected]))
+ {
+ $this->assertContainsLang($expected, $crawler->filter('html')->text());
+ }
+ else
+ {
+ $this->assertContains($expected, $crawler->filter('html')->text());
+ }
return null;
}
+
$url = $crawler->selectLink($form_data['subject'])->link()->getUri();
return array(
@@ -1097,12 +971,8 @@ class phpbb_functional_test_case extends phpbb_test_case
*/
public function delete_topic($topic_id)
{
- $crawler = self::request('GET', "viewtopic.php?t={$topic_id}&sid={$this->sid}");
-
$this->add_lang('posting');
- $form = $crawler->selectButton('Go')->eq(1)->form();
- $form['action']->select('delete_topic');
- $crawler = self::submit($form);
+ $crawler = $this->get_quickmod_page($topic_id, 'DELETE_TOPIC');
$this->assertContainsLang('DELETE_PERMANENTLY', $crawler->text());
$this->add_lang('mcp');
@@ -1193,4 +1063,25 @@ class phpbb_functional_test_case extends phpbb_test_case
return $manager;
}
+
+ /**
+ * Get quickmod page
+ *
+ * @param int $topic_id
+ * @param string $action Language key for the quickmod action
+ * @param Symfony\Component\DomCrawler\Crawler Optional crawler object to use instead of creating new one.
+ * @return Symfony\Component\DomCrawler\Crawler
+ */
+ public function get_quickmod_page($topic_id, $action, $crawler = false)
+ {
+ $this->add_lang('viewtopic');
+
+ if ($crawler === false)
+ {
+ $crawler = self::request('GET', "viewtopic.php?t={$topic_id}&sid={$this->sid}");
+ }
+ $link = $crawler->filter('#quickmod')->selectLink($this->lang($action))->link()->getUri();
+
+ return self::request('GET', substr($link, strpos($link, 'mcp.')));
+ }
}
diff --git a/tests/test_framework/phpbb_mink_test_case.php b/tests/test_framework/phpbb_mink_test_case.php
new file mode 100644
index 0000000000..ba480e35fb
--- /dev/null
+++ b/tests/test_framework/phpbb_mink_test_case.php
@@ -0,0 +1,183 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+use \Behat\Mink\Session;
+
+require_once __DIR__ . '/../../phpBB/includes/functions_install.php';
+
+abstract class phpbb_mink_test_case extends phpbb_test_case
+{
+ static protected $driver;
+ static protected $client;
+ static protected $session;
+ static protected $config = array();
+ static protected $root_url;
+
+ public function __construct($name = null, array $data = array(), $dataName = '')
+ {
+ parent::__construct($name, $data, $dataName);
+
+ $this->backupStaticAttributesBlacklist += array(
+ 'phpbb_mink_test_case' => array('config', 'already_installed'),
+ );
+ }
+
+ static public function setUpBeforeClass()
+ {
+ parent::setUpBeforeClass();
+ }
+
+ public function setUp()
+ {
+ parent::setUp();
+
+ if (!self::$driver)
+ {
+ self::markTestSkipped('Mink driver not initialized.');
+ }
+
+ if (!self::$session)
+ {
+ self::$session = new Session(self::$driver);
+ }
+ }
+
+ static protected function recreate_database($config)
+ {
+ $db_conn_mgr = new phpbb_database_test_connection_manager($config);
+ $db_conn_mgr->recreate_db();
+ }
+
+ protected function tearDown()
+ {
+ self::$session->reset();
+ parent::tearDown();
+ }
+
+ static protected function visit($path)
+ {
+ self::$session->visit(self::$root_url . $path);
+ return self::$session->getPage();
+ }
+
+ static protected function click_submit($submit_button_id = 'submit')
+ {
+ self::$session->getPage()->findById($submit_button_id)->click();
+ return self::$session->getPage();
+ }
+
+ static protected function install_board()
+ {
+ global $phpbb_root_path, $phpEx;
+
+ self::recreate_database(self::$config);
+ self::$session = new Session(self::$driver);
+
+ $config_file = $phpbb_root_path . "config.$phpEx";
+ $config_file_dev = $phpbb_root_path . "config_dev.$phpEx";
+ $config_file_test = $phpbb_root_path . "config_test.$phpEx";
+
+ if (file_exists($config_file))
+ {
+ if (!file_exists($config_file_dev))
+ {
+ rename($config_file, $config_file_dev);
+ }
+ else
+ {
+ unlink($config_file);
+ }
+ }
+
+ $parseURL = parse_url(self::$config['phpbb_functional_url']);
+
+ $page = self::visit('install/index.php?mode=install');
+ self::assertContains('Welcome to Installation', $page->findById('main')->getText());
+
+ // install/index.php?mode=install&sub=requirements
+ $page = self::click_submit();
+ self::assertContains('Installation compatibility', $page->findById('main')->getText());
+
+ // install/index.php?mode=install&sub=database
+ $page = self::click_submit();
+ self::assertContains('Database configuration', $page->findById('main')->getText());
+
+ $page->findById('dbms')->setValue(str_replace('phpbb\db\driver\\', '', self::$config['dbms']));
+ $page->findById('dbhost')->setValue(self::$config['dbhost']);
+ $page->findById('dbport')->setValue(self::$config['dbport']);
+ $page->findById('dbname')->setValue(self::$config['dbname']);
+ $page->findById('dbuser')->setValue(self::$config['dbuser']);
+ $page->findById('dbpasswd')->setValue(self::$config['dbpasswd']);
+ $page->findById('table_prefix')->setValue(self::$config['table_prefix']);
+
+ // install/index.php?mode=install&sub=database
+ $page = self::click_submit();
+ self::assertContains('Successful connection', $page->findById('main')->getText());
+
+ // install/index.php?mode=install&sub=administrator
+ $page = self::click_submit();
+ self::assertContains('Administrator configuration', $page->findById('main')->getText());
+
+ $page->findById('admin_name')->setValue('admin');
+ $page->findById('admin_pass1')->setValue('adminadmin');
+ $page->findById('admin_pass2')->setValue('adminadmin');
+ $page->findById('board_email')->setValue('nobody@example.com');
+
+ // install/index.php?mode=install&sub=administrator
+ $page = self::click_submit();
+ self::assertContains('Tests passed', $page->findById('main')->getText());
+
+ // install/index.php?mode=install&sub=config_file
+ $page = self::click_submit();
+
+ // Installer has created a config.php file, we will overwrite it with a
+ // config file of our own in order to get the DEBUG constants defined
+ $config_php_data = phpbb_create_config_file_data(self::$config, self::$config['dbms'], true, false, true);
+ $config_created = file_put_contents($config_file, $config_php_data) !== false;
+ if (!$config_created)
+ {
+ self::markTestSkipped("Could not write $config_file file.");
+ }
+
+ if (strpos($page->findById('main')->getText(), 'The configuration file has been written') === false)
+ {
+ $page = self::click_submit('dldone');
+ }
+ self::assertContains('The configuration file has been written', $page->findById('main')->getText());
+
+ // install/index.php?mode=install&sub=advanced
+ $page = self::click_submit();
+ self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $page->findById('main')->getText());
+
+ $page->findById('smtp_delivery')->setValue('1');
+ $page->findById('smtp_host')->setValue('nxdomain.phpbb.com');
+ $page->findById('smtp_user')->setValue('nxuser');
+ $page->findById('smtp_pass')->setValue('nxpass');
+ $page->findById('server_protocol')->setValue($parseURL['scheme'] . '://');
+ $page->findById('server_name')->setValue('localhost');
+ $page->findById('server_port')->setValue(isset($parseURL['port']) ? $parseURL['port'] : 80);
+ $page->findById('script_path')->setValue($parseURL['path']);
+
+ // install/index.php?mode=install&sub=create_table
+ $page = self::click_submit();
+ self::assertContains('The database tables used by phpBB', $page->findById('main')->getText());
+ self::assertContains('have been created and populated with some initial data.', $page->findById('main')->getText());
+
+ // install/index.php?mode=install&sub=final
+ $page = self::click_submit();
+ self::assertContains('You have successfully installed', $page->getText());
+
+ copy($config_file, $config_file_test);
+
+ self::$session->stop();
+ }
+}
diff --git a/tests/text_processing/make_clickable_test.php b/tests/text_processing/make_clickable_test.php
index 2c78391453..95e304dd97 100644
--- a/tests/text_processing/make_clickable_test.php
+++ b/tests/text_processing/make_clickable_test.php
@@ -104,5 +104,50 @@ class phpbb_text_processing_make_clickable_test extends phpbb_test_case
$this->assertEquals($expected, $result, $label);
}
+ public function make_clickable_mixed_serverurl_data()
+ {
+ $urls = array(
+ 'http://thisdomain.org' => array('tag' => 'm', 'url' => false, 'text' => false),
+ 'http://thisdomain.org/' => array('tag' => 'm', 'url' => false, 'text' => false),
+ 'http://thisdomain.org/1' => array('tag' => 'm', 'url' => false, 'text' => false),
+ 'http://thisdomain.org/path/some?query=abc#test' => array('tag' => 'm', 'url' => false, 'text' => false),
+
+ 'https://www.phpbb.com' => array('tag' => 'm', 'url' => false, 'text' => false),
+ 'https://www.phpbb.com/' => array('tag' => 'm', 'url' => false, 'text' => false),
+ 'https://www.phpbb.com/1' => array('tag' => 'l', 'url' => false, 'text' => '1'),
+ 'https://www.phpbb.com/path/some?query=abc#test' => array('tag' => 'l', 'url' => false, 'text' => 'path/some?query=abc#test'),
+ );
+
+ $test_data = array();
+
+ // run the test for each combination
+ foreach ($urls as $url => $url_type)
+ {
+ // false means it's the same as the url, less typing
+ $url_type['url'] = ($url_type['url']) ? $url_type['url'] : $url;
+ $url_type['text'] = ($url_type['text']) ? $url_type['text'] : $url;
+
+ $class = ($url_type['tag'] === 'l') ? 'postlink-local' : 'postlink';
+
+ // replace the url with the desired output format
+ $output = '<!-- ' . $url_type['tag'] . ' --><a class="' . $class . '" href="' . $url_type['url'] . '">' . $url_type['text'] . '</a><!-- ' . $url_type['tag'] . ' -->';
+
+ $test_data[] = array($url, $output);
+ }
+
+ return $test_data;
+ }
+
+ /**
+ * @dataProvider make_clickable_mixed_serverurl_data
+ */
+ public function test_make_clickable_mixed_serverurl($input, $expected)
+ {
+ $result = make_clickable($input, 'https://www.phpbb.com');
+
+ $label = 'Making text clickable: ' . $input;
+ $this->assertEquals($expected, $result, $label);
+ }
+
}
diff --git a/tests/viewonline/helper_test.php b/tests/viewonline/helper_test.php
new file mode 100644
index 0000000000..e4950bb51a
--- /dev/null
+++ b/tests/viewonline/helper_test.php
@@ -0,0 +1,42 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_viewonline_helper_test extends phpbb_test_case
+{
+ public function setUp()
+ {
+ parent::setUp();
+
+ $this->viewonline_helper = new \phpbb\viewonline_helper();
+ }
+
+ public function session_pages_data()
+ {
+ return array(
+ array('index.php', 'index.php'),
+ array('foobar/test.php', 'foobar/test.php'),
+ array('', ''),
+ array('../index.php', '../index.php'),
+ );
+ }
+
+ /**
+ * @dataProvider session_pages_data
+ */
+ public function test_get_user_page($expected, $session_page)
+ {
+ $on_page = $this->viewonline_helper->get_user_page($session_page);
+ $this->assertArrayHasKey(1, $on_page);
+ $this->assertSame($expected, $on_page[1]);
+ }
+}
diff --git a/travis/ext-sniff.sh b/travis/ext-sniff.sh
new file mode 100755
index 0000000000..4e557a41c1
--- /dev/null
+++ b/travis/ext-sniff.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# This file is part of the phpBB Forum Software package.
+#
+# @copyright (c) phpBB Limited <https://www.phpbb.com>
+# @license GNU General Public License, version 2 (GPL-2.0)
+#
+# For full copyright and license information, please see
+# the docs/CREDITS.txt file.
+#
+set -e
+set -x
+
+DB=$1
+TRAVIS_PHP_VERSION=$2
+EXTNAME=$3
+
+if [ "$TRAVIS_PHP_VERSION" == "5.5" -a "$DB" == "mysqli" ]
+then
+ phpBB/vendor/bin/phpcs \
+ -s \
+ --extensions=php \
+ --standard=build/code_sniffer/ruleset-php-extensions.xml \
+ "--ignore=phpBB/ext/$EXTNAME/tests/*" \
+ "--ignore=phpBB/ext/$EXTNAME/vendor/*" \
+ "phpBB/ext/$EXTNAME"
+fi
diff --git a/travis/setup-webserver.sh b/travis/setup-webserver.sh
index a9941d4def..ea1929a5b0 100755
--- a/travis/setup-webserver.sh
+++ b/travis/setup-webserver.sh
@@ -53,6 +53,7 @@ else
user = $USER
group = $USER
listen = $APP_SOCK
+ listen.mode = 0666
pm = static
pm.max_children = 2