aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB
diff options
context:
space:
mode:
authorNils Adermann <naderman@naderman.de>2010-03-02 01:05:36 +0100
committerNils Adermann <naderman@naderman.de>2010-03-02 01:05:36 +0100
commit75e7ffc317af7ad5b7a420a53115caaa66d3a942 (patch)
tree643b59585bc706acf1c0260dd262f26e52de06c0 /phpBB
parent1ceddd9eeccde56ab307631a16e40b943eac883a (diff)
parente02e530204a31c7723a73cbfcdba0d6132b1a175 (diff)
downloadforums-75e7ffc317af7ad5b7a420a53115caaa66d3a942.tar
forums-75e7ffc317af7ad5b7a420a53115caaa66d3a942.tar.gz
forums-75e7ffc317af7ad5b7a420a53115caaa66d3a942.tar.bz2
forums-75e7ffc317af7ad5b7a420a53115caaa66d3a942.tar.xz
forums-75e7ffc317af7ad5b7a420a53115caaa66d3a942.zip
Merge commit 'release-3.0-RC4'
Diffstat (limited to 'phpBB')
-rw-r--r--phpBB/adm/index.php12
-rw-r--r--phpBB/adm/style/acp_attachments.html2
-rw-r--r--phpBB/adm/style/acp_ban.html5
-rw-r--r--phpBB/adm/style/acp_bbcodes.html2
-rw-r--r--phpBB/adm/style/acp_board.html10
-rw-r--r--phpBB/adm/style/acp_bots.html6
-rw-r--r--phpBB/adm/style/acp_forums.html10
-rw-r--r--phpBB/adm/style/acp_groups.html4
-rw-r--r--phpBB/adm/style/acp_icons.html4
-rw-r--r--phpBB/adm/style/acp_language.html10
-rw-r--r--phpBB/adm/style/acp_logs.html4
-rw-r--r--phpBB/adm/style/acp_main.html11
-rw-r--r--phpBB/adm/style/acp_modules.html8
-rw-r--r--phpBB/adm/style/acp_permission_roles.html2
-rw-r--r--phpBB/adm/style/acp_permissions.html16
-rw-r--r--phpBB/adm/style/acp_php_info.html2
-rw-r--r--phpBB/adm/style/acp_profile.html10
-rw-r--r--phpBB/adm/style/acp_prune_forums.html4
-rw-r--r--phpBB/adm/style/acp_ranks.html2
-rw-r--r--phpBB/adm/style/acp_reasons.html6
-rw-r--r--phpBB/adm/style/acp_styles.html12
-rw-r--r--phpBB/adm/style/acp_users.html6
-rw-r--r--phpBB/adm/style/acp_users_feedback.html4
-rw-r--r--phpBB/adm/style/acp_words.html2
-rw-r--r--phpBB/adm/style/admin.css25
-rwxr-xr-xphpBB/adm/style/install_footer.html2
-rw-r--r--phpBB/adm/style/install_update.html60
-rw-r--r--phpBB/adm/style/install_update_diff.html9
-rw-r--r--phpBB/adm/style/overall_footer.html2
-rw-r--r--phpBB/adm/style/overall_header.html2
-rw-r--r--phpBB/adm/style/permission_mask.html15
-rw-r--r--phpBB/adm/style/permission_trace.html9
-rw-r--r--phpBB/adm/style/simple_footer.html2
-rw-r--r--phpBB/adm/swatch.php2
-rw-r--r--phpBB/cron.php37
-rw-r--r--phpBB/develop/create_schema_files.php30
-rw-r--r--phpBB/develop/generate_utf_confusables.php240
-rw-r--r--phpBB/develop/unicode_testing.php120
-rw-r--r--phpBB/docs/CHANGELOG.html126
-rw-r--r--phpBB/docs/FAQ.html4
-rw-r--r--phpBB/docs/README.html6
-rw-r--r--phpBB/download.php21
-rw-r--r--phpBB/faq.php2
-rw-r--r--phpBB/includes/acm/acm_file.php14
-rw-r--r--phpBB/includes/acp/acp_attachments.php4
-rw-r--r--phpBB/includes/acp/acp_ban.php6
-rw-r--r--phpBB/includes/acp/acp_bbcodes.php4
-rw-r--r--phpBB/includes/acp/acp_board.php5
-rw-r--r--phpBB/includes/acp/acp_bots.php2
-rw-r--r--phpBB/includes/acp/acp_database.php6
-rw-r--r--phpBB/includes/acp/acp_disallow.php2
-rw-r--r--phpBB/includes/acp/acp_email.php6
-rw-r--r--phpBB/includes/acp/acp_forums.php19
-rw-r--r--phpBB/includes/acp/acp_groups.php6
-rw-r--r--phpBB/includes/acp/acp_icons.php21
-rwxr-xr-xphpBB/includes/acp/acp_inactive.php43
-rw-r--r--phpBB/includes/acp/acp_language.php40
-rw-r--r--phpBB/includes/acp/acp_main.php23
-rw-r--r--phpBB/includes/acp/acp_modules.php58
-rw-r--r--phpBB/includes/acp/acp_permission_roles.php8
-rw-r--r--phpBB/includes/acp/acp_permissions.php65
-rw-r--r--phpBB/includes/acp/acp_php_info.php11
-rw-r--r--phpBB/includes/acp/acp_profile.php75
-rw-r--r--phpBB/includes/acp/acp_prune.php2
-rw-r--r--phpBB/includes/acp/acp_ranks.php7
-rw-r--r--phpBB/includes/acp/acp_reasons.php4
-rw-r--r--phpBB/includes/acp/acp_styles.php103
-rw-r--r--phpBB/includes/acp/acp_users.php30
-rw-r--r--phpBB/includes/acp/auth.php60
-rw-r--r--phpBB/includes/auth.php31
-rw-r--r--phpBB/includes/db/dbal.php2
-rw-r--r--phpBB/includes/db/oracle.php2
-rw-r--r--phpBB/includes/functions.php131
-rw-r--r--phpBB/includes/functions_admin.php34
-rw-r--r--phpBB/includes/functions_compress.php28
-rw-r--r--phpBB/includes/functions_convert.php45
-rw-r--r--phpBB/includes/functions_display.php26
-rw-r--r--phpBB/includes/functions_install.php3
-rw-r--r--phpBB/includes/functions_jabber.php2
-rw-r--r--phpBB/includes/functions_messenger.php12
-rw-r--r--phpBB/includes/functions_module.php47
-rw-r--r--phpBB/includes/functions_posting.php39
-rw-r--r--phpBB/includes/functions_privmsgs.php17
-rw-r--r--phpBB/includes/functions_profile_fields.php13
-rw-r--r--phpBB/includes/functions_user.php121
-rw-r--r--phpBB/includes/mcp/mcp_ban.php12
-rw-r--r--phpBB/includes/mcp/mcp_forum.php4
-rw-r--r--phpBB/includes/mcp/mcp_front.php2
-rwxr-xr-xphpBB/includes/mcp/mcp_logs.php80
-rw-r--r--phpBB/includes/mcp/mcp_main.php18
-rwxr-xr-xphpBB/includes/mcp/mcp_notes.php4
-rw-r--r--phpBB/includes/mcp/mcp_post.php6
-rw-r--r--phpBB/includes/mcp/mcp_queue.php6
-rwxr-xr-xphpBB/includes/mcp/mcp_reports.php2
-rw-r--r--phpBB/includes/mcp/mcp_topic.php11
-rwxr-xr-xphpBB/includes/mcp/mcp_warn.php14
-rw-r--r--phpBB/includes/message_parser.php25
-rw-r--r--phpBB/includes/search/fulltext_mysql.php14
-rwxr-xr-xphpBB/includes/search/fulltext_native.php21
-rw-r--r--phpBB/includes/session.php117
-rw-r--r--phpBB/includes/template.php2
-rw-r--r--phpBB/includes/ucp/ucp_groups.php20
-rw-r--r--phpBB/includes/ucp/ucp_main.php2
-rw-r--r--phpBB/includes/ucp/ucp_pm_compose.php24
-rw-r--r--phpBB/includes/ucp/ucp_pm_options.php4
-rw-r--r--phpBB/includes/ucp/ucp_pm_viewfolder.php26
-rw-r--r--phpBB/includes/ucp/ucp_pm_viewmessage.php7
-rw-r--r--phpBB/includes/ucp/ucp_profile.php100
-rw-r--r--phpBB/includes/ucp/ucp_register.php8
-rw-r--r--phpBB/includes/ucp/ucp_remind.php3
-rw-r--r--phpBB/includes/ucp/ucp_zebra.php2
-rw-r--r--phpBB/includes/utf/data/confusables.php1
-rw-r--r--phpBB/includes/utf/utf_tools.php863
-rw-r--r--phpBB/index.php12
-rw-r--r--phpBB/install/convertors/convert_phpbb20.php2
-rw-r--r--phpBB/install/convertors/functions_phpbb20.php27
-rw-r--r--phpBB/install/data/confusables.php632
-rw-r--r--phpBB/install/database_update.php983
-rwxr-xr-xphpBB/install/index.php15
-rw-r--r--phpBB/install/install_convert.php1
-rwxr-xr-xphpBB/install/install_install.php418
-rw-r--r--phpBB/install/install_update.php122
-rw-r--r--phpBB/install/schemas/mysql_40_schema.sql28
-rw-r--r--phpBB/install/schemas/mysql_41_schema.sql28
-rw-r--r--phpBB/install/schemas/oracle_schema.sql2
-rw-r--r--phpBB/install/schemas/postgres_schema.sql16
-rw-r--r--phpBB/install/schemas/schema_data.sql3
-rw-r--r--phpBB/install/schemas/sqlite_schema.sql18
-rw-r--r--phpBB/language/en/acp/board.php11
-rw-r--r--phpBB/language/en/acp/bots.php4
-rw-r--r--phpBB/language/en/acp/common.php4
-rw-r--r--phpBB/language/en/acp/database.php2
-rw-r--r--phpBB/language/en/acp/forums.php6
-rw-r--r--phpBB/language/en/acp/permissions.php34
-rw-r--r--phpBB/language/en/acp/permissions_phpbb.php12
-rw-r--r--phpBB/language/en/acp/posting.php8
-rw-r--r--phpBB/language/en/acp/profile.php4
-rw-r--r--phpBB/language/en/acp/search.php2
-rw-r--r--phpBB/language/en/acp/styles.php1
-rw-r--r--phpBB/language/en/common.php8
-rw-r--r--phpBB/language/en/help_bbcode.php22
-rwxr-xr-xphpBB/language/en/install.php24
-rw-r--r--phpBB/language/en/mcp.php2
-rw-r--r--phpBB/language/en/memberlist.php1
-rw-r--r--phpBB/language/en/posting.php8
-rw-r--r--phpBB/language/en/search.php2
-rw-r--r--phpBB/language/en/ucp.php12
-rw-r--r--phpBB/language/en/viewtopic.php1
-rw-r--r--phpBB/mcp.php8
-rw-r--r--phpBB/memberlist.php28
-rw-r--r--phpBB/posting.php27
-rw-r--r--phpBB/report.php2
-rw-r--r--phpBB/search.php48
-rw-r--r--phpBB/style.php72
-rw-r--r--phpBB/styles/prosilver/template/drafts.html2
-rw-r--r--phpBB/styles/prosilver/template/forum_fn.js2
-rw-r--r--phpBB/styles/prosilver/template/index_body.html9
-rw-r--r--phpBB/styles/prosilver/template/jumpbox.html2
-rw-r--r--phpBB/styles/prosilver/template/mcp_notes_user.html2
-rw-r--r--phpBB/styles/prosilver/template/mcp_post.html4
-rw-r--r--phpBB/styles/prosilver/template/mcp_topic.html3
-rw-r--r--phpBB/styles/prosilver/template/mcp_warn_list.html2
-rw-r--r--phpBB/styles/prosilver/template/mcp_warn_post.html2
-rw-r--r--phpBB/styles/prosilver/template/mcp_warn_user.html2
-rw-r--r--phpBB/styles/prosilver/template/memberlist_body.html5
-rw-r--r--phpBB/styles/prosilver/template/memberlist_view.html42
-rw-r--r--phpBB/styles/prosilver/template/message_body.html2
-rw-r--r--phpBB/styles/prosilver/template/overall_footer.html2
-rw-r--r--phpBB/styles/prosilver/template/overall_header.html18
-rw-r--r--phpBB/styles/prosilver/template/posting_editor.html8
-rw-r--r--phpBB/styles/prosilver/template/report_body.html2
-rw-r--r--phpBB/styles/prosilver/template/search_results.html2
-rw-r--r--phpBB/styles/prosilver/template/simple_header.html16
-rw-r--r--phpBB/styles/prosilver/template/ucp_groups_manage.html4
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_viewmessage.html6
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_profile_profile_info.html20
-rw-r--r--phpBB/styles/prosilver/template/ucp_register.html2
-rw-r--r--phpBB/styles/prosilver/template/viewforum_body.html28
-rw-r--r--phpBB/styles/prosilver/template/viewonline_body.html3
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_body.html11
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_print.html2
-rw-r--r--phpBB/styles/prosilver/theme/buttons.css4
-rw-r--r--phpBB/styles/prosilver/theme/common.css5
-rw-r--r--phpBB/styles/prosilver/theme/forms.css6
-rw-r--r--phpBB/styles/subsilver2/template/index_body.html4
-rw-r--r--phpBB/styles/subsilver2/template/mcp_approve.html2
-rw-r--r--phpBB/styles/subsilver2/template/mcp_logs.html2
-rw-r--r--phpBB/styles/subsilver2/template/mcp_move.html2
-rw-r--r--phpBB/styles/subsilver2/template/mcp_notes_user.html2
-rw-r--r--phpBB/styles/subsilver2/template/mcp_topic.html2
-rw-r--r--phpBB/styles/subsilver2/template/memberlist_view.html4
-rw-r--r--phpBB/styles/subsilver2/template/overall_header.html6
-rw-r--r--phpBB/styles/subsilver2/template/posting_body.html6
-rw-r--r--phpBB/styles/subsilver2/template/ucp_groups_manage.html18
-rw-r--r--phpBB/styles/subsilver2/template/ucp_main_drafts.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_main_front.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_pm_message_footer.html14
-rw-r--r--phpBB/styles/subsilver2/template/ucp_pm_options.html4
-rw-r--r--phpBB/styles/subsilver2/template/ucp_pm_viewmessage.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_prefs_personal.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_prefs_post.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_prefs_view.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_profile_avatar.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_profile_profile_info.html14
-rw-r--r--phpBB/styles/subsilver2/template/ucp_profile_reg_details.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_register.html4
-rw-r--r--phpBB/styles/subsilver2/template/ucp_zebra_foes.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_zebra_friends.html2
-rw-r--r--phpBB/styles/subsilver2/template/viewforum_body.html27
-rw-r--r--phpBB/styles/subsilver2/template/viewonline_body.html3
-rw-r--r--phpBB/styles/subsilver2/template/viewtopic_body.html20
-rw-r--r--phpBB/styles/subsilver2/theme/stylesheet.css4
-rwxr-xr-xphpBB/ucp.php4
-rw-r--r--phpBB/viewforum.php25
-rw-r--r--phpBB/viewonline.php43
-rw-r--r--phpBB/viewtopic.php16
217 files changed, 5001 insertions, 1568 deletions
diff --git a/phpBB/adm/index.php b/phpBB/adm/index.php
index 836d2556f8..f99a2f8a73 100644
--- a/phpBB/adm/index.php
+++ b/phpBB/adm/index.php
@@ -15,7 +15,7 @@ define('ADMIN_START', true);
define('NEED_SID', true);
// Include files
-$phpbb_root_path = './../';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'common.' . $phpEx);
require($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
@@ -27,12 +27,6 @@ $auth->acl($user->data);
$user->setup('acp/common');
// End session management
-// Did user forget to login? Give 'em a chance to here ...
-if ($user->data['user_id'] == ANONYMOUS)
-{
- login_box('', $user->lang['LOGIN_ADMIN'], $user->lang['LOGIN_ADMIN_SUCCESS'], true);
-}
-
// Have they authenticated (again) as an admin for this session?
if (!isset($user->data['session_admin']) || !$user->data['session_admin'])
{
@@ -43,7 +37,7 @@ if (!isset($user->data['session_admin']) || !$user->data['session_admin'])
// check specific permissions but this is a catchall
if (!$auth->acl_get('a_'))
{
- trigger_error($user->lang['NO_ADMIN']);
+ trigger_error('NO_ADMIN');
}
// We define the admin variables now, because the user is now able to use the admin related features...
@@ -147,6 +141,8 @@ function adm_page_header($page_title)
'S_USER_LANG' => $user->lang['USER_LANG'],
'S_CONTENT_DIRECTION' => $user->lang['DIRECTION'],
'S_CONTENT_ENCODING' => 'UTF-8',
+ 'S_CONTENT_FLOW_BEGIN' => ($user->lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
+ 'S_CONTENT_FLOW_END' => ($user->lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
));
// application/xhtml+xml not used because of IE
diff --git a/phpBB/adm/style/acp_attachments.html b/phpBB/adm/style/acp_attachments.html
index cee60b4185..36d8f24f32 100644
--- a/phpBB/adm/style/acp_attachments.html
+++ b/phpBB/adm/style/acp_attachments.html
@@ -3,7 +3,7 @@
<a name="maincontent"></a>
<!-- IF U_BACK -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<!-- ENDIF -->
<h1>{L_TITLE}</h1>
diff --git a/phpBB/adm/style/acp_ban.html b/phpBB/adm/style/acp_ban.html
index cbafa554b1..334d245edf 100644
--- a/phpBB/adm/style/acp_ban.html
+++ b/phpBB/adm/style/acp_ban.html
@@ -71,14 +71,19 @@
<input class="button1" type="submit" id="bansubmit" name="bansubmit" value="{L_SUBMIT}" />&nbsp;
<input class="button2" type="reset" id="banreset" name="banreset" value="{L_RESET}" />
</p>
+
</fieldset>
+</form>
+
<br /><br />
<h1>{L_UNBAN_TITLE}</h1>
<p>{L_UNBAN_EXPLAIN}</p>
+<form id="acp_unban" method="post" action="{U_ACTION}">
+
<fieldset>
<legend>{L_UNBAN_TITLE}</legend>
diff --git a/phpBB/adm/style/acp_bbcodes.html b/phpBB/adm/style/acp_bbcodes.html
index 4370b5e225..8d9827b672 100644
--- a/phpBB/adm/style/acp_bbcodes.html
+++ b/phpBB/adm/style/acp_bbcodes.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT_BBCODE -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_ACP_BBCODES}</h1>
diff --git a/phpBB/adm/style/acp_board.html b/phpBB/adm/style/acp_board.html
index 5ab0e079d4..c7501ce088 100644
--- a/phpBB/adm/style/acp_board.html
+++ b/phpBB/adm/style/acp_board.html
@@ -37,12 +37,12 @@
{auth_tpl.TPL}
<!-- END auth_tpl -->
<!-- ENDIF -->
-</fieldset>
-<fieldset class="submit-buttons">
- <legend>{L_SUBMIT}</legend>
- <input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp;
- <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
+ <p class="submit-buttons">
+ <input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp;
+ <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
+ </p>
+
</fieldset>
</form>
diff --git a/phpBB/adm/style/acp_bots.html b/phpBB/adm/style/acp_bots.html
index a80c6db331..2f65a0fbec 100644
--- a/phpBB/adm/style/acp_bots.html
+++ b/phpBB/adm/style/acp_bots.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT_BOT -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -85,11 +85,11 @@
</tbody>
</table>
- <fieldset class="quick" style="float: left;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_BEGIN};">
<input class="button2" name="add" type="submit" value="{L_BOT_ADD}" />
</fieldset>
- <fieldset class="quick" style="float: right;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
<select name="action">{S_BOT_OPTIONS}</select>
<input class="button2" name="submit" type="submit" value="{L_SUBMIT}" />
<p class="small"><a href="#" onclick="marklist('acp_bots', 'mark', true);">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('acp_bots', 'mark', false);">{L_UNMARK_ALL}</a></p>
diff --git a/phpBB/adm/style/acp_forums.html b/phpBB/adm/style/acp_forums.html
index eaa7d3bf7a..1aef98c36b 100644
--- a/phpBB/adm/style/acp_forums.html
+++ b/phpBB/adm/style/acp_forums.html
@@ -95,7 +95,7 @@
//-->
</script>
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE} :: {FORUM_NAME}</h1>
@@ -120,8 +120,8 @@
<div id="type_actions">
<dl>
<dt><label for="type_action">{L_DECIDE_MOVE_DELETE_CONTENT}:</label></dt>
- <dd><label><input type="radio" class="radio" id="type_action" name="type_action" value="delete" checked="checked" /> {L_DELETE_ALL_POSTS}</label></dd>
- <!-- IF S_MOVE_FORUM_OPTIONS --><dd><label><input type="radio" class="radio" name="type_action" value="move" /> {L_MOVE_POSTS_TO}</label> <select name="to_forum_id">{S_MOVE_FORUM_OPTIONS}</select></dd><!-- ENDIF -->
+ <dd><label><input type="radio" class="radio" name="type_action" value="delete"<!-- IF not S_MOVE_FORUM_OPTIONS --> checked="checked" id="type_action"<!-- ENDIF --> /> {L_DELETE_ALL_POSTS}</label></dd>
+ <!-- IF S_MOVE_FORUM_OPTIONS --><dd><label><input type="radio" class="radio" name="type_action" id="type_action" value="move" checked="checked" /> {L_MOVE_POSTS_TO}</label> <select name="to_forum_id">{S_MOVE_FORUM_OPTIONS}</select></dd><!-- ENDIF -->
</dl>
</div>
<!-- ENDIF -->
@@ -316,7 +316,7 @@
<!-- ELSEIF S_DELETE_FORUM -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_FORUM_DELETE}</h1>
@@ -431,7 +431,7 @@
<tr>
<td style="width: 5%; text-align: center;">{forums.FOLDER_IMAGE}</td>
<td>
- <!-- IF forums.FORUM_IMAGE --><div style="float: left; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF -->
+ <!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF -->
<strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong>
<!-- IF forums.FORUM_DESCRIPTION --><br /><span>{forums.FORUM_DESCRIPTION}</span><!-- ENDIF -->
<!-- IF forums.S_FORUM_POST --><br /><br /><span>{L_TOPICS}: <strong>{forums.FORUM_TOPICS}</strong> / {L_POSTS}: <b>{forums.FORUM_POSTS}</b></span><!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_groups.html b/phpBB/adm/style/acp_groups.html
index 3bdeaeaad0..a659207f9e 100644
--- a/phpBB/adm/style/acp_groups.html
+++ b/phpBB/adm/style/acp_groups.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_ACP_GROUPS_MANAGE}</h1>
@@ -160,7 +160,7 @@
<!-- ELSEIF S_LIST -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_GROUP_MEMBERS} :: {GROUP_NAME}</h1>
diff --git a/phpBB/adm/style/acp_icons.html b/phpBB/adm/style/acp_icons.html
index 81f56cc299..9c488c9f90 100644
--- a/phpBB/adm/style/acp_icons.html
+++ b/phpBB/adm/style/acp_icons.html
@@ -41,7 +41,7 @@
</script>
<!-- ENDIF -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -137,7 +137,7 @@
<!-- ELSEIF S_CHOOSE_PAK -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
diff --git a/phpBB/adm/style/acp_language.html b/phpBB/adm/style/acp_language.html
index d15f722e98..c016251d38 100644
--- a/phpBB/adm/style/acp_language.html
+++ b/phpBB/adm/style/acp_language.html
@@ -4,7 +4,7 @@
<!-- IF S_SELECT_METHOD -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_SELECT_DOWNLOAD_FORMAT}</h1>
@@ -26,7 +26,7 @@
<!-- ELSEIF S_DETAILS -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_LANGUAGE_PACK_DETAILS}</h1>
@@ -107,12 +107,12 @@
<form id="lang_entries" method="post" action="{U_ENTRY_ACTION}">
<!-- IF S_FROM_STORE -->
- <fieldset class="quick" style="float: left;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_BEGIN};">
<input type="submit" name="remove_store" value="{L_REMOVE_FROM_STORAGE_FOLDER}" class="button2" />
</fieldset>
<!-- ENDIF -->
- <fieldset class="quick" style="float: right;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
<select name="language_file">{S_LANG_OPTIONS}</select>&nbsp;<input type="submit" class="button2" name="change" value="{L_SELECT}" />
</fieldset>
@@ -166,7 +166,7 @@
<!-- ELSEIF S_UPLOAD -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_UPLOAD_SETTINGS}</h1>
diff --git a/phpBB/adm/style/acp_logs.html b/phpBB/adm/style/acp_logs.html
index 19696c014a..e18c4882c5 100644
--- a/phpBB/adm/style/acp_logs.html
+++ b/phpBB/adm/style/acp_logs.html
@@ -72,8 +72,8 @@
<!-- IF S_CLEARLOGS -->
<fieldset class="quick">
- <input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" />&nbsp;
- <input class="button2" type="submit" name="delall" value="{L_DELETE_ALL}" /><br />
+ <input class="button2" type="submit" name="delall" value="{L_DELETE_ALL}" />&nbsp;
+ <input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" /><br />
<p class="small"><a href="#" onclick="marklist('list', 'mark', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('list', 'mark', false); return false;">{L_UNMARK_ALL}</a></p>
</fieldset>
<!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_main.html b/phpBB/adm/style/acp_main.html
index 80c7f09d6e..bad15bef30 100644
--- a/phpBB/adm/style/acp_main.html
+++ b/phpBB/adm/style/acp_main.html
@@ -77,14 +77,17 @@
<td>{L_GZIP_COMPRESSION}: </td>
<td><strong>{GZIP_COMPRESSION}</strong></td>
</tr>
- <!-- IF S_TOTAL_ORPHAN -->
<tr>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
+ <td>{L_BOARD_VERSION}: </td>
+ <td><strong>{BOARD_VERSION}</strong></td>
+ <!-- IF S_TOTAL_ORPHAN -->
<td>{L_NUMBER_ORPHAN}: </td>
<td><strong>{TOTAL_ORPHAN}</strong></td>
- </tr>
+ <!-- ELSE -->
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
<!-- ENDIF -->
+ </tr>
</tbody>
</table>
diff --git a/phpBB/adm/style/acp_modules.html b/phpBB/adm/style/acp_modules.html
index d241119fb6..3fafd1288b 100644
--- a/phpBB/adm/style/acp_modules.html
+++ b/phpBB/adm/style/acp_modules.html
@@ -55,7 +55,7 @@
//-->
</script>
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE} :: {MODULENAME}</h1>
@@ -177,7 +177,7 @@
<form id="quick" method="post" action="{U_ACTION}">
- <fieldset class="quick" style="float: right;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
<input type="hidden" name="action" value="quickadd" />
<select name="quick_install">{S_INSTALL_OPTIONS}</select>
@@ -188,7 +188,7 @@
<form id="module" method="post" action="{U_ACTION}">
- <fieldset class="quick" style="float: left;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_BEGIN};">
<input type="hidden" name="action" value="add" />
<input type="hidden" name="module_parent_id" value="{PARENT_ID}" />
@@ -198,7 +198,7 @@
</form>
- <div class="clearfix">&nbsp;</div>
+ <div class="clearfix">&nbsp;</div><br style="clear: both;" />
<form id="mselect" method="post" action="{U_SEL_ACTION}">
<fieldset class="quick">
diff --git a/phpBB/adm/style/acp_permission_roles.html b/phpBB/adm/style/acp_permission_roles.html
index 83256ff78d..e16d7598ab 100644
--- a/phpBB/adm/style/acp_permission_roles.html
+++ b/phpBB/adm/style/acp_permission_roles.html
@@ -22,7 +22,7 @@
<script type="text/javascript" src="style/permissions.js"></script>
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
diff --git a/phpBB/adm/style/acp_permissions.html b/phpBB/adm/style/acp_permissions.html
index 862ba6e8d2..5eb9c2eab3 100644
--- a/phpBB/adm/style/acp_permissions.html
+++ b/phpBB/adm/style/acp_permissions.html
@@ -108,7 +108,7 @@
<!-- ELSEIF S_SELECT_USERGROUP -->
- <div style="float: left; width: 48%;">
+ <div style="float: {S_CONTENT_FLOW_BEGIN}; width: 48%;">
<!-- IF S_CAN_SELECT_USER -->
@@ -138,7 +138,7 @@
<p>{L_USERNAMES_EXPLAIN}</p>
<dl>
<dd class="full"><textarea id="username" name="usernames" rows="5" cols="5" style="width: 100%; height: 60px;"></textarea></dd>
- <dd class="full" style="text-align: left;"><div style="float: right;">[ <a href="{U_FIND_USERNAME}" onclick="find_username(); return false;">{L_FIND_USERNAME}</a> ]</div><label><input type="checkbox" class="radio" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> {L_SELECT_ANONYMOUS}</label></dd>
+ <dd class="full" style="text-align: left;"><div style="float: {S_CONTENT_FLOW_END};">[ <a href="{U_FIND_USERNAME}" onclick="find_username(); return false;">{L_FIND_USERNAME}</a> ]</div><label><input type="checkbox" class="radio" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> {L_SELECT_ANONYMOUS}</label></dd>
</dl>
</fieldset>
@@ -153,7 +153,7 @@
</div>
- <div style="float: right; width: 48%">
+ <div style="float: {S_CONTENT_FLOW_END}; width: 48%">
<!-- IF S_CAN_SELECT_GROUP -->
@@ -198,7 +198,7 @@
<!-- ELSEIF S_SELECT_USERGROUP_VIEW -->
- <div style="float: left; width: 48%;">
+ <div style="float: {S_CONTENT_FLOW_BEGIN}; width: 48%;">
<h1>{L_USERS}</h1>
@@ -239,7 +239,7 @@
</div>
- <div style="float: right; width: 48%">
+ <div style="float: {S_CONTENT_FLOW_END}; width: 48%">
<h1>{L_USERGROUPS}</h1>
@@ -305,14 +305,14 @@
<br />
- <fieldset class="quick" style="float: right;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
<strong>&raquo; {L_PERMISSION_TYPE}</strong>
</fieldset>
<!-- IF S_PERMISSION_DROPDOWN -->
<form id="pselect" method="post" action="{U_ACTION}">
- <fieldset class="quick" style="float: left;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_BEGIN};">
{S_HIDDEN_FIELDS}
{L_SELECT_TYPE}: <select name="type">{S_PERMISSION_DROPDOWN}</select>
@@ -340,7 +340,7 @@
<br /><br />
- <fieldset class="quick" style="float: right;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
<input class="button1" type="submit" name="action[apply_all_permissions]" value="{L_APPLY_ALL_PERMISSIONS}" />
<input class="button2" type="button" name="cancel" value="{L_RESET}" onclick="document.forms['set-permissions'].reset(); init_colours(active_pmask + active_fmask);" />
</fieldset>
diff --git a/phpBB/adm/style/acp_php_info.html b/phpBB/adm/style/acp_php_info.html
index e1d4731c64..de065c4896 100644
--- a/phpBB/adm/style/acp_php_info.html
+++ b/phpBB/adm/style/acp_php_info.html
@@ -6,7 +6,7 @@
<p>{L_ACP_PHP_INFO_EXPLAIN}</p>
-<div style="overflow: auto; width: 99%;">
+<div class="phpinfo">
{PHPINFO}
</div>
diff --git a/phpBB/adm/style/acp_profile.html b/phpBB/adm/style/acp_profile.html
index e14e622080..bd9f0cc9a0 100644
--- a/phpBB/adm/style/acp_profile.html
+++ b/phpBB/adm/style/acp_profile.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -123,11 +123,11 @@
<!-- END option -->
</fieldset>
- <fieldset class="quick" style="float: left;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_BEGIN};">
<input class="button1" type="submit" name="prev" value="{L_PROFILE_BASIC_OPTIONS}" />
</fieldset>
- <fieldset class="quick" style="float: right">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
{S_HIDDEN_FIELDS}
<input class="button1" type="submit" name="next" value="{L_NEXT_STEP}" />
</fieldset>
@@ -146,11 +146,11 @@
</fieldset>
<!-- END options -->
- <fieldset class="quick" style="float: left;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_BEGIN};">
<input class="button1" type="submit" name="prev" value="{L_PROFILE_TYPE_OPTIONS}" />
</fieldset>
- <fieldset class="quick" style="float: right;">
+ <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
{S_HIDDEN_FIELDS}
<input class="button1" type="submit" name="save" value="{L_SAVE}" />
</fieldset>
diff --git a/phpBB/adm/style/acp_prune_forums.html b/phpBB/adm/style/acp_prune_forums.html
index ad8d987a02..8d8f913b53 100644
--- a/phpBB/adm/style/acp_prune_forums.html
+++ b/phpBB/adm/style/acp_prune_forums.html
@@ -44,7 +44,7 @@
<p>{L_LOOK_UP_FORUMS_EXPLAIN}</p>
<dl>
<dt><label for="forum">{L_LOOK_UP_FORUM}:</label></dt>
- <dd><select name="f[]" multiple="multiple" size="5">{S_FORUM_OPTIONS}</select></dd>
+ <dd><select name="f[]" multiple="multiple" size="10">{S_FORUM_OPTIONS}</select></dd>
<dd><label><input type="checkbox" class="radio" name="all_forums" value="1" /> {L_ALL_FORUMS}</label></dd>
</dl>
@@ -57,7 +57,7 @@
<!-- ELSE -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_ACP_PRUNE_FORUMS}</h1>
diff --git a/phpBB/adm/style/acp_ranks.html b/phpBB/adm/style/acp_ranks.html
index a8d496e257..bfb805f3d8 100644
--- a/phpBB/adm/style/acp_ranks.html
+++ b/phpBB/adm/style/acp_ranks.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<script type="text/javascript">
<!--
diff --git a/phpBB/adm/style/acp_reasons.html b/phpBB/adm/style/acp_reasons.html
index e10cc1d1ca..3ad32e7d39 100644
--- a/phpBB/adm/style/acp_reasons.html
+++ b/phpBB/adm/style/acp_reasons.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT_REASON -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -40,7 +40,7 @@
<!-- ENDIF -->
<dl>
<dt><label for="reason_description">{L_REASON_DESCRIPTION}:</label></dt>
- <dd><textarea name="reason_description" id="reason_description" rows="8">{REASON_DESCRIPTION}</textarea></dd>
+ <dd><textarea name="reason_description" id="reason_description" rows="8" cols="80">{REASON_DESCRIPTION}</textarea></dd>
</dl>
<!-- IF S_TRANSLATED -->
<dl>
@@ -81,7 +81,7 @@
<!-- BEGIN reasons -->
<tr>
<td>
- <i style="float: right; font-size: .9em;"><!-- IF reasons.S_TRANSLATED -->{L_IS_TRANSLATED}<!-- ELSE -->{L_IS_NOT_TRANSLATED}<!-- ENDIF --></i>
+ <i style="float: {S_CONTENT_FLOW_END}; font-size: .9em;"><!-- IF reasons.S_TRANSLATED -->{L_IS_TRANSLATED}<!-- ELSE -->{L_IS_NOT_TRANSLATED}<!-- ENDIF --></i>
<strong>{reasons.REASON_TITLE}<!-- IF reasons.S_OTHER_REASON --> *<!-- ENDIF --></strong>
<br /><span>{reasons.REASON_DESCRIPTION}</span>
</td>
diff --git a/phpBB/adm/style/acp_styles.html b/phpBB/adm/style/acp_styles.html
index 58d742ba62..c555071fee 100644
--- a/phpBB/adm/style/acp_styles.html
+++ b/phpBB/adm/style/acp_styles.html
@@ -4,7 +4,7 @@
<!-- IF S_DELETE -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -32,7 +32,7 @@
<!-- ELSEIF S_EDIT_IMAGESET -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -180,7 +180,7 @@
//-->
</script>
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_EDIT}</h1>
@@ -280,7 +280,7 @@
//-->
</script>
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TEMPLATE_CACHE}</h1>
@@ -328,7 +328,7 @@
<!-- ELSEIF S_EXPORT -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
@@ -455,7 +455,7 @@
<!-- ELSEIF S_DETAILS -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_TITLE}</h1>
diff --git a/phpBB/adm/style/acp_users.html b/phpBB/adm/style/acp_users.html
index 307ddb75e4..a7ac71abed 100644
--- a/phpBB/adm/style/acp_users.html
+++ b/phpBB/adm/style/acp_users.html
@@ -28,7 +28,7 @@
<!-- ELSEIF S_SELECT_FORUM -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_USER_ADMIN}</h1>
@@ -52,7 +52,7 @@
<!-- ELSE -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_USER_ADMIN} :: {MANAGED_USERNAME}</h1>
@@ -207,7 +207,7 @@
<!-- ELSEIF S_PERMISSIONS -->
- <div style="float: right;">
+ <div style="float: {S_CONTENT_FLOW_END};">
<a href="{U_USER_PERMISSIONS}">&raquo; {L_SET_USERS_PERMISSIONS}</a><br />
<a href="{U_USER_FORUM_PERMISSIONS}">&raquo; {L_SET_USERS_FORUM_PERMISSIONS}</a>
</div>
diff --git a/phpBB/adm/style/acp_users_feedback.html b/phpBB/adm/style/acp_users_feedback.html
index 0f64888170..e1d4076e4d 100644
--- a/phpBB/adm/style/acp_users_feedback.html
+++ b/phpBB/adm/style/acp_users_feedback.html
@@ -52,8 +52,8 @@
<!-- IF S_CLEARLOGS -->
<fieldset class="quick">
- <input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" />&nbsp;
- <input class="button2" type="submit" name="delall" value="{L_DELETE_ALL}" />
+ <input class="button2" type="submit" name="delall" value="{L_DELETE_ALL}" />&nbsp;
+ <input class="button2" type="submit" name="delmarked" value="{L_DELETE_MARKED}" />
<p class="small"><a href="#" onclick="marklist('list', 'mark', true);">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('list', 'mark', false);">{L_UNMARK_ALL}</a></p>
</fieldset>
<!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_words.html b/phpBB/adm/style/acp_words.html
index fa85669595..055a616f70 100644
--- a/phpBB/adm/style/acp_words.html
+++ b/phpBB/adm/style/acp_words.html
@@ -4,7 +4,7 @@
<!-- IF S_EDIT_WORD -->
- <a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a>
+ <a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a>
<h1>{L_ACP_WORDS}</h1>
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index b127462814..4d30bb0b91 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -1322,11 +1322,23 @@ fieldset.permissions .permissions-switch {
float: left;
}
+fieldset.permissions .padding {
+}
+
.permissions-switch a {
text-decoration: underline;
font-size: 0.90em;
}
+.permissions-reset {
+ margin-top: -6px;
+ padding-bottom: 10px;
+}
+
+.permissions-reset a {
+ font-size: .8em;
+}
+
/* Tabbed menu */
.permissions-category {
line-height: normal;
@@ -1602,3 +1614,16 @@ fieldset.permissions .permissions-switch {
margin: 0;
padding: 0;
}
+
+/* Classes for additional tasks
+---------------------------------------- */
+
+.phpinfo {
+ overflow: auto;
+ width: 99%;
+ direction: ltr;
+}
+
+.phpinfo td, .phpinfo th, .phpinfo h2, .phpinfo h1 {
+ text-align: left;
+}
diff --git a/phpBB/adm/style/install_footer.html b/phpBB/adm/style/install_footer.html
index e73324dc1f..2ec3581ef4 100755
--- a/phpBB/adm/style/install_footer.html
+++ b/phpBB/adm/style/install_footer.html
@@ -18,7 +18,7 @@
// -->
<div id="page-footer">
- Powered by phpBB {VERSION} &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
+ Powered by phpBB &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
</div>
</div>
diff --git a/phpBB/adm/style/install_update.html b/phpBB/adm/style/install_update.html
index 6b361ec3f1..34d00241cb 100644
--- a/phpBB/adm/style/install_update.html
+++ b/phpBB/adm/style/install_update.html
@@ -2,20 +2,30 @@
<script type="text/javascript">
<!--
- function popup(url, width, height)
+ function diff_popup(url)
{
- window.open(url.replace(/&amp;/g, '&'), 'diff', 'height=' + height + ',resizable=yes,scrollbars=yes,width=' + width);
+ window.open(url.replace(/&amp;/g, '&'), 'diff', 'height=600,resizable=yes,scrollbars=yes,width=950');
return false;
}
//-->
</script>
<!-- IF S_ERROR -->
- <h1>{L_NOTICE}</h1>
- <p style="color: red;">{ERROR_MSG}</p>
+ <div class="errorbox" style="margin-top: 0;">
+ <h3>{L_NOTICE}</h3>
+ <p>{ERROR_MSG}</p>
+ </div>
<!-- ENDIF -->
<!-- IF S_INTRO -->
+
+ <!-- IF S_WARNING -->
+ <div class="successbox" style="margin-top: 0;">
+ <h3>{L_NOTICE}</h3>
+ <p>{WARNING_MSG}</p>
+ </div>
+ <!-- ENDIF -->
+
<form id="install_update" method="post" action="{U_ACTION}">
<h1>{L_UPDATE_INSTALLATION}</h1>
@@ -68,6 +78,12 @@
<dt><label>{L_LATEST_VERSION}</label></dt>
<dd><strong>{LATEST_VERSION}</strong></dd>
</dl>
+ <!-- IF PACKAGE_VERSION and not S_UP_TO_DATE -->
+ <dl>
+ <dt><label>{L_PACKAGE_UPDATES_TO}</label></dt>
+ <dd><strong>{PACKAGE_VERSION}</strong></dd>
+ </dl>
+ <!-- ENDIF -->
</fieldset>
<!-- IF not S_UP_TO_DATE -->
@@ -185,28 +201,52 @@
<br /><span>{L_NUM_CONFLICTS}: {files.NUM_CONFLICTS}</span>
<!-- ENDIF -->
</dt>
- <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[ <a href="{files.U_SHOW_DIFF}" onclick="popup('{files.U_SHOW_DIFF}', 700, 500); return false;">{files.L_SHOW_DIFF}</a> ]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
+ <dd style="margin-left: 60%;"><!-- IF files.STATUS eq 'modified' -->&nbsp;<!-- ELSE --><!-- IF not files.S_BINARY -->[ <a href="{files.U_SHOW_DIFF}" onclick="diff_popup('{files.U_SHOW_DIFF}'); return false;">{files.L_SHOW_DIFF}</a> ]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --><!-- ENDIF --></dd>
<!-- IF files.S_CUSTOM -->
<dd style="margin-left: 60%;"><label><input type="checkbox" name="no_update[]" value="{files.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
<!-- ENDIF -->
+
+ <!-- IF files.STATUS eq 'modified' -->
+ </dl>
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="modified[{files.FILENAME}]" value="0" checked="checked" /> {L_MERGE_MODIFICATIONS_OPTION}</label></dt>
+ <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[ <a href="{files.U_SHOW_DIFF}" onclick="diff_popup('{files.U_SHOW_DIFF}'); return false;">{files.L_SHOW_DIFF}</a> ]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
+ </dl>
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="modified[{files.FILENAME}]" value="1" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
+ <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[<a href="{files.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup('{files.U_VIEW_NO_MERGE_NEW}'); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
+ </dl>
+ <dl>
+ <dt style="width: 60%"><label><input type="radio" class="radio" name="modified[{files.FILENAME}]" value="2" /> {L_MERGE_NO_MERGE_MOD_OPTION}</label></dt>
+ <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[<a href="{files.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup('{files.U_VIEW_NO_MERGE_MOD}'); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
+ </dl>
+ <!-- IF not files.S_LAST_ROW -->
+ </fieldset>
+
+ <fieldset>
+ <legend><img src="{T_IMAGE_PATH}file_{files.STATUS}.gif" alt="{files.L_STATUS}" /></legend>
+ <!-- ENDIF -->
+
+ <!-- ENDIF -->
+
<!-- IF files.STATUS eq 'conflict' -->
</dl>
<dl>
<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{files.FILENAME}]" value="1" checked="checked" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
- <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[<a href="{files.U_VIEW_NO_MERGE_NEW}" onclick="popup('{files.U_VIEW_NO_MERGE_NEW}', 700, 500); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
+ <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[<a href="{files.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup('{files.U_VIEW_NO_MERGE_NEW}'); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
</dl>
<dl>
<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{files.FILENAME}]" value="2" /> {L_MERGE_NO_MERGE_MOD_OPTION}</label></dt>
- <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[<a href="{files.U_VIEW_NO_MERGE_MOD}" onclick="popup('{files.U_VIEW_NO_MERGE_MOD}', 700, 500); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
+ <dd style="margin-left: 60%;"><!-- IF not files.S_BINARY -->[<a href="{files.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup('{files.U_VIEW_NO_MERGE_MOD}'); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
</dl>
<!-- IF not files.S_BINARY -->
<dl>
<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{files.FILENAME}]" value="3" /> {L_MERGE_NEW_FILE_OPTION}</label></dt>
- <dd style="margin-left: 60%;">[<a href="{files.U_VIEW_NEW_FILE}" onclick="popup('{files.U_VIEW_NEW_FILE}', 700, 500); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
+ <dd style="margin-left: 60%;">[<a href="{files.U_VIEW_NEW_FILE}" onclick="diff_popup('{files.U_VIEW_NEW_FILE}'); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
</dl>
<dl>
<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{files.FILENAME}]" value="4" /> {L_MERGE_MOD_FILE_OPTION}</label></dt>
- <dd style="margin-left: 60%;">[<a href="{files.U_VIEW_MOD_FILE}" onclick="popup('{files.U_VIEW_MOD_FILE}', 700, 500); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
+ <dd style="margin-left: 60%;">[<a href="{files.U_VIEW_MOD_FILE}" onclick="diff_popup('{files.U_VIEW_MOD_FILE}'); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
</dl>
<!-- ENDIF -->
<!-- IF not files.S_LAST_ROW -->
@@ -218,7 +258,7 @@
<!-- ENDIF -->
<!-- ENDIF -->
- <!-- IF files.STATUS neq 'conflict' --></dl><!-- ENDIF -->
+ <!-- IF files.STATUS neq 'conflict' and files.STATUS neq 'modified' --></dl><!-- ENDIF -->
<!-- ENDIF -->
<!-- END files -->
diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html
index 54242d94b4..ce1a241abe 100644
--- a/phpBB/adm/style/install_update_diff.html
+++ b/phpBB/adm/style/install_update_diff.html
@@ -42,11 +42,16 @@ function resize_panel()
width: 99%;
}
+#diff_content {
+ padding: 30px 10px 10px;
+}
+
<!-- IF DIFF_MODE neq 'side_by_side' and DIFF_MODE neq 'raw' -->
div#codepanel {
overflow: auto;
width: 100%;
height: 350px;
+ display: inline-block;
}
<!-- ELSE -->
div#codepanel {
@@ -230,11 +235,11 @@ table.hrdiff caption span {
<div id="acp">
<div class="panel" id="codepanel">
<span class="corners-top"><span></span></span>
- <div id="content">
+ <div id="diff_content">
<div id="main">
<!-- IF S_DIFF_CONFLICT_FILE -->
- <div style="float: right;"><strong>{L_NUM_CONFLICTS}: {NUM_CONFLICTS}</strong></div>
+ <div style="float: {S_CONTENT_FLOW_END};"><strong>{L_NUM_CONFLICTS}: {NUM_CONFLICTS}</strong></div>
<!-- ENDIF -->
{DIFF_CONTENT}
</div>
diff --git a/phpBB/adm/style/overall_footer.html b/phpBB/adm/style/overall_footer.html
index 1185df44bb..d5316aae08 100644
--- a/phpBB/adm/style/overall_footer.html
+++ b/phpBB/adm/style/overall_footer.html
@@ -19,7 +19,7 @@
<div id="page-footer">
<!-- IF S_COPYRIGHT_HTML -->
- Powered by phpBB {VERSION} &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
+ Powered by phpBB &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
<!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF -->
<!-- ENDIF -->
diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html
index 4cc4dbd678..a6b053b543 100644
--- a/phpBB/adm/style/overall_header.html
+++ b/phpBB/adm/style/overall_header.html
@@ -193,7 +193,7 @@ function switch_menu()
<a id="toggle-handle" accesskey="m" title="{L_MENU_TOGGLE}" onclick="switch_menu(); return false;" href="#"></a></div>
<!-- ENDIF -->
<div id="menu">
- <p>{L_LOGGED_IN_AS}<br /><strong>{USERNAME}</strong> [&nbsp;<a href="{U_LOGOUT}">{L_LOGOUT}</a>&nbsp;]</p>
+ <p>{L_LOGGED_IN_AS}<br /><strong>{USERNAME}</strong> [&nbsp;<a href="{U_LOGOUT}">{L_LOGOUT}</a>&nbsp;]</p>
<ul>
<!-- BEGIN l_block1 -->
<!-- IF l_block1.S_SELECTED -->
diff --git a/phpBB/adm/style/permission_mask.html b/phpBB/adm/style/permission_mask.html
index 81f889b390..1889f84d28 100644
--- a/phpBB/adm/style/permission_mask.html
+++ b/phpBB/adm/style/permission_mask.html
@@ -18,7 +18,7 @@
<!-- BEGIN p_mask -->
<div class="clearfix"></div>
-<h3>{p_mask.PADDING}{p_mask.NAME}<!-- IF p_mask.S_LOCAL --> <span class="small"> [{p_mask.L_ACL_TYPE}]</span><!-- ENDIF --></h3>
+<h3>{p_mask.NAME}<!-- IF p_mask.S_LOCAL --> <span class="small"> [{p_mask.L_ACL_TYPE}]</span><!-- ENDIF --></h3>
<!-- BEGIN f_mask -->
<div class="clearfix"></div>
@@ -28,11 +28,14 @@
<input type="checkbox" style="display: none;" class="permissions-checkbox" name="inherit[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" id="checkbox{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" value="1" onclick="toggle_opacity('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}')" />
<!-- ELSE -->
<!-- ENDIF -->
- <!-- {p_mask.f_mask.PADDING} -->{p_mask.f_mask.NAME}
+ <!-- IF p_mask.f_mask.PADDING --><span class="padding">{p_mask.f_mask.PADDING}{p_mask.f_mask.PADDING}</span><!-- ENDIF -->{p_mask.f_mask.NAME}
</legend>
<!-- IF not p_mask.S_VIEW -->
<div class="permissions-switch">
- <a href="#" onclick="swap_options('{p_mask.S_ROW_COUNT}', '{p_mask.f_mask.S_ROW_COUNT}', '0', true); return false;">{L_ADVANCED_PERMISSIONS}</a>
+ <div class="permissions-reset">
+ <a href="#" onclick="mark_options('perm{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}', 'y'); reset_role('role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); init_colours('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_ALL_YES}</a> &middot; <a href="#" onclick="mark_options('perm{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}', 'u'); reset_role('role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); init_colours('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_ALL_NO}</a> &middot; <a href="#" onclick="mark_options('perm{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}', 'n'); reset_role('role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); init_colours('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); return false;">{L_ALL_NEVER}</a>
+ </div>
+ <a href="#" onclick="swap_options('{p_mask.S_ROW_COUNT}', '{p_mask.f_mask.S_ROW_COUNT}', '0', true); return false;">{L_ADVANCED_PERMISSIONS}</a><!-- IF not p_mask.S_VIEW and p_mask.f_mask.S_CUSTOM --> *<!-- ENDIF -->
</div>
<dl class="permissions-simple">
<dt style="width: 20%"><label for="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">{L_ROLE}:</label></dt>
@@ -46,7 +49,11 @@
<!-- BEGIN category -->
<!-- IF p_mask.f_mask.category.S_FIRST_ROW -->
- <div class="permissions-advanced" id="advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}"<!-- IF not p_mask.S_VIEW --> style="display: none;"<!-- ENDIF -->>
+ <!-- IF not p_mask.S_VIEW -->
+ <div class="permissions-advanced" id="advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" style="display: none;">
+ <!-- ELSE -->
+ <div class="permissions-advanced" id="advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">
+ <!-- ENDIF -->
<div class="permissions-category">
<ul>
diff --git a/phpBB/adm/style/permission_trace.html b/phpBB/adm/style/permission_trace.html
index 7f7079cc8f..186bb28b67 100644
--- a/phpBB/adm/style/permission_trace.html
+++ b/phpBB/adm/style/permission_trace.html
@@ -2,7 +2,7 @@
<div style="background-color: #fff; padding: 10px; margin-top: 10px;" class="permissions">
- <!-- IF U_BACK --><a href="{U_BACK}" style="float: right">&laquo; {L_BACK}</a><!-- ENDIF -->
+ <!-- IF U_BACK --><a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">&laquo; {L_BACK}</a><!-- ENDIF -->
<h3>{L_TRACE_FOR}: {PERMISSION_USERNAME} / <!-- IF FORUM_NAME -->{FORUM_NAME} / <!-- ENDIF -->{PERMISSION} </h3>
@@ -41,6 +41,13 @@
<td>{trace.INFORMATION}</td>
</tr>
<!-- END trace -->
+ <tr class="row2">
+ <td style="white-space: nowrap;"><strong>{L_TRACE_RESULT}</strong></td>
+ <td colspan="2" style="text-align: center;" class="<!-- IF S_RESULT_NEVER -->never<!-- ELSEIF S_RESULT_YES -->yes<!-- ELSE -->no<!-- ENDIF -->">
+ <!-- IF S_RESULT_NEVER -->{L_ACL_NEVER}<!-- ELSEIF S_RESULT_YES -->{L_ACL_YES}<!-- ELSE -->{L_ACL_NO}<!-- ENDIF -->
+ </td>
+ <td>{L_RESULTING_PERMISSION}</td>
+ </tr>
</tbody>
</table>
diff --git a/phpBB/adm/style/simple_footer.html b/phpBB/adm/style/simple_footer.html
index e9e51fc108..f0564cb2cd 100644
--- a/phpBB/adm/style/simple_footer.html
+++ b/phpBB/adm/style/simple_footer.html
@@ -16,7 +16,7 @@
<div id="page-footer">
<!-- IF S_COPYRIGHT_HTML -->
- <br />Powered by phpBB {VERSION} &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
+ <br />Powered by phpBB &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
<!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF -->
<!-- ENDIF -->
diff --git a/phpBB/adm/swatch.php b/phpBB/adm/swatch.php
index 88da54d504..8573b9e530 100644
--- a/phpBB/adm/swatch.php
+++ b/phpBB/adm/swatch.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './../';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
diff --git a/phpBB/cron.php b/phpBB/cron.php
index 99a8b42955..b5a51a1688 100644
--- a/phpBB/cron.php
+++ b/phpBB/cron.php
@@ -12,7 +12,7 @@
*/
define('IN_PHPBB', true);
define('IN_CRON', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
@@ -30,7 +30,35 @@ header('Content-length: 43');
echo base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
-flush();
+// test without flush ;)
+// flush();
+
+// make sure cron doesn't run multiple times in parallel
+if ($config['cron_lock'])
+{
+ // if the other process is running more than an hour already we have to assume it
+ // aborted without cleaning the lock
+ $time = explode(' ', $config['cron_lock']);
+ $time = $time[0];
+
+ if ($time + 3600 >= time())
+ {
+ exit;
+ }
+}
+
+define('CRON_ID', time() . ' ' . unique_id());
+
+$sql = 'UPDATE ' . CONFIG_TABLE . "
+ SET config_value = '" . $db->sql_escape(CRON_ID) . "'
+ WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape($config['cron_lock']) . "'";
+$db->sql_query($sql);
+
+// another cron process altered the table between script start and UPDATE query so exit
+if ($db->sql_affectedrows() != 1)
+{
+ exit;
+}
/**
* Run cron-like action
@@ -226,6 +254,11 @@ else
garbage_collection();
}
+$sql = 'UPDATE ' . CONFIG_TABLE . "
+ SET config_value = '0'
+ WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape(CRON_ID) . "'";
+$db->sql_query($sql);
+
exit;
?> \ No newline at end of file
diff --git a/phpBB/develop/create_schema_files.php b/phpBB/develop/create_schema_files.php
index 1261d4f57e..1675fc0899 100644
--- a/phpBB/develop/create_schema_files.php
+++ b/phpBB/develop/create_schema_files.php
@@ -14,7 +14,7 @@
die("Please read the first lines of this script for instructions on how to enable it");
-set_time_limit(0);
+@set_time_limit(0);
$schema_path = './../install/schemas/';
@@ -1028,7 +1028,7 @@ function get_schema_struct()
'forum_desc_uid' => array('VCHAR:5', ''),
'forum_link' => array('VCHAR_UNI', ''),
'forum_password' => array('VCHAR_UNI:40', ''),
- 'forum_style' => array('TINT:4', 0),
+ 'forum_style' => array('USINT', 0),
'forum_image' => array('VCHAR', ''),
'forum_rules' => array('TEXT_UNI', ''),
'forum_rules_link' => array('VCHAR_UNI', ''),
@@ -1107,9 +1107,9 @@ function get_schema_struct()
'group_desc_uid' => array('VCHAR:5', ''),
'group_display' => array('BOOL', 0),
'group_avatar' => array('VCHAR', ''),
- 'group_avatar_type' => array('TINT:4', 0),
- 'group_avatar_width' => array('TINT:4', 0),
- 'group_avatar_height' => array('TINT:4', 0),
+ 'group_avatar_type' => array('TINT:2', 0),
+ 'group_avatar_width' => array('USINT', 0),
+ 'group_avatar_height' => array('USINT', 0),
'group_rank' => array('UINT', 0),
'group_colour' => array('VCHAR:6', ''),
'group_sig_chars' => array('UINT', 0),
@@ -1556,13 +1556,13 @@ function get_schema_struct()
$schema_data['phpbb_styles'] = array(
'COLUMNS' => array(
- 'style_id' => array('TINT:4', NULL, 'auto_increment'),
+ 'style_id' => array('USINT', NULL, 'auto_increment'),
'style_name' => array('VCHAR_UNI:255', ''),
'style_copyright' => array('VCHAR_UNI', ''),
'style_active' => array('BOOL', 1),
- 'template_id' => array('TINT:4', 0),
- 'theme_id' => array('TINT:4', 0),
- 'imageset_id' => array('TINT:4', 0),
+ 'template_id' => array('USINT', 0),
+ 'theme_id' => array('USINT', 0),
+ 'imageset_id' => array('USINT', 0),
),
'PRIMARY_KEY' => 'style_id',
'KEYS' => array(
@@ -1575,7 +1575,7 @@ function get_schema_struct()
$schema_data['phpbb_styles_template'] = array(
'COLUMNS' => array(
- 'template_id' => array('TINT:4', NULL, 'auto_increment'),
+ 'template_id' => array('USINT', NULL, 'auto_increment'),
'template_name' => array('VCHAR_UNI:255', ''),
'template_copyright' => array('VCHAR_UNI', ''),
'template_path' => array('VCHAR:100', ''),
@@ -1590,7 +1590,7 @@ function get_schema_struct()
$schema_data['phpbb_styles_template_data'] = array(
'COLUMNS' => array(
- 'template_id' => array('TINT:4', NULL, 'auto_increment'),
+ 'template_id' => array('USINT', NULL, 'auto_increment'),
'template_filename' => array('VCHAR:100', ''),
'template_included' => array('TEXT', ''),
'template_mtime' => array('TIMESTAMP', 0),
@@ -1604,7 +1604,7 @@ function get_schema_struct()
$schema_data['phpbb_styles_theme'] = array(
'COLUMNS' => array(
- 'theme_id' => array('TINT:4', NULL, 'auto_increment'),
+ 'theme_id' => array('USINT', NULL, 'auto_increment'),
'theme_name' => array('VCHAR_UNI:255', ''),
'theme_copyright' => array('VCHAR_UNI', ''),
'theme_path' => array('VCHAR:100', ''),
@@ -1620,7 +1620,7 @@ function get_schema_struct()
$schema_data['phpbb_styles_imageset'] = array(
'COLUMNS' => array(
- 'imageset_id' => array('TINT:4', NULL, 'auto_increment'),
+ 'imageset_id' => array('USINT', NULL, 'auto_increment'),
'imageset_name' => array('VCHAR_UNI:255', ''),
'imageset_copyright' => array('VCHAR_UNI', ''),
'imageset_path' => array('VCHAR:100', ''),
@@ -1639,7 +1639,7 @@ function get_schema_struct()
'image_lang' => array('VCHAR:30', ''),
'image_height' => array('USINT', 0),
'image_width' => array('USINT', 0),
- 'imageset_id' => array('TINT:4', 0),
+ 'imageset_id' => array('USINT', 0),
),
'PRIMARY_KEY' => 'image_id',
'KEYS' => array(
@@ -1777,7 +1777,7 @@ function get_schema_struct()
'user_timezone' => array('DECIMAL', 0),
'user_dst' => array('BOOL', 0),
'user_dateformat' => array('VCHAR_UNI:30', 'd M Y H:i'),
- 'user_style' => array('TINT:4', 0),
+ 'user_style' => array('USINT', 0),
'user_rank' => array('UINT', 0),
'user_colour' => array('VCHAR:6', ''),
'user_new_privmsg' => array('TINT:4', 0),
diff --git a/phpBB/develop/generate_utf_confusables.php b/phpBB/develop/generate_utf_confusables.php
new file mode 100644
index 0000000000..908ebbf6f4
--- /dev/null
+++ b/phpBB/develop/generate_utf_confusables.php
@@ -0,0 +1,240 @@
+<?php
+/**
+*
+* @package phpBB3
+* @version $Id$
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+if (php_sapi_name() != 'cli')
+{
+ die("This program must be run from the command line.\n");
+}
+
+//
+// Security message:
+//
+// This script is potentially dangerous.
+// Remove or comment the next line (die(".... ) to enable this script.
+// Do NOT FORGET to either remove this script or disable it after you have used it.
+//
+die("Please read the first lines of this script for instructions on how to enable it");
+
+set_time_limit(0);
+
+define('IN_PHPBB', true);
+$phpbb_root_path = '../';
+$phpEx = substr(strrchr(__FILE__, '.'), 1);
+
+echo "Checking for required files\n";
+download('http://unicode.org/reports/tr39/data/confusables.txt');
+download('http://unicode.org/Public/UNIDATA/CaseFolding.txt');
+echo "\n";
+
+
+/**
+* Load the confusables table
+*/
+echo "Loading confusables\n";
+$unidata = file_get_contents('confusables.txt');
+
+/**
+* Load the CaseFolding table
+*/
+echo "Loading CaseFolding\n";
+$casefolds = file_get_contents('CaseFolding.txt');
+
+
+function utf8_chr($cp)
+{
+ if ($cp > 0xFFFF)
+ {
+ return chr(0xF0 | ($cp >> 18)) . chr(0x80 | (($cp >> 12) & 0x3F)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
+ }
+ else if ($cp > 0x7FF)
+ {
+ return chr(0xE0 | ($cp >> 12)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
+ }
+ else if ($cp > 0x7F)
+ {
+ return chr(0xC0 | ($cp >> 6)) . chr(0x80 | ($cp & 0x3F));
+ }
+ else
+ {
+ return chr($cp);
+ }
+}
+
+preg_match_all('/^([0-9A-F]+) ;\s((?:[0-9A-F]+ )*);.*?$/im', $unidata, $array, PREG_SET_ORDER);
+preg_match_all('/^([0-9A-F]+); ([CFS]); ([0-9A-F]+(?: [0-9A-F]+)*);/im', $casefolds, $casefold_array);
+
+// some that we defined ourselves
+$uniarray = array(
+ "\xC2\xA1" => "\x69", // EXCLAMATION MARK, INVERTED => LATIN SMALL LETTER I
+ "\xC7\x83" => "\x21", // LATIN LETTER RETROFLEX CLICK => EXCLAMATION MARK
+ "\xCE\xB1" => "\x61", // GREEK SMALL LETTER ALPHA => LATIN SMALL LETTER A
+ "\xE1\x9A\x80" => "\x20", // OGHAM SPACE MARK
+
+ "\xC2\xAD" => '', // HYPHEN, SOFT => empty string
+ "\xDB\x9D" => '', // ARABIC END OF AYAH
+ "\xDC\x8F" => '', // SYRIAC ABBREVIATION MARK
+ "\xE1\xA0\x86" => '', // MONGOLIAN TODO SOFT HYPHEN
+ "\xE1\xA0\x8E" => '', // MONGOLIAN VOWEL SEPARATOR
+ "\xE2\x80\x8B" => '', // ZERO WIDTH SPACE
+ "\xE2\x80\x8C" => '', // ZERO WIDTH NON-JOINER
+ "\xE2\x80\x8D" => '', // ZERO WIDTH JOINER
+ "\xE2\x80\xA8" => '', // LINE SEPARATOR
+ "\xE2\x80\xA9" => '', // PARAGRAPH SEPARATOR
+ "\xE2\x81\xA0" => '', // WORD JOINER
+ "\xE2\x81\xA1" => '', // FUNCTION APPLICATION
+ "\xE2\x81\xA2" => '', // INVISIBLE TIMES
+ "\xE2\x81\xA3" => '', // INVISIBLE SEPARATOR
+ "\xE2\x81\xAA" => '', // [CONTROL CHARACTERS]
+ "\xE2\x81\xAB" => '', // [CONTROL CHARACTERS]
+ "\xE2\x81\xAC" => '', // [CONTROL CHARACTERS]
+ "\xE2\x81\xAD" => '', // [CONTROL CHARACTERS]
+ "\xE2\x81\xAE" => '', // [CONTROL CHARACTERS]
+ "\xE2\x81\xAF" => '', // [CONTROL CHARACTERS]
+ "\xEF\xBB\xBF" => '', // ZERO WIDTH NO-BREAK SPACE
+ "\xEF\xBF\xB9" => '', // [CONTROL CHARACTERS]
+ "\xEF\xBF\xBA" => '', // [CONTROL CHARACTERS]
+ "\xEF\xBF\xBB" => '', // [CONTROL CHARACTERS]
+ "\xEF\xBF\xBC" => '', // [CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB3" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB4" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB5" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB6" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB7" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB8" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xB9" => '', // [MUSICAL CONTROL CHARACTERS]
+ "\xF0\x9D\x85\xBA" => '', // [MUSICAL CONTROL CHARACTERS]
+);
+
+$copy = $uniarray;
+
+foreach ($array as $value)
+{
+ $temp_hold = implode(array_map('utf8_chr', array_map('hexdec', explode(' ', trim($value[2])))));
+
+ if (isset($copy[utf8_chr(hexdec((string)$value[1]))]))
+ {
+ $num = '';
+ $string = utf8_chr(hexdec((string)$value[1]));
+ for ($i = 0; $i < strlen($string); $i++)
+ {
+ $num .= '\x' . str_pad(base_convert(ord($string[$i]), 10, 16), 2, '0', STR_PAD_LEFT);
+ }
+ echo $num . "\n";
+ if ($uniarray[$string] != $temp_hold)
+ {
+ echo " --> $string\n";
+ echo " --> " . $temp_hold . "\n";
+ }
+ }
+
+ // do some tests for things that transform into something with the number one
+ if (strpos($temp_hold, utf8_chr(0x0031)) !== false)
+ {
+ // any kind of letter L?
+ if (strpos($value[0], 'LETTER L') !== false || strpos($value[0], 'IOTA') !== false || strpos($value[0], 'SMALL L ') !== false || preg_match('/SMALL LIGATURE [^L]*L /', $value[0]))
+ {
+ // replace all of the mappings that transform some sort of letter l to number one instead to some sort of letter l to latin small letter l
+ $temp_hold = str_replace(utf8_chr(0x0031), utf8_chr(0x006C), $temp_hold);
+ }
+ }
+
+ // uppercased chars that were folded do not exist in this universe,
+ // no amount of normalization could ever "trick" this into not working
+ if (in_array($value[1], $casefold_array[1]))
+ {
+ continue;
+ }
+
+ $uniarray[utf8_chr(hexdec((string)$value[1]))] = $temp_hold;
+}
+
+echo "Writing to confusables.$phpEx\n";
+
+$fp = fopen($phpbb_root_path . 'includes/utf/data/confusables.' . $phpEx, 'wb');
+fwrite($fp, '<?php return ' . my_var_export($uniarray) . ';');
+fclose($fp);
+
+/**
+* Return a parsable string representation of a variable
+*
+* This is function is limited to array/strings/integers
+*
+* @param mixed $var Variable
+* @return string PHP code representing the variable
+*/
+function my_var_export($var)
+{
+ if (is_array($var))
+ {
+ $lines = array();
+
+ foreach ($var as $k => $v)
+ {
+ $lines[] = my_var_export($k) . '=>' . my_var_export($v);
+ }
+
+ return 'array(' . implode(',', $lines) . ')';
+ }
+ else if (is_string($var))
+ {
+ return "'" . str_replace(array('\\', "'"), array('\\\\', "\\'"), $var) . "'";
+ }
+ else
+ {
+ return $var;
+ }
+}
+
+/**
+* Download a file to the develop/ dir
+*
+* @param string $url URL of the file to download
+* @return void
+*/
+function download($url)
+{
+ global $phpbb_root_path;
+
+ if (file_exists($phpbb_root_path . 'develop/' . basename($url)))
+ {
+ return;
+ }
+
+ echo 'Downloading from ', $url, ' ';
+
+ if (!$fpr = fopen($url, 'rb'))
+ {
+ die("Can't download from $url\nPlease download it yourself and put it in the develop/ dir, kthxbai");
+ }
+
+ if (!$fpw = fopen($phpbb_root_path . 'develop/' . basename($url), 'wb'))
+ {
+ die("Can't open develop/" . basename($url) . " for output... please check your permissions or something");
+ }
+
+ $i = 0;
+ $chunk = 32768;
+ $done = '';
+
+ while (!feof($fpr))
+ {
+ $i += fwrite($fpw, fread($fpr, $chunk));
+ echo str_repeat("\x08", strlen($done));
+
+ $done = ($i >> 10) . ' KiB';
+ echo $done;
+ }
+ fclose($fpr);
+ fclose($fpw);
+
+ echo "\n";
+}
+
+?> \ No newline at end of file
diff --git a/phpBB/develop/unicode_testing.php b/phpBB/develop/unicode_testing.php
new file mode 100644
index 0000000000..25a13d1325
--- /dev/null
+++ b/phpBB/develop/unicode_testing.php
@@ -0,0 +1,120 @@
+<?php
+//
+// This file provides some useful functions for debugging the unicode/UTF-8 library
+// It requires utf_tools.php to be loaded
+//
+die("Please read the first lines of this script for instructions on how to enable it");
+
+if (!headers_sent())
+{
+ header('Content-type: text/html; charset=UTF-8');
+}
+
+/**
+ * Converts unicode escape sequences (\u0123) into UTF-8 characters
+ *
+ * @param string A unicode sequence
+ * @return string UTF-8 representation of the given unicode sequence
+ */
+function unicode_to_utf8($string)
+{
+ $utf8 = '';
+ $chars = array();
+ for ($i = 0; $i < strlen($string); $i++)
+ {
+ if (isset($string[$i + 5]) && substr($string, $i, 2) == '\\u' && ctype_xdigit(substr($string, $i + 2, 4)))
+ {
+ $utf8 .= utf8_from_unicode(array(base_convert(substr($string, $i + 2, 4), 16, 10)));
+ $i += 5;
+ }
+ else
+ {
+ $utf8 .= $string[$i];
+ }
+ }
+ return $utf8;
+}
+
+/**
+ * Takes an array of ints representing the Unicode characters and returns
+ * a UTF-8 string.
+ *
+ * @param array $array array of unicode code points representing a string
+ * @return string UTF-8 character string
+ */
+function utf8_from_unicode($array)
+{
+ $str = '';
+ foreach ($array as $value)
+ {
+ $str .= utf8_chr($value);
+ }
+ return $str;
+}
+
+/**
+* Converts a UTF-8 string to unicode code points
+*
+* @param string $text UTF-8 string
+* @return string Unicode code points
+*/
+function utf8_to_unicode($text)
+{
+ return preg_replace_callback(
+ '#[\\xC2-\\xF4][\\x80-\\xBF]?[\\x80-\\xBF]?[\\x80-\\xBF]#',
+ 'utf8_to_unicode_callback',
+ preg_replace_callback(
+ '#[\\x00-\\x7f]#',
+ 'utf8_to_unicode_callback',
+ $text
+ )
+ );
+}
+
+/**
+* Takes a UTF-8 char and replaces it with its unicode escape sequence. Attention, $m is an array
+*
+* @param array $m 0-based numerically indexed array passed by preg_replace_callback()
+* @return string A unicode escape sequence
+*/
+function utf8_to_unicode_callback($m)
+{
+ return '\u' . str_pad(base_convert(utf8_ord($m[0]), 10, 16), 4, '0', STR_PAD_LEFT) . '';
+}
+
+/**
+* A wrapper function for the normalizer which takes care of including the class if required and modifies the passed strings
+* to be in NFKC
+*
+* @param mixed $strings a string or an array of strings to normalize
+* @return mixed the normalized content, preserving array keys if array given.
+*/
+function utf8_normalize_nfkc($strings)
+{
+ if (empty($strings))
+ {
+ return $strings;
+ }
+
+ if (!class_exists('utf_normalizer'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
+ }
+
+ if (!is_array($strings))
+ {
+ utf_normalizer::nfkc($strings);
+ }
+ else if (is_array($strings))
+ {
+ foreach ($strings as $key => $string)
+ {
+ utf_normalizer::nfkc($strings[$key]);
+ }
+ }
+
+ return $strings;
+}
+
+?> \ No newline at end of file
diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html
index 39593090f0..198d21d885 100644
--- a/phpBB/docs/CHANGELOG.html
+++ b/phpBB/docs/CHANGELOG.html
@@ -169,6 +169,7 @@ p a {
<ol class="menu">
<li><a href="#changelog">Changelog</a>
<ol type="i">
+ <li><a href="#v30rc3">Changes since RC-3</a></li>
<li><a href="#v30rc2">Changes since RC-2</a></li>
<li><a href="#v30rc1">Changes since RC-1</a></li>
</ol>
@@ -180,7 +181,126 @@ p a {
<a name="changelog"></a><h1>1. Changelog</h1>
- <a name="v30rc2"></a><b>1.i. Changes since 3.0.RC2</b>
+ <a name="v30rc3"></a><b>1.i. Changes since 3.0.RC3</b>
+ <br /><br />
+ <div class="paragraph">
+
+ <p>These fixes/changes are currently only present within CVS and will appear within the next phpBB3 version.</p>
+
+ <ul class="menu">
+ <li>[Fix] Fixing some subsilver2 and prosilver style issues</li>
+ <li>[Fix] Parse error in MCP ban (Bug #13109)</li>
+ <li>[Fix] Correctly hide online status in the profile (Bug #13059)</li>
+ <li>[Feature] Let the user choose how to update modified files (merging, using new file or using old file) within automatic updater</li>
+ <li>[Fix] An extra \ in an Oracle SQL regex was corrected (Bug #13151)</li>
+ <li>[Fix] Added a missing global to get_file() (Bug #13149)</li>
+ <li>[Fix] Hide autologin box when autologin is disabled (Bug #13093)</li>
+ <li>[Fix] Account for the forum id not being part of the request uri in prosilver (Bug #13121)</li>
+ <li>[Fix] Properly alter PostgreSQL tables</li>
+ <li>[Fix] Properly cache template files that were stored in the database (Bug #12675)</li>
+ <li>[Fix] Do not count the deletion of an unapproved topic as a decrease in normally viewable posts (Bug #13167)</li>
+ <li>[Fix] Allow column_exists() to return true if the column exists but no data is in the table</li>
+ <li>[Fix] Allow setting the smiley order via the select. Also allow to add smileys at the top. (Bug #13199)</li>
+ <li>[Fix] Fix php notice on sending jabber messages (Bug #13201)</li>
+ <li>[Fix] Make the window showing file differences a little wider (Bug #13157)</li>
+ <li>[Fix] Preserve preview style on search form (Bug #13205)</li>
+ <li>[Fix] Place attachment filename in new line in posting editor (Bug #9726)</li>
+ <li>[Fix] Don't allow caching to occur in the update sequence (Bug #13207)</li>
+ <li>[Fix] Enforce the max password length for automatically generated password created by the password sender (Bug #13181)</li>
+ <li>[Fix] Handle phpinfo() when expose_php is false (Bug #12777)</li>
+ <li>[Fix] Allow managing of forum roles without global users (Bug #13249)</li>
+ <li>[Change] Do not run cron script if board is disabled</li>
+ <li>[Fix] Correctly destroy sql cache for some query combinations (Bug #13237)</li>
+ <li>[Fix] Allow link forums being password protected (Bug #12967)</li>
+ <li>[Fix] Allow wrapping topic/post icons in posting editor (Bug #12843)</li>
+ <li>[Fix] Display L_RANK only once in template if rank title and image defined (Bug #13231)</li>
+ <li>[Fix] Make sure selected transfer method exists before calling (Bug #13265)</li>
+ <li>[Fix] Correctly escape language keys in language editor (Bug #13279)</li>
+ <li>[Fix] Correctly hide post/reply buttons if permissions are not given (related to Bug #12809)</li>
+ <li>[Fix] Remove orphan/wrong permission entries for non-existent forums - self-repairing permissions if conversions went &quot;crazy&quot;</li>
+ <li>[Feature] Allow &quot;older&quot; updates applied with the automatic updater. This allows people using it for updating, say, from 3.0.0 to 3.0.1 (with the correct package of course) and then from 3.0.1 to 3.0.2 if the latest version at this time is 3.0.2. These changes take effect beginning with RC4 or people replacing install/install_update.php manually prior doing the updates.</li>
+ <li>[Fix] Present correct error message if user tries to edit already read private message (Bug #13271)</li>
+ <li>[Fix] Also display board disabled notice for admins/mods if board got disabled due to exceeding the load limit (Bug #13267)</li>
+ <li>[Fix] Correctly deliver avatar if readfile function has been disabled (Bug #13309)</li>
+ <li>[Fix] Display php information page with the correct direction (Bug #12557)</li>
+ <li>[Fix] Increased the number of style objects (styles, templates, themes and imagesets) possible from 127 to 65535 for MySQL (Bug #13179)</li>
+ <li>[Fix] Although theoretically impossible in our code, removed the chance of trying to open a file that does not exist (Bug #13327)</li>
+ <li>[Fix] Although theoretically impossible in our code, changed the handling of non-existent language files (Bug #13329, #13331)</li>
+ <li>[Fix] Removed extra ampersand from ACP link (Bug #13315)</li>
+ <li>[Fix] used cleaned up version of given field identification for pre-filling a new custom profile field (Bug #13319)</li>
+ <li>[Fix] Correctly convert 2.0 website profile fields. (Bug #13379)</li>
+ <li>[Fix] Fixed the "Alphanumeric" and "Alphanumeric and spacers" username selection limitations (Bug #13391)</li>
+ <li>[Fix] Make sure filelist() is only returning array types (Bug #13385)</li>
+ <li>[Fix] Correctly mark forums read if using cookie based topic tracking (Bug #13245)</li>
+ <li>[Change] Put custom profile fields into top box and signature into separate box in members profile view (Bug #13357)</li>
+ <li>[Fix] Only show moderator log entries for forums the user is having moderation rights in (Bug #12481)</li>
+ <li>[Feature] Show resulting permission alone in trace window (Bug #10952) - thanks to dark/rain for the proposal</li>
+ <li>[Fix] Fixed bug in realpath replacement letting it actually work again</li>
+ <li>[Change] Try to be a bit more specific regarding global/local permission trace (Bug #11032)</li>
+ <li>[Fix] Fixed some strangeness in password validation due to mb_ereg()</li>
+ <li>[Fix] Subforums of a forum would overwrite the latest post information even if they did not contain the latest post (Bug #11931)</li>
+ <li>[Fix] Use global username display function on several places (Bug #11080, #11098) - patch by HoL</li>
+ <li>[Fix] Several viewonline fixes and feature changes. Also displaying the users browser in viewonline list to let the admin easier spot additional search bots, connected to a_user permission (Bug #11088) - patch and suggestions provided by HoL</li>
+ <li>[Change] u_viewprofile permission also affecting viewonline list now</li>
+ <li>[Fix] Do not display return to search link in prosilver if search is not allowed (Bug #11393)</li>
+ <li>[Fix] Use global url validation for img bbcode tag (Bug #11935)</li>
+ <li>[Fix] Added proper unicode support to style names (Bug #12165)</li>
+ <li>[Fix] Search result extract should not end in the middle of a multibyte character (Bug #11863)</li>
+ <li>[Fix] Missing localisation for an imageset no longer triggers a lot of "imageset refreshed" log messages (Bug #12027)</li>
+ <li>[Fix] Explain that themes which need parsing cannot be stored on the filesystem (Bug #11134)</li>
+ <li>[Fix] Normalize usernames</li>
+ <li>[Change] Improved utf8_clean_string with a more complete list of homographs and NFKC normalization</li>
+ <li>[Fix] Fixed error messages that ACP Database can give (Bug #13463)</li>
+ <li>[Fix] Fixed potential issues with databases that use tables names is uppercase</li>
+ <li>[Fix] Handle forum links/redirects within viewforum if no read permission given (to display login box or error message) (Bug #13467)</li>
+ <li>[Fix] Prevent changing postable forum having subforums to link forum without moving subforums out first</li>
+ <li>[Fix] Do not display version in admin template (Bug #13495)</li>
+ <li>[Fix] Allow manual specification of remote avatar dimensions if getimagesize is disabled (Bug #13531)</li>
+ <li>[Fix] Make viewonline use the session page's added forum parameter (Bug #13597)</li>
+ <li>[Fix] Correcting BBCode FAQ (Bug #11180)</li>
+ <li>[Fix] Make to/bcc line in view private message display consistent with other username displays in prosilver (Bug #11989)</li>
+ <li>[Fix] Send out activation email if admin activation is enabled and user activated through inactive users panel upon registration (Bug #12065)</li>
+ <li>[Change] Re-implemented All Yes/No/Never links in permission panels for easier changing all categories at once</li>
+ <li>[Change] Advanced permission link now &quot;marked&quot; if no role is assigned and custom permissions set. With this an admin can instantly see if the object is not set at all or having custom permissions, something you only saw if advanced permissions were viewed before.</li>
+ <li>[Fix] Change misleading custom BBCodes explanation, regarding tokens and useable template variables (Bug #12403, #5660)</li>
+ <li>[Feature] Ability to disable birthdays completely with new board features setting</li>
+ <li>[Fix] Fix disallowed username check (Bug #13511)</li>
+ <li>[Fix] Allow for unicode usernames to be pruned (Bug #13643)</li>
+ <li>[Fix] Do not copy forum permissions from self (Bug #13663)</li>
+ <li>[Fix] Allow for polls to work during preview (Bug #13657) - thanks to Thatbitextra</li>
+ <li>[Fix] Finer error conditions for sending IM messages (Bugs #13681, #13683)</li>
+ <li>[Fix] Add a confirmation for log deletion in the MCP (Bug #13693)</li>
+ <li>[Fix] Do not erase ranks and avatars when changing default groups (Bugs #13701, #13697)</li>
+ <li>[Fix] Limit author searches to firstpost, if selected (Bug #13579)</li>
+ <li>[Fix] Properly resync user post counts for users that have no posts (Bug #13581)</li>
+ <li>[Fix] Do not require space after , in smiley pak files (Bug #13647)</li>
+ <li>[Fix] Properly display the subscribe link in topic and forum display for Oracle (Bug #13583)</li>
+ <li>[Change] Add version number to ACP index (Bug #13703)</li>
+ <li>[Fix] Several fixes for custom profile fields on multi-lingual boards (Bugs #13763, #13527, #13525, #11515)</li>
+ <li>[Fix] Return to the mode previously selected after disaproving a post (Bug #13796)</li>
+ <li>[Fix] Cron now uses a locking variable to make sure it does not spawn too many webserver processes (Bug #12741)</li>
+ <li>[Fix] Cached stylesheet now supporting gzip compression</li>
+ <li>[Fix] Added link to inbox for deleted PMs (Bug #13813)</li>
+ <li>[Fix] Re-syncing the board stats also refreshes the newest user (Bug #13831)</li>
+ <li>[Feature] Ability to externally set $phpbb_root_path if wrapping phpBB3 by defining constant PHPBB_ROOT_PATH</li>
+ <li>[Fix] Implemented correct left/right floating within ACP in regard to RTL languages (Bug #13777)</li>
+ <li>[Fix] Fixing session problems when using MySQL strict mode in conjunction with very long browser agent string (Bug #13827)</li>
+ <li>[Fix] Disallow post/pm subjects entirely made up from non-printable chars and whitespaces (Bug #13800)</li>
+ <li>[Fix] Allow moving private messages from the sentbox (Bug #13791)</li>
+ <li>[Fix] Properly export localized imagesets</li>
+ <li>[Feature] Show the size of Firebird databases</li>
+ <li>[Fix] Show error when moving topic into a category via quickmod (Bug #11611)</li>
+ <li>[Fix] Allow Oracle to install on a database without specify the database name</li>
+
+ </ul>
+
+ </div>
+ <a href="#top">Top</a>
+ <br /><br />
+
+ <hr />
+
+ <a name="v30rc2"></a><b>1.ii. Changes since 3.0.RC2</b>
<br /><br />
<div class="paragraph">
@@ -192,7 +312,7 @@ p a {
<li>[Fix] Correct approval of posts in global announcements (Bug #12699)</li>
<li>[Sec] Do not allow setup spiders/robots to post, even if permissions are given. We see no reason why this should be possible. (Thanks to Frank Rizzo for convincing us regarding this)</li>
<li>[Sec] Do not display the last active column within the memberlist if u_viewonline permission is not given (Bug #12797)</li>
- <li>[Fix] Display custom profile field &quotdate&quot; based on users language (Bug #12787)</li>
+ <li>[Fix] Display custom profile field &quot;date&quot; based on users language (Bug #12787)</li>
<li>[Fix] Allow adding of help language files within subdirectories (Bug #12783)</li>
<li>[Fix] Correctly apply smileys on posting having # within their emotion code</li>
<li>[Fix] Correctly convert smileys having double quotes within their emotion code (Bug #12731)</li>
@@ -234,7 +354,7 @@ p a {
<hr />
- <a name="v30rc1"></a><b>1.ii. Changes since 3.0.RC1</b>
+ <a name="v30rc1"></a><b>1.iii. Changes since 3.0.RC1</b>
<br /><br />
<div class="paragraph">
diff --git a/phpBB/docs/FAQ.html b/phpBB/docs/FAQ.html
index 5bda802cd4..0ceba33038 100644
--- a/phpBB/docs/FAQ.html
+++ b/phpBB/docs/FAQ.html
@@ -298,7 +298,7 @@ p a {
<div class="paragraph">
-<p>phpBB categorises gallery avatars and it does this by reading through folders contained in the location you specified as being the gallery path. For example, if you set the gallery path to <samp>images/avatars/gallery</samp> phpBB will expect to find a series of folders within that path, eg. <samp>images/avatars/gallery/moviestars</samp>, <samp>images/avatars/gallery/cartoons</samp>, <samp>images/avatars/gallery/misc</samp>, etc. Placing images directly in <samp>images/avatars/gallery/</samp> will result in nothing being listed in your gallery.</p>
+<p>phpBB categorises gallery avatars and it does this by reading through folders contained in the location you specified as being the gallery path. For example, if you set the gallery path to <samp>images/avatars/gallery</samp> phpBB will expect to find a series of folders within that path, e.g. <samp>images/avatars/gallery/moviestars</samp>, <samp>images/avatars/gallery/cartoons</samp>, <samp>images/avatars/gallery/misc</samp>, etc. Placing images directly in <samp>images/avatars/gallery/</samp> will result in nothing being listed in your gallery.</p>
</div>
<a href="#top">Top</a>
@@ -324,7 +324,7 @@ p a {
<p>If you (or your users) are, after attempting a login, being returned to the index (or other page) without appearing to be logged in the most likely problem is incorrect cookie settings. phpBB uses cookies to store a session id and a small amount of user data. For this data to be stored correctly the cookie domain, name, path and secure settings must be correct. You can check this in <code>Admin-&gt;General-&gt;Server Configuration-&gt;Cookie Settings</code>. Typically the cookie domain can be left blank and the cookie path set to <samp>/</samp> (a single forward slash). Do <strong>not</strong> set the cookie as being secure unless your board is running over a secure sockets layer connection, ie. https://</p>
-<p>If you still have problems try setting the cookie domain to your full domain name, eg. <samp>www.mysystem.tld</samp>, <samp>www.something.mydomain.tld</samp>. You <strong>must</strong> ensure the domain name contains at least two dots or browsers will be unlikely to recognise the cookie, eg. <samp>.mydomain.com</samp>, <samp>mydomain.com</samp>. Do <strong>not</strong> add http:// or anything else to the domain name!</p>
+<p>If you still have problems try setting the cookie domain to your full domain name, e.g. <samp>www.mysystem.tld</samp>, <samp>www.something.mydomain.tld</samp>. You <strong>must</strong> ensure the domain name contains at least two dots or browsers will be unlikely to recognise the cookie, e.g. <samp>.mydomain.com</samp>, <samp>mydomain.com</samp>. Do <strong>not</strong> add http:// or anything else to the domain name!</p>
</div>
<a href="#top">Top</a>
diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html
index ff579c1ceb..9f84503ef2 100644
--- a/phpBB/docs/README.html
+++ b/phpBB/docs/README.html
@@ -360,9 +360,9 @@ p a {
<p>If you do post a new bug (i.e. one that isn't already listed in the bug tracker) firstly make sure you have logged in (your username and password are the same as for the community forums) then please include the following details:</p>
<ul class="menu">
- <li>Your server type/version, eg. Apache 1.3.28, IIS 4, Sambar, etc.</li>
- <li>PHP version and mode of operation, eg. PHP 5.1.1 as a module, PHP 4.4.4 running as CGI, etc.</li>
- <li>DB type/version, eg. MySQL 4.0.1, PostgreSQL 7.3.2, MSSQL Server 2000 SP1, etc.</li>
+ <li>Your server type/version, e.g. Apache 1.3.28, IIS 4, Sambar, etc.</li>
+ <li>PHP version and mode of operation, e.g. PHP 5.1.1 as a module, PHP 4.4.4 running as CGI, etc.</li>
+ <li>DB type/version, e.g. MySQL 4.0.1, PostgreSQL 7.3.2, MSSQL Server 2000 SP1, etc.</li>
</ul>
<p>The relevant database type/version is listed within the administration control panel</p>
diff --git a/phpBB/download.php b/phpBB/download.php
index 382c528db9..f02de8055a 100644
--- a/phpBB/download.php
+++ b/phpBB/download.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
if (isset($_GET['avatar']))
@@ -322,7 +322,20 @@ function send_avatar_to_browser($file)
header("Content-Length: $size");
}
- readfile($file_path);
+ if (@readfile($file_path) === false)
+ {
+ $fp = @fopen($file_path, 'rb');
+
+ if ($fp !== false)
+ {
+ while (!feof($fp))
+ {
+ echo fread($fp, 8192);
+ }
+ fclose($fp);
+ }
+ }
+
flush();
}
else
@@ -447,6 +460,10 @@ function send_file_to_browser($attachment, $upload_dir, $category)
}
fclose($fp);
}
+ else
+ {
+ @readfile($filename);
+ }
flush();
exit;
diff --git a/phpBB/faq.php b/phpBB/faq.php
index b74ede66e4..f6d2ff3b8d 100644
--- a/phpBB/faq.php
+++ b/phpBB/faq.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
diff --git a/phpBB/includes/acm/acm_file.php b/phpBB/includes/acm/acm_file.php
index 63eaa341f5..a1734c1c55 100644
--- a/phpBB/includes/acm/acm_file.php
+++ b/phpBB/includes/acm/acm_file.php
@@ -39,7 +39,7 @@ class acm
global $phpEx;
if (file_exists($this->cache_dir . 'data_global.' . $phpEx))
{
- include($this->cache_dir . 'data_global.' . $phpEx);
+ @include($this->cache_dir . 'data_global.' . $phpEx);
}
else
{
@@ -159,7 +159,7 @@ class acm
return false;
}
- include($this->cache_dir . "data{$var_name}.$phpEx");
+ @include($this->cache_dir . "data{$var_name}.$phpEx");
return (isset($data)) ? $data : false;
}
else
@@ -256,7 +256,12 @@ class acm
}
// The following method is more failproof than simply assuming the query is on line 3 (which it should be)
- $check_line = file_get_contents($this->cache_dir . $entry);
+ $check_line = @file_get_contents($this->cache_dir . $entry);
+
+ if (empty($check_line))
+ {
+ continue;
+ }
// Now get the contents between /* and */
$check_line = substr($check_line, strpos($check_line, '/* ') + 3, strpos($check_line, ' */') - strpos($check_line, '/* ') - 3);
@@ -264,7 +269,8 @@ class acm
$found = false;
foreach ($table as $check_table)
{
- if (strpos($check_line, $check_table . ' ') !== false)
+ // Better catch partial table names than no table names. ;)
+ if (strpos($check_line, $check_table) !== false)
{
$found = true;
break;
diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php
index a0aaf8d67e..95a2b0e322 100644
--- a/phpBB/includes/acp/acp_attachments.php
+++ b/phpBB/includes/acp/acp_attachments.php
@@ -441,7 +441,7 @@ class acp_attachments
$ext_row = array();
}
- $group_name = request_var('group_name', '', true);
+ $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
$new_group_name = ($action == 'add') ? $group_name : (($ext_row['group_name'] != $group_name) ? $group_name : '');
if (!$group_name)
@@ -618,7 +618,7 @@ class acp_attachments
if ($action == 'add')
{
$ext_group_row = array(
- 'group_name' => request_var('group_name', '', true),
+ 'group_name' => utf8_normalize_nfc(request_var('group_name', '', true)),
'cat_id' => 0,
'allow_group' => 1,
'allow_in_pm' => 1,
diff --git a/phpBB/includes/acp/acp_ban.php b/phpBB/includes/acp/acp_ban.php
index ea0a054d5f..206f332c36 100644
--- a/phpBB/includes/acp/acp_ban.php
+++ b/phpBB/includes/acp/acp_ban.php
@@ -33,12 +33,12 @@ class acp_ban
if ($bansubmit)
{
// Grab the list of entries
- $ban = request_var('ban', '', true);
+ $ban = utf8_normalize_nfc(request_var('ban', '', true));
$ban_len = request_var('banlength', 0);
$ban_len_other = request_var('banlengthother', '');
$ban_exclude = request_var('banexclude', 0);
- $ban_reason = request_var('banreason', '', true);
- $ban_give_reason = request_var('bangivereason', '', true);
+ $ban_reason = utf8_normalize_nfc(request_var('banreason', '', true));
+ $ban_give_reason = utf8_normalize_nfc(request_var('bangivereason', '', true));
if ($ban)
{
diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php
index 65c1f9026d..ce0d12b356 100644
--- a/phpBB/includes/acp/acp_bbcodes.php
+++ b/phpBB/includes/acp/acp_bbcodes.php
@@ -75,8 +75,8 @@ class acp_bbcodes
$display_on_posting = request_var('display_on_posting', 0);
$bbcode_match = request_var('bbcode_match', '');
- $bbcode_tpl = htmlspecialchars_decode(request_var('bbcode_tpl', '', true));
- $bbcode_helpline = request_var('bbcode_helpline', '', true);
+ $bbcode_tpl = htmlspecialchars_decode(utf8_normalize_nfc(request_var('bbcode_tpl', '', true)));
+ $bbcode_helpline = utf8_normalize_nfc(request_var('bbcode_helpline', '', true));
break;
}
diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php
index c3b6d922b2..463087e106 100644
--- a/phpBB/includes/acp/acp_board.php
+++ b/phpBB/includes/acp/acp_board.php
@@ -73,9 +73,10 @@ class acp_board
'allow_sig' => array('lang' => 'ALLOW_SIG', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'allow_nocensors' => array('lang' => 'ALLOW_NO_CENSORS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_bookmarks' => array('lang' => 'ALLOW_BOOKMARKS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
+ 'allow_birthdays' => array('lang' => 'ALLOW_BIRTHDAYS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend2' => 'ACP_LOAD_SETTINGS',
- 'load_birthdays' => array('lang' => 'YES_BIRTHDAYS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
+ 'load_birthdays' => array('lang' => 'YES_BIRTHDAYS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'load_moderators' => array('lang' => 'YES_MODERATORS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'load_jumpbox' => array('lang' => 'YES_JUMPBOX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'load_cpf_memberlist' => array('lang' => 'LOAD_CPF_MEMBERLIST', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
@@ -250,7 +251,7 @@ class acp_board
'load_online' => array('lang' => 'YES_ONLINE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'load_online_guests' => array('lang' => 'YES_ONLINE_GUESTS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'load_onlinetrack' => array('lang' => 'YES_ONLINE_TRACK', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
- 'load_birthdays' => array('lang' => 'YES_BIRTHDAYS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
+ 'load_birthdays' => array('lang' => 'YES_BIRTHDAYS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'load_moderators' => array('lang' => 'YES_MODERATORS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'load_jumpbox' => array('lang' => 'YES_JUMPBOX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'load_user_activity' => array('lang' => 'LOAD_USER_ACTIVITY', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php
index 5bab27d5b2..dbee5f6eed 100644
--- a/phpBB/includes/acp/acp_bots.php
+++ b/phpBB/includes/acp/acp_bots.php
@@ -129,7 +129,7 @@ class acp_bots
include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
$bot_row = array(
- 'bot_name' => request_var('bot_name', '', true),
+ 'bot_name' => utf8_normalize_nfc(request_var('bot_name', '', true)),
'bot_agent' => request_var('bot_agent', ''),
'bot_ip' => request_var('bot_ip', ''),
'bot_active' => request_var('bot_active', true),
diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
index c967274a36..d8d4b8a306 100644
--- a/phpBB/includes/acp/acp_database.php
+++ b/phpBB/includes/acp/acp_database.php
@@ -48,7 +48,7 @@ class acp_database
if (!sizeof($table))
{
- trigger_error($user->lang['TABLE_SELECT_ERROR'] . adm_back_link($this->u_action));
+ trigger_error($user->lang['TABLE_SELECT_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING);
}
$store = $download = $structure = $schema_data = false;
@@ -165,7 +165,7 @@ class acp_database
$tables = get_tables($db);
foreach ($tables as $table_name)
{
- if (strlen($table_prefix) === 0 || strpos($table_name, $table_prefix) === 0)
+ if (strlen($table_prefix) === 0 || stripos($table_name, $table_prefix) === 0)
{
$template->assign_block_vars('tables', array(
'TABLE' => $table_name
@@ -343,7 +343,7 @@ class acp_database
{
if ($sub === false)
{
- trigger_error($user->lang['RESTORE_FAILURE'] . adm_back_link($this->u_action));
+ trigger_error($user->lang['RESTORE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
pg_put_line($db->db_connect_id, $sub . "\n");
}
diff --git a/phpBB/includes/acp/acp_disallow.php b/phpBB/includes/acp/acp_disallow.php
index c574c8e803..4be61ad778 100644
--- a/phpBB/includes/acp/acp_disallow.php
+++ b/phpBB/includes/acp/acp_disallow.php
@@ -33,7 +33,7 @@ class acp_disallow
if ($disallow)
{
- $disallowed_user = str_replace('*', '%', request_var('disallowed_user', '', true));
+ $disallowed_user = str_replace('*', '%', utf8_normalize_nfc(request_var('disallowed_user', '', true)));
if (!$disallowed_user)
{
diff --git a/phpBB/includes/acp/acp_email.php b/phpBB/includes/acp/acp_email.php
index 3fbbe6472f..50f3d2a4c8 100644
--- a/phpBB/includes/acp/acp_email.php
+++ b/phpBB/includes/acp/acp_email.php
@@ -30,8 +30,8 @@ class acp_email
$usernames = request_var('usernames', '', true);
$group_id = request_var('g', 0);
- $subject = request_var('subject', '', true);
- $message = request_var('message', '', true);
+ $subject = utf8_normalize_nfc(request_var('subject', '', true));
+ $message = utf8_normalize_nfc(request_var('message', '', true));
// Do the job ...
if ($submit)
@@ -178,7 +178,7 @@ class acp_email
if ($usernames)
{
$usernames = explode("\n", $usernames);
- add_log('admin', 'LOG_MASS_EMAIL', implode(', ', $usernames));
+ add_log('admin', 'LOG_MASS_EMAIL', implode(', ', utf8_normalize_nfc($usernames)));
}
else
{
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index ced09a4708..fd2602d329 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -103,14 +103,14 @@ class acp_forums
'type_action' => request_var('type_action', ''),
'forum_status' => request_var('forum_status', ITEM_UNLOCKED),
'forum_parents' => '',
- 'forum_name' => request_var('forum_name', '', true),
+ 'forum_name' => utf8_normalize_nfc(request_var('forum_name', '', true)),
'forum_link' => request_var('forum_link', ''),
'forum_link_track' => request_var('forum_link_track', false),
- 'forum_desc' => request_var('forum_desc', '', true),
+ 'forum_desc' => utf8_normalize_nfc(request_var('forum_desc', '', true)),
'forum_desc_uid' => '',
'forum_desc_options' => 7,
'forum_desc_bitfield' => '',
- 'forum_rules' => request_var('forum_rules', '', true),
+ 'forum_rules' => utf8_normalize_nfc(request_var('forum_rules', '', true)),
'forum_rules_uid' => '',
'forum_rules_options' => 7,
'forum_rules_bitfield' => '',
@@ -163,7 +163,7 @@ class acp_forums
$forum_perm_from = request_var('forum_perm_from', 0);
// Copy permissions?
- if ($forum_perm_from)
+ if ($forum_perm_from && !empty($forum_perm_from) && $forum_perm_from != $forum_data['forum_id'])
{
// if we edit a forum delete current permissions first
if ($action == 'edit')
@@ -445,7 +445,7 @@ class acp_forums
'parent_id' => $this->parent_id,
'forum_type' => FORUM_POST,
'forum_status' => ITEM_UNLOCKED,
- 'forum_name' => request_var('forum_name', '', true),
+ 'forum_name' => utf8_normalize_nfc(request_var('forum_name', '', true)),
'forum_link' => '',
'forum_link_track' => false,
'forum_desc' => '',
@@ -638,7 +638,7 @@ class acp_forums
'S_STATUS_OPTIONS' => $statuslist,
'S_PARENT_OPTIONS' => $parents_list,
'S_STYLES_OPTIONS' => $styles_list,
- 'S_FORUM_OPTIONS' => make_forum_select(($action == 'add') ? $forum_data['parent_id'] : false, false, false, false, false),
+ 'S_FORUM_OPTIONS' => make_forum_select(($action == 'add') ? $forum_data['parent_id'] : false, ($action == 'edit') ? $forum_data['forum_id'] : false, false, false, false),
'S_SHOW_DISPLAY_ON_INDEX' => $s_show_display_on_index,
'S_FORUM_POST' => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
'S_FORUM_ORIG_POST' => (isset($old_forum_type) && $old_forum_type == FORUM_POST) ? true : false,
@@ -991,6 +991,13 @@ class acp_forums
if ($row['forum_type'] == FORUM_POST && $row['forum_type'] != $forum_data_sql['forum_type'])
{
+ // Has subforums and want to change into a link?
+ if ($row['right_id'] - $row['left_id'] > 1 && $forum_data_sql['forum_type'] == FORUM_LINK)
+ {
+ $errors[] = $user->lang['FORUM_WITH_SUBFORUMS_NOT_TO_LINK'];
+ return $errors;
+ }
+
// we're turning a postable forum into a non-postable forum
if ($forum_data_sql['type_action'] == 'move')
{
diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php
index 07088de75d..35499b132f 100644
--- a/phpBB/includes/acp/acp_groups.php
+++ b/phpBB/includes/acp/acp_groups.php
@@ -258,8 +258,8 @@ class acp_groups
// Did we submit?
if ($update)
{
- $group_name = request_var('group_name', '', true);
- $group_desc = request_var('group_desc', '', true);
+ $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
+ $group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
$group_type = request_var('group_type', GROUP_FREE);
$allow_desc_bbcode = request_var('desc_parse_bbcode', false);
@@ -450,7 +450,7 @@ class acp_groups
}
else if (!$group_id)
{
- $group_name = request_var('group_name', '', true);
+ $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
$group_desc_data = array(
'text' => '',
'allow_bbcode' => true,
diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php
index ebf058850f..538a46358d 100644
--- a/phpBB/includes/acp/acp_icons.php
+++ b/phpBB/includes/acp/acp_icons.php
@@ -189,6 +189,7 @@ class acp_icons
$db->sql_freeresult($result);
$order_list = '<option value="1"' . ((!isset($after)) ? ' selected="selected"' : '') . '>' . $user->lang['FIRST'] . '</option>' . $order_list;
+ $add_order_list = '<option value="1">' . $user->lang['FIRST'] . '</option>' . $add_order_list;
if ($action == 'add')
{
@@ -275,16 +276,16 @@ class acp_icons
$image_width = (isset($_POST['width'])) ? request_var('width', array('' => 0)) : array();
$image_height = (isset($_POST['height'])) ? request_var('height', array('' => 0)) : array();
$image_add = (isset($_POST['add_img'])) ? request_var('add_img', array('' => 0)) : array();
- $image_emotion = request_var('emotion', array('' => ''), true);
- $image_code = request_var('code', array('' => ''), true);
+ $image_emotion = utf8_normalize_nfc(request_var('emotion', array('' => ''), true));
+ $image_code = utf8_normalize_nfc(request_var('code', array('' => ''), true));
$image_display_on_posting = (isset($_POST['display_on_posting'])) ? request_var('display_on_posting', array('' => 0)) : array();
// Ok, add the relevant bits if we are adding new codes to existing emoticons...
if (!empty($_POST['add_additional_code']))
{
$add_image = request_var('add_image', '');
- $add_code = request_var('add_code', '', true);
- $add_emotion = request_var('add_emotion', '', true);
+ $add_code = utf8_normalize_nfc(request_var('add_code', '', true));
+ $add_emotion = utf8_normalize_nfc(request_var('add_emotion', '', true));
if ($add_image && $add_emotion && $add_code)
{
@@ -336,7 +337,7 @@ class acp_icons
}
// Image_order holds the 'new' order value
- if (!empty($image_order[$image]) && !empty($$image_id[$image]))
+ if (!empty($image_order[$image]))
{
$img_sql = array_merge($img_sql, array(
$fields . '_order' => $image_order[$image])
@@ -363,19 +364,19 @@ class acp_icons
}
}
- if ($action == 'modify')
+ if ($action == 'modify' && !empty($image_id[$image]))
{
$sql = "UPDATE $table
SET " . $db->sql_build_array('UPDATE', $img_sql) . "
WHERE {$fields}_id = " . $image_id[$image];
$db->sql_query($sql);
}
- else
+ else if ($action !== 'modify')
{
$sql = "INSERT INTO $table " . $db->sql_build_array('INSERT', $img_sql);
$db->sql_query($sql);
}
- }
+ }
}
$cache->destroy('_icons');
@@ -409,7 +410,7 @@ class acp_icons
// Make sure the pak_ary is valid
foreach ($pak_ary as $pak_entry)
{
- if (preg_match_all("#'(.*?)', #", $pak_entry, $data))
+ if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{
if ((sizeof($data[1]) != 4 && $mode == 'icons') ||
(sizeof($data[1]) != 6 && $mode == 'smilies'))
@@ -472,7 +473,7 @@ class acp_icons
foreach ($pak_ary as $pak_entry)
{
$data = array();
- if (preg_match_all("#'(.*?)', #", $pak_entry, $data))
+ if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{
if ((sizeof($data[1]) != 4 && $mode == 'icons') ||
(sizeof($data[1]) != 6 && $mode == 'smilies'))
diff --git a/phpBB/includes/acp/acp_inactive.php b/phpBB/includes/acp/acp_inactive.php
index 450b9fd0de..a3eefdfaba 100755
--- a/phpBB/includes/acp/acp_inactive.php
+++ b/phpBB/includes/acp/acp_inactive.php
@@ -60,7 +60,50 @@ class acp_inactive
if ($action == 'activate')
{
+ if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
+ {
+ // Get those 'being activated'...
+ $sql = 'SELECT user_id, username, user_email, user_lang
+ FROM ' . USERS_TABLE . '
+ WHERE ' . $db->sql_in_set('user_id', $mark) . '
+ AND user_type = ' . USER_INACTIVE;
+ $result = $db->sql_query($sql);
+
+ $inactive_users = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $inactive_users[] = $row;
+ }
+ $db->sql_freeresult($result);
+ }
+
user_active_flip('activate', $mark);
+
+ if ($config['require_activation'] == USER_ACTIVATION_ADMIN && !empty($inactive_users))
+ {
+ include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+
+ $messenger = new messenger();
+
+ foreach ($inactive_users as $row)
+ {
+ $messenger->template('admin_welcome_activated', $row['user_lang']);
+
+ $messenger->to($row['user_email'], $row['username']);
+
+ $messenger->headers('X-AntiAbuse: Board servername - ' . $config['server_name']);
+ $messenger->headers('X-AntiAbuse: User_id - ' . $user->data['user_id']);
+ $messenger->headers('X-AntiAbuse: Username - ' . $user->data['username']);
+
+ $messenger->assign_vars(array(
+ 'USERNAME' => htmlspecialchars_decode($row['username']))
+ );
+
+ $messenger->send(NOTIFY_EMAIL);
+ }
+
+ $messenger->save_queue();
+ }
}
else if ($action == 'delete')
{
diff --git a/phpBB/includes/acp/acp_language.php b/phpBB/includes/acp/acp_language.php
index 03ab523d7c..ff827c5141 100644
--- a/phpBB/includes/acp/acp_language.php
+++ b/phpBB/includes/acp/acp_language.php
@@ -93,6 +93,11 @@ class acp_language
$method = request_var('method', '');
+ if (!class_exists($method))
+ {
+ trigger_error('Method does not exist.', E_USER_ERROR);
+ }
+
$requested_data = call_user_func(array($method, 'data'));
foreach ($requested_data as $data => $default)
{
@@ -141,8 +146,8 @@ class acp_language
$sql_ary = array(
'lang_english_name' => request_var('lang_english_name', $row['lang_english_name']),
- 'lang_local_name' => request_var('lang_local_name', $row['lang_local_name'], true),
- 'lang_author' => request_var('lang_author', $row['lang_author'], true),
+ 'lang_local_name' => utf8_normalize_nfc(request_var('lang_local_name', $row['lang_local_name'], true)),
+ 'lang_author' => utf8_normalize_nfc(request_var('lang_author', $row['lang_author'], true)),
);
$db->sql_query('UPDATE ' . LANG_TABLE . '
@@ -201,7 +206,7 @@ class acp_language
// Get target filename for storage folder
$filename = $this->get_filename($row['lang_iso'], $this->language_directory, $this->language_file, true, true);
- $fp = fopen($phpbb_root_path . $filename, 'wb');
+ $fp = @fopen($phpbb_root_path . $filename, 'wb');
if (!$fp)
{
@@ -271,7 +276,7 @@ class acp_language
header('Content-Type: application/octetstream; name="' . $this->language_file . '"');
header('Content-disposition: attachment; filename=' . $this->language_file);
- $fp = fopen($phpbb_root_path . $filename, 'rb');
+ $fp = @fopen($phpbb_root_path . $filename, 'rb');
while ($buffer = fread($fp, 1024))
{
echo $buffer;
@@ -329,7 +334,10 @@ class acp_language
$transfer->close_session();
// Remove from storage folder
- @unlink($phpbb_root_path . 'store/' . $lang_path . $file);
+ if (file_exists($phpbb_root_path . 'store/' . $lang_path . $file))
+ {
+ @unlink($phpbb_root_path . 'store/' . $lang_path . $file);
+ }
add_log('admin', 'LOG_LANGUAGE_FILE_REPLACED', $file);
@@ -406,7 +414,11 @@ class acp_language
if (isset($_POST['remove_store']))
{
$store_filename = $this->get_filename($lang_iso, $this->language_directory, $this->language_file, true, true);
- @unlink($phpbb_root_path . $store_filename);
+
+ if (file_exists($phpbb_root_path . $store_filename))
+ {
+ @unlink($phpbb_root_path . $store_filename);
+ }
}
include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx);
@@ -788,12 +800,12 @@ class acp_language
if (in_array($image_name, $valid_localized))
{
$sql_ary[] = array(
- 'image_name' => $image_name,
- 'image_filename' => $image_filename,
- 'image_height' => $image_height,
- 'image_width' => $image_width,
- 'imageset_id' => $imageset_row['imageset_id'],
- 'image_lang' => $lang_pack['iso'],
+ 'image_name' => (string) $image_name,
+ 'image_filename' => (string) $image_filename,
+ 'image_height' => (int) $image_height,
+ 'image_width' => (int) $image_width,
+ 'imageset_id' => (int) $imageset_row['imageset_id'],
+ 'image_lang' => (string) $lang_pack['iso'],
);
}
}
@@ -1323,12 +1335,12 @@ $lang = array_merge($lang, array(
if (!is_array($value))
{
- $entry .= "{$tabs}'{$key}'\t=> '" . $this->prepare_lang_entry($value) . "',\n";
+ $entry .= "{$tabs}'" . $this->prepare_lang_entry($key) . "'\t=> '" . $this->prepare_lang_entry($value) . "',\n";
}
else
{
$_tabs = $tabs . "\t";
- $entry .= "\n{$tabs}'{$key}'\t=> array(\n";
+ $entry .= "\n{$tabs}'" . $this->prepare_lang_entry($key) . "'\t=> array(\n";
foreach ($value as $_key => $_value)
{
diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php
index f7205a6b7a..84ea8cdfbd 100644
--- a/phpBB/includes/acp/acp_main.php
+++ b/phpBB/includes/acp/acp_main.php
@@ -18,7 +18,7 @@ class acp_main
function main($id, $mode)
{
global $config, $db, $user, $auth, $template;
- global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
+ global $phpbb_root_path, $phpbb_admin_path, $phpEx;
// Show restore permissions notice
if ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm'))
@@ -151,6 +151,12 @@ class acp_main
$result = $db->sql_query($sql);
set_config('upload_dir_size', (int) $db->sql_fetchfield('stat'), true);
$db->sql_freeresult($result);
+
+ if (!function_exists('update_last_username'))
+ {
+ include($phpbb_root_path . "includes/functions_user.$phpEx");
+ }
+ update_last_username();
add_log('admin', 'LOG_RESYNC_STATS');
break;
@@ -161,15 +167,15 @@ class acp_main
trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
}
- $sql = 'SELECT COUNT(post_id) AS num_posts, poster_id
- FROM ' . POSTS_TABLE . '
- WHERE post_postcount = 1
- GROUP BY poster_id';
+ $sql = 'SELECT COUNT(p.post_id) AS num_posts, u.user_id
+ FROM ' . USERS_TABLE . ' u
+ LEFT JOIN ' . POSTS_TABLE . ' p ON (u.user_id = p.poster_id AND p.post_postcount = 1)
+ GROUP BY u.user_id';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
- $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_posts = {$row['num_posts']} WHERE user_id = {$row['poster_id']}");
+ $db->sql_query('UPDATE ' . USERS_TABLE . " SET user_posts = {$row['num_posts']} WHERE user_id = {$row['user_id']}");
}
$db->sql_freeresult($result);
@@ -245,8 +251,8 @@ class acp_main
foreach ($topic_row as $topic_id)
{
$sql_ary[] = array(
- 'user_id' => $user_id,
- 'topic_id' => $topic_id,
+ 'user_id' => (int) $user_id,
+ 'topic_id' => (int) $topic_id,
'topic_posted' => 1,
);
}
@@ -375,6 +381,7 @@ class acp_main
'S_TOTAL_ORPHAN' => ($total_orphan === false) ? false : true,
'GZIP_COMPRESSION' => ($config['gzip_compress']) ? $user->lang['ON'] : $user->lang['OFF'],
'DATABASE_INFO' => $db->sql_server_info(),
+ 'BOARD_VERSION' => $config['version'],
'U_ACTION' => append_sid("{$phpbb_admin_path}index.$phpEx"),
'U_ADMIN_LOG' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=logs&amp;mode=admin'),
diff --git a/phpBB/includes/acp/acp_modules.php b/phpBB/includes/acp/acp_modules.php
index 8f4b702d72..8077bfa2b4 100644
--- a/phpBB/includes/acp/acp_modules.php
+++ b/phpBB/includes/acp/acp_modules.php
@@ -29,7 +29,7 @@ class acp_modules
function main($id, $mode)
{
- global $db, $user, $auth, $template;
+ global $db, $user, $auth, $template, $module;
global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
// Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant)
@@ -50,6 +50,11 @@ class acp_modules
$user->add_lang('mcp');
}
+ if ($module->p_class != $this->module_class)
+ {
+ $module->add_mod_info($this->module_class);
+ }
+
$this->page_title = strtoupper($this->module_class);
$this->parent_id = request_var('parent_id', 0);
@@ -232,7 +237,7 @@ class acp_modules
'module_enabled' => 0,
'module_display' => 1,
'parent_id' => 0,
- 'module_langname' => request_var('module_langname', '', true),
+ 'module_langname' => utf8_normalize_nfc(request_var('module_langname', '', true)),
'module_mode' => '',
'module_auth' => '',
);
@@ -245,7 +250,7 @@ class acp_modules
$module_data['module_display'] = request_var('module_display', (int) $module_row['module_display']);
$module_data['parent_id'] = request_var('module_parent_id', (int) $module_row['parent_id']);
$module_data['module_class'] = $this->module_class;
- $module_data['module_langname'] = request_var('module_langname', (string) $module_row['module_langname'], true);
+ $module_data['module_langname'] = utf8_normalize_nfc(request_var('module_langname', (string) $module_row['module_langname'], true));
$module_data['module_mode'] = request_var('module_mode', (string) $module_row['module_mode']);
$submit = (isset($_POST['submit'])) ? true : false;
@@ -740,7 +745,7 @@ class acp_modules
$sql = 'SELECT left_id, right_id
FROM ' . MODULES_TABLE . "
WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
- AND module_id = {$module_data['parent_id']}";
+ AND module_id = " . (int) $module_data['parent_id'];
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
@@ -823,7 +828,7 @@ class acp_modules
$sql = 'UPDATE ' . MODULES_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $update_ary) . "
WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
- AND module_id = {$module_data['module_id']}";
+ AND module_id = " . (int) $module_data['module_id'];
$db->sql_query($sql);
if (!$run_inline)
@@ -856,15 +861,15 @@ class acp_modules
$sql = 'UPDATE ' . MODULES_TABLE . "
SET right_id = right_id - $diff
WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
- AND left_id < " . $from_data['right_id'] . "
- AND right_id > " . $from_data['right_id'];
+ AND left_id < " . (int) $from_data['right_id'] . '
+ AND right_id > ' . (int) $from_data['right_id'];
$db->sql_query($sql);
// Resync righthand side of tree
$sql = 'UPDATE ' . MODULES_TABLE . "
SET left_id = left_id - $diff, right_id = right_id - $diff
WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
- AND left_id > " . $from_data['right_id'];
+ AND left_id > " . (int) $from_data['right_id'];
$db->sql_query($sql);
if ($to_parent_id > 0)
@@ -875,7 +880,7 @@ class acp_modules
$sql = 'UPDATE ' . MODULES_TABLE . "
SET right_id = right_id + $diff
WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
- AND " . $to_data['right_id'] . ' BETWEEN left_id AND right_id
+ AND " . (int) $to_data['right_id'] . ' BETWEEN left_id AND right_id
AND ' . $db->sql_in_set('module_id', $moved_ids, true);
$db->sql_query($sql);
@@ -883,7 +888,7 @@ class acp_modules
$sql = 'UPDATE ' . MODULES_TABLE . "
SET left_id = left_id + $diff, right_id = right_id + $diff
WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
- AND left_id > " . $to_data['right_id'] . '
+ AND left_id > " . (int) $to_data['right_id'] . '
AND ' . $db->sql_in_set('module_id', $moved_ids, true);
$db->sql_query($sql);
@@ -908,7 +913,7 @@ class acp_modules
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- $diff = '+ ' . ($row['right_id'] - $from_data['left_id'] + 1);
+ $diff = '+ ' . (int) ($row['right_id'] - $from_data['left_id'] + 1);
}
$sql = 'UPDATE ' . MODULES_TABLE . "
@@ -941,6 +946,9 @@ class acp_modules
AND module_id = $module_id";
$db->sql_query($sql);
+ $row['right_id'] = (int) $row['right_id'];
+ $row['left_id'] = (int) $row['left_id'];
+
// Resync tree
$sql = 'UPDATE ' . MODULES_TABLE . "
SET right_id = right_id - $diff
@@ -976,8 +984,8 @@ class acp_modules
$sql = 'SELECT module_id, left_id, right_id, module_langname
FROM ' . MODULES_TABLE . "
WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
- AND parent_id = {$module_row['parent_id']}
- AND " . (($action == 'move_up') ? "right_id < {$module_row['right_id']} ORDER BY right_id DESC" : "left_id > {$module_row['left_id']} ORDER BY left_id ASC");
+ AND parent_id = " . (int) $module_row['parent_id'] . '
+ AND ' . (($action == 'move_up') ? 'right_id < ' . (int) $module_row['right_id'] . ' ORDER BY right_id DESC' : 'left_id > ' . (int) $module_row['left_id'] . ' ORDER BY left_id ASC');
$result = $db->sql_query_limit($sql, $steps);
$target = array();
@@ -1002,25 +1010,25 @@ class acp_modules
*/
if ($action == 'move_up')
{
- $left_id = $target['left_id'];
- $right_id = $module_row['right_id'];
+ $left_id = (int) $target['left_id'];
+ $right_id = (int) $module_row['right_id'];
- $diff_up = $module_row['left_id'] - $target['left_id'];
- $diff_down = $module_row['right_id'] + 1 - $module_row['left_id'];
+ $diff_up = (int) ($module_row['left_id'] - $target['left_id']);
+ $diff_down = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
- $move_up_left = $module_row['left_id'];
- $move_up_right = $module_row['right_id'];
+ $move_up_left = (int) $module_row['left_id'];
+ $move_up_right = (int) $module_row['right_id'];
}
else
{
- $left_id = $module_row['left_id'];
- $right_id = $target['right_id'];
+ $left_id = (int) $module_row['left_id'];
+ $right_id = (int) $target['right_id'];
- $diff_up = $module_row['right_id'] + 1 - $module_row['left_id'];
- $diff_down = $target['right_id'] - $module_row['right_id'];
+ $diff_up = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
+ $diff_down = (int) ($target['right_id'] - $module_row['right_id']);
- $move_up_left = $module_row['right_id'] + 1;
- $move_up_right = $target['right_id'];
+ $move_up_left = (int) ($module_row['right_id'] + 1);
+ $move_up_right = (int) $target['right_id'];
}
// Now do the dirty job
diff --git a/phpBB/includes/acp/acp_permission_roles.php b/phpBB/includes/acp/acp_permission_roles.php
index 674468a862..57fd4c1ea5 100644
--- a/phpBB/includes/acp/acp_permission_roles.php
+++ b/phpBB/includes/acp/acp_permission_roles.php
@@ -134,8 +134,8 @@ class acp_permission_roles
case 'add':
- $role_name = request_var('role_name', '', true);
- $role_description = request_var('role_description', '', true);
+ $role_name = utf8_normalize_nfc(request_var('role_name', '', true));
+ $role_description = utf8_normalize_nfc(request_var('role_description', '', true));
$auth_settings = request_var('setting', array('' => 0));
if (!$role_name)
@@ -214,8 +214,8 @@ class acp_permission_roles
$options_from = request_var('options_from', 0);
$role_row = array(
- 'role_name' => request_var('role_name', '', true),
- 'role_description' => request_var('role_description', '', true),
+ 'role_name' => utf8_normalize_nfc(request_var('role_name', '', true)),
+ 'role_description' => utf8_normalize_nfc(request_var('role_description', '', true)),
'role_type' => $permission_type,
);
diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php
index 3a7318231b..008e5f5494 100644
--- a/phpBB/includes/acp/acp_permissions.php
+++ b/phpBB/includes/acp/acp_permissions.php
@@ -448,7 +448,7 @@ class acp_permissions
}
$template->assign_vars(array(
- 'S_PERMISSION_DROPDOWN' => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type) : false,
+ 'S_PERMISSION_DROPDOWN' => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
'L_PERMISSION_TYPE' => $user->lang['ACL_TYPE_' . strtoupper($permission_type)],
'U_ACTION' => $this->u_action,
@@ -522,7 +522,7 @@ class acp_permissions
/**
* Build dropdown field for changing permission types
*/
- function build_permission_dropdown($options, $default_option)
+ function build_permission_dropdown($options, $default_option, $permission_scope)
{
global $user, $auth;
@@ -533,8 +533,10 @@ class acp_permissions
{
continue;
}
+
$selected = ($setting == $default_option) ? ' selected="selected"' : '';
- $s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $user->lang['permission_type'][$setting] . '</option>';
+ $l_setting = (isset($user->lang['permission_type'][$permission_scope][$setting])) ? $user->lang['permission_type'][$permission_scope][$setting] : $user->lang['permission_type'][$setting];
+ $s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $l_setting . '</option>';
}
return $s_dropdown_options;
@@ -899,7 +901,10 @@ class acp_permissions
'PERMISSION' => $user->lang['acl_' . $permission]['lang'],
'PERMISSION_USERNAME' => $userdata['username'],
'FORUM_NAME' => $forum_name,
- 'U_BACK' => ($back) ? build_url(array('f', 'back')) . "&amp;f=$back" : '')
+
+ 'S_GLOBAL_TRACE' => ($forum_id) ? false : true,
+
+ 'U_BACK' => ($back) ? build_url(array('f', 'back')) . "&amp;f=$back" : '')
);
$template->assign_block_vars('trace', array(
@@ -929,6 +934,8 @@ class acp_permissions
$db->sql_freeresult($result);
$total = ACL_NO;
+ $add_key = (($forum_id) ? '_LOCAL' : '');
+
if (sizeof($groups))
{
// Get group auth settings
@@ -945,16 +952,16 @@ class acp_permissions
switch ($row['auth_setting'])
{
case ACL_NO:
- $information = $user->lang['TRACE_GROUP_NO'];
+ $information = $user->lang['TRACE_GROUP_NO' . $add_key];
break;
case ACL_YES:
- $information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_YES_TOTAL_YES'] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_YES_TOTAL_NEVER'] : $user->lang['TRACE_GROUP_YES_TOTAL_NO']);
+ $information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_YES_TOTAL_NO' . $add_key]);
$total = ($total == ACL_NO) ? ACL_YES : $total;
break;
case ACL_NEVER:
- $information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_YES'] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_NEVER'] : $user->lang['TRACE_GROUP_NEVER_TOTAL_NO']);
+ $information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_NEVER_TOTAL_NO' . $add_key]);
$total = ACL_NEVER;
break;
}
@@ -973,24 +980,24 @@ class acp_permissions
}
}
- // Get user specific permission...
+ // Get user specific permission... globally or for this forum
$hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
$auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
switch ($auth_setting)
{
case ACL_NO:
- $information = ($total == ACL_NO) ? $user->lang['TRACE_USER_NO_TOTAL_NO'] : $user->lang['TRACE_USER_KEPT'];
+ $information = ($total == ACL_NO) ? $user->lang['TRACE_USER_NO_TOTAL_NO' . $add_key] : $user->lang['TRACE_USER_KEPT' . $add_key];
$total = ($total == ACL_NO) ? ACL_NEVER : $total;
break;
case ACL_YES:
- $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_YES_TOTAL_YES'] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_YES_TOTAL_NEVER'] : $user->lang['TRACE_USER_YES_TOTAL_NO']);
+ $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_YES_TOTAL_NO' . $add_key]);
$total = ($total == ACL_NO) ? ACL_YES : $total;
break;
case ACL_NEVER:
- $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_NEVER_TOTAL_YES'] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_NEVER_TOTAL_NEVER'] : $user->lang['TRACE_USER_NEVER_TOTAL_NO']);
+ $information = ($total == ACL_YES) ? $user->lang['TRACE_USER_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_NEVER_TOTAL_NO' . $add_key]);
$total = ACL_NEVER;
break;
}
@@ -1007,8 +1014,7 @@ class acp_permissions
'S_TOTAL_NEVER' => ($total == ACL_NEVER) ? true : false)
);
- // global permission might overwrite local permission
- if (($forum_id != 0) && isset($auth->acl_options['global'][$permission]))
+ if ($forum_id != 0 && isset($auth->acl_options['global'][$permission]))
{
if ($user_id != $user->data['user_id'])
{
@@ -1031,17 +1037,21 @@ class acp_permissions
$information = $user->lang['TRACE_USER_GLOBAL_NEVER_TOTAL_KEPT'];
}
- $template->assign_block_vars('trace', array(
- 'WHO' => sprintf($user->lang['TRACE_GLOBAL_SETTING'], $userdata['username']),
- 'INFORMATION' => sprintf($information, '<a href="' . $this->u_action . "&amp;u=$user_id&amp;f=0&amp;auth=$permission&amp;back=$forum_id\">", '</a>'),
+ // If there is no auth information we do not need to worry the user by showing non-relevant data.
+ if ($auth_setting)
+ {
+ $template->assign_block_vars('trace', array(
+ 'WHO' => sprintf($user->lang['TRACE_GLOBAL_SETTING'], $userdata['username']),
+ 'INFORMATION' => sprintf($information, '<a href="' . $this->u_action . "&amp;u=$user_id&amp;f=0&amp;auth=$permission&amp;back=$forum_id\">", '</a>'),
- 'S_SETTING_NO' => false,
- 'S_SETTING_YES' => $auth_setting,
- 'S_SETTING_NEVER' => !$auth_setting,
- 'S_TOTAL_NO' => false,
- 'S_TOTAL_YES' => ($total == ACL_YES) ? true : false,
- 'S_TOTAL_NEVER' => ($total == ACL_NEVER) ? true : false)
- );
+ 'S_SETTING_NO' => false,
+ 'S_SETTING_YES' => $auth_setting,
+ 'S_SETTING_NEVER' => !$auth_setting,
+ 'S_TOTAL_NO' => false,
+ 'S_TOTAL_YES' => ($total == ACL_YES) ? true : false,
+ 'S_TOTAL_NEVER' => ($total == ACL_NEVER) ? true : false)
+ );
+ }
}
// Take founder status into account, overwriting the default values
@@ -1058,7 +1068,16 @@ class acp_permissions
'S_TOTAL_YES' => true,
'S_TOTAL_NEVER' => false)
);
+
+ $total = ACL_YES;
}
+
+ // Total value...
+ $template->assign_vars(array(
+ 'S_RESULT_NO' => ($total == ACL_NO) ? true : false,
+ 'S_RESULT_YES' => ($total == ACL_YES) ? true : false,
+ 'S_RESULT_NEVER' => ($total == ACL_NEVER) ? true : false,
+ ));
}
/**
diff --git a/phpBB/includes/acp/acp_php_info.php b/phpBB/includes/acp/acp_php_info.php
index d18d64b076..3b4873bdc8 100644
--- a/phpBB/includes/acp/acp_php_info.php
+++ b/phpBB/includes/acp/acp_php_info.php
@@ -45,7 +45,16 @@ class acp_php_info
}
$output = $output[1][0];
- $output = preg_replace('#<tr class="v"><td>(.*?<a[^>]*><img[^>]*></a>)(.*?)</td></tr>#s', '<tr class="row1"><td><table class="type2"><tr><td>\2</td><td>\1</td></tr></table></td></tr>', $output);
+
+ // expose_php can make the image not exist
+ if (preg_match('#<a[^>]*><img[^>]*></a>#', $output))
+ {
+ $output = preg_replace('#<tr class="v"><td>(.*?<a[^>]*><img[^>]*></a>)(.*?)</td></tr>#s', '<tr class="row1"><td><table class="type2"><tr><td>\2</td><td>\1</td></tr></table></td></tr>', $output);
+ }
+ else
+ {
+ $output = preg_replace('#<tr class="v"><td>(.*?)</td></tr>#s', '<tr class="row1"><td><table class="type2"><tr><td>\1</td></tr></table></td></tr>', $output);
+ }
$output = preg_replace('#<table[^>]+>#i', '<table>', $output);
$output = preg_replace('#<img border="0"#i', '<img', $output);
$output = str_replace(array('class="e"', 'class="v"', 'class="h"', '<hr />', '<font', '</font>'), array('class="row1"', 'class="row2"', '', '', '<span', '</span>'), $output);
diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php
index 1041acc962..9ff2db9704 100644
--- a/phpBB/includes/acp/acp_profile.php
+++ b/phpBB/includes/acp/acp_profile.php
@@ -349,12 +349,12 @@ class acp_profile
}
$field_row = array_merge($default_values[$field_type], array(
- 'field_ident' => request_var('field_ident', ''),
+ 'field_ident' => utf8_clean_string(request_var('field_ident', '', true)),
'field_required' => 0,
'field_hide' => 0,
'field_no_view' => 0,
'field_show_on_reg' => 0,
- 'lang_name' => '',
+ 'lang_name' => utf8_normalize_nfc(request_var('field_ident', '', true)),
'lang_explain' => '',
'lang_default_value'=> '')
);
@@ -381,10 +381,10 @@ class acp_profile
$exclude[1][] = 'lang_options';
}
- $cp->vars['field_ident'] = request_var('field_ident', $field_row['field_ident']);
- $cp->vars['lang_name'] = request_var('lang_name', $field_row['lang_name'], true);
- $cp->vars['lang_explain'] = request_var('lang_explain', $field_row['lang_explain'], true);
- $cp->vars['lang_default_value'] = request_var('lang_default_value', $field_row['lang_default_value'], true);
+ $cp->vars['field_ident'] = ($action == 'create' && $step == 1) ? utf8_clean_string(request_var('field_ident', $field_row['field_ident'], true)) : request_var('field_ident', $field_row['field_ident']);
+ $cp->vars['lang_name'] = utf8_normalize_nfc(request_var('lang_name', $field_row['lang_name'], true));
+ $cp->vars['lang_explain'] = utf8_normalize_nfc(request_var('lang_explain', $field_row['lang_explain'], true));
+ $cp->vars['lang_default_value'] = utf8_normalize_nfc(request_var('lang_default_value', $field_row['lang_default_value'], true));
// Field option...
if (isset($_REQUEST['field_option']))
@@ -409,11 +409,11 @@ class acp_profile
// A boolean field expects an array as the lang options
if ($field_type == FIELD_BOOL)
{
- $options = request_var('lang_options', array(''), true);
+ $options = utf8_normalize_nfc(request_var('lang_options', array(''), true));
}
else
{
- $options = request_var('lang_options', '', true);
+ $options = utf8_normalize_nfc(request_var('lang_options', '', true));
}
// If the user has submitted a form with options (i.e. dropdown field)
@@ -441,13 +441,13 @@ class acp_profile
// step 2
foreach ($exclude[2] as $key)
{
- $var = request_var($key, $field_row[$key], true);
+ $var = utf8_normalize_nfc(request_var($key, $field_row[$key], true));
// Manipulate the intended variables a little bit if needed
if ($field_type == FIELD_DROPDOWN && $key == 'field_maxlen')
{
// Get the number of options if this key is 'field_maxlen'
- $var = sizeof(explode("\n", request_var('lang_options', '', true)));
+ $var = sizeof(explode("\n", utf8_normalize_nfc(request_var('lang_options', '', true))));
}
else if ($field_type == FIELD_TEXT && $key == 'field_length')
{
@@ -491,6 +491,11 @@ class acp_profile
list($cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']) = explode('-', $var);
}
}
+ }
+ else if ($field_type == FIELD_BOOL && $key == 'field_default_value')
+ {
+ // Get the number of options if this key is 'field_maxlen'
+ $var = request_var('field_default_value', 0);
}
$cp->vars[$key] = $var;
@@ -534,7 +539,7 @@ class acp_profile
foreach ($exclude[3] as $key)
{
- $cp->vars[$key] = request_var($key, array(0 => ''), true);
+ $cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => ''), true));
if (!$cp->vars[$key] && $action == 'edit')
{
@@ -542,7 +547,7 @@ class acp_profile
}
else if ($key == 'l_lang_options' && $field_type == FIELD_BOOL)
{
- $cp->vars[$key] = request_var($key, array(0 => array('')), true);
+ $cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => array('')), true));
}
else if ($key == 'l_lang_options' && is_array($cp->vars[$key]))
{
@@ -631,10 +636,25 @@ class acp_profile
$cp->vars['columns'] = request_var('columns', 0);
$_new_key_ary[$key] = $cp->vars['rows'] . '|' . $cp->vars['columns'];
}
- if ($field_type == FIELD_BOOL && $key == 'l_lang_options' && isset($_REQUEST['l_lang_options']))
+ else if ($field_type == FIELD_DATE && $key == 'field_default_value')
{
- $_new_key_ary[$key] = request_var($key, array(array('')), true);
+ $always_now = request_var('always_now', 0);
+ if ($always_now)
+ {
+ $_new_key_ary[$key] = 'now';
+ }
+ else if (isset($_REQUEST['field_default_value_day']))
+ {
+ $cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);
+ $cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);
+ $cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0);
+ $_new_key_ary[$key] = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']);
+ }
+ }
+ else if ($field_type == FIELD_BOOL && $key == 'l_lang_options' && isset($_REQUEST['l_lang_options']))
+ {
+ $_new_key_ary[$key] = utf8_normalize_nfc(request_var($key, array(array('')), true));
}
else
{
@@ -644,7 +664,7 @@ class acp_profile
}
else
{
- $_new_key_ary[$key] = (is_array($_REQUEST[$key])) ? request_var($key, array(''), true) : request_var($key, '', true);
+ $_new_key_ary[$key] = (is_array($_REQUEST[$key])) ? utf8_normalize_nfc(request_var($key, array(''), true)) : utf8_normalize_nfc(request_var($key, '', true));
}
}
}
@@ -744,7 +764,7 @@ class acp_profile
$template->assign_vars(array(
'S_STEP_TWO' => true,
- 'L_NEXT' => (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
+ 'L_NEXT_STEP' => (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
);
// Build options based on profile type
@@ -915,11 +935,10 @@ class acp_profile
$lang_options[$lang_id]['lang_iso'] = $lang_iso;
foreach ($options as $field => $field_type)
{
- $value = ($action == 'create') ? request_var('l_' . $field, array(0 => ''), true) : $cp->vars['l_' . $field];
-
+ $value = ($action == 'create') ? utf8_normalize_nfc(request_var('l_' . $field, array(0 => ''), true)) : $cp->vars['l_' . $field];
if ($field == 'lang_options')
{
- $var = ($action == 'create' || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['lang_options'][$lang_id];
+ $var = (!isset($cp->vars['l_lang_options'][$lang_id]) || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['l_lang_options'][$lang_id];
switch ($field_type)
{
@@ -934,10 +953,10 @@ class acp_profile
break;
case 'optionfield':
-
+ $value = ((isset($value[$lang_id])) ? ((is_array($value[$lang_id])) ? implode("\n", $value[$lang_id]) : $value[$lang_id]) : implode("\n", $var));
$lang_options[$lang_id]['fields'][$field] = array(
'TITLE' => $user->lang['CP_' . strtoupper($field)],
- 'FIELD' => '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="7" cols="80">' . ((isset($value[$lang_id])) ? implode("\n", $value[$lang_id]) : implode("\n", $var)) . '</textarea></dd>'
+ 'FIELD' => '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="7" cols="80">' . $value . '</textarea></dd>'
);
break;
}
@@ -1087,17 +1106,23 @@ class acp_profile
}
// These are always arrays because the key is the language id...
- $cp->vars['l_lang_name'] = request_var('l_lang_name', array(0 => ''), true);
- $cp->vars['l_lang_explain'] = request_var('l_lang_explain', array(0 => ''), true);
- $cp->vars['l_lang_default_value'] = request_var('l_lang_default_value', array(0 => ''), true);
+ $cp->vars['l_lang_name'] = utf8_normalize_nfc(request_var('l_lang_name', array(0 => ''), true));
+ $cp->vars['l_lang_explain'] = utf8_normalize_nfc(request_var('l_lang_explain', array(0 => ''), true));
+ $cp->vars['l_lang_default_value'] = utf8_normalize_nfc(request_var('l_lang_default_value', array(0 => ''), true));
+
if ($field_type != FIELD_BOOL)
{
- $cp->vars['l_lang_options'] = request_var('l_lang_options', array(0 => ''), true);
+ $cp->vars['l_lang_options'] = utf8_normalize_nfc(request_var('l_lang_options', array(0 => ''), true));
}
else
{
+ /**
+ * @todo check if this line is correct...
$cp->vars['l_lang_default_value'] = request_var('l_lang_default_value', array(0 => array('')), true);
+ */
+ $cp->vars['l_lang_options'] = utf8_normalize_nfc(request_var('l_lang_options', array(0 => array('')), true));
}
+
if ($cp->vars['lang_options'])
{
if (!is_array($cp->vars['lang_options']))
diff --git a/phpBB/includes/acp/acp_prune.php b/phpBB/includes/acp/acp_prune.php
index 14885394e6..34f43e2426 100644
--- a/phpBB/includes/acp/acp_prune.php
+++ b/phpBB/includes/acp/acp_prune.php
@@ -307,7 +307,7 @@ class acp_prune
'mode' => $mode,
'prune' => 1,
- 'users' => request_var('users', ''),
+ 'users' => request_var('users', '', true),
'username' => request_var('username', '', true),
'email' => request_var('email', ''),
'joined_select' => request_var('joined_select', ''),
diff --git a/phpBB/includes/acp/acp_ranks.php b/phpBB/includes/acp/acp_ranks.php
index e0f6aa9a0b..950a645487 100644
--- a/phpBB/includes/acp/acp_ranks.php
+++ b/phpBB/includes/acp/acp_ranks.php
@@ -35,7 +35,7 @@ class acp_ranks
{
case 'save':
- $rank_title = request_var('title', '', true);
+ $rank_title = utf8_normalize_nfc(request_var('title', '', true));
$special_rank = request_var('special_rank', 0);
$min_posts = ($special_rank) ? 0 : request_var('min_posts', 0);
$rank_image = request_var('rank_image', '');
@@ -143,11 +143,12 @@ class acp_ranks
$db->sql_freeresult($result);
$imglist = filelist($phpbb_root_path . $config['ranks_path'], '');
-
$edit_img = $filename_list = '';
foreach ($imglist as $path => $img_ary)
{
+ sort($img_ary);
+
foreach ($img_ary as $img)
{
$img = $path . $img;
@@ -202,7 +203,7 @@ class acp_ranks
$sql = 'SELECT *
FROM ' . RANKS_TABLE . '
- ORDER BY rank_min ASC, rank_special ASC, rank_title ASC';
+ ORDER BY rank_special DESC, rank_min ASC, rank_title ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
diff --git a/phpBB/includes/acp/acp_reasons.php b/phpBB/includes/acp/acp_reasons.php
index 4fe76c7bbb..ca9fbcb806 100644
--- a/phpBB/includes/acp/acp_reasons.php
+++ b/phpBB/includes/acp/acp_reasons.php
@@ -38,8 +38,8 @@ class acp_reasons
case 'edit':
$reason_row = array(
- 'reason_title' => request_var('reason_title', '', true),
- 'reason_description' => request_var('reason_description', '', true)
+ 'reason_title' => utf8_normalize_nfc(request_var('reason_title', '', true)),
+ 'reason_description' => utf8_normalize_nfc(request_var('reason_description', '', true)),
);
if ($submit)
diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php
index db5bca1ba6..45e0ed35d1 100644
--- a/phpBB/includes/acp/acp_styles.php
+++ b/phpBB/includes/acp/acp_styles.php
@@ -412,11 +412,11 @@ parse_css_file = {PARSE_CSS_FILE}
if (in_array($image_name, $imageset_definitions))
{
$sql_ary[] = array(
- 'image_name' => $image_name,
- 'image_filename' => $image_filename,
+ 'image_name' => (string) $image_name,
+ 'image_filename' => (string) $image_filename,
'image_height' => (int) $image_height,
'image_width' => (int) $image_width,
- 'imageset_id' => $style_id,
+ 'imageset_id' => (int) $style_id,
'image_lang' => '',
);
}
@@ -458,12 +458,12 @@ parse_css_file = {PARSE_CSS_FILE}
if (in_array($image_name, $imageset_definitions))
{
$sql_ary[] = array(
- 'image_name' => $image_name,
- 'image_filename' => $image_filename,
- 'image_height' => $image_height,
- 'image_width' => $image_width,
- 'imageset_id' => $style_id,
- 'image_lang' => $row['lang_dir'],
+ 'image_name' => (string) $image_name,
+ 'image_filename' => (string) $image_filename,
+ 'image_height' => (int) $image_height,
+ 'image_width' => (int) $image_width,
+ 'imageset_id' => (int) $style_id,
+ 'image_lang' => (string) $row['lang_dir'],
);
}
}
@@ -670,7 +670,7 @@ parse_css_file = {PARSE_CSS_FILE}
$_POST['template_data'] = (isset($_POST['template_data']) && !empty($_POST['template_data'])) ? str_replace(array("\r\n", "\r"), array("\n", "\n"), $_POST['template_data']) : '';
$template_data = (STRIP) ? stripslashes($_POST['template_data']) : $_POST['template_data'];
- $template_file = request_var('template_file', '', true);
+ $template_file = utf8_normalize_nfc(request_var('template_file', '', true));
$text_rows = max(5, min(999, request_var('text_rows', 20)));
$save_changes = (isset($_POST['save'])) ? true : false;
@@ -700,7 +700,7 @@ parse_css_file = {PARSE_CSS_FILE}
// If the template is stored on the filesystem try to write the file else store it in the database
if (!$safe_mode && !$template_info['template_storedb'] && file_exists($file) && @is_writable($file))
{
- if (!($fp = fopen($file, 'wb')))
+ if (!($fp = @fopen($file, 'wb')))
{
trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -1025,7 +1025,7 @@ parse_css_file = {PARSE_CSS_FILE}
$_POST['template_data'] = (isset($_POST['template_data']) && !empty($_POST['template_data'])) ? str_replace(array("\r\n", "\r"), array("\n", "\n"), $_POST['template_data']) : '';
$theme_data = (STRIP) ? stripslashes($_POST['template_data']) : $_POST['template_data'];
- $theme_file = request_var('template_file', '', true);
+ $theme_file = utf8_normalize_nfc(request_var('template_file', '', true));
$text_rows = max(5, min(999, request_var('text_rows', 20)));
$save_changes = (isset($_POST['save'])) ? true : false;
@@ -1055,7 +1055,7 @@ parse_css_file = {PARSE_CSS_FILE}
// If the theme is stored on the filesystem try to write the file else store it in the database
if (!$safe_mode && !$theme_info['theme_storedb'] && file_exists($file) && @is_writable($file))
{
- if (!($fp = fopen($file, 'wb')))
+ if (!($fp = @fopen($file, 'wb')))
{
trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -1351,7 +1351,7 @@ parse_css_file = {PARSE_CSS_FILE}
{
while (($file = readdir($dp)) !== false)
{
- if (!is_file($dir . '/' . $file) && !is_link($dir . '/' . $file) && $file[0] != '.' && strtoupper($file) != 'CVS')
+ if ($file[0] != '.' && strtoupper($file) != 'CVS' && !is_file($dir . '/' . $file) && !is_link($dir . '/' . $file))
{
$langs[] = $file;
}
@@ -1847,6 +1847,54 @@ parse_css_file = {PARSE_CSS_FILE}
'prefix' => 'imageset/imageset.cfg'
);
+ end($data);
+
+ $imageset_root = "{$phpbb_root_path}styles/{$style_row['imageset_path']}/imageset/";
+
+ $dh = @opendir($imageset_root);
+ while (($fname = readdir($dh)) !== false)
+ {
+ if ($fname[0] != '.' && $fname != 'CVS' && is_dir("$imageset_root$fname"))
+ {
+ $files[key($files)]['exclude'] .= ',' . $fname . '/imageset.cfg';
+ }
+ }
+ @closedir($dh);
+
+ $imageset_lang = array();
+
+ $sql = 'SELECT image_filename, image_name, image_height, image_width, image_lang
+ FROM ' . STYLES_IMAGESET_DATA_TABLE . "
+ WHERE imageset_id = $style_id
+ AND image_lang <> ''";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $imageset_lang[$row['image_lang']][$row['image_name']] = $row['image_filename'] . ($row['image_height'] ? '*' . $row['image_height']: '') . ($row['image_width'] ? '*' . $row['image_width']: '');
+ }
+ $db->sql_freeresult($result);
+
+ foreach ($imageset_lang as $lang => $imageset_localized)
+ {
+ $imageset_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['imageset_name'], $style_row['imageset_copyright'], $config['version']), $this->imageset_cfg);
+
+ foreach ($this->imageset_keys as $topic => $key_array)
+ {
+ foreach ($key_array as $key)
+ {
+ if (isset($imageset_localized[$key]))
+ {
+ $imageset_cfg .= "\nimg_" . $key . ' = ' . str_replace("styles/{$style_row['imageset_path']}/imageset/", '{PATH}', $imageset_localized[$key]);
+ }
+ }
+ }
+
+ $data[] = array(
+ 'src' => trim($imageset_cfg),
+ 'prefix' => 'imageset/' . $lang . '/imageset.cfg'
+ );
+ }
+
unset($imageset_cfg);
}
@@ -2016,8 +2064,8 @@ parse_css_file = {PARSE_CSS_FILE}
if ($update)
{
- $name = request_var('name', '');
- $copyright = request_var('copyright', '', true);
+ $name = utf8_normalize_nfc(request_var('name', '', true));
+ $copyright = utf8_normalize_nfc(request_var('copyright', '', true));
$template_id = request_var('template_id', 0);
$theme_id = request_var('theme_id', 0);
@@ -2051,6 +2099,18 @@ parse_css_file = {PARSE_CSS_FILE}
$error[] = $user->lang['EDIT_' . strtoupper($mode) . '_STORED_DB'];
$store_db = 1;
}
+
+ // themes which have to be parsed have to go into db
+ if ($mode == 'theme')
+ {
+ $cfg = parse_cfg_file("{$phpbb_root_path}styles/" . $style_row["{$mode}_path"] . "/theme/theme.cfg");
+
+ if (isset($cfg['parse_css_file']) && $cfg['parse_css_file'])
+ {
+ $error[] = $user->lang['EDIT_THEME_STORE_PARSED'];
+ $store_db = 1;
+ }
+ }
}
if (!sizeof($error))
@@ -2344,7 +2404,7 @@ parse_css_file = {PARSE_CSS_FILE}
{
foreach ($file_ary as $file)
{
- if (!($fp = fopen("{$phpbb_root_path}styles/$template_path$pathfile$file", 'r')))
+ if (!($fp = @fopen("{$phpbb_root_path}styles/$template_path$pathfile$file", 'r')))
{
trigger_error("Could not open {$phpbb_root_path}styles/$template_path$pathfile$file", E_USER_ERROR);
}
@@ -2417,6 +2477,11 @@ parse_css_file = {PARSE_CSS_FILE}
$file_ary = array();
while ($file = readdir($dp))
{
+ if ($file[0] == '.')
+ {
+ continue;
+ }
+
if (is_file($phpbb_root_path . 'cache/' . $file) && (strpos($file, $cache_prefix) === 0))
{
$file_ary[] = str_replace('.', '/', preg_replace('#^' . preg_quote($cache_prefix, '#') . '_(.*?)\.html\.' . $phpEx . '$#i', '\1', $file));
@@ -2635,8 +2700,8 @@ parse_css_file = {PARSE_CSS_FILE}
$error = array();
$style_row = array(
- $mode . '_name' => request_var('name', ''),
- $mode . '_copyright' => request_var('copyright', '', true),
+ $mode . '_name' => utf8_normalize_nfc(request_var('name', '', true)),
+ $mode . '_copyright' => utf8_normalize_nfc(request_var('copyright', '', true)),
'template_id' => 0,
'theme_id' => 0,
'imageset_id' => 0,
diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php
index ccb7589aee..5b6a790e97 100644
--- a/phpBB/includes/acp/acp_users.php
+++ b/phpBB/includes/acp/acp_users.php
@@ -30,11 +30,8 @@ class acp_users
$this->tpl_name = 'acp_users';
$this->page_title = 'ACP_USER_' . strtoupper($mode);
- include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
- include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
-
$error = array();
- $username = request_var('username', '', true);
+ $username = utf8_normalize_nfc(request_var('username', '', true));
$user_id = request_var('u', 0);
$action = request_var('action', '');
@@ -43,6 +40,8 @@ class acp_users
// Whois (special case)
if ($action == 'whois')
{
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+
$this->page_title = 'WHOIS';
$this->tpl_name = 'simple_body';
@@ -148,6 +147,8 @@ class acp_users
{
case 'overview':
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+
$user->add_lang('acp/ban');
$delete = request_var('delete', 0);
@@ -248,8 +249,8 @@ class acp_users
break;
}
- $ban_reason = request_var('ban_reason', $user->lang[$reason], true);
- $ban_give_reason = request_var('ban_give_reason', '', true);
+ $ban_reason = utf8_normalize_nfc(request_var('ban_reason', $user->lang[$reason], true));
+ $ban_give_reason = utf8_normalize_nfc(request_var('ban_give_reason', '', true));
// Log not used at the moment, we simply utilize the ban function.
$result = user_ban(substr($action, 3), $ban, 0, 0, 0, $ban_reason, $ban_give_reason);
@@ -598,7 +599,7 @@ class acp_users
// Handle registration info updates
$data = array(
- 'username' => request_var('user', $user_row['username'], true),
+ 'username' => utf8_normalize_nfc(request_var('user', $user_row['username'], true)),
'user_founder' => request_var('user_founder', ($user_row['user_type'] == USER_FOUNDER) ? 1 : 0),
'email' => strtolower(request_var('user_email', $user_row['user_email'])),
'email_confirm' => strtolower(request_var('email_confirm', '')),
@@ -867,7 +868,7 @@ class acp_users
$deletemark = (isset($_POST['delmarked'])) ? true : false;
$deleteall = (isset($_POST['delall'])) ? true : false;
$marked = request_var('mark', array(0));
- $message = request_var('message', '', true);
+ $message = utf8_normalize_nfc(request_var('message', '', true));
// Sort keys
$sort_days = request_var('st', 0);
@@ -952,6 +953,9 @@ class acp_users
case 'profile':
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+ include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
+
$cp = new custom_profile();
$cp_data = $cp_error = array();
@@ -1147,8 +1151,10 @@ class acp_users
case 'prefs':
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+
$data = array(
- 'dateformat' => request_var('dateformat', $user_row['user_dateformat'], true),
+ 'dateformat' => utf8_normalize_nfc(request_var('dateformat', $user_row['user_dateformat'], true)),
'lang' => basename(request_var('lang', $user_row['user_lang'])),
'tz' => request_var('tz', (float) $user_row['user_timezone']),
'style' => request_var('style', $user_row['user_style']),
@@ -1352,6 +1358,7 @@ class acp_users
case 'avatar':
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
@@ -1546,10 +1553,9 @@ class acp_users
delete_attachments('attach', $marked);
- $log = (sizeof($log_attachments) == 1) ? 'ATTACHMENT_DELETED' : 'ATTACHMENTS_DELETED';
$message = (sizeof($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED'];
- add_log('admin', $log, implode(', ', $log_attachments));
+ add_log('admin', 'LOG_ATTACHMENTS_DELETED', implode(', ', $log_attachments));
trigger_error($message . adm_back_link($this->u_action . '&amp;u=' . $user_id));
}
else
@@ -1653,6 +1659,8 @@ class acp_users
case 'groups':
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+
$user->add_lang(array('groups', 'acp/groups'));
$group_id = request_var('g', 0);
diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php
index a7518a287c..e3514833b5 100644
--- a/phpBB/includes/acp/auth.php
+++ b/phpBB/includes/acp/auth.php
@@ -469,13 +469,16 @@ class auth_admin extends auth
'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
);
- foreach ($content_array as $ug_id => $ug_array)
+ @reset($content_array);
+ while (list($ug_id, $ug_array) = each($content_array))
{
// Build role dropdown options
$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0;
$s_role_options = '';
- foreach ($roles as $role_id => $role_row)
+
+ @reset($roles);
+ while (list($role_id, $role_row) = each($roles))
{
$role_description = (!empty($user->lang[$role_row['role_description']])) ? $user->lang[$role_row['role_description']] : nl2br($role_row['role_description']);
$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name'];
@@ -489,10 +492,29 @@ class auth_admin extends auth
$s_role_options = '<option value="0"' . ((!$current_role_id) ? ' selected="selected"' : '') . ' title="' . htmlspecialchars($user->lang['NO_ROLE_ASSIGNED_EXPLAIN']) . '">' . $user->lang['NO_ROLE_ASSIGNED'] . '</option>' . $s_role_options;
}
+ if (!$current_role_id && $mode != 'view')
+ {
+ $s_custom_permissions = false;
+
+ foreach ($ug_array as $key => $value)
+ {
+ if ($value['S_NEVER'] || $value['S_YES'])
+ {
+ $s_custom_permissions = true;
+ break;
+ }
+ }
+ }
+ else
+ {
+ $s_custom_permissions = false;
+ }
+
$template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(
'NAME' => $ug_names_ary[$ug_id],
'S_ROLE_OPTIONS' => $s_role_options,
'UG_ID' => $ug_id,
+ 'S_CUSTOM' => $s_custom_permissions,
'FORUM_ID' => $forum_id)
);
@@ -556,10 +578,29 @@ class auth_admin extends auth
$s_role_options = '<option value="0"' . ((!$current_role_id) ? ' selected="selected"' : '') . ' title="' . htmlspecialchars($user->lang['NO_ROLE_ASSIGNED_EXPLAIN']) . '">' . $user->lang['NO_ROLE_ASSIGNED'] . '</option>' . $s_role_options;
}
+ if (!$current_role_id && $mode != 'view')
+ {
+ $s_custom_permissions = false;
+
+ foreach ($forum_array as $key => $value)
+ {
+ if ($value['S_NEVER'] || $value['S_YES'])
+ {
+ $s_custom_permissions = true;
+ break;
+ }
+ }
+ }
+ else
+ {
+ $s_custom_permissions = false;
+ }
+
$template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(
'NAME' => ($forum_id == 0) ? $forum_names_ary[0] : $forum_names_ary[$forum_id]['forum_name'],
'PADDING' => ($forum_id == 0) ? '' : $forum_names_ary[$forum_id]['padding'],
'S_ROLE_OPTIONS' => $s_role_options,
+ 'S_CUSTOM' => $s_custom_permissions,
'UG_ID' => $ug_id,
'FORUM_ID' => $forum_id)
);
@@ -591,13 +632,14 @@ class auth_admin extends auth
ORDER BY left_id';
$result = $db->sql_query($sql);
- $forum_names = array(0 => '');
+ // If the role is used globally, then reflect that
+ $forum_names = (isset($hold_ary[0])) ? array(0 => '') : array();
while ($row = $db->sql_fetchrow($result))
{
$forum_names[$row['forum_id']] = $row['forum_name'];
}
$db->sql_freeresult($result);
-
+
foreach ($forum_names as $forum_id => $forum_name)
{
$auth_ary = $hold_ary[$forum_id];
@@ -723,7 +765,7 @@ class auth_admin extends auth
foreach ($option_ary as $option)
{
$sql_ary[] = array(
- 'auth_option' => $option,
+ 'auth_option' => (string) $option,
'is_global' => ($type == 'global' || $type == 'local_global') ? 1 : 0,
'is_local' => ($type == 'local' || $type == 'local_global') ? 1 : 0
);
@@ -779,7 +821,7 @@ class auth_admin extends auth
}
// Remove current auth options...
- $auth_option_ids = array();
+ $auth_option_ids = array((int)$any_option_id);
foreach ($auth as $auth_option => $auth_setting)
{
$auth_option_ids[] = (int) $this->option_ids[$auth_option];
@@ -788,7 +830,7 @@ class auth_admin extends auth
$sql = "DELETE FROM $table
WHERE $forum_sql
AND $ug_id_sql
- AND auth_option_id IN ($any_option_id, " . implode(', ', $auth_option_ids) . ')';
+ AND " . $db->sql_in_set('auth_option_id', $auth_option_ids);
$db->sql_query($sql);
// Remove those having a role assigned... the correct type of course...
@@ -837,7 +879,7 @@ class auth_admin extends auth
'forum_id' => (int) $forum,
'auth_option_id' => 0,
'auth_setting' => 0,
- 'auth_role_id' => $role_id
+ 'auth_role_id' => (int) $role_id,
);
}
}
@@ -918,7 +960,7 @@ class auth_admin extends auth
{
$sql_ary[] = array(
'role_id' => (int) $role_id,
- 'auth_option_id' => $this->option_ids[$flag],
+ 'auth_option_id' => (int) $this->option_ids[$flag],
'auth_setting' => ACL_NEVER
);
}
diff --git a/phpBB/includes/auth.php b/phpBB/includes/auth.php
index 76d6036c77..389fe99bdb 100644
--- a/phpBB/includes/auth.php
+++ b/phpBB/includes/auth.php
@@ -345,6 +345,37 @@ class auth
}
}
+ // Sometimes, it can happen $hold_ary holding forums which do not exist.
+ // Since this function is not called that often (we are caching the data) we check for this inconsistency.
+ $sql = 'SELECT forum_id
+ FROM ' . FORUMS_TABLE . '
+ WHERE ' . $db->sql_in_set('forum_id', array_keys($hold_ary));
+ $result = $db->sql_query($sql);
+
+ $forum_ids = (isset($hold_ary[0])) ? array(0) : array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_ids[] = $row['forum_id'];
+ }
+ $db->sql_freeresult($result);
+
+ // Now determine forums which do not exist and remove the unneeded information (for modding purposes it is clearly the wrong place. ;))
+ $missing_forums = array_diff(array_keys($hold_ary), $forum_ids);
+
+ if (sizeof($missing_forums))
+ {
+ foreach ($missing_forums as $forum_id)
+ {
+ unset($hold_ary[$forum_id]);
+ }
+
+ $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $missing_forums);
+ $db->sql_query($sql);
+
+ $sql = 'DELETE FROM ' . ACL_USERS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $missing_forums);
+ $db->sql_query($sql);
+ }
+
$hold_str = $this->build_bitstring($hold_ary);
if ($hold_str)
diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php
index aa8adda86c..79a2d6bf35 100644
--- a/phpBB/includes/db/dbal.php
+++ b/phpBB/includes/db/dbal.php
@@ -534,7 +534,7 @@ class dbal
// Show complete SQL error and path to administrators only
// Additionally show complete error on installation or if extended debug mode is enabled
// The DEBUG_EXTRA constant is for development only!
- if (isset($auth) && ($auth->acl_get('a_') || defined('IN_INSTALL') || defined('DEBUG_EXTRA')))
+ if ((isset($auth) && $auth->acl_get('a_')) || defined('IN_INSTALL') || defined('DEBUG_EXTRA'))
{
// Print out a nice backtrace...
$backtrace = get_backtrace();
diff --git a/phpBB/includes/db/oracle.php b/phpBB/includes/db/oracle.php
index 888a9fd4bf..6049fa5734 100644
--- a/phpBB/includes/db/oracle.php
+++ b/phpBB/includes/db/oracle.php
@@ -239,7 +239,7 @@ class dbal_oracle extends dbal
if (strlen($regs[3]) > 4000)
{
$cols = explode(', ', $regs[2]);
- preg_match_all('/\'(?:[^\']++|\'\')*+\'|\[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER);
+ preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER);
$inserts = $vals[0];
unset($vals);
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index caf26bf379..daff12e3a8 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -577,7 +577,7 @@ if (!function_exists('realpath'))
$bits = explode('/', $path);
// Remove any . in the path, renumber array for the loop below
- $bits = array_keys(array_diff($bits, array('.')));
+ $bits = array_values(array_diff($bits, array('.')));
// Lets get looping, run over and resolve any .. (up directory)
for ($i = 0, $max = sizeof($bits); $i < $max; $i++)
@@ -789,6 +789,8 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$tracking_topics['l'] = base_convert(time() - $config['board_startdate'], 10, 36);
$user->set_cookie('track', tracking_serialize($tracking_topics), time() + 31536000);
+ $_COOKIE[$config['cookie_name'] . '_track'] = (STRIP) ? addslashes(tracking_serialize($tracking_topics)) : tracking_serialize($tracking_topics);
+
unset($tracking_topics);
if ($user->data['is_registered'])
@@ -846,8 +848,8 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
foreach ($sql_insert as $f_id)
{
$sql_ary[] = array(
- 'user_id' => $user->data['user_id'],
- 'forum_id' => $f_id,
+ 'user_id' => (int) $user->data['user_id'],
+ 'forum_id' => (int) $f_id,
'mark_time' => time()
);
}
@@ -882,7 +884,14 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$tracking['f'][$f_id] = base_convert(time() - $config['board_startdate'], 10, 36);
}
+ if (isset($tracking['tf']) && empty($tracking['tf']))
+ {
+ unset($tracking['tf']);
+ }
+
$user->set_cookie('track', tracking_serialize($tracking), time() + 31536000);
+ $_COOKIE[$config['cookie_name'] . '_track'] = (STRIP) ? addslashes(tracking_serialize($tracking)) : tracking_serialize($tracking);
+
unset($tracking);
}
@@ -909,10 +918,10 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$db->sql_return_on_error(true);
$sql_ary = array(
- 'user_id' => $user->data['user_id'],
- 'topic_id' => $topic_id,
+ 'user_id' => (int) $user->data['user_id'],
+ 'topic_id' => (int) $topic_id,
'forum_id' => (int) $forum_id,
- 'mark_time' => ($post_time) ? $post_time : time(),
+ 'mark_time' => ($post_time) ? (int) $post_time : time(),
);
$db->sql_query('INSERT INTO ' . TOPICS_TRACK_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
@@ -977,6 +986,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
}
$user->set_cookie('track', tracking_serialize($tracking), time() + 31536000);
+ $_COOKIE[$config['cookie_name'] . '_track'] = (STRIP) ? addslashes(tracking_serialize($tracking)) : tracking_serialize($tracking);
}
return;
@@ -995,8 +1005,8 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$db->sql_return_on_error(true);
$sql_ary = array(
- 'user_id' => $use_user_id,
- 'topic_id' => $topic_id,
+ 'user_id' => (int) $use_user_id,
+ 'topic_id' => (int) $topic_id,
'topic_posted' => 1
);
@@ -1241,11 +1251,8 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti
}
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{
- if (!isset($tracking_topics) || !sizeof($tracking_topics))
- {
- $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
- $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
- }
+ $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
+ $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
if (!$user->data['is_registered'])
{
@@ -1300,6 +1307,7 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti
$check_forum = $tracking_topics['tf'][$forum_id];
$unread = false;
+
while ($row = $db->sql_fetchrow($result))
{
if (!in_array(base_convert($row['topic_id'], 10, 36), array_keys($check_forum)))
@@ -2235,7 +2243,6 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'),
'S_DISPLAY_FULL_LOGIN' => ($s_display) ? true : false,
- 'S_AUTOLOGIN_ENABLED' => ($config['allow_autologin']) ? true : false,
'S_LOGIN_ACTION' => (!$admin) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("index.$phpEx", false, true, $user->session_id), // Needs to stay index.$phpEx because we are within the admin directory
'S_HIDDEN_FIELDS' => $s_hidden_fields,
@@ -2387,7 +2394,7 @@ function get_context($text, $words, $length = 400)
{
if (preg_match('#(?:[^\w]|^)(' . $word . ')(?:[^\w]|$)#i', $text, $match))
{
- $pos = strpos($text, $match[1]);
+ $pos = utf8_strpos($text, $match[1]);
if ($pos !== false)
{
$word_indizes[] = $pos;
@@ -2410,21 +2417,21 @@ function get_context($text, $words, $length = 400)
$final_text_index = -1;
// cycle through every character in the original text
- for ($i = $word_indizes[$word], $n = strlen($text); $i < $n; $i++)
+ for ($i = $word_indizes[$word], $n = utf8_strlen($text); $i < $n; $i++)
{
// if the current position is the start of one of the words then append $sequence_length characters to the final text
if (isset($word_indizes[$word]) && ($i == $word_indizes[$word]))
{
if ($final_text_index < $i - $sequence_length - 1)
{
- $final_text .= '... ' . preg_replace('#^([^ ]*)#', '', substr($text, $i - $sequence_length, $sequence_length));
+ $final_text .= '... ' . preg_replace('#^([^ ]*)#', '', utf8_substr($text, $i - $sequence_length, $sequence_length));
}
else
{
// if the final text is already nearer to the current word than $sequence_length we only append the text
// from its current index on and distribute the unused length to all other sequenes
$sequence_length += (int) (($final_text_index - $i + $sequence_length + 1) / (2 * $wordnum));
- $final_text .= substr($text, $final_text_index + 1, $i - $final_text_index - 1);
+ $final_text .= utf8_substr($text, $final_text_index + 1, $i - $final_text_index - 1);
}
$final_text_index = $i - 1;
@@ -2436,17 +2443,17 @@ function get_context($text, $words, $length = 400)
if ($j > 0)
{
// add the character to the final text and increment the sequence counter
- $final_text .= $text[$i];
+ $final_text .= utf8_substr($text, $i, 1);
$final_text_index++;
$j++;
// if this is a whitespace then check whether we are done with this sequence
- if ($text[$i] == ' ')
+ if (utf8_substr($text, $i, 1) == ' ')
{
// only check whether we have to exit the context generation completely if we haven't already reached the end anyway
if ($i + 4 < $n)
{
- if (($j > $sequence_length && $word >= $wordnum) || strlen($final_text) > $length)
+ if (($j > $sequence_length && $word >= $wordnum) || utf8_strlen($final_text) > $length)
{
$final_text .= ' ...';
break;
@@ -2472,7 +2479,7 @@ function get_context($text, $words, $length = 400)
if (!sizeof($words) || !sizeof($word_indizes))
{
- return (strlen($text) >= $length + 3) ? substr($text, 0, $length) . '...' : $text;
+ return (utf8_strlen($text) >= $length + 3) ? utf8_substr($text, 0, $length) . '...' : $text;
}
}
@@ -4117,7 +4124,7 @@ function page_header($page_title = '', $display_online_list = true)
'UA_POPUP_PM' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&mode=popup', false),
'U_MEMBERLIST' => append_sid("{$phpbb_root_path}memberlist.$phpEx"),
'U_MEMBERSLIST' => append_sid("{$phpbb_root_path}memberlist.$phpEx"),
- 'U_VIEWONLINE' => append_sid("{$phpbb_root_path}viewonline.$phpEx"),
+ 'U_VIEWONLINE' => ($auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel')) ? append_sid("{$phpbb_root_path}viewonline.$phpEx") : '',
'U_LOGIN_LOGOUT' => $u_login_logout,
'U_INDEX' => append_sid("{$phpbb_root_path}index.$phpEx"),
'U_SEARCH' => append_sid("{$phpbb_root_path}search.$phpEx"),
@@ -4134,6 +4141,7 @@ function page_header($page_title = '', $display_online_list = true)
'U_RESTORE_PERMISSIONS' => ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=restore_perm') : '',
'S_USER_LOGGED_IN' => ($user->data['user_id'] != ANONYMOUS) ? true : false,
+ 'S_AUTOLOGIN_ENABLED' => ($config['allow_autologin']) ? true : false,
'S_BOARD_DISABLED' => ($config['board_disable']) ? true : false,
'S_REGISTERED_USER' => $user->data['is_registered'],
'S_IS_BOT' => $user->data['is_bot'],
@@ -4169,79 +4177,6 @@ function page_header($page_title = '', $display_online_list = true)
'SITE_LOGO_IMG' => $user->img('site_logo'))
);
- // Once used, we do not want to have the whole theme data twice in memory...
- if ($user->theme['theme_storedb'])
- {
- // Parse Theme Data
- $replace = array(
- '{T_THEME_PATH}' => "{$phpbb_root_path}styles/" . $user->theme['theme_path'] . '/theme',
- '{T_TEMPLATE_PATH}' => "{$phpbb_root_path}styles/" . $user->theme['template_path'] . '/template',
- '{T_IMAGESET_PATH}' => "{$phpbb_root_path}styles/" . $user->theme['imageset_path'] . '/imageset',
- '{T_IMAGESET_LANG_PATH}' => "{$phpbb_root_path}styles/" . $user->theme['imageset_path'] . '/imageset/' . $user->data['user_lang'],
- '{T_STYLESHEET_NAME}' => $user->theme['theme_name'],
- '{S_USER_LANG}' => $user->data['user_lang']
- );
-
- $user->theme['theme_data'] = str_replace(array_keys($replace), array_values($replace), $user->theme['theme_data']);
-
- $matches = array();
- if (strpos($user->theme['theme_data'], '{IMG_') !== false)
- {
- preg_match_all('#\{IMG_([A-Za-z0-9_]*?)_(WIDTH|HEIGHT|SRC)\}#', $user->theme['theme_data'], $matches);
-
- $imgs = $find = $replace = array();
- if (isset($matches[0]) && sizeof($matches[0]))
- {
- foreach ($matches[1] as $i => $img)
- {
- $img = strtolower($img);
- if (!isset($img_array[$img]))
- {
- continue;
- }
-
- if (!isset($imgs[$img]))
- {
- $img_data = &$img_array[$img];
- $imgsrc = ($img_data['image_lang'] ? $img_data['image_lang'] . '/' : '') . $img_data['image_filename'];
- $imgs[$img] = array(
- 'src' => $phpbb_root_path . 'styles/' . $user->theme['imageset_path'] . '/imageset/' . $imgsrc,
- 'width' => $img_data['image_width'],
- 'height' => $img_data['image_height'],
- );
- }
-
- switch ($matches[2][$i])
- {
- case 'SRC':
- $replace[] = $imgs[$img]['src'];
- break;
-
- case 'WIDTH':
- $replace[] = $imgs[$img]['width'];
- break;
-
- case 'HEIGHT':
- $replace[] = $imgs[$img]['height'];
- break;
-
- default:
- continue;
- }
- $find[] = $matches[0][$i];
- }
-
- if (sizeof($find))
- {
- $user->theme['theme_data'] = str_replace($find, $replace, $user->theme['theme_data']);
- }
- }
- }
-
- $template->assign_var('T_THEME_DATA', $user->theme['theme_data']);
- $user->theme['theme_data'] = '';
- }
-
// application/xhtml+xml not used because of IE
header('Content-type: text/html; charset=UTF-8');
@@ -4294,11 +4229,11 @@ function page_footer($run_cron = true)
'DEBUG_OUTPUT' => (defined('DEBUG')) ? $debug_output : '',
'TRANSLATION_INFO' => (!empty($user->lang['TRANSLATION_INFO'])) ? $user->lang['TRANSLATION_INFO'] : '',
- 'U_ACP' => ($auth->acl_get('a_') && $user->data['is_registered']) ? append_sid("{$phpbb_root_path}adm/index.$phpEx", '', true, $user->session_id) : '')
+ 'U_ACP' => ($auth->acl_get('a_') && $user->data['is_registered']) ? append_sid("{$phpbb_root_path}adm/index.$phpEx", false, true, $user->session_id) : '')
);
// Call cron-type script
- if (!defined('IN_CRON') && $run_cron)
+ if (!defined('IN_CRON') && $run_cron && !$config['board_disable'])
{
$cron_type = '';
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
index 5e94b0d9e0..29d52406da 100644
--- a/phpBB/includes/functions_admin.php
+++ b/phpBB/includes/functions_admin.php
@@ -365,14 +365,14 @@ function filelist($rootdir, $dir = '', $type = 'gif|jpg|jpeg|png')
if (!is_dir($rootdir . $dir))
{
- return false;
+ return $matches;
}
$dh = @opendir($rootdir . $dir);
if (!$dh)
{
- return false;
+ return $matches;
}
while (($fname = readdir($dh)) !== false)
@@ -1079,8 +1079,8 @@ function update_posted_info(&$topic_ids)
foreach ($topic_row as $topic_id)
{
$sql_ary[] = array(
- 'user_id' => $user_id,
- 'topic_id' => $topic_id,
+ 'user_id' => (int) $user_id,
+ 'topic_id' => (int) $topic_id,
'topic_posted' => 1,
);
}
@@ -2244,9 +2244,9 @@ function cache_moderators()
foreach ($forum_id_ary as $forum_id => $auth_ary)
{
$sql_ary[] = array(
- 'forum_id' => $forum_id,
- 'user_id' => $user_id,
- 'username' => $usernames_ary[$user_id],
+ 'forum_id' => (int) $forum_id,
+ 'user_id' => (int) $user_id,
+ 'username' => (string) $usernames_ary[$user_id],
'group_id' => 0,
'group_name' => ''
);
@@ -2307,11 +2307,11 @@ function cache_moderators()
}
$sql_ary[] = array(
- 'forum_id' => $forum_id,
+ 'forum_id' => (int) $forum_id,
'user_id' => 0,
'username' => '',
- 'group_id' => $group_id,
- 'group_name' => $groupnames_ary[$group_id]
+ 'group_id' => (int) $group_id,
+ 'group_name' => (string) $groupnames_ary[$group_id]
);
}
}
@@ -2423,7 +2423,8 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id
if (isset($user->lang[$row['log_operation']]))
{
- $log[$i]['action'] = vsprintf($log[$i]['action'], $log_data_ary);
+ // We supress the warning about inappropiate number of passed parameters here due to possible changes within LOG strings from one version to another.
+ $log[$i]['action'] = @vsprintf($log[$i]['action'], $log_data_ary);
// If within the admin panel we do not censor text out
if (defined('IN_ADMIN'))
@@ -2791,6 +2792,17 @@ 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':
global $dbhost;
diff --git a/phpBB/includes/functions_compress.php b/phpBB/includes/functions_compress.php
index d8267cf7f6..ade844b262 100644
--- a/phpBB/includes/functions_compress.php
+++ b/phpBB/includes/functions_compress.php
@@ -12,7 +12,7 @@
* Class for handling archives (compression/decompression)
* @package phpBB3
*/
-class compress
+class compress
{
var $fp = 0;
@@ -434,12 +434,15 @@ class compress_zip extends compress
header("Content-Type: $mimetype; name=\"$download_name.zip\"");
header("Content-disposition: attachment; filename=$download_name.zip");
- $fp = fopen("{$phpbb_root_path}store/$filename.zip", 'rb');
- while ($buffer = fread($fp, 1024))
+ $fp = @fopen("{$phpbb_root_path}store/$filename.zip", 'rb');
+ if ($fp)
{
- echo $buffer;
+ while ($buffer = fread($fp, 1024))
+ {
+ echo $buffer;
+ }
+ fclose($fp);
}
- fclose($fp);
}
}
@@ -546,8 +549,8 @@ class compress_tar extends compress
{
$fzwrite = ($this->isbz && function_exists('bzwrite')) ? 'bzwrite' : (($this->isgz && @extension_loaded('zlib')) ? 'gzwrite' : 'fwrite');
- // Symbolizes that there are no more files
- $fzwrite($this->fp, str_repeat("\0", 512));
+ // The end of a tar archive ends in two records of all NULLs (1024 bytes of \0)
+ $fzwrite($this->fp, str_repeat("\0", 1024));
}
$fzclose($this->fp);
@@ -648,12 +651,15 @@ class compress_tar extends compress
header("Content-Type: $mimetype; name=\"$download_name$this->type\"");
header("Content-disposition: attachment; filename=$download_name$this->type");
- $fp = fopen("{$phpbb_root_path}store/$filename$this->type", 'rb');
- while ($buffer = fread($fp, 1024))
+ $fp = @fopen("{$phpbb_root_path}store/$filename$this->type", 'rb');
+ if ($fp)
{
- echo $buffer;
+ while ($buffer = fread($fp, 1024))
+ {
+ echo $buffer;
+ }
+ fclose($fp);
}
- fclose($fp);
}
}
diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php
index 4037fb4872..159ec387bd 100644
--- a/phpBB/includes/functions_convert.php
+++ b/phpBB/includes/functions_convert.php
@@ -224,13 +224,15 @@ function make_uid($timestamp)
*/
function validate_website($url)
{
- if ($url === 'http://'){
+ if ($url === 'http://')
+ {
return '';
}
else if (strpos(strtolower($url), 'http://') !== 0)
{
return 'http://' . $url;
}
+ return $url;
}
/**
@@ -1479,18 +1481,21 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
// Role based permissions are the simplest to handle so check for them first
if ($ug_type == 'user_role' || $ug_type == 'group_role')
{
- $sql = 'SELECT role_id
- FROM ' . ACL_ROLES_TABLE . "
- WHERE role_name = 'ROLE_" . $db->sql_escape($acl_list) . "'";
- $result = $db->sql_query_limit($sql, 1);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // If we have no role id there is something wrong here
- if ($row)
+ if (is_numeric($forum_id))
{
- $sql = "INSERT INTO $table ($id_field, forum_id, auth_role_id) VALUES ($ug_id, $forum_id, " . $row['role_id'] . ')';
- $db->sql_query($sql);
+ $sql = 'SELECT role_id
+ FROM ' . ACL_ROLES_TABLE . "
+ WHERE role_name = 'ROLE_" . $db->sql_escape($acl_list) . "'";
+ $result = $db->sql_query_limit($sql, 1);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ // If we have no role id there is something wrong here
+ if ($row)
+ {
+ $sql = "INSERT INTO $table ($id_field, forum_id, auth_role_id) VALUES ($ug_id, $forum_id, " . $row['role_id'] . ')';
+ $db->sql_query($sql);
+ }
}
return;
@@ -1540,7 +1545,7 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
$db->sql_freeresult($result);
}
- $sql_forum = 'AND a.forum_id IN (' . implode(', ', array_map('intval', $forum_id)) . ')';
+ $sql_forum = 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id), false, true);
$sql = ($ug_type == 'user') ? 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.user_id = $ug_id" : 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.group_id = $ug_id";
$result = $db->sql_query($sql);
@@ -1682,8 +1687,8 @@ function add_default_groups()
);
$sql = 'SELECT *
- FROM ' . GROUPS_TABLE . "
- WHERE group_name IN ('" . implode("', '", array_keys($default_groups)) . "')";
+ FROM ' . GROUPS_TABLE . '
+ WHERE ' . $db->sql_in_set('group_name', array_keys($default_groups));
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -1702,9 +1707,9 @@ function add_default_groups()
'group_desc_uid' => '',
'group_desc_bitfield' => '',
'group_type' => GROUP_SPECIAL,
- 'group_colour' => $data[0],
- 'group_legend' => $data[1],
- 'group_founder_manage' => $data[2]
+ 'group_colour' => (string) $data[0],
+ 'group_legend' => (int) $data[1],
+ 'group_founder_manage' => (int) $data[2]
);
}
@@ -2060,7 +2065,7 @@ function fix_empty_primary_groups()
if (sizeof($user_ids))
{
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('administrators') . '
- WHERE group_id = 0 AND user_id IN (' . implode(', ', $user_ids) . ')');
+ WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
}
$sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . ' WHERE group_id = ' . get_group_id('global_moderators');
@@ -2075,7 +2080,7 @@ function fix_empty_primary_groups()
if (sizeof($user_ids))
{
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('global_moderators') . '
- WHERE group_id = 0 AND user_id IN (' . implode(', ', $user_ids) . ')');
+ WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
}
// Set user colour
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index 92e636af01..a28d91a7e9 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -216,10 +216,6 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$forum_rows[$parent_id]['forum_last_poster_colour'] = $row['forum_last_poster_colour'];
$forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
}
- else
- {
- $forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
- }
}
}
$db->sql_freeresult($result);
@@ -372,6 +368,24 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$s_subforums_list = (string) implode(', ', $s_subforums_list);
$catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
+ if ($row['forum_type'] != FORUM_LINK)
+ {
+ $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
+ }
+ else
+ {
+ // If the forum is a link and we count redirects we need to visit it
+ // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
+ if (($row['forum_flags'] & FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
+ {
+ $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
+ }
+ else
+ {
+ $u_viewforum = $row['forum_link'];
+ }
+ }
+
$template->assign_block_vars('forumrow', array(
'S_IS_CAT' => false,
'S_NO_CAT' => $catless && !$last_catless,
@@ -401,7 +415,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'L_FORUM_FOLDER_ALT' => $folder_alt,
'L_MODERATOR_STR' => $l_moderator,
- 'U_VIEWFORUM' => ($row['forum_type'] != FORUM_LINK || ($row['forum_flags'] & FORUM_FLAG_LINK_TRACK)) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : $row['forum_link'],
+ 'U_VIEWFORUM' => $u_viewforum,
'U_LAST_POSTER' => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
'U_LAST_POST' => $last_post_url)
);
@@ -665,7 +679,7 @@ function get_moderators(&$forum_moderators, $forum_id = false)
}
else
{
- $forum_moderators[$row['forum_id']][] = '<a' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';font-weight:bold;"' : '') . ' href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</a>';
+ $forum_moderators[$row['forum_id']][] = '<a' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';"' : '') . ' href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</a>';
}
}
$db->sql_freeresult($result);
diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php
index 133ef294b0..d5994f9f98 100644
--- a/phpBB/includes/functions_install.php
+++ b/phpBB/includes/functions_install.php
@@ -258,7 +258,7 @@ function connect_check_db($error_connect, &$error, $dbms, $table_prefix, $dbhost
$db->sql_return_on_error(true);
// Check that we actually have a database name before going any further.....
- if ($dbms['DRIVER'] != 'sqlite' && $dbname === '')
+ if ($dbms['DRIVER'] != 'sqlite' && $dbms['DRIVER'] != 'oracle' && $dbname === '')
{
$error[] = $lang['INST_ERR_DB_NO_NAME'];
return false;
@@ -324,6 +324,7 @@ function connect_check_db($error_connect, &$error, $dbms, $table_prefix, $dbhost
$table_ary = array($temp_prefix . 'attachments', $temp_prefix . 'config', $temp_prefix . 'sessions', $temp_prefix . 'topics', $temp_prefix . 'users');
$tables = get_tables($db);
+ $tables = array_map('strtolower', $tables);
$table_intersect = array_intersect($tables, $table_ary);
if (sizeof($table_intersect))
diff --git a/phpBB/includes/functions_jabber.php b/phpBB/includes/functions_jabber.php
index def15c67c7..f9c0a6308e 100644
--- a/phpBB/includes/functions_jabber.php
+++ b/phpBB/includes/functions_jabber.php
@@ -394,7 +394,7 @@ class jabber
}
// go on with authentication?
- if (isset($this->features['stream:features'][0]['#']['bind']) || $this->session['tls'])
+ if (isset($this->features['stream:features'][0]['#']['bind']) || !empty($this->session['tls']))
{
return $this->response($this->features);
}
diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php
index b2cb5ec054..bd838a3346 100644
--- a/phpBB/includes/functions_messenger.php
+++ b/phpBB/includes/functions_messenger.php
@@ -26,7 +26,9 @@ class messenger
*/
function messenger($use_queue = true)
{
- $this->use_queue = $use_queue;
+ global $config;
+
+ $this->use_queue = (!$config['email_package_size']) ? false : $use_queue;
$this->subject = '';
}
@@ -287,6 +289,7 @@ class messenger
if ($config['email_package_size'] && $this->use_queue && !empty($this->queue))
{
$this->queue->save();
+ return;
}
}
@@ -819,7 +822,11 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = '')
$smtp->add_backtrace('Connecting to ' . $config['smtp_host'] . ':' . $config['smtp_port']);
// Ok we have error checked as much as we can to this point let's get on it already.
- if (!$smtp->socket = @fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 20))
+ ob_start();
+ $smtp->socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 20);
+ $error_contents = ob_get_clean();
+
+ if (!$smtp->socket)
{
if ($errstr)
{
@@ -827,6 +834,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = '')
}
$err_msg = (isset($user->lang['NO_CONNECT_TO_SMTP_HOST'])) ? sprintf($user->lang['NO_CONNECT_TO_SMTP_HOST'], $errno, $errstr) : "Could not connect to smtp host : $errno : $errstr";
+ $err_msg .= ($error_contents) ? '<br /><br />' . htmlspecialchars($error_contents) : '';
return false;
}
diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php
index 1010de643b..9db2c4fa25 100644
--- a/phpBB/includes/functions_module.php
+++ b/phpBB/includes/functions_module.php
@@ -124,20 +124,7 @@ class p_master
$this->module_cache['modules'] = array_merge($this->module_cache['modules']);
// Include MOD _info files for populating language entries within the menus
- if (file_exists($user->lang_path . 'mods'))
- {
- $add_files = array();
-
- foreach (glob($user->lang_path . 'mods/info_' . strtolower($this->p_class) . '_*.' . $phpEx, GLOB_NOSORT) as $file)
- {
- $add_files[] = 'mods/' . substr(basename($file), 0, -(strlen($phpEx) + 1));
- }
-
- if (sizeof($add_files))
- {
- $user->add_lang($add_files);
- }
- }
+ $this->add_mod_info($this->p_class);
// Now build the module array, but exclude completely empty categories...
$right_id = false;
@@ -815,6 +802,38 @@ class p_master
}
}
}
+
+ /**
+ * Add custom MOD info language file
+ */
+ function add_mod_info($module_class)
+ {
+ global $user, $phpEx;
+
+ if (file_exists($user->lang_path . 'mods'))
+ {
+ $add_files = array();
+
+ $dir = @opendir($user->lang_path . 'mods');
+
+ if ($dir)
+ {
+ while (($entry = readdir($dir)) !== false)
+ {
+ if (strpos($entry, 'info_' . strtolower($module_class) . '_') === 0 && substr(strrchr($entry, '.'), 1) == $phpEx)
+ {
+ $add_files[] = 'mods/' . substr(basename($entry), 0, -(strlen($phpEx) + 1));
+ }
+ }
+ closedir($dir);
+ }
+
+ if (sizeof($add_files))
+ {
+ $user->add_lang($add_files);
+ }
+ }
+ }
}
?> \ No newline at end of file
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index 21b2677483..4b38919e81 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -757,7 +757,7 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data)
$hidden .= '<input type="hidden" name="attachment_data[' . $count . '][' . $key . ']" value="' . $value . '" />';
}
- $download_link = append_sid("{$phpbb_root_path}download.$phpEx", 'mode=view&amp;id=' . (int) $attach_row['attach_id'], false, ($attach_row['is_orphan']) ? $user->session_id : false);
+ $download_link = append_sid("{$phpbb_root_path}download.$phpEx", 'mode=view&amp;id=' . (int) $attach_row['attach_id'], true, ($attach_row['is_orphan']) ? $user->session_id : false);
$template->assign_block_vars('attach_row', array(
'FILENAME' => basename($attach_row['real_filename']),
@@ -1368,8 +1368,8 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
if ($data['topic_type'] != POST_GLOBAL)
{
- $sql_data[FORUMS_TABLE] .= 'forum_posts = forum_posts - 1, forum_topics_real = forum_topics_real - 1';
- $sql_data[FORUMS_TABLE] .= ($data['topic_approved']) ? ', forum_topics = forum_topics - 1' : '';
+ $sql_data[FORUMS_TABLE] .= 'forum_topics_real = forum_topics_real - 1';
+ $sql_data[FORUMS_TABLE] .= ($data['topic_approved']) ? ', forum_posts = forum_posts - 1, forum_topics = forum_topics - 1' : '';
}
$update_sql = update_post_information('forum', $forum_id, true);
@@ -1392,7 +1392,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
if ($data['topic_type'] != POST_GLOBAL)
{
- $sql_data[FORUMS_TABLE] = 'forum_posts = forum_posts - 1';
+ $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
}
$sql_data[TOPICS_TABLE] = 'topic_first_post_id = ' . intval($row['post_id']) . ", topic_first_poster_colour = '" . $db->sql_escape($row['user_colour']) . "', topic_first_poster_name = '" . (($row['poster_id'] == ANONYMOUS) ? $db->sql_escape($row['post_username']) : $db->sql_escape($row['username'])) . "'";
@@ -1406,7 +1406,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
case 'delete_last_post':
if ($data['topic_type'] != POST_GLOBAL)
{
- $sql_data[FORUMS_TABLE] = 'forum_posts = forum_posts - 1';
+ $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
}
$update_sql = update_post_information('forum', $forum_id, true);
@@ -1451,7 +1451,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
if ($data['topic_type'] != POST_GLOBAL)
{
- $sql_data[FORUMS_TABLE] = 'forum_posts = forum_posts - 1';
+ $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
}
$sql_data[TOPICS_TABLE] = 'topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
@@ -2231,7 +2231,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- // salvation, a post is found! jam it into the forums table
+ // salvation, a post is found! jam it into the topics table
$sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_id = ' . (int) $row['post_id'];
$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
$sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_time = ' . (int) $row['post_time'];
@@ -2276,6 +2276,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$db->sql_query($sql);
}
+ // Committing the transaction before updating search index
+ $db->sql_transaction('commit');
+
+ // Delete draft if post was loaded...
+ $draft_id = request_var('draft_loaded', 0);
+ if ($draft_id)
+ {
+ $sql = 'DELETE FROM ' . DRAFTS_TABLE . "
+ WHERE draft_id = $draft_id
+ AND user_id = {$user->data['user_id']}";
+ $db->sql_query($sql);
+ }
+
// Index message contents
if ($update_message && $data['enable_indexing'])
{
@@ -2303,16 +2316,6 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id, ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']);
}
- // Delete draft if post was loaded...
- $draft_id = request_var('draft_loaded', 0);
- if ($draft_id)
- {
- $sql = 'DELETE FROM ' . DRAFTS_TABLE . "
- WHERE draft_id = $draft_id
- AND user_id = {$user->data['user_id']}";
- $db->sql_query($sql);
- }
-
// Topic Notification, do not change if moderator is changing other users posts...
if ($user->data['user_id'] == $poster_id)
{
@@ -2331,8 +2334,6 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
}
}
- $db->sql_transaction('commit');
-
if ($mode == 'post' || $mode == 'reply' || $mode == 'quote')
{
// Mark this topic as posted to
diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php
index 862df6e4e1..ca06e05b39 100644
--- a/phpBB/includes/functions_privmsgs.php
+++ b/phpBB/includes/functions_privmsgs.php
@@ -760,7 +760,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
}
if (sizeof($move_msg_ids) && !in_array($dest_folder, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) &&
- !in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) && $cur_folder_id != $dest_folder)
+ !in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)) && $cur_folder_id != $dest_folder)
{
// We have to check the destination folder ;)
if ($dest_folder != PRIVMSGS_INBOX)
@@ -832,6 +832,10 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
$db->sql_query($sql);
}
}
+ }
+ else if (in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)))
+ {
+ trigger_error('CANNOT_MOVE_SPECIAL');
}
return $num_moved;
@@ -864,6 +868,17 @@ function update_unread_status($unread, $msg_id, $user_id, $folder_id)
if ($user->data['user_id'] == $user_id)
{
$user->data['user_unread_privmsg']--;
+
+ // Try to cope with previous wrong conversions...
+ if ($user->data['user_unread_privmsg'] < 0)
+ {
+ $sql = 'UPDATE ' . USERS_TABLE . "
+ SET user_unread_privmsg = 0
+ WHERE user_id = $user_id";
+ $db->sql_query($sql);
+
+ $user->data['user_unread_privmsg'] = 0;
+ }
}
}
diff --git a/phpBB/includes/functions_profile_fields.php b/phpBB/includes/functions_profile_fields.php
index 7c5e39c3a7..f3ebe429cd 100644
--- a/phpBB/includes/functions_profile_fields.php
+++ b/phpBB/includes/functions_profile_fields.php
@@ -14,7 +14,7 @@
*/
class custom_profile
{
- var $profile_types = array(1 => 'int', 2 => 'string', 3 => 'text', 4 => 'bool', 5 => 'dropdown', 6 => 'date');
+ var $profile_types = array(FIELD_INT => 'int', FIELD_STRING => 'string', FIELD_TEXT => 'text', FIELD_BOOL => 'bool', FIELD_DROPDOWN => 'dropdown', FIELD_DATE => 'date');
var $profile_cache = array();
var $options_lang = array();
@@ -69,7 +69,7 @@ class custom_profile
'LANG_NAME' => $row['lang_name'],
'LANG_EXPLAIN' => $row['lang_explain'],
'FIELD' => $tpl_snippet,
- 'FIELD_ID' => ($type == 6 || ($type == 4 && $row['field_length'] == '1')) ? '' : 'pf_' . $row['field_ident'],
+ 'FIELD_ID' => ($type == FIELD_DATE || ($type == FIELD_BOOL && $row['field_length'] == '1')) ? '' : 'pf_' . $row['field_ident'],
'S_REQUIRED' => ($row['field_required']) ? true : false)
);
}
@@ -528,7 +528,7 @@ class custom_profile
}
else
{
- return $this->options_lang[$field_id][$lang_id][(int) ($value + 1)];
+ return $this->options_lang[$field_id][$lang_id][(int) ($value) + 1];
}
break;
@@ -547,8 +547,7 @@ class custom_profile
global $user;
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
- $user_ident = 'pf_' . str_replace('pf_', '', $profile_row['field_ident']);
-
+ $user_ident = $profile_row['field_ident'];
// checkbox - only testing for isset
if ($profile_row['field_type'] == FIELD_BOOL && $profile_row['field_length'] == 2)
{
@@ -619,7 +618,7 @@ class custom_profile
global $user, $template;
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
- $user_ident = 'pf_' . str_replace('pf_', '', $profile_row['field_ident']);
+ $user_ident = $profile_row['field_ident'];
$now = getdate();
@@ -994,7 +993,7 @@ class custom_profile_admin extends custom_profile
);
$options = array(
- 0 => array('TITLE' => $user->lang['FIELD_TYPE'], 'EXPLAIN' => $user->lang['BOOL_TYPE_EXPLAIN'], 'FIELD' => '<label><input type="radio" class="radio" name="field_length" value="1"' . (($this->vars['field_length'] == 1) ? ' checked="checked"' : '') . ' />' . $user->lang['RADIO_BUTTONS'] . '</label><label><input type="radio" class="radio" name="field_length" value="2"' . (($this->vars['field_length'] == 2) ? ' checked="checked"' : '') . ' />' . $user->lang['CHECKBOX'] . '</label>'),
+ 0 => array('TITLE' => $user->lang['FIELD_TYPE'], 'EXPLAIN' => $user->lang['BOOL_TYPE_EXPLAIN'], 'FIELD' => '<label><input type="radio" class="radio" name="field_length" value="1"' . (($this->vars['field_length'] == 1) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $user->lang['RADIO_BUTTONS'] . '</label><label><input type="radio" class="radio" name="field_length" value="2"' . (($this->vars['field_length'] == 2) ? ' checked="checked"' : '') . ' onchange="document.getElementById(\'add_profile_field\').submit();" /> ' . $user->lang['CHECKBOX'] . '</label>'),
1 => array('TITLE' => $user->lang['DEFAULT_VALUE'], 'FIELD' => $this->process_field_row('preview', $profile_row))
);
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index 50e84fca84..0194ec06a4 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -368,40 +368,47 @@ function user_delete($mode, $user_id, $post_username = false)
$post_username = $user->lang['GUEST'];
}
- $sql = 'UPDATE ' . FORUMS_TABLE . '
- SET forum_last_poster_id = ' . ANONYMOUS . ", forum_last_poster_name = '" . $db->sql_escape($post_username) . "', forum_last_poster_colour = ''
- WHERE forum_last_poster_id = $user_id";
- $db->sql_query($sql);
+ // If the user is inactive and newly registered we assume no posts from this user being there...
+ if ($user_row['user_type'] == USER_INACTIVE && $user_row['user_inactive_reason'] == INACTIVE_REGISTER && !$user_row['user_posts'])
+ {
+ }
+ else
+ {
+ $sql = 'UPDATE ' . FORUMS_TABLE . '
+ SET forum_last_poster_id = ' . ANONYMOUS . ", forum_last_poster_name = '" . $db->sql_escape($post_username) . "', forum_last_poster_colour = ''
+ WHERE forum_last_poster_id = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET poster_id = ' . ANONYMOUS . ", post_username = '" . $db->sql_escape($post_username) . "'
- WHERE poster_id = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . POSTS_TABLE . '
+ SET poster_id = ' . ANONYMOUS . ", post_username = '" . $db->sql_escape($post_username) . "'
+ WHERE poster_id = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET post_edit_user = ' . ANONYMOUS . "
- WHERE post_edit_user = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . POSTS_TABLE . '
+ SET post_edit_user = ' . ANONYMOUS . "
+ WHERE post_edit_user = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_poster = ' . ANONYMOUS . ", topic_first_poster_name = '" . $db->sql_escape($post_username) . "', topic_first_poster_colour = ''
- WHERE topic_poster = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . TOPICS_TABLE . '
+ SET topic_poster = ' . ANONYMOUS . ", topic_first_poster_name = '" . $db->sql_escape($post_username) . "', topic_first_poster_colour = ''
+ WHERE topic_poster = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_last_poster_id = ' . ANONYMOUS . ", topic_last_poster_name = '" . $db->sql_escape($post_username) . "', topic_last_poster_colour = ''
- WHERE topic_last_poster_id = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . TOPICS_TABLE . '
+ SET topic_last_poster_id = ' . ANONYMOUS . ", topic_last_poster_name = '" . $db->sql_escape($post_username) . "', topic_last_poster_colour = ''
+ WHERE topic_last_poster_id = $user_id";
+ $db->sql_query($sql);
- // Since we change every post by this author, we need to count this amount towards the anonymous user
+ // Since we change every post by this author, we need to count this amount towards the anonymous user
- // Update the post count for the anonymous user
- if ($user_row['user_posts'])
- {
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_posts = user_posts + ' . $user_row['user_posts'] . '
- WHERE user_id = ' . ANONYMOUS;
- $db->sql_query($sql);
+ // Update the post count for the anonymous user
+ if ($user_row['user_posts'])
+ {
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET user_posts = user_posts + ' . $user_row['user_posts'] . '
+ WHERE user_id = ' . ANONYMOUS;
+ $db->sql_query($sql);
+ }
}
break;
@@ -671,7 +678,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
}
else
{
- trigger_error($user->lang['LENGTH_BAN_INVALID']);
+ trigger_error('LENGTH_BAN_INVALID');
}
}
}
@@ -723,11 +730,11 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
$clean_name = utf8_clean_string($username);
if ($clean_name == $user->data['username_clean'])
{
- trigger_error($user->lang['CANNOT_BAN_YOURSELF']);
+ trigger_error('CANNOT_BAN_YOURSELF', E_USER_WARNING);
}
if (in_array($clean_name, $founder_names))
{
- trigger_error($user->lang['CANNOT_BAN_FOUNDER']);
+ trigger_error('CANNOT_BAN_FOUNDER', E_USER_WARNING);
}
$sql_usernames[] = $clean_name;
}
@@ -736,7 +743,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
// Make sure we have been given someone to ban
if (!sizeof($sql_usernames))
{
- trigger_error($user->lang['NO_USER_SPECIFIED']);
+ trigger_error('NO_USER_SPECIFIED');
}
$sql = 'SELECT user_id
@@ -759,13 +766,13 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
{
do
{
- $banlist_ary[] = $row['user_id'];
+ $banlist_ary[] = (int) $row['user_id'];
}
while ($row = $db->sql_fetchrow($result));
}
else
{
- trigger_error($user->lang['NO_USERS']);
+ trigger_error('NO_USERS');
}
$db->sql_freeresult($result);
}
@@ -842,7 +849,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
else if (preg_match('#^\*$#', trim($ban_item)))
{
// Ban all IPs
- $banlist_ary[] = "*";
+ $banlist_ary[] = '*';
}
else if (preg_match('#^([\w\-_]\.?){2,}$#is', trim($ban_item)))
{
@@ -952,11 +959,11 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
{
$sql_ary[] = array(
$type => $ban_entry,
- 'ban_start' => $current_time,
- 'ban_end' => $ban_end,
- 'ban_exclude' => $ban_exclude,
- 'ban_reason' => $ban_reason,
- 'ban_give_reason' => $ban_give_reason,
+ 'ban_start' => (int) $current_time,
+ 'ban_end' => (int) $ban_end,
+ 'ban_exclude' => (int) $ban_exclude,
+ 'ban_reason' => (string) $ban_reason,
+ 'ban_give_reason' => (string) $ban_give_reason,
);
}
@@ -1277,7 +1284,7 @@ function validate_username($username, $allowed_username = false)
$mbstring = $pcre = false;
// generic UTF-8 character types supported?
- if (version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>=')))
+ if ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false)
{
$pcre = true;
}
@@ -1296,12 +1303,12 @@ function validate_username($username, $allowed_username = false)
case 'USERNAME_ALPHA_ONLY':
$pcre = true;
- $regex = '[A-Za-z]+';
+ $regex = '[A-Za-z0-9]+';
break;
case 'USERNAME_ALPHA_SPACERS':
$pcre = true;
- $regex = '[A-Za-z-\]_+ ]+';
+ $regex = '[A-Za-z0-9-[\]_+ ]+';
break;
case 'USERNAME_LETTER_NUM':
@@ -1388,7 +1395,7 @@ function validate_username($username, $allowed_username = false)
foreach ($bad_usernames as $bad_username)
{
- if (preg_match('#^' . $bad_username . '#', $clean_username))
+ if (preg_match('#^' . $bad_username . '$#', $clean_username))
{
return 'USERNAME_DISALLOWED';
}
@@ -1428,7 +1435,7 @@ function validate_password($password)
$pcre = $mbstring = false;
// generic UTF-8 character types supported?
- if (version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>=')))
+ if ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false)
{
$upp = '\p{Lu}';
$low = '\p{Ll}';
@@ -1493,7 +1500,7 @@ function validate_password($password)
{
foreach ($chars as $char)
{
- if (!mb_ereg_match($char, $password))
+ if (mb_ereg($char, $password) === false)
{
return 'INVALID_CHARS';
}
@@ -1813,13 +1820,13 @@ function avatar_remote($data, &$error)
}
// Make sure getimagesize works...
- if (($image_data = @getimagesize($data['remotelink'])) === false)
+ if (($image_data = @getimagesize($data['remotelink'])) === false && (empty($data['width']) || empty($data['height'])))
{
$error[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];
return false;
}
- if ($image_data[0] < 2 || $image_data[1] < 2)
+ if (!empty($image_data) && ($image_data[0] < 2 || $image_data[1] < 2))
{
$error[] = $user->lang['AVATAR_NO_SIZE'];
return false;
@@ -1839,7 +1846,7 @@ function avatar_remote($data, &$error)
$types = fileupload::image_types();
$extension = strtolower(filespec::get_extension($data['remotelink']));
- if (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]]))
+ if (!empty($image_data) && (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]])))
{
if (!isset($types[$image_data[2]]))
{
@@ -2389,7 +2396,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
if (sizeof($user_ary))
{
- group_set_user_default($group_id, $user_ary, $sql_ary);
+ group_set_user_default($group_id, $user_ary, $sql_ary, false, true);
}
}
@@ -2567,10 +2574,10 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
foreach ($add_id_ary as $user_id)
{
$sql_ary[] = array(
- 'user_id' => $user_id,
- 'group_id' => $group_id,
- 'group_leader' => $leader,
- 'user_pending' => $pending,
+ 'user_id' => (int) $user_id,
+ 'group_id' => (int) $group_id,
+ 'group_leader' => (int) $leader,
+ 'user_pending' => (int) $pending,
);
}
@@ -2886,7 +2893,7 @@ function group_validate_groupname($group_id, $group_name)
*
* @private
*/
-function group_set_user_default($group_id, $user_id_ary, $group_attributes = false, $update_listing = false)
+function group_set_user_default($group_id, $user_id_ary, $group_attributes = false, $update_listing = false, $same_group = false)
{
global $db;
@@ -2923,8 +2930,8 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
{
if (isset($group_attributes[$attribute]))
{
- // If we are about to set an avatar, we will not overwrite user avatars if no group avatar is set...
- if (strpos($attribute, 'group_avatar') === 0 && !$group_attributes[$attribute])
+ // If we are about to set an avatar or rank, we will not overwrite with empty, unless we are not actually changing the default group
+ if (!$same_group && (strpos($attribute, 'group_avatar') === 0 || strpos($attribute, 'group_rank') === 0) && !$group_attributes[$attribute])
{
continue;
}
diff --git a/phpBB/includes/mcp/mcp_ban.php b/phpBB/includes/mcp/mcp_ban.php
index f2ecbdef5b..d7c1b28b77 100644
--- a/phpBB/includes/mcp/mcp_ban.php
+++ b/phpBB/includes/mcp/mcp_ban.php
@@ -37,12 +37,18 @@ class mcp_ban
{
// Grab the list of entries
- $ban = request_var('ban', '', ($mode === 'user') true ? false);
+ $ban = request_var('ban', '', ($mode === 'user') ? true : false);
+
+ if ($mode === 'user')
+ {
+ $ban = utf8_normalize_nfc($ban);
+ }
+
$ban_len = request_var('banlength', 0);
$ban_len_other = request_var('banlengthother', '');
$ban_exclude = request_var('banexclude', 0);
- $ban_reason = request_var('banreason', '', true);
- $ban_give_reason = request_var('bangivereason', '', true);
+ $ban_reason = utf8_normalize_nfc(request_var('banreason', '', true));
+ $ban_give_reason = utf8_normalize_nfc(request_var('bangivereason', '', true));
if ($ban)
diff --git a/phpBB/includes/mcp/mcp_forum.php b/phpBB/includes/mcp/mcp_forum.php
index 0578170d7b..d4c6f1f395 100644
--- a/phpBB/includes/mcp/mcp_forum.php
+++ b/phpBB/includes/mcp/mcp_forum.php
@@ -276,7 +276,7 @@ function mcp_resync_topics($topic_ids)
if (!sizeof($topic_ids))
{
- trigger_error($user->lang['NO_TOPIC_SELECTED']);
+ trigger_error('NO_TOPIC_SELECTED');
}
if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
@@ -396,7 +396,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
// If the topic no longer exist, we will update the topic watch table.
// To not let it error out on users watching both topics, we just return on an error...
$db->sql_return_on_error(true);
- $db->sql_query('UPDATE ' . TOPICS_WATCH_TABLE . ' SET topic_id = ' . $to_topic_id . ' WHERE ' . $db->sql_in_set('topic_id', $topic_ids));
+ $db->sql_query('UPDATE ' . TOPICS_WATCH_TABLE . ' SET topic_id = ' . (int) $to_topic_id . ' WHERE ' . $db->sql_in_set('topic_id', $topic_ids));
$db->sql_return_on_error(false);
$db->sql_query('DELETE FROM ' . TOPICS_WATCH_TABLE . ' WHERE ' . $db->sql_in_set('topic_id', $topic_ids));
diff --git a/phpBB/includes/mcp/mcp_front.php b/phpBB/includes/mcp/mcp_front.php
index 8bebbc71bd..de607df297 100644
--- a/phpBB/includes/mcp/mcp_front.php
+++ b/phpBB/includes/mcp/mcp_front.php
@@ -227,7 +227,7 @@ function mcp_front_view($id, $mode, $action)
// Latest 5 logs
if ($module->loaded('logs'))
{
- $forum_list = get_forum_list(array('m_', 'a_'));
+ $forum_list = get_forum_list('m_');
if (!empty($forum_list))
{
diff --git a/phpBB/includes/mcp/mcp_logs.php b/phpBB/includes/mcp/mcp_logs.php
index cec097cd8a..d16cdf0196 100755
--- a/phpBB/includes/mcp/mcp_logs.php
+++ b/phpBB/includes/mcp/mcp_logs.php
@@ -55,54 +55,92 @@ class mcp_logs
$this->tpl_name = 'mcp_logs';
$this->page_title = 'MCP_LOGS';
+ $forum_list = get_forum_list('m_');
+ $forum_list[] = 0;
+
$forum_id = $topic_id = 0;
+
switch ($mode)
{
case 'front':
- $where_sql = '';
break;
case 'forum_logs':
$forum_id = request_var('f', 0);
- $where_sql = " AND forum_id = $forum_id";
+
+ if (!in_array($forum_id, $forum_list))
+ {
+ trigger_error('NOT_AUTHORISED');
+ }
+
+ $forum_list = array($forum_id);
break;
case 'topic_logs':
$topic_id = request_var('t', 0);
- $where_sql = " AND topic_id = $topic_id";
+
+ $sql = 'SELECT forum_id
+ FROM ' . TOPICS_TABLE . '
+ WHERE topic_id = ' . $topic_id;
+ $result = $db->sql_query($sql);
+ $forum_id = (int) $db->sql_fetchfield('forum_id');
+ $db->sql_freeresult($result);
+
+ if (!in_array($forum_id, $forum_list))
+ {
+ trigger_error('NOT_AUTHORISED');
+ }
+
+ $forum_list = array($forum_id);
break;
}
// Delete entries if requested and able
if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs'))
{
- if ($deletemark)
+ if (confirm_box(true))
{
- if (!sizeof($marked))
+ if ($deletemark && sizeof($marked))
{
- $where_sql = '';
+ $sql = 'DELETE FROM ' . LOG_TABLE . '
+ WHERE log_type = ' . LOG_MOD . '
+ AND ' . $db->sql_in_set('forum_id', $forum_list) . '
+ AND ' . $db->sql_in_set('log_id', $marked);
+ $db->sql_query($sql);
+
+ add_log('admin', 'LOG_CLEAR_MOD');
}
- else
+ else if ($deleteall)
{
- $sql_in = array();
- foreach ($marked as $mark)
+ $sql = 'DELETE FROM ' . LOG_TABLE . '
+ WHERE log_type = ' . LOG_MOD . '
+ AND ' . $db->sql_in_set('forum_id', $forum_list);
+
+ if ($mode == 'topic_logs')
{
- $sql_in[] = $mark;
+ $sql .= ' AND topic_id = ' . $topic_id;
}
+ $db->sql_query($sql);
- $where_sql = ' AND ' . $db->sql_in_set('log_id', $sql_in);
- unset($sql_in);
+ add_log('admin', 'LOG_CLEAR_MOD');
}
}
-
- if ($where_sql || $deleteall)
+ else
{
- $sql = 'DELETE FROM ' . LOG_TABLE . '
- WHERE log_type = ' . LOG_MOD . "
- $where_sql";
- $db->sql_query($sql);
-
- add_log('admin', 'LOG_CLEAR_MOD');
+ confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
+ 'f' => $forum_id,
+ 't' => $topic_id,
+ 'start' => $start,
+ 'delmarked' => $deletemark,
+ 'delall' => $deleteall,
+ 'mark' => $marked,
+ 'st' => $sort_days,
+ 'sk' => $sort_key,
+ 'sd' => $sort_dir,
+ 'i' => $id,
+ 'mode' => $mode,
+ 'action' => request_var('action', array('' => ''))))
+ );
}
}
@@ -121,7 +159,7 @@ class mcp_logs
// Grab log data
$log_data = array();
$log_count = 0;
- view_log('mod', $log_data, $log_count, $config['topics_per_page'], $start, $forum_id, $topic_id, 0, $sql_where, $sql_sort);
+ view_log('mod', $log_data, $log_count, $config['topics_per_page'], $start, $forum_list, $topic_id, 0, $sql_where, $sql_sort);
$template->assign_vars(array(
'PAGE_NUMBER' => on_page($log_count, $config['topics_per_page'], $start),
diff --git a/phpBB/includes/mcp/mcp_main.php b/phpBB/includes/mcp/mcp_main.php
index a8f6985089..a08e0e8c1d 100644
--- a/phpBB/includes/mcp/mcp_main.php
+++ b/phpBB/includes/mcp/mcp_main.php
@@ -570,10 +570,15 @@ function mcp_move_topic($topic_ids)
}
}
}
+ else if (isset($_POST['confirm']))
+ {
+ $additional_msg = $user->lang['FORUM_NOT_EXIST'];
+ }
if (!$to_forum_id || $additional_msg)
{
unset($_POST['confirm']);
+ unset($_REQUEST['confirm_key']);
}
if (confirm_box(true))
@@ -964,10 +969,15 @@ function mcp_fork_topic($topic_ids)
}
}
}
+ else if (isset($_POST['confirm']))
+ {
+ $additional_msg = $user->lang['FORUM_NOT_EXIST'];
+ }
- if (!$to_forum_id || $additional_msg)
+ if ($additional_msg)
{
unset($_POST['confirm']);
+ unset($_REQUEST['confirm_key']);
}
if (confirm_box(true))
@@ -1132,9 +1142,9 @@ function mcp_fork_topic($topic_ids)
while ($row = $db->sql_fetchrow($result))
{
$sql_ary[] = array(
- 'topic_id' => $new_topic_id,
- 'user_id' => $row['user_id'],
- 'notify_status' => $row['notify_status'],
+ 'topic_id' => (int) $new_topic_id,
+ 'user_id' => (int) $row['user_id'],
+ 'notify_status' => (int) $row['notify_status'],
);
}
$db->sql_freeresult($result);
diff --git a/phpBB/includes/mcp/mcp_notes.php b/phpBB/includes/mcp/mcp_notes.php
index 447d000cb4..391d41b6fb 100755
--- a/phpBB/includes/mcp/mcp_notes.php
+++ b/phpBB/includes/mcp/mcp_notes.php
@@ -86,7 +86,7 @@ class mcp_notes
if (!$userrow)
{
- trigger_error($user->lang['NO_USER']);
+ trigger_error('NO_USER');
}
$user_id = $userrow['user_id'];
@@ -103,7 +103,7 @@ class mcp_notes
$deletemark = ($action == 'del_marked') ? true : false;
$deleteall = ($action == 'del_all') ? true : false;
$marked = request_var('marknote', array(0));
- $usernote = request_var('usernote', '', true);
+ $usernote = utf8_normalize_nfc(request_var('usernote', '', true));
// Handle any actions
if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs'))
diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php
index dc8733d0a5..698bcc8dd6 100644
--- a/phpBB/includes/mcp/mcp_post.php
+++ b/phpBB/includes/mcp/mcp_post.php
@@ -26,7 +26,7 @@ function mcp_post_details($id, $mode, $action)
if (!sizeof($post_info))
{
- trigger_error($user->lang['POST_NOT_EXIST']);
+ trigger_error('POST_NOT_EXIST');
}
$post_info = $post_info[$post_id];
@@ -79,7 +79,7 @@ function mcp_post_details($id, $mode, $action)
if (!$row)
{
- trigger_error($user->lang['NO_USER']);
+ trigger_error('NO_USER');
}
if ($auth->acl_get('m_chgposter', $post_info['forum_id']))
@@ -473,7 +473,7 @@ function change_poster(&$post_info, $userdata)
if (!sizeof($post_info))
{
- trigger_error($user->lang['POST_NOT_EXIST']);
+ trigger_error('POST_NOT_EXIST');
}
$post_info = $post_info[$post_id];
diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
index d3af2caa24..06cabf65a0 100644
--- a/phpBB/includes/mcp/mcp_queue.php
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -224,7 +224,7 @@ class mcp_queue
if (!sizeof($topic_info))
{
- trigger_error($user->lang['TOPIC_NOT_EXIST']);
+ trigger_error('TOPIC_NOT_EXIST');
}
$topic_info = $topic_info[$topic_id];
@@ -733,8 +733,8 @@ function disapprove_post($post_id_list, $id, $mode)
trigger_error('NOT_AUTHORISED');
}
- $redirect = request_var('redirect', build_url(array('t', 'mode', '_f_', 'quickmod')) . '&amp;mode=unapproved_topics');
- $reason = request_var('reason', '', true);
+ $redirect = request_var('redirect', build_url(array('t', 'mode', '_f_', 'quickmod')) . "&amp;mode=$mode");
+ $reason = utf8_normalize_nfc(request_var('reason', '', true));
$reason_id = request_var('reason_id', 0);
$success_msg = $additional_msg = '';
diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php
index 8617cb5ca7..9a06b3bbf2 100755
--- a/phpBB/includes/mcp/mcp_reports.php
+++ b/phpBB/includes/mcp/mcp_reports.php
@@ -242,7 +242,7 @@ class mcp_reports
if (!sizeof($topic_info))
{
- trigger_error($user->lang['TOPIC_NOT_EXIST']);
+ trigger_error('TOPIC_NOT_EXIST');
}
$topic_info = $topic_info[$topic_id];
diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php
index ef41ede5c4..a5bfba23fe 100644
--- a/phpBB/includes/mcp/mcp_topic.php
+++ b/phpBB/includes/mcp/mcp_topic.php
@@ -25,7 +25,7 @@ function mcp_topic_view($id, $mode, $action)
if (!sizeof($topic_info))
{
- trigger_error($user->lang['TOPIC_NOT_EXIST']);
+ trigger_error('TOPIC_NOT_EXIST');
}
$topic_info = $topic_info[$topic_id];
@@ -34,6 +34,7 @@ function mcp_topic_view($id, $mode, $action)
$icon_id = request_var('icon', 0);
$subject = utf8_normalize_nfc(request_var('subject', '', true));
$start = request_var('start', 0);
+ $forum_id = request_var('f', 0);
$to_topic_id = request_var('to_topic_id', 0);
$to_forum_id = request_var('to_forum_id', 0);
$post_id_list = request_var('post_id_list', array(0));
@@ -215,7 +216,7 @@ function mcp_topic_view($id, $mode, $action)
'S_CHECKED' => ($post_id_list && in_array(intval($row['post_id']), $post_id_list)) ? true : false,
'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false,
- 'U_POST_DETAILS' => "$url&amp;i=$id&amp;p={$row['post_id']}&amp;mode=post_details",
+ 'U_POST_DETAILS' => "$url&amp;i=$id&amp;p={$row['post_id']}&amp;mode=post_details" . (($forum_id) ? "&amp;f=$forum_id" : ''),
'U_MCP_APPROVE' => ($auth->acl_get('m_approve', $topic_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $topic_info['forum_id'] . '&amp;p=' . $row['post_id']) : '',
'U_MCP_REPORT' => ($auth->acl_get('m_report', $topic_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $topic_info['forum_id'] . '&amp;p=' . $row['post_id']) : '')
);
@@ -439,7 +440,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
if (!sizeof($post_id_list))
{
- trigger_error($user->lang['NO_POST_SELECTED']);
+ trigger_error('NO_POST_SELECTED');
}
$icon_id = request_var('icon', 0);
@@ -571,10 +572,10 @@ function merge_posts($topic_id, $to_topic_id)
// If the topic no longer exist, we will update the topic watch table.
// To not let it error out on users watching both topics, we just return on an error...
$db->sql_return_on_error(true);
- $db->sql_query('UPDATE ' . TOPICS_WATCH_TABLE . ' SET topic_id = ' . $to_topic_id . ' WHERE topic_id = ' . $topic_id);
+ $db->sql_query('UPDATE ' . TOPICS_WATCH_TABLE . ' SET topic_id = ' . (int) $to_topic_id . ' WHERE topic_id = ' . (int) $topic_id);
$db->sql_return_on_error(false);
- $db->sql_query('DELETE FROM ' . TOPICS_WATCH_TABLE . ' WHERE topic_id = ' . $topic_id);
+ $db->sql_query('DELETE FROM ' . TOPICS_WATCH_TABLE . ' WHERE topic_id = ' . (int) $topic_id);
}
// Link to the new topic
diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php
index 16339ddf55..915df898f7 100755
--- a/phpBB/includes/mcp/mcp_warn.php
+++ b/phpBB/includes/mcp/mcp_warn.php
@@ -191,7 +191,7 @@ class mcp_warn
$post_id = request_var('p', 0);
$forum_id = request_var('f', 0);
$notify = (isset($_REQUEST['notify_user'])) ? true : false;
- $warning = request_var('warning', '', true);
+ $warning = utf8_normalize_nfc(request_var('warning', '', true));
$sql = 'SELECT u.*, p.*
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u
@@ -203,19 +203,19 @@ class mcp_warn
if (!$user_row)
{
- trigger_error($user->lang['NO_POST']);
+ trigger_error('NO_POST');
}
// There is no point issuing a warning to ignored users (ie anonymous and bots)
if ($user_row['user_type'] == USER_IGNORE)
{
- trigger_error($user->lang['CANNOT_WARN_ANONYMOUS']);
+ trigger_error('CANNOT_WARN_ANONYMOUS');
}
// Prevent someone from warning themselves
if ($user_row['user_id'] == $user->data['user_id'])
{
- trigger_error($user->lang['CANNOT_WARN_SELF']);
+ trigger_error('CANNOT_WARN_SELF');
}
// Check if there is already a warning for this post to prevent multiple
@@ -229,7 +229,7 @@ class mcp_warn
if ($row)
{
- trigger_error($user->lang['ALREADY_WARNED']);
+ trigger_error('ALREADY_WARNED');
}
$user_id = $user_row['user_id'];
@@ -306,7 +306,7 @@ class mcp_warn
$user_id = request_var('u', 0);
$username = request_var('username', '', true);
$notify = (isset($_REQUEST['notify_user'])) ? true : false;
- $warning = request_var('warning', '', true);
+ $warning = utf8_normalize_nfc(request_var('warning', '', true));
$sql_where = ($user_id) ? "user_id = $user_id" : "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
@@ -325,7 +325,7 @@ class mcp_warn
// Prevent someone from warning themselves
if ($user_row['user_id'] == $user->data['user_id'])
{
- trigger_error($user->lang['CANNOT_WARN_SELF']);
+ trigger_error('CANNOT_WARN_SELF');
}
$user_id = $user_row['user_id'];
diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php
index 3579467bff..ea28061da0 100644
--- a/phpBB/includes/message_parser.php
+++ b/phpBB/includes/message_parser.php
@@ -116,7 +116,7 @@ class bbcode_firstpass extends bbcode
'b' => array('bbcode_id' => 1, 'regexp' => array('#\[b\](.*?)\[/b\]#ise' => "\$this->bbcode_strong('\$1')")),
'i' => array('bbcode_id' => 2, 'regexp' => array('#\[i\](.*?)\[/i\]#ise' => "\$this->bbcode_italic('\$1')")),
'url' => array('bbcode_id' => 3, 'regexp' => array('#\[url(=(.*))?\](.*)\[/url\]#iUe' => "\$this->validate_url('\$2', '\$3')")),
- 'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](https?://)([a-z0-9\-\.,\?!%\*_:;~\\&$@/=\+]+)\[/img\]#ie' => "\$this->bbcode_img('\$1\$2')")),
+ 'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](.*)\[/img\]#iUe' => "\$this->bbcode_img('\$1')")),
'size' => array('bbcode_id' => 5, 'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#ise' => "\$this->bbcode_size('\$1', '\$2')")),
'color' => array('bbcode_id' => 6, 'regexp' => array('!\[color=(#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!ise' => "\$this->bbcode_color('\$1', '\$2')")),
'u' => array('bbcode_id' => 7, 'regexp' => array('#\[u\](.*?)\[/u\]#ise' => "\$this->bbcode_underline('\$1')")),
@@ -278,6 +278,20 @@ class bbcode_firstpass extends bbcode
$in = trim($in);
$error = false;
+ $in = str_replace(' ', '%20', $in);
+
+ // Checking urls
+ if (!preg_match('#^' . get_preg_expression('url') . '$#i', $in) && !preg_match('#^' . get_preg_expression('www_url') . '$#i', $in))
+ {
+ return '[img]' . $in . '[/img]';
+ }
+
+ // Try to cope with a common user error... not specifying a protocol but only a subdomain
+ if (!preg_match('#^[a-z0-9]+://#i', $in))
+ {
+ $in = 'http://' . $in;
+ }
+
if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width'])
{
$stats = @getimagesize($in);
@@ -1228,6 +1242,11 @@ class parse_message extends bbcode_firstpass
while ($row = $db->sql_fetchrow($result))
{
+ if (empty($row['code']))
+ {
+ continue;
+ }
+
// (assertion)
$match[] = '(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>)';
$replace[] = '<!-- s' . $row['code'] . ' --><img src="{SMILIES_PATH}/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" /><!-- s' . $row['code'] . ' -->';
@@ -1496,7 +1515,7 @@ class parse_message extends bbcode_firstpass
if (sizeof($not_orphan))
{
- trigger_error($user->lang['NO_ACCESS_ATTACHMENT'], E_USER_ERROR);
+ trigger_error('NO_ACCESS_ATTACHMENT', E_USER_ERROR);
}
// Regenerate newly uploaded attachments
@@ -1522,7 +1541,7 @@ class parse_message extends bbcode_firstpass
if (sizeof($orphan))
{
- trigger_error($user->lang['NO_ACCESS_ATTACHMENT'], E_USER_ERROR);
+ trigger_error('NO_ACCESS_ATTACHMENT', E_USER_ERROR);
}
ksort($this->attachment_data);
diff --git a/phpBB/includes/search/fulltext_mysql.php b/phpBB/includes/search/fulltext_mysql.php
index 760b0753f2..38022a21c4 100644
--- a/phpBB/includes/search/fulltext_mysql.php
+++ b/phpBB/includes/search/fulltext_mysql.php
@@ -43,7 +43,11 @@ class fulltext_mysql extends search_backend
if (version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>=')))
{
- $this->pcre_properties = true;
+ // While this is the proper range of PHP versions, PHP may not be linked with the bundled PCRE lib and instead with an older version
+ if (@preg_match('/\p{L}/u', 'a') !== false)
+ {
+ $this->pcre_properties = true;
+ }
}
if (function_exists('mb_ereg'))
@@ -490,7 +494,7 @@ class fulltext_mysql extends search_backend
* @param int $per_page number of ids each page is supposed to contain
* @return total number of results
*/
- function author_search($type, &$sort_by_sql, &$sort_key, &$sort_dir, &$sort_days, &$ex_fid_ary, &$m_approve_fid_ary, &$topic_id, &$author_ary, &$id_ary, $start, $per_page)
+ function author_search($type, $firstpost_only, &$sort_by_sql, &$sort_key, &$sort_dir, &$sort_days, &$ex_fid_ary, &$m_approve_fid_ary, &$topic_id, &$author_ary, &$id_ary, $start, $per_page)
{
global $config, $db;
@@ -504,6 +508,7 @@ class fulltext_mysql extends search_backend
$search_key = md5(implode('#', array(
'',
$type,
+ ($firstpost_only) ? 'firstpost' : '',
'',
'',
$sort_days,
@@ -528,6 +533,7 @@ class fulltext_mysql extends search_backend
$sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
$sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
+ $sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
// Build sql strings for sorting
$sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
@@ -570,9 +576,10 @@ class fulltext_mysql extends search_backend
if ($type == 'posts')
{
$sql = "SELECT {$calc_results}p.post_id
- FROM " . $sql_sort_table . POSTS_TABLE . " p
+ FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
WHERE $sql_author
$sql_topic_id
+ $sql_firstpost
$m_approve_fid_sql
$sql_fora
$sql_sort_join
@@ -586,6 +593,7 @@ class fulltext_mysql extends search_backend
FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
WHERE $sql_author
$sql_topic_id
+ $sql_firstpost
$m_approve_fid_sql
$sql_fora
AND t.topic_id = p.topic_id
diff --git a/phpBB/includes/search/fulltext_native.php b/phpBB/includes/search/fulltext_native.php
index 1f375c8f51..ac3fc14f4f 100755
--- a/phpBB/includes/search/fulltext_native.php
+++ b/phpBB/includes/search/fulltext_native.php
@@ -744,6 +744,7 @@ class fulltext_native extends search_backend
* Performs a search on an author's posts without caring about message contents. Depends on display specific params
*
* @param string $type contains either posts or topics depending on what should be searched for
+ * @param boolean $firstpost_only if true, only topic starting posts will be considered
* @param array &$sort_by_sql contains SQL code for the ORDER BY part of a query
* @param string &$sort_key is the key of $sort_by_sql for the selected sorting
* @param string &$sort_dir is either a or d representing ASC and DESC
@@ -759,7 +760,7 @@ class fulltext_native extends search_backend
*
* @access public
*/
- function author_search($type, &$sort_by_sql, &$sort_key, &$sort_dir, &$sort_days, &$ex_fid_ary, &$m_approve_fid_ary, &$topic_id, &$author_ary, &$id_ary, $start, $per_page)
+ function author_search($type, $firstpost_only, &$sort_by_sql, &$sort_key, &$sort_dir, &$sort_days, &$ex_fid_ary, &$m_approve_fid_ary, &$topic_id, &$author_ary, &$id_ary, $start, $per_page)
{
global $config, $db;
@@ -773,6 +774,7 @@ class fulltext_native extends search_backend
$search_key = md5(implode('#', array(
'',
$type,
+ ($firstpost_only) ? 'firstpost' : '',
'',
'',
$sort_days,
@@ -797,6 +799,7 @@ class fulltext_native extends search_backend
$sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
+ $sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
// Build sql strings for sorting
$sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
@@ -850,9 +853,10 @@ class fulltext_native extends search_backend
if ($type == 'posts')
{
$sql = 'SELECT COUNT(p.post_id) as total_results
- FROM ' . POSTS_TABLE . " p
+ FROM ' . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
WHERE $sql_author
$sql_topic_id
+ $sql_firstpost
$m_approve_fid_sql
$sql_fora
$sql_time";
@@ -872,6 +876,7 @@ class fulltext_native extends search_backend
$sql .= ' FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
WHERE $sql_author
$sql_topic_id
+ $sql_firstpost
$m_approve_fid_sql
$sql_fora
AND t.topic_id = p.topic_id
@@ -894,9 +899,10 @@ class fulltext_native extends search_backend
if ($type == 'posts')
{
$sql = "SELECT $select
- FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($topic_id) ? ', ' . TOPICS_TABLE . ' t' : '') . "
+ FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($topic_id || $firstpost_only) ? ', ' . TOPICS_TABLE . ' t' : '') . "
WHERE $sql_author
$sql_topic_id
+ $sql_firstpost
$m_approve_fid_sql
$sql_fora
$sql_sort_join
@@ -910,6 +916,7 @@ class fulltext_native extends search_backend
FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
WHERE $sql_author
$sql_topic_id
+ $sql_firstpost
$m_approve_fid_sql
$sql_fora
AND t.topic_id = p.topic_id
@@ -1127,7 +1134,7 @@ class fulltext_native extends search_backend
foreach ($new_words as $word)
{
- $sql_ary[] = array('word_text' => $word, 'word_count' => 0);
+ $sql_ary[] = array('word_text' => (string) $word, 'word_count' => 0);
}
$db->sql_return_on_error(true);
$db->sql_multi_insert(SEARCH_WORDLIST_TABLE, $sql_ary);
@@ -1176,9 +1183,9 @@ class fulltext_native extends search_backend
if (sizeof($word_ary))
{
- $sql = 'INSERT INTO ' . SEARCH_WORDMATCH_TABLE . " (post_id, word_id, title_match)
- SELECT $post_id, word_id, $title_match
- FROM " . SEARCH_WORDLIST_TABLE . '
+ $sql = 'INSERT INTO ' . SEARCH_WORDMATCH_TABLE . ' (post_id, word_id, title_match)
+ SELECT ' . (int) $post_id . ', word_id, ' . (int) $title_match . '
+ FROM ' . SEARCH_WORDLIST_TABLE . '
WHERE ' . $db->sql_in_set('word_text', $word_ary);
$db->sql_query($sql);
diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php
index 495fdcee48..9d5f91a698 100644
--- a/phpBB/includes/session.php
+++ b/phpBB/includes/session.php
@@ -43,7 +43,7 @@ class session
if (!$script_name)
{
$script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
- $script_name = (($pos = strpos($script_name, '?')) !== false) ? substr($script_name, 0, strpos($script_name, '?')) : $script_name;
+ $script_name = (($pos = strpos($script_name, '?')) !== false) ? substr($script_name, 0, $pos) : $script_name;
$page_array['failover'] = 1;
}
@@ -122,7 +122,7 @@ class session
*
* This is where all session activity begins. We gather various pieces of
* information from the client and server. We test to see if a session already
- * exists. If it does, fine and dandy. If it doesn't we'll go on to create a
+ * exists. If it does, fine and dandy. If it doesn't we'll go on to create a
* new one ... pretty logical heh? We also examine the system load (if we're
* running on a system which makes such information readily available) and
* halt if it's above an admin definable limit.
@@ -132,7 +132,7 @@ class session
*/
function session_begin($update_session_page = true)
{
- global $phpEx, $SID, $_SID, $db, $config, $phpbb_root_path;
+ global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path;
// Give us some basic information
$this->time_now = time();
@@ -193,6 +193,8 @@ class session
$SID = '?sid=' . $this->session_id;
}
+ $_EXTRA_URL = array();
+
// Why no forwarded_for et al? Well, too easily spoofed. With the results of my recent requests
// it's pretty clear that in the majority of cases you'll at least be left with a proxy/cache ip.
$this->ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars($_SERVER['REMOTE_ADDR']) : '';
@@ -301,6 +303,7 @@ class session
$this->data['is_registered'] = ($this->data['user_id'] != ANONYMOUS && ($this->data['user_type'] == USER_NORMAL || $this->data['user_type'] == USER_FOUNDER)) ? true : false;
$this->data['is_bot'] = (!$this->data['is_registered'] && $this->data['user_id'] != ANONYMOUS) ? true : false;
+ $this->data['user_lang'] = basename($this->data['user_lang']);
return true;
}
@@ -308,7 +311,7 @@ class session
else
{
// Added logging temporarly to help debug bugs...
- if (defined('DEBUG_EXTRA'))
+ if (defined('DEBUG_EXTRA') && $this->data['user_id'] != ANONYMOUS)
{
add_log('critical', 'LOG_IP_BROWSER_FORWARDED_CHECK', $u_ip, $s_ip, $u_browser, $s_browser, htmlspecialchars($u_forwarded_for), htmlspecialchars($s_forwarded_for));
}
@@ -319,7 +322,7 @@ class session
// If we reach here then no (valid) session exists. So we'll create a new one
return $this->session_create();
}
-
+
/**
* Create a new session
*
@@ -354,7 +357,7 @@ class session
* check. We loop through the list of bots defined by the admin and
* see if we have any useragent and/or IP matches. If we do, this is a
* bot, act accordingly
- */
+ */
$bot = false;
$active_bots = $cache->obtain_bots();
@@ -406,7 +409,7 @@ class session
// Else if we've been passed a user_id we'll grab data based on that
if (isset($this->cookie_data['k']) && $this->cookie_data['k'] && $this->cookie_data['u'] && !sizeof($this->data))
{
- $sql = 'SELECT u.*
+ $sql = 'SELECT u.*
FROM ' . USERS_TABLE . ' u, ' . SESSIONS_KEYS_TABLE . ' k
WHERE u.user_id = ' . (int) $this->cookie_data['u'] . '
AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ")
@@ -431,7 +434,7 @@ class session
$db->sql_freeresult($result);
$bot = false;
}
-
+
// If no data was returned one or more of the following occurred:
// Key didn't match one in the DB
// User does not exist
@@ -564,7 +567,7 @@ class session
'session_start' => (int) $this->time_now,
'session_last_visit' => (int) $this->data['session_last_visit'],
'session_time' => (int) $this->time_now,
- 'session_browser' => (string) $this->browser,
+ 'session_browser' => (string) substr($this->browser, 0, 149),
'session_forwarded_for' => (string) $this->forwarded_for,
'session_ip' => (string) $this->ip,
'session_autologin' => ($session_autologin) ? 1 : 0,
@@ -587,7 +590,7 @@ class session
if (!defined('IN_ERROR_HANDLER') && (!$this->session_id || !$db->sql_query($sql) || !$db->sql_affectedrows()))
{
// Limit new sessions in 1 minute period (if required)
- if ((!isset($this->data['session_time']) || !$this->data['session_time']) && $config['active_sessions'])
+ if (empty($this->data['session_time']) && $config['active_sessions'])
{
$sql = 'SELECT COUNT(session_id) AS sessions
FROM ' . SESSIONS_TABLE . '
@@ -648,7 +651,7 @@ class session
$SID = '?sid=';
$_SID = '';
}
-
+
return true;
}
@@ -676,7 +679,7 @@ class session
$method = 'logout_' . $method;
if (function_exists($method))
{
- $method($this->data);
+ $method($this->data, $new_session);
}
if ($this->data['user_id'] != ANONYMOUS)
@@ -823,7 +826,7 @@ class session
*
* Checks whether the supplied user is banned by id, ip or email. If no parameters
* are passed to the method pre-existing session data is used. If $return is false
- * this routine does not return on finding a banned user, it outputs a relevant
+ * this routine does not return on finding a banned user, it outputs a relevant
* message and stops execution.
*
* @param string|array $user_ips Can contain a string with one IP or an array of multiple IPs
@@ -976,8 +979,6 @@ class session
$this->session_create(ANONYMOUS);
}
- // Because we never have a fully working session we need to embed the style
- $template->assign_var('S_FORCE_EMBED_STYLE', true);
// Determine which message to output
$till_date = ($ban_row['ban_end']) ? $this->format_date($ban_row['ban_end']) : '';
@@ -1157,7 +1158,7 @@ class session
$sql_where = 'session_user_id = ' . (int) $user_id;
$sql_where .= ($user_id === $this->data['user_id']) ? " AND session_id <> '" . $db->sql_escape($this->session_id) . "'" : '';
- $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
+ $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
WHERE $sql_where";
$db->sql_query($sql);
@@ -1206,8 +1207,8 @@ class user extends session
if ($this->data['user_id'] != ANONYMOUS)
{
- $this->lang_name = (file_exists($phpbb_root_path . 'language/' . $this->data['user_lang'] . "/common.$phpEx")) ? $this->data['user_lang'] : $config['default_lang'];
- $this->lang_path = $phpbb_root_path . 'language/' . basename($this->lang_name) . '/';
+ $this->lang_name = (file_exists($phpbb_root_path . 'language/' . $this->data['user_lang'] . "/common.$phpEx")) ? $this->data['user_lang'] : basename($config['default_lang']);
+ $this->lang_path = $phpbb_root_path . 'language/' . $this->lang_name . '/';
$this->date_format = $this->data['user_dateformat'];
$this->timezone = $this->data['user_timezone'] * 3600;
@@ -1215,8 +1216,8 @@ class user extends session
}
else
{
- $this->lang_name = $config['default_lang'];
- $this->lang_path = $phpbb_root_path . 'language/' . basename($this->lang_name) . '/';
+ $this->lang_name = basename($config['default_lang']);
+ $this->lang_path = $phpbb_root_path . 'language/' . $this->lang_name . '/';
$this->date_format = $config['default_dateformat'];
$this->timezone = $config['board_timezone'] * 3600;
$this->dst = $config['board_dst'] * 3600;
@@ -1262,9 +1263,10 @@ class user extends session
// We include common language file here to not load it every time a custom language file is included
$lang = &$this->lang;
- if ((include $this->lang_path . "common.$phpEx") === false)
+
+ if ((@include $this->lang_path . "common.$phpEx") === false)
{
- die("Language file " . $this->lang_path . "common.$phpEx" . " couldn't be opened.");
+ die('Language file ' . $this->lang_name . "/common.$phpEx" . " couldn't be opened.");
}
$this->add_lang($lang_set);
@@ -1284,7 +1286,7 @@ class user extends session
$style = ($style) ? $style : ((!$config['override_user_style'] && $this->data['user_id'] != ANONYMOUS) ? $this->data['user_style'] : $config['default_style']);
}
- $sql = 'SELECT s.style_id, t.*, c.*, i.*
+ $sql = 'SELECT s.style_id, t.template_storedb, t.template_path, t.template_id, t.bbcode_bitfield, c.theme_path, c.theme_name, c.theme_storedb, c.theme_id, i.imageset_path, i.imageset_id, i.imageset_name
FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . " i
WHERE s.style_id = $style
AND t.template_id = s.template_id
@@ -1299,12 +1301,12 @@ class user extends session
{
$style = $this->data['user_style'] = $config['default_style'];
- $sql = 'UPDATE ' . USERS_TABLE . "
- SET user_style = $style
+ $sql = 'UPDATE ' . USERS_TABLE . "
+ SET user_style = $style
WHERE user_id = {$this->data['user_id']}";
$db->sql_query($sql);
- $sql = 'SELECT s.style_id, t.*, c.*, i.*
+ $sql = 'SELECT s.style_id, t.template_storedb, t.template_path, t.template_id, t.bbcode_bitfield, c.theme_path, c.theme_name, c.theme_storedb, c.theme_id, i.imageset_path, i.imageset_id, i.imageset_name
FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . " i
WHERE s.style_id = $style
AND t.template_id = s.template_id
@@ -1353,7 +1355,7 @@ class user extends session
// Match CSS imports
$matches = array();
preg_match_all('/@import url\(["\'](.*)["\']\);/i', $stylesheet, $matches);
-
+
if (sizeof($matches))
{
$content = '';
@@ -1392,7 +1394,7 @@ class user extends session
$this->img_lang = (file_exists($phpbb_root_path . 'styles/' . $this->theme['imageset_path'] . '/imageset/' . $this->lang_name)) ? $this->lang_name : $config['default_lang'];
- $sql = 'SELECT *
+ $sql = 'SELECT image_name, image_filename, image_lang, image_height, image_width
FROM ' . STYLES_IMAGESET_DATA_TABLE . '
WHERE imageset_id = ' . $this->theme['imageset_id'] . "
AND image_lang IN('" . $db->sql_escape($this->img_lang) . "', '')";
@@ -1405,6 +1407,7 @@ class user extends session
{
$localised_images = true;
}
+
$this->img_array[$row['image_name']] = $row;
}
$db->sql_freeresult($result);
@@ -1415,9 +1418,9 @@ class user extends session
// Attention: this code ignores the image definition list from acp_styles and just takes everything
// that the config file contains
$sql_ary = array();
-
+
$db->sql_transaction('begin');
-
+
$sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . '
WHERE imageset_id = ' . $this->theme['imageset_id'] . '
AND image_lang = \'' . $db->sql_escape($this->img_lang) . '\'';
@@ -1450,24 +1453,30 @@ class user extends session
{
$image_name = substr($image_name, 4);
$sql_ary[] = array(
- 'image_name' => $image_name,
- 'image_filename' => $image_filename,
- 'image_height' => $image_height,
- 'image_width' => $image_width,
- 'imageset_id' => $this->theme['imageset_id'],
- 'image_lang' => $this->img_lang,
+ 'image_name' => (string) $image_name,
+ 'image_filename' => (string) $image_filename,
+ 'image_height' => (int) $image_height,
+ 'image_width' => (int) $image_width,
+ 'imageset_id' => (int) $this->theme['imageset_id'],
+ 'image_lang' => (string) $this->img_lang,
);
}
}
}
-
- $db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary);
-
- $db->sql_transaction('commit');
-
- $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
-
- add_log('admin', 'LOG_IMAGESET_REFRESHED', $this->theme['imageset_name'], $this->img_lang);
+
+ if (sizeof($sql_ary))
+ {
+ $db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary);
+ $db->sql_transaction('commit');
+ $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
+
+ add_log('admin', 'LOG_IMAGESET_LANG_REFRESHED', $this->theme['imageset_name'], $this->img_lang);
+ }
+ else
+ {
+ $db->sql_transaction('commit');
+ add_log('admin', 'LOG_IMAGESET_LANG_MISSING', $this->theme['imageset_name'], $this->img_lang);
+ }
}
// If this function got called from the error handler we are finished here.
@@ -1504,13 +1513,19 @@ class user extends session
// Is load exceeded?
if ($config['limit_load'] && $this->load !== false)
{
- if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN') && !$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
+ if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN'))
{
- header('HTTP/1.1 503 Service Unavailable');
- trigger_error('BOARD_UNAVAILABLE');
+ // Set board disabled to true to let the admins/mods get the proper notification
+ $config['board_disable'] = '1';
+
+ if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
+ {
+ header('HTTP/1.1 503 Service Unavailable');
+ trigger_error('BOARD_UNAVAILABLE');
+ }
}
}
-
+
if (isset($this->data['session_viewonline']))
{
// Make sure the user is able to hide his session
@@ -1637,9 +1652,9 @@ class user extends session
$language_filename = $this->lang_path . (($use_help) ? 'help_' : '') . $lang_file . '.' . $phpEx;
}
- if ((include($language_filename)) === false)
+ if ((@include $language_filename) === false)
{
- trigger_error("Language file $language_filename couldn't be opened.", E_USER_ERROR);
+ trigger_error('Language file ' . basename($language_filename) . ' couldn\'t be opened.', E_USER_ERROR);
}
}
else if ($use_db)
@@ -1776,7 +1791,7 @@ class user extends session
case 'src':
return $img_data['src'];
break;
-
+
case 'width':
return ($width === false) ? $img_data['width'] : $width;
break;
diff --git a/phpBB/includes/template.php b/phpBB/includes/template.php
index 9095a31dba..f8db087d48 100644
--- a/phpBB/includes/template.php
+++ b/phpBB/includes/template.php
@@ -34,6 +34,7 @@ class template
var $root = '';
var $cachepath = '';
var $files = array();
+ var $filename = array();
// this will hash handle names to the compiled/uncompiled code for that handle.
var $compiled_code = array();
@@ -246,6 +247,7 @@ class template
$compile->_tpl_load_file($row['template_filename']);
unset($this->compiled_code[$row['template_filename']]);
unset($this->files[$row['template_filename']]);
+ unset($this->filename[$row['template_filename']]);
}
}
diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php
index d517ca2d1b..44b5498ca7 100644
--- a/phpBB/includes/ucp/ucp_groups.php
+++ b/phpBB/includes/ucp/ucp_groups.php
@@ -454,8 +454,8 @@ class ucp_groups
// Did we submit?
if ($update)
{
- $group_name = request_var('group_name', '', true);
- $group_desc = request_var('group_desc', '', true);
+ $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
+ $group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
$group_type = request_var('group_type', GROUP_FREE);
$allow_desc_bbcode = request_var('desc_parse_bbcode', false);
@@ -591,7 +591,7 @@ class ucp_groups
}
else if (!$group_id)
{
- $group_name = request_var('group_name', '', true);
+ $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
$group_desc_data = array(
'text' => '',
'allow_bbcode' => true,
@@ -707,7 +707,7 @@ class ucp_groups
$start = request_var('start', 0);
// Grab the leaders - always, on every page...
- $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
+ $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_colour, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
WHERE ug.group_id = $group_id
AND u.user_id = ug.user_id
@@ -719,7 +719,9 @@ class ucp_groups
{
$template->assign_block_vars('leader', array(
'USERNAME' => $row['username'],
- 'U_USER_VIEW' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $row['user_id']),
+ 'USERNAME_COLOUR' => $row['user_colour'],
+ 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
+ 'U_USER_VIEW' => get_username_string('profile', $row['user_id'], $row['username']),
'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
'USER_POSTS' => $row['user_posts'],
@@ -738,7 +740,7 @@ class ucp_groups
$db->sql_freeresult($result);
// Grab the members
- $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
+ $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_colour, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
WHERE ug.group_id = $group_id
AND u.user_id = ug.user_id
@@ -761,7 +763,9 @@ class ucp_groups
$template->assign_block_vars('member', array(
'USERNAME' => $row['username'],
- 'U_USER_VIEW' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $row['user_id']),
+ 'USERNAME_COLOUR' => $row['user_colour'],
+ 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
+ 'U_USER_VIEW' => get_username_string('profile', $row['user_id'], $row['username']),
'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
'USER_POSTS' => $row['user_posts'],
@@ -947,7 +951,7 @@ class ucp_groups
$user->add_lang(array('acp/groups', 'acp/common'));
- $names = request_var('usernames', '', true);
+ $names = utf8_normalize_nfc(request_var('usernames', '', true));
if (!$group_id)
{
diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php
index f542bddec9..ba40397a55 100644
--- a/phpBB/includes/ucp/ucp_main.php
+++ b/phpBB/includes/ucp/ucp_main.php
@@ -235,7 +235,7 @@ class ucp_main
if ($config['allow_forum_notify'])
{
- $forbidden_forums = $forbidden_forums = $auth->acl_getf('!f_read', true);
+ $forbidden_forums = $auth->acl_getf('!f_read', true);
$forbidden_forums = array_unique(array_keys($forbidden_forums));
$sql_array = array(
diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php
index e296ad12b1..e81c572ddf 100644
--- a/phpBB/includes/ucp/ucp_pm_compose.php
+++ b/phpBB/includes/ucp/ucp_pm_compose.php
@@ -208,12 +208,30 @@ function compose_pm($id, $mode, $action)
if ($sql)
{
- $result = $db->sql_query_limit($sql, 1);
+ $result = $db->sql_query($sql);
$post = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!$post)
{
+ // If editing it could be the recipient already read the message...
+ if ($action == 'edit')
+ {
+ $sql = 'SELECT p.*, t.folder_id
+ FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p
+ WHERE t.user_id = ' . $user->data['user_id'] . "
+ AND t.msg_id = $msg_id
+ AND t.msg_id = p.msg_id";
+ $result = $db->sql_query($sql);
+ $post = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ if ($post)
+ {
+ trigger_error('NO_EDIT_READ_MESSAGE');
+ }
+ }
+
trigger_error('NO_MESSAGE');
}
@@ -463,7 +481,7 @@ function compose_pm($id, $mode, $action)
}
else
{
- if (!$subject)
+ if (!$subject || !utf8_clean_string($subject))
{
$error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
}
@@ -565,7 +583,7 @@ function compose_pm($id, $mode, $action)
// Subject defined
if ($submit)
{
- if (!$subject)
+ if (!$subject || !utf8_clean_string($subject))
{
$error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
}
diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php
index f242c864b6..95326090c7 100644
--- a/phpBB/includes/ucp/ucp_pm_options.php
+++ b/phpBB/includes/ucp/ucp_pm_options.php
@@ -60,7 +60,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
// Add Folder
if (isset($_POST['addfolder']))
{
- $folder_name = request_var('foldername', '', true);
+ $folder_name = utf8_normalize_nfc(request_var('foldername', '', true));
if ($folder_name)
{
@@ -104,7 +104,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
// Rename folder
if (isset($_POST['rename_folder']))
{
- $new_folder_name = request_var('new_folder_name', '', true);
+ $new_folder_name = utf8_normalize_nfc(request_var('new_folder_name', '', true));
$rename_folder_id= request_var('rename_folder_id', 0);
if (!$new_folder_name)
diff --git a/phpBB/includes/ucp/ucp_pm_viewfolder.php b/phpBB/includes/ucp/ucp_pm_viewfolder.php
index 3c11a3ae8a..79b663a39d 100644
--- a/phpBB/includes/ucp/ucp_pm_viewfolder.php
+++ b/phpBB/includes/ucp/ucp_pm_viewfolder.php
@@ -65,18 +65,20 @@ function view_folder($id, $mode, $folder_id, $folder)
// We do the folder moving options here too, for template authors to use...
$s_folder_move_options = '';
- foreach ($folder as $f_id => $folder_ary)
+ if ($folder_id != PRIVMSGS_NO_BOX && $folder_id != PRIVMSGS_OUTBOX)
{
- if ($f_id == PRIVMSGS_OUTBOX || $f_id == PRIVMSGS_SENTBOX || $f_id == $folder_id)
+ foreach ($folder as $f_id => $folder_ary)
{
- continue;
- }
+ if ($f_id == PRIVMSGS_OUTBOX || $f_id == PRIVMSGS_SENTBOX || $f_id == $folder_id)
+ {
+ continue;
+ }
- $s_folder_move_options .= '<option' . (($f_id != PRIVMSGS_INBOX) ? ' class="sep"' : '') . ' value="' . $f_id . '">';
- $s_folder_move_options .= sprintf($user->lang['MOVE_MARKED_TO_FOLDER'], $folder_ary['folder_name']);
- $s_folder_move_options .= (($folder_ary['unread_messages']) ? ' [' . $folder_ary['unread_messages'] . '] ' : '') . '</option>';
+ $s_folder_move_options .= '<option' . (($f_id != PRIVMSGS_INBOX) ? ' class="sep"' : '') . ' value="' . $f_id . '">';
+ $s_folder_move_options .= sprintf($user->lang['MOVE_MARKED_TO_FOLDER'], $folder_ary['folder_name']);
+ $s_folder_move_options .= (($folder_ary['unread_messages']) ? ' [' . $folder_ary['unread_messages'] . '] ' : '') . '</option>';
+ }
}
-
$friend = $foe = array();
// Get friends and foes
@@ -163,18 +165,16 @@ function view_folder($id, $mode, $folder_id, $folder)
{
foreach ($id_ary as $ug_id => $_id)
{
- $user_colour = ($recipient_list[$type][$ug_id]['colour']) ? ' style="font-weight: bold; color:#' . $recipient_list[$type][$ug_id]['colour'] . '"' : '';
-
if ($type == 'u')
{
- $link = ($ug_id != ANONYMOUS) ? '<a href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $ug_id) . '"' . $user_colour . '>' : '';
+ $address_list[$message_id][] = get_username_string('full', $ug_id, $recipient_list[$type][$ug_id]['name'], $recipient_list[$type][$ug_id]['colour']);
}
else
{
+ $user_colour = ($recipient_list[$type][$ug_id]['colour']) ? ' style="font-weight: bold; color:#' . $recipient_list[$type][$ug_id]['colour'] . '"' : '';
$link = '<a href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $ug_id) . '"' . $user_colour . '>';
+ $address_list[$message_id][] = $link . $recipient_list[$type][$ug_id]['name'] . (($link) ? '</a>' : '');
}
-
- $address_list[$message_id][] = $link . $recipient_list[$type][$ug_id]['name'] . (($link) ? '</a>' : '');
}
}
}
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php
index 673da2e819..8fab63bc45 100644
--- a/phpBB/includes/ucp/ucp_pm_viewmessage.php
+++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php
@@ -25,7 +25,11 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
// Not able to view message, it was deleted by the sender
if ($message_row['pm_deleted'])
{
- trigger_error('NO_AUTH_READ_REMOVED_MESSAGE');
+ $meta_info = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;folder=$folder_id");
+ $message = $user->lang['NO_AUTH_READ_REMOVED_MESSAGE'];
+
+ $message .= '<br /><br />' . sprintf($user->lang['RETURN_FOLDER'], '<a href="' . $meta_info . '">', '</a>');
+ trigger_error($message);
}
// Do not allow hold messages to be seen
@@ -199,6 +203,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
'S_HAS_ATTACHMENTS' => (sizeof($attachments)) ? true : false,
'S_DISPLAY_NOTICE' => $display_notice && $message_row['message_attachment'],
'S_AUTHOR_DELETED' => ($author_id == ANONYMOUS) ? true : false,
+ 'S_SPECIAL_FOLDER' => in_array($folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)),
'U_PRINT_PM' => ($config['print_pm'] && $auth->acl_get('u_pm_printpm')) ? "$url&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] . "&amp;view=print" : '',
'U_FORWARD_PM' => ($config['forward_pm'] && $auth->acl_get('u_pm_forward')) ? "$url&amp;mode=compose&amp;action=forward&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '')
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index 58416f0f98..269c3aad44 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -36,7 +36,7 @@ class ucp_profile
case 'reg_details':
$data = array(
- 'username' => request_var('username', $user->data['username'], true),
+ 'username' => utf8_normalize_nfc(request_var('username', $user->data['username'], true)),
'email' => strtolower(request_var('email', $user->data['user_email'])),
'email_confirm' => strtolower(request_var('email_confirm', '')),
'new_password' => request_var('new_password', '', true),
@@ -266,23 +266,25 @@ class ucp_profile
'location' => utf8_normalize_nfc(request_var('location', $user->data['user_from'], true)),
'occupation' => utf8_normalize_nfc(request_var('occupation', $user->data['user_occ'], true)),
'interests' => utf8_normalize_nfc(request_var('interests', $user->data['user_interests'], true)),
- 'bday_day' => 0,
- 'bday_month' => 0,
- 'bday_year' => 0,
);
- if ($user->data['user_birthday'])
+ if ($config['allow_birthdays'])
{
- list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user->data['user_birthday']);
- }
+ $data['bday_day'] = $data['bday_month'] = $data['bday_year'] = 0;
+
+ if ($user->data['user_birthday'])
+ {
+ list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user->data['user_birthday']);
+ }
- $data['bday_day'] = request_var('bday_day', $data['bday_day']);
- $data['bday_month'] = request_var('bday_month', $data['bday_month']);
- $data['bday_year'] = request_var('bday_year', $data['bday_year']);
+ $data['bday_day'] = request_var('bday_day', $data['bday_day']);
+ $data['bday_month'] = request_var('bday_month', $data['bday_month']);
+ $data['bday_year'] = request_var('bday_year', $data['bday_year']);
+ }
if ($submit)
{
- $error = validate_data($data, array(
+ $validate_array = array(
'icq' => array(
array('string', true, 3, 15),
array('match', true, '#^[0-9]+$#i')),
@@ -298,10 +300,18 @@ class ucp_profile
'location' => array('string', true, 2, 255),
'occupation' => array('string', true, 2, 500),
'interests' => array('string', true, 2, 500),
- 'bday_day' => array('num', true, 1, 31),
- 'bday_month' => array('num', true, 1, 12),
- 'bday_year' => array('num', true, 1901, gmdate('Y', time())),
- ));
+ );
+
+ if ($config['allow_birthdays'])
+ {
+ $validate_array = array_merge($validate_array, array(
+ 'bday_day' => array('num', true, 1, 31),
+ 'bday_month' => array('num', true, 1, 12),
+ 'bday_year' => array('num', true, 1901, gmdate('Y', time())),
+ ));
+ }
+
+ $error = validate_data($data, $validate_array);
// validate custom profile fields
$cp->submit_cp_field('profile', $user->get_iso_lang_id(), $cp_data, $cp_error);
@@ -323,9 +333,13 @@ class ucp_profile
'user_from' => $data['location'],
'user_occ' => $data['occupation'],
'user_interests'=> $data['interests'],
- 'user_birthday' => sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']),
);
+ if ($config['allow_birthdays'])
+ {
+ $sql_ary['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
+ }
+
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];
@@ -361,29 +375,39 @@ class ucp_profile
$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
}
- $s_birthday_day_options = '<option value="0"' . ((!$data['bday_day']) ? ' selected="selected"' : '') . '>--</option>';
- for ($i = 1; $i < 32; $i++)
+ if ($config['allow_birthdays'])
{
- $selected = ($i == $data['bday_day']) ? ' selected="selected"' : '';
- $s_birthday_day_options .= "<option value=\"$i\"$selected>$i</option>";
- }
+ $s_birthday_day_options = '<option value="0"' . ((!$data['bday_day']) ? ' selected="selected"' : '') . '>--</option>';
+ for ($i = 1; $i < 32; $i++)
+ {
+ $selected = ($i == $data['bday_day']) ? ' selected="selected"' : '';
+ $s_birthday_day_options .= "<option value=\"$i\"$selected>$i</option>";
+ }
- $s_birthday_month_options = '<option value="0"' . ((!$data['bday_month']) ? ' selected="selected"' : '') . '>--</option>';
- for ($i = 1; $i < 13; $i++)
- {
- $selected = ($i == $data['bday_month']) ? ' selected="selected"' : '';
- $s_birthday_month_options .= "<option value=\"$i\"$selected>$i</option>";
- }
- $s_birthday_year_options = '';
+ $s_birthday_month_options = '<option value="0"' . ((!$data['bday_month']) ? ' selected="selected"' : '') . '>--</option>';
+ for ($i = 1; $i < 13; $i++)
+ {
+ $selected = ($i == $data['bday_month']) ? ' selected="selected"' : '';
+ $s_birthday_month_options .= "<option value=\"$i\"$selected>$i</option>";
+ }
+ $s_birthday_year_options = '';
- $now = getdate();
- $s_birthday_year_options = '<option value="0"' . ((!$data['bday_year']) ? ' selected="selected"' : '') . '>--</option>';
- for ($i = $now['year'] - 100; $i < $now['year']; $i++)
- {
- $selected = ($i == $data['bday_year']) ? ' selected="selected"' : '';
- $s_birthday_year_options .= "<option value=\"$i\"$selected>$i</option>";
+ $now = getdate();
+ $s_birthday_year_options = '<option value="0"' . ((!$data['bday_year']) ? ' selected="selected"' : '') . '>--</option>';
+ for ($i = $now['year'] - 100; $i < $now['year']; $i++)
+ {
+ $selected = ($i == $data['bday_year']) ? ' selected="selected"' : '';
+ $s_birthday_year_options .= "<option value=\"$i\"$selected>$i</option>";
+ }
+ unset($now);
+
+ $template->assign_vars(array(
+ 'S_BIRTHDAY_DAY_OPTIONS' => $s_birthday_day_options,
+ 'S_BIRTHDAY_MONTH_OPTIONS' => $s_birthday_month_options,
+ 'S_BIRTHDAY_YEAR_OPTIONS' => $s_birthday_year_options,
+ 'S_BIRTHDAYS_ENABLED' => true,
+ ));
}
- unset($now);
$template->assign_vars(array(
'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
@@ -397,11 +421,7 @@ class ucp_profile
'LOCATION' => $data['location'],
'OCCUPATION'=> $data['occupation'],
'INTERESTS' => $data['interests'],
-
- 'S_BIRTHDAY_DAY_OPTIONS' => $s_birthday_day_options,
- 'S_BIRTHDAY_MONTH_OPTIONS' => $s_birthday_month_options,
- 'S_BIRTHDAY_YEAR_OPTIONS' => $s_birthday_year_options,)
- );
+ ));
// Get additional profile fields and assign them to the template block var 'profile_fields'
$user->get_profile_fields($user->data['user_id']);
diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php
index 69328e2ef3..b62ee04318 100644
--- a/phpBB/includes/ucp/ucp_register.php
+++ b/phpBB/includes/ucp/ucp_register.php
@@ -79,7 +79,7 @@ class ucp_register
{
// We do not include the password!
$s_hidden_fields = array_merge($s_hidden_fields, array(
- 'username' => request_var('username', '', true),
+ 'username' => utf8_normalize_nfc(request_var('username', '', true)),
'email' => strtolower(request_var('email', '')),
'email_confirm' => strtolower(request_var('email_confirm', '')),
'confirm_code' => request_var('confirm_code', ''),
@@ -142,7 +142,7 @@ class ucp_register
}
$data = array(
- 'username' => request_var('username', '', true),
+ 'username' => utf8_normalize_nfc(request_var('username', '', true)),
'new_password' => request_var('new_password', '', true),
'password_confirm' => request_var('password_confirm', '', true),
'email' => strtolower(request_var('email', '')),
@@ -309,7 +309,7 @@ class ucp_register
// This should not happen, because the required variables are listed above...
if ($user_id === false)
{
- trigger_error($user->lang['NO_USER'], E_USER_ERROR);
+ trigger_error('NO_USER', E_USER_ERROR);
}
if ($coppa && $config['email_enable'])
@@ -460,7 +460,7 @@ class ucp_register
if ($config['max_reg_attempts'] && $attempts > $config['max_reg_attempts'])
{
- trigger_error($user->lang['TOO_MANY_REGISTERS']);
+ trigger_error('TOO_MANY_REGISTERS');
}
$code = gen_rand_string(mt_rand(5, 8));
diff --git a/phpBB/includes/ucp/ucp_remind.php b/phpBB/includes/ucp/ucp_remind.php
index cee36e4417..b761e772f6 100644
--- a/phpBB/includes/ucp/ucp_remind.php
+++ b/phpBB/includes/ucp/ucp_remind.php
@@ -61,7 +61,8 @@ class ucp_remind
$server_url = generate_board_url();
$key_len = 54 - strlen($server_url);
- $key_len = ($key_len < 6) ? 6 : $key_len;
+ $key_len = max(6, $key_len); // we want at least 6
+ $key_len = ($config['max_pass_chars']) ? min($key_len, $config['max_pass_chars']) : $key_len; // we want at most $config['max_pass_chars']
$user_actkey = substr(gen_rand_string(10), 0, $key_len);
$user_password = gen_rand_string(8);
diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php
index 3c9abfe5b4..49ba7329be 100644
--- a/phpBB/includes/ucp/ucp_zebra.php
+++ b/phpBB/includes/ucp/ucp_zebra.php
@@ -157,7 +157,7 @@ class ucp_zebra
foreach ($user_id_ary as $zebra_id)
{
$sql_ary[] = array(
- 'user_id' => $user->data['user_id'],
+ 'user_id' => (int) $user->data['user_id'],
'zebra_id' => (int) $zebra_id,
$sql_mode => 1
);
diff --git a/phpBB/includes/utf/data/confusables.php b/phpBB/includes/utf/data/confusables.php
new file mode 100644
index 0000000000..7564978a26
--- /dev/null
+++ b/phpBB/includes/utf/data/confusables.php
@@ -0,0 +1 @@
+<?php return array('¡'=>'i','ǃ'=>'!','α'=>'a',' '=>' ','­'=>'','Û'=>'','Ü'=>'','á †'=>'','á Ž'=>'','​'=>'','‌'=>'','â€'=>'','
'=>'','
'=>'','â '=>'','â¡'=>'','â¢'=>'','â£'=>'','âª'=>'','â«'=>'','â¬'=>'','â­'=>'','â®'=>'','â¯'=>'',''=>'',''=>'',''=>'','ï¿»'=>'',''=>'','ð…³'=>'','ð…´'=>'','ð…µ'=>'','ð…¶'=>'','ð…·'=>'','ð…¸'=>'','ð…¹'=>'','ð…º'=>'','Û¬'=>'ÛŸ','̓'=>'Ì“','Ù'=>'Ì“','Öœ'=>'Ì','Í'=>'Ì','݇'=>'Ì','॔'=>'Ì','Í€'=>'Ì€','॓'=>'Ì€','ÌŒ'=>'̆','Ì‘'=>'Ì‚','Ö¯'=>'ÌŠ','ஂ'=>'ÌŠ','à¹'=>'ÌŠ','à»'=>'ÌŠ','ံ'=>'ÌŠ','ំ'=>'ÌŠ','៓'=>'ÌŠ','゚'=>'ÌŠ','゚'=>'ÌŠ','ͦ'=>'ÌŠ','Í‚'=>'̃','ׄ'=>'̇','Ö¹'=>'̇','ׂ'=>'̇','×'=>'̇','Ý'=>'̇','ं'=>'̇','ਂ'=>'̇','ં'=>'̇','à¯'=>'̇','Ì…'=>'Ì„','〬'=>'̉','̱'=>'Ì ','॒'=>'Ì ','̧'=>'Ì¡','̦'=>'Ì¡','̨'=>'Ì¢','़'=>'Ì£','়'=>'Ì£','਼'=>'Ì£','઼'=>'Ì£','଼'=>'Ì£','͇'=>'̳','̶'=>'̵','ﱞ'=>'ï¹²Ù‘','ﱟ'=>'ï¹´Ù‘','ï³²'=>'ï¹·Ù‘','ï± '=>'ï¹¶Ù‘','ï³³'=>'ï¹¹Ù‘','ﱡ'=>'ﹸّ','ï³´'=>'ï¹»Ù‘','ï±¢'=>'ﹺّ','ï±£'=>'ï¹¼Ù°','Ù´'=>'Ù”','Ý‚'=>'ܼ','౦'=>'o','೦'=>'o','゙'=>'ã‚™',' '=>' ',' '=>' ','â€'=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','âŸ'=>' ',' '=>' ',' '=>' ',' '=>' ','`'=>'`','ï½€'=>'`','á¿€'=>'Ëœ','ï¼¾'=>'^','︿'=>'^','_'=>'_','ï¹'=>'_','﹎'=>'_','ï¹'=>'_','⌇'=>'︴','ï¼'=>'-','â€'=>'-','‑'=>'-','‒'=>'-','–'=>'-','﹘'=>'-','∼'=>'â“','ï½¥'=>'・','•'=>'・',','=>',','‚'=>',','Ù¬'=>'ØŒ','、'=>'ã€',';'=>';','ï¼›'=>';',':'=>':','Ö‰'=>':','︰'=>':','׃'=>':','â©´'=>'::=','.'=>'.','․'=>'.','Ü‚'=>'.','‥'=>'..','…'=>'...','。'=>'。','·'=>'·','‧'=>'·','∙'=>'·','â‹…'=>'·','á§'=>'·','ᔯ'=>'·4','áŒ'=>'·á','áŽ'=>'·áƒ','á'=>'·á„','á’'=>'·á…','á”'=>'·á†','á—'=>'·áŠ','á™'=>'·á‹','á·'=>'·á³','á‘€'=>'·á³','á‘‚'=>'·á´','á‘„'=>'·á¸','ᑆ'=>'·á¹','á‘—'=>'·ᑌ','á‘™'=>'·ᑎ','á‘›'=>'·á‘','á‘”'=>'·á‘','á‘'=>'·á‘','ᑟ'=>'·ᑑ','á‘¡'=>'·ᑕ','á‘£'=>'·ᑖ','á‘´'=>'·ᑫ','ᑸ'=>'·ᑮ','ᑼ'=>'·ᑰ','ᑾ'=>'·ᑲ','á’€'=>'·ᑳ','á’’'=>'·ᒉ','á’”'=>'·ᒋ','á’–'=>'·ᒌ','á’š'=>'·ᒎ','á’œ'=>'·á’','á’ž'=>'·ᒑ','á’¬'=>'·ᒣ','á’®'=>'·ᒥ','á’°'=>'·ᒦ','á’²'=>'·ᒧ','á’´'=>'·ᒨ','á’¶'=>'·L','á’¸'=>'·ᒫ','ᓉ'=>'·ᓀ','á“‹'=>'·ᓇ','á“'=>'·ᓈ','ᓜ'=>'·ᓓ','ᓞ'=>'·ᓕ','á“ '=>'·ᓖ','á“¢'=>'·ᓗ','ᓤ'=>'·ᓘ','ᓦ'=>'·ᓚ','ᓨ'=>'·ᓛ','á“¶'=>'·ᓭ','ᓸ'=>'·ᓯ','ᓺ'=>'·ᓰ','ᓼ'=>'·ᓱ','ᓾ'=>'·ᓲ','ᔀ'=>'·ᓴ','ᔂ'=>'·ᓵ','á”—'=>'·á”','á”™'=>'·ᔑ','á”›'=>'·ᔒ','á”'=>'·ᔓ','ᔟ'=>'·ᔔ','ᔡ'=>'·ᔕ','ᔣ'=>'·ᔖ','á”±'=>'·ᔨ','ᔳ'=>'·ᔩ','ᔵ'=>'·ᔪ','á”·'=>'·ᔫ','ᔹ'=>'·ᔭ','á”»'=>'·ᔮ','ᕎ'=>'·ᕌ','á•›'=>'·ᕚ','ᕨ'=>'·ᕧ','('=>'(','â‘´'=>'(1)','â’§'=>'(l)','⑽'=>'(10)','⑾'=>'(11)','â‘¿'=>'(12)','â’€'=>'(13)','â’'=>'(14)','â’‚'=>'(15)','â’ƒ'=>'(16)','â’„'=>'(17)','â’…'=>'(18)','â’†'=>'(19)','⑵'=>'(2)','â’‡'=>'(20)','â‘¶'=>'(3)','â‘·'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','â‘»'=>'(8)','⑼'=>'(9)','â’œ'=>'(a)','â’'=>'(b)','â’ž'=>'(c)','â’Ÿ'=>'(d)','â’ '=>'(e)','â’¡'=>'(f)','â’¢'=>'(g)','â’£'=>'(h)','â’¤'=>'(i)','â’¥'=>'(j)','â’¦'=>'(k)','â’¨'=>'(m)','â’©'=>'(n)','â’ª'=>'(o)','â’«'=>'(p)','â’¬'=>'(q)','â’­'=>'(r)','â’®'=>'(s)','â’¯'=>'(t)','â’°'=>'(u)','â’±'=>'(v)','â’²'=>'(w)','â’³'=>'(x)','â’´'=>'(y)','â’µ'=>'(z)','㈀'=>'(á„€)','㈎'=>'(ê°€)','ãˆ'=>'(á„‚)','ãˆ'=>'(나)','㈂'=>'(ᄃ)','ãˆ'=>'(다)','㈃'=>'(á„…)','㈑'=>'(ë¼)','㈄'=>'(ᄆ)','㈒'=>'(마)','㈅'=>'(ᄇ)','㈓'=>'(ë°”)','㈆'=>'(ᄉ)','㈔'=>'(사)','㈇'=>'(á„‹)','㈕'=>'(ì•„)','ãˆ'=>'(오전)','㈞'=>'(오후)','㈈'=>'(ᄌ)','㈖'=>'(ìž)','㈜'=>'(주)','㈉'=>'(ᄎ)','㈗'=>'(ì°¨)','㈊'=>'(á„)','㈘'=>'(ì¹´)','㈋'=>'(á„)','㈙'=>'(타)','㈌'=>'(á„‘)','㈚'=>'(파)','ãˆ'=>'(á„’)','㈛'=>'(하)','㈠'=>'(一)','㈦'=>'(七)','㈢'=>'(三)','㈨'=>'(ä¹)','㈡'=>'(二)','㈤'=>'(五)','㈹'=>'(代)','㈽'=>'(ä¼)','ã‰'=>'(休)','㈧'=>'(å…«)','㈥'=>'(å…­)','㈸'=>'(労)','㈩'=>'(å)','㈿'=>'(å”)','㈴'=>'(å)','㈺'=>'(呼)','㈣'=>'(å››)','㈯'=>'(土)','㈻'=>'(å­¦)','㈰'=>'(æ—¥)','㈪'=>'(月)','㈲'=>'(有)','㈭'=>'(木)','㈱'=>'(æ ª)','㈬'=>'(æ°´)','㈫'=>'(ç«)','㈵'=>'(特)','㈼'=>'(監)','㈳'=>'(社)','㈷'=>'(ç¥)','㉀'=>'(祭)','㉂'=>'(自)','㉃'=>'(至)','㈶'=>'(財)','㈾'=>'(資)','㈮'=>'(金)',')'=>')','ï¼»'=>'[','〔'=>'[','ï¼½'=>']','〕'=>']','ï½›'=>'{','ï½'=>'}','⦅'=>'⦅','ï½ '=>'⦆','ï½¢'=>'「','ï½£'=>'ã€','ï¼ '=>'@','*'=>'*','ï¼'=>'/','â„'=>'/','∕'=>'/','ï¼¼'=>'\\','&'=>'&','#'=>'#','ï¼…'=>'%','‶'=>'‵‵','‷'=>'‵‵‵','༌'=>'་','´'=>'ʹ','΄'=>'ʹ','´'=>'ʹ','\''=>'ʹ','''=>'ʹ','′'=>'ʹ','׳'=>'ʹ','Í´'=>'ʹ','ËŠ'=>'ʹ','"'=>'ʹʹ','"'=>'ʹʹ','″'=>'ʹʹ','〃'=>'ʹʹ','×´'=>'ʹʹ','ʺ'=>'ʹʹ','‴'=>'ʹʹʹ','â—'=>'ʹʹʹʹ','¯'=>'ˉ','ï¿£'=>'ˉ','‾'=>'ˉ','﹉'=>'ˉ','﹊'=>'ˉ','﹋'=>'ˉ','﹌'=>'ˉ','Ëš'=>'°','௵'=>'௳','ï¿©'=>'â†','ï¿«'=>'→','↑'=>'↑','↓'=>'↓','↵'=>'↲','⨡'=>'↾','ð››'=>'∂','ðœ•'=>'∂','ð'=>'∂','ðž‰'=>'∂','ðŸƒ'=>'∂','ð›'=>'∇','ð›»'=>'∇','ðœµ'=>'∇','ð¯'=>'∇','ðž©'=>'∇','+'=>'+','﬩'=>'+','‹'=>'<','<'=>'<','ï¼'=>'=','⩵'=>'==','â©¶'=>'===','›'=>'>','>'=>'>','ï¿¢'=>'¬','¦'=>'¦','〜'=>'~','~'=>'~','﹨'=>'∖','â‹€'=>'∧','â‹'=>'∨','â‹‚'=>'∩','⋃'=>'∪','∯'=>'∮∮','∰'=>'∮∮∮','≣'=>'≡','â™'=>'⊕','☉'=>'⊙','⟂'=>'⊥','â–·'=>'⊲','â¨'=>'⋈','⨽'=>'⌙','☸'=>'⎈','⎮'=>'⎥','│'=>'│','â–'=>'â–Œ','ï¿­'=>'â– ','â˜'=>'â–¡','ï¿®'=>'â—‹','⦾'=>'â—Ž','〛'=>'⟧','〈'=>'⟨','〈'=>'⟨','〉'=>'⟩','〉'=>'⟩','â§™'=>'⦚','〶'=>'〒','ï½°'=>'ー','ï¿ '=>'¢','$'=>'$','ï¿¡'=>'£','ï¿¥'=>'Y̵','₩'=>'W̵','ï¼'=>'0','ðŸŽ'=>'0','ðŸ˜'=>'0','ðŸ¢'=>'0','ðŸ¬'=>'0','ðŸ¶'=>'0','০'=>'0','à­¦'=>'0','௦'=>'0','á '=>'0','〇'=>'0','ðŽ'=>'0','ð‘‚'=>'0','ð‘¶'=>'0','ð’ª'=>'0','ð“ž'=>'0','ð”’'=>'0','ð•†'=>'0','ð•º'=>'0','ð–®'=>'0','ð—¢'=>'0','ð˜–'=>'0','ð™Š'=>'0','ð™¾'=>'0','ðš¶'=>'0','ð›°'=>'0','ðœª'=>'0','ð¤'=>'0','ðžž'=>'0','âµ”'=>'0','à´ '=>'0','⊖'=>'0̵','ðš¯'=>'0̵','ðš¹'=>'0̵','ð›©'=>'0̵','ð›³'=>'0̵','ðœ£'=>'0̵','ðœ­'=>'0̵','ð'=>'0̵','ð§'=>'0̵','ðž—'=>'0̵','ðž¡'=>'0̵','â´±'=>'0̵','Ꮎ'=>'0̵','Û°'=>'Ù ','á­œ'=>'á­','ã˜'=>'0点','1'=>'1','ðŸ'=>'1','ðŸ™'=>'1','ðŸ£'=>'1','ðŸ­'=>'1','ðŸ·'=>'1','â„'=>'1','â„‘'=>'1','ðˆ'=>'1','ð¼'=>'1','ð‘°'=>'1','ð“˜'=>'1','ð•€'=>'1','ð•´'=>'1','ð–¨'=>'1','ð—œ'=>'1','ð˜'=>'1','ð™„'=>'1','ð™¸'=>'1','l'=>'l','l'=>'l','â…¼'=>'1','â„“'=>'l','ð¥'=>'l','ð‘™'=>'l','ð’'=>'l','ð“'=>'l','ð“µ'=>'l','ð”©'=>'l','ð•'=>'l','ð–‘'=>'l','ð—…'=>'l','ð—¹'=>'l','ð˜­'=>'l','ð™¡'=>'l','ðš•'=>'l','ðš°'=>'l','ð›ª'=>'l','ðœ¤'=>'l','ðž'=>'l','ðž˜'=>'l','â‘ '=>'➀','É­'=>'lÌ¢','É«'=>'lÌ´','Æš'=>'l̵','Å‚'=>'lÌ·','Û±'=>'Ù¡','â’ˆ'=>'1.','Å€'=>'l·','á’·'=>'1·','â‘©'=>'➉','â’‘'=>'10.','ã©'=>'10æ—¥','㋉'=>'10月','ã¢'=>'10点','â’’'=>'11.','ãª'=>'11æ—¥','㋊'=>'11月','ã£'=>'11点','â’“'=>'12.','ã«'=>'12æ—¥','ã‹‹'=>'12月','ã¤'=>'12点','â’”'=>'13.','ã¬'=>'13æ—¥','ã¥'=>'13点','â’•'=>'14.','ã­'=>'14æ—¥','ã¦'=>'14点','â’–'=>'15.','ã®'=>'15æ—¥','ã§'=>'15点','â’—'=>'16.','ã¯'=>'16æ—¥','ã¨'=>'16点','â’˜'=>'17.','ã°'=>'17æ—¥','ã©'=>'17点','â’™'=>'18.','ã±'=>'18æ—¥','ãª'=>'18点','â’š'=>'19.','ã²'=>'19æ—¥','ã«'=>'19点','lj'=>'lj','ã '=>'1æ—¥','ã‹€'=>'1月','ã™'=>'1点','ï¼’'=>'2','ðŸ'=>'2','ðŸš'=>'2','ðŸ¤'=>'2','ðŸ®'=>'2','ðŸ¸'=>'2','á’¿'=>'2','â‘¡'=>'âž','Û²'=>'Ù¢','â’‰'=>'2.','â’›'=>'20.','ã³'=>'20æ—¥','ã¬'=>'20点','ã´'=>'21æ—¥','ã­'=>'21点','ãµ'=>'22æ—¥','ã®'=>'22点','ã¶'=>'23æ—¥','ã¯'=>'23点','ã·'=>'24æ—¥','ã°'=>'24点','ã¸'=>'25æ—¥','ã¹'=>'26æ—¥','ãº'=>'27æ—¥','ã»'=>'28æ—¥','ã¼'=>'29æ—¥','ã¡'=>'2æ—¥','ã‹'=>'2月','ãš'=>'2点','3'=>'3','ðŸ‘'=>'3','ðŸ›'=>'3','ðŸ¥'=>'3','ðŸ¯'=>'3','ðŸ¹'=>'3','â‘¢'=>'âž‚','Û³'=>'Ù£','â’Š'=>'3.','ã½'=>'30æ—¥','ã¾'=>'31æ—¥','ã¢'=>'3æ—¥','ã‹‚'=>'3月','ã›'=>'3点','ï¼”'=>'4','ðŸ’'=>'4','ðŸœ'=>'4','ðŸ¦'=>'4','ðŸ°'=>'4','ðŸº'=>'4','áŽ'=>'4','â‘£'=>'➃','â’‹'=>'4.','á”°'=>'4·','ã£'=>'4æ—¥','㋃'=>'4月','ãœ'=>'4点','5'=>'5','ðŸ“'=>'5','ðŸ'=>'5','ðŸ§'=>'5','ðŸ±'=>'5','ðŸ»'=>'5','⑤'=>'âž„','â’Œ'=>'5.','ã¤'=>'5æ—¥','ã‹„'=>'5月','ã'=>'5点','ï¼–'=>'6','ðŸ”'=>'6','ðŸž'=>'6','ðŸ¨'=>'6','ðŸ²'=>'6','ðŸ¼'=>'6','б'=>'6','â‘¥'=>'âž…','â’'=>'6.','ã¥'=>'6æ—¥','ã‹…'=>'6月','ãž'=>'6点','ï¼—'=>'7','ðŸ•'=>'7','ðŸŸ'=>'7','ðŸ©'=>'7','ðŸ³'=>'7','ðŸ½'=>'7','⑦'=>'➆','Û·'=>'Ù§','â’Ž'=>'7.','ã¦'=>'7æ—¥','㋆'=>'7月','ãŸ'=>'7点','ଃ'=>'8','৪'=>'8','੪'=>'8','8'=>'8','ðŸ–'=>'8','ðŸ '=>'8','ðŸª'=>'8','ðŸ´'=>'8','ðŸ¾'=>'8','È£'=>'8','â‘§'=>'➇','Û¸'=>'Ù¨','â’'=>'8.','ã§'=>'8æ—¥','㋇'=>'8月','ã '=>'8点','à©§'=>'9','à­¨'=>'9','à§­'=>'9','ï¼™'=>'9','ðŸ—'=>'9','ðŸ¡'=>'9','ðŸ«'=>'9','ðŸµ'=>'9','ðŸ¿'=>'9','⑨'=>'➈','Û¹'=>'Ù©','â’'=>'9.','ã¨'=>'9æ—¥','㋈'=>'9月','ã¡'=>'9点','ï½'=>'a','ðš'=>'a','ð‘Ž'=>'a','ð’‚'=>'a','ð’¶'=>'a','ð“ª'=>'a','ð”ž'=>'a','ð•’'=>'a','ð–†'=>'a','ð–º'=>'a','ð—®'=>'a','ð˜¢'=>'a','ð™–'=>'a','ðšŠ'=>'a','â„€'=>'a/c','â„'=>'a/s','æ'=>'ae','b'=>'b','ð›'=>'b','ð‘'=>'b','ð’ƒ'=>'b','ð’·'=>'b','ð“«'=>'b','ð”Ÿ'=>'b','ð•“'=>'b','ð–‡'=>'b','ð–»'=>'b','ð—¯'=>'b','ð˜£'=>'b','ð™—'=>'b','ðš‹'=>'b','É“'=>'bÌ”','ƃ'=>'bÌ„','Æ€'=>'b̵','c'=>'c','â…½'=>'c','ðœ'=>'c','ð‘'=>'c','ð’„'=>'c','ð’¸'=>'c','ð“¬'=>'c','ð” '=>'c','ð•”'=>'c','ð–ˆ'=>'c','ð–¼'=>'c','ð—°'=>'c','ð˜¤'=>'c','ð™˜'=>'c','ðšŒ'=>'c','ð›“'=>'c','ðœ'=>'c','ð‡'=>'c','ðž'=>'c','ðž»'=>'c','â„…'=>'c/o','℆'=>'c/u','d'=>'d','â…¾'=>'d','â…†'=>'d','ð'=>'d','ð‘‘'=>'d','ð’…'=>'d','ð’¹'=>'d','ð“­'=>'d','ð”¡'=>'d','ð••'=>'d','ð–‰'=>'d','ð–½'=>'d','ð—±'=>'d','ð˜¥'=>'d','ð™™'=>'d','ðš'=>'d','É—'=>'dÌ”','ÆŒ'=>'dÌ„','É–'=>'dÌ¢','Ä‘'=>'d̵','dz'=>'dz','dž'=>'dž','ï½…'=>'e','ℯ'=>'e','â…‡'=>'e','ðž'=>'e','ð‘’'=>'e','ð’†'=>'e','ð“®'=>'e','ð”¢'=>'e','ð•–'=>'e','ð–Š'=>'e','ð–¾'=>'e','ð—²'=>'e','ð˜¦'=>'e','ð™š'=>'e','ðšŽ'=>'e','â´¹'=>'E','É™'=>'Ç','Éš'=>'ÇËž','â‹´'=>'É›','ð›†'=>'É›','ð›œ'=>'É›','ðœ€'=>'É›','ðœ–'=>'É›','ðœº'=>'É›','ð'=>'É›','ð´'=>'É›','ðžŠ'=>'É›','ðž®'=>'É›','ðŸ„'=>'É›','f'=>'f','ðŸ'=>'f','ð‘“'=>'f','ð’‡'=>'f','ð’»'=>'f','ð“¯'=>'f','ð”£'=>'f','ð•—'=>'f','ð–‹'=>'f','ð–¿'=>'f','ð—³'=>'f','ð˜§'=>'f','ð™›'=>'f','ðš'=>'f','Æ’'=>'fÌ¡','g'=>'g','ℊ'=>'g','ð '=>'g','ð‘”'=>'g','ð’ˆ'=>'g','ð“°'=>'g','ð”¤'=>'g','ð•˜'=>'g','ð–Œ'=>'g','ð—€'=>'g','ð—´'=>'g','ð˜¨'=>'g','ð™œ'=>'g','ðš'=>'g','É¡'=>'g','É '=>'gÌ”','Ç¥'=>'g̵','h'=>'h','ℎ'=>'h','ð¡'=>'h','ð’‰'=>'h','ð’½'=>'h','ð“±'=>'h','ð”¥'=>'h','ð•™'=>'h','ð–'=>'h','ð—'=>'h','ð—µ'=>'h','ð˜©'=>'h','ð™'=>'h','ðš‘'=>'h','ɦ'=>'hÌ”','ħ'=>'h̵','â„'=>'h̵','῾'=>'Ê»','‘'=>'Ê»','‛'=>'Ê»','ʽ'=>'Ê»','â³'=>'i','i'=>'i','â…°'=>'i','ℹ'=>'i','â…ˆ'=>'i','ð¢'=>'i','ð‘–'=>'i','ð’Š'=>'i','ð’¾'=>'i','ð“²'=>'i','ð”¦'=>'i','ð•š'=>'i','ð–Ž'=>'i','ð—‚'=>'i','ð—¶'=>'i','ð˜ª'=>'i','ð™ž'=>'i','ðš’'=>'i','ı'=>'i','ðš¤'=>'i','ɪ'=>'i','É©'=>'i','ð›Š'=>'i','ðœ„'=>'i','ðœ¾'=>'i','ð¸'=>'i','ðž²'=>'i','ɨ'=>'i̵','â…±'=>'ii','â…²'=>'iii','ij'=>'ij','â…³'=>'iv','â…¸'=>'ix','j'=>'j','â…‰'=>'j','ð£'=>'j','ð‘—'=>'j','ð’‹'=>'j','ð’¿'=>'j','ð“³'=>'j','ð”§'=>'j','ð•›'=>'j','ð–'=>'j','ð—ƒ'=>'j','ð—·'=>'j','ð˜«'=>'j','ð™Ÿ'=>'j','ðš“'=>'j','ϳ'=>'j','ðš¥'=>'È·','k'=>'k','ð¤'=>'k','ð‘˜'=>'k','ð’Œ'=>'k','ð“€'=>'k','ð“´'=>'k','ð”¨'=>'k','ð•œ'=>'k','ð–'=>'k','ð—„'=>'k','ð—¸'=>'k','ð˜¬'=>'k','ð™ '=>'k','ðš”'=>'k','Æ™'=>'kÌ”','ï½'=>'m','â…¿'=>'m','ð¦'=>'m','ð‘š'=>'m','ð’Ž'=>'m','ð“‚'=>'m','ð“¶'=>'m','ð”ª'=>'m','ð•ž'=>'m','ð–’'=>'m','ð—†'=>'m','ð—º'=>'m','ð˜®'=>'m','ð™¢'=>'m','ðš–'=>'m','ɱ'=>'mÌ¡','n'=>'n','ð§'=>'n','ð‘›'=>'n','ð’'=>'n','ð“ƒ'=>'n','ð“·'=>'n','ð”«'=>'n','ð•Ÿ'=>'n','ð–“'=>'n','ð—‡'=>'n','ð—»'=>'n','ð˜¯'=>'n','ð™£'=>'n','ðš—'=>'n','ð'=>'N','ð‘'=>'N','ð‘µ'=>'N','ð’©'=>'N','ð“'=>'N','ð”‘'=>'N','ð•¹'=>'N','ð–­'=>'N','ð—¡'=>'N','ð˜•'=>'N','ð™‰'=>'N','ð™½'=>'N','ðš´'=>'N','ð›®'=>'N','ðœ¨'=>'N','ð¢'=>'N','ðžœ'=>'N','ɲ'=>'ņ','ɳ'=>'nÌ¢','Æž'=>'nÌ©','ð›ˆ'=>'nÌ©','ðœ‚'=>'nÌ©','ðœ¼'=>'nÌ©','ð¶'=>'nÌ©','ðž°'=>'nÌ©','ÇŒ'=>'nj','ï½'=>'o','â„´'=>'o','ð¨'=>'o','ð‘œ'=>'o','ð’'=>'o','ð“¸'=>'o','ð”¬'=>'o','ð• '=>'o','ð–”'=>'o','ð—ˆ'=>'o','ð—¼'=>'o','ð˜°'=>'o','ð™¤'=>'o','ðš˜'=>'o','á´'=>'o','ð›'=>'o','ðœŠ'=>'o','ð„'=>'o','ð¾'=>'o','ðž¸'=>'o','ɵ'=>'o̵','Ç¿'=>'o̵Ì','ø'=>'oÌ·','Å“'=>'oe','Æ¡'=>'oʼ','â´'=>'p','ï½'=>'p','ð©'=>'p','ð‘'=>'p','ð’‘'=>'p','ð“…'=>'p','ð“¹'=>'p','ð”­'=>'p','ð•¡'=>'p','ð–•'=>'p','ð—‰'=>'p','ð—½'=>'p','ð˜±'=>'p','ð™¥'=>'p','ðš™'=>'p','ð›’'=>'p','ð› '=>'p','ðœŒ'=>'p','ðœš'=>'p','ð†'=>'p','ð”'=>'p','ðž€'=>'p','ðžŽ'=>'p','ðžº'=>'p','ðŸˆ'=>'p','Æ¥'=>'pÌ”','q'=>'q','ðª'=>'q','ð‘ž'=>'q','ð’’'=>'q','ð“†'=>'q','ð“º'=>'q','ð”®'=>'q','ð•¢'=>'q','ð––'=>'q','ð—Š'=>'q','ð—¾'=>'q','ð˜²'=>'q','ð™¦'=>'q','ðšš'=>'q','ð'=>'Q','ð‘„'=>'Q','ð‘¸'=>'Q','ð’¬'=>'Q','ð“ '=>'Q','ð””'=>'Q','ð•¼'=>'Q','ð–°'=>'Q','ð—¤'=>'Q','ð˜˜'=>'Q','ð™Œ'=>'Q','ðš€'=>'Q','Ê '=>'qÌ”','ð›‹'=>'ĸ','ð›ž'=>'ĸ','ðœ…'=>'ĸ','ðœ˜'=>'ĸ','ðœ¿'=>'ĸ','ð’'=>'ĸ','ð¹'=>'ĸ','ðžŒ'=>'ĸ','ðž³'=>'ĸ','ðŸ†'=>'ĸ','ï½’'=>'r','ð«'=>'r','ð‘Ÿ'=>'r','ð’“'=>'r','ð“‡'=>'r','ð“»'=>'r','ð”¯'=>'r','ð•£'=>'r','ð–—'=>'r','ð—‹'=>'r','ð—¿'=>'r','ð˜³'=>'r','ð™§'=>'r','ðš›'=>'r','ɽ'=>'rÌ¢','ɼ'=>'rÌ©','s'=>'s','ð¬'=>'s','ð‘ '=>'s','ð’”'=>'s','ð“ˆ'=>'s','ð“¼'=>'s','ð”°'=>'s','ð•¤'=>'s','ð–˜'=>'s','ð—Œ'=>'s','ð˜€'=>'s','ð˜´'=>'s','ð™¨'=>'s','ðšœ'=>'s','ƽ'=>'s','Ê‚'=>'sÌ¢','∫'=>'ʃ','∬'=>'ʃʃ','∭'=>'ʃʃʃ','⨌'=>'ʃʃʃʃ','ï½”'=>'t','ð­'=>'t','ð‘¡'=>'t','ð’•'=>'t','ð“‰'=>'t','ð“½'=>'t','ð”±'=>'t','ð•¥'=>'t','ð–™'=>'t','ð—'=>'t','ð˜'=>'t','ð˜µ'=>'t','ð™©'=>'t','ðš'=>'t','ð‘‡'=>'T','ð‘»'=>'T','ð’¯'=>'T','ð“£'=>'T','ð”—'=>'T','ð•‹'=>'T','ð•¿'=>'T','ð–³'=>'T','ð—§'=>'T','ð˜›'=>'T','ð™'=>'T','ðšƒ'=>'T','ðš»'=>'T','ð›µ'=>'T','ðœ¯'=>'T','ð©'=>'T','ðž£'=>'T','Æ­'=>'tÌ”','È›'=>'Å£','Æ«'=>'Å£','ŧ'=>'t̵','u'=>'u','ð®'=>'u','ð‘¢'=>'u','ð’–'=>'u','ð“Š'=>'u','ð“¾'=>'u','ð”²'=>'u','ð•¦'=>'u','ð–š'=>'u','ð—Ž'=>'u','ð˜‚'=>'u','ð˜¶'=>'u','ð™ª'=>'u','ðšž'=>'u','ÊŠ'=>'u','Ê‹'=>'u','ð›–'=>'u','ðœ'=>'u','ðŠ'=>'u','ðž„'=>'u','ðž¾'=>'u','ð‘ˆ'=>'U','ð‘¼'=>'U','ð’°'=>'U','ð“¤'=>'U','ð”˜'=>'U','ð•Œ'=>'U','ð–€'=>'U','ð–´'=>'U','ð—¨'=>'U','ð˜œ'=>'U','ð™'=>'U','ðš„'=>'U','ï½–'=>'v','â…´'=>'v','ð¯'=>'v','ð‘£'=>'v','ð’—'=>'v','ð“‹'=>'v','ð“¿'=>'v','ð”³'=>'v','ð•§'=>'v','ð–›'=>'v','ð—'=>'v','ð˜ƒ'=>'v','ð˜·'=>'v','ð™«'=>'v','ðšŸ'=>'v','ð›Ž'=>'v','ðœˆ'=>'v','ð‚'=>'v','ð¼'=>'v','ðž¶'=>'v','â…µ'=>'vi','â…¶'=>'vii','â…·'=>'viii','ɯ'=>'w','ï½—'=>'w','ð°'=>'w','ð‘¤'=>'w','ð’˜'=>'w','ð“Œ'=>'w','ð”€'=>'w','ð”´'=>'w','ð•¨'=>'w','ð–œ'=>'w','ð—'=>'w','ð˜„'=>'w','ð˜¸'=>'w','ð™¬'=>'w','ðš '=>'w','ð‘Š'=>'W','ð‘¾'=>'W','ð’²'=>'W','ð“¦'=>'W','ð”š'=>'W','ð•Ž'=>'W','ð–‚'=>'W','ð–¶'=>'W','ð—ª'=>'W','ð˜ž'=>'W','ð™’'=>'W','ðš†'=>'W','×'=>'x','x'=>'x','â…¹'=>'x','ð±'=>'x','ð‘¥'=>'x','ð’™'=>'x','ð“'=>'x','ð”'=>'x','ð”µ'=>'x','ð•©'=>'x','ð–'=>'x','ð—‘'=>'x','ð˜…'=>'x','ð˜¹'=>'x','ð™­'=>'x','ðš¡'=>'x','á™­'=>'X','ð‘‹'=>'X','ð‘¿'=>'X','ð’³'=>'X','ð“§'=>'X','ð”›'=>'X','ð•'=>'X','ð–ƒ'=>'X','ð–·'=>'X','ð—«'=>'X','ð˜Ÿ'=>'X','ð™“'=>'X','ðš‡'=>'X','ðš¾'=>'X','ð›¸'=>'X','ðœ²'=>'X','ð¬'=>'X','ðž¦'=>'X','â…º'=>'xi','â…»'=>'xii','ï½™'=>'y','ð²'=>'y','ð‘¦'=>'y','ð’š'=>'y','ð“Ž'=>'y','ð”‚'=>'y','ð”¶'=>'y','ð•ª'=>'y','ð–ž'=>'y','ð—’'=>'y','ð˜†'=>'y','ð˜º'=>'y','ð™®'=>'y','ðš¢'=>'y','Æ´'=>'yÌ”','z'=>'z','ð³'=>'z','ð‘§'=>'z','ð’›'=>'z','ð“'=>'z','ð”ƒ'=>'z','ð”·'=>'z','ð•«'=>'z','ð–Ÿ'=>'z','ð—“'=>'z','ð˜‡'=>'z','ð˜»'=>'z','ð™¯'=>'z','ðš£'=>'z','È¥'=>'zÌ¡','Ê'=>'zÌ¢','ƶ'=>'z̵','È'=>'Ê’','?'=>'Ê”','?'=>'Ê”','â‡'=>'ʔʔ','âˆ'=>'ʔǃ','á¾½'=>'ʼ','᾿'=>'ʼ','’'=>'ʼ','ʾ'=>'ʼ','!'=>'ǃ','ï¼'=>'ǃ','â‰'=>'ǃʔ','‼'=>'ǃǃ','âº'=>'α','ð›‚'=>'α','ð›¼'=>'α','ðœ¶'=>'α','ð°'=>'α','ðžª'=>'α','ð›ƒ'=>'β','ð›½'=>'β','ðœ·'=>'β','ð±'=>'β','ðž«'=>'β','ℽ'=>'γ','ð›„'=>'γ','ð›¾'=>'γ','ðœ¸'=>'γ','ð²'=>'γ','ðž¬'=>'γ','ð›…'=>'δ','ð›¿'=>'δ','ðœ¹'=>'δ','ð³'=>'δ','ðž­'=>'δ','ðŸ‹'=>'Ï','ð›‡'=>'ζ','ðœ'=>'ζ','ðœ»'=>'ζ','ðµ'=>'ζ','ðž¯'=>'ζ','â¬'=>'θ','ð›‰'=>'θ','ð›'=>'θ','ðœƒ'=>'θ','ðœ—'=>'θ','ðœ½'=>'θ','ð‘'=>'θ','ð·'=>'θ','ðž‹'=>'θ','ðž±'=>'θ','ðŸ…'=>'θ','ð›Œ'=>'λ','ðœ†'=>'λ','ð€'=>'λ','ðº'=>'λ','ðž´'=>'λ','ð›¬'=>'Λ','ðœ¦'=>'Λ','ð '=>'Λ','ðžš'=>'Λ','ð›'=>'μ','ðœ‡'=>'μ','ð'=>'μ','ð»'=>'μ','ðžµ'=>'μ','ð›'=>'ξ','ðœ‰'=>'ξ','ðƒ'=>'ξ','ð½'=>'ξ','ðž·'=>'ξ','ð›¯'=>'Ξ','ðœ©'=>'Ξ','ð£'=>'Ξ','ðž'=>'Ξ','ℼ'=>'Ï€','ð›‘'=>'Ï€','ð›¡'=>'Ï€','ðœ‹'=>'Ï€','ðœ›'=>'Ï€','ð…'=>'Ï€','ð•'=>'Ï€','ð¿'=>'Ï€','ðž'=>'Ï€','ðž¹'=>'Ï€','ðŸ‰'=>'Ï€','á´¨'=>'Ï€','âˆ'=>'Π','ðš·'=>'Π','ð›±'=>'Π','ðœ«'=>'Π','ð¥'=>'Π','ðžŸ'=>'Π','ð›”'=>'σ','ðœŽ'=>'σ','ðˆ'=>'σ','ðž‚'=>'σ','ðž¼'=>'σ','ð›•'=>'Ï„','ðœ'=>'Ï„','ð‰'=>'Ï„','ðžƒ'=>'Ï„','ðž½'=>'Ï„','ð˜'=>'Y','ð‘Œ'=>'Y','ð’€'=>'Y','ð’´'=>'Y','ð“¨'=>'Y','ð”œ'=>'Y','ð•'=>'Y','ð–„'=>'Y','ð–¸'=>'Y','ð—¬'=>'Y','ð˜ '=>'Y','ð™”'=>'Y','ðšˆ'=>'Y','ðš¼'=>'Y','ð›¶'=>'Y','ðœ°'=>'Y','ðª'=>'Y','ðž¤'=>'Y','ð›—'=>'φ','ð›Ÿ'=>'φ','ðœ‘'=>'φ','ðœ™'=>'φ','ð‹'=>'φ','ð“'=>'φ','ðž…'=>'φ','ðž'=>'φ','ðž¿'=>'φ','ðŸ‡'=>'φ','ð›·'=>'Φ','ðœ±'=>'Φ','ð«'=>'Φ','ðž¥'=>'Φ','ð›˜'=>'χ','ðœ’'=>'χ','ðŒ'=>'χ','ðž†'=>'χ','ðŸ€'=>'χ','ð›™'=>'ψ','ðœ“'=>'ψ','ð'=>'ψ','ðž‡'=>'ψ','ðŸ'=>'ψ','ð›¹'=>'Ψ','ðœ³'=>'Ψ','ð­'=>'Ψ','ðž§'=>'Ψ','âµ'=>'ω','ð›š'=>'ω','ðœ”'=>'ω','ðŽ'=>'ω','ðžˆ'=>'ω','ðŸ‚'=>'ω','Ó•'=>'ae','Ò“'=>'r̵','Ò‘'=>'rᑊ','Ò—'=>'ж̩','Ò™'=>'з̡','Ó'=>'i','Ò‹'=>'й̡','Ò›'=>'ĸ̩','ÒŸ'=>'ĸ̵','á´«'=>'л','Ó†'=>'л̡','ÓŽ'=>'м̡','ÓŠ'=>'н̡','Óˆ'=>'н̡','Ò£'=>'н̩','Ó©'=>'o̵','ѳ'=>'o̵','Ò«'=>'cÌ¡','Ò­'=>'т̩','Ò¯'=>'y','Ò±'=>'y̵','Ñ›'=>'h̵','ѽ'=>'ѡ҃','ÓŒ'=>'Ò·','Ò¿'=>'ҽ̢','Ò'=>'Ь̵','Õ¦'=>'q','Õ¼'=>'n','ℵ'=>'×','ﬡ'=>'×','אָ'=>'אַ','אּ'=>'אַ','ï­'=>'×ל','â„¶'=>'ב','â„·'=>'×’','ℸ'=>'ד','ﬢ'=>'ד','ﬣ'=>'×”','ﬤ'=>'×›','ﬥ'=>'ל','ﬦ'=>'×','ﬠ'=>'×¢','ﬧ'=>'ר','ﬨ'=>'ת','ﺀ'=>'Ø¡','ﺂ'=>'Ø¢','ïº'=>'Ø¢','ﺄ'=>'Ø£','ﺃ'=>'Ø£','Ùµ'=>'أ','ï­‘'=>'Ù±','ï­'=>'Ù±','ﺆ'=>'ؤ','ﺅ'=>'ؤ','Ù¶'=>'ÙˆÙ”','ﺈ'=>'Ø¥','ﺇ'=>'Ø¥','ﺋ'=>'ئ','ﺌ'=>'ئ','ﺊ'=>'ئ','ﺉ'=>'ئ','ﯫ'=>'ئا','ﯪ'=>'ئا','ﯸ'=>'ئٻ','ﯷ'=>'ئٻ','ﯶ'=>'ئٻ','ï²—'=>'ئج','ï°€'=>'ئج','ﲘ'=>'ئح','ï°'=>'ئح','ï²™'=>'ئخ','ﱤ'=>'ئر','ï±¥'=>'ئز','ﲚ'=>'ئم','ﳟ'=>'ئم','ﱦ'=>'ئم','ï°‚'=>'ئم','ï±§'=>'ئن','ï²›'=>'ئه','ï³ '=>'ئه','ﯭ'=>'ئه','ﯬ'=>'ئه','ﯯ'=>'ئو','ﯮ'=>'ئو','ﯳ'=>'ئۆ','ﯲ'=>'ئۆ','ﯱ'=>'ئۇ','ﯰ'=>'ئۇ','ﯵ'=>'ئۈ','ﯴ'=>'ئۈ','ﯻ'=>'ئى','ﯺ'=>'ئى','ﱨ'=>'ئى','ﯹ'=>'ئى','ï°ƒ'=>'ئى','ﱩ'=>'ئى','ï°„'=>'ئى','ﺎ'=>'ا','ïº'=>'ا','ï´¼'=>'اً','ï´½'=>'اً','ï·³'=>'اكبر','ï·²'=>'الله','ﺑ'=>'ب','ﺒ'=>'ب','ïº'=>'ب','ïº'=>'ب','ﲜ'=>'بج','ï°…'=>'بج','ï²'=>'بح','ï°†'=>'بح','ï·‚'=>'بحى','ﲞ'=>'بخ','ï°‡'=>'بخ','ï¶ž'=>'بخى','ﱪ'=>'بر','ﱫ'=>'بز','ﲟ'=>'بم','ﳡ'=>'بم','ﱬ'=>'بم','ï°ˆ'=>'بم','ï±­'=>'بن','ï² '=>'به','ï³¢'=>'به','ï±®'=>'بى','ï°‰'=>'بى','ﱯ'=>'بى','ï°Š'=>'بى','ï­”'=>'Ù»','ï­•'=>'Ù»','ï­“'=>'Ù»','ï­’'=>'Ù»','Û'=>'Ù»','ﯦ'=>'Ù»','ﯧ'=>'Ù»','ﯥ'=>'Ù»','ﯤ'=>'Ù»','ï­˜'=>'Ù¾','ï­™'=>'Ù¾','ï­—'=>'Ù¾','ï­–'=>'Ù¾','ï­œ'=>'Ú€','ï­'=>'Ú€','ï­›'=>'Ú€','ï­š'=>'Ú€','ﺔ'=>'Ø©','ﺓ'=>'Ø©','ﺗ'=>'ت','ﺘ'=>'ت','ﺖ'=>'ت','ﺕ'=>'ت','ﲡ'=>'تج','ï°‹'=>'تج','ïµ'=>'تجم','ï¶ '=>'تجى','ï¶Ÿ'=>'تجى','ï²¢'=>'تح','ï°Œ'=>'تح','ïµ’'=>'تحج','ﵑ'=>'تحج','ﵓ'=>'تحم','ï²£'=>'تخ','ï°'=>'تخ','ïµ”'=>'تخم','ï¶¢'=>'تخى','ï¶¡'=>'تخى','ï±°'=>'تر','ï±±'=>'تز','ﲤ'=>'تم','ï³£'=>'تم','ï±²'=>'تم','ï°Ž'=>'تم','ﵕ'=>'تمج','ïµ–'=>'تمح','ïµ—'=>'تمخ','ﶤ'=>'تمى','ï¶£'=>'تمى','ï±³'=>'تن','ï²¥'=>'ته','ﳤ'=>'ته','ï±´'=>'تى','ï°'=>'تى','ï±µ'=>'تى','ï°'=>'تى','ﺛ'=>'Ø«','ﺜ'=>'Ø«','ﺚ'=>'Ø«','ﺙ'=>'Ø«','ï°‘'=>'ثج','ï±¶'=>'ثر','ï±·'=>'ثز','ﲦ'=>'ثم','ï³¥'=>'ثم','ﱸ'=>'ثم','ï°’'=>'ثم','ï±¹'=>'ثن','ﳦ'=>'ثه','ﱺ'=>'ثى','ï°“'=>'ثى','ï±»'=>'ثى','ï°”'=>'ثى','ï­¨'=>'Ù¹','ï­©'=>'Ù¹','ï­§'=>'Ù¹','ï­¦'=>'Ù¹','Ú»'=>'Ù¹','ﮢ'=>'Ù¹','ﮣ'=>'Ù¹','ﮡ'=>'Ù¹','ï® '=>'Ù¹','ï­ '=>'Ùº','ï­¡'=>'Ùº','ï­Ÿ'=>'Ùº','ï­ž'=>'Ùº','ï­¤'=>'Ù¿','ï­¥'=>'Ù¿','ï­£'=>'Ù¿','ï­¢'=>'Ù¿','ﺟ'=>'ج','ﺠ'=>'ج','ﺞ'=>'ج','ïº'=>'ج','ï²§'=>'جح','ï°•'=>'جح','ﶦ'=>'جحى','ï¶¾'=>'جحى','ï·»'=>'جل جلاله','ﲨ'=>'جم','ï°–'=>'جم','ïµ™'=>'جمح','ﵘ'=>'جمح','ï¶§'=>'جمى','ï¶¥'=>'جمى','ï´'=>'جى','ï´'=>'جى','ï´ž'=>'جى','ï´‚'=>'جى','ï­¸'=>'Úƒ','ï­¹'=>'Úƒ','ï­·'=>'Úƒ','ï­¶'=>'Úƒ','ï­´'=>'Ú„','ï­µ'=>'Ú„','ï­³'=>'Ú„','ï­²'=>'Ú„','ï­¼'=>'Ú†','ï­½'=>'Ú†','ï­»'=>'Ú†','ï­º'=>'Ú†','ﮀ'=>'Ú‡','ï®'=>'Ú‡','ï­¿'=>'Ú‡','ï­¾'=>'Ú‡','ﺣ'=>'Ø­','ﺤ'=>'Ø­','ﺢ'=>'Ø­','ﺡ'=>'Ø­','ﲩ'=>'حج','ï°—'=>'حج','ï¶¿'=>'حجى','ﲪ'=>'حم','ï°˜'=>'حم','ïµ›'=>'حمى','ﵚ'=>'حمى','ï´›'=>'حى','ﳿ'=>'حى','ï´œ'=>'حى','ï´€'=>'حى','ﺧ'=>'Ø®','ﺨ'=>'Ø®','ﺦ'=>'Ø®','ﺥ'=>'Ø®','ﲫ'=>'خج','ï°™'=>'خج','ï°š'=>'خح','ﲬ'=>'خم','ï°›'=>'خم','ï´Ÿ'=>'خى','ï´ƒ'=>'خى','ï´ '=>'خى','ï´„'=>'خى','ﺪ'=>'د','ﺩ'=>'د','ﺬ'=>'ذ','ﺫ'=>'ذ','ï±›'=>'ذٰ','ﮉ'=>'Úˆ','ﮈ'=>'Úˆ','ï®…'=>'ÚŒ','ﮄ'=>'ÚŒ','ﮃ'=>'Ú','ﮂ'=>'Ú','ﮇ'=>'ÚŽ','ﮆ'=>'ÚŽ','ﺮ'=>'ر','ﺭ'=>'ر','ﱜ'=>'رٰ','ï·¶'=>'رسول','ï·¼'=>'رىال','ﺰ'=>'ز','ﺯ'=>'ز','ï®'=>'Ú‘','ﮌ'=>'Ú‘','ﮋ'=>'Ú˜','ﮊ'=>'Ú˜','ﺳ'=>'س','ﺴ'=>'س','ﺲ'=>'س','ﺱ'=>'س','ï²­'=>'سج','ï´´'=>'سج','ï°œ'=>'سج','ïµ'=>'سجح','ﵞ'=>'سجى','ï²®'=>'سح','ï´µ'=>'سح','ï°'=>'سح','ﵜ'=>'سحج','ﲯ'=>'سخ','ï´¶'=>'سخ','ï°ž'=>'سخ','ﶨ'=>'سخى','ï·†'=>'سخى','ï´ª'=>'سر','ï´Ž'=>'سر','ï²°'=>'سم','ï³§'=>'سم','ï°Ÿ'=>'سم','ﵡ'=>'سمج','ïµ '=>'سمح','ﵟ'=>'سمح','ïµ£'=>'سمم','ïµ¢'=>'سمم','ï´±'=>'سه','ﳨ'=>'سه','ï´—'=>'سى','ï³»'=>'سى','ï´˜'=>'سى','ï³¼'=>'سى','ﺷ'=>'Ø´','ﺸ'=>'Ø´','ﺶ'=>'Ø´','ﺵ'=>'Ø´','ï´­'=>'شج','ï´·'=>'شج','ï´¥'=>'شج','ï´‰'=>'شج','ﵩ'=>'شجى','ï´®'=>'شح','ï´¸'=>'شح','ï´¦'=>'شح','ï´Š'=>'شح','ﵨ'=>'شحم','ïµ§'=>'شحم','ﶪ'=>'شحى','ï´¯'=>'شخ','ï´¹'=>'شخ','ï´§'=>'شخ','ï´‹'=>'شخ','ï´©'=>'شر','ï´'=>'شر','ï´°'=>'شم','ﳩ'=>'شم','ï´¨'=>'شم','ï´Œ'=>'شم','ﵫ'=>'شمخ','ﵪ'=>'شمخ','ïµ­'=>'شمم','ﵬ'=>'شمم','ï´²'=>'شه','ﳪ'=>'شه','ï´™'=>'شى','ï³½'=>'شى','ï´š'=>'شى','ï³¾'=>'شى','ﺻ'=>'ص','ﺼ'=>'ص','ﺺ'=>'ص','ﺹ'=>'ص','ï²±'=>'صح','ï° '=>'صح','ïµ¥'=>'صحح','ﵤ'=>'صحح','ï¶©'=>'صحى','ï²²'=>'صخ','ï´«'=>'صر','ï´'=>'صر','ï·µ'=>'صلعم','ï·¹'=>'صلى','ï·º'=>'صلى الله علىه وسلم','ï·°'=>'صلے','ï²³'=>'صم','ï°¡'=>'صم','ï·…'=>'صمم','ﵦ'=>'صمم','ï´¡'=>'صى','ï´…'=>'صى','ï´¢'=>'صى','ï´†'=>'صى','ﺿ'=>'ض','ﻀ'=>'ض','ﺾ'=>'ض','ﺽ'=>'ض','ï²´'=>'ضج','ï°¢'=>'ضج','ï²µ'=>'ضح','ï°£'=>'ضح','ïµ®'=>'ضحى','ï¶«'=>'ضحى','ï²¶'=>'ضخ','ï°¤'=>'ضخ','ïµ°'=>'ضخم','ﵯ'=>'ضخم','ï´¬'=>'ضر','ï´'=>'ضر','ï²·'=>'ضم','ï°¥'=>'ضم','ï´£'=>'ضى','ï´‡'=>'ضى','ï´¤'=>'ضى','ï´ˆ'=>'ضى','ﻃ'=>'Ø·','ﻄ'=>'Ø·','ﻂ'=>'Ø·','ï»'=>'Ø·','ﲸ'=>'طح','ï°¦'=>'طح','ï´³'=>'طم','ï´º'=>'طم','ï°§'=>'طم','ïµ²'=>'طمح','ïµ±'=>'طمح','ïµ³'=>'طمم','ïµ´'=>'طمى','ï´‘'=>'طى','ï³µ'=>'طى','ï´’'=>'طى','ï³¶'=>'طى','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻆ'=>'ظ','ï»…'=>'ظ','ï²¹'=>'ظم','ï´»'=>'ظم','ï°¨'=>'ظم','ﻋ'=>'ع','ﻌ'=>'ع','ﻊ'=>'ع','ﻉ'=>'ع','ﲺ'=>'عج','ï°©'=>'عج','ï·„'=>'عجم','ïµµ'=>'عجم','ï··'=>'علىه','ï²»'=>'عم','ï°ª'=>'عم','ïµ·'=>'عمم','ïµ¶'=>'عمم','ﵸ'=>'عمى','ï¶¶'=>'عمى','ï´“'=>'عى','ï³·'=>'عى','ï´”'=>'عى','ﳸ'=>'عى','ï»'=>'غ','ï»'=>'غ','ﻎ'=>'غ','ï»'=>'غ','ï²¼'=>'غج','ï°«'=>'غج','ï²½'=>'غم','ï°¬'=>'غم','ïµ¹'=>'غمم','ïµ»'=>'غمى','ﵺ'=>'غمى','ï´•'=>'غى','ï³¹'=>'غى','ï´–'=>'غى','ﳺ'=>'غى','ﻓ'=>'Ù','ï»”'=>'Ù','ï»’'=>'Ù','ﻑ'=>'Ù','ï²¾'=>'ÙØ¬','ï°­'=>'ÙØ¬','ﲿ'=>'ÙØ­','ï°®'=>'ÙØ­','ï³€'=>'ÙØ®','ï°¯'=>'ÙØ®','ïµ½'=>'ÙØ®Ù…','ïµ¼'=>'ÙØ®Ù…','ï³'=>'ÙÙ…','ï°°'=>'ÙÙ…','ï·'=>'Ùمى','ï±¼'=>'ÙÙ‰','ï°±'=>'ÙÙ‰','ï±½'=>'ÙÙ‰','ï°²'=>'ÙÙ‰','ï­¬'=>'Ú¤','ï­­'=>'Ú¤','ï­«'=>'Ú¤','ï­ª'=>'Ú¤','ï­°'=>'Ú¦','ï­±'=>'Ú¦','ï­¯'=>'Ú¦','ï­®'=>'Ú¦','ï»—'=>'Ù‚','ﻘ'=>'Ù‚','ï»–'=>'Ù‚','ﻕ'=>'Ù‚','ﳂ'=>'قح','ï°³'=>'قح','ï·±'=>'قلے','ﳃ'=>'قم','ï°´'=>'قم','ï¶´'=>'قمح','ïµ¾'=>'قمح','ﵿ'=>'قمم','ï¶²'=>'قمى','ï±¾'=>'قى','ï°µ'=>'قى','ﱿ'=>'قى','ï°¶'=>'قى','ï»›'=>'Ùƒ','ﻜ'=>'Ùƒ','ﻚ'=>'Ùƒ','ï»™'=>'Ùƒ','Ú©'=>'Ùƒ','ï®'=>'Ùƒ','ﮑ'=>'Ùƒ','ï®'=>'Ùƒ','ﮎ'=>'Ùƒ','ï²€'=>'كا','ï°·'=>'كا','ﳄ'=>'كج','ï°¸'=>'كج','ï³…'=>'كح','ï°¹'=>'كح','ﳆ'=>'كخ','ï°º'=>'كخ','ﳇ'=>'كل','ﳫ'=>'كل','ï²'=>'كل','ï°»'=>'كل','ﳈ'=>'كم','ﳬ'=>'كم','ﲂ'=>'كم','ï°¼'=>'كم','ï·ƒ'=>'كمم','ï¶»'=>'كمم','ï¶·'=>'كمى','ﲃ'=>'كى','ï°½'=>'كى','ﲄ'=>'كى','ï°¾'=>'كى','ﯕ'=>'Ú­','ﯖ'=>'Ú­','ﯔ'=>'Ú­','ﯓ'=>'Ú­','ï®”'=>'Ú¯','ﮕ'=>'Ú¯','ﮓ'=>'Ú¯','ï®’'=>'Ú¯','ﮜ'=>'Ú±','ï®'=>'Ú±','ï®›'=>'Ú±','ﮚ'=>'Ú±','ﮘ'=>'Ú³','ï®™'=>'Ú³','ï®—'=>'Ú³','ï®–'=>'Ú³','ﻟ'=>'Ù„','ï» '=>'Ù„','ﻞ'=>'Ù„','ï»'=>'Ù„','ï»¶'=>'لآ','ﻵ'=>'لآ','ﻸ'=>'لأ','ï»·'=>'لأ','ﻺ'=>'لإ','ﻹ'=>'لإ','ﻼ'=>'لا','ï»»'=>'لا','ﳉ'=>'لج','ï°¿'=>'لج','ﶃ'=>'لجج','ï¶„'=>'لجج','ﶺ'=>'لجم','ï¶¼'=>'لجم','ﶬ'=>'لجى','ﳊ'=>'لح','ï±€'=>'لح','ï¶µ'=>'لحم','ï¶€'=>'لحم','ï¶‚'=>'لحى','ï¶'=>'لحى','ﳋ'=>'لخ','ï±'=>'لخ','ﶆ'=>'لخم','ï¶…'=>'لخم','ﳌ'=>'لم','ï³­'=>'لم','ï²…'=>'لم','ﱂ'=>'لم','ﶈ'=>'لمح','ﶇ'=>'لمح','ï¶­'=>'لمى','ï³'=>'له','ﲆ'=>'لى','ﱃ'=>'لى','ﲇ'=>'لى','ﱄ'=>'لى','ﻣ'=>'Ù…','ﻤ'=>'Ù…','ﻢ'=>'Ù…','ﻡ'=>'Ù…','ﲈ'=>'ما','ﳎ'=>'مج','ï±…'=>'مج','ï¶Œ'=>'مجح','ï¶’'=>'مجخ','ï¶'=>'مجم','ï·€'=>'مجى','ï³'=>'مح','ﱆ'=>'مح','ﶉ'=>'محج','ï¶Š'=>'محم','ï·´'=>'محمد','ï¶‹'=>'محى','ï³'=>'مخ','ﱇ'=>'مخ','ï¶Ž'=>'مخج','ï¶'=>'مخم','ï¶¹'=>'مخى','ﳑ'=>'مم','ﲉ'=>'مم','ﱈ'=>'مم','ï¶±'=>'ممى','ﱉ'=>'مى','ﱊ'=>'مى','ï»§'=>'Ù†','ﻨ'=>'Ù†','ﻦ'=>'Ù†','ﻥ'=>'Ù†','ï³’'=>'نج','ﱋ'=>'نج','ﶸ'=>'نجح','ï¶½'=>'نجح','ﶘ'=>'نجم','ï¶—'=>'نجم','ï¶™'=>'نجى','ï·‡'=>'نجى','ﳓ'=>'نح','ﱌ'=>'نح','ï¶•'=>'نحم','ï¶–'=>'نحى','ï¶³'=>'نحى','ï³”'=>'نخ','ï±'=>'نخ','ﲊ'=>'نر','ﲋ'=>'نز','ﳕ'=>'نم','ï³®'=>'نم','ﲌ'=>'نم','ﱎ'=>'نم','ï¶›'=>'نمى','ï¶š'=>'نمى','ï²'=>'نن','ï³–'=>'نه','ﳯ'=>'نه','ﲎ'=>'نى','ï±'=>'نى','ï²'=>'نى','ï±'=>'نى','ﮟ'=>'Úº','ﮞ'=>'Úº','ﻫ'=>'Ù‡','ﻬ'=>'Ù‡','ﻪ'=>'Ù‡','ﻩ'=>'Ù‡','Ú¾'=>'Ù‡','ﮬ'=>'Ù‡','ï®­'=>'Ù‡','ﮫ'=>'Ù‡','ﮪ'=>'Ù‡','Û'=>'Ù‡','ﮨ'=>'Ù‡','ﮩ'=>'Ù‡','ï®§'=>'Ù‡','ﮦ'=>'Ù‡','Û•'=>'Ù‡','ï³™'=>'هٰ','ï³—'=>'هج','ﱑ'=>'هج','ﳘ'=>'هم','ï±’'=>'هم','ï¶“'=>'همج','ï¶”'=>'همم','ﱓ'=>'هى','ï±”'=>'هى','ﮥ'=>'Û€','ﮤ'=>'Û€','ï»®'=>'Ùˆ','ï»­'=>'Ùˆ','ï·¸'=>'وسلم','ﯡ'=>'Û…','ﯠ'=>'Û…','ﯚ'=>'Û†','ﯙ'=>'Û†','ﯘ'=>'Û‡','ﯗ'=>'Û‡','Ù·'=>'Û‡Ù”','ï¯'=>'Û‡Ù”','ﯜ'=>'Ûˆ','ﯛ'=>'Ûˆ','ﯣ'=>'Û‰','ﯢ'=>'Û‰','ﯟ'=>'Û‹','ﯞ'=>'Û‹','ﯨ'=>'Ù‰','ﯩ'=>'Ù‰','ï»°'=>'Ù‰','ﻯ'=>'Ù‰','ÙŠ'=>'Ù‰','ﻳ'=>'Ù‰','ï»´'=>'Ù‰','ﻲ'=>'Ù‰','ï»±'=>'Ù‰','ÛŒ'=>'Ù‰','ﯾ'=>'Ù‰','ﯿ'=>'Ù‰','ﯽ'=>'Ù‰','ﯼ'=>'Ù‰','Ù¸'=>'Ù‰Ù”','ï²'=>'ىٰ','ï±'=>'ىٰ','ﳚ'=>'ىج','ﱕ'=>'ىج','ﶯ'=>'ىجى','ï³›'=>'ىح','ï±–'=>'ىح','ï¶®'=>'ىحى','ﳜ'=>'ىخ','ï±—'=>'ىخ','ﲑ'=>'ىر','ï²’'=>'ىز','ï³'=>'ىم','ï³°'=>'ىم','ﲓ'=>'ىم','ﱘ'=>'ىم','ï¶'=>'ىمم','ï¶œ'=>'ىمم','ï¶°'=>'ىمى','ï²”'=>'ىن','ﳞ'=>'ىه','ï³±'=>'ىه','ﲕ'=>'ىى','ï±™'=>'ىى','ï²–'=>'ىى','ﱚ'=>'ىى','Û§'=>'Û¦','ﮯ'=>'Û’','ï®®'=>'Û’','ï®±'=>'Û“','ï®°'=>'Û“','∃'=>'â´º','आ'=>'अा','ऒ'=>'अाॆ','ओ'=>'अाे','औ'=>'अाै','ऄ'=>'अॆ','ऑ'=>'अॉ','à¤'=>'à¤à¥…','ऎ'=>'à¤à¥†','à¤'=>'à¤à¥‡','ई'=>'रà¥à¤‡','আ'=>'অা','à§ '=>'ঋৃ','à§¡'=>'ঌৢ','ਉ'=>'ੳà©','ਊ'=>'ੳੂ','ਆ'=>'ਅਾ','à¨'=>'ਅੈ','ਔ'=>'ਅੌ','ਇ'=>'ੲਿ','ਈ'=>'ੲੀ','à¨'=>'ੲੇ','આ'=>'અા','ઑ'=>'અાૅ','ઓ'=>'અાે','ઔ'=>'અાૈ','àª'=>'અૅ','àª'=>'અે','àª'=>'અૈ','ଆ'=>'ଅା','௮'=>'à®…','à®°'=>'ஈ','ா'=>'ஈ','௫'=>'ஈà¯','௨'=>'உ','ஊ'=>'உள','௭'=>'எ','௷'=>'எவ','ஜ'=>'à®','௧'=>'க','௪'=>'ச','௬'=>'சà¯','௲'=>'சூ','௺'=>'நீ','ை'=>'ன','௴'=>'மீ','௰'=>'ய','ௗ'=>'ள','௸'=>'à®·','ொ'=>'ெஈ','ௌ'=>'ெள','ோ'=>'ேஈ','à± '=>'à°‹à°¾','ౡ'=>'ఌా','à°”'=>'ఒౌ','à°“'=>'ఒౕ','à°¢'=>'à°¡Ì£','à°­'=>'బ̣','à°·'=>'వ̣','à°¹'=>'వా','à°®'=>'à°µà±','ూ'=>'à±à°¾','ౄ'=>'ృా','ೡ'=>'ಌಾ','ಔ'=>'ఒౌ','à´ˆ'=>'ഇൗ','à´Š'=>'உൗ','à´'=>'എെ','à´“'=>'à´’à´¾','à´”'=>'ഒൗ','ൡ'=>'à´ž','൫'=>'à´¦àµà´°','à´Œ'=>'നூ','à´™'=>'നூ','൯'=>'à´¨àµ','à´±'=>'à´°','൪'=>'à´°àµ','൮'=>'à´µàµ','ീ'=>'ி','ൂ'=>'ூ','ൃ'=>'ூ','ൈ'=>'െെ','ฃ'=>'ข','ด'=>'ค','ต'=>'ค','ม'=>'ฆ','ซ'=>'ช','à¸'=>'ฎ','ท'=>'ฑ','ๅ'=>'า','ำ'=>'̊า','à¹'=>'เเ','ໜ'=>'ຫນ','à»'=>'ຫມ','ຳ'=>'̊າ','ཷ'=>'ྲཱྀ','ཹ'=>'ླཱྀ','á€'=>'o','ឣ'=>'អ','á§'=>'ᦞ','á­’'=>'á¬','á­“'=>'ᬑ','á­˜'=>'ᬨ','ᢖ'=>'ᡜ','á¡•'=>'á µ','á’'=>'Ꭱ','Ꮍ'=>'y','ð€'=>'A','ð´'=>'A','ð‘¨'=>'A','ð’œ'=>'A','ð“'=>'A','ð”„'=>'A','ð”¸'=>'A','ð•¬'=>'A','ð– '=>'A','ð—”'=>'A','ð˜ˆ'=>'A','ð˜¼'=>'A','ð™°'=>'A','ðš¨'=>'A','ð›¢'=>'A','ðœœ'=>'A','ð–'=>'A','ðž'=>'A','ð‰'=>'J','ð½'=>'J','ð‘±'=>'J','ð’¥'=>'J','ð“™'=>'J','ð”'=>'J','ð•'=>'J','ð•µ'=>'J','ð–©'=>'J','ð—'=>'J','ð˜‘'=>'J','ð™…'=>'J','ð™¹'=>'J','á§'=>'J','â‹¿'=>'E','â„°'=>'E','ð„'=>'E','ð¸'=>'E','ð‘¬'=>'E','ð“”'=>'E','ð”ˆ'=>'E','ð”¼'=>'E','ð•°'=>'E','ð–¤'=>'E','ð—˜'=>'E','ð˜Œ'=>'E','ð™€'=>'E','ð™´'=>'E','ðš¬'=>'E','ð›¦'=>'E','ðœ '=>'E','ðš'=>'E','ðž”'=>'E','ℾ'=>'Ꮁ','ðšª'=>'Ꮁ','ð›¤'=>'Ꮁ','ðœž'=>'Ꮁ','ð˜'=>'Ꮁ','ðž’'=>'Ꮁ','á”'=>'w','ℳ'=>'M','ðŒ'=>'M','ð‘€'=>'M','ð‘´'=>'M','ð“œ'=>'M','ð”'=>'M','ð•„'=>'M','ð•¸'=>'M','ð–¬'=>'M','ð— '=>'M','ð˜”'=>'M','ð™ˆ'=>'M','ð™¼'=>'M','ðš³'=>'M','ð›­'=>'M','ðœ§'=>'M','ð¡'=>'M','ðž›'=>'M','â„‹'=>'H','ℌ'=>'H','â„'=>'H','ð‡'=>'H','ð»'=>'H','ð‘¯'=>'H','ð“—'=>'H','ð•³'=>'H','ð–§'=>'H','ð—›'=>'H','ð˜'=>'H','ð™ƒ'=>'H','ð™·'=>'H','ðš®'=>'H','ð›¨'=>'H','ðœ¢'=>'H','ðœ'=>'H','ðž–'=>'H','ð†'=>'G','ðº'=>'G','ð‘®'=>'G','ð’¢'=>'G','ð“–'=>'G','ð”Š'=>'G','ð”¾'=>'G','ð•²'=>'G','ð–¦'=>'G','ð—š'=>'G','ð˜Ž'=>'G','ð™‚'=>'G','ð™¶'=>'G','á³'=>'G','ℤ'=>'Z','ℨ'=>'Z','ð™'=>'Z','ð‘'=>'Z','ð’'=>'Z','ð’µ'=>'Z','ð“©'=>'Z','ð–…'=>'Z','ð–¹'=>'Z','ð—­'=>'Z','ð˜¡'=>'Z','ð™•'=>'Z','ðš‰'=>'Z','ðš­'=>'Z','ð›§'=>'Z','ðœ¡'=>'Z','ð›'=>'Z','ðž•'=>'Z','ð’'=>'S','ð‘†'=>'S','ð‘º'=>'S','ð’®'=>'S','ð“¢'=>'S','ð”–'=>'S','ð•Š'=>'S','ð•¾'=>'S','ð–²'=>'S','ð—¦'=>'S','ð˜š'=>'S','ð™Ž'=>'S','ðš‚'=>'S','áš'=>'S','ð•'=>'V','ð‘‰'=>'V','ð‘½'=>'V','ð’±'=>'V','ð“¥'=>'V','ð”™'=>'V','ð•'=>'V','ð–'=>'V','ð–µ'=>'V','ð—©'=>'V','ð˜'=>'V','ð™‘'=>'V','ðš…'=>'V','â„’'=>'L','ð‹'=>'L','ð¿'=>'L','ð‘³'=>'L','ð“›'=>'L','ð”'=>'L','ð•ƒ'=>'L','ð•·'=>'L','ð–«'=>'L','ð—Ÿ'=>'L','ð˜“'=>'L','ð™‡'=>'L','ð™»'=>'L','∑'=>'C','â…€'=>'C','â„‚'=>'C','â„­'=>'C','ð‚'=>'C','ð¶'=>'C','ð‘ª'=>'C','ð’ž'=>'C','ð“’'=>'C','ð•®'=>'C','ð–¢'=>'C','ð—–'=>'C','ð˜Š'=>'C','ð˜¾'=>'C','ð™²'=>'C','ðšº'=>'C','ð›´'=>'C','ðœ®'=>'C','ð¨'=>'C','ðž¢'=>'C','â„™'=>'P','ð'=>'P','ð‘ƒ'=>'P','ð‘·'=>'P','ð’«'=>'P','ð“Ÿ'=>'P','ð”“'=>'P','ð•»'=>'P','ð–¯'=>'P','ð—£'=>'P','ð˜—'=>'P','ð™‹'=>'P','ð™¿'=>'P','ðš¸'=>'P','ð›²'=>'P','ðœ¬'=>'P','ð¦'=>'P','ðž '=>'P','ðŠ'=>'K','ð¾'=>'K','ð‘²'=>'K','ð’¦'=>'K','ð“š'=>'K','ð”Ž'=>'K','ð•‚'=>'K','ð•¶'=>'K','ð–ª'=>'K','ð—ž'=>'K','ð˜’'=>'K','ð™†'=>'K','ð™º'=>'K','ðš±'=>'K','ð›«'=>'K','ðœ¥'=>'K','ðŸ'=>'K','ðž™'=>'K','ℬ'=>'B','ð'=>'B','ðµ'=>'B','ð‘©'=>'B','ð“‘'=>'B','ð”…'=>'B','ð”¹'=>'B','ð•­'=>'B','ð–¡'=>'B','ð—•'=>'B','ð˜‰'=>'B','ð˜½'=>'B','ð™±'=>'B','ðš©'=>'B','ð›£'=>'B','ðœ'=>'B','ð—'=>'B','ðž‘'=>'B','á'=>'á·','∆'=>'áƒ','ðš«'=>'áƒ','ð›¥'=>'áƒ','ðœŸ'=>'áƒ','ð™'=>'áƒ','ðž“'=>'áƒ','á'=>'áƒÂ·','á‘'=>'á„·','á“'=>'á…·','á•'=>'á†Â·','á˜'=>'áŠÂ·','áš'=>'á‹Â·','á“‘'=>'á¡','á‘¶'=>'·P','ᑺ'=>'·d','á’˜'=>'·J','á‘'=>'á³Â·','ᑃ'=>'á´Â·','á‘…'=>'á¸Â·','ᑇ'=>'á¹Â·','ˈ'=>'ᑊ','ᑘ'=>'ᑌ·','á‘§'=>'ᑌᑊ','ᑚ'=>'ᑎ·','ᑨ'=>'ᑎᑊ','ᑜ'=>'á‘·','ᑞ'=>'á‘·','á‘©'=>'á‘ᑊ','á‘ '=>'ᑑ·','á‘¢'=>'ᑕ·','ᑪ'=>'ᑕᑊ','ᑤ'=>'ᑖ·','ᑵ'=>'ᑫ·','á’…'=>'ᑫᑊ','á‘·'=>'P·','á’†'=>'Pᑊ','ᑹ'=>'ᑮ·','á‘»'=>'d·','á’‡'=>'dᑊ','ᑽ'=>'ᑰ·','á‘¿'=>'ᑲ·','á’ˆ'=>'ᑲᑊ','á’'=>'ᑳ·','ᘃ'=>'á’‰','á’“'=>'ᒉ·','á’•'=>'ᒋ·','á’—'=>'ᒌ·','á’™'=>'J·','á’›'=>'ᒎ·','ᘂ'=>'á’','á’'=>'á’·','á’Ÿ'=>'ᒑ·','á’­'=>'ᒣ·','á’¯'=>'ᒥ·','á’±'=>'ᒦ·','á’³'=>'ᒧ·','á’µ'=>'ᒨ·','á’¹'=>'ᒫ·','ᓊ'=>'ᓀ·','ᓌ'=>'ᓇ·','ᓎ'=>'ᓈᒫ','ᘄ'=>'á““','á“'=>'ᓓ·','ᓟ'=>'ᓕ·','á“¡'=>'ᓖ·','á“£'=>'ᓗ·','á“¥'=>'ᓘ·','ᘇ'=>'ᓚ','á“§'=>'ᓚ·','á“©'=>'ᓛ·','á“·'=>'ᓭ·','ᓹ'=>'ᓯ·','á“»'=>'ᓰ·','ᓽ'=>'ᓱ·','á“¿'=>'ᓲ·','á”'=>'ᓴ·','ᔃ'=>'ᓵ·','ᔌ'=>'ᔋá¸','á”'=>'ᔋᑕ','ᔎ'=>'ᔋᑲ','á”'=>'ᔋá’','ᔘ'=>'á”·','ᔚ'=>'ᔑ·','ᔜ'=>'ᔒ·','ᔞ'=>'ᔓ·','á” '=>'ᔔ·','ᔢ'=>'ᔕ·','ᔤ'=>'ᔖ·','ᔲ'=>'ᔨ·','á”´'=>'ᔩ·','á”¶'=>'ᔪ·','ᔸ'=>'ᔫ·','ᔺ'=>'ᔭ·','ᔼ'=>'ᔮ·','á™®'=>'x','ᕽ'=>'x','ᘢ'=>'ᕃ','ᘣ'=>'ᕆ','ᘤ'=>'ᕊ','á•'=>'ᕌ·','ᙯ'=>'á•á‘«','ᕾ'=>'á•ᑬ','á•¿'=>'á•P','á–€'=>'á•á‘®','á–'=>'á•d','á–‚'=>'á•á‘°','á–ƒ'=>'á•ᑲ','á–„'=>'á•ᑳ','á–…'=>'á•á’ƒ','ᕜ'=>'ᕚ·','á•©'=>'ᕧ·','â„›'=>'R','ℜ'=>'R','â„'=>'R','ð‘'=>'R','ð‘…'=>'R','ð‘¹'=>'R','ð“¡'=>'R','ð•½'=>'R','ð–±'=>'R','ð—¥'=>'R','ð˜™'=>'R','ð™'=>'R','ðš'=>'R','á™°'=>'á–•á’‰','á–Ž'=>'á–•á’Š','á–'=>'á–•á’‹','á–'=>'á–•á’Œ','á–‘'=>'á–•J','á–’'=>'á–•á’Ž','á–“'=>'á–•á’','á–”'=>'á–•á’‘','á™±'=>'á––á’‹','ᙲ'=>'á––á’Œ','ᙳ'=>'á––J','á™´'=>'á––á’Ž','ᙵ'=>'á––á’','á™¶'=>'á––á’‘','ℱ'=>'F','ð…'=>'F','ð¹'=>'F','ð‘­'=>'F','ð“•'=>'F','ð”‰'=>'F','ð”½'=>'F','ð•±'=>'F','ð–¥'=>'F','ð—™'=>'F','ð˜'=>'F','ð™'=>'F','ð™µ'=>'F','ðŸŠ'=>'F','â……'=>'D','ðƒ'=>'D','ð·'=>'D','ð‘«'=>'D','ð’Ÿ'=>'D','ð““'=>'D','ð”‡'=>'D','ð”»'=>'D','ð•¯'=>'D','ð–£'=>'D','ð——'=>'D','ð˜‹'=>'D','ð˜¿'=>'D','ð™³'=>'D','á—ª'=>'D','â„§'=>'ᘮ','ᘴ'=>'ᘮ','ð›€'=>'ᘯ','ð›º'=>'ᘯ','ðœ´'=>'ᘯ','ð®'=>'ᘯ','ðž¨'=>'ᘯ','ᘵ'=>'ᘯ','ㄱ'=>'á„€','ᄀ'=>'á„€','ᆨ'=>'á„€','ㄲ'=>'á„','ï¾¢'=>'á„','ᆩ'=>'á„','ã„´'=>'á„‚','ᄂ'=>'á„‚','ᆫ'=>'á„‚','ã„·'=>'ᄃ','ï¾§'=>'ᄃ','ᆮ'=>'ᄃ','ㄸ'=>'á„„','ᄄ'=>'á„„','ㄹ'=>'á„…','ᄅ'=>'á„…','ᆯ'=>'á„…','ã…'=>'ᄆ','ï¾±'=>'ᄆ','ᆷ'=>'ᄆ','ã…‚'=>'ᄇ','ï¾²'=>'ᄇ','ᆸ'=>'ᄇ','ã…ƒ'=>'ᄈ','ï¾³'=>'ᄈ','ã……'=>'ᄉ','ï¾µ'=>'ᄉ','ᆺ'=>'ᄉ','ã…†'=>'ᄊ','ï¾¶'=>'ᄊ','ᆻ'=>'ᄊ','ã…‡'=>'á„‹','ï¾·'=>'á„‹','ᆼ'=>'á„‹','ã…ˆ'=>'ᄌ','ᄌ'=>'ᄌ','ᆽ'=>'ᄌ','ã…‰'=>'á„','ï¾¹'=>'á„','ã…Š'=>'ᄎ','ᄎ'=>'ᄎ','ᆾ'=>'ᄎ','ã…‹'=>'á„','ï¾»'=>'á„','ᆿ'=>'á„','ã…Œ'=>'á„','ï¾¼'=>'á„','ᇀ'=>'á„','ã…'=>'á„‘','ï¾½'=>'á„‘','á‡'=>'á„‘','ã…Ž'=>'á„’','ï¾¾'=>'á„’','ᇂ'=>'á„’','ᇅ'=>'á„“','ã…¥'=>'á„”','ã…¦'=>'á„•','ᇆ'=>'á„•','ᇊ'=>'á„—','á‡'=>'ᄘ','á‡'=>'á„™','ã…€'=>'ᄚ','ï¾°'=>'ᄚ','á„»'=>'ᄚ','ᆶ'=>'ᄚ','ã…®'=>'ᄜ','ᇜ'=>'ᄜ','ã…±'=>'á„','ᇢ'=>'á„','ã…²'=>'ᄞ','ã…³'=>'á„ ','ã…„'=>'á„¡','ï¾´'=>'á„¡','ᆹ'=>'á„¡','ã…´'=>'á„¢','ã…µ'=>'á„£','ã…¶'=>'á„§','ã…·'=>'á„©','ã…¸'=>'á„«','ᇦ'=>'á„«','ã…¹'=>'ᄬ','ã…º'=>'á„­','ᇧ'=>'á„­','ã…»'=>'á„®','ã…¼'=>'ᄯ','ᇨ'=>'ᄯ','ᇩ'=>'á„°','ã…½'=>'ᄲ','ᇪ'=>'ᄲ','ã…¾'=>'á„¶','ã…¿'=>'á…€','ᇫ'=>'á…€','ᇬ'=>'á…','ᇱ'=>'á……','ㆂ'=>'á……','ᇲ'=>'á…†','ㆃ'=>'á…†','ㆀ'=>'á…‡','ᇮ'=>'á…‡','ã†'=>'á…Œ','ᇰ'=>'á…Œ','ᇳ'=>'á…–','ㆄ'=>'á…—','ᇴ'=>'á…—','ㆅ'=>'á…˜','ㆆ'=>'á…™','ᇹ'=>'á…™','ã…¤'=>'á… ','ï¾ '=>'á… ','ã…'=>'á…¡','ï¿‚'=>'á…¡','ã…'=>'á…¢','ᅢ'=>'á…¢','ã…‘'=>'á…£','ï¿„'=>'á…£','ã…’'=>'á…¤','ï¿…'=>'á…¤','ã…“'=>'á…¥','ᅥ'=>'á…¥','ã…”'=>'á…¦','ᅦ'=>'á…¦','ã…•'=>'á…§','ᅧ'=>'á…§','ã…–'=>'á…¨','ï¿‹'=>'á…¨','ã…—'=>'á…©','ᅩ'=>'á…©','ã…˜'=>'á…ª','ï¿'=>'á…ª','ã…™'=>'á…«','ᅫ'=>'á…«','ã…š'=>'á…¬','ï¿'=>'á…¬','ã…›'=>'á…­','ï¿’'=>'á…­','ã…œ'=>'á…®','ï¿“'=>'á…®','ã…'=>'á…¯','ï¿”'=>'á…¯','ã…ž'=>'á…°','ï¿•'=>'á…°','ã…Ÿ'=>'á…±','ï¿–'=>'á…±','ã… '=>'á…²','ï¿—'=>'á…²','ã…¡'=>'一','ᅳ'=>'一','ã…¢'=>'á…´','ï¿›'=>'á…´','ã…£'=>'丨','ᅵ'=>'丨','ㆇ'=>'ᆄ','ᆆ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ã†'=>'ᆞ','ㆎ'=>'ᆡ','ㄳ'=>'ᆪ','ï¾£'=>'ᆪ','ㄵ'=>'ᆬ','ï¾¥'=>'ᆬ','ã„¶'=>'ᆭ','ᆭ'=>'ᆭ','ㄺ'=>'ᆰ','ᆰ'=>'ᆰ','ã„»'=>'ᆱ','ᆱ'=>'ᆱ','ㄼ'=>'ᆲ','ᆲ'=>'ᆲ','ㄽ'=>'ᆳ','ï¾­'=>'ᆳ','ㄾ'=>'ᆴ','ï¾®'=>'ᆴ','ã„¿'=>'ᆵ','ᆵ'=>'ᆵ','ã…§'=>'ᇇ','ã…¨'=>'ᇈ','ã…©'=>'ᇌ','ã…ª'=>'ᇎ','ã…«'=>'ᇓ','ã…¬'=>'ᇗ','ã…­'=>'ᇙ','ã…¯'=>'á‡','ã…°'=>'ᇟ','ï½§'=>'ã‚¡','ï½±'=>'ã‚¢','ィ'=>'ã‚£','ï½²'=>'イ','ゥ'=>'ã‚¥','ï½³'=>'ウ','ェ'=>'ã‚§','ï½´'=>'エ','ォ'=>'ã‚©','ï½µ'=>'オ','ï½¶'=>'ã‚«','ï½·'=>'ã‚­','ク'=>'ク','ï½¹'=>'ケ','コ'=>'コ','ï½»'=>'サ','ï½¼'=>'ã‚·','ï½½'=>'ス','ï½¾'=>'ã‚»','ソ'=>'ソ','ï¾€'=>'ã‚¿','ï¾'=>'ãƒ','ッ'=>'ッ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ï¾…'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ãƒ','ノ'=>'ノ','ハ'=>'ãƒ','ヒ'=>'ヒ','フ'=>'フ','ï¾'=>'ã¸','ホ'=>'ホ','ï¾'=>'マ','â§„'=>'〼','ï¾'=>'ミ','ム'=>'ム','ï¾’'=>'メ','モ'=>'モ','ャ'=>'ャ','ï¾”'=>'ヤ','ï½­'=>'ュ','ユ'=>'ユ','ï½®'=>'ョ','ï¾–'=>'ヨ','ï¾—'=>'ラ','リ'=>'リ','ï¾™'=>'ル','レ'=>'レ','ï¾›'=>'ロ','ワ'=>'ワ','ヲ'=>'ヲ','ï¾'=>'ン','ê’ž'=>'êŠ','ê’¬'=>'ê','ê’œ'=>'ꃀ','ê’¿'=>'ꉙ','ê’¾'=>'ꊱ','ê“€'=>'ꎫ','ê“‚'=>'ꎵ','ê’º'=>'ꎿ','ê’°'=>'ê‚','ð’ '=>'ð’†','—'=>'一','―'=>'一','−'=>'一','─'=>'一','â¼€'=>'一','不'=>'ä¸','ï©°'=>'並','|'=>'丨','|'=>'丨','∣'=>'丨','â¼'=>'丨','‖'=>'丨丨','∥'=>'丨丨','串'=>'串','⼂'=>'丶','ð¯ '=>'丸','丹'=>'丹','丽'=>'丽','⼃'=>'丿','乁'=>'ä¹','⼄'=>'ä¹™','亂'=>'亂','â¼…'=>'亅','了'=>'了','⼆'=>'二','⼇'=>'亠','亮'=>'亮','⼈'=>'人','ï§½'=>'什','仌'=>'仌','令'=>'令','你'=>'ä½ ','倂'=>'ä½µ','倂'=>'ä½µ','侀'=>'ä¾€','來'=>'來','例'=>'例','侮'=>'ä¾®','侮'=>'ä¾®','侻'=>'ä¾»','便'=>'便','值'=>'値','ï§”'=>'倫','偺'=>'åº','備'=>'å‚™','像'=>'åƒ','僚'=>'僚','僧'=>'僧','僧'=>'僧','⼉'=>'å„¿','兀'=>'å…€','ï©´'=>'å……','免'=>'å…','免'=>'å…','ð¯ '=>'å…”','ð¯ '=>'å…¤','⼊'=>'å…¥','內'=>'å…§','全'=>'å…¨','兩'=>'å…©','⼋'=>'å…«','ï§‘'=>'å…­','具'=>'å…·','冀'=>'冀','⼌'=>'冂','再'=>'å†','冒'=>'冒','冕'=>'冕','â¼'=>'冖','冗'=>'冗','冤'=>'冤','⼎'=>'冫','冬'=>'冬','况'=>'况','况'=>'况','冷'=>'冷','凉'=>'凉','凌'=>'凌','凜'=>'凜','凞'=>'凞','â¼'=>'几','ð¯ '=>'凵','â¼'=>'凵','⼑'=>'刀','刃'=>'刃','切'=>'切','ð¯¡'=>'切','列'=>'列','ï§'=>'利','ï§¿'=>'刺','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','劉'=>'劉','力'=>'力','â¼’'=>'力','ï¦'=>'劣','劳'=>'劳','ï©¶'=>'勇','勇'=>'勇','勉'=>'勉','勉'=>'勉','勒'=>'å‹’','勞'=>'勞','勤'=>'勤','勤'=>'勤','勵'=>'勵','⼓'=>'勹','ï©·'=>'勺','勺'=>'勺','包'=>'包','匆'=>'匆','â¼”'=>'匕','北'=>'北','北'=>'北','⼕'=>'匚','â¼–'=>'匸','ï§«'=>'匿','â¼—'=>'å','〸'=>'å','〹'=>'å„','〺'=>'å…','卉'=>'å‰','卑'=>'å‘','卑'=>'å‘','博'=>'åš','⼘'=>'åœ','â¼™'=>'å©','即'=>'å³','卵'=>'åµ','卽'=>'å½','卿'=>'å¿','卿'=>'å¿','卿'=>'å¿','⼚'=>'厂','â¼›'=>'厶','參'=>'åƒ','⼜'=>'åˆ','及'=>'åŠ','叟'=>'åŸ','â¼'=>'å£','句'=>'å¥','叫'=>'å«','叱'=>'å±','吆'=>'å†','ï§ž'=>'å','ï§­'=>'å','吸'=>'å¸','呂'=>'å‘‚','呈'=>'呈','周'=>'周','咞'=>'å’ž','咢'=>'å’¢','咽'=>'å’½','ð¯¡'=>'å“¶','唐'=>'å”','啓'=>'å•“','啟'=>'å•“','啕'=>'å••','啣'=>'å•£','善'=>'å–„','善'=>'å–„','喇'=>'å–‡','喙'=>'å–™','喙'=>'å–™','喝'=>'å–','喝'=>'å–','喫'=>'å–«','喳'=>'å–³','ï¨'=>'å—€','嗂'=>'å—‚','ï©»'=>'å—¢','嘆'=>'嘆','嘆'=>'嘆','噑'=>'噑','器'=>'器','ð¯¡'=>'å™´','⼞'=>'å›—','囹'=>'囹','圖'=>'圖','ð¯¡'=>'圗','⼟'=>'土','型'=>'åž‹','城'=>'城','埴'=>'埴','堍'=>'å ','報'=>'å ±','堲'=>'å ²','塀'=>'å¡€','ï¨'=>'塚','塚'=>'塚','塞'=>'塞','å¡«'=>'å¡¡','墨'=>'墨','壿'=>'墫','墬'=>'墬','墳'=>'墳','壘'=>'壘','壟'=>'壟','â¼ '=>'士','壮'=>'壮','売'=>'売','壷'=>'壷','⼡'=>'夂','夆'=>'夆','â¼¢'=>'夊','â¼£'=>'夕','ð¯¡'=>'多','夢'=>'夢','⼤'=>'大','奄'=>'奄','奈'=>'奈','契'=>'契','ï©¿'=>'奔','奢'=>'奢','ï¦'=>'女','â¼¥'=>'女','姘'=>'姘','姬'=>'姬','娛'=>'娛','娧'=>'娧','婢'=>'å©¢','婦'=>'婦','嬀'=>'媯','媵'=>'媵','嬈'=>'嬈','ïª'=>'嬨','嬾'=>'嬾','嬾'=>'嬾','⼦'=>'å­','â¼§'=>'宀','宅'=>'å®…','寃'=>'寃','寘'=>'寘','寧'=>'寧','寧'=>'寧','寧'=>'寧','寮'=>'寮','寳'=>'寳','⼨'=>'寸','寿'=>'寿','将'=>'å°†','⼩'=>'å°','尢'=>'å°¢','⼪'=>'å°¢','⼫'=>'å°¸','尿'=>'å°¿','屠'=>'å± ','屢'=>'å±¢','層'=>'層','ï§Ÿ'=>'å±¥','屮'=>'å±®','屮'=>'å±®','⼬'=>'å±®','â¼­'=>'å±±','岍'=>'å²','峀'=>'å³€','ï§•'=>'å´™','嵃'=>'嵃','嵐'=>'åµ','嵫'=>'嵫','嵮'=>'åµ®','嵼'=>'åµ¼','嶲'=>'å¶²','嶺'=>'嶺','â¼®'=>'å·›','ð¯¢'=>'å·¡','巢'=>'å·¢','⼯'=>'å·¥','â¼°'=>'å·±','巽'=>'å·½','â¼±'=>'å·¾','帲'=>'帡','帨'=>'帨','帽'=>'帽','幩'=>'幩','â¼²'=>'å¹²','年'=>'å¹´','â¼³'=>'幺','â¼´'=>'广','ï¨'=>'度','庰'=>'庰','庳'=>'庳','ð¯¢'=>'庶','廉'=>'廉','廊'=>'廊','廊'=>'廊','廒'=>'å»’','廓'=>'廓','廙'=>'å»™','廬'=>'廬','â¼µ'=>'å»´','ð¯¢'=>'廾','â¼¶'=>'廾','弄'=>'弄','â¼·'=>'弋','⼸'=>'弓','弢'=>'å¼¢','弢'=>'å¼¢','â¼¹'=>'å½','当'=>'当','⼺'=>'彡','形'=>'å½¢','彩'=>'彩','彫'=>'彫','â¼»'=>'å½³','律'=>'律','徚'=>'徚','復'=>'復','徭'=>'å¾­','â¼¼'=>'心','ð¯¢'=>'å¿','志'=>'å¿—','念'=>'念','忹'=>'忹','怒'=>'怒','怜'=>'怜','悁'=>'æ‚','悔'=>'æ‚”','悔'=>'æ‚”','惇'=>'惇','惘'=>'惘','惡'=>'惡','愈'=>'愈','ï§™'=>'æ…„','慈'=>'æ…ˆ','慌'=>'æ…Œ','慌'=>'æ…Œ','慎'=>'æ…Ž','慎'=>'æ…Ž','慠'=>'æ… ','慨'=>'æ…¨','慺'=>'æ…º','憎'=>'憎','憎'=>'憎','憎'=>'憎','ï¦'=>'æ†','憤'=>'憤','憯'=>'憯','憲'=>'憲','懞'=>'懞','ï©€'=>'懲','懲'=>'懲','懲'=>'懲','ï¤'=>'懶','懶'=>'懶','ï¦'=>'戀','â¼½'=>'戈','成'=>'æˆ','戛'=>'戛','ï§’'=>'戮','戴'=>'戴','â¼¾'=>'戶','⼿'=>'手','扝'=>'æ‰','抱'=>'抱','拉'=>'拉','拏'=>'æ‹','拓'=>'æ‹“','拔'=>'æ‹”','拼'=>'拼','拾'=>'拾','挽'=>'挽','捐'=>'æ','捨'=>'æ¨','捻'=>'æ»','掃'=>'掃','掠'=>'掠','ð¯£'=>'掩','ïª'=>'æ„','揅'=>'æ…','揤'=>'æ¤','ã©'=>'æ‰','搜'=>'æœ','搢'=>'æ¢','ïª'=>'æ‘’','摩'=>'æ‘©','摷'=>'æ‘·','摾'=>'摾','撚'=>'æ’š','撝'=>'æ’','擄'=>'æ“„','â½€'=>'支','â½'=>'æ”´','ï©'=>'æ•','敏'=>'æ•','ïª'=>'æ•–','敬'=>'敬','數'=>'數','⽂'=>'æ–‡','⽃'=>'æ–—','料'=>'æ–™','⽄'=>'æ–¤','â½…'=>'æ–¹','旅'=>'æ—…','⽆'=>'æ— ','ï©‚'=>'æ—¢','旣'=>'æ—£','⽇'=>'æ—¥','ï§ '=>'易','ð¯£'=>'晉','晩'=>'晚','䀿'=>'晣','晴'=>'æ™´','晴'=>'æ™´','ï§…'=>'暈','暑'=>'æš‘','ð¯£'=>'æš‘','暜'=>'æšœ','暴'=>'æš´','曆'=>'曆','⽈'=>'æ›°','ï¤'=>'æ›´','㫚'=>'æ›¶','書'=>'書','最'=>'最','⽉'=>'月','肦'=>'朌','èƒ'=>'æœ','胊'=>'æœ','è„'=>'朓','朗'=>'朗','朗'=>'朗','朗'=>'朗','è„§'=>'朘','望'=>'望','望'=>'望','朡'=>'朡','膧'=>'朣','⽊'=>'木','ï§¡'=>'æŽ','杓'=>'æ“','杖'=>'æ–','杞'=>'æž','柿'=>'æ®','杻'=>'æ»','枅'=>'æž…','ï§´'=>'æž—','柳'=>'柳','柺'=>'柺','ï§š'=>'æ —','栟'=>'æ Ÿ','桒'=>'æ¡’','梁'=>'æ¢','ï©„'=>'梅','梅'=>'梅','梎'=>'梎','ï§¢'=>'梨','椔'=>'椔','楂'=>'楂','樧'=>'æ¦','榣'=>'榣','槪'=>'槪','樂'=>'樂','樂'=>'樂','樂'=>'樂','樓'=>'樓','檨'=>'檨','櫓'=>'æ«“','櫛'=>'æ«›','ï¤'=>'欄','⽋'=>'欠','次'=>'次','歔'=>'æ­”','⽌'=>'æ­¢','歲'=>'æ­²','歷'=>'æ­·','歹'=>'æ­¹','â½'=>'æ­¹','殟'=>'殟','殮'=>'æ®®','⽎'=>'殳','殺'=>'殺','殺'=>'殺','殺'=>'殺','殻'=>'æ®»','â½'=>'毋','⺟'=>'æ¯','â½'=>'比','⽑'=>'毛','â½’'=>'æ°','⽓'=>'æ°”','â½”'=>'æ°´','汎'=>'汎','汧'=>'æ±§','沈'=>'沈','沿'=>'沿','泌'=>'泌','泍'=>'æ³','ï§£'=>'æ³¥','洖'=>'æ´–','洛'=>'æ´›','洞'=>'æ´ž','洴'=>'æ´´','派'=>'æ´¾','ï§Š'=>'æµ','流'=>'æµ','流'=>'æµ','浩'=>'浩','浪'=>'浪','ï©…'=>'æµ·','ð¯¤'=>'æµ·','浸'=>'浸','涅'=>'æ¶…','ï§µ'=>'æ·‹','ï¥'=>'æ·š','ï§–'=>'æ·ª','淹'=>'æ·¹','渚'=>'渚','港'=>'港','湮'=>'æ¹®','æ½™'=>'溈','ï§‹'=>'溜','溺'=>'溺','滇'=>'滇','滋'=>'滋','滋'=>'滋','滑'=>'滑','滛'=>'æ»›','漏'=>'æ¼','漢'=>'æ¼¢','漢'=>'æ¼¢','漣'=>'æ¼£','ð¯¤'=>'æ½®','濆'=>'濆','濫'=>'æ¿«','濾'=>'濾','瀛'=>'瀛','瀞'=>'瀞','瀞'=>'瀞','瀹'=>'瀹','灊'=>'çŠ','⽕'=>'ç«','灰'=>'ç°','灷'=>'ç·','災'=>'ç½','ï§»'=>'ç‚™','炭'=>'ç‚­','烈'=>'烈','烙'=>'烙','煅'=>'ç……','煉'=>'ç…‰','煮'=>'ç…®','煮'=>'ç…®','熜'=>'熜','ï§€'=>'燎','ï§®'=>'ç‡','爐'=>'çˆ','爛'=>'爛','爨'=>'爨','â½–'=>'爪','爫'=>'爫','⺤'=>'爫','爵'=>'爵','爵'=>'爵','â½—'=>'父','⽘'=>'爻','â½™'=>'爿','⽚'=>'片','牐'=>'ç‰','â½›'=>'牙','⽜'=>'牛','牢'=>'牢','犀'=>'犀','犕'=>'犕','â½'=>'犬','犯'=>'犯','狀'=>'ç‹€','狼'=>'狼','猪'=>'猪','猪'=>'猪','獵'=>'çµ','獺'=>'çº','⽞'=>'玄','率'=>'率','ï§›'=>'率','⽟'=>'玉','王'=>'王','玥'=>'玥','玲'=>'玲','珞'=>'çž','理'=>'ç†','ï§Œ'=>'ç‰','琢'=>'ç¢','瑇'=>'瑇','瑜'=>'瑜','瑩'=>'ç‘©','瑱'=>'瑱','瑱'=>'瑱','璅'=>'ç’…','璉'=>'ç’‰','璘'=>'ç’˜','瓊'=>'瓊','â½ '=>'瓜','⽡'=>'瓦','甆'=>'甆','â½¢'=>'甘','â½£'=>'生','甤'=>'甤','⽤'=>'用','â½¥'=>'ç”°','画'=>'ç”»','甾'=>'甾','ï§'=>'ç•™','略'=>'ç•¥','異'=>'ç•°','異'=>'ç•°','⽦'=>'ç–‹','â½§'=>'ç–’','ï§¥'=>'ç—¢','瘐'=>'ç˜','瘝'=>'ç˜','瘟'=>'瘟','ï§'=>'療','癩'=>'癩','⽨'=>'ç™¶','⽩'=>'白','⽪'=>'çš®','⽫'=>'çš¿','益'=>'益','益'=>'益','盛'=>'ç››','盧'=>'ç›§','⽬'=>'ç›®','直'=>'ç›´','直'=>'ç›´','省'=>'çœ','眞'=>'眞','真'=>'真','真'=>'真','着'=>'ç€','睊'=>'çŠ','睊'=>'çŠ','瞋'=>'çž‹','ïª'=>'çž§','â½­'=>'矛','â½®'=>'矢','⽯'=>'石','ç¡'=>'ç ”','硎'=>'硎','ï§Ž'=>'ç¡«','碌'=>'碌','ð¯¥'=>'碌','ï©‹'=>'碑','磊'=>'磊','磌'=>'磌','ð¯¥'=>'磌','磻'=>'磻','礪'=>'礪','â½°'=>'示','礼'=>'礼','社'=>'社','祈'=>'祈','ï©'=>'祉','ï©'=>'ç¥','ï©'=>'祖','祖'=>'祖','ï©‘'=>'ç¥','神'=>'神','祥'=>'祥','祿'=>'祿','ï©’'=>'ç¦','ï©“'=>'禎','福'=>'ç¦','福'=>'ç¦','禮'=>'禮','â½±'=>'禸','â½²'=>'禾','秊'=>'ç§Š','秫'=>'ç§«','稜'=>'稜','ï©”'=>'ç©€','穀'=>'ç©€','穊'=>'穊','穏'=>'ç©','â½³'=>'ç©´','ï©•'=>'çª','窱'=>'窱','ï§·'=>'ç«‹','â½´'=>'ç«‹','竮'=>'ç«®','â½µ'=>'竹','笠'=>'笠','ï©–'=>'節','節'=>'節','篆'=>'篆','築'=>'築','簾'=>'ç°¾','籠'=>'ç± ','â½¶'=>'ç±³','类'=>'ç±»','ï§¹'=>'ç²’','ï¨'=>'ç²¾','糒'=>'ç³’','糖'=>'ç³–','糣'=>'ç³£','糧'=>'ç³§','糨'=>'糨','â½·'=>'糸','紀'=>'ç´€','ï§'=>'ç´','索'=>'ç´¢','ï¥'=>'ç´¯','çµ¶'=>'絕','絛'=>'çµ›','絣'=>'çµ£','綠'=>'ç¶ ','綾'=>'ç¶¾','緇'=>'ç·‡','練'=>'ç·´','ï©—'=>'ç·´','練'=>'ç·´','縂'=>'縂','縉'=>'縉','ï¥'=>'縷','ï©™'=>'ç¹','繅'=>'ç¹…','⽸'=>'ç¼¶','缾'=>'ç¼¾','â½¹'=>'网','⺫'=>'ç½’','署'=>'ç½²','罹'=>'ç½¹','罺'=>'罺','ï¤'=>'ç¾…','⽺'=>'羊','羕'=>'羕','羚'=>'羚','羽'=>'ç¾½','â½»'=>'ç¾½','翺'=>'翺','老'=>'è€','â½¼'=>'è€','ï©›'=>'者','者'=>'者','者'=>'者','â½½'=>'而','â½¾'=>'耒','⽿'=>'耳','聆'=>'è†','聠'=>'è ','聯'=>'è¯','聰'=>'è°','聾'=>'è¾','â¾€'=>'è¿','â¾'=>'肉','肋'=>'è‚‹','肭'=>'è‚­','育'=>'育','㬵'=>'胶','è…'=>'胼','脃'=>'脃','脾'=>'脾','臘'=>'臘','⾂'=>'臣','ï§¶'=>'臨','⾃'=>'自','臭'=>'臭','⾄'=>'至','â¾…'=>'臼','舁'=>'èˆ','舁'=>'èˆ','舄'=>'舄','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','良'=>'良','⾊'=>'色','⾋'=>'艸','ï©'=>'艹','艹'=>'艹','ð¯¦'=>'芋','ð¯¦'=>'芑','芝'=>'èŠ','花'=>'花','芳'=>'芳','芽'=>'芽','若'=>'è‹¥','若'=>'è‹¥','苦'=>'苦','茝'=>'èŒ','茣'=>'茣','ï§¾'=>'茶','荒'=>'è’','荓'=>'è“','荣'=>'è£','莭'=>'莭','ð¯¦'=>'莽','菉'=>'è‰','菊'=>'èŠ','菌'=>'èŒ','菜'=>'èœ','菧'=>'è§','華'=>'è¯','菱'=>'è±','落'=>'è½','葉'=>'葉','著'=>'è‘—','著'=>'è‘—','蔿'=>'è’','蓮'=>'è“®','蓱'=>'蓱','蓳'=>'蓳','ï§‚'=>'蓼','蔖'=>'è”–','蕤'=>'蕤','藍'=>'è—','ï§°'=>'è—º','蘆'=>'蘆','蘒'=>'蘒','蘭'=>'蘭','è™'=>'蘷','ï¤'=>'蘿','⾌'=>'è™','虐'=>'è™','虜'=>'虜','虜'=>'虜','虧'=>'è™§','虩'=>'虩','â¾'=>'虫','蚈'=>'蚈','蚩'=>'èš©','蛢'=>'蛢','蜎'=>'蜎','蜨'=>'蜨','蝫'=>'è«','蝹'=>'è¹','蝹'=>'è¹','螆'=>'螆','螺'=>'螺','蟡'=>'蟡','ð¯§'=>'è ','蠟'=>'è Ÿ','⾎'=>'è¡€','行'=>'行','â¾'=>'行','衠'=>'è¡ ','衣'=>'è¡£','â¾'=>'è¡£','裂'=>'裂','ï§§'=>'è£','裗'=>'裗','裞'=>'裞','裡'=>'裡','裸'=>'裸','裺'=>'裺','ï© '=>'è¤','襁'=>'è¥','襤'=>'襤','⾑'=>'襾','覆'=>'覆','見'=>'見','â¾’'=>'見','ï©¡'=>'視','視'=>'視','⾓'=>'è§’','â¾”'=>'言','äš¶'=>'訞','詽'=>'訮','ð¯§'=>'誠','說'=>'說','說'=>'說','調'=>'調','請'=>'è«‹','諒'=>'è«’','ï¥'=>'è«–','諭'=>'è«­','ð¯§'=>'è«­','諸'=>'諸','諸'=>'諸','ï¥'=>'諾','諾'=>'諾','ï©¢'=>'è¬','謁'=>'è¬','ï©£'=>'謹','謹'=>'謹','ï§¼'=>'è­˜','讀'=>'讀','è®'=>'讆','ï«€'=>'變','變'=>'變','⾕'=>'è°·','â¾–'=>'豆','豈'=>'豈','豕'=>'豕','â¾—'=>'豕','⾘'=>'豸','â¾™'=>'è²','貫'=>'貫','賁'=>'è³','賂'=>'賂','賈'=>'賈','賓'=>'賓','ï©¥'=>'è´ˆ','ï«'=>'è´ˆ','贛'=>'è´›','⾚'=>'赤','â¾›'=>'èµ°','起'=>'èµ·','趆'=>'赿','⾜'=>'è¶³','趼'=>'è¶¼','跋'=>'è·‹','è·º'=>'è·¥','路'=>'è·¯','跰'=>'è·°','躛'=>'躗','â¾'=>'身','車'=>'車','⾞'=>'車','軔'=>'è»”','è¼§'=>'軿','輦'=>'輦','ï§—'=>'輪','ï«‚'=>'輸','輸'=>'輸','輻'=>'è¼»','ï¦'=>'è½¢','⾟'=>'è¾›','ð¯¦'=>'辞','辰'=>'è¾°','â¾ '=>'è¾°','⾡'=>'è¾µ','辶'=>'è¾¶','⻌'=>'è¾¶','連'=>'連','逸'=>'逸','ï©§'=>'逸','遲'=>'é²','遼'=>'é¼','邏'=>'é‚','â¾¢'=>'é‚‘','邔'=>'é‚”','郎'=>'郎','郱'=>'郱','都'=>'都','鄑'=>'é„‘','鄛'=>'é„›','â¾£'=>'é…‰','酪'=>'é…ª','ï«„'=>'醙','醴'=>'醴','⾤'=>'釆','ï§©'=>'里','â¾¥'=>'里','量'=>'é‡','金'=>'金','⾦'=>'金','鈴'=>'鈴','鈸'=>'鈸','ï«…'=>'鉶','鉼'=>'鉼','鋗'=>'é‹—','鋘'=>'鋘','錄'=>'錄','鍊'=>'éŠ','鎮'=>'鎭','鏹'=>'é¹','鐕'=>'é•','â¾§'=>'é•·','⾨'=>'é–€','開'=>'é–‹','閭'=>'é–­','閷'=>'é–·','⾩'=>'阜','阮'=>'阮','陋'=>'陋','降'=>'é™','陵'=>'陵','ï§“'=>'陸','陼'=>'陼','ï§œ'=>'隆','ï§±'=>'隣','⾪'=>'éš¶','隸'=>'隸','⾫'=>'éš¹','雃'=>'雃','離'=>'離','難'=>'難','難'=>'難','⾬'=>'雨','零'=>'é›¶','雷'=>'é›·','霣'=>'霣','露'=>'露','靈'=>'éˆ','â¾­'=>'é‘','靖'=>'é–','靖'=>'é–','â¾®'=>'éž','⾯'=>'é¢','â¾°'=>'é©','â¾±'=>'韋','韛'=>'韛','韠'=>'韠','â¾²'=>'韭','â¾³'=>'音','ï©©'=>'響','響'=>'響','â¾´'=>'é ','ï«‹'=>'é ‹','頋'=>'é ‹','頋'=>'é ‹','領'=>'é ˜','頩'=>'é ©','頻'=>'é »','頻'=>'é »','ï§'=>'類','â¾µ'=>'風','â¾¶'=>'飛','â»'=>'食','â¾·'=>'食','飢'=>'飢','飯'=>'飯','飼'=>'飼','館'=>'館','餩'=>'餩','⾸'=>'首','â¾¹'=>'香','馧'=>'馧','⾺'=>'馬','駂'=>'é§‚','駱'=>'é§±','駾'=>'é§¾','驪'=>'驪','â¾»'=>'骨','â¾¼'=>'高','â¾½'=>'髟','ï«'=>'鬒','鬒'=>'鬒','â¾¾'=>'鬥','⾿'=>'鬯','â¿€'=>'鬲','â¿'=>'鬼','â¿‚'=>'é­š','魯'=>'é­¯','鱀'=>'é±€','ï§²'=>'é±—','⿃'=>'é³¥','鳽'=>'é³½','ð¯¨'=>'éµ§','鶴'=>'é¶´','鷺'=>'é·º','鸞'=>'鸞','鹃'=>'鹂','â¿„'=>'é¹µ','鹿'=>'鹿','â¿…'=>'鹿','麗'=>'麗','ï§³'=>'麟','⿆'=>'麥','麻'=>'麻','⿇'=>'麻','⿈'=>'黃','⿉'=>'é»','黎'=>'黎','⿊'=>'黑','黹'=>'黹','â¿‹'=>'黹','⿌'=>'黽','黾'=>'黾','鼅'=>'é¼…','â¿'=>'鼎','鼏'=>'é¼','⿎'=>'鼓','鼖'=>'é¼–','â¿'=>'é¼ ','鼻'=>'é¼»','â¿'=>'é¼»','齃'=>'齃','â¿‘'=>'齊','â¿’'=>'é½’','ï§„'=>'é¾','â¿“'=>'é¾','ï«™'=>'龎','龜'=>'龜','龜'=>'龜','龜'=>'龜','â¿”'=>'龜','⻳'=>'龟','â¿•'=>'é¾ ','㒞'=>'ã’ž','㒹'=>'ã’¹','㒻'=>'ã’»','㓟'=>'㓟','㔕'=>'㔕','䎛'=>'ã–ˆ','㛮'=>'ã›®','㛼'=>'㛼','㞁'=>'ãž','㠯'=>'ã ¯','㡢'=>'ã¡¢','㡼'=>'㡼','㣇'=>'㣇','㣣'=>'㣣','㤜'=>'㤜','㤺'=>'㤺','㨮'=>'㨮','㩬'=>'㩬','㫤'=>'㫤','ð¯£'=>'㬈','㬙'=>'㬙','ä '=>'㬻','㭉'=>'ã­‰','ï«’'=>'ã®','㮝'=>'ã®','㰘'=>'ã°˜','㱎'=>'㱎','㴳'=>'ã´³','㶖'=>'ã¶–','㺬'=>'㺬','㺸'=>'㺸','㺸'=>'㺸','㼛'=>'ã¼›','㿼'=>'㿼','䀈'=>'䀈','ï«“'=>'䀘','ï«”'=>'䀹','䀹'=>'䀹','䁆'=>'ä†','䂖'=>'ä‚–','䃣'=>'䃣','䄯'=>'䄯','䈂'=>'䈂','䈧'=>'䈧','䊠'=>'䊠','䌁'=>'äŒ','䌴'=>'䌴','䍙'=>'ä™','ð¯¦'=>'ä•','䏙'=>'ä™','䐋'=>'ä‹','䑫'=>'ä‘«','䔫'=>'䔫','䕝'=>'ä•','䕡'=>'ä•¡','䕫'=>'ä•«','䗗'=>'ä——','䗹'=>'ä—¹','䘵'=>'䘵','ð¯§'=>'äš¾','䛇'=>'䛇','䦕'=>'䦕','䧦'=>'䧦','䩮'=>'ä©®','䩶'=>'ä©¶','䪲'=>'䪲','䬳'=>'䬳','䯎'=>'䯎','ð¯¨'=>'䳎','䳭'=>'ä³­','䳸'=>'䳸','䵖'=>'äµ–','𠄢'=>'ð „¢','𠔜'=>'𠔜','𠔥'=>'𠔥','𠕋'=>'ð •‹','ð¯ '=>'𠘺','𠠄'=>'ð  „','ð¯§'=>'𠣞','𠨬'=>'𠨬','𠭣'=>'ð ­£','𡓤'=>'𡓤','𡚨'=>'𡚨','𡛪'=>'𡛪','𡧈'=>'𡧈','𡬘'=>'𡬘','𡴋'=>'ð¡´‹','𡷤'=>'ð¡·¤','𡷦'=>'ð¡·¦','𢆃'=>'𢆃','𢆟'=>'𢆟','𢌱'=>'𢌱','𢌱'=>'𢌱','𢛔'=>'𢛔','ï«'=>'𢡄','ï«'=>'𢡊','𢬌'=>'𢬌','𢯱'=>'𢯱','𣀊'=>'𣀊','𣊸'=>'𣊸','𣍟'=>'ð£Ÿ','𣎓'=>'𣎓','𣎜'=>'𣎜','ð¯£'=>'ð£ƒ','ï«‘'=>'ð£•','𣑭'=>'𣑭','𣚣'=>'𣚣','𣢧'=>'𣢧','𣪍'=>'ð£ª','𣫺'=>'𣫺','𣲼'=>'𣲼','𣴞'=>'𣴞','ð¯¤'=>'𣻑','ð¯¤'=>'𣽞','𣾎'=>'𣾎','ð¯¤'=>'𤉣','𤎫'=>'𤎫','𤘈'=>'𤘈','𤜵'=>'𤜵','𤠔'=>'𤠔','𤰶'=>'𤰶','𤲒'=>'𤲒','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'ð¥„','𥃲'=>'𥃲','ð¯¥'=>'𥃳','𥄙'=>'𥄙','𥄳'=>'𥄳','ï«•'=>'𥉉','ð¯¥'=>'ð¥','𥘦'=>'𥘦','𥚚'=>'𥚚','𥛅'=>'𥛅','𥥼'=>'𥥼','ð¯¥'=>'𥪧','𥪧'=>'𥪧','𥮫'=>'𥮫','𥲀'=>'𥲀','ï«–'=>'ð¥³','𥾆'=>'𥾆','𦇚'=>'𦇚','𦈨'=>'𦈨','𦉇'=>'𦉇','𦋙'=>'𦋙','𦌾'=>'𦌾','𦓚'=>'𦓚','𦔣'=>'𦔣','𦖨'=>'𦖨','𦞧'=>'𦞧','𦞵'=>'𦞵','𦬼'=>'𦬼','𦰶'=>'𦰶','𦳕'=>'𦳕','𦵫'=>'𦵫','𦼬'=>'𦼬','𦾱'=>'𦾱','𧃒'=>'𧃒','𧏊'=>'ð§Š','𧙧'=>'ð§™§','𧢮'=>'ð§¢®','𧥦'=>'𧥦','𧲨'=>'𧲨','ï«—'=>'𧻓','𧼯'=>'𧼯','𨗒'=>'𨗒','𨗭'=>'𨗭','𨜮'=>'𨜮','𨯺'=>'𨯺','𨵷'=>'𨵷','𩅅'=>'ð©……','𩇟'=>'𩇟','𩈚'=>'𩈚','𩐊'=>'ð©Š','𩒖'=>'ð©’–','ð¯¨'=>'ð©–¶','𩬰'=>'𩬰','ð¯¨'=>'𪃎','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','ð¯¢'=>'𪎒','ð¯¨'=>'𪘀','℃'=>'°C','℉'=>'°F','ℇ'=>'Æ','â„»'=>'FAX','â„•'=>'N','â„–'=>'No','ℚ'=>'Q','₨'=>'Rs','ð“'=>'T','â„¡'=>'TEL','ð”'=>'U','ð–'=>'W','â‚©'=>'W̵','ð—'=>'X','Â¥'=>'Y̵','ðš²'=>'Λ','ðšµ'=>'Ξ','â„¿'=>'Π','ϲ'=>'c','Ï’'=>'Y','ðš½'=>'Φ','ðš¿'=>'Ψ','Ñ£'=>'Ь̵','ਃ'=>'ঃ','ಃ'=>'à°ƒ','່'=>'่','់'=>'่','້'=>'้','໊'=>'๊','໋'=>'๋','៕'=>'๚','៚'=>'๛','ÑŠ'=>'ˉb','៙'=>'à¹','à³§'=>'à±§','૨'=>'२','೨'=>'౨','à«©'=>'३','૪'=>'४','à«®'=>'८','೯'=>'౯','а'=>'a','á'=>'b','á–¯'=>'b','Ñ'=>'c','Ô'=>'d','ᑯ'=>'d','е'=>'e','Ó™'=>'Ç','ε'=>'É›','Ñ”'=>'É›','Ö„'=>'f','Ö'=>'g','Ò»'=>'h','Õ°'=>'h','á‚'=>'h','á²'=>'hÌ”','ι'=>'i','Ñ–'=>'i','Ꭵ'=>'i','ј'=>'j','Õµ'=>'j','á—°'=>'m','Õ¸'=>'n','η'=>'nÌ©','à°‚'=>'o','ಂ'=>'o','à´‚'=>'o','०'=>'o','੦'=>'o','૦'=>'o','à¹'=>'o','à»'=>'o','ο'=>'o','о'=>'o','Ö…'=>'o','á€'=>'o','Ï'=>'p','Ñ€'=>'p','á´©'=>'á´˜','Õ£'=>'q','κ'=>'ĸ','к'=>'ĸ','á´¦'=>'r','г'=>'r','Ñ•'=>'s','Ï…'=>'u','Õ½'=>'u','ν'=>'v','ѵ'=>'v','Ꮃ'=>'w','á—¯'=>'w','Ñ…'=>'x','á•'=>'x','у'=>'y','Ꭹ'=>'y','Ó¡'=>'Ê’','ჳ'=>'Ê’','Ï©'=>'ƨ','ÑŒ'=>'Æ…','Ñ‹'=>'Æ…i','É‘'=>'α','Õ®'=>'δ','á•·'=>'δ','п'=>'Ï€','ɸ'=>'φ','Ñ„'=>'φ','Ê™'=>'в','Éœ'=>'з','á´'=>'м','Êœ'=>'н','É¢'=>'Ô','á´›'=>'Ñ‚','á´™'=>'Ñ','ઽ'=>'ऽ','à«'=>'à¥','à«‚'=>'ू','à©‹'=>'ॆ','à©'=>'à¥','à«'=>'à¥','à´‰'=>'உ','à´œ'=>'à®','à´£'=>'ண','à´´'=>'à®´','à´¿'=>'ி','àµ'=>'ூ','ಅ'=>'à°…','ಆ'=>'à°†','ಇ'=>'à°‡','ಒ'=>'à°’','ಓ'=>'ఒౕ','ಜ'=>'à°œ','ಞ'=>'à°ž','ಣ'=>'à°£','à°¥'=>'à°§Ö¼','ಯ'=>'à°¯','à° '=>'à°°Ö¼','ಱ'=>'à°±','ಲ'=>'à°²','à¶Œ'=>'à´¨àµà´¨','à®¶'=>'à´¶','ຈ'=>'จ','ບ'=>'บ','ປ'=>'ป','àº'=>'à¸','ພ'=>'พ','ຟ'=>'ฟ','àº'=>'ย','។'=>'ฯ','áž·'=>'ิ','ី'=>'ี','áž¹'=>'ึ','ឺ'=>'ื','ຸ'=>'ุ','ູ'=>'ู','á—…'=>'A','á’'=>'J','ᕼ'=>'H','á¯'=>'V','á‘­'=>'P','á—·'=>'B','ヘ'=>'ã¸','ð‘'=>'ðŽ‚','ð“'=>'ðŽ“','𒀸'=>'ðŽš','á…³'=>'一','Ç€'=>'丨','á…µ'=>'丨','Ꭺ'=>'A','á´'=>'B','áŸ'=>'C','á—ž'=>'D','Ꭼ'=>'E','á–´'=>'F','á€'=>'G','Ꮋ'=>'H','Ꭻ'=>'J','á¦'=>'K','áž'=>'L','Ꮇ'=>'M','á¢'=>'P','á–‡'=>'R','á•'=>'S','á™'=>'V','áƒ'=>'Z'); \ No newline at end of file
diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php
index 0a1409041b..0c855be7c3 100644
--- a/phpBB/includes/utf/utf_tools.php
+++ b/phpBB/includes/utf/utf_tools.php
@@ -338,7 +338,7 @@ else
*/
function utf8_strtolower($string)
{
- static $UTF8_UPPER_TO_LOWER = array(
+ static $utf8_upper_to_lower = array(
"\xC3\x80" => "\xC3\xA0", "\xC3\x81" => "\xC3\xA1",
"\xC3\x82" => "\xC3\xA2", "\xC3\x83" => "\xC3\xA3", "\xC3\x84" => "\xC3\xA4", "\xC3\x85" => "\xC3\xA5",
"\xC3\x86" => "\xC3\xA6", "\xC3\x87" => "\xC3\xA7", "\xC3\x88" => "\xC3\xA8", "\xC3\x89" => "\xC3\xA9",
@@ -387,7 +387,7 @@ else
"\xE1\xBA\x82" => "\xE1\xBA\x83", "\xE1\xBA\x84" => "\xE1\xBA\x85", "\xE1\xBB\xB2" => "\xE1\xBB\xB3"
);
- return strtr(strtolower($string), $UTF8_UPPER_TO_LOWER);
+ return strtr(strtolower($string), $utf8_upper_to_lower);
}
/**
@@ -403,7 +403,7 @@ else
*/
function utf8_strtoupper($string)
{
- static $UTF8_LOWER_TO_UPPER = array(
+ static $utf8_lower_to_upper = array(
"\xC3\xA0" => "\xC3\x80", "\xC3\xA1" => "\xC3\x81",
"\xC3\xA2" => "\xC3\x82", "\xC3\xA3" => "\xC3\x83", "\xC3\xA4" => "\xC3\x84", "\xC3\xA5" => "\xC3\x85",
"\xC3\xA6" => "\xC3\x86", "\xC3\xA7" => "\xC3\x87", "\xC3\xA8" => "\xC3\x88", "\xC3\xA9" => "\xC3\x89",
@@ -452,7 +452,7 @@ else
"\xE1\xBA\x83" => "\xE1\xBA\x82", "\xE1\xBA\x85" => "\xE1\xBA\x84", "\xE1\xBB\xB3" => "\xE1\xBB\xB2"
);
- return strtr(strtoupper($string), $UTF8_LOWER_TO_UPPER);
+ return strtr(strtoupper($string), $utf8_lower_to_upper);
}
/**
@@ -1028,8 +1028,7 @@ function utf8_decode_ncr_callback($m)
}
/**
-* Takes an array of ints representing the Unicode characters and returns
-* a UTF-8 string.
+* Case folds a unicode string as per Unicode 5.0, section 3.13
*
* @param string $text text to be case folded
* @param string $option determines how we will fold the cases
@@ -1058,15 +1057,705 @@ function utf8_case_fold($text, $option = 'full')
$uniarray['s'] = include($phpbb_root_path . 'includes/utf/data/case_fold_s.' . $phpEx);
}
+ // common is always replaced
$text = strtr($text, $uniarray['c']);
+
if ($option === 'full')
{
+ // full replaces a character with multiple characters
$text = strtr($text, $uniarray['f']);
}
else
{
+ // simple replaces a character with another character
$text = strtr($text, $uniarray['s']);
}
+
+ return $text;
+}
+
+/**
+* Takes the input and does a "special" case fold. It does minor normalization
+* and returns NFKC compatable text
+*
+* @param string $text text to be case folded
+* @param string $option determines how we will fold the cases
+* @return string case folded text
+*/
+function utf8_case_fold_nfkc($text, $option = 'full')
+{
+ static $fc_nfkc_closure = array(
+ "\xCD\xBA" => "\x20\xCE\xB9",
+ "\xCF\x92" => "\xCF\x85",
+ "\xCF\x93" => "\xCF\x8D",
+ "\xCF\x94" => "\xCF\x8B",
+ "\xCF\xB2" => "\xCF\x83",
+ "\xCF\xB9" => "\xCF\x83",
+ "\xE1\xB4\xAC" => "\x61",
+ "\xE1\xB4\xAD" => "\xC3\xA6",
+ "\xE1\xB4\xAE" => "\x62",
+ "\xE1\xB4\xB0" => "\x64",
+ "\xE1\xB4\xB1" => "\x65",
+ "\xE1\xB4\xB2" => "\xC7\x9D",
+ "\xE1\xB4\xB3" => "\x67",
+ "\xE1\xB4\xB4" => "\x68",
+ "\xE1\xB4\xB5" => "\x69",
+ "\xE1\xB4\xB6" => "\x6A",
+ "\xE1\xB4\xB7" => "\x6B",
+ "\xE1\xB4\xB8" => "\x6C",
+ "\xE1\xB4\xB9" => "\x6D",
+ "\xE1\xB4\xBA" => "\x6E",
+ "\xE1\xB4\xBC" => "\x6F",
+ "\xE1\xB4\xBD" => "\xC8\xA3",
+ "\xE1\xB4\xBE" => "\x70",
+ "\xE1\xB4\xBF" => "\x72",
+ "\xE1\xB5\x80" => "\x74",
+ "\xE1\xB5\x81" => "\x75",
+ "\xE1\xB5\x82" => "\x77",
+ "\xE2\x82\xA8" => "\x72\x73",
+ "\xE2\x84\x82" => "\x63",
+ "\xE2\x84\x83" => "\xC2\xB0\x63",
+ "\xE2\x84\x87" => "\xC9\x9B",
+ "\xE2\x84\x89" => "\xC2\xB0\x66",
+ "\xE2\x84\x8B" => "\x68",
+ "\xE2\x84\x8C" => "\x68",
+ "\xE2\x84\x8D" => "\x68",
+ "\xE2\x84\x90" => "\x69",
+ "\xE2\x84\x91" => "\x69",
+ "\xE2\x84\x92" => "\x6C",
+ "\xE2\x84\x95" => "\x6E",
+ "\xE2\x84\x96" => "\x6E\x6F",
+ "\xE2\x84\x99" => "\x70",
+ "\xE2\x84\x9A" => "\x71",
+ "\xE2\x84\x9B" => "\x72",
+ "\xE2\x84\x9C" => "\x72",
+ "\xE2\x84\x9D" => "\x72",
+ "\xE2\x84\xA0" => "\x73\x6D",
+ "\xE2\x84\xA1" => "\x74\x65\x6C",
+ "\xE2\x84\xA2" => "\x74\x6D",
+ "\xE2\x84\xA4" => "\x7A",
+ "\xE2\x84\xA8" => "\x7A",
+ "\xE2\x84\xAC" => "\x62",
+ "\xE2\x84\xAD" => "\x63",
+ "\xE2\x84\xB0" => "\x65",
+ "\xE2\x84\xB1" => "\x66",
+ "\xE2\x84\xB3" => "\x6D",
+ "\xE2\x84\xBB" => "\x66\x61\x78",
+ "\xE2\x84\xBE" => "\xCE\xB3",
+ "\xE2\x84\xBF" => "\xCF\x80",
+ "\xE2\x85\x85" => "\x64",
+ "\xE3\x89\x90" => "\x70\x74\x65",
+ "\xE3\x8B\x8C" => "\x68\x67",
+ "\xE3\x8B\x8E" => "\x65\x76",
+ "\xE3\x8B\x8F" => "\x6C\x74\x64",
+ "\xE3\x8D\xB1" => "\x68\x70\x61",
+ "\xE3\x8D\xB3" => "\x61\x75",
+ "\xE3\x8D\xB5" => "\x6F\x76",
+ "\xE3\x8D\xBA" => "\x69\x75",
+ "\xE3\x8E\x80" => "\x70\x61",
+ "\xE3\x8E\x81" => "\x6E\x61",
+ "\xE3\x8E\x82" => "\xCE\xBC\x61",
+ "\xE3\x8E\x83" => "\x6D\x61",
+ "\xE3\x8E\x84" => "\x6B\x61",
+ "\xE3\x8E\x85" => "\x6B\x62",
+ "\xE3\x8E\x86" => "\x6D\x62",
+ "\xE3\x8E\x87" => "\x67\x62",
+ "\xE3\x8E\x8A" => "\x70\x66",
+ "\xE3\x8E\x8B" => "\x6E\x66",
+ "\xE3\x8E\x8C" => "\xCE\xBC\x66",
+ "\xE3\x8E\x90" => "\x68\x7A",
+ "\xE3\x8E\x91" => "\x6B\x68\x7A",
+ "\xE3\x8E\x92" => "\x6D\x68\x7A",
+ "\xE3\x8E\x93" => "\x67\x68\x7A",
+ "\xE3\x8E\x94" => "\x74\x68\x7A",
+ "\xE3\x8E\xA9" => "\x70\x61",
+ "\xE3\x8E\xAA" => "\x6B\x70\x61",
+ "\xE3\x8E\xAB" => "\x6D\x70\x61",
+ "\xE3\x8E\xAC" => "\x67\x70\x61",
+ "\xE3\x8E\xB4" => "\x70\x76",
+ "\xE3\x8E\xB5" => "\x6E\x76",
+ "\xE3\x8E\xB6" => "\xCE\xBC\x76",
+ "\xE3\x8E\xB7" => "\x6D\x76",
+ "\xE3\x8E\xB8" => "\x6B\x76",
+ "\xE3\x8E\xB9" => "\x6D\x76",
+ "\xE3\x8E\xBA" => "\x70\x77",
+ "\xE3\x8E\xBB" => "\x6E\x77",
+ "\xE3\x8E\xBC" => "\xCE\xBC\x77",
+ "\xE3\x8E\xBD" => "\x6D\x77",
+ "\xE3\x8E\xBE" => "\x6B\x77",
+ "\xE3\x8E\xBF" => "\x6D\x77",
+ "\xE3\x8F\x80" => "\x6B\xCF\x89",
+ "\xE3\x8F\x81" => "\x6D\xCF\x89",
+ "\xE3\x8F\x83" => "\x62\x71",
+ "\xE3\x8F\x86" => "\x63\xE2\x88\x95\x6B\x67",
+ "\xE3\x8F\x87" => "\x63\x6F\x2E",
+ "\xE3\x8F\x88" => "\x64\x62",
+ "\xE3\x8F\x89" => "\x67\x79",
+ "\xE3\x8F\x8B" => "\x68\x70",
+ "\xE3\x8F\x8D" => "\x6B\x6B",
+ "\xE3\x8F\x8E" => "\x6B\x6D",
+ "\xE3\x8F\x97" => "\x70\x68",
+ "\xE3\x8F\x99" => "\x70\x70\x6D",
+ "\xE3\x8F\x9A" => "\x70\x72",
+ "\xE3\x8F\x9C" => "\x73\x76",
+ "\xE3\x8F\x9D" => "\x77\x62",
+ "\xE3\x8F\x9E" => "\x76\xE2\x88\x95\x6D",
+ "\xE3\x8F\x9F" => "\x61\xE2\x88\x95\x6D",
+ "\xF0\x9D\x90\x80" => "\x61",
+ "\xF0\x9D\x90\x81" => "\x62",
+ "\xF0\x9D\x90\x82" => "\x63",
+ "\xF0\x9D\x90\x83" => "\x64",
+ "\xF0\x9D\x90\x84" => "\x65",
+ "\xF0\x9D\x90\x85" => "\x66",
+ "\xF0\x9D\x90\x86" => "\x67",
+ "\xF0\x9D\x90\x87" => "\x68",
+ "\xF0\x9D\x90\x88" => "\x69",
+ "\xF0\x9D\x90\x89" => "\x6A",
+ "\xF0\x9D\x90\x8A" => "\x6B",
+ "\xF0\x9D\x90\x8B" => "\x6C",
+ "\xF0\x9D\x90\x8C" => "\x6D",
+ "\xF0\x9D\x90\x8D" => "\x6E",
+ "\xF0\x9D\x90\x8E" => "\x6F",
+ "\xF0\x9D\x90\x8F" => "\x70",
+ "\xF0\x9D\x90\x90" => "\x71",
+ "\xF0\x9D\x90\x91" => "\x72",
+ "\xF0\x9D\x90\x92" => "\x73",
+ "\xF0\x9D\x90\x93" => "\x74",
+ "\xF0\x9D\x90\x94" => "\x75",
+ "\xF0\x9D\x90\x95" => "\x76",
+ "\xF0\x9D\x90\x96" => "\x77",
+ "\xF0\x9D\x90\x97" => "\x78",
+ "\xF0\x9D\x90\x98" => "\x79",
+ "\xF0\x9D\x90\x99" => "\x7A",
+ "\xF0\x9D\x90\xB4" => "\x61",
+ "\xF0\x9D\x90\xB5" => "\x62",
+ "\xF0\x9D\x90\xB6" => "\x63",
+ "\xF0\x9D\x90\xB7" => "\x64",
+ "\xF0\x9D\x90\xB8" => "\x65",
+ "\xF0\x9D\x90\xB9" => "\x66",
+ "\xF0\x9D\x90\xBA" => "\x67",
+ "\xF0\x9D\x90\xBB" => "\x68",
+ "\xF0\x9D\x90\xBC" => "\x69",
+ "\xF0\x9D\x90\xBD" => "\x6A",
+ "\xF0\x9D\x90\xBE" => "\x6B",
+ "\xF0\x9D\x90\xBF" => "\x6C",
+ "\xF0\x9D\x91\x80" => "\x6D",
+ "\xF0\x9D\x91\x81" => "\x6E",
+ "\xF0\x9D\x91\x82" => "\x6F",
+ "\xF0\x9D\x91\x83" => "\x70",
+ "\xF0\x9D\x91\x84" => "\x71",
+ "\xF0\x9D\x91\x85" => "\x72",
+ "\xF0\x9D\x91\x86" => "\x73",
+ "\xF0\x9D\x91\x87" => "\x74",
+ "\xF0\x9D\x91\x88" => "\x75",
+ "\xF0\x9D\x91\x89" => "\x76",
+ "\xF0\x9D\x91\x8A" => "\x77",
+ "\xF0\x9D\x91\x8B" => "\x78",
+ "\xF0\x9D\x91\x8C" => "\x79",
+ "\xF0\x9D\x91\x8D" => "\x7A",
+ "\xF0\x9D\x91\xA8" => "\x61",
+ "\xF0\x9D\x91\xA9" => "\x62",
+ "\xF0\x9D\x91\xAA" => "\x63",
+ "\xF0\x9D\x91\xAB" => "\x64",
+ "\xF0\x9D\x91\xAC" => "\x65",
+ "\xF0\x9D\x91\xAD" => "\x66",
+ "\xF0\x9D\x91\xAE" => "\x67",
+ "\xF0\x9D\x91\xAF" => "\x68",
+ "\xF0\x9D\x91\xB0" => "\x69",
+ "\xF0\x9D\x91\xB1" => "\x6A",
+ "\xF0\x9D\x91\xB2" => "\x6B",
+ "\xF0\x9D\x91\xB3" => "\x6C",
+ "\xF0\x9D\x91\xB4" => "\x6D",
+ "\xF0\x9D\x91\xB5" => "\x6E",
+ "\xF0\x9D\x91\xB6" => "\x6F",
+ "\xF0\x9D\x91\xB7" => "\x70",
+ "\xF0\x9D\x91\xB8" => "\x71",
+ "\xF0\x9D\x91\xB9" => "\x72",
+ "\xF0\x9D\x91\xBA" => "\x73",
+ "\xF0\x9D\x91\xBB" => "\x74",
+ "\xF0\x9D\x91\xBC" => "\x75",
+ "\xF0\x9D\x91\xBD" => "\x76",
+ "\xF0\x9D\x91\xBE" => "\x77",
+ "\xF0\x9D\x91\xBF" => "\x78",
+ "\xF0\x9D\x92\x80" => "\x79",
+ "\xF0\x9D\x92\x81" => "\x7A",
+ "\xF0\x9D\x92\x9C" => "\x61",
+ "\xF0\x9D\x92\x9E" => "\x63",
+ "\xF0\x9D\x92\x9F" => "\x64",
+ "\xF0\x9D\x92\xA2" => "\x67",
+ "\xF0\x9D\x92\xA5" => "\x6A",
+ "\xF0\x9D\x92\xA6" => "\x6B",
+ "\xF0\x9D\x92\xA9" => "\x6E",
+ "\xF0\x9D\x92\xAA" => "\x6F",
+ "\xF0\x9D\x92\xAB" => "\x70",
+ "\xF0\x9D\x92\xAC" => "\x71",
+ "\xF0\x9D\x92\xAE" => "\x73",
+ "\xF0\x9D\x92\xAF" => "\x74",
+ "\xF0\x9D\x92\xB0" => "\x75",
+ "\xF0\x9D\x92\xB1" => "\x76",
+ "\xF0\x9D\x92\xB2" => "\x77",
+ "\xF0\x9D\x92\xB3" => "\x78",
+ "\xF0\x9D\x92\xB4" => "\x79",
+ "\xF0\x9D\x92\xB5" => "\x7A",
+ "\xF0\x9D\x93\x90" => "\x61",
+ "\xF0\x9D\x93\x91" => "\x62",
+ "\xF0\x9D\x93\x92" => "\x63",
+ "\xF0\x9D\x93\x93" => "\x64",
+ "\xF0\x9D\x93\x94" => "\x65",
+ "\xF0\x9D\x93\x95" => "\x66",
+ "\xF0\x9D\x93\x96" => "\x67",
+ "\xF0\x9D\x93\x97" => "\x68",
+ "\xF0\x9D\x93\x98" => "\x69",
+ "\xF0\x9D\x93\x99" => "\x6A",
+ "\xF0\x9D\x93\x9A" => "\x6B",
+ "\xF0\x9D\x93\x9B" => "\x6C",
+ "\xF0\x9D\x93\x9C" => "\x6D",
+ "\xF0\x9D\x93\x9D" => "\x6E",
+ "\xF0\x9D\x93\x9E" => "\x6F",
+ "\xF0\x9D\x93\x9F" => "\x70",
+ "\xF0\x9D\x93\xA0" => "\x71",
+ "\xF0\x9D\x93\xA1" => "\x72",
+ "\xF0\x9D\x93\xA2" => "\x73",
+ "\xF0\x9D\x93\xA3" => "\x74",
+ "\xF0\x9D\x93\xA4" => "\x75",
+ "\xF0\x9D\x93\xA5" => "\x76",
+ "\xF0\x9D\x93\xA6" => "\x77",
+ "\xF0\x9D\x93\xA7" => "\x78",
+ "\xF0\x9D\x93\xA8" => "\x79",
+ "\xF0\x9D\x93\xA9" => "\x7A",
+ "\xF0\x9D\x94\x84" => "\x61",
+ "\xF0\x9D\x94\x85" => "\x62",
+ "\xF0\x9D\x94\x87" => "\x64",
+ "\xF0\x9D\x94\x88" => "\x65",
+ "\xF0\x9D\x94\x89" => "\x66",
+ "\xF0\x9D\x94\x8A" => "\x67",
+ "\xF0\x9D\x94\x8D" => "\x6A",
+ "\xF0\x9D\x94\x8E" => "\x6B",
+ "\xF0\x9D\x94\x8F" => "\x6C",
+ "\xF0\x9D\x94\x90" => "\x6D",
+ "\xF0\x9D\x94\x91" => "\x6E",
+ "\xF0\x9D\x94\x92" => "\x6F",
+ "\xF0\x9D\x94\x93" => "\x70",
+ "\xF0\x9D\x94\x94" => "\x71",
+ "\xF0\x9D\x94\x96" => "\x73",
+ "\xF0\x9D\x94\x97" => "\x74",
+ "\xF0\x9D\x94\x98" => "\x75",
+ "\xF0\x9D\x94\x99" => "\x76",
+ "\xF0\x9D\x94\x9A" => "\x77",
+ "\xF0\x9D\x94\x9B" => "\x78",
+ "\xF0\x9D\x94\x9C" => "\x79",
+ "\xF0\x9D\x94\xB8" => "\x61",
+ "\xF0\x9D\x94\xB9" => "\x62",
+ "\xF0\x9D\x94\xBB" => "\x64",
+ "\xF0\x9D\x94\xBC" => "\x65",
+ "\xF0\x9D\x94\xBD" => "\x66",
+ "\xF0\x9D\x94\xBE" => "\x67",
+ "\xF0\x9D\x95\x80" => "\x69",
+ "\xF0\x9D\x95\x81" => "\x6A",
+ "\xF0\x9D\x95\x82" => "\x6B",
+ "\xF0\x9D\x95\x83" => "\x6C",
+ "\xF0\x9D\x95\x84" => "\x6D",
+ "\xF0\x9D\x95\x86" => "\x6F",
+ "\xF0\x9D\x95\x8A" => "\x73",
+ "\xF0\x9D\x95\x8B" => "\x74",
+ "\xF0\x9D\x95\x8C" => "\x75",
+ "\xF0\x9D\x95\x8D" => "\x76",
+ "\xF0\x9D\x95\x8E" => "\x77",
+ "\xF0\x9D\x95\x8F" => "\x78",
+ "\xF0\x9D\x95\x90" => "\x79",
+ "\xF0\x9D\x95\xAC" => "\x61",
+ "\xF0\x9D\x95\xAD" => "\x62",
+ "\xF0\x9D\x95\xAE" => "\x63",
+ "\xF0\x9D\x95\xAF" => "\x64",
+ "\xF0\x9D\x95\xB0" => "\x65",
+ "\xF0\x9D\x95\xB1" => "\x66",
+ "\xF0\x9D\x95\xB2" => "\x67",
+ "\xF0\x9D\x95\xB3" => "\x68",
+ "\xF0\x9D\x95\xB4" => "\x69",
+ "\xF0\x9D\x95\xB5" => "\x6A",
+ "\xF0\x9D\x95\xB6" => "\x6B",
+ "\xF0\x9D\x95\xB7" => "\x6C",
+ "\xF0\x9D\x95\xB8" => "\x6D",
+ "\xF0\x9D\x95\xB9" => "\x6E",
+ "\xF0\x9D\x95\xBA" => "\x6F",
+ "\xF0\x9D\x95\xBB" => "\x70",
+ "\xF0\x9D\x95\xBC" => "\x71",
+ "\xF0\x9D\x95\xBD" => "\x72",
+ "\xF0\x9D\x95\xBE" => "\x73",
+ "\xF0\x9D\x95\xBF" => "\x74",
+ "\xF0\x9D\x96\x80" => "\x75",
+ "\xF0\x9D\x96\x81" => "\x76",
+ "\xF0\x9D\x96\x82" => "\x77",
+ "\xF0\x9D\x96\x83" => "\x78",
+ "\xF0\x9D\x96\x84" => "\x79",
+ "\xF0\x9D\x96\x85" => "\x7A",
+ "\xF0\x9D\x96\xA0" => "\x61",
+ "\xF0\x9D\x96\xA1" => "\x62",
+ "\xF0\x9D\x96\xA2" => "\x63",
+ "\xF0\x9D\x96\xA3" => "\x64",
+ "\xF0\x9D\x96\xA4" => "\x65",
+ "\xF0\x9D\x96\xA5" => "\x66",
+ "\xF0\x9D\x96\xA6" => "\x67",
+ "\xF0\x9D\x96\xA7" => "\x68",
+ "\xF0\x9D\x96\xA8" => "\x69",
+ "\xF0\x9D\x96\xA9" => "\x6A",
+ "\xF0\x9D\x96\xAA" => "\x6B",
+ "\xF0\x9D\x96\xAB" => "\x6C",
+ "\xF0\x9D\x96\xAC" => "\x6D",
+ "\xF0\x9D\x96\xAD" => "\x6E",
+ "\xF0\x9D\x96\xAE" => "\x6F",
+ "\xF0\x9D\x96\xAF" => "\x70",
+ "\xF0\x9D\x96\xB0" => "\x71",
+ "\xF0\x9D\x96\xB1" => "\x72",
+ "\xF0\x9D\x96\xB2" => "\x73",
+ "\xF0\x9D\x96\xB3" => "\x74",
+ "\xF0\x9D\x96\xB4" => "\x75",
+ "\xF0\x9D\x96\xB5" => "\x76",
+ "\xF0\x9D\x96\xB6" => "\x77",
+ "\xF0\x9D\x96\xB7" => "\x78",
+ "\xF0\x9D\x96\xB8" => "\x79",
+ "\xF0\x9D\x96\xB9" => "\x7A",
+ "\xF0\x9D\x97\x94" => "\x61",
+ "\xF0\x9D\x97\x95" => "\x62",
+ "\xF0\x9D\x97\x96" => "\x63",
+ "\xF0\x9D\x97\x97" => "\x64",
+ "\xF0\x9D\x97\x98" => "\x65",
+ "\xF0\x9D\x97\x99" => "\x66",
+ "\xF0\x9D\x97\x9A" => "\x67",
+ "\xF0\x9D\x97\x9B" => "\x68",
+ "\xF0\x9D\x97\x9C" => "\x69",
+ "\xF0\x9D\x97\x9D" => "\x6A",
+ "\xF0\x9D\x97\x9E" => "\x6B",
+ "\xF0\x9D\x97\x9F" => "\x6C",
+ "\xF0\x9D\x97\xA0" => "\x6D",
+ "\xF0\x9D\x97\xA1" => "\x6E",
+ "\xF0\x9D\x97\xA2" => "\x6F",
+ "\xF0\x9D\x97\xA3" => "\x70",
+ "\xF0\x9D\x97\xA4" => "\x71",
+ "\xF0\x9D\x97\xA5" => "\x72",
+ "\xF0\x9D\x97\xA6" => "\x73",
+ "\xF0\x9D\x97\xA7" => "\x74",
+ "\xF0\x9D\x97\xA8" => "\x75",
+ "\xF0\x9D\x97\xA9" => "\x76",
+ "\xF0\x9D\x97\xAA" => "\x77",
+ "\xF0\x9D\x97\xAB" => "\x78",
+ "\xF0\x9D\x97\xAC" => "\x79",
+ "\xF0\x9D\x97\xAD" => "\x7A",
+ "\xF0\x9D\x98\x88" => "\x61",
+ "\xF0\x9D\x98\x89" => "\x62",
+ "\xF0\x9D\x98\x8A" => "\x63",
+ "\xF0\x9D\x98\x8B" => "\x64",
+ "\xF0\x9D\x98\x8C" => "\x65",
+ "\xF0\x9D\x98\x8D" => "\x66",
+ "\xF0\x9D\x98\x8E" => "\x67",
+ "\xF0\x9D\x98\x8F" => "\x68",
+ "\xF0\x9D\x98\x90" => "\x69",
+ "\xF0\x9D\x98\x91" => "\x6A",
+ "\xF0\x9D\x98\x92" => "\x6B",
+ "\xF0\x9D\x98\x93" => "\x6C",
+ "\xF0\x9D\x98\x94" => "\x6D",
+ "\xF0\x9D\x98\x95" => "\x6E",
+ "\xF0\x9D\x98\x96" => "\x6F",
+ "\xF0\x9D\x98\x97" => "\x70",
+ "\xF0\x9D\x98\x98" => "\x71",
+ "\xF0\x9D\x98\x99" => "\x72",
+ "\xF0\x9D\x98\x9A" => "\x73",
+ "\xF0\x9D\x98\x9B" => "\x74",
+ "\xF0\x9D\x98\x9C" => "\x75",
+ "\xF0\x9D\x98\x9D" => "\x76",
+ "\xF0\x9D\x98\x9E" => "\x77",
+ "\xF0\x9D\x98\x9F" => "\x78",
+ "\xF0\x9D\x98\xA0" => "\x79",
+ "\xF0\x9D\x98\xA1" => "\x7A",
+ "\xF0\x9D\x98\xBC" => "\x61",
+ "\xF0\x9D\x98\xBD" => "\x62",
+ "\xF0\x9D\x98\xBE" => "\x63",
+ "\xF0\x9D\x98\xBF" => "\x64",
+ "\xF0\x9D\x99\x80" => "\x65",
+ "\xF0\x9D\x99\x81" => "\x66",
+ "\xF0\x9D\x99\x82" => "\x67",
+ "\xF0\x9D\x99\x83" => "\x68",
+ "\xF0\x9D\x99\x84" => "\x69",
+ "\xF0\x9D\x99\x85" => "\x6A",
+ "\xF0\x9D\x99\x86" => "\x6B",
+ "\xF0\x9D\x99\x87" => "\x6C",
+ "\xF0\x9D\x99\x88" => "\x6D",
+ "\xF0\x9D\x99\x89" => "\x6E",
+ "\xF0\x9D\x99\x8A" => "\x6F",
+ "\xF0\x9D\x99\x8B" => "\x70",
+ "\xF0\x9D\x99\x8C" => "\x71",
+ "\xF0\x9D\x99\x8D" => "\x72",
+ "\xF0\x9D\x99\x8E" => "\x73",
+ "\xF0\x9D\x99\x8F" => "\x74",
+ "\xF0\x9D\x99\x90" => "\x75",
+ "\xF0\x9D\x99\x91" => "\x76",
+ "\xF0\x9D\x99\x92" => "\x77",
+ "\xF0\x9D\x99\x93" => "\x78",
+ "\xF0\x9D\x99\x94" => "\x79",
+ "\xF0\x9D\x99\x95" => "\x7A",
+ "\xF0\x9D\x99\xB0" => "\x61",
+ "\xF0\x9D\x99\xB1" => "\x62",
+ "\xF0\x9D\x99\xB2" => "\x63",
+ "\xF0\x9D\x99\xB3" => "\x64",
+ "\xF0\x9D\x99\xB4" => "\x65",
+ "\xF0\x9D\x99\xB5" => "\x66",
+ "\xF0\x9D\x99\xB6" => "\x67",
+ "\xF0\x9D\x99\xB7" => "\x68",
+ "\xF0\x9D\x99\xB8" => "\x69",
+ "\xF0\x9D\x99\xB9" => "\x6A",
+ "\xF0\x9D\x99\xBA" => "\x6B",
+ "\xF0\x9D\x99\xBB" => "\x6C",
+ "\xF0\x9D\x99\xBC" => "\x6D",
+ "\xF0\x9D\x99\xBD" => "\x6E",
+ "\xF0\x9D\x99\xBE" => "\x6F",
+ "\xF0\x9D\x99\xBF" => "\x70",
+ "\xF0\x9D\x9A\x80" => "\x71",
+ "\xF0\x9D\x9A\x81" => "\x72",
+ "\xF0\x9D\x9A\x82" => "\x73",
+ "\xF0\x9D\x9A\x83" => "\x74",
+ "\xF0\x9D\x9A\x84" => "\x75",
+ "\xF0\x9D\x9A\x85" => "\x76",
+ "\xF0\x9D\x9A\x86" => "\x77",
+ "\xF0\x9D\x9A\x87" => "\x78",
+ "\xF0\x9D\x9A\x88" => "\x79",
+ "\xF0\x9D\x9A\x89" => "\x7A",
+ "\xF0\x9D\x9A\xA8" => "\xCE\xB1",
+ "\xF0\x9D\x9A\xA9" => "\xCE\xB2",
+ "\xF0\x9D\x9A\xAA" => "\xCE\xB3",
+ "\xF0\x9D\x9A\xAB" => "\xCE\xB4",
+ "\xF0\x9D\x9A\xAC" => "\xCE\xB5",
+ "\xF0\x9D\x9A\xAD" => "\xCE\xB6",
+ "\xF0\x9D\x9A\xAE" => "\xCE\xB7",
+ "\xF0\x9D\x9A\xAF" => "\xCE\xB8",
+ "\xF0\x9D\x9A\xB0" => "\xCE\xB9",
+ "\xF0\x9D\x9A\xB1" => "\xCE\xBA",
+ "\xF0\x9D\x9A\xB2" => "\xCE\xBB",
+ "\xF0\x9D\x9A\xB3" => "\xCE\xBC",
+ "\xF0\x9D\x9A\xB4" => "\xCE\xBD",
+ "\xF0\x9D\x9A\xB5" => "\xCE\xBE",
+ "\xF0\x9D\x9A\xB6" => "\xCE\xBF",
+ "\xF0\x9D\x9A\xB7" => "\xCF\x80",
+ "\xF0\x9D\x9A\xB8" => "\xCF\x81",
+ "\xF0\x9D\x9A\xB9" => "\xCE\xB8",
+ "\xF0\x9D\x9A\xBA" => "\xCF\x83",
+ "\xF0\x9D\x9A\xBB" => "\xCF\x84",
+ "\xF0\x9D\x9A\xBC" => "\xCF\x85",
+ "\xF0\x9D\x9A\xBD" => "\xCF\x86",
+ "\xF0\x9D\x9A\xBE" => "\xCF\x87",
+ "\xF0\x9D\x9A\xBF" => "\xCF\x88",
+ "\xF0\x9D\x9B\x80" => "\xCF\x89",
+ "\xF0\x9D\x9B\x93" => "\xCF\x83",
+ "\xF0\x9D\x9B\xA2" => "\xCE\xB1",
+ "\xF0\x9D\x9B\xA3" => "\xCE\xB2",
+ "\xF0\x9D\x9B\xA4" => "\xCE\xB3",
+ "\xF0\x9D\x9B\xA5" => "\xCE\xB4",
+ "\xF0\x9D\x9B\xA6" => "\xCE\xB5",
+ "\xF0\x9D\x9B\xA7" => "\xCE\xB6",
+ "\xF0\x9D\x9B\xA8" => "\xCE\xB7",
+ "\xF0\x9D\x9B\xA9" => "\xCE\xB8",
+ "\xF0\x9D\x9B\xAA" => "\xCE\xB9",
+ "\xF0\x9D\x9B\xAB" => "\xCE\xBA",
+ "\xF0\x9D\x9B\xAC" => "\xCE\xBB",
+ "\xF0\x9D\x9B\xAD" => "\xCE\xBC",
+ "\xF0\x9D\x9B\xAE" => "\xCE\xBD",
+ "\xF0\x9D\x9B\xAF" => "\xCE\xBE",
+ "\xF0\x9D\x9B\xB0" => "\xCE\xBF",
+ "\xF0\x9D\x9B\xB1" => "\xCF\x80",
+ "\xF0\x9D\x9B\xB2" => "\xCF\x81",
+ "\xF0\x9D\x9B\xB3" => "\xCE\xB8",
+ "\xF0\x9D\x9B\xB4" => "\xCF\x83",
+ "\xF0\x9D\x9B\xB5" => "\xCF\x84",
+ "\xF0\x9D\x9B\xB6" => "\xCF\x85",
+ "\xF0\x9D\x9B\xB7" => "\xCF\x86",
+ "\xF0\x9D\x9B\xB8" => "\xCF\x87",
+ "\xF0\x9D\x9B\xB9" => "\xCF\x88",
+ "\xF0\x9D\x9B\xBA" => "\xCF\x89",
+ "\xF0\x9D\x9C\x8D" => "\xCF\x83",
+ "\xF0\x9D\x9C\x9C" => "\xCE\xB1",
+ "\xF0\x9D\x9C\x9D" => "\xCE\xB2",
+ "\xF0\x9D\x9C\x9E" => "\xCE\xB3",
+ "\xF0\x9D\x9C\x9F" => "\xCE\xB4",
+ "\xF0\x9D\x9C\xA0" => "\xCE\xB5",
+ "\xF0\x9D\x9C\xA1" => "\xCE\xB6",
+ "\xF0\x9D\x9C\xA2" => "\xCE\xB7",
+ "\xF0\x9D\x9C\xA3" => "\xCE\xB8",
+ "\xF0\x9D\x9C\xA4" => "\xCE\xB9",
+ "\xF0\x9D\x9C\xA5" => "\xCE\xBA",
+ "\xF0\x9D\x9C\xA6" => "\xCE\xBB",
+ "\xF0\x9D\x9C\xA7" => "\xCE\xBC",
+ "\xF0\x9D\x9C\xA8" => "\xCE\xBD",
+ "\xF0\x9D\x9C\xA9" => "\xCE\xBE",
+ "\xF0\x9D\x9C\xAA" => "\xCE\xBF",
+ "\xF0\x9D\x9C\xAB" => "\xCF\x80",
+ "\xF0\x9D\x9C\xAC" => "\xCF\x81",
+ "\xF0\x9D\x9C\xAD" => "\xCE\xB8",
+ "\xF0\x9D\x9C\xAE" => "\xCF\x83",
+ "\xF0\x9D\x9C\xAF" => "\xCF\x84",
+ "\xF0\x9D\x9C\xB0" => "\xCF\x85",
+ "\xF0\x9D\x9C\xB1" => "\xCF\x86",
+ "\xF0\x9D\x9C\xB2" => "\xCF\x87",
+ "\xF0\x9D\x9C\xB3" => "\xCF\x88",
+ "\xF0\x9D\x9C\xB4" => "\xCF\x89",
+ "\xF0\x9D\x9D\x87" => "\xCF\x83",
+ "\xF0\x9D\x9D\x96" => "\xCE\xB1",
+ "\xF0\x9D\x9D\x97" => "\xCE\xB2",
+ "\xF0\x9D\x9D\x98" => "\xCE\xB3",
+ "\xF0\x9D\x9D\x99" => "\xCE\xB4",
+ "\xF0\x9D\x9D\x9A" => "\xCE\xB5",
+ "\xF0\x9D\x9D\x9B" => "\xCE\xB6",
+ "\xF0\x9D\x9D\x9C" => "\xCE\xB7",
+ "\xF0\x9D\x9D\x9D" => "\xCE\xB8",
+ "\xF0\x9D\x9D\x9E" => "\xCE\xB9",
+ "\xF0\x9D\x9D\x9F" => "\xCE\xBA",
+ "\xF0\x9D\x9D\xA0" => "\xCE\xBB",
+ "\xF0\x9D\x9D\xA1" => "\xCE\xBC",
+ "\xF0\x9D\x9D\xA2" => "\xCE\xBD",
+ "\xF0\x9D\x9D\xA3" => "\xCE\xBE",
+ "\xF0\x9D\x9D\xA4" => "\xCE\xBF",
+ "\xF0\x9D\x9D\xA5" => "\xCF\x80",
+ "\xF0\x9D\x9D\xA6" => "\xCF\x81",
+ "\xF0\x9D\x9D\xA7" => "\xCE\xB8",
+ "\xF0\x9D\x9D\xA8" => "\xCF\x83",
+ "\xF0\x9D\x9D\xA9" => "\xCF\x84",
+ "\xF0\x9D\x9D\xAA" => "\xCF\x85",
+ "\xF0\x9D\x9D\xAB" => "\xCF\x86",
+ "\xF0\x9D\x9D\xAC" => "\xCF\x87",
+ "\xF0\x9D\x9D\xAD" => "\xCF\x88",
+ "\xF0\x9D\x9D\xAE" => "\xCF\x89",
+ "\xF0\x9D\x9E\x81" => "\xCF\x83",
+ "\xF0\x9D\x9E\x90" => "\xCE\xB1",
+ "\xF0\x9D\x9E\x91" => "\xCE\xB2",
+ "\xF0\x9D\x9E\x92" => "\xCE\xB3",
+ "\xF0\x9D\x9E\x93" => "\xCE\xB4",
+ "\xF0\x9D\x9E\x94" => "\xCE\xB5",
+ "\xF0\x9D\x9E\x95" => "\xCE\xB6",
+ "\xF0\x9D\x9E\x96" => "\xCE\xB7",
+ "\xF0\x9D\x9E\x97" => "\xCE\xB8",
+ "\xF0\x9D\x9E\x98" => "\xCE\xB9",
+ "\xF0\x9D\x9E\x99" => "\xCE\xBA",
+ "\xF0\x9D\x9E\x9A" => "\xCE\xBB",
+ "\xF0\x9D\x9E\x9B" => "\xCE\xBC",
+ "\xF0\x9D\x9E\x9C" => "\xCE\xBD",
+ "\xF0\x9D\x9E\x9D" => "\xCE\xBE",
+ "\xF0\x9D\x9E\x9E" => "\xCE\xBF",
+ "\xF0\x9D\x9E\x9F" => "\xCF\x80",
+ "\xF0\x9D\x9E\xA0" => "\xCF\x81",
+ "\xF0\x9D\x9E\xA1" => "\xCE\xB8",
+ "\xF0\x9D\x9E\xA2" => "\xCF\x83",
+ "\xF0\x9D\x9E\xA3" => "\xCF\x84",
+ "\xF0\x9D\x9E\xA4" => "\xCF\x85",
+ "\xF0\x9D\x9E\xA5" => "\xCF\x86",
+ "\xF0\x9D\x9E\xA6" => "\xCF\x87",
+ "\xF0\x9D\x9E\xA7" => "\xCF\x88",
+ "\xF0\x9D\x9E\xA8" => "\xCF\x89",
+ "\xF0\x9D\x9E\xBB" => "\xCF\x83",
+ "\xF0\x9D\x9F\x8A" => "\xCF\x9D",
+ );
+ global $phpbb_root_path, $phpEx;
+
+ // do the case fold
+ $text = utf8_case_fold($text, $option);
+
+ if (!class_exists('utf_normalizer'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
+ }
+
+ // convert to NFKC
+ utf_normalizer::nfkc($text);
+
+ // FC_NFKC_Closure, http://www.unicode.org/Public/5.0.0/ucd/DerivedNormalizationProps.txt
+ $text = strtr($text, $fc_nfkc_closure);
+
+ return $text;
+}
+
+/**
+* Assume the input is NFC:
+* Takes the input and does a "special" case fold. It does minor normalization as well.
+*
+* @param string $text text to be case folded
+* @param string $option determines how we will fold the cases
+* @return string case folded text
+*/
+function utf8_case_fold_nfc($text, $option = 'full')
+{
+ static $uniarray = array();
+ static $ypogegrammeni = array(
+ "\xCD\xBA" => "\x20\xCD\x85",
+ "\xE1\xBE\x80" => "\xE1\xBC\x80\xCD\x85",
+ "\xE1\xBE\x81" => "\xE1\xBC\x81\xCD\x85",
+ "\xE1\xBE\x82" => "\xE1\xBC\x82\xCD\x85",
+ "\xE1\xBE\x83" => "\xE1\xBC\x83\xCD\x85",
+ "\xE1\xBE\x84" => "\xE1\xBC\x84\xCD\x85",
+ "\xE1\xBE\x85" => "\xE1\xBC\x85\xCD\x85",
+ "\xE1\xBE\x86" => "\xE1\xBC\x86\xCD\x85",
+ "\xE1\xBE\x87" => "\xE1\xBC\x87\xCD\x85",
+ "\xE1\xBE\x88" => "\xE1\xBC\x88\xCD\x85",
+ "\xE1\xBE\x89" => "\xE1\xBC\x89\xCD\x85",
+ "\xE1\xBE\x8A" => "\xE1\xBC\x8A\xCD\x85",
+ "\xE1\xBE\x8B" => "\xE1\xBC\x8B\xCD\x85",
+ "\xE1\xBE\x8C" => "\xE1\xBC\x8C\xCD\x85",
+ "\xE1\xBE\x8D" => "\xE1\xBC\x8D\xCD\x85",
+ "\xE1\xBE\x8E" => "\xE1\xBC\x8E\xCD\x85",
+ "\xE1\xBE\x8F" => "\xE1\xBC\x8F\xCD\x85",
+ "\xE1\xBE\x90" => "\xE1\xBC\xA0\xCD\x85",
+ "\xE1\xBE\x91" => "\xE1\xBC\xA1\xCD\x85",
+ "\xE1\xBE\x92" => "\xE1\xBC\xA2\xCD\x85",
+ "\xE1\xBE\x93" => "\xE1\xBC\xA3\xCD\x85",
+ "\xE1\xBE\x94" => "\xE1\xBC\xA4\xCD\x85",
+ "\xE1\xBE\x95" => "\xE1\xBC\xA5\xCD\x85",
+ "\xE1\xBE\x96" => "\xE1\xBC\xA6\xCD\x85",
+ "\xE1\xBE\x97" => "\xE1\xBC\xA7\xCD\x85",
+ "\xE1\xBE\x98" => "\xE1\xBC\xA8\xCD\x85",
+ "\xE1\xBE\x99" => "\xE1\xBC\xA9\xCD\x85",
+ "\xE1\xBE\x9A" => "\xE1\xBC\xAA\xCD\x85",
+ "\xE1\xBE\x9B" => "\xE1\xBC\xAB\xCD\x85",
+ "\xE1\xBE\x9C" => "\xE1\xBC\xAC\xCD\x85",
+ "\xE1\xBE\x9D" => "\xE1\xBC\xAD\xCD\x85",
+ "\xE1\xBE\x9E" => "\xE1\xBC\xAE\xCD\x85",
+ "\xE1\xBE\x9F" => "\xE1\xBC\xAF\xCD\x85",
+ "\xE1\xBE\xA0" => "\xE1\xBD\xA0\xCD\x85",
+ "\xE1\xBE\xA1" => "\xE1\xBD\xA1\xCD\x85",
+ "\xE1\xBE\xA2" => "\xE1\xBD\xA2\xCD\x85",
+ "\xE1\xBE\xA3" => "\xE1\xBD\xA3\xCD\x85",
+ "\xE1\xBE\xA4" => "\xE1\xBD\xA4\xCD\x85",
+ "\xE1\xBE\xA5" => "\xE1\xBD\xA5\xCD\x85",
+ "\xE1\xBE\xA6" => "\xE1\xBD\xA6\xCD\x85",
+ "\xE1\xBE\xA7" => "\xE1\xBD\xA7\xCD\x85",
+ "\xE1\xBE\xA8" => "\xE1\xBD\xA8\xCD\x85",
+ "\xE1\xBE\xA9" => "\xE1\xBD\xA9\xCD\x85",
+ "\xE1\xBE\xAA" => "\xE1\xBD\xAA\xCD\x85",
+ "\xE1\xBE\xAB" => "\xE1\xBD\xAB\xCD\x85",
+ "\xE1\xBE\xAC" => "\xE1\xBD\xAC\xCD\x85",
+ "\xE1\xBE\xAD" => "\xE1\xBD\xAD\xCD\x85",
+ "\xE1\xBE\xAE" => "\xE1\xBD\xAE\xCD\x85",
+ "\xE1\xBE\xAF" => "\xE1\xBD\xAF\xCD\x85",
+ "\xE1\xBE\xB2" => "\xE1\xBD\xB0\xCD\x85",
+ "\xE1\xBE\xB3" => "\xCE\xB1\xCD\x85",
+ "\xE1\xBE\xB4" => "\xCE\xAC\xCD\x85",
+ "\xE1\xBE\xB7" => "\xE1\xBE\xB6\xCD\x85",
+ "\xE1\xBE\xBC" => "\xCE\x91\xCD\x85",
+ "\xE1\xBF\x82" => "\xE1\xBD\xB4\xCD\x85",
+ "\xE1\xBF\x83" => "\xCE\xB7\xCD\x85",
+ "\xE1\xBF\x84" => "\xCE\xAE\xCD\x85",
+ "\xE1\xBF\x87" => "\xE1\xBF\x86\xCD\x85",
+ "\xE1\xBF\x8C" => "\xCE\x97\xCD\x85",
+ "\xE1\xBF\xB2" => "\xE1\xBD\xBC\xCD\x85",
+ "\xE1\xBF\xB3" => "\xCF\x89\xCD\x85",
+ "\xE1\xBF\xB4" => "\xCF\x8E\xCD\x85",
+ "\xE1\xBF\xB7" => "\xE1\xBF\xB6\xCD\x85",
+ "\xE1\xBF\xBC" => "\xCE\xA9\xCD\x85",
+ );
+ global $phpbb_root_path, $phpEx;
+
+ // perform a small trick, avoid further normalization on composed points that contain U+0345 in their decomposition
+ $text = strtr($text, $ypogegrammeni);
+
+ // do the case fold
+ $text = utf8_case_fold($text, $option);
+
return $text;
}
@@ -1098,7 +1787,17 @@ function utf8_normalize_nfc($strings)
{
foreach ($strings as $key => $string)
{
- utf_normalizer::nfc($strings[$key]);
+ if (is_array($string))
+ {
+ foreach ($string as $_key => $_string)
+ {
+ utf_normalizer::nfc($strings[$key][$_key]);
+ }
+ }
+ else
+ {
+ utf_normalizer::nfc($strings[$key]);
+ }
}
}
@@ -1120,154 +1819,22 @@ function utf8_normalize_nfc($strings)
*/
function utf8_clean_string($text)
{
- $text = utf8_case_fold($text);
-
- if (!class_exists('utf_normalizer'))
+ global $phpbb_root_path, $phpEx;
+
+ static $homographs = array();
+ if (empty($homographs))
{
- global $phpbb_root_path, $phpEx;
- include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
+ $homographs = include($phpbb_root_path . 'includes/utf/data/confusables.' . $phpEx);
}
- utf_normalizer::nfc($text);
-
- static $homographs = array(
- "\xC2\xA1" => "\x69", // EXCLAMATION MARK, INVERTED => LATIN SMALL LETTER I
- "\xC2\xAD" => '', // HYPHEN, SOFT => empty string
- "\xC4\x90" => "\xC3\x90", // LATIN CAPITAL LETTER D WITH STROKE => LATIN CAPITAL LETTER ETH
- "\xC7\x83" => "\x21", // LATIN LETTER RETROFLEX CLICK => EXCLAMATION MARK
- "\xC9\x85" => "\xCE\x9B", // LATIN CAPITAL LETTER TURNED V => GREEK CAPITAL LETTER LAMDA
- "\xC9\x99" => "\xC7\x9D", // LATIN SMALL LETTER SCHWA => LATIN SMALL LETTER TURNED E
- "\xCA\x99" => "\xD0\xB2", // LATIN LETTER SMALL CAPITAL B => CYRILLIC SMALL LETTER VE
- "\xCA\x9C" => "\xD0\xBD", // LATIN LETTER SMALL CAPITAL H => CYRILLIC SMALL LETTER EN
- "\xCE\x91" => "\x41", // GREEK CAPITAL LETTER ALPHA => LATIN CAPITAL LETTER A
- "\xCE\x92" => "\x42", // GREEK CAPITAL LETTER BETA => LATIN CAPITAL LETTER B
- "\xCE\x95" => "\x45", // GREEK CAPITAL LETTER EPSILON => LATIN CAPITAL LETTER E
- "\xCE\x96" => "\x5A", // GREEK CAPITAL LETTER ZETA => LATIN CAPITAL LETTER Z
- "\xCE\x97" => "\x48", // GREEK CAPITAL LETTER ETA => LATIN CAPITAL LETTER H
- "\xCE\x99" => "\x49", // GREEK CAPITAL LETTER IOTA => LATIN CAPITAL LETTER I
- "\xCE\x9A" => "\x4B", // GREEK CAPITAL LETTER KAPPA => LATIN CAPITAL LETTER K
- "\xCE\x9C" => "\x4D", // GREEK CAPITAL LETTER MU => LATIN CAPITAL LETTER M
- "\xCE\x9D" => "\x4E", // GREEK CAPITAL LETTER NU => LATIN CAPITAL LETTER N
- "\xCE\x9F" => "\x4F", // GREEK CAPITAL LETTER OMICRON => LATIN CAPITAL LETTER O
- "\xCE\xA1" => "\x50", // GREEK CAPITAL LETTER RHO => LATIN CAPITAL LETTER P
- "\xCE\xA3" => "\xC6\xA9", // GREEK CAPITAL LETTER SIGMA => LATIN CAPITAL LETTER ESH
- "\xCE\xA4" => "\x54", // GREEK CAPITAL LETTER TAU => LATIN CAPITAL LETTER T
- "\xCE\xA5" => "\x59", // GREEK CAPITAL LETTER UPSILON => LATIN CAPITAL LETTER Y
- "\xCE\xA7" => "\x58", // GREEK CAPITAL LETTER CHI => LATIN CAPITAL LETTER X
- "\xCE\xB1" => "\x61", // GREEK SMALL LETTER ALPHA => LATIN SMALL LETTER A
- "\xCE\xB5" => "\xC9\x9B", // GREEK SMALL LETTER EPSILON => LATIN SMALL LETTER OPEN E
- "\xCE\xB9" => "\xC9\xA9", // GREEK SMALL LETTER IOTA => LATIN SMALL LETTER IOTA
- "\xCE\xBF" => "\x6F", // GREEK SMALL LETTER OMICRON => LATIN SMALL LETTER O
- "\xCF\xB3" => "\x6A", // GREEK LETTER YOT => LATIN SMALL LETTER J
- "\xD0\x85" => "\x53", // CYRILLIC CAPITAL LETTER DZE => LATIN CAPITAL LETTER S
- "\xD0\x88" => "\x4A", // CYRILLIC CAPITAL LETTER JE => LATIN CAPITAL LETTER J
- "\xD0\x91" => "\xC6\x82", // CYRILLIC CAPITAL LETTER BE => LATIN CAPITAL LETTER B WITH TOPBAR
- "\xD0\x93" => "\xCE\x93", // CYRILLIC CAPITAL LETTER GHE => GREEK CAPITAL LETTER GAMMA
- "\xD0\x9F" => "\xCE\xA0", // CYRILLIC CAPITAL LETTER PE => GREEK CAPITAL LETTER PI
- "\xD0\xA1" => "\x43", // CYRILLIC CAPITAL LETTER ES => LATIN CAPITAL LETTER C
- "\xD0\xB0" => "\x61", // CYRILLIC SMALL LETTER A => LATIN SMALL LETTER A
- "\xD0\xB5" => "\x65", // CYRILLIC SMALL LETTER IE => LATIN SMALL LETTER E
- "\xD0\xBA" => "\xC4\xB8", // CYRILLIC SMALL LETTER KA => LATIN SMALL LETTER KRA
- "\xD0\xBE" => "\x6F", // CYRILLIC SMALL LETTER O => LATIN SMALL LETTER O
- "\xD1\x80" => "\x70", // CYRILLIC SMALL LETTER ER => LATIN SMALL LETTER P
- "\xD1\x81" => "\x63", // CYRILLIC SMALL LETTER ES => LATIN SMALL LETTER C
- "\xD1\x83" => "\x79", // CYRILLIC SMALL LETTER U => LATIN SMALL LETTER Y
- "\xD1\x85" => "\x78", // CYRILLIC SMALL LETTER HA => LATIN SMALL LETTER X
- "\xD1\x95" => "\x73", // CYRILLIC SMALL LETTER DZE => LATIN SMALL LETTER S
- "\xD1\x96" => "\x69", // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I => LATIN SMALL LETTER I
- "\xD1\x98" => "\x6A", // CYRILLIC SMALL LETTER JE => LATIN SMALL LETTER J
- "\xD2\xBB" => "\x68", // CYRILLIC SMALL LETTER SHHA => LATIN SMALL LETTER H
- "\xD3\x8F" => "\xC9\xAA", // CYRILLIC SMALL LETTER PALOCHKA => LATIN LETTER SMALL CAPITAL I
- "\xD3\x94" => "\xC3\x86", // CYRILLIC CAPITAL LIGATURE A IE => LATIN CAPITAL LETTER AE
- "\xD3\x95" => "\xC3\xA6", // CYRILLIC SMALL LIGATURE A IE => LATIN SMALL LETTER AE
- "\xD3\x98" => "\xC6\x8E", // CYRILLIC CAPITAL LETTER SCHWA => LATIN CAPITAL LETTER REVERSED E
- "\xD3\x99" => "\xC7\x9D", // CYRILLIC SMALL LETTER SCHWA => LATIN SMALL LETTER TURNED E
- "\xD3\xA1" => "\xCA\x92", // CYRILLIC SMALL LETTER ABKHASIAN DZE => LATIN SMALL LETTER EZH
- "\xD3\xA8" => "\xC6\x9F", // CYRILLIC CAPITAL LETTER BARRED O => LATIN CAPITAL LETTER O WITH MIDDLE TILDE
- "\xD3\xA9" => "\xC9\xB5", // CYRILLIC SMALL LETTER BARRED O => LATIN SMALL LETTER BARRED O
- "\xD4\x81" => "\x64", // CYRILLIC SMALL LETTER KOMI DE => LATIN SMALL LETTER D
- "\xE1\x81\x80" => "\xE1\x80\x9D", // MYANMAR DIGIT ZERO => MYANMAR LETTER WA
- "\xE1\x9E\xA3" => "\xE1\x9E\xA2", // KHMER INDEPENDENT VOWEL QAQ => KHMER LETTER QA
- "\xE1\xA1\x95" => "\xE1\xA0\xB5", // MONGOLIAN LETTER TODO YA => MONGOLIAN LETTER JA
- "\xE1\xA7\x90" => "\xE1\xA6\x9E", // NEW TAI LUE DIGIT ZERO => NEW TAI LUE LETTER LOW VA
- "\xE1\xAD\x92" => "\xE1\xAC\x8D", // BALINESE DIGIT TWO => BALINESE LETTER LA LENGA
- "\xE1\xAD\x93" => "\xE1\xAC\x91", // BALINESE DIGIT THREE => BALINESE LETTER OKARA
- "\xE1\xAD\x98" => "\xE1\xAC\xA8", // BALINESE DIGIT EIGHT => BALINESE LETTER PA KAPAL
- "\xE1\xAD\x9C" => "\xE1\xAD\x90", // BALINESE WINDU => BALINESE DIGIT ZERO
- "\xE1\xB4\x8D" => "\xD0\xBC", // LATIN LETTER SMALL CAPITAL M => CYRILLIC SMALL LETTER EM
- "\xE1\xB4\x9B" => "\xD1\x82", // LATIN LETTER SMALL CAPITAL T => CYRILLIC SMALL LETTER TE
- "\xE1\xB4\xA6" => "\xD0\xB3", // GREEK LETTER SMALL CAPITAL GAMMA => CYRILLIC SMALL LETTER GHE
- "\xE1\xB4\xA8" => "\xD0\xBF", // GREEK LETTER SMALL CAPITAL PI => CYRILLIC SMALL LETTER PE
- "\xE1\xB4\xA9" => "\xE1\xB4\x98", // GREEK LETTER SMALL CAPITAL RHO => LATIN LETTER SMALL CAPITAL P
- "\xE1\xB4\xAB" => "\xD0\xBB", // CYRILLIC LETTER SMALL CAPITAL EL => CYRILLIC SMALL LETTER EL
- "\xE2\x8D\xB3" => "\xC9\xA9", // APL FUNCTIONAL SYMBOL IOTA => LATIN SMALL LETTER IOTA
- "\xE2\x8D\xB4" => "\xCF\x81", // APL FUNCTIONAL SYMBOL RHO => GREEK SMALL LETTER RHO
- "\xE2\x8D\xB5" => "\xCF\x89", // APL FUNCcTIONAL SYMBOL OMEGA => GREEK SMALL LETTER OMEGA
- "\xE2\x8D\xBA" => "\xCE\xB1", // APL FUNCTIONAL SYMBOL ALPHA => GREEK SMALL LETTER ALPHA
- "\xE2\xB1\xA7" => "\xD2\xA2", // LATIN CAPITAL LETTER H WITH DESCENDER => CYRILLIC CAPITAL LETTER EN WITH DESCENDER
- "\xE2\xB1\xA9" => "\xD2\x9A", // LATIN CAPITAL LETTER K WITH DESCENDER => CYRILLIC CAPITAL LETTER KA WITH DESCENDER
- "\xF0\x90\x8F\x91" => "\xF0\x90\x8E\x82", // OLD PERSIAN NUMBER ONE => UGARITIC LETTER GAMLA
- "\xF0\x90\x8F\x93" => "\xF0\x90\x8E\x93", // OLD PERSIAN NUMBER TEN => UGARITIC LETTER AIN
- "\xF0\x90\x92\xA0" => "\xF0\x90\x92\x86", // OSMANYA DIGIT ZERO => OSMANYA LETTER DEEL
- "\xF0\x92\x80\xB8" => "\xF0\x90\x8E\x9A", // CUNEIFORM SIGN ASH => UGARITIC LETTER TO
-
- "\xC2\xA0" => "\x20", // NO-BREAK SPACE
- "\xE1\x9A\x80" => "\x20", // OGHAM SPACE MARK
- "\xE2\x80\x80" => "\x20", // EN QUAD
- "\xE2\x80\x81" => "\x20", // EM QUAD
- "\xE2\x80\x82" => "\x20", // EN SPACE
- "\xE2\x80\x83" => "\x20", // EM SPACE
- "\xE2\x80\x84" => "\x20", // THREE-PER-EM SPACE
- "\xE2\x80\x85" => "\x20", // FOUR-PER-EM SPACE
- "\xE2\x80\x86" => "\x20", // SIX-PER-EM SPACE
- "\xE2\x80\x87" => "\x20", // FIGURE SPACE
- "\xE2\x80\x88" => "\x20", // PUNCTUATION SPACE
- "\xE2\x80\x89" => "\x20", // THIN SPACE
- "\xE2\x80\x8A" => "\x20", // HAIR SPACE
- "\xE2\x80\xAF" => "\x20", // NARROW NO-BREAK SPACE
- "\xE2\x81\x9F" => "\x20", // MEDIUM MATHEMATICAL SPACE
- "\xE3\x80\x80" => "\x20", // IDEOGRAPHIC SPACE
-
- "\xDB\x9D" => '', // ARABIC END OF AYAH
- "\xDC\x8F" => '', // SYRIAC ABBREVIATION MARK
- "\xE1\xA0\x86" => '', // MONGOLIAN TODO SOFT HYPHEN
- "\xE1\xA0\x8E" => '', // MONGOLIAN VOWEL SEPARATOR
- "\xE2\x80\x8B" => '', // ZERO WIDTH SPACE
- "\xE2\x80\x8C" => '', // ZERO WIDTH NON-JOINER
- "\xE2\x80\x8D" => '', // ZERO WIDTH JOINER
- "\xE2\x80\xA8" => '', // LINE SEPARATOR
- "\xE2\x80\xA9" => '', // PARAGRAPH SEPARATOR
- "\xE2\x81\xA0" => '', // WORD JOINER
- "\xE2\x81\xA1" => '', // FUNCTION APPLICATION
- "\xE2\x81\xA2" => '', // INVISIBLE TIMES
- "\xE2\x81\xA3" => '', // INVISIBLE SEPARATOR
- "\xE2\x81\xAA" => '', // [CONTROL CHARACTERS]
- "\xE2\x81\xAB" => '', // [CONTROL CHARACTERS]
- "\xE2\x81\xAC" => '', // [CONTROL CHARACTERS]
- "\xE2\x81\xAD" => '', // [CONTROL CHARACTERS]
- "\xE2\x81\xAE" => '', // [CONTROL CHARACTERS]
- "\xE2\x81\xAF" => '', // [CONTROL CHARACTERS]
- "\xEF\xBB\xBF" => '', // ZERO WIDTH NO-BREAK SPACE
- "\xEF\xBF\xB9" => '', // [CONTROL CHARACTERS]
- "\xEF\xBF\xBA" => '', // [CONTROL CHARACTERS]
- "\xEF\xBF\xBB" => '', // [CONTROL CHARACTERS]
- "\xEF\xBF\xBC" => '', // [CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB3" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB4" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB5" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB6" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB7" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB8" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xB9" => '', // [MUSICAL CONTROL CHARACTERS]
- "\xF0\x9D\x85\xBA" => '', // [MUSICAL CONTROL CHARACTERS]
- );
-
+ $text = utf8_case_fold_nfkc($text);
$text = strtr($text, $homographs);
-
// Other control characters
$text = preg_replace('#(?:[\x00-\x1F\x7F]+|(?:\xC2[\x80-\x9F])+)#', '', $text);
- return $text;
+ // we can use trim here as all the other space characters should have been turned
+ // into normal ASCII spaces by now
+ return trim($text);
}
/**
diff --git a/phpBB/index.php b/phpBB/index.php
index 56840df70f..0ec1ecb177 100644
--- a/phpBB/index.php
+++ b/phpBB/index.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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_display.' . $phpEx);
@@ -28,8 +28,6 @@ display_forums('', $config['load_moderators']);
$total_posts = $config['num_posts'];
$total_topics = $config['num_topics'];
$total_users = $config['num_users'];
-$newest_user = $config['newest_username'];
-$newest_uid = $config['newest_user_id'];
$l_total_user_s = ($total_users == 0) ? 'TOTAL_USERS_ZERO' : 'TOTAL_USERS_OTHER';
$l_total_post_s = ($total_posts == 0) ? 'TOTAL_POSTS_ZERO' : 'TOTAL_POSTS_OTHER';
@@ -77,7 +75,7 @@ $db->sql_freeresult($result);
// Generate birthday list if required ...
$birthday_list = '';
-if ($config['load_birthdays'])
+if ($config['load_birthdays'] && $config['allow_birthdays'])
{
$now = getdate(time() + $user->timezone + $user->dst - date('Z'));
$sql = 'SELECT user_id, username, user_colour, user_birthday
@@ -88,8 +86,7 @@ if ($config['load_birthdays'])
while ($row = $db->sql_fetchrow($result))
{
- $user_colour = ($row['user_colour']) ? ' style="color:#' . $row['user_colour'] .'"' : '';
- $birthday_list .= (($birthday_list != '') ? ', ' : '') . '<a' . $user_colour . ' href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $row['user_id']) . '">' . $row['username'] . '</a>';
+ $birthday_list .= (($birthday_list != '') ? ', ' : '') . get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);
if ($age = (int) substr($row['user_birthday'], -4))
{
@@ -104,7 +101,8 @@ $template->assign_vars(array(
'TOTAL_POSTS' => sprintf($user->lang[$l_total_post_s], $total_posts),
'TOTAL_TOPICS' => sprintf($user->lang[$l_total_topic_s], $total_topics),
'TOTAL_USERS' => sprintf($user->lang[$l_total_user_s], $total_users),
- 'NEWEST_USER' => sprintf($user->lang['NEWEST_USER'], '<a href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $newest_uid) . '"' . (($config['newest_user_colour']) ? ' style="color:#' . $config['newest_user_colour'] . '"' : '') . '>', $newest_user, '</a>'),
+ 'NEWEST_USER' => sprintf($user->lang['NEWEST_USER'], get_username_string('full', $config['newest_user_id'], $config['newest_username'], $config['newest_user_colour'])),
+
'LEGEND' => $legend,
'BIRTHDAY_LIST' => $birthday_list,
diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php
index 2a542dd6fa..bacd6e43b9 100644
--- a/phpBB/install/convertors/convert_phpbb20.php
+++ b/phpBB/install/convertors/convert_phpbb20.php
@@ -31,7 +31,7 @@ unset($dbpasswd);
*/
$convertor_data = array(
'forum_name' => 'phpBB 2.0.x',
- 'version' => '1.0.RC3',
+ 'version' => '1.0.RC4',
'phpbb_version' => '3.0.0',
'author' => '<a href="http://www.phpbb.com/">phpBB Group</a>',
'dbms' => $dbms,
diff --git a/phpBB/install/convertors/functions_phpbb20.php b/phpBB/install/convertors/functions_phpbb20.php
index 443855403b..ab1a1ede11 100644
--- a/phpBB/install/convertors/functions_phpbb20.php
+++ b/phpBB/install/convertors/functions_phpbb20.php
@@ -97,7 +97,7 @@ function phpbb_insert_forums()
while ($row = $src_db->sql_fetchrow($result))
{
$sql_ary = array(
- 'forum_id' => $max_forum_id,
+ 'forum_id' => (int) $max_forum_id,
'forum_name' => ($row['cat_title']) ? htmlspecialchars(phpbb_set_default_encoding($row['cat_title']), ENT_COMPAT, 'UTF-8') : $user->lang['CATEGORY'],
'parent_id' => 0,
'forum_parents' => '',
@@ -113,8 +113,8 @@ function phpbb_insert_forums()
$cat_row = $db->sql_fetchrow($_result);
$db->sql_freeresult($_result);
- $sql_ary['left_id'] = $cat_row['right_id'] + 1;
- $sql_ary['right_id'] = $cat_row['right_id'] + 2;
+ $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1);
+ $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2);
$sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql);
@@ -148,8 +148,8 @@ function phpbb_insert_forums()
$unknown_cat_id = 'ghost';
$sql_ary = array(
- 'forum_id' => $max_forum_id,
- 'forum_name' => $user->lang['CATEGORY'],
+ 'forum_id' => (int) $max_forum_id,
+ 'forum_name' => (string) $user->lang['CATEGORY'],
'parent_id' => 0,
'forum_parents' => '',
'forum_desc' => '',
@@ -164,8 +164,8 @@ function phpbb_insert_forums()
$cat_row = $db->sql_fetchrow($_result);
$db->sql_freeresult($_result);
- $sql_ary['left_id'] = $cat_row['right_id'] + 1;
- $sql_ary['right_id'] = $cat_row['right_id'] + 2;
+ $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1);
+ $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2);
$sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql);
@@ -210,7 +210,7 @@ function phpbb_insert_forums()
$sql_ary = array(
'forum_id' => (int) $row['forum_id'],
'forum_name' => htmlspecialchars(phpbb_set_default_encoding($row['forum_name']), ENT_COMPAT, 'UTF-8'),
- 'parent_id' => $cats_added[$row['cat_id']],
+ 'parent_id' => (int) $cats_added[$row['cat_id']],
'forum_parents' => '',
'forum_desc' => htmlspecialchars(phpbb_set_default_encoding($row['forum_desc']), ENT_COMPAT, 'UTF-8'),
'forum_type' => FORUM_POST,
@@ -269,8 +269,8 @@ function phpbb_insert_forums()
WHERE ' . $cat_row['left_id'] . ' BETWEEN left_id AND right_id';
$db->sql_query($sql);
- $sql_ary['left_id'] = $cat_row['right_id'];
- $sql_ary['right_id'] = $cat_row['right_id'] + 1;
+ $sql_ary['left_id'] = (int) $cat_row['right_id'];
+ $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 1);
$sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql);
@@ -1203,6 +1203,11 @@ function phpbb_prepare_message($message)
if (strpos($message, '[quote=') !== false)
{
$message = preg_replace('/\[quote="(.*?)"\]/s', '[quote=&quot;\1&quot;]', $message);
+ $message = preg_replace('/\[quote=\\\"(.*?)\\\"\]/s', '[quote=&quot;\1&quot;]', $message);
+
+ // let's hope that this solves more problems than it causes. Deal with escaped quotes.
+ $message = str_replace('\"', '&quot;', $message);
+ $message = str_replace('\&quot;', '&quot;', $message);
}
// Already the new user id ;)
@@ -1773,7 +1778,7 @@ function phpbb_check_username_collisions()
while ($row = $src_db->sql_fetchrow($result))
{
$clean_name = utf8_clean_string(phpbb_set_default_encoding($row['username']));
- $insert_ary[] = array('user_id' => $row['user_id'], 'username_clean' => $clean_name);
+ $insert_ary[] = array('user_id' => (int) $row['user_id'], 'username_clean' => (string) $clean_name);
if ($i % 1000 == 999)
{
diff --git a/phpBB/install/data/confusables.php b/phpBB/install/data/confusables.php
new file mode 100644
index 0000000000..86223bd726
--- /dev/null
+++ b/phpBB/install/data/confusables.php
@@ -0,0 +1,632 @@
+<?php
+
+function utf8_new_case_fold($text, $option = 'full')
+{
+ static $uniarray = array();
+ global $phpbb_root_path, $phpEx;
+
+ // common is always set
+ if (!isset($uniarray['c']))
+ {
+ $uniarray['c'] = include($phpbb_root_path . 'includes/utf/data/case_fold_c.' . $phpEx);
+ }
+
+ // only set full if we need to
+ if ($option === 'full' && !isset($uniarray['f']))
+ {
+ $uniarray['f'] = include($phpbb_root_path . 'includes/utf/data/case_fold_f.' . $phpEx);
+ }
+
+ // only set simple if we need to
+ if ($option !== 'full' && !isset($uniarray['s']))
+ {
+ $uniarray['s'] = include($phpbb_root_path . 'includes/utf/data/case_fold_s.' . $phpEx);
+ }
+
+ // common is always replaced
+ $text = strtr($text, $uniarray['c']);
+
+ if ($option === 'full')
+ {
+ // full replaces a character with multiple characters
+ $text = strtr($text, $uniarray['f']);
+ }
+ else
+ {
+ // simple replaces a character with another character
+ $text = strtr($text, $uniarray['s']);
+ }
+
+ return $text;
+}
+
+function utf8_new_case_fold_nfkc($text, $option = 'full')
+{
+ static $fc_nfkc_closure = array(
+ "\xCD\xBA" => "\x20\xCE\xB9",
+ "\xCF\x92" => "\xCF\x85",
+ "\xCF\x93" => "\xCF\x8D",
+ "\xCF\x94" => "\xCF\x8B",
+ "\xCF\xB2" => "\xCF\x83",
+ "\xCF\xB9" => "\xCF\x83",
+ "\xE1\xB4\xAC" => "\x61",
+ "\xE1\xB4\xAD" => "\xC3\xA6",
+ "\xE1\xB4\xAE" => "\x62",
+ "\xE1\xB4\xB0" => "\x64",
+ "\xE1\xB4\xB1" => "\x65",
+ "\xE1\xB4\xB2" => "\xC7\x9D",
+ "\xE1\xB4\xB3" => "\x67",
+ "\xE1\xB4\xB4" => "\x68",
+ "\xE1\xB4\xB5" => "\x69",
+ "\xE1\xB4\xB6" => "\x6A",
+ "\xE1\xB4\xB7" => "\x6B",
+ "\xE1\xB4\xB8" => "\x6C",
+ "\xE1\xB4\xB9" => "\x6D",
+ "\xE1\xB4\xBA" => "\x6E",
+ "\xE1\xB4\xBC" => "\x6F",
+ "\xE1\xB4\xBD" => "\xC8\xA3",
+ "\xE1\xB4\xBE" => "\x70",
+ "\xE1\xB4\xBF" => "\x72",
+ "\xE1\xB5\x80" => "\x74",
+ "\xE1\xB5\x81" => "\x75",
+ "\xE1\xB5\x82" => "\x77",
+ "\xE2\x82\xA8" => "\x72\x73",
+ "\xE2\x84\x82" => "\x63",
+ "\xE2\x84\x83" => "\xC2\xB0\x63",
+ "\xE2\x84\x87" => "\xC9\x9B",
+ "\xE2\x84\x89" => "\xC2\xB0\x66",
+ "\xE2\x84\x8B" => "\x68",
+ "\xE2\x84\x8C" => "\x68",
+ "\xE2\x84\x8D" => "\x68",
+ "\xE2\x84\x90" => "\x69",
+ "\xE2\x84\x91" => "\x69",
+ "\xE2\x84\x92" => "\x6C",
+ "\xE2\x84\x95" => "\x6E",
+ "\xE2\x84\x96" => "\x6E\x6F",
+ "\xE2\x84\x99" => "\x70",
+ "\xE2\x84\x9A" => "\x71",
+ "\xE2\x84\x9B" => "\x72",
+ "\xE2\x84\x9C" => "\x72",
+ "\xE2\x84\x9D" => "\x72",
+ "\xE2\x84\xA0" => "\x73\x6D",
+ "\xE2\x84\xA1" => "\x74\x65\x6C",
+ "\xE2\x84\xA2" => "\x74\x6D",
+ "\xE2\x84\xA4" => "\x7A",
+ "\xE2\x84\xA8" => "\x7A",
+ "\xE2\x84\xAC" => "\x62",
+ "\xE2\x84\xAD" => "\x63",
+ "\xE2\x84\xB0" => "\x65",
+ "\xE2\x84\xB1" => "\x66",
+ "\xE2\x84\xB3" => "\x6D",
+ "\xE2\x84\xBB" => "\x66\x61\x78",
+ "\xE2\x84\xBE" => "\xCE\xB3",
+ "\xE2\x84\xBF" => "\xCF\x80",
+ "\xE2\x85\x85" => "\x64",
+ "\xE3\x89\x90" => "\x70\x74\x65",
+ "\xE3\x8B\x8C" => "\x68\x67",
+ "\xE3\x8B\x8E" => "\x65\x76",
+ "\xE3\x8B\x8F" => "\x6C\x74\x64",
+ "\xE3\x8D\xB1" => "\x68\x70\x61",
+ "\xE3\x8D\xB3" => "\x61\x75",
+ "\xE3\x8D\xB5" => "\x6F\x76",
+ "\xE3\x8D\xBA" => "\x69\x75",
+ "\xE3\x8E\x80" => "\x70\x61",
+ "\xE3\x8E\x81" => "\x6E\x61",
+ "\xE3\x8E\x82" => "\xCE\xBC\x61",
+ "\xE3\x8E\x83" => "\x6D\x61",
+ "\xE3\x8E\x84" => "\x6B\x61",
+ "\xE3\x8E\x85" => "\x6B\x62",
+ "\xE3\x8E\x86" => "\x6D\x62",
+ "\xE3\x8E\x87" => "\x67\x62",
+ "\xE3\x8E\x8A" => "\x70\x66",
+ "\xE3\x8E\x8B" => "\x6E\x66",
+ "\xE3\x8E\x8C" => "\xCE\xBC\x66",
+ "\xE3\x8E\x90" => "\x68\x7A",
+ "\xE3\x8E\x91" => "\x6B\x68\x7A",
+ "\xE3\x8E\x92" => "\x6D\x68\x7A",
+ "\xE3\x8E\x93" => "\x67\x68\x7A",
+ "\xE3\x8E\x94" => "\x74\x68\x7A",
+ "\xE3\x8E\xA9" => "\x70\x61",
+ "\xE3\x8E\xAA" => "\x6B\x70\x61",
+ "\xE3\x8E\xAB" => "\x6D\x70\x61",
+ "\xE3\x8E\xAC" => "\x67\x70\x61",
+ "\xE3\x8E\xB4" => "\x70\x76",
+ "\xE3\x8E\xB5" => "\x6E\x76",
+ "\xE3\x8E\xB6" => "\xCE\xBC\x76",
+ "\xE3\x8E\xB7" => "\x6D\x76",
+ "\xE3\x8E\xB8" => "\x6B\x76",
+ "\xE3\x8E\xB9" => "\x6D\x76",
+ "\xE3\x8E\xBA" => "\x70\x77",
+ "\xE3\x8E\xBB" => "\x6E\x77",
+ "\xE3\x8E\xBC" => "\xCE\xBC\x77",
+ "\xE3\x8E\xBD" => "\x6D\x77",
+ "\xE3\x8E\xBE" => "\x6B\x77",
+ "\xE3\x8E\xBF" => "\x6D\x77",
+ "\xE3\x8F\x80" => "\x6B\xCF\x89",
+ "\xE3\x8F\x81" => "\x6D\xCF\x89",
+ "\xE3\x8F\x83" => "\x62\x71",
+ "\xE3\x8F\x86" => "\x63\xE2\x88\x95\x6B\x67",
+ "\xE3\x8F\x87" => "\x63\x6F\x2E",
+ "\xE3\x8F\x88" => "\x64\x62",
+ "\xE3\x8F\x89" => "\x67\x79",
+ "\xE3\x8F\x8B" => "\x68\x70",
+ "\xE3\x8F\x8D" => "\x6B\x6B",
+ "\xE3\x8F\x8E" => "\x6B\x6D",
+ "\xE3\x8F\x97" => "\x70\x68",
+ "\xE3\x8F\x99" => "\x70\x70\x6D",
+ "\xE3\x8F\x9A" => "\x70\x72",
+ "\xE3\x8F\x9C" => "\x73\x76",
+ "\xE3\x8F\x9D" => "\x77\x62",
+ "\xE3\x8F\x9E" => "\x76\xE2\x88\x95\x6D",
+ "\xE3\x8F\x9F" => "\x61\xE2\x88\x95\x6D",
+ "\xF0\x9D\x90\x80" => "\x61",
+ "\xF0\x9D\x90\x81" => "\x62",
+ "\xF0\x9D\x90\x82" => "\x63",
+ "\xF0\x9D\x90\x83" => "\x64",
+ "\xF0\x9D\x90\x84" => "\x65",
+ "\xF0\x9D\x90\x85" => "\x66",
+ "\xF0\x9D\x90\x86" => "\x67",
+ "\xF0\x9D\x90\x87" => "\x68",
+ "\xF0\x9D\x90\x88" => "\x69",
+ "\xF0\x9D\x90\x89" => "\x6A",
+ "\xF0\x9D\x90\x8A" => "\x6B",
+ "\xF0\x9D\x90\x8B" => "\x6C",
+ "\xF0\x9D\x90\x8C" => "\x6D",
+ "\xF0\x9D\x90\x8D" => "\x6E",
+ "\xF0\x9D\x90\x8E" => "\x6F",
+ "\xF0\x9D\x90\x8F" => "\x70",
+ "\xF0\x9D\x90\x90" => "\x71",
+ "\xF0\x9D\x90\x91" => "\x72",
+ "\xF0\x9D\x90\x92" => "\x73",
+ "\xF0\x9D\x90\x93" => "\x74",
+ "\xF0\x9D\x90\x94" => "\x75",
+ "\xF0\x9D\x90\x95" => "\x76",
+ "\xF0\x9D\x90\x96" => "\x77",
+ "\xF0\x9D\x90\x97" => "\x78",
+ "\xF0\x9D\x90\x98" => "\x79",
+ "\xF0\x9D\x90\x99" => "\x7A",
+ "\xF0\x9D\x90\xB4" => "\x61",
+ "\xF0\x9D\x90\xB5" => "\x62",
+ "\xF0\x9D\x90\xB6" => "\x63",
+ "\xF0\x9D\x90\xB7" => "\x64",
+ "\xF0\x9D\x90\xB8" => "\x65",
+ "\xF0\x9D\x90\xB9" => "\x66",
+ "\xF0\x9D\x90\xBA" => "\x67",
+ "\xF0\x9D\x90\xBB" => "\x68",
+ "\xF0\x9D\x90\xBC" => "\x69",
+ "\xF0\x9D\x90\xBD" => "\x6A",
+ "\xF0\x9D\x90\xBE" => "\x6B",
+ "\xF0\x9D\x90\xBF" => "\x6C",
+ "\xF0\x9D\x91\x80" => "\x6D",
+ "\xF0\x9D\x91\x81" => "\x6E",
+ "\xF0\x9D\x91\x82" => "\x6F",
+ "\xF0\x9D\x91\x83" => "\x70",
+ "\xF0\x9D\x91\x84" => "\x71",
+ "\xF0\x9D\x91\x85" => "\x72",
+ "\xF0\x9D\x91\x86" => "\x73",
+ "\xF0\x9D\x91\x87" => "\x74",
+ "\xF0\x9D\x91\x88" => "\x75",
+ "\xF0\x9D\x91\x89" => "\x76",
+ "\xF0\x9D\x91\x8A" => "\x77",
+ "\xF0\x9D\x91\x8B" => "\x78",
+ "\xF0\x9D\x91\x8C" => "\x79",
+ "\xF0\x9D\x91\x8D" => "\x7A",
+ "\xF0\x9D\x91\xA8" => "\x61",
+ "\xF0\x9D\x91\xA9" => "\x62",
+ "\xF0\x9D\x91\xAA" => "\x63",
+ "\xF0\x9D\x91\xAB" => "\x64",
+ "\xF0\x9D\x91\xAC" => "\x65",
+ "\xF0\x9D\x91\xAD" => "\x66",
+ "\xF0\x9D\x91\xAE" => "\x67",
+ "\xF0\x9D\x91\xAF" => "\x68",
+ "\xF0\x9D\x91\xB0" => "\x69",
+ "\xF0\x9D\x91\xB1" => "\x6A",
+ "\xF0\x9D\x91\xB2" => "\x6B",
+ "\xF0\x9D\x91\xB3" => "\x6C",
+ "\xF0\x9D\x91\xB4" => "\x6D",
+ "\xF0\x9D\x91\xB5" => "\x6E",
+ "\xF0\x9D\x91\xB6" => "\x6F",
+ "\xF0\x9D\x91\xB7" => "\x70",
+ "\xF0\x9D\x91\xB8" => "\x71",
+ "\xF0\x9D\x91\xB9" => "\x72",
+ "\xF0\x9D\x91\xBA" => "\x73",
+ "\xF0\x9D\x91\xBB" => "\x74",
+ "\xF0\x9D\x91\xBC" => "\x75",
+ "\xF0\x9D\x91\xBD" => "\x76",
+ "\xF0\x9D\x91\xBE" => "\x77",
+ "\xF0\x9D\x91\xBF" => "\x78",
+ "\xF0\x9D\x92\x80" => "\x79",
+ "\xF0\x9D\x92\x81" => "\x7A",
+ "\xF0\x9D\x92\x9C" => "\x61",
+ "\xF0\x9D\x92\x9E" => "\x63",
+ "\xF0\x9D\x92\x9F" => "\x64",
+ "\xF0\x9D\x92\xA2" => "\x67",
+ "\xF0\x9D\x92\xA5" => "\x6A",
+ "\xF0\x9D\x92\xA6" => "\x6B",
+ "\xF0\x9D\x92\xA9" => "\x6E",
+ "\xF0\x9D\x92\xAA" => "\x6F",
+ "\xF0\x9D\x92\xAB" => "\x70",
+ "\xF0\x9D\x92\xAC" => "\x71",
+ "\xF0\x9D\x92\xAE" => "\x73",
+ "\xF0\x9D\x92\xAF" => "\x74",
+ "\xF0\x9D\x92\xB0" => "\x75",
+ "\xF0\x9D\x92\xB1" => "\x76",
+ "\xF0\x9D\x92\xB2" => "\x77",
+ "\xF0\x9D\x92\xB3" => "\x78",
+ "\xF0\x9D\x92\xB4" => "\x79",
+ "\xF0\x9D\x92\xB5" => "\x7A",
+ "\xF0\x9D\x93\x90" => "\x61",
+ "\xF0\x9D\x93\x91" => "\x62",
+ "\xF0\x9D\x93\x92" => "\x63",
+ "\xF0\x9D\x93\x93" => "\x64",
+ "\xF0\x9D\x93\x94" => "\x65",
+ "\xF0\x9D\x93\x95" => "\x66",
+ "\xF0\x9D\x93\x96" => "\x67",
+ "\xF0\x9D\x93\x97" => "\x68",
+ "\xF0\x9D\x93\x98" => "\x69",
+ "\xF0\x9D\x93\x99" => "\x6A",
+ "\xF0\x9D\x93\x9A" => "\x6B",
+ "\xF0\x9D\x93\x9B" => "\x6C",
+ "\xF0\x9D\x93\x9C" => "\x6D",
+ "\xF0\x9D\x93\x9D" => "\x6E",
+ "\xF0\x9D\x93\x9E" => "\x6F",
+ "\xF0\x9D\x93\x9F" => "\x70",
+ "\xF0\x9D\x93\xA0" => "\x71",
+ "\xF0\x9D\x93\xA1" => "\x72",
+ "\xF0\x9D\x93\xA2" => "\x73",
+ "\xF0\x9D\x93\xA3" => "\x74",
+ "\xF0\x9D\x93\xA4" => "\x75",
+ "\xF0\x9D\x93\xA5" => "\x76",
+ "\xF0\x9D\x93\xA6" => "\x77",
+ "\xF0\x9D\x93\xA7" => "\x78",
+ "\xF0\x9D\x93\xA8" => "\x79",
+ "\xF0\x9D\x93\xA9" => "\x7A",
+ "\xF0\x9D\x94\x84" => "\x61",
+ "\xF0\x9D\x94\x85" => "\x62",
+ "\xF0\x9D\x94\x87" => "\x64",
+ "\xF0\x9D\x94\x88" => "\x65",
+ "\xF0\x9D\x94\x89" => "\x66",
+ "\xF0\x9D\x94\x8A" => "\x67",
+ "\xF0\x9D\x94\x8D" => "\x6A",
+ "\xF0\x9D\x94\x8E" => "\x6B",
+ "\xF0\x9D\x94\x8F" => "\x6C",
+ "\xF0\x9D\x94\x90" => "\x6D",
+ "\xF0\x9D\x94\x91" => "\x6E",
+ "\xF0\x9D\x94\x92" => "\x6F",
+ "\xF0\x9D\x94\x93" => "\x70",
+ "\xF0\x9D\x94\x94" => "\x71",
+ "\xF0\x9D\x94\x96" => "\x73",
+ "\xF0\x9D\x94\x97" => "\x74",
+ "\xF0\x9D\x94\x98" => "\x75",
+ "\xF0\x9D\x94\x99" => "\x76",
+ "\xF0\x9D\x94\x9A" => "\x77",
+ "\xF0\x9D\x94\x9B" => "\x78",
+ "\xF0\x9D\x94\x9C" => "\x79",
+ "\xF0\x9D\x94\xB8" => "\x61",
+ "\xF0\x9D\x94\xB9" => "\x62",
+ "\xF0\x9D\x94\xBB" => "\x64",
+ "\xF0\x9D\x94\xBC" => "\x65",
+ "\xF0\x9D\x94\xBD" => "\x66",
+ "\xF0\x9D\x94\xBE" => "\x67",
+ "\xF0\x9D\x95\x80" => "\x69",
+ "\xF0\x9D\x95\x81" => "\x6A",
+ "\xF0\x9D\x95\x82" => "\x6B",
+ "\xF0\x9D\x95\x83" => "\x6C",
+ "\xF0\x9D\x95\x84" => "\x6D",
+ "\xF0\x9D\x95\x86" => "\x6F",
+ "\xF0\x9D\x95\x8A" => "\x73",
+ "\xF0\x9D\x95\x8B" => "\x74",
+ "\xF0\x9D\x95\x8C" => "\x75",
+ "\xF0\x9D\x95\x8D" => "\x76",
+ "\xF0\x9D\x95\x8E" => "\x77",
+ "\xF0\x9D\x95\x8F" => "\x78",
+ "\xF0\x9D\x95\x90" => "\x79",
+ "\xF0\x9D\x95\xAC" => "\x61",
+ "\xF0\x9D\x95\xAD" => "\x62",
+ "\xF0\x9D\x95\xAE" => "\x63",
+ "\xF0\x9D\x95\xAF" => "\x64",
+ "\xF0\x9D\x95\xB0" => "\x65",
+ "\xF0\x9D\x95\xB1" => "\x66",
+ "\xF0\x9D\x95\xB2" => "\x67",
+ "\xF0\x9D\x95\xB3" => "\x68",
+ "\xF0\x9D\x95\xB4" => "\x69",
+ "\xF0\x9D\x95\xB5" => "\x6A",
+ "\xF0\x9D\x95\xB6" => "\x6B",
+ "\xF0\x9D\x95\xB7" => "\x6C",
+ "\xF0\x9D\x95\xB8" => "\x6D",
+ "\xF0\x9D\x95\xB9" => "\x6E",
+ "\xF0\x9D\x95\xBA" => "\x6F",
+ "\xF0\x9D\x95\xBB" => "\x70",
+ "\xF0\x9D\x95\xBC" => "\x71",
+ "\xF0\x9D\x95\xBD" => "\x72",
+ "\xF0\x9D\x95\xBE" => "\x73",
+ "\xF0\x9D\x95\xBF" => "\x74",
+ "\xF0\x9D\x96\x80" => "\x75",
+ "\xF0\x9D\x96\x81" => "\x76",
+ "\xF0\x9D\x96\x82" => "\x77",
+ "\xF0\x9D\x96\x83" => "\x78",
+ "\xF0\x9D\x96\x84" => "\x79",
+ "\xF0\x9D\x96\x85" => "\x7A",
+ "\xF0\x9D\x96\xA0" => "\x61",
+ "\xF0\x9D\x96\xA1" => "\x62",
+ "\xF0\x9D\x96\xA2" => "\x63",
+ "\xF0\x9D\x96\xA3" => "\x64",
+ "\xF0\x9D\x96\xA4" => "\x65",
+ "\xF0\x9D\x96\xA5" => "\x66",
+ "\xF0\x9D\x96\xA6" => "\x67",
+ "\xF0\x9D\x96\xA7" => "\x68",
+ "\xF0\x9D\x96\xA8" => "\x69",
+ "\xF0\x9D\x96\xA9" => "\x6A",
+ "\xF0\x9D\x96\xAA" => "\x6B",
+ "\xF0\x9D\x96\xAB" => "\x6C",
+ "\xF0\x9D\x96\xAC" => "\x6D",
+ "\xF0\x9D\x96\xAD" => "\x6E",
+ "\xF0\x9D\x96\xAE" => "\x6F",
+ "\xF0\x9D\x96\xAF" => "\x70",
+ "\xF0\x9D\x96\xB0" => "\x71",
+ "\xF0\x9D\x96\xB1" => "\x72",
+ "\xF0\x9D\x96\xB2" => "\x73",
+ "\xF0\x9D\x96\xB3" => "\x74",
+ "\xF0\x9D\x96\xB4" => "\x75",
+ "\xF0\x9D\x96\xB5" => "\x76",
+ "\xF0\x9D\x96\xB6" => "\x77",
+ "\xF0\x9D\x96\xB7" => "\x78",
+ "\xF0\x9D\x96\xB8" => "\x79",
+ "\xF0\x9D\x96\xB9" => "\x7A",
+ "\xF0\x9D\x97\x94" => "\x61",
+ "\xF0\x9D\x97\x95" => "\x62",
+ "\xF0\x9D\x97\x96" => "\x63",
+ "\xF0\x9D\x97\x97" => "\x64",
+ "\xF0\x9D\x97\x98" => "\x65",
+ "\xF0\x9D\x97\x99" => "\x66",
+ "\xF0\x9D\x97\x9A" => "\x67",
+ "\xF0\x9D\x97\x9B" => "\x68",
+ "\xF0\x9D\x97\x9C" => "\x69",
+ "\xF0\x9D\x97\x9D" => "\x6A",
+ "\xF0\x9D\x97\x9E" => "\x6B",
+ "\xF0\x9D\x97\x9F" => "\x6C",
+ "\xF0\x9D\x97\xA0" => "\x6D",
+ "\xF0\x9D\x97\xA1" => "\x6E",
+ "\xF0\x9D\x97\xA2" => "\x6F",
+ "\xF0\x9D\x97\xA3" => "\x70",
+ "\xF0\x9D\x97\xA4" => "\x71",
+ "\xF0\x9D\x97\xA5" => "\x72",
+ "\xF0\x9D\x97\xA6" => "\x73",
+ "\xF0\x9D\x97\xA7" => "\x74",
+ "\xF0\x9D\x97\xA8" => "\x75",
+ "\xF0\x9D\x97\xA9" => "\x76",
+ "\xF0\x9D\x97\xAA" => "\x77",
+ "\xF0\x9D\x97\xAB" => "\x78",
+ "\xF0\x9D\x97\xAC" => "\x79",
+ "\xF0\x9D\x97\xAD" => "\x7A",
+ "\xF0\x9D\x98\x88" => "\x61",
+ "\xF0\x9D\x98\x89" => "\x62",
+ "\xF0\x9D\x98\x8A" => "\x63",
+ "\xF0\x9D\x98\x8B" => "\x64",
+ "\xF0\x9D\x98\x8C" => "\x65",
+ "\xF0\x9D\x98\x8D" => "\x66",
+ "\xF0\x9D\x98\x8E" => "\x67",
+ "\xF0\x9D\x98\x8F" => "\x68",
+ "\xF0\x9D\x98\x90" => "\x69",
+ "\xF0\x9D\x98\x91" => "\x6A",
+ "\xF0\x9D\x98\x92" => "\x6B",
+ "\xF0\x9D\x98\x93" => "\x6C",
+ "\xF0\x9D\x98\x94" => "\x6D",
+ "\xF0\x9D\x98\x95" => "\x6E",
+ "\xF0\x9D\x98\x96" => "\x6F",
+ "\xF0\x9D\x98\x97" => "\x70",
+ "\xF0\x9D\x98\x98" => "\x71",
+ "\xF0\x9D\x98\x99" => "\x72",
+ "\xF0\x9D\x98\x9A" => "\x73",
+ "\xF0\x9D\x98\x9B" => "\x74",
+ "\xF0\x9D\x98\x9C" => "\x75",
+ "\xF0\x9D\x98\x9D" => "\x76",
+ "\xF0\x9D\x98\x9E" => "\x77",
+ "\xF0\x9D\x98\x9F" => "\x78",
+ "\xF0\x9D\x98\xA0" => "\x79",
+ "\xF0\x9D\x98\xA1" => "\x7A",
+ "\xF0\x9D\x98\xBC" => "\x61",
+ "\xF0\x9D\x98\xBD" => "\x62",
+ "\xF0\x9D\x98\xBE" => "\x63",
+ "\xF0\x9D\x98\xBF" => "\x64",
+ "\xF0\x9D\x99\x80" => "\x65",
+ "\xF0\x9D\x99\x81" => "\x66",
+ "\xF0\x9D\x99\x82" => "\x67",
+ "\xF0\x9D\x99\x83" => "\x68",
+ "\xF0\x9D\x99\x84" => "\x69",
+ "\xF0\x9D\x99\x85" => "\x6A",
+ "\xF0\x9D\x99\x86" => "\x6B",
+ "\xF0\x9D\x99\x87" => "\x6C",
+ "\xF0\x9D\x99\x88" => "\x6D",
+ "\xF0\x9D\x99\x89" => "\x6E",
+ "\xF0\x9D\x99\x8A" => "\x6F",
+ "\xF0\x9D\x99\x8B" => "\x70",
+ "\xF0\x9D\x99\x8C" => "\x71",
+ "\xF0\x9D\x99\x8D" => "\x72",
+ "\xF0\x9D\x99\x8E" => "\x73",
+ "\xF0\x9D\x99\x8F" => "\x74",
+ "\xF0\x9D\x99\x90" => "\x75",
+ "\xF0\x9D\x99\x91" => "\x76",
+ "\xF0\x9D\x99\x92" => "\x77",
+ "\xF0\x9D\x99\x93" => "\x78",
+ "\xF0\x9D\x99\x94" => "\x79",
+ "\xF0\x9D\x99\x95" => "\x7A",
+ "\xF0\x9D\x99\xB0" => "\x61",
+ "\xF0\x9D\x99\xB1" => "\x62",
+ "\xF0\x9D\x99\xB2" => "\x63",
+ "\xF0\x9D\x99\xB3" => "\x64",
+ "\xF0\x9D\x99\xB4" => "\x65",
+ "\xF0\x9D\x99\xB5" => "\x66",
+ "\xF0\x9D\x99\xB6" => "\x67",
+ "\xF0\x9D\x99\xB7" => "\x68",
+ "\xF0\x9D\x99\xB8" => "\x69",
+ "\xF0\x9D\x99\xB9" => "\x6A",
+ "\xF0\x9D\x99\xBA" => "\x6B",
+ "\xF0\x9D\x99\xBB" => "\x6C",
+ "\xF0\x9D\x99\xBC" => "\x6D",
+ "\xF0\x9D\x99\xBD" => "\x6E",
+ "\xF0\x9D\x99\xBE" => "\x6F",
+ "\xF0\x9D\x99\xBF" => "\x70",
+ "\xF0\x9D\x9A\x80" => "\x71",
+ "\xF0\x9D\x9A\x81" => "\x72",
+ "\xF0\x9D\x9A\x82" => "\x73",
+ "\xF0\x9D\x9A\x83" => "\x74",
+ "\xF0\x9D\x9A\x84" => "\x75",
+ "\xF0\x9D\x9A\x85" => "\x76",
+ "\xF0\x9D\x9A\x86" => "\x77",
+ "\xF0\x9D\x9A\x87" => "\x78",
+ "\xF0\x9D\x9A\x88" => "\x79",
+ "\xF0\x9D\x9A\x89" => "\x7A",
+ "\xF0\x9D\x9A\xA8" => "\xCE\xB1",
+ "\xF0\x9D\x9A\xA9" => "\xCE\xB2",
+ "\xF0\x9D\x9A\xAA" => "\xCE\xB3",
+ "\xF0\x9D\x9A\xAB" => "\xCE\xB4",
+ "\xF0\x9D\x9A\xAC" => "\xCE\xB5",
+ "\xF0\x9D\x9A\xAD" => "\xCE\xB6",
+ "\xF0\x9D\x9A\xAE" => "\xCE\xB7",
+ "\xF0\x9D\x9A\xAF" => "\xCE\xB8",
+ "\xF0\x9D\x9A\xB0" => "\xCE\xB9",
+ "\xF0\x9D\x9A\xB1" => "\xCE\xBA",
+ "\xF0\x9D\x9A\xB2" => "\xCE\xBB",
+ "\xF0\x9D\x9A\xB3" => "\xCE\xBC",
+ "\xF0\x9D\x9A\xB4" => "\xCE\xBD",
+ "\xF0\x9D\x9A\xB5" => "\xCE\xBE",
+ "\xF0\x9D\x9A\xB6" => "\xCE\xBF",
+ "\xF0\x9D\x9A\xB7" => "\xCF\x80",
+ "\xF0\x9D\x9A\xB8" => "\xCF\x81",
+ "\xF0\x9D\x9A\xB9" => "\xCE\xB8",
+ "\xF0\x9D\x9A\xBA" => "\xCF\x83",
+ "\xF0\x9D\x9A\xBB" => "\xCF\x84",
+ "\xF0\x9D\x9A\xBC" => "\xCF\x85",
+ "\xF0\x9D\x9A\xBD" => "\xCF\x86",
+ "\xF0\x9D\x9A\xBE" => "\xCF\x87",
+ "\xF0\x9D\x9A\xBF" => "\xCF\x88",
+ "\xF0\x9D\x9B\x80" => "\xCF\x89",
+ "\xF0\x9D\x9B\x93" => "\xCF\x83",
+ "\xF0\x9D\x9B\xA2" => "\xCE\xB1",
+ "\xF0\x9D\x9B\xA3" => "\xCE\xB2",
+ "\xF0\x9D\x9B\xA4" => "\xCE\xB3",
+ "\xF0\x9D\x9B\xA5" => "\xCE\xB4",
+ "\xF0\x9D\x9B\xA6" => "\xCE\xB5",
+ "\xF0\x9D\x9B\xA7" => "\xCE\xB6",
+ "\xF0\x9D\x9B\xA8" => "\xCE\xB7",
+ "\xF0\x9D\x9B\xA9" => "\xCE\xB8",
+ "\xF0\x9D\x9B\xAA" => "\xCE\xB9",
+ "\xF0\x9D\x9B\xAB" => "\xCE\xBA",
+ "\xF0\x9D\x9B\xAC" => "\xCE\xBB",
+ "\xF0\x9D\x9B\xAD" => "\xCE\xBC",
+ "\xF0\x9D\x9B\xAE" => "\xCE\xBD",
+ "\xF0\x9D\x9B\xAF" => "\xCE\xBE",
+ "\xF0\x9D\x9B\xB0" => "\xCE\xBF",
+ "\xF0\x9D\x9B\xB1" => "\xCF\x80",
+ "\xF0\x9D\x9B\xB2" => "\xCF\x81",
+ "\xF0\x9D\x9B\xB3" => "\xCE\xB8",
+ "\xF0\x9D\x9B\xB4" => "\xCF\x83",
+ "\xF0\x9D\x9B\xB5" => "\xCF\x84",
+ "\xF0\x9D\x9B\xB6" => "\xCF\x85",
+ "\xF0\x9D\x9B\xB7" => "\xCF\x86",
+ "\xF0\x9D\x9B\xB8" => "\xCF\x87",
+ "\xF0\x9D\x9B\xB9" => "\xCF\x88",
+ "\xF0\x9D\x9B\xBA" => "\xCF\x89",
+ "\xF0\x9D\x9C\x8D" => "\xCF\x83",
+ "\xF0\x9D\x9C\x9C" => "\xCE\xB1",
+ "\xF0\x9D\x9C\x9D" => "\xCE\xB2",
+ "\xF0\x9D\x9C\x9E" => "\xCE\xB3",
+ "\xF0\x9D\x9C\x9F" => "\xCE\xB4",
+ "\xF0\x9D\x9C\xA0" => "\xCE\xB5",
+ "\xF0\x9D\x9C\xA1" => "\xCE\xB6",
+ "\xF0\x9D\x9C\xA2" => "\xCE\xB7",
+ "\xF0\x9D\x9C\xA3" => "\xCE\xB8",
+ "\xF0\x9D\x9C\xA4" => "\xCE\xB9",
+ "\xF0\x9D\x9C\xA5" => "\xCE\xBA",
+ "\xF0\x9D\x9C\xA6" => "\xCE\xBB",
+ "\xF0\x9D\x9C\xA7" => "\xCE\xBC",
+ "\xF0\x9D\x9C\xA8" => "\xCE\xBD",
+ "\xF0\x9D\x9C\xA9" => "\xCE\xBE",
+ "\xF0\x9D\x9C\xAA" => "\xCE\xBF",
+ "\xF0\x9D\x9C\xAB" => "\xCF\x80",
+ "\xF0\x9D\x9C\xAC" => "\xCF\x81",
+ "\xF0\x9D\x9C\xAD" => "\xCE\xB8",
+ "\xF0\x9D\x9C\xAE" => "\xCF\x83",
+ "\xF0\x9D\x9C\xAF" => "\xCF\x84",
+ "\xF0\x9D\x9C\xB0" => "\xCF\x85",
+ "\xF0\x9D\x9C\xB1" => "\xCF\x86",
+ "\xF0\x9D\x9C\xB2" => "\xCF\x87",
+ "\xF0\x9D\x9C\xB3" => "\xCF\x88",
+ "\xF0\x9D\x9C\xB4" => "\xCF\x89",
+ "\xF0\x9D\x9D\x87" => "\xCF\x83",
+ "\xF0\x9D\x9D\x96" => "\xCE\xB1",
+ "\xF0\x9D\x9D\x97" => "\xCE\xB2",
+ "\xF0\x9D\x9D\x98" => "\xCE\xB3",
+ "\xF0\x9D\x9D\x99" => "\xCE\xB4",
+ "\xF0\x9D\x9D\x9A" => "\xCE\xB5",
+ "\xF0\x9D\x9D\x9B" => "\xCE\xB6",
+ "\xF0\x9D\x9D\x9C" => "\xCE\xB7",
+ "\xF0\x9D\x9D\x9D" => "\xCE\xB8",
+ "\xF0\x9D\x9D\x9E" => "\xCE\xB9",
+ "\xF0\x9D\x9D\x9F" => "\xCE\xBA",
+ "\xF0\x9D\x9D\xA0" => "\xCE\xBB",
+ "\xF0\x9D\x9D\xA1" => "\xCE\xBC",
+ "\xF0\x9D\x9D\xA2" => "\xCE\xBD",
+ "\xF0\x9D\x9D\xA3" => "\xCE\xBE",
+ "\xF0\x9D\x9D\xA4" => "\xCE\xBF",
+ "\xF0\x9D\x9D\xA5" => "\xCF\x80",
+ "\xF0\x9D\x9D\xA6" => "\xCF\x81",
+ "\xF0\x9D\x9D\xA7" => "\xCE\xB8",
+ "\xF0\x9D\x9D\xA8" => "\xCF\x83",
+ "\xF0\x9D\x9D\xA9" => "\xCF\x84",
+ "\xF0\x9D\x9D\xAA" => "\xCF\x85",
+ "\xF0\x9D\x9D\xAB" => "\xCF\x86",
+ "\xF0\x9D\x9D\xAC" => "\xCF\x87",
+ "\xF0\x9D\x9D\xAD" => "\xCF\x88",
+ "\xF0\x9D\x9D\xAE" => "\xCF\x89",
+ "\xF0\x9D\x9E\x81" => "\xCF\x83",
+ "\xF0\x9D\x9E\x90" => "\xCE\xB1",
+ "\xF0\x9D\x9E\x91" => "\xCE\xB2",
+ "\xF0\x9D\x9E\x92" => "\xCE\xB3",
+ "\xF0\x9D\x9E\x93" => "\xCE\xB4",
+ "\xF0\x9D\x9E\x94" => "\xCE\xB5",
+ "\xF0\x9D\x9E\x95" => "\xCE\xB6",
+ "\xF0\x9D\x9E\x96" => "\xCE\xB7",
+ "\xF0\x9D\x9E\x97" => "\xCE\xB8",
+ "\xF0\x9D\x9E\x98" => "\xCE\xB9",
+ "\xF0\x9D\x9E\x99" => "\xCE\xBA",
+ "\xF0\x9D\x9E\x9A" => "\xCE\xBB",
+ "\xF0\x9D\x9E\x9B" => "\xCE\xBC",
+ "\xF0\x9D\x9E\x9C" => "\xCE\xBD",
+ "\xF0\x9D\x9E\x9D" => "\xCE\xBE",
+ "\xF0\x9D\x9E\x9E" => "\xCE\xBF",
+ "\xF0\x9D\x9E\x9F" => "\xCF\x80",
+ "\xF0\x9D\x9E\xA0" => "\xCF\x81",
+ "\xF0\x9D\x9E\xA1" => "\xCE\xB8",
+ "\xF0\x9D\x9E\xA2" => "\xCF\x83",
+ "\xF0\x9D\x9E\xA3" => "\xCF\x84",
+ "\xF0\x9D\x9E\xA4" => "\xCF\x85",
+ "\xF0\x9D\x9E\xA5" => "\xCF\x86",
+ "\xF0\x9D\x9E\xA6" => "\xCF\x87",
+ "\xF0\x9D\x9E\xA7" => "\xCF\x88",
+ "\xF0\x9D\x9E\xA8" => "\xCF\x89",
+ "\xF0\x9D\x9E\xBB" => "\xCF\x83",
+ "\xF0\x9D\x9F\x8A" => "\xCF\x9D",
+ );
+ global $phpbb_root_path, $phpEx;
+
+ // do the case fold
+ $text = utf8_new_case_fold($text, $option);
+
+ if (!class_exists('utf_normalizer'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
+ }
+
+ // convert to NFKC
+ utf_normalizer::nfkc($text);
+
+ // FC_NFKC_Closure, http://www.unicode.org/Public/5.0.0/ucd/DerivedNormalizationProps.txt
+ $text = strtr($text, $fc_nfkc_closure);
+
+ return $text;
+}
+
+return array('¡'=>'i','ǃ'=>'!','α'=>'a',' '=>' ','­'=>'','Û'=>'','Ü'=>'','á †'=>'','á Ž'=>'','​'=>'','‌'=>'','â€'=>'','
'=>'','
'=>'','â '=>'','â¡'=>'','â¢'=>'','â£'=>'','âª'=>'','â«'=>'','â¬'=>'','â­'=>'','â®'=>'','â¯'=>'',''=>'',''=>'',''=>'','ï¿»'=>'',''=>'','ð…³'=>'','ð…´'=>'','ð…µ'=>'','ð…¶'=>'','ð…·'=>'','ð…¸'=>'','ð…¹'=>'','ð…º'=>'','Û¬'=>'ÛŸ','̓'=>'Ì“','Ù'=>'Ì“','Öœ'=>'Ì','Í'=>'Ì','݇'=>'Ì','॔'=>'Ì','Í€'=>'Ì€','॓'=>'Ì€','ÌŒ'=>'̆','Ì‘'=>'Ì‚','Ö¯'=>'ÌŠ','ஂ'=>'ÌŠ','à¹'=>'ÌŠ','à»'=>'ÌŠ','ံ'=>'ÌŠ','ំ'=>'ÌŠ','៓'=>'ÌŠ','゚'=>'ÌŠ','゚'=>'ÌŠ','ͦ'=>'ÌŠ','Í‚'=>'̃','ׄ'=>'̇','Ö¹'=>'̇','ׂ'=>'̇','×'=>'̇','Ý'=>'̇','ं'=>'̇','ਂ'=>'̇','ં'=>'̇','à¯'=>'̇','Ì…'=>'Ì„','〬'=>'̉','̱'=>'Ì ','॒'=>'Ì ','̧'=>'Ì¡','̦'=>'Ì¡','̨'=>'Ì¢','़'=>'Ì£','়'=>'Ì£','਼'=>'Ì£','઼'=>'Ì£','଼'=>'Ì£','͇'=>'̳','̶'=>'̵','ﱞ'=>'ï¹²Ù‘','ﱟ'=>'ï¹´Ù‘','ï³²'=>'ï¹·Ù‘','ï± '=>'ï¹¶Ù‘','ï³³'=>'ï¹¹Ù‘','ﱡ'=>'ﹸّ','ï³´'=>'ï¹»Ù‘','ï±¢'=>'ﹺّ','ï±£'=>'ï¹¼Ù°','Ù´'=>'Ù”','Ý‚'=>'ܼ','౦'=>'o','೦'=>'o','゙'=>'ã‚™',' '=>' ',' '=>' ','â€'=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','âŸ'=>' ',' '=>' ',' '=>' ',' '=>' ','`'=>'`','ï½€'=>'`','á¿€'=>'Ëœ','ï¼¾'=>'^','︿'=>'^','_'=>'_','ï¹'=>'_','﹎'=>'_','ï¹'=>'_','⌇'=>'︴','ï¼'=>'-','â€'=>'-','‑'=>'-','‒'=>'-','–'=>'-','﹘'=>'-','∼'=>'â“','ï½¥'=>'・','•'=>'・',','=>',','‚'=>',','Ù¬'=>'ØŒ','、'=>'ã€',';'=>';','ï¼›'=>';',':'=>':','Ö‰'=>':','︰'=>':','׃'=>':','â©´'=>'::=','.'=>'.','․'=>'.','Ü‚'=>'.','‥'=>'..','…'=>'...','。'=>'。','·'=>'·','‧'=>'·','∙'=>'·','â‹…'=>'·','á§'=>'·','ᔯ'=>'·4','áŒ'=>'·á','áŽ'=>'·áƒ','á'=>'·á„','á’'=>'·á…','á”'=>'·á†','á—'=>'·áŠ','á™'=>'·á‹','á·'=>'·á³','á‘€'=>'·á³','á‘‚'=>'·á´','á‘„'=>'·á¸','ᑆ'=>'·á¹','á‘—'=>'·ᑌ','á‘™'=>'·ᑎ','á‘›'=>'·á‘','á‘”'=>'·á‘','á‘'=>'·á‘','ᑟ'=>'·ᑑ','á‘¡'=>'·ᑕ','á‘£'=>'·ᑖ','á‘´'=>'·ᑫ','ᑸ'=>'·ᑮ','ᑼ'=>'·ᑰ','ᑾ'=>'·ᑲ','á’€'=>'·ᑳ','á’’'=>'·ᒉ','á’”'=>'·ᒋ','á’–'=>'·ᒌ','á’š'=>'·ᒎ','á’œ'=>'·á’','á’ž'=>'·ᒑ','á’¬'=>'·ᒣ','á’®'=>'·ᒥ','á’°'=>'·ᒦ','á’²'=>'·ᒧ','á’´'=>'·ᒨ','á’¶'=>'·L','á’¸'=>'·ᒫ','ᓉ'=>'·ᓀ','á“‹'=>'·ᓇ','á“'=>'·ᓈ','ᓜ'=>'·ᓓ','ᓞ'=>'·ᓕ','á“ '=>'·ᓖ','á“¢'=>'·ᓗ','ᓤ'=>'·ᓘ','ᓦ'=>'·ᓚ','ᓨ'=>'·ᓛ','á“¶'=>'·ᓭ','ᓸ'=>'·ᓯ','ᓺ'=>'·ᓰ','ᓼ'=>'·ᓱ','ᓾ'=>'·ᓲ','ᔀ'=>'·ᓴ','ᔂ'=>'·ᓵ','á”—'=>'·á”','á”™'=>'·ᔑ','á”›'=>'·ᔒ','á”'=>'·ᔓ','ᔟ'=>'·ᔔ','ᔡ'=>'·ᔕ','ᔣ'=>'·ᔖ','á”±'=>'·ᔨ','ᔳ'=>'·ᔩ','ᔵ'=>'·ᔪ','á”·'=>'·ᔫ','ᔹ'=>'·ᔭ','á”»'=>'·ᔮ','ᕎ'=>'·ᕌ','á•›'=>'·ᕚ','ᕨ'=>'·ᕧ','('=>'(','â‘´'=>'(1)','â’§'=>'(l)','⑽'=>'(10)','⑾'=>'(11)','â‘¿'=>'(12)','â’€'=>'(13)','â’'=>'(14)','â’‚'=>'(15)','â’ƒ'=>'(16)','â’„'=>'(17)','â’…'=>'(18)','â’†'=>'(19)','⑵'=>'(2)','â’‡'=>'(20)','â‘¶'=>'(3)','â‘·'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','â‘»'=>'(8)','⑼'=>'(9)','â’œ'=>'(a)','â’'=>'(b)','â’ž'=>'(c)','â’Ÿ'=>'(d)','â’ '=>'(e)','â’¡'=>'(f)','â’¢'=>'(g)','â’£'=>'(h)','â’¤'=>'(i)','â’¥'=>'(j)','â’¦'=>'(k)','â’¨'=>'(m)','â’©'=>'(n)','â’ª'=>'(o)','â’«'=>'(p)','â’¬'=>'(q)','â’­'=>'(r)','â’®'=>'(s)','â’¯'=>'(t)','â’°'=>'(u)','â’±'=>'(v)','â’²'=>'(w)','â’³'=>'(x)','â’´'=>'(y)','â’µ'=>'(z)','㈀'=>'(á„€)','㈎'=>'(ê°€)','ãˆ'=>'(á„‚)','ãˆ'=>'(나)','㈂'=>'(ᄃ)','ãˆ'=>'(다)','㈃'=>'(á„…)','㈑'=>'(ë¼)','㈄'=>'(ᄆ)','㈒'=>'(마)','㈅'=>'(ᄇ)','㈓'=>'(ë°”)','㈆'=>'(ᄉ)','㈔'=>'(사)','㈇'=>'(á„‹)','㈕'=>'(ì•„)','ãˆ'=>'(오전)','㈞'=>'(오후)','㈈'=>'(ᄌ)','㈖'=>'(ìž)','㈜'=>'(주)','㈉'=>'(ᄎ)','㈗'=>'(ì°¨)','㈊'=>'(á„)','㈘'=>'(ì¹´)','㈋'=>'(á„)','㈙'=>'(타)','㈌'=>'(á„‘)','㈚'=>'(파)','ãˆ'=>'(á„’)','㈛'=>'(하)','㈠'=>'(一)','㈦'=>'(七)','㈢'=>'(三)','㈨'=>'(ä¹)','㈡'=>'(二)','㈤'=>'(五)','㈹'=>'(代)','㈽'=>'(ä¼)','ã‰'=>'(休)','㈧'=>'(å…«)','㈥'=>'(å…­)','㈸'=>'(労)','㈩'=>'(å)','㈿'=>'(å”)','㈴'=>'(å)','㈺'=>'(呼)','㈣'=>'(å››)','㈯'=>'(土)','㈻'=>'(å­¦)','㈰'=>'(æ—¥)','㈪'=>'(月)','㈲'=>'(有)','㈭'=>'(木)','㈱'=>'(æ ª)','㈬'=>'(æ°´)','㈫'=>'(ç«)','㈵'=>'(特)','㈼'=>'(監)','㈳'=>'(社)','㈷'=>'(ç¥)','㉀'=>'(祭)','㉂'=>'(自)','㉃'=>'(至)','㈶'=>'(財)','㈾'=>'(資)','㈮'=>'(金)',')'=>')','ï¼»'=>'[','〔'=>'[','ï¼½'=>']','〕'=>']','ï½›'=>'{','ï½'=>'}','⦅'=>'⦅','ï½ '=>'⦆','ï½¢'=>'「','ï½£'=>'ã€','ï¼ '=>'@','*'=>'*','ï¼'=>'/','â„'=>'/','∕'=>'/','ï¼¼'=>'\\','&'=>'&','#'=>'#','ï¼…'=>'%','‶'=>'‵‵','‷'=>'‵‵‵','༌'=>'་','´'=>'ʹ','΄'=>'ʹ','´'=>'ʹ','\''=>'ʹ','''=>'ʹ','′'=>'ʹ','׳'=>'ʹ','Í´'=>'ʹ','ËŠ'=>'ʹ','"'=>'ʹʹ','"'=>'ʹʹ','″'=>'ʹʹ','〃'=>'ʹʹ','×´'=>'ʹʹ','ʺ'=>'ʹʹ','‴'=>'ʹʹʹ','â—'=>'ʹʹʹʹ','¯'=>'ˉ','ï¿£'=>'ˉ','‾'=>'ˉ','﹉'=>'ˉ','﹊'=>'ˉ','﹋'=>'ˉ','﹌'=>'ˉ','Ëš'=>'°','௵'=>'௳','ï¿©'=>'â†','ï¿«'=>'→','↑'=>'↑','↓'=>'↓','↵'=>'↲','⨡'=>'↾','ð››'=>'∂','ðœ•'=>'∂','ð'=>'∂','ðž‰'=>'∂','ðŸƒ'=>'∂','ð›'=>'∇','ð›»'=>'∇','ðœµ'=>'∇','ð¯'=>'∇','ðž©'=>'∇','+'=>'+','﬩'=>'+','‹'=>'<','<'=>'<','ï¼'=>'=','⩵'=>'==','â©¶'=>'===','›'=>'>','>'=>'>','ï¿¢'=>'¬','¦'=>'¦','〜'=>'~','~'=>'~','﹨'=>'∖','â‹€'=>'∧','â‹'=>'∨','â‹‚'=>'∩','⋃'=>'∪','∯'=>'∮∮','∰'=>'∮∮∮','≣'=>'≡','â™'=>'⊕','☉'=>'⊙','⟂'=>'⊥','â–·'=>'⊲','â¨'=>'⋈','⨽'=>'⌙','☸'=>'⎈','⎮'=>'⎥','│'=>'│','â–'=>'â–Œ','ï¿­'=>'â– ','â˜'=>'â–¡','ï¿®'=>'â—‹','⦾'=>'â—Ž','〛'=>'⟧','〈'=>'⟨','〈'=>'⟨','〉'=>'⟩','〉'=>'⟩','â§™'=>'⦚','〶'=>'〒','ï½°'=>'ー','ï¿ '=>'¢','$'=>'$','ï¿¡'=>'£','ï¿¥'=>'Y̵','₩'=>'W̵','ï¼'=>'0','ðŸŽ'=>'0','ðŸ˜'=>'0','ðŸ¢'=>'0','ðŸ¬'=>'0','ðŸ¶'=>'0','০'=>'0','à­¦'=>'0','௦'=>'0','á '=>'0','〇'=>'0','ðŽ'=>'0','ð‘‚'=>'0','ð‘¶'=>'0','ð’ª'=>'0','ð“ž'=>'0','ð”’'=>'0','ð•†'=>'0','ð•º'=>'0','ð–®'=>'0','ð—¢'=>'0','ð˜–'=>'0','ð™Š'=>'0','ð™¾'=>'0','ðš¶'=>'0','ð›°'=>'0','ðœª'=>'0','ð¤'=>'0','ðžž'=>'0','âµ”'=>'0','à´ '=>'0','⊖'=>'0̵','ðš¯'=>'0̵','ðš¹'=>'0̵','ð›©'=>'0̵','ð›³'=>'0̵','ðœ£'=>'0̵','ðœ­'=>'0̵','ð'=>'0̵','ð§'=>'0̵','ðž—'=>'0̵','ðž¡'=>'0̵','â´±'=>'0̵','Ꮎ'=>'0̵','Û°'=>'Ù ','á­œ'=>'á­','ã˜'=>'0点','1'=>'1','ðŸ'=>'1','ðŸ™'=>'1','ðŸ£'=>'1','ðŸ­'=>'1','ðŸ·'=>'1','â„'=>'1','â„‘'=>'1','ðˆ'=>'1','ð¼'=>'1','ð‘°'=>'1','ð“˜'=>'1','ð•€'=>'1','ð•´'=>'1','ð–¨'=>'1','ð—œ'=>'1','ð˜'=>'1','ð™„'=>'1','ð™¸'=>'1','l'=>'l','l'=>'l','â…¼'=>'1','â„“'=>'l','ð¥'=>'l','ð‘™'=>'l','ð’'=>'l','ð“'=>'l','ð“µ'=>'l','ð”©'=>'l','ð•'=>'l','ð–‘'=>'l','ð—…'=>'l','ð—¹'=>'l','ð˜­'=>'l','ð™¡'=>'l','ðš•'=>'l','ðš°'=>'l','ð›ª'=>'l','ðœ¤'=>'l','ðž'=>'l','ðž˜'=>'l','â‘ '=>'➀','É­'=>'lÌ¢','É«'=>'lÌ´','Æš'=>'l̵','Å‚'=>'lÌ·','Û±'=>'Ù¡','â’ˆ'=>'1.','Å€'=>'l·','á’·'=>'1·','â‘©'=>'➉','â’‘'=>'10.','ã©'=>'10æ—¥','㋉'=>'10月','ã¢'=>'10点','â’’'=>'11.','ãª'=>'11æ—¥','㋊'=>'11月','ã£'=>'11点','â’“'=>'12.','ã«'=>'12æ—¥','ã‹‹'=>'12月','ã¤'=>'12点','â’”'=>'13.','ã¬'=>'13æ—¥','ã¥'=>'13点','â’•'=>'14.','ã­'=>'14æ—¥','ã¦'=>'14点','â’–'=>'15.','ã®'=>'15æ—¥','ã§'=>'15点','â’—'=>'16.','ã¯'=>'16æ—¥','ã¨'=>'16点','â’˜'=>'17.','ã°'=>'17æ—¥','ã©'=>'17点','â’™'=>'18.','ã±'=>'18æ—¥','ãª'=>'18点','â’š'=>'19.','ã²'=>'19æ—¥','ã«'=>'19点','lj'=>'lj','ã '=>'1æ—¥','ã‹€'=>'1月','ã™'=>'1点','ï¼’'=>'2','ðŸ'=>'2','ðŸš'=>'2','ðŸ¤'=>'2','ðŸ®'=>'2','ðŸ¸'=>'2','á’¿'=>'2','â‘¡'=>'âž','Û²'=>'Ù¢','â’‰'=>'2.','â’›'=>'20.','ã³'=>'20æ—¥','ã¬'=>'20点','ã´'=>'21æ—¥','ã­'=>'21点','ãµ'=>'22æ—¥','ã®'=>'22点','ã¶'=>'23æ—¥','ã¯'=>'23点','ã·'=>'24æ—¥','ã°'=>'24点','ã¸'=>'25æ—¥','ã¹'=>'26æ—¥','ãº'=>'27æ—¥','ã»'=>'28æ—¥','ã¼'=>'29æ—¥','ã¡'=>'2æ—¥','ã‹'=>'2月','ãš'=>'2点','3'=>'3','ðŸ‘'=>'3','ðŸ›'=>'3','ðŸ¥'=>'3','ðŸ¯'=>'3','ðŸ¹'=>'3','â‘¢'=>'âž‚','Û³'=>'Ù£','â’Š'=>'3.','ã½'=>'30æ—¥','ã¾'=>'31æ—¥','ã¢'=>'3æ—¥','ã‹‚'=>'3月','ã›'=>'3点','ï¼”'=>'4','ðŸ’'=>'4','ðŸœ'=>'4','ðŸ¦'=>'4','ðŸ°'=>'4','ðŸº'=>'4','áŽ'=>'4','â‘£'=>'➃','â’‹'=>'4.','á”°'=>'4·','ã£'=>'4æ—¥','㋃'=>'4月','ãœ'=>'4点','5'=>'5','ðŸ“'=>'5','ðŸ'=>'5','ðŸ§'=>'5','ðŸ±'=>'5','ðŸ»'=>'5','⑤'=>'âž„','â’Œ'=>'5.','ã¤'=>'5æ—¥','ã‹„'=>'5月','ã'=>'5点','ï¼–'=>'6','ðŸ”'=>'6','ðŸž'=>'6','ðŸ¨'=>'6','ðŸ²'=>'6','ðŸ¼'=>'6','б'=>'6','â‘¥'=>'âž…','â’'=>'6.','ã¥'=>'6æ—¥','ã‹…'=>'6月','ãž'=>'6点','ï¼—'=>'7','ðŸ•'=>'7','ðŸŸ'=>'7','ðŸ©'=>'7','ðŸ³'=>'7','ðŸ½'=>'7','⑦'=>'➆','Û·'=>'Ù§','â’Ž'=>'7.','ã¦'=>'7æ—¥','㋆'=>'7月','ãŸ'=>'7点','ଃ'=>'8','৪'=>'8','੪'=>'8','8'=>'8','ðŸ–'=>'8','ðŸ '=>'8','ðŸª'=>'8','ðŸ´'=>'8','ðŸ¾'=>'8','È£'=>'8','â‘§'=>'➇','Û¸'=>'Ù¨','â’'=>'8.','ã§'=>'8æ—¥','㋇'=>'8月','ã '=>'8点','à©§'=>'9','à­¨'=>'9','à§­'=>'9','ï¼™'=>'9','ðŸ—'=>'9','ðŸ¡'=>'9','ðŸ«'=>'9','ðŸµ'=>'9','ðŸ¿'=>'9','⑨'=>'➈','Û¹'=>'Ù©','â’'=>'9.','ã¨'=>'9æ—¥','㋈'=>'9月','ã¡'=>'9点','ï½'=>'a','ðš'=>'a','ð‘Ž'=>'a','ð’‚'=>'a','ð’¶'=>'a','ð“ª'=>'a','ð”ž'=>'a','ð•’'=>'a','ð–†'=>'a','ð–º'=>'a','ð—®'=>'a','ð˜¢'=>'a','ð™–'=>'a','ðšŠ'=>'a','â„€'=>'a/c','â„'=>'a/s','æ'=>'ae','b'=>'b','ð›'=>'b','ð‘'=>'b','ð’ƒ'=>'b','ð’·'=>'b','ð“«'=>'b','ð”Ÿ'=>'b','ð•“'=>'b','ð–‡'=>'b','ð–»'=>'b','ð—¯'=>'b','ð˜£'=>'b','ð™—'=>'b','ðš‹'=>'b','É“'=>'bÌ”','ƃ'=>'bÌ„','Æ€'=>'b̵','c'=>'c','â…½'=>'c','ðœ'=>'c','ð‘'=>'c','ð’„'=>'c','ð’¸'=>'c','ð“¬'=>'c','ð” '=>'c','ð•”'=>'c','ð–ˆ'=>'c','ð–¼'=>'c','ð—°'=>'c','ð˜¤'=>'c','ð™˜'=>'c','ðšŒ'=>'c','ð›“'=>'c','ðœ'=>'c','ð‡'=>'c','ðž'=>'c','ðž»'=>'c','â„…'=>'c/o','℆'=>'c/u','d'=>'d','â…¾'=>'d','â…†'=>'d','ð'=>'d','ð‘‘'=>'d','ð’…'=>'d','ð’¹'=>'d','ð“­'=>'d','ð”¡'=>'d','ð••'=>'d','ð–‰'=>'d','ð–½'=>'d','ð—±'=>'d','ð˜¥'=>'d','ð™™'=>'d','ðš'=>'d','É—'=>'dÌ”','ÆŒ'=>'dÌ„','É–'=>'dÌ¢','Ä‘'=>'d̵','dz'=>'dz','dž'=>'dž','ï½…'=>'e','ℯ'=>'e','â…‡'=>'e','ðž'=>'e','ð‘’'=>'e','ð’†'=>'e','ð“®'=>'e','ð”¢'=>'e','ð•–'=>'e','ð–Š'=>'e','ð–¾'=>'e','ð—²'=>'e','ð˜¦'=>'e','ð™š'=>'e','ðšŽ'=>'e','â´¹'=>'E','É™'=>'Ç','Éš'=>'ÇËž','â‹´'=>'É›','ð›†'=>'É›','ð›œ'=>'É›','ðœ€'=>'É›','ðœ–'=>'É›','ðœº'=>'É›','ð'=>'É›','ð´'=>'É›','ðžŠ'=>'É›','ðž®'=>'É›','ðŸ„'=>'É›','f'=>'f','ðŸ'=>'f','ð‘“'=>'f','ð’‡'=>'f','ð’»'=>'f','ð“¯'=>'f','ð”£'=>'f','ð•—'=>'f','ð–‹'=>'f','ð–¿'=>'f','ð—³'=>'f','ð˜§'=>'f','ð™›'=>'f','ðš'=>'f','Æ’'=>'fÌ¡','g'=>'g','ℊ'=>'g','ð '=>'g','ð‘”'=>'g','ð’ˆ'=>'g','ð“°'=>'g','ð”¤'=>'g','ð•˜'=>'g','ð–Œ'=>'g','ð—€'=>'g','ð—´'=>'g','ð˜¨'=>'g','ð™œ'=>'g','ðš'=>'g','É¡'=>'g','É '=>'gÌ”','Ç¥'=>'g̵','h'=>'h','ℎ'=>'h','ð¡'=>'h','ð’‰'=>'h','ð’½'=>'h','ð“±'=>'h','ð”¥'=>'h','ð•™'=>'h','ð–'=>'h','ð—'=>'h','ð—µ'=>'h','ð˜©'=>'h','ð™'=>'h','ðš‘'=>'h','ɦ'=>'hÌ”','ħ'=>'h̵','â„'=>'h̵','῾'=>'Ê»','‘'=>'Ê»','‛'=>'Ê»','ʽ'=>'Ê»','â³'=>'i','i'=>'i','â…°'=>'i','ℹ'=>'i','â…ˆ'=>'i','ð¢'=>'i','ð‘–'=>'i','ð’Š'=>'i','ð’¾'=>'i','ð“²'=>'i','ð”¦'=>'i','ð•š'=>'i','ð–Ž'=>'i','ð—‚'=>'i','ð—¶'=>'i','ð˜ª'=>'i','ð™ž'=>'i','ðš’'=>'i','ı'=>'i','ðš¤'=>'i','ɪ'=>'i','É©'=>'i','ð›Š'=>'i','ðœ„'=>'i','ðœ¾'=>'i','ð¸'=>'i','ðž²'=>'i','ɨ'=>'i̵','â…±'=>'ii','â…²'=>'iii','ij'=>'ij','â…³'=>'iv','â…¸'=>'ix','j'=>'j','â…‰'=>'j','ð£'=>'j','ð‘—'=>'j','ð’‹'=>'j','ð’¿'=>'j','ð“³'=>'j','ð”§'=>'j','ð•›'=>'j','ð–'=>'j','ð—ƒ'=>'j','ð—·'=>'j','ð˜«'=>'j','ð™Ÿ'=>'j','ðš“'=>'j','ϳ'=>'j','ðš¥'=>'È·','k'=>'k','ð¤'=>'k','ð‘˜'=>'k','ð’Œ'=>'k','ð“€'=>'k','ð“´'=>'k','ð”¨'=>'k','ð•œ'=>'k','ð–'=>'k','ð—„'=>'k','ð—¸'=>'k','ð˜¬'=>'k','ð™ '=>'k','ðš”'=>'k','Æ™'=>'kÌ”','ï½'=>'m','â…¿'=>'m','ð¦'=>'m','ð‘š'=>'m','ð’Ž'=>'m','ð“‚'=>'m','ð“¶'=>'m','ð”ª'=>'m','ð•ž'=>'m','ð–’'=>'m','ð—†'=>'m','ð—º'=>'m','ð˜®'=>'m','ð™¢'=>'m','ðš–'=>'m','ɱ'=>'mÌ¡','n'=>'n','ð§'=>'n','ð‘›'=>'n','ð’'=>'n','ð“ƒ'=>'n','ð“·'=>'n','ð”«'=>'n','ð•Ÿ'=>'n','ð–“'=>'n','ð—‡'=>'n','ð—»'=>'n','ð˜¯'=>'n','ð™£'=>'n','ðš—'=>'n','ð'=>'N','ð‘'=>'N','ð‘µ'=>'N','ð’©'=>'N','ð“'=>'N','ð”‘'=>'N','ð•¹'=>'N','ð–­'=>'N','ð—¡'=>'N','ð˜•'=>'N','ð™‰'=>'N','ð™½'=>'N','ðš´'=>'N','ð›®'=>'N','ðœ¨'=>'N','ð¢'=>'N','ðžœ'=>'N','ɲ'=>'ņ','ɳ'=>'nÌ¢','Æž'=>'nÌ©','ð›ˆ'=>'nÌ©','ðœ‚'=>'nÌ©','ðœ¼'=>'nÌ©','ð¶'=>'nÌ©','ðž°'=>'nÌ©','ÇŒ'=>'nj','ï½'=>'o','â„´'=>'o','ð¨'=>'o','ð‘œ'=>'o','ð’'=>'o','ð“¸'=>'o','ð”¬'=>'o','ð• '=>'o','ð–”'=>'o','ð—ˆ'=>'o','ð—¼'=>'o','ð˜°'=>'o','ð™¤'=>'o','ðš˜'=>'o','á´'=>'o','ð›'=>'o','ðœŠ'=>'o','ð„'=>'o','ð¾'=>'o','ðž¸'=>'o','ɵ'=>'o̵','Ç¿'=>'o̵Ì','ø'=>'oÌ·','Å“'=>'oe','Æ¡'=>'oʼ','â´'=>'p','ï½'=>'p','ð©'=>'p','ð‘'=>'p','ð’‘'=>'p','ð“…'=>'p','ð“¹'=>'p','ð”­'=>'p','ð•¡'=>'p','ð–•'=>'p','ð—‰'=>'p','ð—½'=>'p','ð˜±'=>'p','ð™¥'=>'p','ðš™'=>'p','ð›’'=>'p','ð› '=>'p','ðœŒ'=>'p','ðœš'=>'p','ð†'=>'p','ð”'=>'p','ðž€'=>'p','ðžŽ'=>'p','ðžº'=>'p','ðŸˆ'=>'p','Æ¥'=>'pÌ”','q'=>'q','ðª'=>'q','ð‘ž'=>'q','ð’’'=>'q','ð“†'=>'q','ð“º'=>'q','ð”®'=>'q','ð•¢'=>'q','ð––'=>'q','ð—Š'=>'q','ð—¾'=>'q','ð˜²'=>'q','ð™¦'=>'q','ðšš'=>'q','ð'=>'Q','ð‘„'=>'Q','ð‘¸'=>'Q','ð’¬'=>'Q','ð“ '=>'Q','ð””'=>'Q','ð•¼'=>'Q','ð–°'=>'Q','ð—¤'=>'Q','ð˜˜'=>'Q','ð™Œ'=>'Q','ðš€'=>'Q','Ê '=>'qÌ”','ð›‹'=>'ĸ','ð›ž'=>'ĸ','ðœ…'=>'ĸ','ðœ˜'=>'ĸ','ðœ¿'=>'ĸ','ð’'=>'ĸ','ð¹'=>'ĸ','ðžŒ'=>'ĸ','ðž³'=>'ĸ','ðŸ†'=>'ĸ','ï½’'=>'r','ð«'=>'r','ð‘Ÿ'=>'r','ð’“'=>'r','ð“‡'=>'r','ð“»'=>'r','ð”¯'=>'r','ð•£'=>'r','ð–—'=>'r','ð—‹'=>'r','ð—¿'=>'r','ð˜³'=>'r','ð™§'=>'r','ðš›'=>'r','ɽ'=>'rÌ¢','ɼ'=>'rÌ©','s'=>'s','ð¬'=>'s','ð‘ '=>'s','ð’”'=>'s','ð“ˆ'=>'s','ð“¼'=>'s','ð”°'=>'s','ð•¤'=>'s','ð–˜'=>'s','ð—Œ'=>'s','ð˜€'=>'s','ð˜´'=>'s','ð™¨'=>'s','ðšœ'=>'s','ƽ'=>'s','Ê‚'=>'sÌ¢','∫'=>'ʃ','∬'=>'ʃʃ','∭'=>'ʃʃʃ','⨌'=>'ʃʃʃʃ','ï½”'=>'t','ð­'=>'t','ð‘¡'=>'t','ð’•'=>'t','ð“‰'=>'t','ð“½'=>'t','ð”±'=>'t','ð•¥'=>'t','ð–™'=>'t','ð—'=>'t','ð˜'=>'t','ð˜µ'=>'t','ð™©'=>'t','ðš'=>'t','ð‘‡'=>'T','ð‘»'=>'T','ð’¯'=>'T','ð“£'=>'T','ð”—'=>'T','ð•‹'=>'T','ð•¿'=>'T','ð–³'=>'T','ð—§'=>'T','ð˜›'=>'T','ð™'=>'T','ðšƒ'=>'T','ðš»'=>'T','ð›µ'=>'T','ðœ¯'=>'T','ð©'=>'T','ðž£'=>'T','Æ­'=>'tÌ”','È›'=>'Å£','Æ«'=>'Å£','ŧ'=>'t̵','u'=>'u','ð®'=>'u','ð‘¢'=>'u','ð’–'=>'u','ð“Š'=>'u','ð“¾'=>'u','ð”²'=>'u','ð•¦'=>'u','ð–š'=>'u','ð—Ž'=>'u','ð˜‚'=>'u','ð˜¶'=>'u','ð™ª'=>'u','ðšž'=>'u','ÊŠ'=>'u','Ê‹'=>'u','ð›–'=>'u','ðœ'=>'u','ðŠ'=>'u','ðž„'=>'u','ðž¾'=>'u','ð‘ˆ'=>'U','ð‘¼'=>'U','ð’°'=>'U','ð“¤'=>'U','ð”˜'=>'U','ð•Œ'=>'U','ð–€'=>'U','ð–´'=>'U','ð—¨'=>'U','ð˜œ'=>'U','ð™'=>'U','ðš„'=>'U','ï½–'=>'v','â…´'=>'v','ð¯'=>'v','ð‘£'=>'v','ð’—'=>'v','ð“‹'=>'v','ð“¿'=>'v','ð”³'=>'v','ð•§'=>'v','ð–›'=>'v','ð—'=>'v','ð˜ƒ'=>'v','ð˜·'=>'v','ð™«'=>'v','ðšŸ'=>'v','ð›Ž'=>'v','ðœˆ'=>'v','ð‚'=>'v','ð¼'=>'v','ðž¶'=>'v','â…µ'=>'vi','â…¶'=>'vii','â…·'=>'viii','ɯ'=>'w','ï½—'=>'w','ð°'=>'w','ð‘¤'=>'w','ð’˜'=>'w','ð“Œ'=>'w','ð”€'=>'w','ð”´'=>'w','ð•¨'=>'w','ð–œ'=>'w','ð—'=>'w','ð˜„'=>'w','ð˜¸'=>'w','ð™¬'=>'w','ðš '=>'w','ð‘Š'=>'W','ð‘¾'=>'W','ð’²'=>'W','ð“¦'=>'W','ð”š'=>'W','ð•Ž'=>'W','ð–‚'=>'W','ð–¶'=>'W','ð—ª'=>'W','ð˜ž'=>'W','ð™’'=>'W','ðš†'=>'W','×'=>'x','x'=>'x','â…¹'=>'x','ð±'=>'x','ð‘¥'=>'x','ð’™'=>'x','ð“'=>'x','ð”'=>'x','ð”µ'=>'x','ð•©'=>'x','ð–'=>'x','ð—‘'=>'x','ð˜…'=>'x','ð˜¹'=>'x','ð™­'=>'x','ðš¡'=>'x','á™­'=>'X','ð‘‹'=>'X','ð‘¿'=>'X','ð’³'=>'X','ð“§'=>'X','ð”›'=>'X','ð•'=>'X','ð–ƒ'=>'X','ð–·'=>'X','ð—«'=>'X','ð˜Ÿ'=>'X','ð™“'=>'X','ðš‡'=>'X','ðš¾'=>'X','ð›¸'=>'X','ðœ²'=>'X','ð¬'=>'X','ðž¦'=>'X','â…º'=>'xi','â…»'=>'xii','ï½™'=>'y','ð²'=>'y','ð‘¦'=>'y','ð’š'=>'y','ð“Ž'=>'y','ð”‚'=>'y','ð”¶'=>'y','ð•ª'=>'y','ð–ž'=>'y','ð—’'=>'y','ð˜†'=>'y','ð˜º'=>'y','ð™®'=>'y','ðš¢'=>'y','Æ´'=>'yÌ”','z'=>'z','ð³'=>'z','ð‘§'=>'z','ð’›'=>'z','ð“'=>'z','ð”ƒ'=>'z','ð”·'=>'z','ð•«'=>'z','ð–Ÿ'=>'z','ð—“'=>'z','ð˜‡'=>'z','ð˜»'=>'z','ð™¯'=>'z','ðš£'=>'z','È¥'=>'zÌ¡','Ê'=>'zÌ¢','ƶ'=>'z̵','È'=>'Ê’','?'=>'Ê”','?'=>'Ê”','â‡'=>'ʔʔ','âˆ'=>'ʔǃ','á¾½'=>'ʼ','᾿'=>'ʼ','’'=>'ʼ','ʾ'=>'ʼ','!'=>'ǃ','ï¼'=>'ǃ','â‰'=>'ǃʔ','‼'=>'ǃǃ','âº'=>'α','ð›‚'=>'α','ð›¼'=>'α','ðœ¶'=>'α','ð°'=>'α','ðžª'=>'α','ð›ƒ'=>'β','ð›½'=>'β','ðœ·'=>'β','ð±'=>'β','ðž«'=>'β','ℽ'=>'γ','ð›„'=>'γ','ð›¾'=>'γ','ðœ¸'=>'γ','ð²'=>'γ','ðž¬'=>'γ','ð›…'=>'δ','ð›¿'=>'δ','ðœ¹'=>'δ','ð³'=>'δ','ðž­'=>'δ','ðŸ‹'=>'Ï','ð›‡'=>'ζ','ðœ'=>'ζ','ðœ»'=>'ζ','ðµ'=>'ζ','ðž¯'=>'ζ','â¬'=>'θ','ð›‰'=>'θ','ð›'=>'θ','ðœƒ'=>'θ','ðœ—'=>'θ','ðœ½'=>'θ','ð‘'=>'θ','ð·'=>'θ','ðž‹'=>'θ','ðž±'=>'θ','ðŸ…'=>'θ','ð›Œ'=>'λ','ðœ†'=>'λ','ð€'=>'λ','ðº'=>'λ','ðž´'=>'λ','ð›¬'=>'Λ','ðœ¦'=>'Λ','ð '=>'Λ','ðžš'=>'Λ','ð›'=>'μ','ðœ‡'=>'μ','ð'=>'μ','ð»'=>'μ','ðžµ'=>'μ','ð›'=>'ξ','ðœ‰'=>'ξ','ðƒ'=>'ξ','ð½'=>'ξ','ðž·'=>'ξ','ð›¯'=>'Ξ','ðœ©'=>'Ξ','ð£'=>'Ξ','ðž'=>'Ξ','ℼ'=>'Ï€','ð›‘'=>'Ï€','ð›¡'=>'Ï€','ðœ‹'=>'Ï€','ðœ›'=>'Ï€','ð…'=>'Ï€','ð•'=>'Ï€','ð¿'=>'Ï€','ðž'=>'Ï€','ðž¹'=>'Ï€','ðŸ‰'=>'Ï€','á´¨'=>'Ï€','âˆ'=>'Π','ðš·'=>'Π','ð›±'=>'Π','ðœ«'=>'Π','ð¥'=>'Π','ðžŸ'=>'Π','ð›”'=>'σ','ðœŽ'=>'σ','ðˆ'=>'σ','ðž‚'=>'σ','ðž¼'=>'σ','ð›•'=>'Ï„','ðœ'=>'Ï„','ð‰'=>'Ï„','ðžƒ'=>'Ï„','ðž½'=>'Ï„','ð˜'=>'Y','ð‘Œ'=>'Y','ð’€'=>'Y','ð’´'=>'Y','ð“¨'=>'Y','ð”œ'=>'Y','ð•'=>'Y','ð–„'=>'Y','ð–¸'=>'Y','ð—¬'=>'Y','ð˜ '=>'Y','ð™”'=>'Y','ðšˆ'=>'Y','ðš¼'=>'Y','ð›¶'=>'Y','ðœ°'=>'Y','ðª'=>'Y','ðž¤'=>'Y','ð›—'=>'φ','ð›Ÿ'=>'φ','ðœ‘'=>'φ','ðœ™'=>'φ','ð‹'=>'φ','ð“'=>'φ','ðž…'=>'φ','ðž'=>'φ','ðž¿'=>'φ','ðŸ‡'=>'φ','ð›·'=>'Φ','ðœ±'=>'Φ','ð«'=>'Φ','ðž¥'=>'Φ','ð›˜'=>'χ','ðœ’'=>'χ','ðŒ'=>'χ','ðž†'=>'χ','ðŸ€'=>'χ','ð›™'=>'ψ','ðœ“'=>'ψ','ð'=>'ψ','ðž‡'=>'ψ','ðŸ'=>'ψ','ð›¹'=>'Ψ','ðœ³'=>'Ψ','ð­'=>'Ψ','ðž§'=>'Ψ','âµ'=>'ω','ð›š'=>'ω','ðœ”'=>'ω','ðŽ'=>'ω','ðžˆ'=>'ω','ðŸ‚'=>'ω','Ó•'=>'ae','Ò“'=>'r̵','Ò‘'=>'rᑊ','Ò—'=>'ж̩','Ò™'=>'з̡','Ó'=>'i','Ò‹'=>'й̡','Ò›'=>'ĸ̩','ÒŸ'=>'ĸ̵','á´«'=>'л','Ó†'=>'л̡','ÓŽ'=>'м̡','ÓŠ'=>'н̡','Óˆ'=>'н̡','Ò£'=>'н̩','Ó©'=>'o̵','ѳ'=>'o̵','Ò«'=>'cÌ¡','Ò­'=>'т̩','Ò¯'=>'y','Ò±'=>'y̵','Ñ›'=>'h̵','ѽ'=>'ѡ҃','ÓŒ'=>'Ò·','Ò¿'=>'ҽ̢','Ò'=>'Ь̵','Õ¦'=>'q','Õ¼'=>'n','ℵ'=>'×','ﬡ'=>'×','אָ'=>'אַ','אּ'=>'אַ','ï­'=>'×ל','â„¶'=>'ב','â„·'=>'×’','ℸ'=>'ד','ﬢ'=>'ד','ﬣ'=>'×”','ﬤ'=>'×›','ﬥ'=>'ל','ﬦ'=>'×','ﬠ'=>'×¢','ﬧ'=>'ר','ﬨ'=>'ת','ﺀ'=>'Ø¡','ﺂ'=>'Ø¢','ïº'=>'Ø¢','ﺄ'=>'Ø£','ﺃ'=>'Ø£','Ùµ'=>'أ','ï­‘'=>'Ù±','ï­'=>'Ù±','ﺆ'=>'ؤ','ﺅ'=>'ؤ','Ù¶'=>'ÙˆÙ”','ﺈ'=>'Ø¥','ﺇ'=>'Ø¥','ﺋ'=>'ئ','ﺌ'=>'ئ','ﺊ'=>'ئ','ﺉ'=>'ئ','ﯫ'=>'ئا','ﯪ'=>'ئا','ﯸ'=>'ئٻ','ﯷ'=>'ئٻ','ﯶ'=>'ئٻ','ï²—'=>'ئج','ï°€'=>'ئج','ﲘ'=>'ئح','ï°'=>'ئح','ï²™'=>'ئخ','ﱤ'=>'ئر','ï±¥'=>'ئز','ﲚ'=>'ئم','ﳟ'=>'ئم','ﱦ'=>'ئم','ï°‚'=>'ئم','ï±§'=>'ئن','ï²›'=>'ئه','ï³ '=>'ئه','ﯭ'=>'ئه','ﯬ'=>'ئه','ﯯ'=>'ئو','ﯮ'=>'ئو','ﯳ'=>'ئۆ','ﯲ'=>'ئۆ','ﯱ'=>'ئۇ','ﯰ'=>'ئۇ','ﯵ'=>'ئۈ','ﯴ'=>'ئۈ','ﯻ'=>'ئى','ﯺ'=>'ئى','ﱨ'=>'ئى','ﯹ'=>'ئى','ï°ƒ'=>'ئى','ﱩ'=>'ئى','ï°„'=>'ئى','ﺎ'=>'ا','ïº'=>'ا','ï´¼'=>'اً','ï´½'=>'اً','ï·³'=>'اكبر','ï·²'=>'الله','ﺑ'=>'ب','ﺒ'=>'ب','ïº'=>'ب','ïº'=>'ب','ﲜ'=>'بج','ï°…'=>'بج','ï²'=>'بح','ï°†'=>'بح','ï·‚'=>'بحى','ﲞ'=>'بخ','ï°‡'=>'بخ','ï¶ž'=>'بخى','ﱪ'=>'بر','ﱫ'=>'بز','ﲟ'=>'بم','ﳡ'=>'بم','ﱬ'=>'بم','ï°ˆ'=>'بم','ï±­'=>'بن','ï² '=>'به','ï³¢'=>'به','ï±®'=>'بى','ï°‰'=>'بى','ﱯ'=>'بى','ï°Š'=>'بى','ï­”'=>'Ù»','ï­•'=>'Ù»','ï­“'=>'Ù»','ï­’'=>'Ù»','Û'=>'Ù»','ﯦ'=>'Ù»','ﯧ'=>'Ù»','ﯥ'=>'Ù»','ﯤ'=>'Ù»','ï­˜'=>'Ù¾','ï­™'=>'Ù¾','ï­—'=>'Ù¾','ï­–'=>'Ù¾','ï­œ'=>'Ú€','ï­'=>'Ú€','ï­›'=>'Ú€','ï­š'=>'Ú€','ﺔ'=>'Ø©','ﺓ'=>'Ø©','ﺗ'=>'ت','ﺘ'=>'ت','ﺖ'=>'ت','ﺕ'=>'ت','ﲡ'=>'تج','ï°‹'=>'تج','ïµ'=>'تجم','ï¶ '=>'تجى','ï¶Ÿ'=>'تجى','ï²¢'=>'تح','ï°Œ'=>'تح','ïµ’'=>'تحج','ﵑ'=>'تحج','ﵓ'=>'تحم','ï²£'=>'تخ','ï°'=>'تخ','ïµ”'=>'تخم','ï¶¢'=>'تخى','ï¶¡'=>'تخى','ï±°'=>'تر','ï±±'=>'تز','ﲤ'=>'تم','ï³£'=>'تم','ï±²'=>'تم','ï°Ž'=>'تم','ﵕ'=>'تمج','ïµ–'=>'تمح','ïµ—'=>'تمخ','ﶤ'=>'تمى','ï¶£'=>'تمى','ï±³'=>'تن','ï²¥'=>'ته','ﳤ'=>'ته','ï±´'=>'تى','ï°'=>'تى','ï±µ'=>'تى','ï°'=>'تى','ﺛ'=>'Ø«','ﺜ'=>'Ø«','ﺚ'=>'Ø«','ﺙ'=>'Ø«','ï°‘'=>'ثج','ï±¶'=>'ثر','ï±·'=>'ثز','ﲦ'=>'ثم','ï³¥'=>'ثم','ﱸ'=>'ثم','ï°’'=>'ثم','ï±¹'=>'ثن','ﳦ'=>'ثه','ﱺ'=>'ثى','ï°“'=>'ثى','ï±»'=>'ثى','ï°”'=>'ثى','ï­¨'=>'Ù¹','ï­©'=>'Ù¹','ï­§'=>'Ù¹','ï­¦'=>'Ù¹','Ú»'=>'Ù¹','ﮢ'=>'Ù¹','ﮣ'=>'Ù¹','ﮡ'=>'Ù¹','ï® '=>'Ù¹','ï­ '=>'Ùº','ï­¡'=>'Ùº','ï­Ÿ'=>'Ùº','ï­ž'=>'Ùº','ï­¤'=>'Ù¿','ï­¥'=>'Ù¿','ï­£'=>'Ù¿','ï­¢'=>'Ù¿','ﺟ'=>'ج','ﺠ'=>'ج','ﺞ'=>'ج','ïº'=>'ج','ï²§'=>'جح','ï°•'=>'جح','ﶦ'=>'جحى','ï¶¾'=>'جحى','ï·»'=>'جل جلاله','ﲨ'=>'جم','ï°–'=>'جم','ïµ™'=>'جمح','ﵘ'=>'جمح','ï¶§'=>'جمى','ï¶¥'=>'جمى','ï´'=>'جى','ï´'=>'جى','ï´ž'=>'جى','ï´‚'=>'جى','ï­¸'=>'Úƒ','ï­¹'=>'Úƒ','ï­·'=>'Úƒ','ï­¶'=>'Úƒ','ï­´'=>'Ú„','ï­µ'=>'Ú„','ï­³'=>'Ú„','ï­²'=>'Ú„','ï­¼'=>'Ú†','ï­½'=>'Ú†','ï­»'=>'Ú†','ï­º'=>'Ú†','ﮀ'=>'Ú‡','ï®'=>'Ú‡','ï­¿'=>'Ú‡','ï­¾'=>'Ú‡','ﺣ'=>'Ø­','ﺤ'=>'Ø­','ﺢ'=>'Ø­','ﺡ'=>'Ø­','ﲩ'=>'حج','ï°—'=>'حج','ï¶¿'=>'حجى','ﲪ'=>'حم','ï°˜'=>'حم','ïµ›'=>'حمى','ﵚ'=>'حمى','ï´›'=>'حى','ﳿ'=>'حى','ï´œ'=>'حى','ï´€'=>'حى','ﺧ'=>'Ø®','ﺨ'=>'Ø®','ﺦ'=>'Ø®','ﺥ'=>'Ø®','ﲫ'=>'خج','ï°™'=>'خج','ï°š'=>'خح','ﲬ'=>'خم','ï°›'=>'خم','ï´Ÿ'=>'خى','ï´ƒ'=>'خى','ï´ '=>'خى','ï´„'=>'خى','ﺪ'=>'د','ﺩ'=>'د','ﺬ'=>'ذ','ﺫ'=>'ذ','ï±›'=>'ذٰ','ﮉ'=>'Úˆ','ﮈ'=>'Úˆ','ï®…'=>'ÚŒ','ﮄ'=>'ÚŒ','ﮃ'=>'Ú','ﮂ'=>'Ú','ﮇ'=>'ÚŽ','ﮆ'=>'ÚŽ','ﺮ'=>'ر','ﺭ'=>'ر','ﱜ'=>'رٰ','ï·¶'=>'رسول','ï·¼'=>'رىال','ﺰ'=>'ز','ﺯ'=>'ز','ï®'=>'Ú‘','ﮌ'=>'Ú‘','ﮋ'=>'Ú˜','ﮊ'=>'Ú˜','ﺳ'=>'س','ﺴ'=>'س','ﺲ'=>'س','ﺱ'=>'س','ï²­'=>'سج','ï´´'=>'سج','ï°œ'=>'سج','ïµ'=>'سجح','ﵞ'=>'سجى','ï²®'=>'سح','ï´µ'=>'سح','ï°'=>'سح','ﵜ'=>'سحج','ﲯ'=>'سخ','ï´¶'=>'سخ','ï°ž'=>'سخ','ﶨ'=>'سخى','ï·†'=>'سخى','ï´ª'=>'سر','ï´Ž'=>'سر','ï²°'=>'سم','ï³§'=>'سم','ï°Ÿ'=>'سم','ﵡ'=>'سمج','ïµ '=>'سمح','ﵟ'=>'سمح','ïµ£'=>'سمم','ïµ¢'=>'سمم','ï´±'=>'سه','ﳨ'=>'سه','ï´—'=>'سى','ï³»'=>'سى','ï´˜'=>'سى','ï³¼'=>'سى','ﺷ'=>'Ø´','ﺸ'=>'Ø´','ﺶ'=>'Ø´','ﺵ'=>'Ø´','ï´­'=>'شج','ï´·'=>'شج','ï´¥'=>'شج','ï´‰'=>'شج','ﵩ'=>'شجى','ï´®'=>'شح','ï´¸'=>'شح','ï´¦'=>'شح','ï´Š'=>'شح','ﵨ'=>'شحم','ïµ§'=>'شحم','ﶪ'=>'شحى','ï´¯'=>'شخ','ï´¹'=>'شخ','ï´§'=>'شخ','ï´‹'=>'شخ','ï´©'=>'شر','ï´'=>'شر','ï´°'=>'شم','ﳩ'=>'شم','ï´¨'=>'شم','ï´Œ'=>'شم','ﵫ'=>'شمخ','ﵪ'=>'شمخ','ïµ­'=>'شمم','ﵬ'=>'شمم','ï´²'=>'شه','ﳪ'=>'شه','ï´™'=>'شى','ï³½'=>'شى','ï´š'=>'شى','ï³¾'=>'شى','ﺻ'=>'ص','ﺼ'=>'ص','ﺺ'=>'ص','ﺹ'=>'ص','ï²±'=>'صح','ï° '=>'صح','ïµ¥'=>'صحح','ﵤ'=>'صحح','ï¶©'=>'صحى','ï²²'=>'صخ','ï´«'=>'صر','ï´'=>'صر','ï·µ'=>'صلعم','ï·¹'=>'صلى','ï·º'=>'صلى الله علىه وسلم','ï·°'=>'صلے','ï²³'=>'صم','ï°¡'=>'صم','ï·…'=>'صمم','ﵦ'=>'صمم','ï´¡'=>'صى','ï´…'=>'صى','ï´¢'=>'صى','ï´†'=>'صى','ﺿ'=>'ض','ﻀ'=>'ض','ﺾ'=>'ض','ﺽ'=>'ض','ï²´'=>'ضج','ï°¢'=>'ضج','ï²µ'=>'ضح','ï°£'=>'ضح','ïµ®'=>'ضحى','ï¶«'=>'ضحى','ï²¶'=>'ضخ','ï°¤'=>'ضخ','ïµ°'=>'ضخم','ﵯ'=>'ضخم','ï´¬'=>'ضر','ï´'=>'ضر','ï²·'=>'ضم','ï°¥'=>'ضم','ï´£'=>'ضى','ï´‡'=>'ضى','ï´¤'=>'ضى','ï´ˆ'=>'ضى','ﻃ'=>'Ø·','ﻄ'=>'Ø·','ﻂ'=>'Ø·','ï»'=>'Ø·','ﲸ'=>'طح','ï°¦'=>'طح','ï´³'=>'طم','ï´º'=>'طم','ï°§'=>'طم','ïµ²'=>'طمح','ïµ±'=>'طمح','ïµ³'=>'طمم','ïµ´'=>'طمى','ï´‘'=>'طى','ï³µ'=>'طى','ï´’'=>'طى','ï³¶'=>'طى','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻆ'=>'ظ','ï»…'=>'ظ','ï²¹'=>'ظم','ï´»'=>'ظم','ï°¨'=>'ظم','ﻋ'=>'ع','ﻌ'=>'ع','ﻊ'=>'ع','ﻉ'=>'ع','ﲺ'=>'عج','ï°©'=>'عج','ï·„'=>'عجم','ïµµ'=>'عجم','ï··'=>'علىه','ï²»'=>'عم','ï°ª'=>'عم','ïµ·'=>'عمم','ïµ¶'=>'عمم','ﵸ'=>'عمى','ï¶¶'=>'عمى','ï´“'=>'عى','ï³·'=>'عى','ï´”'=>'عى','ﳸ'=>'عى','ï»'=>'غ','ï»'=>'غ','ﻎ'=>'غ','ï»'=>'غ','ï²¼'=>'غج','ï°«'=>'غج','ï²½'=>'غم','ï°¬'=>'غم','ïµ¹'=>'غمم','ïµ»'=>'غمى','ﵺ'=>'غمى','ï´•'=>'غى','ï³¹'=>'غى','ï´–'=>'غى','ﳺ'=>'غى','ﻓ'=>'Ù','ï»”'=>'Ù','ï»’'=>'Ù','ﻑ'=>'Ù','ï²¾'=>'ÙØ¬','ï°­'=>'ÙØ¬','ﲿ'=>'ÙØ­','ï°®'=>'ÙØ­','ï³€'=>'ÙØ®','ï°¯'=>'ÙØ®','ïµ½'=>'ÙØ®Ù…','ïµ¼'=>'ÙØ®Ù…','ï³'=>'ÙÙ…','ï°°'=>'ÙÙ…','ï·'=>'Ùمى','ï±¼'=>'ÙÙ‰','ï°±'=>'ÙÙ‰','ï±½'=>'ÙÙ‰','ï°²'=>'ÙÙ‰','ï­¬'=>'Ú¤','ï­­'=>'Ú¤','ï­«'=>'Ú¤','ï­ª'=>'Ú¤','ï­°'=>'Ú¦','ï­±'=>'Ú¦','ï­¯'=>'Ú¦','ï­®'=>'Ú¦','ï»—'=>'Ù‚','ﻘ'=>'Ù‚','ï»–'=>'Ù‚','ﻕ'=>'Ù‚','ﳂ'=>'قح','ï°³'=>'قح','ï·±'=>'قلے','ﳃ'=>'قم','ï°´'=>'قم','ï¶´'=>'قمح','ïµ¾'=>'قمح','ﵿ'=>'قمم','ï¶²'=>'قمى','ï±¾'=>'قى','ï°µ'=>'قى','ﱿ'=>'قى','ï°¶'=>'قى','ï»›'=>'Ùƒ','ﻜ'=>'Ùƒ','ﻚ'=>'Ùƒ','ï»™'=>'Ùƒ','Ú©'=>'Ùƒ','ï®'=>'Ùƒ','ﮑ'=>'Ùƒ','ï®'=>'Ùƒ','ﮎ'=>'Ùƒ','ï²€'=>'كا','ï°·'=>'كا','ﳄ'=>'كج','ï°¸'=>'كج','ï³…'=>'كح','ï°¹'=>'كح','ﳆ'=>'كخ','ï°º'=>'كخ','ﳇ'=>'كل','ﳫ'=>'كل','ï²'=>'كل','ï°»'=>'كل','ﳈ'=>'كم','ﳬ'=>'كم','ﲂ'=>'كم','ï°¼'=>'كم','ï·ƒ'=>'كمم','ï¶»'=>'كمم','ï¶·'=>'كمى','ﲃ'=>'كى','ï°½'=>'كى','ﲄ'=>'كى','ï°¾'=>'كى','ﯕ'=>'Ú­','ﯖ'=>'Ú­','ﯔ'=>'Ú­','ﯓ'=>'Ú­','ï®”'=>'Ú¯','ﮕ'=>'Ú¯','ﮓ'=>'Ú¯','ï®’'=>'Ú¯','ﮜ'=>'Ú±','ï®'=>'Ú±','ï®›'=>'Ú±','ﮚ'=>'Ú±','ﮘ'=>'Ú³','ï®™'=>'Ú³','ï®—'=>'Ú³','ï®–'=>'Ú³','ﻟ'=>'Ù„','ï» '=>'Ù„','ﻞ'=>'Ù„','ï»'=>'Ù„','ï»¶'=>'لآ','ﻵ'=>'لآ','ﻸ'=>'لأ','ï»·'=>'لأ','ﻺ'=>'لإ','ﻹ'=>'لإ','ﻼ'=>'لا','ï»»'=>'لا','ﳉ'=>'لج','ï°¿'=>'لج','ﶃ'=>'لجج','ï¶„'=>'لجج','ﶺ'=>'لجم','ï¶¼'=>'لجم','ﶬ'=>'لجى','ﳊ'=>'لح','ï±€'=>'لح','ï¶µ'=>'لحم','ï¶€'=>'لحم','ï¶‚'=>'لحى','ï¶'=>'لحى','ﳋ'=>'لخ','ï±'=>'لخ','ﶆ'=>'لخم','ï¶…'=>'لخم','ﳌ'=>'لم','ï³­'=>'لم','ï²…'=>'لم','ﱂ'=>'لم','ﶈ'=>'لمح','ﶇ'=>'لمح','ï¶­'=>'لمى','ï³'=>'له','ﲆ'=>'لى','ﱃ'=>'لى','ﲇ'=>'لى','ﱄ'=>'لى','ﻣ'=>'Ù…','ﻤ'=>'Ù…','ﻢ'=>'Ù…','ﻡ'=>'Ù…','ﲈ'=>'ما','ﳎ'=>'مج','ï±…'=>'مج','ï¶Œ'=>'مجح','ï¶’'=>'مجخ','ï¶'=>'مجم','ï·€'=>'مجى','ï³'=>'مح','ﱆ'=>'مح','ﶉ'=>'محج','ï¶Š'=>'محم','ï·´'=>'محمد','ï¶‹'=>'محى','ï³'=>'مخ','ﱇ'=>'مخ','ï¶Ž'=>'مخج','ï¶'=>'مخم','ï¶¹'=>'مخى','ﳑ'=>'مم','ﲉ'=>'مم','ﱈ'=>'مم','ï¶±'=>'ممى','ﱉ'=>'مى','ﱊ'=>'مى','ï»§'=>'Ù†','ﻨ'=>'Ù†','ﻦ'=>'Ù†','ﻥ'=>'Ù†','ï³’'=>'نج','ﱋ'=>'نج','ﶸ'=>'نجح','ï¶½'=>'نجح','ﶘ'=>'نجم','ï¶—'=>'نجم','ï¶™'=>'نجى','ï·‡'=>'نجى','ﳓ'=>'نح','ﱌ'=>'نح','ï¶•'=>'نحم','ï¶–'=>'نحى','ï¶³'=>'نحى','ï³”'=>'نخ','ï±'=>'نخ','ﲊ'=>'نر','ﲋ'=>'نز','ﳕ'=>'نم','ï³®'=>'نم','ﲌ'=>'نم','ﱎ'=>'نم','ï¶›'=>'نمى','ï¶š'=>'نمى','ï²'=>'نن','ï³–'=>'نه','ﳯ'=>'نه','ﲎ'=>'نى','ï±'=>'نى','ï²'=>'نى','ï±'=>'نى','ﮟ'=>'Úº','ﮞ'=>'Úº','ﻫ'=>'Ù‡','ﻬ'=>'Ù‡','ﻪ'=>'Ù‡','ﻩ'=>'Ù‡','Ú¾'=>'Ù‡','ﮬ'=>'Ù‡','ï®­'=>'Ù‡','ﮫ'=>'Ù‡','ﮪ'=>'Ù‡','Û'=>'Ù‡','ﮨ'=>'Ù‡','ﮩ'=>'Ù‡','ï®§'=>'Ù‡','ﮦ'=>'Ù‡','Û•'=>'Ù‡','ï³™'=>'هٰ','ï³—'=>'هج','ﱑ'=>'هج','ﳘ'=>'هم','ï±’'=>'هم','ï¶“'=>'همج','ï¶”'=>'همم','ﱓ'=>'هى','ï±”'=>'هى','ﮥ'=>'Û€','ﮤ'=>'Û€','ï»®'=>'Ùˆ','ï»­'=>'Ùˆ','ï·¸'=>'وسلم','ﯡ'=>'Û…','ﯠ'=>'Û…','ﯚ'=>'Û†','ﯙ'=>'Û†','ﯘ'=>'Û‡','ﯗ'=>'Û‡','Ù·'=>'Û‡Ù”','ï¯'=>'Û‡Ù”','ﯜ'=>'Ûˆ','ﯛ'=>'Ûˆ','ﯣ'=>'Û‰','ﯢ'=>'Û‰','ﯟ'=>'Û‹','ﯞ'=>'Û‹','ﯨ'=>'Ù‰','ﯩ'=>'Ù‰','ï»°'=>'Ù‰','ﻯ'=>'Ù‰','ÙŠ'=>'Ù‰','ﻳ'=>'Ù‰','ï»´'=>'Ù‰','ﻲ'=>'Ù‰','ï»±'=>'Ù‰','ÛŒ'=>'Ù‰','ﯾ'=>'Ù‰','ﯿ'=>'Ù‰','ﯽ'=>'Ù‰','ﯼ'=>'Ù‰','Ù¸'=>'Ù‰Ù”','ï²'=>'ىٰ','ï±'=>'ىٰ','ﳚ'=>'ىج','ﱕ'=>'ىج','ﶯ'=>'ىجى','ï³›'=>'ىح','ï±–'=>'ىح','ï¶®'=>'ىحى','ﳜ'=>'ىخ','ï±—'=>'ىخ','ﲑ'=>'ىر','ï²’'=>'ىز','ï³'=>'ىم','ï³°'=>'ىم','ﲓ'=>'ىم','ﱘ'=>'ىم','ï¶'=>'ىمم','ï¶œ'=>'ىمم','ï¶°'=>'ىمى','ï²”'=>'ىن','ﳞ'=>'ىه','ï³±'=>'ىه','ﲕ'=>'ىى','ï±™'=>'ىى','ï²–'=>'ىى','ﱚ'=>'ىى','Û§'=>'Û¦','ﮯ'=>'Û’','ï®®'=>'Û’','ï®±'=>'Û“','ï®°'=>'Û“','∃'=>'â´º','आ'=>'अा','ऒ'=>'अाॆ','ओ'=>'अाे','औ'=>'अाै','ऄ'=>'अॆ','ऑ'=>'अॉ','à¤'=>'à¤à¥…','ऎ'=>'à¤à¥†','à¤'=>'à¤à¥‡','ई'=>'रà¥à¤‡','আ'=>'অা','à§ '=>'ঋৃ','à§¡'=>'ঌৢ','ਉ'=>'ੳà©','ਊ'=>'ੳੂ','ਆ'=>'ਅਾ','à¨'=>'ਅੈ','ਔ'=>'ਅੌ','ਇ'=>'ੲਿ','ਈ'=>'ੲੀ','à¨'=>'ੲੇ','આ'=>'અા','ઑ'=>'અાૅ','ઓ'=>'અાે','ઔ'=>'અાૈ','àª'=>'અૅ','àª'=>'અે','àª'=>'અૈ','ଆ'=>'ଅା','௮'=>'à®…','à®°'=>'ஈ','ா'=>'ஈ','௫'=>'ஈà¯','௨'=>'உ','ஊ'=>'உள','௭'=>'எ','௷'=>'எவ','ஜ'=>'à®','௧'=>'க','௪'=>'ச','௬'=>'சà¯','௲'=>'சூ','௺'=>'நீ','ை'=>'ன','௴'=>'மீ','௰'=>'ய','ௗ'=>'ள','௸'=>'à®·','ொ'=>'ெஈ','ௌ'=>'ெள','ோ'=>'ேஈ','à± '=>'à°‹à°¾','ౡ'=>'ఌా','à°”'=>'ఒౌ','à°“'=>'ఒౕ','à°¢'=>'à°¡Ì£','à°­'=>'బ̣','à°·'=>'వ̣','à°¹'=>'వా','à°®'=>'à°µà±','ూ'=>'à±à°¾','ౄ'=>'ృా','ೡ'=>'ಌಾ','ಔ'=>'ఒౌ','à´ˆ'=>'ഇൗ','à´Š'=>'உൗ','à´'=>'എെ','à´“'=>'à´’à´¾','à´”'=>'ഒൗ','ൡ'=>'à´ž','൫'=>'à´¦àµà´°','à´Œ'=>'നூ','à´™'=>'നூ','൯'=>'à´¨àµ','à´±'=>'à´°','൪'=>'à´°àµ','൮'=>'à´µàµ','ീ'=>'ி','ൂ'=>'ூ','ൃ'=>'ூ','ൈ'=>'െെ','ฃ'=>'ข','ด'=>'ค','ต'=>'ค','ม'=>'ฆ','ซ'=>'ช','à¸'=>'ฎ','ท'=>'ฑ','ๅ'=>'า','ำ'=>'̊า','à¹'=>'เเ','ໜ'=>'ຫນ','à»'=>'ຫມ','ຳ'=>'̊າ','ཷ'=>'ྲཱྀ','ཹ'=>'ླཱྀ','á€'=>'o','ឣ'=>'អ','á§'=>'ᦞ','á­’'=>'á¬','á­“'=>'ᬑ','á­˜'=>'ᬨ','ᢖ'=>'ᡜ','á¡•'=>'á µ','á’'=>'Ꭱ','Ꮍ'=>'y','ð€'=>'A','ð´'=>'A','ð‘¨'=>'A','ð’œ'=>'A','ð“'=>'A','ð”„'=>'A','ð”¸'=>'A','ð•¬'=>'A','ð– '=>'A','ð—”'=>'A','ð˜ˆ'=>'A','ð˜¼'=>'A','ð™°'=>'A','ðš¨'=>'A','ð›¢'=>'A','ðœœ'=>'A','ð–'=>'A','ðž'=>'A','ð‰'=>'J','ð½'=>'J','ð‘±'=>'J','ð’¥'=>'J','ð“™'=>'J','ð”'=>'J','ð•'=>'J','ð•µ'=>'J','ð–©'=>'J','ð—'=>'J','ð˜‘'=>'J','ð™…'=>'J','ð™¹'=>'J','á§'=>'J','â‹¿'=>'E','â„°'=>'E','ð„'=>'E','ð¸'=>'E','ð‘¬'=>'E','ð“”'=>'E','ð”ˆ'=>'E','ð”¼'=>'E','ð•°'=>'E','ð–¤'=>'E','ð—˜'=>'E','ð˜Œ'=>'E','ð™€'=>'E','ð™´'=>'E','ðš¬'=>'E','ð›¦'=>'E','ðœ '=>'E','ðš'=>'E','ðž”'=>'E','ℾ'=>'Ꮁ','ðšª'=>'Ꮁ','ð›¤'=>'Ꮁ','ðœž'=>'Ꮁ','ð˜'=>'Ꮁ','ðž’'=>'Ꮁ','á”'=>'w','ℳ'=>'M','ðŒ'=>'M','ð‘€'=>'M','ð‘´'=>'M','ð“œ'=>'M','ð”'=>'M','ð•„'=>'M','ð•¸'=>'M','ð–¬'=>'M','ð— '=>'M','ð˜”'=>'M','ð™ˆ'=>'M','ð™¼'=>'M','ðš³'=>'M','ð›­'=>'M','ðœ§'=>'M','ð¡'=>'M','ðž›'=>'M','â„‹'=>'H','ℌ'=>'H','â„'=>'H','ð‡'=>'H','ð»'=>'H','ð‘¯'=>'H','ð“—'=>'H','ð•³'=>'H','ð–§'=>'H','ð—›'=>'H','ð˜'=>'H','ð™ƒ'=>'H','ð™·'=>'H','ðš®'=>'H','ð›¨'=>'H','ðœ¢'=>'H','ðœ'=>'H','ðž–'=>'H','ð†'=>'G','ðº'=>'G','ð‘®'=>'G','ð’¢'=>'G','ð“–'=>'G','ð”Š'=>'G','ð”¾'=>'G','ð•²'=>'G','ð–¦'=>'G','ð—š'=>'G','ð˜Ž'=>'G','ð™‚'=>'G','ð™¶'=>'G','á³'=>'G','ℤ'=>'Z','ℨ'=>'Z','ð™'=>'Z','ð‘'=>'Z','ð’'=>'Z','ð’µ'=>'Z','ð“©'=>'Z','ð–…'=>'Z','ð–¹'=>'Z','ð—­'=>'Z','ð˜¡'=>'Z','ð™•'=>'Z','ðš‰'=>'Z','ðš­'=>'Z','ð›§'=>'Z','ðœ¡'=>'Z','ð›'=>'Z','ðž•'=>'Z','ð’'=>'S','ð‘†'=>'S','ð‘º'=>'S','ð’®'=>'S','ð“¢'=>'S','ð”–'=>'S','ð•Š'=>'S','ð•¾'=>'S','ð–²'=>'S','ð—¦'=>'S','ð˜š'=>'S','ð™Ž'=>'S','ðš‚'=>'S','áš'=>'S','ð•'=>'V','ð‘‰'=>'V','ð‘½'=>'V','ð’±'=>'V','ð“¥'=>'V','ð”™'=>'V','ð•'=>'V','ð–'=>'V','ð–µ'=>'V','ð—©'=>'V','ð˜'=>'V','ð™‘'=>'V','ðš…'=>'V','â„’'=>'L','ð‹'=>'L','ð¿'=>'L','ð‘³'=>'L','ð“›'=>'L','ð”'=>'L','ð•ƒ'=>'L','ð•·'=>'L','ð–«'=>'L','ð—Ÿ'=>'L','ð˜“'=>'L','ð™‡'=>'L','ð™»'=>'L','∑'=>'C','â…€'=>'C','â„‚'=>'C','â„­'=>'C','ð‚'=>'C','ð¶'=>'C','ð‘ª'=>'C','ð’ž'=>'C','ð“’'=>'C','ð•®'=>'C','ð–¢'=>'C','ð—–'=>'C','ð˜Š'=>'C','ð˜¾'=>'C','ð™²'=>'C','ðšº'=>'C','ð›´'=>'C','ðœ®'=>'C','ð¨'=>'C','ðž¢'=>'C','â„™'=>'P','ð'=>'P','ð‘ƒ'=>'P','ð‘·'=>'P','ð’«'=>'P','ð“Ÿ'=>'P','ð”“'=>'P','ð•»'=>'P','ð–¯'=>'P','ð—£'=>'P','ð˜—'=>'P','ð™‹'=>'P','ð™¿'=>'P','ðš¸'=>'P','ð›²'=>'P','ðœ¬'=>'P','ð¦'=>'P','ðž '=>'P','ðŠ'=>'K','ð¾'=>'K','ð‘²'=>'K','ð’¦'=>'K','ð“š'=>'K','ð”Ž'=>'K','ð•‚'=>'K','ð•¶'=>'K','ð–ª'=>'K','ð—ž'=>'K','ð˜’'=>'K','ð™†'=>'K','ð™º'=>'K','ðš±'=>'K','ð›«'=>'K','ðœ¥'=>'K','ðŸ'=>'K','ðž™'=>'K','ℬ'=>'B','ð'=>'B','ðµ'=>'B','ð‘©'=>'B','ð“‘'=>'B','ð”…'=>'B','ð”¹'=>'B','ð•­'=>'B','ð–¡'=>'B','ð—•'=>'B','ð˜‰'=>'B','ð˜½'=>'B','ð™±'=>'B','ðš©'=>'B','ð›£'=>'B','ðœ'=>'B','ð—'=>'B','ðž‘'=>'B','á'=>'á·','∆'=>'áƒ','ðš«'=>'áƒ','ð›¥'=>'áƒ','ðœŸ'=>'áƒ','ð™'=>'áƒ','ðž“'=>'áƒ','á'=>'áƒÂ·','á‘'=>'á„·','á“'=>'á…·','á•'=>'á†Â·','á˜'=>'áŠÂ·','áš'=>'á‹Â·','á“‘'=>'á¡','á‘¶'=>'·P','ᑺ'=>'·d','á’˜'=>'·J','á‘'=>'á³Â·','ᑃ'=>'á´Â·','á‘…'=>'á¸Â·','ᑇ'=>'á¹Â·','ˈ'=>'ᑊ','ᑘ'=>'ᑌ·','á‘§'=>'ᑌᑊ','ᑚ'=>'ᑎ·','ᑨ'=>'ᑎᑊ','ᑜ'=>'á‘·','ᑞ'=>'á‘·','á‘©'=>'á‘ᑊ','á‘ '=>'ᑑ·','á‘¢'=>'ᑕ·','ᑪ'=>'ᑕᑊ','ᑤ'=>'ᑖ·','ᑵ'=>'ᑫ·','á’…'=>'ᑫᑊ','á‘·'=>'P·','á’†'=>'Pᑊ','ᑹ'=>'ᑮ·','á‘»'=>'d·','á’‡'=>'dᑊ','ᑽ'=>'ᑰ·','á‘¿'=>'ᑲ·','á’ˆ'=>'ᑲᑊ','á’'=>'ᑳ·','ᘃ'=>'á’‰','á’“'=>'ᒉ·','á’•'=>'ᒋ·','á’—'=>'ᒌ·','á’™'=>'J·','á’›'=>'ᒎ·','ᘂ'=>'á’','á’'=>'á’·','á’Ÿ'=>'ᒑ·','á’­'=>'ᒣ·','á’¯'=>'ᒥ·','á’±'=>'ᒦ·','á’³'=>'ᒧ·','á’µ'=>'ᒨ·','á’¹'=>'ᒫ·','ᓊ'=>'ᓀ·','ᓌ'=>'ᓇ·','ᓎ'=>'ᓈᒫ','ᘄ'=>'á““','á“'=>'ᓓ·','ᓟ'=>'ᓕ·','á“¡'=>'ᓖ·','á“£'=>'ᓗ·','á“¥'=>'ᓘ·','ᘇ'=>'ᓚ','á“§'=>'ᓚ·','á“©'=>'ᓛ·','á“·'=>'ᓭ·','ᓹ'=>'ᓯ·','á“»'=>'ᓰ·','ᓽ'=>'ᓱ·','á“¿'=>'ᓲ·','á”'=>'ᓴ·','ᔃ'=>'ᓵ·','ᔌ'=>'ᔋá¸','á”'=>'ᔋᑕ','ᔎ'=>'ᔋᑲ','á”'=>'ᔋá’','ᔘ'=>'á”·','ᔚ'=>'ᔑ·','ᔜ'=>'ᔒ·','ᔞ'=>'ᔓ·','á” '=>'ᔔ·','ᔢ'=>'ᔕ·','ᔤ'=>'ᔖ·','ᔲ'=>'ᔨ·','á”´'=>'ᔩ·','á”¶'=>'ᔪ·','ᔸ'=>'ᔫ·','ᔺ'=>'ᔭ·','ᔼ'=>'ᔮ·','á™®'=>'x','ᕽ'=>'x','ᘢ'=>'ᕃ','ᘣ'=>'ᕆ','ᘤ'=>'ᕊ','á•'=>'ᕌ·','ᙯ'=>'á•á‘«','ᕾ'=>'á•ᑬ','á•¿'=>'á•P','á–€'=>'á•á‘®','á–'=>'á•d','á–‚'=>'á•á‘°','á–ƒ'=>'á•ᑲ','á–„'=>'á•ᑳ','á–…'=>'á•á’ƒ','ᕜ'=>'ᕚ·','á•©'=>'ᕧ·','â„›'=>'R','ℜ'=>'R','â„'=>'R','ð‘'=>'R','ð‘…'=>'R','ð‘¹'=>'R','ð“¡'=>'R','ð•½'=>'R','ð–±'=>'R','ð—¥'=>'R','ð˜™'=>'R','ð™'=>'R','ðš'=>'R','á™°'=>'á–•á’‰','á–Ž'=>'á–•á’Š','á–'=>'á–•á’‹','á–'=>'á–•á’Œ','á–‘'=>'á–•J','á–’'=>'á–•á’Ž','á–“'=>'á–•á’','á–”'=>'á–•á’‘','á™±'=>'á––á’‹','ᙲ'=>'á––á’Œ','ᙳ'=>'á––J','á™´'=>'á––á’Ž','ᙵ'=>'á––á’','á™¶'=>'á––á’‘','ℱ'=>'F','ð…'=>'F','ð¹'=>'F','ð‘­'=>'F','ð“•'=>'F','ð”‰'=>'F','ð”½'=>'F','ð•±'=>'F','ð–¥'=>'F','ð—™'=>'F','ð˜'=>'F','ð™'=>'F','ð™µ'=>'F','ðŸŠ'=>'F','â……'=>'D','ðƒ'=>'D','ð·'=>'D','ð‘«'=>'D','ð’Ÿ'=>'D','ð““'=>'D','ð”‡'=>'D','ð”»'=>'D','ð•¯'=>'D','ð–£'=>'D','ð——'=>'D','ð˜‹'=>'D','ð˜¿'=>'D','ð™³'=>'D','á—ª'=>'D','â„§'=>'ᘮ','ᘴ'=>'ᘮ','ð›€'=>'ᘯ','ð›º'=>'ᘯ','ðœ´'=>'ᘯ','ð®'=>'ᘯ','ðž¨'=>'ᘯ','ᘵ'=>'ᘯ','ㄱ'=>'á„€','ᄀ'=>'á„€','ᆨ'=>'á„€','ㄲ'=>'á„','ï¾¢'=>'á„','ᆩ'=>'á„','ã„´'=>'á„‚','ᄂ'=>'á„‚','ᆫ'=>'á„‚','ã„·'=>'ᄃ','ï¾§'=>'ᄃ','ᆮ'=>'ᄃ','ㄸ'=>'á„„','ᄄ'=>'á„„','ㄹ'=>'á„…','ᄅ'=>'á„…','ᆯ'=>'á„…','ã…'=>'ᄆ','ï¾±'=>'ᄆ','ᆷ'=>'ᄆ','ã…‚'=>'ᄇ','ï¾²'=>'ᄇ','ᆸ'=>'ᄇ','ã…ƒ'=>'ᄈ','ï¾³'=>'ᄈ','ã……'=>'ᄉ','ï¾µ'=>'ᄉ','ᆺ'=>'ᄉ','ã…†'=>'ᄊ','ï¾¶'=>'ᄊ','ᆻ'=>'ᄊ','ã…‡'=>'á„‹','ï¾·'=>'á„‹','ᆼ'=>'á„‹','ã…ˆ'=>'ᄌ','ᄌ'=>'ᄌ','ᆽ'=>'ᄌ','ã…‰'=>'á„','ï¾¹'=>'á„','ã…Š'=>'ᄎ','ᄎ'=>'ᄎ','ᆾ'=>'ᄎ','ã…‹'=>'á„','ï¾»'=>'á„','ᆿ'=>'á„','ã…Œ'=>'á„','ï¾¼'=>'á„','ᇀ'=>'á„','ã…'=>'á„‘','ï¾½'=>'á„‘','á‡'=>'á„‘','ã…Ž'=>'á„’','ï¾¾'=>'á„’','ᇂ'=>'á„’','ᇅ'=>'á„“','ã…¥'=>'á„”','ã…¦'=>'á„•','ᇆ'=>'á„•','ᇊ'=>'á„—','á‡'=>'ᄘ','á‡'=>'á„™','ã…€'=>'ᄚ','ï¾°'=>'ᄚ','á„»'=>'ᄚ','ᆶ'=>'ᄚ','ã…®'=>'ᄜ','ᇜ'=>'ᄜ','ã…±'=>'á„','ᇢ'=>'á„','ã…²'=>'ᄞ','ã…³'=>'á„ ','ã…„'=>'á„¡','ï¾´'=>'á„¡','ᆹ'=>'á„¡','ã…´'=>'á„¢','ã…µ'=>'á„£','ã…¶'=>'á„§','ã…·'=>'á„©','ã…¸'=>'á„«','ᇦ'=>'á„«','ã…¹'=>'ᄬ','ã…º'=>'á„­','ᇧ'=>'á„­','ã…»'=>'á„®','ã…¼'=>'ᄯ','ᇨ'=>'ᄯ','ᇩ'=>'á„°','ã…½'=>'ᄲ','ᇪ'=>'ᄲ','ã…¾'=>'á„¶','ã…¿'=>'á…€','ᇫ'=>'á…€','ᇬ'=>'á…','ᇱ'=>'á……','ㆂ'=>'á……','ᇲ'=>'á…†','ㆃ'=>'á…†','ㆀ'=>'á…‡','ᇮ'=>'á…‡','ã†'=>'á…Œ','ᇰ'=>'á…Œ','ᇳ'=>'á…–','ㆄ'=>'á…—','ᇴ'=>'á…—','ㆅ'=>'á…˜','ㆆ'=>'á…™','ᇹ'=>'á…™','ã…¤'=>'á… ','ï¾ '=>'á… ','ã…'=>'á…¡','ï¿‚'=>'á…¡','ã…'=>'á…¢','ᅢ'=>'á…¢','ã…‘'=>'á…£','ï¿„'=>'á…£','ã…’'=>'á…¤','ï¿…'=>'á…¤','ã…“'=>'á…¥','ᅥ'=>'á…¥','ã…”'=>'á…¦','ᅦ'=>'á…¦','ã…•'=>'á…§','ᅧ'=>'á…§','ã…–'=>'á…¨','ï¿‹'=>'á…¨','ã…—'=>'á…©','ᅩ'=>'á…©','ã…˜'=>'á…ª','ï¿'=>'á…ª','ã…™'=>'á…«','ᅫ'=>'á…«','ã…š'=>'á…¬','ï¿'=>'á…¬','ã…›'=>'á…­','ï¿’'=>'á…­','ã…œ'=>'á…®','ï¿“'=>'á…®','ã…'=>'á…¯','ï¿”'=>'á…¯','ã…ž'=>'á…°','ï¿•'=>'á…°','ã…Ÿ'=>'á…±','ï¿–'=>'á…±','ã… '=>'á…²','ï¿—'=>'á…²','ã…¡'=>'一','ᅳ'=>'一','ã…¢'=>'á…´','ï¿›'=>'á…´','ã…£'=>'丨','ᅵ'=>'丨','ㆇ'=>'ᆄ','ᆆ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ã†'=>'ᆞ','ㆎ'=>'ᆡ','ㄳ'=>'ᆪ','ï¾£'=>'ᆪ','ㄵ'=>'ᆬ','ï¾¥'=>'ᆬ','ã„¶'=>'ᆭ','ᆭ'=>'ᆭ','ㄺ'=>'ᆰ','ᆰ'=>'ᆰ','ã„»'=>'ᆱ','ᆱ'=>'ᆱ','ㄼ'=>'ᆲ','ᆲ'=>'ᆲ','ㄽ'=>'ᆳ','ï¾­'=>'ᆳ','ㄾ'=>'ᆴ','ï¾®'=>'ᆴ','ã„¿'=>'ᆵ','ᆵ'=>'ᆵ','ã…§'=>'ᇇ','ã…¨'=>'ᇈ','ã…©'=>'ᇌ','ã…ª'=>'ᇎ','ã…«'=>'ᇓ','ã…¬'=>'ᇗ','ã…­'=>'ᇙ','ã…¯'=>'á‡','ã…°'=>'ᇟ','ï½§'=>'ã‚¡','ï½±'=>'ã‚¢','ィ'=>'ã‚£','ï½²'=>'イ','ゥ'=>'ã‚¥','ï½³'=>'ウ','ェ'=>'ã‚§','ï½´'=>'エ','ォ'=>'ã‚©','ï½µ'=>'オ','ï½¶'=>'ã‚«','ï½·'=>'ã‚­','ク'=>'ク','ï½¹'=>'ケ','コ'=>'コ','ï½»'=>'サ','ï½¼'=>'ã‚·','ï½½'=>'ス','ï½¾'=>'ã‚»','ソ'=>'ソ','ï¾€'=>'ã‚¿','ï¾'=>'ãƒ','ッ'=>'ッ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ï¾…'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ãƒ','ノ'=>'ノ','ハ'=>'ãƒ','ヒ'=>'ヒ','フ'=>'フ','ï¾'=>'ã¸','ホ'=>'ホ','ï¾'=>'マ','â§„'=>'〼','ï¾'=>'ミ','ム'=>'ム','ï¾’'=>'メ','モ'=>'モ','ャ'=>'ャ','ï¾”'=>'ヤ','ï½­'=>'ュ','ユ'=>'ユ','ï½®'=>'ョ','ï¾–'=>'ヨ','ï¾—'=>'ラ','リ'=>'リ','ï¾™'=>'ル','レ'=>'レ','ï¾›'=>'ロ','ワ'=>'ワ','ヲ'=>'ヲ','ï¾'=>'ン','ê’ž'=>'êŠ','ê’¬'=>'ê','ê’œ'=>'ꃀ','ê’¿'=>'ꉙ','ê’¾'=>'ꊱ','ê“€'=>'ꎫ','ê“‚'=>'ꎵ','ê’º'=>'ꎿ','ê’°'=>'ê‚','ð’ '=>'ð’†','—'=>'一','―'=>'一','−'=>'一','─'=>'一','â¼€'=>'一','不'=>'ä¸','ï©°'=>'並','|'=>'丨','|'=>'丨','∣'=>'丨','â¼'=>'丨','‖'=>'丨丨','∥'=>'丨丨','串'=>'串','⼂'=>'丶','ð¯ '=>'丸','丹'=>'丹','丽'=>'丽','⼃'=>'丿','乁'=>'ä¹','⼄'=>'ä¹™','亂'=>'亂','â¼…'=>'亅','了'=>'了','⼆'=>'二','⼇'=>'亠','亮'=>'亮','⼈'=>'人','ï§½'=>'什','仌'=>'仌','令'=>'令','你'=>'ä½ ','倂'=>'ä½µ','倂'=>'ä½µ','侀'=>'ä¾€','來'=>'來','例'=>'例','侮'=>'ä¾®','侮'=>'ä¾®','侻'=>'ä¾»','便'=>'便','值'=>'値','ï§”'=>'倫','偺'=>'åº','備'=>'å‚™','像'=>'åƒ','僚'=>'僚','僧'=>'僧','僧'=>'僧','⼉'=>'å„¿','兀'=>'å…€','ï©´'=>'å……','免'=>'å…','免'=>'å…','ð¯ '=>'å…”','ð¯ '=>'å…¤','⼊'=>'å…¥','內'=>'å…§','全'=>'å…¨','兩'=>'å…©','⼋'=>'å…«','ï§‘'=>'å…­','具'=>'å…·','冀'=>'冀','⼌'=>'冂','再'=>'å†','冒'=>'冒','冕'=>'冕','â¼'=>'冖','冗'=>'冗','冤'=>'冤','⼎'=>'冫','冬'=>'冬','况'=>'况','况'=>'况','冷'=>'冷','凉'=>'凉','凌'=>'凌','凜'=>'凜','凞'=>'凞','â¼'=>'几','ð¯ '=>'凵','â¼'=>'凵','⼑'=>'刀','刃'=>'刃','切'=>'切','ð¯¡'=>'切','列'=>'列','ï§'=>'利','ï§¿'=>'刺','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','劉'=>'劉','力'=>'力','â¼’'=>'力','ï¦'=>'劣','劳'=>'劳','ï©¶'=>'勇','勇'=>'勇','勉'=>'勉','勉'=>'勉','勒'=>'å‹’','勞'=>'勞','勤'=>'勤','勤'=>'勤','勵'=>'勵','⼓'=>'勹','ï©·'=>'勺','勺'=>'勺','包'=>'包','匆'=>'匆','â¼”'=>'匕','北'=>'北','北'=>'北','⼕'=>'匚','â¼–'=>'匸','ï§«'=>'匿','â¼—'=>'å','〸'=>'å','〹'=>'å„','〺'=>'å…','卉'=>'å‰','卑'=>'å‘','卑'=>'å‘','博'=>'åš','⼘'=>'åœ','â¼™'=>'å©','即'=>'å³','卵'=>'åµ','卽'=>'å½','卿'=>'å¿','卿'=>'å¿','卿'=>'å¿','⼚'=>'厂','â¼›'=>'厶','參'=>'åƒ','⼜'=>'åˆ','及'=>'åŠ','叟'=>'åŸ','â¼'=>'å£','句'=>'å¥','叫'=>'å«','叱'=>'å±','吆'=>'å†','ï§ž'=>'å','ï§­'=>'å','吸'=>'å¸','呂'=>'å‘‚','呈'=>'呈','周'=>'周','咞'=>'å’ž','咢'=>'å’¢','咽'=>'å’½','ð¯¡'=>'å“¶','唐'=>'å”','啓'=>'å•“','啟'=>'å•“','啕'=>'å••','啣'=>'å•£','善'=>'å–„','善'=>'å–„','喇'=>'å–‡','喙'=>'å–™','喙'=>'å–™','喝'=>'å–','喝'=>'å–','喫'=>'å–«','喳'=>'å–³','ï¨'=>'å—€','嗂'=>'å—‚','ï©»'=>'å—¢','嘆'=>'嘆','嘆'=>'嘆','噑'=>'噑','器'=>'器','ð¯¡'=>'å™´','⼞'=>'å›—','囹'=>'囹','圖'=>'圖','ð¯¡'=>'圗','⼟'=>'土','型'=>'åž‹','城'=>'城','埴'=>'埴','堍'=>'å ','報'=>'å ±','堲'=>'å ²','塀'=>'å¡€','ï¨'=>'塚','塚'=>'塚','塞'=>'塞','å¡«'=>'å¡¡','墨'=>'墨','壿'=>'墫','墬'=>'墬','墳'=>'墳','壘'=>'壘','壟'=>'壟','â¼ '=>'士','壮'=>'壮','売'=>'売','壷'=>'壷','⼡'=>'夂','夆'=>'夆','â¼¢'=>'夊','â¼£'=>'夕','ð¯¡'=>'多','夢'=>'夢','⼤'=>'大','奄'=>'奄','奈'=>'奈','契'=>'契','ï©¿'=>'奔','奢'=>'奢','ï¦'=>'女','â¼¥'=>'女','姘'=>'姘','姬'=>'姬','娛'=>'娛','娧'=>'娧','婢'=>'å©¢','婦'=>'婦','嬀'=>'媯','媵'=>'媵','嬈'=>'嬈','ïª'=>'嬨','嬾'=>'嬾','嬾'=>'嬾','⼦'=>'å­','â¼§'=>'宀','宅'=>'å®…','寃'=>'寃','寘'=>'寘','寧'=>'寧','寧'=>'寧','寧'=>'寧','寮'=>'寮','寳'=>'寳','⼨'=>'寸','寿'=>'寿','将'=>'å°†','⼩'=>'å°','尢'=>'å°¢','⼪'=>'å°¢','⼫'=>'å°¸','尿'=>'å°¿','屠'=>'å± ','屢'=>'å±¢','層'=>'層','ï§Ÿ'=>'å±¥','屮'=>'å±®','屮'=>'å±®','⼬'=>'å±®','â¼­'=>'å±±','岍'=>'å²','峀'=>'å³€','ï§•'=>'å´™','嵃'=>'嵃','嵐'=>'åµ','嵫'=>'嵫','嵮'=>'åµ®','嵼'=>'åµ¼','嶲'=>'å¶²','嶺'=>'嶺','â¼®'=>'å·›','ð¯¢'=>'å·¡','巢'=>'å·¢','⼯'=>'å·¥','â¼°'=>'å·±','巽'=>'å·½','â¼±'=>'å·¾','帲'=>'帡','帨'=>'帨','帽'=>'帽','幩'=>'幩','â¼²'=>'å¹²','年'=>'å¹´','â¼³'=>'幺','â¼´'=>'广','ï¨'=>'度','庰'=>'庰','庳'=>'庳','ð¯¢'=>'庶','廉'=>'廉','廊'=>'廊','廊'=>'廊','廒'=>'å»’','廓'=>'廓','廙'=>'å»™','廬'=>'廬','â¼µ'=>'å»´','ð¯¢'=>'廾','â¼¶'=>'廾','弄'=>'弄','â¼·'=>'弋','⼸'=>'弓','弢'=>'å¼¢','弢'=>'å¼¢','â¼¹'=>'å½','当'=>'当','⼺'=>'彡','形'=>'å½¢','彩'=>'彩','彫'=>'彫','â¼»'=>'å½³','律'=>'律','徚'=>'徚','復'=>'復','徭'=>'å¾­','â¼¼'=>'心','ð¯¢'=>'å¿','志'=>'å¿—','念'=>'念','忹'=>'忹','怒'=>'怒','怜'=>'怜','悁'=>'æ‚','悔'=>'æ‚”','悔'=>'æ‚”','惇'=>'惇','惘'=>'惘','惡'=>'惡','愈'=>'愈','ï§™'=>'æ…„','慈'=>'æ…ˆ','慌'=>'æ…Œ','慌'=>'æ…Œ','慎'=>'æ…Ž','慎'=>'æ…Ž','慠'=>'æ… ','慨'=>'æ…¨','慺'=>'æ…º','憎'=>'憎','憎'=>'憎','憎'=>'憎','ï¦'=>'æ†','憤'=>'憤','憯'=>'憯','憲'=>'憲','懞'=>'懞','ï©€'=>'懲','懲'=>'懲','懲'=>'懲','ï¤'=>'懶','懶'=>'懶','ï¦'=>'戀','â¼½'=>'戈','成'=>'æˆ','戛'=>'戛','ï§’'=>'戮','戴'=>'戴','â¼¾'=>'戶','⼿'=>'手','扝'=>'æ‰','抱'=>'抱','拉'=>'拉','拏'=>'æ‹','拓'=>'æ‹“','拔'=>'æ‹”','拼'=>'拼','拾'=>'拾','挽'=>'挽','捐'=>'æ','捨'=>'æ¨','捻'=>'æ»','掃'=>'掃','掠'=>'掠','ð¯£'=>'掩','ïª'=>'æ„','揅'=>'æ…','揤'=>'æ¤','ã©'=>'æ‰','搜'=>'æœ','搢'=>'æ¢','ïª'=>'æ‘’','摩'=>'æ‘©','摷'=>'æ‘·','摾'=>'摾','撚'=>'æ’š','撝'=>'æ’','擄'=>'æ“„','â½€'=>'支','â½'=>'æ”´','ï©'=>'æ•','敏'=>'æ•','ïª'=>'æ•–','敬'=>'敬','數'=>'數','⽂'=>'æ–‡','⽃'=>'æ–—','料'=>'æ–™','⽄'=>'æ–¤','â½…'=>'æ–¹','旅'=>'æ—…','⽆'=>'æ— ','ï©‚'=>'æ—¢','旣'=>'æ—£','⽇'=>'æ—¥','ï§ '=>'易','ð¯£'=>'晉','晩'=>'晚','䀿'=>'晣','晴'=>'æ™´','晴'=>'æ™´','ï§…'=>'暈','暑'=>'æš‘','ð¯£'=>'æš‘','暜'=>'æšœ','暴'=>'æš´','曆'=>'曆','⽈'=>'æ›°','ï¤'=>'æ›´','㫚'=>'æ›¶','書'=>'書','最'=>'最','⽉'=>'月','肦'=>'朌','èƒ'=>'æœ','胊'=>'æœ','è„'=>'朓','朗'=>'朗','朗'=>'朗','朗'=>'朗','è„§'=>'朘','望'=>'望','望'=>'望','朡'=>'朡','膧'=>'朣','⽊'=>'木','ï§¡'=>'æŽ','杓'=>'æ“','杖'=>'æ–','杞'=>'æž','柿'=>'æ®','杻'=>'æ»','枅'=>'æž…','ï§´'=>'æž—','柳'=>'柳','柺'=>'柺','ï§š'=>'æ —','栟'=>'æ Ÿ','桒'=>'æ¡’','梁'=>'æ¢','ï©„'=>'梅','梅'=>'梅','梎'=>'梎','ï§¢'=>'梨','椔'=>'椔','楂'=>'楂','樧'=>'æ¦','榣'=>'榣','槪'=>'槪','樂'=>'樂','樂'=>'樂','樂'=>'樂','樓'=>'樓','檨'=>'檨','櫓'=>'æ«“','櫛'=>'æ«›','ï¤'=>'欄','⽋'=>'欠','次'=>'次','歔'=>'æ­”','⽌'=>'æ­¢','歲'=>'æ­²','歷'=>'æ­·','歹'=>'æ­¹','â½'=>'æ­¹','殟'=>'殟','殮'=>'æ®®','⽎'=>'殳','殺'=>'殺','殺'=>'殺','殺'=>'殺','殻'=>'æ®»','â½'=>'毋','⺟'=>'æ¯','â½'=>'比','⽑'=>'毛','â½’'=>'æ°','⽓'=>'æ°”','â½”'=>'æ°´','汎'=>'汎','汧'=>'æ±§','沈'=>'沈','沿'=>'沿','泌'=>'泌','泍'=>'æ³','ï§£'=>'æ³¥','洖'=>'æ´–','洛'=>'æ´›','洞'=>'æ´ž','洴'=>'æ´´','派'=>'æ´¾','ï§Š'=>'æµ','流'=>'æµ','流'=>'æµ','浩'=>'浩','浪'=>'浪','ï©…'=>'æµ·','ð¯¤'=>'æµ·','浸'=>'浸','涅'=>'æ¶…','ï§µ'=>'æ·‹','ï¥'=>'æ·š','ï§–'=>'æ·ª','淹'=>'æ·¹','渚'=>'渚','港'=>'港','湮'=>'æ¹®','æ½™'=>'溈','ï§‹'=>'溜','溺'=>'溺','滇'=>'滇','滋'=>'滋','滋'=>'滋','滑'=>'滑','滛'=>'æ»›','漏'=>'æ¼','漢'=>'æ¼¢','漢'=>'æ¼¢','漣'=>'æ¼£','ð¯¤'=>'æ½®','濆'=>'濆','濫'=>'æ¿«','濾'=>'濾','瀛'=>'瀛','瀞'=>'瀞','瀞'=>'瀞','瀹'=>'瀹','灊'=>'çŠ','⽕'=>'ç«','灰'=>'ç°','灷'=>'ç·','災'=>'ç½','ï§»'=>'ç‚™','炭'=>'ç‚­','烈'=>'烈','烙'=>'烙','煅'=>'ç……','煉'=>'ç…‰','煮'=>'ç…®','煮'=>'ç…®','熜'=>'熜','ï§€'=>'燎','ï§®'=>'ç‡','爐'=>'çˆ','爛'=>'爛','爨'=>'爨','â½–'=>'爪','爫'=>'爫','⺤'=>'爫','爵'=>'爵','爵'=>'爵','â½—'=>'父','⽘'=>'爻','â½™'=>'爿','⽚'=>'片','牐'=>'ç‰','â½›'=>'牙','⽜'=>'牛','牢'=>'牢','犀'=>'犀','犕'=>'犕','â½'=>'犬','犯'=>'犯','狀'=>'ç‹€','狼'=>'狼','猪'=>'猪','猪'=>'猪','獵'=>'çµ','獺'=>'çº','⽞'=>'玄','率'=>'率','ï§›'=>'率','⽟'=>'玉','王'=>'王','玥'=>'玥','玲'=>'玲','珞'=>'çž','理'=>'ç†','ï§Œ'=>'ç‰','琢'=>'ç¢','瑇'=>'瑇','瑜'=>'瑜','瑩'=>'ç‘©','瑱'=>'瑱','瑱'=>'瑱','璅'=>'ç’…','璉'=>'ç’‰','璘'=>'ç’˜','瓊'=>'瓊','â½ '=>'瓜','⽡'=>'瓦','甆'=>'甆','â½¢'=>'甘','â½£'=>'生','甤'=>'甤','⽤'=>'用','â½¥'=>'ç”°','画'=>'ç”»','甾'=>'甾','ï§'=>'ç•™','略'=>'ç•¥','異'=>'ç•°','異'=>'ç•°','⽦'=>'ç–‹','â½§'=>'ç–’','ï§¥'=>'ç—¢','瘐'=>'ç˜','瘝'=>'ç˜','瘟'=>'瘟','ï§'=>'療','癩'=>'癩','⽨'=>'ç™¶','⽩'=>'白','⽪'=>'çš®','⽫'=>'çš¿','益'=>'益','益'=>'益','盛'=>'ç››','盧'=>'ç›§','⽬'=>'ç›®','直'=>'ç›´','直'=>'ç›´','省'=>'çœ','眞'=>'眞','真'=>'真','真'=>'真','着'=>'ç€','睊'=>'çŠ','睊'=>'çŠ','瞋'=>'çž‹','ïª'=>'çž§','â½­'=>'矛','â½®'=>'矢','⽯'=>'石','ç¡'=>'ç ”','硎'=>'硎','ï§Ž'=>'ç¡«','碌'=>'碌','ð¯¥'=>'碌','ï©‹'=>'碑','磊'=>'磊','磌'=>'磌','ð¯¥'=>'磌','磻'=>'磻','礪'=>'礪','â½°'=>'示','礼'=>'礼','社'=>'社','祈'=>'祈','ï©'=>'祉','ï©'=>'ç¥','ï©'=>'祖','祖'=>'祖','ï©‘'=>'ç¥','神'=>'神','祥'=>'祥','祿'=>'祿','ï©’'=>'ç¦','ï©“'=>'禎','福'=>'ç¦','福'=>'ç¦','禮'=>'禮','â½±'=>'禸','â½²'=>'禾','秊'=>'ç§Š','秫'=>'ç§«','稜'=>'稜','ï©”'=>'ç©€','穀'=>'ç©€','穊'=>'穊','穏'=>'ç©','â½³'=>'ç©´','ï©•'=>'çª','窱'=>'窱','ï§·'=>'ç«‹','â½´'=>'ç«‹','竮'=>'ç«®','â½µ'=>'竹','笠'=>'笠','ï©–'=>'節','節'=>'節','篆'=>'篆','築'=>'築','簾'=>'ç°¾','籠'=>'ç± ','â½¶'=>'ç±³','类'=>'ç±»','ï§¹'=>'ç²’','ï¨'=>'ç²¾','糒'=>'ç³’','糖'=>'ç³–','糣'=>'ç³£','糧'=>'ç³§','糨'=>'糨','â½·'=>'糸','紀'=>'ç´€','ï§'=>'ç´','索'=>'ç´¢','ï¥'=>'ç´¯','çµ¶'=>'絕','絛'=>'çµ›','絣'=>'çµ£','綠'=>'ç¶ ','綾'=>'ç¶¾','緇'=>'ç·‡','練'=>'ç·´','ï©—'=>'ç·´','練'=>'ç·´','縂'=>'縂','縉'=>'縉','ï¥'=>'縷','ï©™'=>'ç¹','繅'=>'ç¹…','⽸'=>'ç¼¶','缾'=>'ç¼¾','â½¹'=>'网','⺫'=>'ç½’','署'=>'ç½²','罹'=>'ç½¹','罺'=>'罺','ï¤'=>'ç¾…','⽺'=>'羊','羕'=>'羕','羚'=>'羚','羽'=>'ç¾½','â½»'=>'ç¾½','翺'=>'翺','老'=>'è€','â½¼'=>'è€','ï©›'=>'者','者'=>'者','者'=>'者','â½½'=>'而','â½¾'=>'耒','⽿'=>'耳','聆'=>'è†','聠'=>'è ','聯'=>'è¯','聰'=>'è°','聾'=>'è¾','â¾€'=>'è¿','â¾'=>'肉','肋'=>'è‚‹','肭'=>'è‚­','育'=>'育','㬵'=>'胶','è…'=>'胼','脃'=>'脃','脾'=>'脾','臘'=>'臘','⾂'=>'臣','ï§¶'=>'臨','⾃'=>'自','臭'=>'臭','⾄'=>'至','â¾…'=>'臼','舁'=>'èˆ','舁'=>'èˆ','舄'=>'舄','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','良'=>'良','⾊'=>'色','⾋'=>'艸','ï©'=>'艹','艹'=>'艹','ð¯¦'=>'芋','ð¯¦'=>'芑','芝'=>'èŠ','花'=>'花','芳'=>'芳','芽'=>'芽','若'=>'è‹¥','若'=>'è‹¥','苦'=>'苦','茝'=>'èŒ','茣'=>'茣','ï§¾'=>'茶','荒'=>'è’','荓'=>'è“','荣'=>'è£','莭'=>'莭','ð¯¦'=>'莽','菉'=>'è‰','菊'=>'èŠ','菌'=>'èŒ','菜'=>'èœ','菧'=>'è§','華'=>'è¯','菱'=>'è±','落'=>'è½','葉'=>'葉','著'=>'è‘—','著'=>'è‘—','蔿'=>'è’','蓮'=>'è“®','蓱'=>'蓱','蓳'=>'蓳','ï§‚'=>'蓼','蔖'=>'è”–','蕤'=>'蕤','藍'=>'è—','ï§°'=>'è—º','蘆'=>'蘆','蘒'=>'蘒','蘭'=>'蘭','è™'=>'蘷','ï¤'=>'蘿','⾌'=>'è™','虐'=>'è™','虜'=>'虜','虜'=>'虜','虧'=>'è™§','虩'=>'虩','â¾'=>'虫','蚈'=>'蚈','蚩'=>'èš©','蛢'=>'蛢','蜎'=>'蜎','蜨'=>'蜨','蝫'=>'è«','蝹'=>'è¹','蝹'=>'è¹','螆'=>'螆','螺'=>'螺','蟡'=>'蟡','ð¯§'=>'è ','蠟'=>'è Ÿ','⾎'=>'è¡€','行'=>'行','â¾'=>'行','衠'=>'è¡ ','衣'=>'è¡£','â¾'=>'è¡£','裂'=>'裂','ï§§'=>'è£','裗'=>'裗','裞'=>'裞','裡'=>'裡','裸'=>'裸','裺'=>'裺','ï© '=>'è¤','襁'=>'è¥','襤'=>'襤','⾑'=>'襾','覆'=>'覆','見'=>'見','â¾’'=>'見','ï©¡'=>'視','視'=>'視','⾓'=>'è§’','â¾”'=>'言','äš¶'=>'訞','詽'=>'訮','ð¯§'=>'誠','說'=>'說','說'=>'說','調'=>'調','請'=>'è«‹','諒'=>'è«’','ï¥'=>'è«–','諭'=>'è«­','ð¯§'=>'è«­','諸'=>'諸','諸'=>'諸','ï¥'=>'諾','諾'=>'諾','ï©¢'=>'è¬','謁'=>'è¬','ï©£'=>'謹','謹'=>'謹','ï§¼'=>'è­˜','讀'=>'讀','è®'=>'讆','ï«€'=>'變','變'=>'變','⾕'=>'è°·','â¾–'=>'豆','豈'=>'豈','豕'=>'豕','â¾—'=>'豕','⾘'=>'豸','â¾™'=>'è²','貫'=>'貫','賁'=>'è³','賂'=>'賂','賈'=>'賈','賓'=>'賓','ï©¥'=>'è´ˆ','ï«'=>'è´ˆ','贛'=>'è´›','⾚'=>'赤','â¾›'=>'èµ°','起'=>'èµ·','趆'=>'赿','⾜'=>'è¶³','趼'=>'è¶¼','跋'=>'è·‹','è·º'=>'è·¥','路'=>'è·¯','跰'=>'è·°','躛'=>'躗','â¾'=>'身','車'=>'車','⾞'=>'車','軔'=>'è»”','è¼§'=>'軿','輦'=>'輦','ï§—'=>'輪','ï«‚'=>'輸','輸'=>'輸','輻'=>'è¼»','ï¦'=>'è½¢','⾟'=>'è¾›','ð¯¦'=>'辞','辰'=>'è¾°','â¾ '=>'è¾°','⾡'=>'è¾µ','辶'=>'è¾¶','⻌'=>'è¾¶','連'=>'連','逸'=>'逸','ï©§'=>'逸','遲'=>'é²','遼'=>'é¼','邏'=>'é‚','â¾¢'=>'é‚‘','邔'=>'é‚”','郎'=>'郎','郱'=>'郱','都'=>'都','鄑'=>'é„‘','鄛'=>'é„›','â¾£'=>'é…‰','酪'=>'é…ª','ï«„'=>'醙','醴'=>'醴','⾤'=>'釆','ï§©'=>'里','â¾¥'=>'里','量'=>'é‡','金'=>'金','⾦'=>'金','鈴'=>'鈴','鈸'=>'鈸','ï«…'=>'鉶','鉼'=>'鉼','鋗'=>'é‹—','鋘'=>'鋘','錄'=>'錄','鍊'=>'éŠ','鎮'=>'鎭','鏹'=>'é¹','鐕'=>'é•','â¾§'=>'é•·','⾨'=>'é–€','開'=>'é–‹','閭'=>'é–­','閷'=>'é–·','⾩'=>'阜','阮'=>'阮','陋'=>'陋','降'=>'é™','陵'=>'陵','ï§“'=>'陸','陼'=>'陼','ï§œ'=>'隆','ï§±'=>'隣','⾪'=>'éš¶','隸'=>'隸','⾫'=>'éš¹','雃'=>'雃','離'=>'離','難'=>'難','難'=>'難','⾬'=>'雨','零'=>'é›¶','雷'=>'é›·','霣'=>'霣','露'=>'露','靈'=>'éˆ','â¾­'=>'é‘','靖'=>'é–','靖'=>'é–','â¾®'=>'éž','⾯'=>'é¢','â¾°'=>'é©','â¾±'=>'韋','韛'=>'韛','韠'=>'韠','â¾²'=>'韭','â¾³'=>'音','ï©©'=>'響','響'=>'響','â¾´'=>'é ','ï«‹'=>'é ‹','頋'=>'é ‹','頋'=>'é ‹','領'=>'é ˜','頩'=>'é ©','頻'=>'é »','頻'=>'é »','ï§'=>'類','â¾µ'=>'風','â¾¶'=>'飛','â»'=>'食','â¾·'=>'食','飢'=>'飢','飯'=>'飯','飼'=>'飼','館'=>'館','餩'=>'餩','⾸'=>'首','â¾¹'=>'香','馧'=>'馧','⾺'=>'馬','駂'=>'é§‚','駱'=>'é§±','駾'=>'é§¾','驪'=>'驪','â¾»'=>'骨','â¾¼'=>'高','â¾½'=>'髟','ï«'=>'鬒','鬒'=>'鬒','â¾¾'=>'鬥','⾿'=>'鬯','â¿€'=>'鬲','â¿'=>'鬼','â¿‚'=>'é­š','魯'=>'é­¯','鱀'=>'é±€','ï§²'=>'é±—','⿃'=>'é³¥','鳽'=>'é³½','ð¯¨'=>'éµ§','鶴'=>'é¶´','鷺'=>'é·º','鸞'=>'鸞','鹃'=>'鹂','â¿„'=>'é¹µ','鹿'=>'鹿','â¿…'=>'鹿','麗'=>'麗','ï§³'=>'麟','⿆'=>'麥','麻'=>'麻','⿇'=>'麻','⿈'=>'黃','⿉'=>'é»','黎'=>'黎','⿊'=>'黑','黹'=>'黹','â¿‹'=>'黹','⿌'=>'黽','黾'=>'黾','鼅'=>'é¼…','â¿'=>'鼎','鼏'=>'é¼','⿎'=>'鼓','鼖'=>'é¼–','â¿'=>'é¼ ','鼻'=>'é¼»','â¿'=>'é¼»','齃'=>'齃','â¿‘'=>'齊','â¿’'=>'é½’','ï§„'=>'é¾','â¿“'=>'é¾','ï«™'=>'龎','龜'=>'龜','龜'=>'龜','龜'=>'龜','â¿”'=>'龜','⻳'=>'龟','â¿•'=>'é¾ ','㒞'=>'ã’ž','㒹'=>'ã’¹','㒻'=>'ã’»','㓟'=>'㓟','㔕'=>'㔕','䎛'=>'ã–ˆ','㛮'=>'ã›®','㛼'=>'㛼','㞁'=>'ãž','㠯'=>'ã ¯','㡢'=>'ã¡¢','㡼'=>'㡼','㣇'=>'㣇','㣣'=>'㣣','㤜'=>'㤜','㤺'=>'㤺','㨮'=>'㨮','㩬'=>'㩬','㫤'=>'㫤','ð¯£'=>'㬈','㬙'=>'㬙','ä '=>'㬻','㭉'=>'ã­‰','ï«’'=>'ã®','㮝'=>'ã®','㰘'=>'ã°˜','㱎'=>'㱎','㴳'=>'ã´³','㶖'=>'ã¶–','㺬'=>'㺬','㺸'=>'㺸','㺸'=>'㺸','㼛'=>'ã¼›','㿼'=>'㿼','䀈'=>'䀈','ï«“'=>'䀘','ï«”'=>'䀹','䀹'=>'䀹','䁆'=>'ä†','䂖'=>'ä‚–','䃣'=>'䃣','䄯'=>'䄯','䈂'=>'䈂','䈧'=>'䈧','䊠'=>'䊠','䌁'=>'äŒ','䌴'=>'䌴','䍙'=>'ä™','ð¯¦'=>'ä•','䏙'=>'ä™','䐋'=>'ä‹','䑫'=>'ä‘«','䔫'=>'䔫','䕝'=>'ä•','䕡'=>'ä•¡','䕫'=>'ä•«','䗗'=>'ä——','䗹'=>'ä—¹','䘵'=>'䘵','ð¯§'=>'äš¾','䛇'=>'䛇','䦕'=>'䦕','䧦'=>'䧦','䩮'=>'ä©®','䩶'=>'ä©¶','䪲'=>'䪲','䬳'=>'䬳','䯎'=>'䯎','ð¯¨'=>'䳎','䳭'=>'ä³­','䳸'=>'䳸','䵖'=>'äµ–','𠄢'=>'ð „¢','𠔜'=>'𠔜','𠔥'=>'𠔥','𠕋'=>'ð •‹','ð¯ '=>'𠘺','𠠄'=>'ð  „','ð¯§'=>'𠣞','𠨬'=>'𠨬','𠭣'=>'ð ­£','𡓤'=>'𡓤','𡚨'=>'𡚨','𡛪'=>'𡛪','𡧈'=>'𡧈','𡬘'=>'𡬘','𡴋'=>'ð¡´‹','𡷤'=>'ð¡·¤','𡷦'=>'ð¡·¦','𢆃'=>'𢆃','𢆟'=>'𢆟','𢌱'=>'𢌱','𢌱'=>'𢌱','𢛔'=>'𢛔','ï«'=>'𢡄','ï«'=>'𢡊','𢬌'=>'𢬌','𢯱'=>'𢯱','𣀊'=>'𣀊','𣊸'=>'𣊸','𣍟'=>'ð£Ÿ','𣎓'=>'𣎓','𣎜'=>'𣎜','ð¯£'=>'ð£ƒ','ï«‘'=>'ð£•','𣑭'=>'𣑭','𣚣'=>'𣚣','𣢧'=>'𣢧','𣪍'=>'ð£ª','𣫺'=>'𣫺','𣲼'=>'𣲼','𣴞'=>'𣴞','ð¯¤'=>'𣻑','ð¯¤'=>'𣽞','𣾎'=>'𣾎','ð¯¤'=>'𤉣','𤎫'=>'𤎫','𤘈'=>'𤘈','𤜵'=>'𤜵','𤠔'=>'𤠔','𤰶'=>'𤰶','𤲒'=>'𤲒','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'ð¥„','𥃲'=>'𥃲','ð¯¥'=>'𥃳','𥄙'=>'𥄙','𥄳'=>'𥄳','ï«•'=>'𥉉','ð¯¥'=>'ð¥','𥘦'=>'𥘦','𥚚'=>'𥚚','𥛅'=>'𥛅','𥥼'=>'𥥼','ð¯¥'=>'𥪧','𥪧'=>'𥪧','𥮫'=>'𥮫','𥲀'=>'𥲀','ï«–'=>'ð¥³','𥾆'=>'𥾆','𦇚'=>'𦇚','𦈨'=>'𦈨','𦉇'=>'𦉇','𦋙'=>'𦋙','𦌾'=>'𦌾','𦓚'=>'𦓚','𦔣'=>'𦔣','𦖨'=>'𦖨','𦞧'=>'𦞧','𦞵'=>'𦞵','𦬼'=>'𦬼','𦰶'=>'𦰶','𦳕'=>'𦳕','𦵫'=>'𦵫','𦼬'=>'𦼬','𦾱'=>'𦾱','𧃒'=>'𧃒','𧏊'=>'ð§Š','𧙧'=>'ð§™§','𧢮'=>'ð§¢®','𧥦'=>'𧥦','𧲨'=>'𧲨','ï«—'=>'𧻓','𧼯'=>'𧼯','𨗒'=>'𨗒','𨗭'=>'𨗭','𨜮'=>'𨜮','𨯺'=>'𨯺','𨵷'=>'𨵷','𩅅'=>'ð©……','𩇟'=>'𩇟','𩈚'=>'𩈚','𩐊'=>'ð©Š','𩒖'=>'ð©’–','ð¯¨'=>'ð©–¶','𩬰'=>'𩬰','ð¯¨'=>'𪃎','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','ð¯¢'=>'𪎒','ð¯¨'=>'𪘀','℃'=>'°C','℉'=>'°F','ℇ'=>'Æ','â„»'=>'FAX','â„•'=>'N','â„–'=>'No','ℚ'=>'Q','₨'=>'Rs','ð“'=>'T','â„¡'=>'TEL','ð”'=>'U','ð–'=>'W','â‚©'=>'W̵','ð—'=>'X','Â¥'=>'Y̵','ðš²'=>'Λ','ðšµ'=>'Ξ','â„¿'=>'Π','ϲ'=>'c','Ï’'=>'Y','ðš½'=>'Φ','ðš¿'=>'Ψ','Ñ£'=>'Ь̵','ਃ'=>'ঃ','ಃ'=>'à°ƒ','່'=>'่','់'=>'่','້'=>'้','໊'=>'๊','໋'=>'๋','៕'=>'๚','៚'=>'๛','ÑŠ'=>'ˉb','៙'=>'à¹','à³§'=>'à±§','૨'=>'२','೨'=>'౨','à«©'=>'३','૪'=>'४','à«®'=>'८','೯'=>'౯','а'=>'a','á'=>'b','á–¯'=>'b','Ñ'=>'c','Ô'=>'d','ᑯ'=>'d','е'=>'e','Ó™'=>'Ç','ε'=>'É›','Ñ”'=>'É›','Ö„'=>'f','Ö'=>'g','Ò»'=>'h','Õ°'=>'h','á‚'=>'h','á²'=>'hÌ”','ι'=>'i','Ñ–'=>'i','Ꭵ'=>'i','ј'=>'j','Õµ'=>'j','á—°'=>'m','Õ¸'=>'n','η'=>'nÌ©','à°‚'=>'o','ಂ'=>'o','à´‚'=>'o','०'=>'o','੦'=>'o','૦'=>'o','à¹'=>'o','à»'=>'o','ο'=>'o','о'=>'o','Ö…'=>'o','á€'=>'o','Ï'=>'p','Ñ€'=>'p','á´©'=>'á´˜','Õ£'=>'q','κ'=>'ĸ','к'=>'ĸ','á´¦'=>'r','г'=>'r','Ñ•'=>'s','Ï…'=>'u','Õ½'=>'u','ν'=>'v','ѵ'=>'v','Ꮃ'=>'w','á—¯'=>'w','Ñ…'=>'x','á•'=>'x','у'=>'y','Ꭹ'=>'y','Ó¡'=>'Ê’','ჳ'=>'Ê’','Ï©'=>'ƨ','ÑŒ'=>'Æ…','Ñ‹'=>'Æ…i','É‘'=>'α','Õ®'=>'δ','á•·'=>'δ','п'=>'Ï€','ɸ'=>'φ','Ñ„'=>'φ','Ê™'=>'в','Éœ'=>'з','á´'=>'м','Êœ'=>'н','É¢'=>'Ô','á´›'=>'Ñ‚','á´™'=>'Ñ','ઽ'=>'ऽ','à«'=>'à¥','à«‚'=>'ू','à©‹'=>'ॆ','à©'=>'à¥','à«'=>'à¥','à´‰'=>'உ','à´œ'=>'à®','à´£'=>'ண','à´´'=>'à®´','à´¿'=>'ி','àµ'=>'ூ','ಅ'=>'à°…','ಆ'=>'à°†','ಇ'=>'à°‡','ಒ'=>'à°’','ಓ'=>'ఒౕ','ಜ'=>'à°œ','ಞ'=>'à°ž','ಣ'=>'à°£','à°¥'=>'à°§Ö¼','ಯ'=>'à°¯','à° '=>'à°°Ö¼','ಱ'=>'à°±','ಲ'=>'à°²','à¶Œ'=>'à´¨àµà´¨','à®¶'=>'à´¶','ຈ'=>'จ','ບ'=>'บ','ປ'=>'ป','àº'=>'à¸','ພ'=>'พ','ຟ'=>'ฟ','àº'=>'ย','។'=>'ฯ','áž·'=>'ิ','ី'=>'ี','áž¹'=>'ึ','ឺ'=>'ื','ຸ'=>'ุ','ູ'=>'ู','á—…'=>'A','á’'=>'J','ᕼ'=>'H','á¯'=>'V','á‘­'=>'P','á—·'=>'B','ヘ'=>'ã¸','ð‘'=>'ðŽ‚','ð“'=>'ðŽ“','𒀸'=>'ðŽš','á…³'=>'一','Ç€'=>'丨','á…µ'=>'丨','Ꭺ'=>'A','á´'=>'B','áŸ'=>'C','á—ž'=>'D','Ꭼ'=>'E','á–´'=>'F','á€'=>'G','Ꮋ'=>'H','Ꭻ'=>'J','á¦'=>'K','áž'=>'L','Ꮇ'=>'M','á¢'=>'P','á–‡'=>'R','á•'=>'S','á™'=>'V','áƒ'=>'Z'); \ No newline at end of file
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index fc5851804c..34f0aebb12 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -1,15 +1,16 @@
<?php
-/**
+/**
*
* @package install
* @version $Id$
-* @copyright (c) 2006 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @copyright (c) 2006 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
-$updates_to_version = '3.0.RC3';
+$updates_to_version = '3.0.RC4';
+// Return if we "just include it" to find out for which version the database update is responsuble for
if (defined('IN_PHPBB') && defined('IN_INSTALL'))
{
return;
@@ -20,7 +21,7 @@ if (defined('IN_PHPBB') && defined('IN_INSTALL'))
define('IN_PHPBB', true);
define('IN_INSTALL', true);
-$phpbb_root_path = './../';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
// Report all errors, except notices
@@ -84,6 +85,8 @@ $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false);
// We do not need this any longer, unset for safety purposes
unset($dbpasswd);
+$user->ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars($_SERVER['REMOTE_ADDR']) : '';
+
$sql = "SELECT config_value
FROM " . CONFIG_TABLE . "
WHERE config_name = 'default_lang'";
@@ -334,7 +337,7 @@ $database_update_info = array(
),
// Changes from 3.0.RC2 to the next version
'3.0.RC2' => array(
- // Remove the following keys
+ // Change the following columns
'change_columns' => array(
BANLIST_TABLE => array(
'ban_reason' => array('VCHAR_UNI', ''),
@@ -342,6 +345,48 @@ $database_update_info = array(
),
),
),
+ // Changes from 3.0.RC3 to the next version
+ '3.0.RC3' => array(
+ // Change the following columns
+ 'change_columns' => array(
+ BANLIST_TABLE => array(
+ 'ban_reason' => array('VCHAR_UNI', ''),
+ 'ban_give_reason' => array('VCHAR_UNI', ''),
+ ),
+ STYLES_TABLE => array(
+ 'style_id' => array('USINT', 0),
+ 'template_id' => array('USINT', 0),
+ 'theme_id' => array('USINT', 0),
+ 'imageset_id' => array('USINT', 0),
+ ),
+ STYLES_TEMPLATE_TABLE => array(
+ 'template_id' => array('USINT', 0),
+ ),
+ STYLES_TEMPLATE_DATA_TABLE => array(
+ 'template_id' => array('USINT', 0),
+ ),
+ STYLES_THEME_TABLE => array(
+ 'theme_id' => array('USINT', 0),
+ ),
+ STYLES_IMAGESET_TABLE => array(
+ 'imageset_id' => array('USINT', 0),
+ ),
+ STYLES_IMAGESET_DATA_TABLE => array(
+ 'imageset_id' => array('USINT', 0),
+ ),
+ USERS_TABLE => array(
+ 'user_style' => array('USINT', 0),
+ ),
+ FORUMS_TABLE => array(
+ 'forum_style' => array('USINT', 0),
+ ),
+ GROUPS_TABLE => array(
+ 'group_avatar_type' => array('TINT:2', 0),
+ 'group_avatar_width' => array('USINT', 0),
+ 'group_avatar_height' => array('USINT', 0),
+ ),
+ ),
+ ),
);
// Determine mapping database type
@@ -427,7 +472,6 @@ while ($row = $db->sql_fetchrow($result))
}
$db->sql_freeresult($result);
-
echo $lang['PREVIOUS_VERSION'] . ' :: <strong>' . $config['version'] . '</strong><br />';
echo $lang['UPDATED_VERSION'] . ' :: <strong>' . $updates_to_version . '</strong>';
@@ -449,6 +493,450 @@ else
$db->sql_query('DELETE FROM ' . CONFIG_TABLE . " WHERE config_name = 'version_update_from'");
}
+// Checks/Operations that have to be completed prior to starting the update itself
+$exit = false;
+if (version_compare($current_version, '3.0.RC3', '<='))
+{
+ // Define missing language entries...
+ if (!isset($lang['CLEANING_USERNAMES']))
+ {
+ $lang = array_merge($lang, array(
+ 'CLEANING_USERNAMES' => 'Cleaning usernames',
+ 'LONG_SCRIPT_EXECUTION' => 'Please note that this can take a while... Please do not stop the script.',
+ 'CHANGE_CLEAN_NAMES' => 'The method used to make sure a username is not used by multiple users has been changed. There are some users which have the same name when compared with the new method. You have to delete or rename these users to make sure that each name is only used by one user before you can proceed.',
+ 'USER_ACTIVE' => 'Active user',
+ 'USER_INACTIVE' => 'Inactive user',
+ 'BOT' => 'Spider/Robot',
+ 'UPDATE_REQUIRES_FILE' => 'The updater requires that the following file is present: %s',
+
+ 'DELETE_USER_REMOVE' => 'Delete user and remove posts',
+ 'DELETE_USER_RETAIN' => 'Delete user but keep posts',
+ 'EDIT_USERNAME' => 'Edit username',
+ 'KEEP_OLD_NAME' => 'Keep username',
+ 'NEW_USERNAME' => 'New username',
+ ));
+ }
+?>
+ </p><br /><br />
+
+ <h1><?php echo $lang['CLEANING_USERNAMES']; ?></h1>
+
+ <br />
+
+<?php
+ flush();
+
+ $submit = (isset($_POST['resolve_conflicts'])) ? true : false;
+ $modify_users = request_var('modify_users', array(0 => ''));
+ $new_usernames = request_var('new_usernames', array(0 => ''), true);
+
+ // the admin decided to change some usernames
+ if (sizeof($modify_users) && $submit)
+ {
+ $sql = 'SELECT user_id, username, user_type
+ FROM ' . USERS_TABLE . '
+ WHERE ' . $db->sql_in_set('user_id', array_keys($modify_users));
+ $result = $db->sql_query($sql);
+
+ $users = 0;
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $users++;
+ $user_id = (int) $row['user_id'];
+
+ if (isset($modify_users[$user_id]))
+ {
+ $row['action'] = $modify_users[$user_id];
+ $modify_users[$user_id] = $row;
+ }
+ }
+ $db->sql_freeresult($result);
+
+ // only if all ids really existed
+ if (sizeof($modify_users) == $users)
+ {
+ $user->data['user_id'] = ANONYMOUS;
+ include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+ foreach ($modify_users as $user_id => $row)
+ {
+ switch ($row['action'])
+ {
+ case 'edit':
+ if (isset($new_usernames[$user_id]))
+ {
+ $data = array('username' => utf8_normalize_nfc($new_usernames[$user_id]));
+ // Need to update config, forum, topic, posting, messages, etc.
+ if ($data['username'] != $row['username'])
+ {
+ $check_ary = array('username' => array(
+ array('string', false, $config['min_name_chars'], $config['max_name_chars']),
+ array('username'),
+ ));
+ // need a little trick for this to work properly
+ $user->data['username_clean'] = utf8_clean_string($data['username']) . 'a';
+ $errors = validate_data($data, $check_ary);
+
+ if ($errors)
+ {
+ include($phpbb_root_path . 'language/' . $language . '/ucp.' . $phpEx);
+ echo '<div class="errorbox">';
+ foreach ($errors as $error)
+ {
+ echo '<p>' . $lang[$error] . '</p>';
+ }
+ echo '</div>';
+ }
+
+ if (!$errors)
+ {
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', array(
+ 'username' => $data['username'],
+ 'username_clean' => utf8_clean_string($data['username'])
+ )) . '
+ WHERE user_id = ' . $user_id;
+ $db->sql_query($sql);
+
+ add_log('user', $user_id, 'LOG_USER_UPDATE_NAME', $row['username'], $data['username']);
+ user_update_name($row['username'], $data['username']);
+ }
+ }
+ }
+ break;
+
+ case 'delete_retain':
+ case 'delete_remove':
+ if ($user_id != ANONYMOUS && $row['user_type'] != USER_FOUNDER)
+ {
+ user_delete(substr($row['action'], 7), $user_id, $row['username']);
+ add_log('admin', 'LOG_USER_DELETED', $row['username']);
+ }
+ break;
+ }
+ }
+ }
+ }
+?>
+
+ <p><?php echo $lang['LONG_SCRIPT_EXECUTION']; ?></p>
+ <p><?php echo $lang['PROGRESS']; ?> :: <strong>
+
+<?php
+ flush();
+
+ // after RC3 a different utf8_clean_string function is used, this requires that
+ // the unique column username_clean is recalculated, during this recalculation
+ // duplicates might be created. Since the column has to be unique such usernames
+ // must not exist. We need identify them and let the admin decide what to do
+ // about them.
+ $sql = 'SELECT user_id, username, username_clean
+ FROM ' . USERS_TABLE . '
+ ORDER BY user_id ASC';
+ $result = $db->sql_query($sql);
+
+ $colliding_users = $found_names = array();
+ $echos = 0;
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ // Calculate the new clean name. If it differs from the old one we need
+ // to make sure there is no collision
+ $clean_name = utf8_new_clean_string($row['username']);
+
+ if ($clean_name != $row['username_clean'])
+ {
+ // Check if there would be a collission, if not put it up for changing
+ $user_id = (int) $row['user_id'];
+
+ // If this clean name was not the result of another user already ...
+ if (!isset($found_names[$clean_name]))
+ {
+ // then we need to figure out whether there are any other users
+ // who already had this clean name with the old version
+ $sql = 'SELECT user_id, username
+ FROM ' . USERS_TABLE . '
+ WHERE username_clean = \'' . $db->sql_escape($clean_name) . '\'';
+ $result2 = $db->sql_query($sql);
+
+ $user_ids = array($user_id);
+ while ($row = $db->sql_fetchrow($result2))
+ {
+ // For not trimmed entries this could happen, yes. ;)
+ if ($row['user_id'] == $user_id)
+ {
+ continue;
+ }
+
+ // Make sure this clean name will still be the same with the
+ // new function. If it is, then we have to add it to the list
+ // of user ids for this clean name
+ if (utf8_new_clean_string($row['username']) == $clean_name)
+ {
+ $user_ids[] = (int) $row['user_id'];
+ }
+ }
+ $db->sql_freeresult($result2);
+
+ // if we already found a collision save it
+ if (sizeof($user_ids) > 1)
+ {
+ $colliding_users[$clean_name] = $user_ids;
+ $found_names[$clean_name] = true;
+ }
+ else
+ {
+ // otherwise just mark this name as found
+ $found_names[$clean_name] = $user_id;
+ }
+ }
+ // Else, if we already found the username
+ else
+ {
+ // If the value in the found_names lookup table is only true ...
+ if ($found_names[$clean_name] === true)
+ {
+ // then the actual data was already added to $colliding_users
+ // and we only need to append the user_id
+ $colliding_users[$clean_name][] = $user_id;
+ }
+ else
+ {
+ // otherwise it still keeps the first user_id for this name
+ // and we need to move the data to $colliding_users, and set
+ // the value in the found_names lookup table to true, so
+ // following users will directly be appended to $colliding_users
+ $colliding_users[$clean_name] = array($found_names[$clean_name], $user_id);
+ $found_names[$clean_name] = true;
+ }
+ }
+ }
+
+ if (($echos % 1000) == 0)
+ {
+ echo '.';
+ flush();
+ }
+ $echos++;
+ }
+ $db->sql_freeresult($result);
+
+ // now retrieve all information about the users and let the admin decide what to do
+ if (sizeof($colliding_users))
+ {
+ $exit = true;
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ include($phpbb_root_path . 'language/' . $language . '/memberlist.' . $phpEx);
+ include($phpbb_root_path . 'language/' . $language . '/acp/users.' . $phpEx);
+
+ // link a few things to the correct place so we don't get any problems
+ $user->lang = &$lang;
+ $user->data['user_id'] = ANONYMOUS;
+ $user->date_format = $config['default_dateformat'];
+
+ // a little trick to get all user_ids
+ $user_ids = call_user_func_array('array_merge', array_values($colliding_users));
+
+ $sql = 'SELECT session_user_id, MAX(session_time) AS session_time
+ FROM ' . SESSIONS_TABLE . '
+ WHERE session_time >= ' . (time() - $config['session_length']) . '
+ AND ' . $db->sql_in_set('session_user_id', $user_ids) . '
+ GROUP BY session_user_id';
+ $result = $db->sql_query($sql);
+
+ $session_times = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $session_times[$row['session_user_id']] = $row['session_time'];
+ }
+ $db->sql_freeresult($result);
+
+ $sql = 'SELECT *
+ FROM ' . USERS_TABLE . '
+ WHERE ' . $db->sql_in_set('user_id', $user_ids);
+ $result = $db->sql_query($sql);
+
+ $users = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if (isset($session_times[$row['user_id']]))
+ {
+ $row['session_time'] = $session_times[$row['user_id']];
+ }
+ else
+ {
+ $row['session_time'] = 0;
+ }
+ $users[(int) $row['user_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+ unset($session_times);
+
+ // now display a table with all users, some information about them and options
+ // for the admin: keep name, change name (with text input) or delete user
+ $u_action = "database_update.$phpEx?language=$language&amp;type=$inline_update";
+?>
+</strong></p><br /><br />
+
+<p><?php echo $lang['CHANGE_CLEAN_NAMES']; ?></p>
+<form id="change_clean_names" method="post" action="<?php echo $u_action; ?>">
+
+
+<?php
+ foreach ($colliding_users as $clean_name => $user_ids)
+ {
+?>
+ <fieldset class="tabulated">
+ <table>
+ <caption><?php echo sprintf($lang['COLLIDING_CLEAN_USERNAME'], $clean_name); ?></caption>
+ <thead>
+ <tr>
+ <th><?php echo $lang['RANK']; ?> <?php echo $lang['USERNAME']; ?></th>
+ <th><?php echo $lang['POSTS']; ?></th>
+ <th><?php echo $lang['INFORMATION']; ?></th>
+ <th><?php echo $lang['JOINED']; ?></th>
+ <th><?php echo $lang['LAST_ACTIVE']; ?></th>
+ <th><?php echo $lang['ACTION']; ?></th>
+ <th><?php echo $lang['NEW_USERNAME']; ?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ foreach ($user_ids as $i => $user_id)
+ {
+ $row = $users[$user_id];
+
+ $rank_title = $rank_img = '';
+ get_user_rank($row['user_rank'], $row['user_posts'], $rank_title, $rank_img, $rank_img_src);
+
+ $last_visit = (!empty($row['session_time'])) ? $row['session_time'] : $row['user_lastvisit'];
+
+ $info = '';
+ switch ($row['user_type'])
+ {
+ case USER_INACTIVE:
+ $info .= $lang['USER_INACTIVE'];
+ break;
+
+ case USER_IGNORE:
+ $info .= $lang['BOT'];
+ break;
+
+ case USER_FOUNDER:
+ $info .= $lang['FOUNDER'];
+ break;
+
+ default:
+ $info .= $lang['USER_ACTIVE'];
+ }
+
+ if ($user_id == ANONYMOUS)
+ {
+ $info = $lang['GUEST'];
+ }
+?>
+ <tr class="bg<?php echo ($i % 2) + 1; ?>">
+ <td>
+ <span class="rank-img"><?php echo ($rank_img) ? $rank_img : $rank_title; ?></span><br />
+ <?php echo get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']); ?>
+ </td>
+ <td class="posts"><?php echo $row['user_posts']; ?></td>
+ <td class="info"><?php echo $info; ?></td>
+ <td><?php echo $user->format_date($row['user_regdate']) ?></td>
+ <td><?php echo (empty($last_visit)) ? ' - ' : $user->format_date($last_visit); ?>&nbsp;</td>
+ <td>
+ <label><input type="radio" class="radio" id="keep_user_<?php echo $user_id; ?>" name="modify_users[<?php echo $user_id; ?>]" value="keep" checked="checked" /> <?php echo $lang['KEEP_OLD_NAME']; ?></label><br />
+ <label><input type="radio" class="radio" id="edit_user_<?php echo $user_id; ?>" name="modify_users[<?php echo $user_id; ?>]" value="edit" /> <?php echo $lang['EDIT_USERNAME']; ?></label><br />
+<?php
+ // some users must not be deleted
+ if ($user_id != ANONYMOUS && $row['user_type'] != USER_FOUNDER)
+ {
+?>
+ <label><input type="radio" class="radio" id="delete_user_retain_<?php echo $user_id; ?>" name="modify_users[<?php echo $user_id; ?>]" value="delete_retain" /> <?php echo $lang['DELETE_USER_RETAIN']; ?></label><br />
+ <label><input type="radio" class="radio" id="delete_user_remove_<?php echo $user_id; ?>" name="modify_users[<?php echo $user_id; ?>]" value="delete_remove" /> <?php echo $lang['DELETE_USER_REMOVE']; ?></label>
+<?php
+ }
+?>
+ </td>
+ <td>
+ <input id="new_username_<?php echo $user_id; ?>" type="text" name="new_usernames[<?php echo $user_id; ?>]" value="<?php echo $row['username']; ?>" />
+ </td>
+ </tr>
+<?php
+ }
+?>
+ </tbody>
+ </table>
+ </fieldset>
+<?php
+ }
+?>
+ <p class="quick">
+ <input class="button2" id="resolve_conflicts" type="submit" name="resolve_conflicts" value="<?php echo $lang['SUBMIT']; ?>" />
+ </p>
+ </form>
+<?php
+ }
+ else if (sizeof($found_names))
+ {
+ $sql = 'SELECT user_id, username, username_clean
+ FROM ' . USERS_TABLE . '
+ WHERE ' . $db->sql_in_set('user_id', array_values($found_names));
+ $result = $db->sql_query($sql);
+
+ $found_names = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $clean_name = utf8_new_clean_string($row['username']);
+
+ if ($clean_name != $row['username_clean'])
+ {
+ $user_id = (int) $row['user_id'];
+ $found_names[$user_id] = $clean_name;
+
+ // impossible unique clean name
+ $sql = 'UPDATE ' . USERS_TABLE . "
+ SET username_clean = ' {$user_id}'
+ WHERE user_id = {$user_id}";
+ $db->sql_query($sql);
+ }
+ }
+ $db->sql_freeresult($result);
+
+ foreach ($found_names as $user_id => $clean_name)
+ {
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET username_clean = \'' . $db->sql_escape($clean_name) . '\'
+ WHERE user_id = ' . $user_id;
+ $db->sql_query($sql);
+ }
+ }
+ unset($found_names);
+ unset($colliding_users);
+}
+
+if ($exit)
+{
+?>
+
+ </div>
+ </div>
+ <span class="corners-bottom"><span></span></span>
+ </div>
+ </div>
+ </div>
+
+ <div id="page-footer">
+ Powered by phpBB &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
+ </div>
+</div>
+
+</body>
+</html>
+
+<?php
+ exit;
+}
+
// Schema updates
?>
</p><br /><br />
@@ -651,13 +1139,15 @@ if (version_compare($current_version, '3.0.RC2', '<='))
{
continue;
}
+
$new_code = str_replace('&amp;', '&', $code);
$new_code = str_replace('&lt;', '<', $new_code);
$new_code = str_replace('&gt;', '>', $new_code);
$new_code = utf8_htmlspecialchars($new_code);
+
$sql = 'UPDATE ' . SMILIES_TABLE . '
SET code = \'' . $db->sql_escape($new_code) . '\'
- WHERE smiley_id = ' . (int)$id;
+ WHERE smiley_id = ' . (int) $id;
$db->sql_query($sql);
}
@@ -672,6 +1162,97 @@ if (version_compare($current_version, '3.0.RC2', '<='))
$no_updates = false;
}
+if (version_compare($current_version, '3.0.RC3', '<='))
+{
+ if ($map_dbms === 'postgres')
+ {
+ $sql = "SELECT SETVAL('" . FORUMS_TABLE . "_seq',(select case when max(forum_id)>0 then max(forum_id)+1 else 1 end from " . FORUMS_TABLE . '));';
+ _sql($sql, $errored, $error_ary);
+ }
+
+ // we check for:
+ // ath_opt_id
+ // ath_op_id
+ // ACL_ROLES_DATA_TABLE_ath_opt_id
+ // we want ACL_ROLES_DATA_TABLE_ath_op_id
+
+ $table_index_fix = array(
+ ACL_ROLES_DATA_TABLE => array(
+ 'ath_opt_id' => 'ath_op_id',
+ 'ath_op_id' => 'ath_op_id',
+ ACL_ROLES_DATA_TABLE . '_ath_opt_id' => 'ath_op_id'
+ ),
+ STYLES_IMAGESET_DATA_TABLE => array(
+ 'i_id' => 'i_d',
+ 'i_d' => 'i_d',
+ STYLES_IMAGESET_DATA_TABLE . '_i_id' => 'i_d'
+ )
+ );
+
+ // we need to create some indicies...
+ $needed_creation = array();
+
+ foreach ($table_index_fix as $table_name => $index_info)
+ {
+ $index_list = sql_list_fake($map_dbms, $table_name);
+ foreach ($index_info as $bad_index => $good_index)
+ {
+ if (in_array($bad_index, $index_list))
+ {
+ // mysql is actually OK, it won't get a hand in this crud
+ switch ($map_dbms)
+ {
+ // last version, mssql had issues with index removal
+ case 'mssql':
+ $sql = 'DROP INDEX ' . $table_name . '.' . $bad_index;
+ _sql($sql, $errored, $error_ary);
+ break;
+
+ // last version, firebird, oracle, postgresql and sqlite all got bad index names
+ // we got kinda lucky, tho: they all support the same syntax
+ case 'firebird':
+ case 'oracle':
+ case 'postgres':
+ case 'sqlite':
+ $sql = 'DROP INDEX ' . $bad_index;
+ _sql($sql, $errored, $error_ary);
+ break;
+ }
+
+ // If the good index already exist we do not need to create it again...
+ if (($map_dbms == 'mysql_40' || $map_dbms == 'mysql_41') && $bad_index == $good_index)
+ {
+ }
+ else
+ {
+ $needed_creation[$table_name][$good_index] = 1;
+ }
+ }
+ }
+ }
+
+ $new_index_defs = array('ath_op_id' => array('auth_option_id'), 'i_d' => array('imageset_id'));
+
+ foreach ($needed_creation as $bad_table => $index_repair_list)
+ {
+ foreach ($index_repair_list as $new_index => $garbage)
+ {
+ sql_create_index($map_dbms, $new_index, $bad_table, $new_index_defs[$new_index]);
+ $no_updates = false;
+ }
+ }
+
+ // Make sure empty smiley codes do not exist
+ $sql = 'DELETE FROM ' . SMILIES_TABLE . "
+ WHERE code = ''";
+ _sql($sql, $errored, $error_ary);
+
+ set_config('allow_birthdays', '1');
+ set_config('cron_lock', '0', true);
+
+ $no_updates = false;
+}
+
_write_result($no_updates, $errored, $error_ary);
$error_ary = array();
@@ -750,13 +1331,13 @@ else
}
// Add database update to log
-
-$user->ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars($_SERVER['REMOTE_ADDR']) : '';
add_log('admin', 'LOG_UPDATE_DATABASE', $orig_version, $updates_to_version);
// Now we purge the session table as well as all cache files
$cache->purge();
+exit;
+
?>
</div>
@@ -848,18 +1429,142 @@ function column_exists($dbms, $table, $column_name)
{
global $db;
- $db->sql_return_on_error(true);
+ switch ($dbms)
+ {
+ case 'mysql_40':
+ case 'mysql_41':
+ $sql = "SHOW COLUMNS
+ FROM $table";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ // lower case just in case
+ if (strtolower($row['Field']) == $column_name)
+ {
+ $db->sql_freeresult($result);
+ return true;
+ }
+ }
+ $db->sql_freeresult($result);
+ return false;
+ break;
- $sql = "SELECT $column_name FROM $table";
- $result = $db->sql_query_limit($sql, 1);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
+ // PostgreSQL has a way of doing this in a much simpler way but would
+ // not allow us to support all versions of PostgreSQL
+ case 'postgres':
+ $sql = "SELECT a.attname
+ FROM pg_class c, pg_attribute a
+ WHERE c.relname = '{$table}'
+ AND a.attnum > 0
+ AND a.attrelid = c.oid";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ // lower case just in case
+ if (strtolower($row['attname']) == $column_name)
+ {
+ $db->sql_freeresult($result);
+ return true;
+ }
+ }
+ $db->sql_freeresult($result);
+ return false;
+ break;
- $error = ($db->sql_error_triggered) ? true : false;
+ // same deal with PostgreSQL, we must perform more complex operations than
+ // we technically could
+ case 'mssql':
+ $sql = "SELECT c.name
+ FROM syscolumns c
+ LEFT JOIN sysobjects o (ON c.id = o.id)
+ WHERE o.name = '{$table}'";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ // lower case just in case
+ if (strtolower($row['name']) == $column_name)
+ {
+ $db->sql_freeresult($result);
+ return true;
+ }
+ }
+ $db->sql_freeresult($result);
+ return false;
+ break;
- $db->sql_return_on_error(false);
+ case 'oracle':
+ $sql = "SELECT column_name
+ FROM user_tab_columns
+ WHERE table_name = '{$table}'";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ // lower case just in case
+ if (strtolower($row['column_name']) == $column_name)
+ {
+ $db->sql_freeresult($result);
+ return true;
+ }
+ }
+ $db->sql_freeresult($result);
+ return false;
+ break;
- return (!$error) ? true : false;
+ case 'firebird':
+ $sql = "SELECT RDB\$FIELD_NAME as FNAME
+ FROM RDB\$RELATION_FIELDS
+ WHERE RDB\$RELATION_NAME = '{$table}'";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ // lower case just in case
+ if (strtolower($row['fname']) == $column_name)
+ {
+ $db->sql_freeresult($result);
+ return true;
+ }
+ }
+ $db->sql_freeresult($result);
+ return false;
+ break;
+
+ // ugh, SQLite
+ case 'sqlite':
+ $sql = "SELECT sql
+ FROM sqlite_master
+ WHERE type = 'table'
+ AND name = '{$table}'";
+ $result = $db->sql_query($sql);
+
+ if (!$result)
+ {
+ return false;
+ }
+
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ preg_match('#\((.*)\)#s', $row['sql'], $matches);
+
+ $cols = trim($matches[1]);
+ $col_array = preg_split('/,(?![\s\w]+\))/m', $cols);
+
+ foreach ($col_array as $declaration)
+ {
+ $entities = preg_split('#\s+#', trim($declaration));
+ if ($entities[0] == 'PRIMARY')
+ {
+ continue;
+ }
+
+ if (strtolower($entities[0]) == $column_name)
+ {
+ return true;
+ }
+ }
+ return false;
+ break;
+ }
}
/**
@@ -926,6 +1631,8 @@ function prepare_column_data($dbms, $column_data)
$sql = '';
+ $return_array = array();
+
switch ($dbms)
{
case 'firebird':
@@ -949,7 +1656,8 @@ function prepare_column_data($dbms, $column_data)
case 'mssql':
$sql .= " {$column_type} ";
- if (!is_null($column_data[1]))
+ // we do not support MSSQL DEFAULTs for the near future
+ /*if (!is_null($column_data[1]))
{
// For hexadecimal values do not use single quotes
if (strpos($column_data[1], '0x') === 0)
@@ -960,7 +1668,7 @@ function prepare_column_data($dbms, $column_data)
{
$sql .= 'DEFAULT (' . ((is_numeric($column_data[1])) ? $column_data[1] : "'{$column_data[1]}'") . ') ';
}
- }
+ }*/
$sql .= 'NOT NULL';
break;
@@ -1000,14 +1708,23 @@ function prepare_column_data($dbms, $column_data)
break;
case 'postgres':
+ $return_array['column_type'] = $column_type;
+ $return_array['null'] = 'NOT NULL';
+
+ if (!is_null($column_data[1]))
+ {
+ $return_array['default'] = $column_data[1];
+ }
+
$sql .= " {$column_type} ";
+ $sql .= 'NOT NULL ';
$sql .= (!is_null($column_data[1])) ? "DEFAULT '{$column_data[1]}' " : '';
- $sql .= 'NOT NULL';
// Unsigned? Then add a CHECK contraint
if (in_array($orig_column_type, $unsigned_types))
{
+ $return_array['constraint'] = "CHECK ({$column_name} >= 0)";
$sql .= " CHECK ({$column_name} >= 0)";
}
break;
@@ -1029,9 +1746,9 @@ function prepare_column_data($dbms, $column_data)
break;
}
- return array(
- 'column_type_sql' => $sql,
- );
+ $return_array['column_type_sql'] = $sql;
+
+ return $return_array;
}
/**
@@ -1238,7 +1955,7 @@ function sql_index_drop($dbms, $index_name, $table_name)
switch ($dbms)
{
case 'mssql':
- $sql = 'DROP INDEX ' . $table_name . '\.' . $index_name . ' ON ' . $table_name;
+ $sql = 'DROP INDEX ' . $table_name . '.' . $index_name;
_sql($sql, $errored, $error_ary);
break;
@@ -1350,10 +2067,14 @@ function sql_create_unique_index($dbms, $index_name, $table_name, $column)
{
case 'firebird':
case 'postgres':
- case 'mysql_40':
- case 'mysql_41':
case 'oracle':
case 'sqlite':
+ $sql = 'CREATE UNIQUE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
+ _sql($sql, $errored, $error_ary);
+ break;
+
+ case 'mysql_40':
+ case 'mysql_41':
$sql = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
_sql($sql, $errored, $error_ary);
break;
@@ -1374,10 +2095,14 @@ function sql_create_index($dbms, $index_name, $table_name, $column)
{
case 'firebird':
case 'postgres':
- case 'mysql_40':
- case 'mysql_41':
case 'oracle':
case 'sqlite':
+ $sql = 'CREATE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
+ _sql($sql, $errored, $error_ary);
+ break;
+
+ case 'mysql_40':
+ case 'mysql_41':
$sql = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
_sql($sql, $errored, $error_ary);
break;
@@ -1418,11 +2143,11 @@ function sql_list_index($dbms, $table_name)
switch ($dbms)
{
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";
+ $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;
@@ -1440,8 +2165,7 @@ function sql_list_index($dbms, $table_name)
case 'mysql_40':
case 'mysql_41':
$sql = 'SHOW KEYS
- FROM ' . $table_name .'
- WHERE Non_unique = 1';
+ FROM ' . $table_name;
$col = 'Key_name';
break;
@@ -1461,6 +2185,105 @@ function sql_list_index($dbms, $table_name)
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
+ if (($dbms == 'mysql_40' || $dbms == 'mysql_41') && !$row['Non_unique'])
+ {
+ continue;
+ }
+
+ switch ($dbms)
+ {
+ case 'firebird':
+ case 'oracle':
+ case 'postgres':
+ case 'sqlite':
+ $row[$col] = substr($row[$col], strlen($table_name) + 1);
+ break;
+ }
+
+ $index_array[] = $row[$col];
+ }
+ $db->sql_freeresult($result);
+ }
+
+ return array_map('strtolower', $index_array);
+}
+
+// This is totally fake, never use it
+// it exists only to mend bad update functions introduced
+// * UNIQUE indices
+// * PRIMARY keys
+function sql_list_fake($dbms, $table_name)
+{
+ global $dbms_type_map, $db;
+ global $errored, $error_ary;
+
+ $index_array = array();
+
+ if ($dbms == 'mssql')
+ {
+ $sql = "EXEC sp_statistics '$table_name'";
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if ($row['TYPE'] == 3)
+ {
+ $index_array[] = $row['INDEX_NAME'];
+ }
+ }
+ $db->sql_freeresult($result);
+ }
+ else
+ {
+ switch ($dbms)
+ {
+ 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
+ WHERE (bc.oid = i.indrelid)
+ AND (ic.oid = i.indexrelid)
+ AND (bc.relname = '" . $table_name . "')
+ AND (i.indisunique != 't')
+ AND (i.indisprimary != 't')";
+ $col = 'index_name';
+ break;
+
+ case 'mysql_40':
+ case 'mysql_41':
+ $sql = 'SHOW KEYS
+ FROM ' . $table_name;
+ $col = 'Key_name';
+ break;
+
+ case 'oracle':
+ $sql = "SELECT index_name
+ FROM user_indexes
+ WHERE table_name = '" . $table_name . "'
+ AND generated = 'N'";
+ break;
+
+ case 'sqlite':
+ $sql = "PRAGMA index_info('" . $table_name . "');";
+ $col = 'name';
+ break;
+ }
+
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if (($dbms == 'mysql_40' || $dbms == 'mysql_41') && !$row['Non_unique'])
+ {
+ continue;
+ }
+
$index_array[] = $row[$col];
}
$db->sql_freeresult($result);
@@ -1504,16 +2327,62 @@ function sql_column_change($dbms, $table_name, $column_name, $column_data)
break;
case 'postgres':
- $default_pos = strpos($column_data['column_type_sql'], ' DEFAULT');
+ $sql = 'ALTER TABLE ' . $table_name . ' ';
+
+ $sql_array = array();
+ $sql_array[] = 'ALTER COLUMN ' . $column_name . ' TYPE ' . $column_data['column_type'];
- if ($default_pos === false)
+ if ($column_data['null'] == 'NOT NULL')
{
- $sql = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' TYPE ' . $column_data['column_type_sql'];
+ $sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET NOT NULL';
}
else
{
- $sql = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' TYPE ' . substr($column_data['column_type_sql'], 0, $default_pos) . ', ALTER COLUMN ' . $column_name . ' SET ' . substr($column_data['column_type_sql'], $default_pos + 1);
+ $sql_array[] = 'ALTER COLUMN ' . $column_name . ' DROP NOT NULL';
+ }
+
+ if (isset($column_data['default']))
+ {
+ $sql_array[] = 'ALTER COLUMN ' . $column_name . " SET DEFAULT '" . $column_data['default'] . "'";
}
+
+ // we don't want to double up on constraints if we change different number data types
+ if (isset($column_data['constraint']))
+ {
+ $constraint_sql = "SELECT consrc as constraint_data
+ FROM pg_constraint, pg_class bc
+ WHERE conrelid = bc.oid
+ AND bc.relname = '{$table_name}'
+ AND NOT EXISTS (
+ SELECT *
+ FROM pg_constraint as c, pg_inherits as i
+ WHERE i.inhrelid = pg_constraint.conrelid
+ AND c.conname = pg_constraint.conname
+ AND c.consrc = pg_constraint.consrc
+ AND c.conrelid = i.inhparent
+ )";
+
+ $constraint_exists = false;
+
+ $result = $db->sql_query($constraint_sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ if (trim($row['constraint_data']) == trim($column_data['constraint']))
+ {
+ $constraint_exists = true;
+ break;
+ }
+ }
+ $db->sql_freeresult($result);
+
+ if (!$constraint_exists)
+ {
+ $sql_array[] = "ADD '" . $column_data['constraint'] . "'";
+ }
+ }
+
+ $sql .= implode(', ', $sql_array);
+
_sql($sql, $errored, $error_ary);
break;
@@ -1570,4 +2439,38 @@ function sql_column_change($dbms, $table_name, $column_name, $column_data)
}
}
+function utf8_new_clean_string($text)
+{
+ static $homographs = array();
+ static $utf8_case_fold_nfkc = '';
+ if (empty($homographs))
+ {
+ global $phpbb_root_path, $phpEx;
+ if (!function_exists('utf8_case_fold_nfkc') || !file_exists($phpbb_root_path . 'includes/utf/data/confusables.' . $phpEx))
+ {
+ if (!file_exists($phpbb_root_path . 'install/data/confusables.' . $phpEx))
+ {
+ global $lang;
+ trigger_error(sprintf($lang['UPDATE_REQUIRES_FILE'], $phpbb_root_path . 'install/data/confusables.' . $phpEx), E_USER_ERROR);
+ }
+ $homographs = include($phpbb_root_path . 'install/data/confusables.' . $phpEx);
+ $utf8_case_fold_nfkc = 'utf8_new_case_fold_nfkc';
+ }
+ else
+ {
+ $homographs = include($phpbb_root_path . 'includes/utf/data/confusables.' . $phpEx);
+ $utf8_case_fold_nfkc = 'utf8_case_fold_nfkc';
+ }
+ }
+
+ $text = $utf8_case_fold_nfkc($text);
+ $text = strtr($text, $homographs);
+ // Other control characters
+ $text = preg_replace('#(?:[\x00-\x1F\x7F]+|(?:\xC2[\x80-\x9F])+)#', '', $text);
+
+ // we can use trim here as all the other space characters should have been turned
+ // into normal ASCII spaces by now
+ return trim($text);
+}
+
?> \ No newline at end of file
diff --git a/phpBB/install/index.php b/phpBB/install/index.php
index 101ea8e0c6..7b0f120577 100755
--- a/phpBB/install/index.php
+++ b/phpBB/install/index.php
@@ -15,7 +15,7 @@ define('IN_PHPBB', true);
define('IN_INSTALL', true);
/**#@-*/
-$phpbb_root_path = './../';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
// Report all errors, except notices
@@ -105,14 +105,14 @@ else
// Try to override some limits - maybe it helps some...
@set_time_limit(0);
$mem_limit = @ini_get('memory_limit');
-if (!empty($mem_limit ))
+if (!empty($mem_limit))
{
$unit = strtolower(substr($mem_limit, -1, 1));
- $mem_limit = (int)$mem_limit;
+ $mem_limit = (int) $mem_limit;
if ($unit == 'k')
{
$mem_limit = floor($mem_limit/1024);
- }
+ }
else if ($unit == 'g')
{
$mem_limit *= 1024;
@@ -127,7 +127,7 @@ else
{
$mem_limit = '128M';
}
-@ini_set('memory_limit', $mem_limit );
+@ini_set('memory_limit', $mem_limit);
// Include essential scripts
require($phpbb_root_path . 'includes/functions.' . $phpEx);
@@ -225,6 +225,9 @@ $config = array(
$template->set_custom_template('../adm/style', 'admin');
$template->assign_var('T_TEMPLATE_PATH', '../adm/style');
+// the acp template is never stored in the database
+$user->theme['template_storedb'] = false;
+
$install = new module();
$install->create('install', "index.$phpEx", $mode, $sub);
@@ -721,7 +724,7 @@ class module
{
$path = $phpbb_root_path . 'language/' . $file;
- if (is_file($path) || is_link($path) || $file == '.' || $file == '..' || $file == 'CVS')
+ if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS')
{
continue;
}
diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php
index 4d7055d763..0f2486d874 100644
--- a/phpBB/install/install_convert.php
+++ b/phpBB/install/install_convert.php
@@ -463,6 +463,7 @@ class install_convert extends module
$prefixes = array();
$tables_existing = get_tables($src_db);
+ $tables_existing = array_map('strtolower', $tables_existing);
foreach ($tables_existing as $table_name)
{
compare_table($tables, $table_name, $prefixes);
diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php
index 7fd4c881c6..4dd7e73db5 100755
--- a/phpBB/install/install_install.php
+++ b/phpBB/install/install_install.php
@@ -9,6 +9,11 @@
*/
/**
+* @todo: check for those functions being 'available'? Though not able to check with function_exists, we need to create test cases
+* ini_get(), glob, getimagesize, fsockopen, readfile
+*/
+
+/**
*/
if (!defined('IN_INSTALL'))
{
@@ -57,7 +62,7 @@ class install_install extends module
switch ($sub)
{
- case 'intro' :
+ case 'intro':
$this->page_title = $lang['SUB_INTRO'];
$template->assign_vars(array(
@@ -70,27 +75,27 @@ class install_install extends module
break;
- case 'requirements' :
+ case 'requirements':
$this->check_server_requirements($mode, $sub);
break;
- case 'database' :
+ case 'database':
$this->obtain_database_settings($mode, $sub);
break;
- case 'administrator' :
+ case 'administrator':
$this->obtain_admin_settings($mode, $sub);
break;
- case 'config_file' :
+ case 'config_file':
$this->create_config_file($mode, $sub);
break;
- case 'advanced' :
+ case 'advanced':
$this->obtain_advanced_settings($mode, $sub);
break;
@@ -99,7 +104,7 @@ class install_install extends module
$this->load_schema($mode, $sub);
break;
- case 'final' :
+ case 'final':
$this->build_search_index($mode, $sub);
$this->add_modules($mode, $sub);
$this->add_language($mode, $sub);
@@ -535,10 +540,7 @@ class install_install extends module
$this->page_title = $lang['STAGE_DATABASE'];
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
+ $data = $this->get_submitted_data();
$connect_test = false;
$error = array();
@@ -547,15 +549,14 @@ class install_install extends module
// Has the user opted to test the connection?
if (isset($_POST['testdb']))
{
- if (!isset($available_dbms[$dbms]) || !$available_dbms[$dbms]['AVAILABLE'])
+ if (!isset($available_dbms[$data['dbms']]) || !$available_dbms[$data['dbms']]['AVAILABLE'])
{
$error['db'][] = $lang['INST_ERR_NO_DB'];
$connect_test = false;
}
else
{
- $dbpasswd = htmlspecialchars_decode($dbpasswd);
- $connect_test = connect_check_db(true, $error, $available_dbms[$dbms], $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport);
+ $connect_test = connect_check_db(true, $error, $available_dbms[$data['dbms']], $data['table_prefix'], $data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport']);
}
$template->assign_block_vars('checks', array(
@@ -603,7 +604,7 @@ class install_install extends module
$available_dbms = &$available_dbms_temp;
// And now for the main part of this page
- $table_prefix = (!empty($table_prefix) ? $table_prefix : 'phpbb_');
+ $data['table_prefix'] = (!empty($data['table_prefix']) ? $data['table_prefix'] : 'phpbb_');
foreach ($this->db_config_options as $config_key => $vars)
{
@@ -630,15 +631,15 @@ class install_install extends module
'S_EXPLAIN' => $vars['explain'],
'S_LEGEND' => false,
'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '',
- 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options),
+ 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options),
)
);
}
}
// And finally where do we want to go next (well today is taken isn't it :P)
- $s_hidden_fields = ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
- $s_hidden_fields .= '<input type="hidden" name="language" value="' . $language . '" />';
+ $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
+ $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
if ($connect_test)
{
foreach ($this->db_config_options as $config_key => $vars)
@@ -647,7 +648,7 @@ class install_install extends module
{
continue;
}
- $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $$config_key . '" />';
+ $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
}
}
@@ -673,69 +674,63 @@ class install_install extends module
$this->page_title = $lang['STAGE_ADMINISTRATOR'];
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
+ $data = $this->get_submitted_data();
- if ($dbms == '')
+ if ($data['dbms'] == '')
{
// Someone's been silly and tried calling this page direct
// So we send them back to the start to do it again properly
$this->p_master->redirect("index.$phpEx?mode=install");
}
- $s_hidden_fields = ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
+ $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
$passed = false;
- $default_lang = ($default_lang !== '') ? $default_lang : $language;
-
- $board_email1 = strtolower($board_email1);
- $board_email2 = strtolower($board_email2);
+ $data['default_lang'] = ($data['default_lang'] !== '') ? $data['default_lang'] : $data['language'];
if (isset($_POST['check']))
{
$error = array();
// Check the entered email address and password
- if ($admin_name == '' || $admin_pass1 == '' || $admin_pass2 == '' || $board_email1 == '' || $board_email2 == '')
+ if ($data['admin_name'] == '' || $data['admin_pass1'] == '' || $data['admin_pass2'] == '' || $data['board_email1'] == '' || $data['board_email2'] == '')
{
$error[] = $lang['INST_ERR_MISSING_DATA'];
}
- if ($admin_pass1 != $admin_pass2 && $admin_pass1 != '')
+ if ($data['admin_pass1'] != $data['admin_pass2'] && $data['admin_pass1'] != '')
{
$error[] = $lang['INST_ERR_PASSWORD_MISMATCH'];
}
// Test against the default username rules
- if ($admin_name != '' && utf8_strlen($admin_name) < 3)
+ if ($data['admin_name'] != '' && utf8_strlen($data['admin_name']) < 3)
{
$error[] = $lang['INST_ERR_USER_TOO_SHORT'];
}
- if ($admin_name != '' && utf8_strlen($admin_name) > 20)
+ if ($data['admin_name'] != '' && utf8_strlen($data['admin_name']) > 20)
{
$error[] = $lang['INST_ERR_USER_TOO_LONG'];
}
// Test against the default password rules
- if ($admin_pass1 != '' && utf8_strlen($admin_pass1) < 6)
+ if ($data['admin_pass1'] != '' && utf8_strlen($data['admin_pass1']) < 6)
{
$error[] = $lang['INST_ERR_PASSWORD_TOO_SHORT'];
}
- if ($admin_pass1 != '' && utf8_strlen($admin_pass1) > 30)
+ if ($data['admin_pass1'] != '' && utf8_strlen($data['admin_pass1']) > 30)
{
$error[] = $lang['INST_ERR_PASSWORD_TOO_LONG'];
}
- if ($board_email1 != $board_email2 && $board_email1 != '')
+ if ($data['board_email1'] != $data['board_email2'] && $data['board_email1'] != '')
{
$error[] = $lang['INST_ERR_EMAIL_MISMATCH'];
}
- if ($board_email1 != '' && !preg_match('/^' . get_preg_expression('email') . '$/i', $board_email1))
+ if ($data['board_email1'] != '' && !preg_match('/^' . get_preg_expression('email') . '$/i', $data['board_email1']))
{
$error[] = $lang['INST_ERR_EMAIL_INVALID'];
}
@@ -796,7 +791,7 @@ class install_install extends module
'S_EXPLAIN' => $vars['explain'],
'S_LEGEND' => false,
'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '',
- 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options),
+ 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options),
)
);
}
@@ -809,12 +804,12 @@ class install_install extends module
{
continue;
}
- $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $$config_key . '" />';
+ $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
}
}
- $s_hidden_fields .= ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
- $s_hidden_fields .= '<input type="hidden" name="language" value="' . $language . '" />';
+ $s_hidden_fields .= ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
+ $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
foreach ($this->db_config_options as $config_key => $vars)
{
@@ -822,7 +817,7 @@ class install_install extends module
{
continue;
}
- $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $$config_key . '" />';
+ $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
}
$submit = $lang['NEXT_STEP'];
@@ -847,26 +842,23 @@ class install_install extends module
$this->page_title = $lang['STAGE_CONFIG_FILE'];
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
+ $data = $this->get_submitted_data();
- if ($dbms == '')
+ if ($data['dbms'] == '')
{
// Someone's been silly and tried calling this page direct
// So we send them back to the start to do it again properly
$this->p_master->redirect("index.$phpEx?mode=install");
}
- $s_hidden_fields = ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
- $s_hidden_fields .= '<input type="hidden" name="language" value="' . $language . '" />';
+ $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
+ $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
$written = false;
// Create a list of any PHP modules we wish to have loaded
$load_extensions = array();
- $available_dbms = get_available_dbms($dbms);
- $check_exts = array_merge(array($available_dbms[$dbms]['MODULE']), $this->php_dlls_other);
+ $available_dbms = get_available_dbms($data['dbms']);
+ $check_exts = array_merge(array($available_dbms[$data['dbms']]['MODULE']), $this->php_dlls_other);
foreach ($check_exts as $dll)
{
@@ -892,19 +884,18 @@ class install_install extends module
@chmod($phpbb_root_path . 'cache/install_lock', 0666);
- $dbpasswd = htmlspecialchars_decode($dbpasswd);
$load_extensions = implode(',', $load_extensions);
// Time to convert the data provided into a config file
$config_data = "<?php\n";
$config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n";
- $config_data .= "\$dbms = '" . $available_dbms[$dbms]['DRIVER'] . "';\n";
- $config_data .= "\$dbhost = '$dbhost';\n";
- $config_data .= "\$dbport = '$dbport';\n";
- $config_data .= "\$dbname = '$dbname';\n";
- $config_data .= "\$dbuser = '$dbuser';\n";
- $config_data .= "\$dbpasswd = '$dbpasswd';\n\n";
- $config_data .= "\$table_prefix = '$table_prefix';\n";
+ $config_data .= "\$dbms = '" . $available_dbms[$data['dbms']]['DRIVER'] . "';\n";
+ $config_data .= "\$dbhost = '{$data['dbhost']}';\n";
+ $config_data .= "\$dbport = '{$data['dbport']}';\n";
+ $config_data .= "\$dbname = '{$data['dbname']}';\n";
+ $config_data .= "\$dbuser = '{$data['dbuser']}';\n";
+ $config_data .= "\$dbpasswd = '{$data['dbpasswd']}';\n\n";
+ $config_data .= "\$table_prefix = '{$data['table_prefix']}';\n";
// $config_data .= "\$acm_type = '" . (($acm_type) ? $acm_type : 'file') . "';\n";
$config_data .= "\$acm_type = 'file';\n";
$config_data .= "\$load_extensions = '$load_extensions';\n\n";
@@ -959,7 +950,7 @@ class install_install extends module
{
continue;
}
- $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $$config_key . '" />';
+ $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
}
if (!$written)
@@ -1011,28 +1002,25 @@ class install_install extends module
$this->page_title = $lang['STAGE_ADVANCED'];
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
+ $data = $this->get_submitted_data();
- if ($dbms == '')
+ if ($data['dbms'] == '')
{
// Someone's been silly and tried calling this page direct
// So we send them back to the start to do it again properly
$this->p_master->redirect("index.$phpEx?mode=install");
}
- $s_hidden_fields = ($img_imagick) ? '<input type="hidden" name="img_imagick" value="' . addslashes($img_imagick) . '" />' : '';
- $s_hidden_fields .= '<input type="hidden" name="language" value="' . $language . '" />';
+ $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
+ $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
- $email_enable = ($email_enable !== '') ? $email_enable : true;
- $server_name = ($server_name !== '') ? $server_name : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
- $server_port = ($server_port !== '') ? $server_port : ((!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT'));
- $server_protocol = ($server_protocol !== '') ? $server_protocol : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://');
- $cookie_secure = ($cookie_secure !== '') ? $cookie_secure : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? true : false);
+ $data['email_enable'] = ($data['email_enable'] !== '') ? $data['email_enable'] : true;
+ $data['server_name'] = ($data['server_name'] !== '') ? $data['server_name'] : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
+ $data['server_port'] = ($data['server_port'] !== '') ? $data['server_port'] : ((!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT'));
+ $data['server_protocol'] = ($data['server_protocol'] !== '') ? $data['server_protocol'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://');
+ $data['cookie_secure'] = ($data['cookie_secure'] !== '') ? $data['cookie_secure'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? true : false);
- if ($script_path === '')
+ if ($data['script_path'] === '')
{
$name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
if (!$name)
@@ -1042,7 +1030,7 @@ class install_install extends module
// Replace backslashes and doubled slashes (could happen on some proxy setups)
$name = str_replace(array('\\', '//', '/install'), '/', $name);
- $script_path = trim(dirname($name));
+ $data['script_path'] = trim(dirname($name));
}
foreach ($this->advanced_config_options as $config_key => $vars)
@@ -1070,7 +1058,7 @@ class install_install extends module
'S_EXPLAIN' => $vars['explain'],
'S_LEGEND' => false,
'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '',
- 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options),
+ 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $data[$config_key], $options),
)
);
}
@@ -1082,7 +1070,7 @@ class install_install extends module
{
continue;
}
- $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $$config_key . '" />';
+ $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
}
$submit = $lang['NEXT_STEP'];
@@ -1108,19 +1096,16 @@ class install_install extends module
$s_hidden_fields = '';
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
+ $data = $this->get_submitted_data();
- if ($dbms == '')
+ if ($data['dbms'] == '')
{
// Someone's been silly and tried calling this page direct
// So we send them back to the start to do it again properly
$this->p_master->redirect("index.$phpEx?mode=install");
}
- $cookie_domain = ($server_name != '') ? $server_name : (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME');
+ $cookie_domain = ($data['server_name'] != '') ? $data['server_name'] : (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME');
// Try to come up with the best solution for cookie domain...
if (strpos($cookie_domain, 'www.') === 0)
@@ -1129,45 +1114,43 @@ class install_install extends module
}
// If we get here and the extension isn't loaded it should be safe to just go ahead and load it
- $available_dbms = get_available_dbms($dbms);
-
- $dbpasswd = htmlspecialchars_decode($dbpasswd);
+ $available_dbms = get_available_dbms($data['dbms']);
// Load the appropriate database class if not already loaded
- include($phpbb_root_path . 'includes/db/' . $available_dbms[$dbms]['DRIVER'] . '.' . $phpEx);
+ include($phpbb_root_path . 'includes/db/' . $available_dbms[$data['dbms']]['DRIVER'] . '.' . $phpEx);
// Instantiate the database
- $sql_db = 'dbal_' . $available_dbms[$dbms]['DRIVER'];
+ $sql_db = 'dbal_' . $available_dbms[$data['dbms']]['DRIVER'];
$db = new $sql_db();
- $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false);
+ $db->sql_connect($data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport'], false, false);
// NOTE: trigger_error does not work here.
$db->sql_return_on_error(true);
// If mysql is chosen, we need to adjust the schema filename slightly to reflect the correct version. ;)
- if ($dbms == 'mysql')
+ if ($data['dbms'] == 'mysql')
{
if (version_compare($db->mysql_version, '4.1.3', '>='))
{
- $available_dbms[$dbms]['SCHEMA'] .= '_41';
+ $available_dbms[$data['dbms']]['SCHEMA'] .= '_41';
}
else
{
- $available_dbms[$dbms]['SCHEMA'] .= '_40';
+ $available_dbms[$data['dbms']]['SCHEMA'] .= '_40';
}
}
// Ok we have the db info go ahead and read in the relevant schema
// and work on building the table
- $dbms_schema = 'schemas/' . $available_dbms[$dbms]['SCHEMA'] . '_schema.sql';
+ $dbms_schema = 'schemas/' . $available_dbms[$data['dbms']]['SCHEMA'] . '_schema.sql';
// How should we treat this schema?
- $remove_remarks = $available_dbms[$dbms]['COMMENTS'];
- $delimiter = $available_dbms[$dbms]['DELIM'];
+ $remove_remarks = $available_dbms[$data['dbms']]['COMMENTS'];
+ $delimiter = $available_dbms[$data['dbms']]['DELIM'];
$sql_query = @file_get_contents($dbms_schema);
- $sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query);
+ $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query);
$remove_remarks($sql_query);
@@ -1188,7 +1171,7 @@ class install_install extends module
$sql_query = file_get_contents('schemas/schema_data.sql');
// Deal with any special comments
- switch ($dbms)
+ switch ($data['dbms'])
{
case 'mssql':
case 'mssql_odbc':
@@ -1201,7 +1184,7 @@ class install_install extends module
}
// Change prefix
- $sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query);
+ $sql_query = preg_replace('#phpbb_#i', $data['table_prefix'], $sql_query);
// Change language strings...
$sql_query = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', 'adjust_language_keys_callback', $sql_query);
@@ -1225,139 +1208,139 @@ class install_install extends module
$user_ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars($_SERVER['REMOTE_ADDR']) : '';
- if ($script_path !== '/')
+ if ($data['script_path'] !== '/')
{
// Adjust destination path (no trailing slash)
- if (substr($script_path, -1) == '/')
+ if (substr($data['script_path'], -1) == '/')
{
- $script_path = substr($script_path, 0, -1);
+ $data['script_path'] = substr($data['script_path'], 0, -1);
}
- $script_path = str_replace(array('../', './'), '', $script_path);
+ $data['script_path'] = str_replace(array('../', './'), '', $data['script_path']);
- if ($script_path[0] != '/')
+ if ($data['script_path'][0] != '/')
{
- $script_path = '/' . $script_path;
+ $data['script_path'] = '/' . $data['script_path'];
}
}
// Set default config and post data, this applies to all DB's
$sql_ary = array(
- 'INSERT INTO ' . $table_prefix . "config (config_name, config_value)
+ 'INSERT INTO ' . $data['table_prefix'] . "config (config_name, config_value)
VALUES ('board_startdate', '$current_time')",
- 'INSERT INTO ' . $table_prefix . "config (config_name, config_value)
- VALUES ('default_lang', '" . $db->sql_escape($default_lang) . "')",
+ 'INSERT INTO ' . $data['table_prefix'] . "config (config_name, config_value)
+ VALUES ('default_lang', '" . $db->sql_escape($data['default_lang']) . "')",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($img_imagick) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['img_imagick']) . "'
WHERE config_name = 'img_imagick'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($server_name) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['server_name']) . "'
WHERE config_name = 'server_name'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($server_port) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['server_port']) . "'
WHERE config_name = 'server_port'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($board_email1) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['board_email1']) . "'
WHERE config_name = 'board_email'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($board_email1) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['board_email1']) . "'
WHERE config_name = 'board_contact'",
- 'UPDATE ' . $table_prefix . "config
+ 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '" . $db->sql_escape($cookie_domain) . "'
WHERE config_name = 'cookie_domain'",
- 'UPDATE ' . $table_prefix . "config
+ 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '" . $db->sql_escape($lang['default_dateformat']) . "'
WHERE config_name = 'default_dateformat'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($email_enable) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['email_enable']) . "'
WHERE config_name = 'email_enable'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($smtp_delivery) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['smtp_delivery']) . "'
WHERE config_name = 'smtp_delivery'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($smtp_host) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['smtp_host']) . "'
WHERE config_name = 'smtp_host'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($smtp_auth) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['smtp_auth']) . "'
WHERE config_name = 'smtp_auth_method'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($smtp_user) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['smtp_user']) . "'
WHERE config_name = 'smtp_username'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($smtp_pass) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['smtp_pass']) . "'
WHERE config_name = 'smtp_password'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($cookie_secure) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['cookie_secure']) . "'
WHERE config_name = 'cookie_secure'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($force_server_vars) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['force_server_vars']) . "'
WHERE config_name = 'force_server_vars'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($script_path) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['script_path']) . "'
WHERE config_name = 'script_path'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($server_protocol) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['server_protocol']) . "'
WHERE config_name = 'server_protocol'",
- 'UPDATE ' . $table_prefix . "config
- SET config_value = '" . $db->sql_escape($admin_name) . "'
+ 'UPDATE ' . $data['table_prefix'] . "config
+ SET config_value = '" . $db->sql_escape($data['admin_name']) . "'
WHERE config_name = 'newest_username'",
- 'UPDATE ' . $table_prefix . "config
+ 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '" . md5(mt_rand()) . "'
WHERE config_name = 'avatar_salt'",
- 'UPDATE ' . $table_prefix . "users
- SET username = '" . $db->sql_escape($admin_name) . "', user_password='" . $db->sql_escape(md5($admin_pass1)) . "', user_ip = '" . $db->sql_escape($user_ip) . "', user_lang = '" . $db->sql_escape($default_lang) . "', user_email='" . $db->sql_escape($board_email1) . "', user_dateformat='" . $db->sql_escape($lang['default_dateformat']) . "', user_email_hash = " . (crc32($board_email1) . strlen($board_email1)) . ", username_clean = '" . $db->sql_escape(utf8_clean_string($admin_name)) . "'
+ 'UPDATE ' . $data['table_prefix'] . "users
+ SET username = '" . $db->sql_escape($data['admin_name']) . "', user_password='" . $db->sql_escape(md5($data['admin_pass1'])) . "', user_ip = '" . $db->sql_escape($user_ip) . "', user_lang = '" . $db->sql_escape($data['default_lang']) . "', user_email='" . $db->sql_escape($data['board_email1']) . "', user_dateformat='" . $db->sql_escape($lang['default_dateformat']) . "', user_email_hash = " . (crc32($data['board_email1']) . strlen($data['board_email1'])) . ", username_clean = '" . $db->sql_escape(utf8_clean_string($data['admin_name'])) . "'
WHERE username = 'Admin'",
- 'UPDATE ' . $table_prefix . "moderator_cache
- SET username = '" . $db->sql_escape($admin_name) . "'
+ 'UPDATE ' . $data['table_prefix'] . "moderator_cache
+ SET username = '" . $db->sql_escape($data['admin_name']) . "'
WHERE username = 'Admin'",
- 'UPDATE ' . $table_prefix . "forums
- SET forum_last_poster_name = '" . $db->sql_escape($admin_name) . "'
+ 'UPDATE ' . $data['table_prefix'] . "forums
+ SET forum_last_poster_name = '" . $db->sql_escape($data['admin_name']) . "'
WHERE forum_last_poster_name = 'Admin'",
- 'UPDATE ' . $table_prefix . "topics
- SET topic_first_poster_name = '" . $db->sql_escape($admin_name) . "', topic_last_poster_name = '" . $db->sql_escape($admin_name) . "'
+ 'UPDATE ' . $data['table_prefix'] . "topics
+ SET topic_first_poster_name = '" . $db->sql_escape($data['admin_name']) . "', topic_last_poster_name = '" . $db->sql_escape($data['admin_name']) . "'
WHERE topic_first_poster_name = 'Admin'
OR topic_last_poster_name = 'Admin'",
- 'UPDATE ' . $table_prefix . "users
+ 'UPDATE ' . $data['table_prefix'] . "users
SET user_regdate = $current_time",
- 'UPDATE ' . $table_prefix . "posts
+ 'UPDATE ' . $data['table_prefix'] . "posts
SET post_time = $current_time, poster_ip = '" . $db->sql_escape($user_ip) . "'",
- 'UPDATE ' . $table_prefix . "topics
+ 'UPDATE ' . $data['table_prefix'] . "topics
SET topic_time = $current_time, topic_last_post_time = $current_time",
- 'UPDATE ' . $table_prefix . "forums
+ 'UPDATE ' . $data['table_prefix'] . "forums
SET forum_last_post_time = $current_time",
);
if (@extension_loaded('gd') || can_load_dll('gd'))
{
- $sql_ary[] = 'UPDATE ' . $table_prefix . "config
+ $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '1'
WHERE config_name = 'captcha_gd'";
}
@@ -1369,7 +1352,7 @@ class install_install extends module
$rand_str = substr($rand_str, 0, 5);
$cookie_name .= strtolower($rand_str);
- $sql_ary[] = 'UPDATE ' . $table_prefix . "config
+ $sql_ary[] = 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '" . $db->sql_escape($cookie_name) . "'
WHERE config_name = 'cookie_name'";
@@ -1384,11 +1367,6 @@ class install_install extends module
}
}
- foreach ($this->request_vars as $var)
- {
- $s_hidden_fields .= '<input type="hidden" name="' . $var . '" value="' . $$var . '" />';
- }
-
$submit = $lang['NEXT_STEP'];
$url = $this->p_master->module_url . "?mode=$mode&amp;sub=final";
@@ -1396,7 +1374,7 @@ class install_install extends module
$template->assign_vars(array(
'BODY' => $lang['STAGE_CREATE_TABLE_EXPLAIN'],
'L_SUBMIT' => $submit,
- 'S_HIDDEN' => $s_hidden_fields,
+ 'S_HIDDEN' => build_hidden_fields($data),
'U_ACTION' => $url,
));
}
@@ -1409,23 +1387,19 @@ class install_install extends module
global $db, $lang, $phpbb_root_path, $phpEx, $config;
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
-
- $dbpasswd = htmlspecialchars_decode($dbpasswd);
+ $data = $this->get_submitted_data();
+ $table_prefix = $data['table_prefix'];
// If we get here and the extension isn't loaded it should be safe to just go ahead and load it
- $available_dbms = get_available_dbms($dbms);
+ $available_dbms = get_available_dbms($data['dbms']);
// Load the appropriate database class if not already loaded
- include($phpbb_root_path . 'includes/db/' . $available_dbms[$dbms]['DRIVER'] . '.' . $phpEx);
+ include($phpbb_root_path . 'includes/db/' . $available_dbms[$data['dbms']]['DRIVER'] . '.' . $phpEx);
// Instantiate the database
- $sql_db = 'dbal_' . $available_dbms[$dbms]['DRIVER'];
+ $sql_db = 'dbal_' . $available_dbms[$data['dbms']]['DRIVER'];
$db = new $sql_db();
- $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false);
+ $db->sql_connect($data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport'], false, false);
// NOTE: trigger_error does not work here.
$db->sql_return_on_error(true);
@@ -1466,7 +1440,6 @@ class install_install extends module
{
global $db, $lang, $phpbb_root_path, $phpEx;
- include_once($phpbb_root_path . 'includes/constants.' . $phpEx);
include_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx);
$_module = &new acp_modules();
@@ -1550,10 +1523,11 @@ class install_install extends module
{
continue;
}
+
$module_data = array(
'module_basename' => $module_basename,
'module_enabled' => 1,
- 'module_display' => (isset($row['display'])) ? $row['display'] : 1,
+ 'module_display' => (isset($row['display'])) ? (int) $row['display'] : 1,
'parent_id' => (int) $categories[$cat_name]['id'],
'module_class' => $module_class,
'module_langname' => $row['title'],
@@ -1655,8 +1629,8 @@ class install_install extends module
$module_data = array(
'module_basename' => $row['module_basename'],
- 'module_enabled' => $row['module_enabled'],
- 'module_display' => $row['module_display'],
+ 'module_enabled' => (int) $row['module_enabled'],
+ 'module_display' => (int) $row['module_display'],
'parent_id' => (int) $row2['module_id'],
'module_class' => $row['module_class'],
'module_langname' => $row['module_langname'],
@@ -1698,7 +1672,12 @@ class install_install extends module
{
$path = $phpbb_root_path . 'language/' . $file;
- if (is_dir($path) && !is_link($path) && file_exists($path . '/iso.txt'))
+ if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS')
+ {
+ continue;
+ }
+
+ if (is_dir($path) && file_exists($path . '/iso.txt'))
{
$lang_file = file("{$phpbb_root_path}language/$path/iso.txt");
@@ -1759,12 +1738,12 @@ class install_install extends module
if (in_array($image_name, $valid_localized))
{
$sql_ary[] = array(
- 'image_name' => $image_name,
- 'image_filename' => $image_filename,
- 'image_height' => $image_height,
- 'image_width' => $image_width,
- 'imageset_id' => $imageset_row['imageset_id'],
- 'image_lang' => $lang_pack['lang_iso'],
+ 'image_name' => (string) $image_name,
+ 'image_filename' => (string) $image_filename,
+ 'image_height' => (int) $image_height,
+ 'image_width' => (int) $image_width,
+ 'imageset_id' => (int) $imageset_row['imageset_id'],
+ 'image_lang' => (string) $lang_pack['lang_iso'],
);
}
}
@@ -1796,10 +1775,7 @@ class install_install extends module
global $db, $lang, $phpbb_root_path, $phpEx, $config;
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
+ $data = $this->get_submitted_data();
// Fill the config array - it is needed by those functions we call
$sql = 'SELECT *
@@ -1841,7 +1817,7 @@ class install_install extends module
'user_password' => '',
'user_colour' => '9E8DA7',
'user_email' => '',
- 'user_lang' => $default_lang,
+ 'user_lang' => $data['default_lang'],
'user_style' => 1,
'user_timezone' => 0,
'user_dateformat' => $lang['default_dateformat'],
@@ -1859,10 +1835,10 @@ class install_install extends module
$sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
'bot_active' => 1,
- 'bot_name' => $bot_name,
- 'user_id' => $user_id,
- 'bot_agent' => $bot_ary[0],
- 'bot_ip' => $bot_ary[1],
+ 'bot_name' => (string) $bot_name,
+ 'user_id' => (int) $user_id,
+ 'bot_agent' => (string) $bot_ary[0],
+ 'bot_ip' => (string) $bot_ary[1],
));
$result = $db->sql_query($sql);
@@ -1879,13 +1855,7 @@ class install_install extends module
$this->page_title = $lang['STAGE_FINAL'];
// Obtain any submitted data
- foreach ($this->request_vars as $var)
- {
- $$var = (in_array($var, array('admin_name', 'dbpasswd', 'admin_pass1', 'admin_pass2'))) ? request_var($var, '', true) : request_var($var, '');
- }
-
- // Load the basic configuration data
- include_once($phpbb_root_path . 'includes/constants.' . $phpEx);
+ $data = $this->get_submitted_data();
$sql = 'SELECT *
FROM ' . CONFIG_TABLE;
@@ -1899,7 +1869,7 @@ class install_install extends module
$db->sql_freeresult($result);
$user->session_begin();
- $auth->login($admin_name, $admin_pass1, false, true, true);
+ $auth->login($data['admin_name'], $data['admin_pass1'], false, true, true);
// OK, Now that we've reached this point we can be confident that everything
// is installed and working......I hope :)
@@ -1912,9 +1882,9 @@ class install_install extends module
$messenger = new messenger(false);
- $messenger->template('installed', $language);
+ $messenger->template('installed', $data['language']);
- $messenger->to($board_email1, $admin_name);
+ $messenger->to($data['board_email1'], $data['admin_name']);
$messenger->headers('X-AntiAbuse: Board servername - ' . $config['server_name']);
$messenger->headers('X-AntiAbuse: User_id - ' . $user->data['user_id']);
@@ -1922,8 +1892,8 @@ class install_install extends module
$messenger->headers('X-AntiAbuse: User IP - ' . $user->ip);
$messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($admin_name),
- 'PASSWORD' => htmlspecialchars_decode($admin_pass1))
+ 'USERNAME' => htmlspecialchars_decode($data['admin_name']),
+ 'PASSWORD' => htmlspecialchars_decode($data['admin_pass1']))
);
$messenger->send(NOTIFY_EMAIL);
@@ -1934,7 +1904,7 @@ class install_install extends module
$template->assign_vars(array(
'TITLE' => $lang['INSTALL_CONGRATS'],
- 'BODY' => sprintf($lang['INSTALL_CONGRATS_EXPLAIN'], $config['version'], append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=convert&amp;language=' . $language), '../docs/README.html'),
+ 'BODY' => sprintf($lang['INSTALL_CONGRATS_EXPLAIN'], $config['version'], append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=convert&amp;language=' . $data['language']), '../docs/README.html'),
'L_SUBMIT' => $lang['INSTALL_LOGIN'],
'U_ACTION' => append_sid($phpbb_root_path . 'adm/index.' . $phpEx),
));
@@ -1958,12 +1928,44 @@ class install_install extends module
return $s_smtp_auth_options;
}
-
/**
- * The variables that we will be passing between pages
- * Used to retrieve data quickly on each page
+ * Get submitted data
*/
- var $request_vars = array('language', 'dbms', 'dbhost', 'dbport', 'dbuser', 'dbpasswd', 'dbname', 'table_prefix', 'default_lang', 'admin_name', 'admin_pass1', 'admin_pass2', 'board_email1', 'board_email2', 'img_imagick', 'ftp_path', 'ftp_user', 'ftp_pass', 'email_enable', 'smtp_delivery', 'smtp_host', 'smtp_auth', 'smtp_user', 'smtp_pass', 'cookie_secure', 'force_server_vars', 'server_protocol', 'server_name', 'server_port', 'script_path');
+ function get_submitted_data()
+ {
+ return array(
+ 'language' => basename(request_var('language', '')),
+ 'dbms' => request_var('dbms', ''),
+ 'dbhost' => request_var('dbhost', ''),
+ 'dbport' => request_var('dbport', ''),
+ 'dbuser' => request_var('dbuser', ''),
+ 'dbpasswd' => htmlspecialchars_decode(request_var('dbpasswd', '', true)),
+ 'dbname' => request_var('dbname', ''),
+ 'table_prefix' => request_var('table_prefix', ''),
+ 'default_lang' => basename(request_var('default_lang', '')),
+ 'admin_name' => utf8_normalize_nfc(request_var('admin_name', '', true)),
+ 'admin_pass1' => request_var('admin_pass1', '', true),
+ 'admin_pass2' => request_var('admin_pass2', '', true),
+ 'board_email1' => strtolower(request_var('board_email1', '')),
+ 'board_email2' => strtolower(request_var('board_email2', '')),
+ 'img_imagick' => request_var('img_imagick', ''),
+ 'ftp_path' => request_var('ftp_path', ''),
+ 'ftp_user' => request_var('ftp_user', ''),
+ 'ftp_pass' => request_var('ftp_pass', ''),
+ 'email_enable' => request_var('email_enable', ''),
+ 'smtp_delivery' => request_var('smtp_delivery', ''),
+ 'smtp_host' => request_var('smtp_host', ''),
+ 'smtp_auth' => request_var('smtp_auth', ''),
+ 'smtp_user' => request_var('smtp_user', ''),
+ 'smtp_pass' => request_var('smtp_pass', ''),
+ 'cookie_secure' => request_var('cookie_secure', ''),
+ 'force_server_vars' => request_var('force_server_vars', ''),
+ 'server_protocol' => request_var('server_protocol', ''),
+ 'server_name' => request_var('server_name', ''),
+ 'server_port' => request_var('server_port', ''),
+ 'script_path' => request_var('script_path', ''),
+ );
+ }
/**
* The information below will be used to build the input fields presented to the user
diff --git a/phpBB/install/install_update.php b/phpBB/install/install_update.php
index bf1912076f..7b0e405a0f 100644
--- a/phpBB/install/install_update.php
+++ b/phpBB/install/install_update.php
@@ -58,6 +58,7 @@ class install_update extends module
var $new_location;
var $latest_version;
var $current_version;
+ var $unequal_version;
// Set to false
var $test_update = false;
@@ -73,6 +74,7 @@ class install_update extends module
$this->tpl_name = 'install_update';
$this->page_title = 'UPDATE_INSTALLATION';
+ $this->unequal_version = false;
$this->old_location = $phpbb_root_path . 'install/update/old/';
$this->new_location = $phpbb_root_path . 'install/update/new/';
@@ -82,7 +84,7 @@ class install_update extends module
require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
require($phpbb_root_path . 'includes/constants.' . $phpEx);
- // Special options for conflicts
+ // Special options for conflicts/modified files
define('MERGE_NO_MERGE_NEW', 1);
define('MERGE_NO_MERGE_MOD', 2);
define('MERGE_NEW_FILE', 3);
@@ -126,6 +128,9 @@ class install_update extends module
// Set custom template again. ;)
$template->set_custom_template('../adm/style', 'admin');
+ // still, the acp template is never stored in the database
+ $user->theme['template_storedb'] = false;
+
// Get current and latest version
if (($latest_version = $cache->get('_version_info')) === false)
{
@@ -170,12 +175,12 @@ class install_update extends module
// Check if the update files stored are for the latest version...
if ($this->latest_version != $this->update_info['version']['to'])
{
+ $this->unequal_version = true;
+
$template->assign_vars(array(
- 'S_ERROR' => true,
- 'ERROR_MSG' => sprintf($user->lang['OLD_UPDATE_FILES'], $this->update_info['version']['from'], $this->update_info['version']['to'], $this->latest_version))
+ 'S_WARNING' => true,
+ 'WARNING_MSG' => sprintf($user->lang['OLD_UPDATE_FILES'], $this->update_info['version']['from'], $this->update_info['version']['to'], $this->latest_version))
);
-
- return;
}
if ($this->test_update === false)
@@ -239,6 +244,12 @@ class install_update extends module
'CURRENT_VERSION' => $this->current_version)
);
+ // Print out version the update package updates to
+ if ($this->unequal_version)
+ {
+ $template->assign_var('PACKAGE_VERSION', $this->update_info['version']['to']);
+ }
+
break;
case 'update_db':
@@ -251,7 +262,7 @@ class install_update extends module
{
include_once($phpbb_root_path . 'install/database_update.' . $phpEx);
- if ($updates_to_version === $this->latest_version)
+ if ($updates_to_version === $this->update_info['version']['to'])
{
$valid = true;
}
@@ -269,7 +280,7 @@ class install_update extends module
// Redirect the user to the database update script with some explanations...
$template->assign_vars(array(
'S_DB_UPDATE' => true,
- 'S_DB_UPDATE_FINISHED' => ($config['version'] == $this->latest_version) ? true : false,
+ 'S_DB_UPDATE_FINISHED' => ($config['version'] == $this->update_info['version']['to']) ? true : false,
'U_DB_UPDATE' => append_sid($phpbb_root_path . 'install/database_update.' . $phpEx, 'type=1&amp;language=' . $user->data['user_lang']),
'U_DB_UPDATE_ACTION' => append_sid($this->p_master->module_url, "mode=$mode&amp;sub=update_db"),
'U_ACTION' => append_sid($this->p_master->module_url, "mode=$mode&amp;sub=file_check"),
@@ -430,14 +441,19 @@ class install_update extends module
else if (!$recache)
{
$last_change = $theme['theme_mtime'];
+ $dir = @opendir("{$phpbb_root_path}styles/{$theme['theme_path']}/theme");
- foreach (glob("{$phpbb_root_path}styles/{$theme['theme_path']}/theme/*.css", GLOB_NOSORT) as $file)
+ if ($dir)
{
- if ($last_change < @filemtime($file))
+ while (($entry = readdir($dir)) !== false)
{
- $recache = true;
- break;
+ if (substr(strrchr($entry, '.'), 1) == 'css' && $last_change < @filemtime("{$phpbb_root_path}styles/{$theme['theme_path']}/theme/{$entry}"))
+ {
+ $recache = true;
+ break;
+ }
}
+ closedir($dir);
}
}
@@ -476,11 +492,23 @@ class install_update extends module
$this->page_title = 'STAGE_UPDATE_FILES';
$s_hidden_fields = '';
- foreach (request_var('conflict', array('' => 0)) as $filename => $merge_option)
+ $conflicts = request_var('conflict', array('' => 0));
+ $modified = request_var('modified', array('' => 0));
+
+ foreach ($conflicts as $filename => $merge_option)
{
$s_hidden_fields .= '<input type="hidden" name="conflict[' . htmlspecialchars($filename) . ']" value="' . $merge_option . '" />';
}
+ foreach ($modified as $filename => $merge_option)
+ {
+ if (!$merge_option)
+ {
+ continue;
+ }
+ $s_hidden_fields .= '<input type="hidden" name="modified[' . htmlspecialchars($filename) . ']" value="' . $merge_option . '" />';
+ }
+
$no_update = request_var('no_update', array(0 => ''));
foreach ($no_update as $index => $filename)
@@ -609,6 +637,11 @@ class install_update extends module
{
$this->page_title = 'SELECT_FTP_SETTINGS';
+ if (!class_exists($method))
+ {
+ trigger_error('Method does not exist.', E_USER_ERROR);
+ }
+
$requested_data = call_user_func(array($method, 'data'));
foreach ($requested_data as $data => $default)
{
@@ -645,6 +678,7 @@ class install_update extends module
$update_list = $cache->get('_update_list');
$conflicts = request_var('conflict', array('' => 0));
+ $modified = request_var('modified', array('' => 0));
if ($update_list === false)
{
@@ -672,6 +706,28 @@ class install_update extends module
$conflicts = $new_conflicts;
}
+ // Build list for modifications
+ if (sizeof($modified))
+ {
+ $modified_filenames = array();
+ foreach ($update_list['modified'] as $files)
+ {
+ $modified_filenames[] = $files['filename'];
+ }
+
+ $new_modified = array();
+ foreach ($modified as $filename => $diff_method)
+ {
+ if (in_array($filename, $modified_filenames))
+ {
+ $new_modified[$filename] = $diff_method;
+ }
+ }
+
+ $modified = $new_modified;
+ }
+
+ // Check number of conflicting files, they need to be equal. For modified files the number can differ
if (sizeof($update_list['conflict']) != sizeof($conflicts))
{
trigger_error($user->lang['MERGE_SELECT_ERROR'], E_USER_ERROR);
@@ -729,10 +785,25 @@ class install_update extends module
case 'modified':
- $diff = $this->return_diff($this->old_location . $original_filename, $phpbb_root_path . $file_struct['filename'], $this->new_location . $original_filename);
+ $option = (isset($modified[$file_struct['filename']])) ? $modified[$file_struct['filename']] : 0;
+
+ switch ($option)
+ {
+ case MERGE_NO_MERGE_NEW:
+ $contents = file_get_contents($this->new_location . $original_filename);
+ break;
- $contents = implode("\n", $diff->merged_output());
- unset($diff);
+ case MERGE_NO_MERGE_MOD:
+ $contents = file_get_contents($phpbb_root_path . $file_struct['filename']);
+ break;
+
+ default:
+ $diff = $this->return_diff($this->old_location . $original_filename, $phpbb_root_path . $file_struct['filename'], $this->new_location . $original_filename);
+
+ $contents = implode("\n", $diff->merged_output());
+ unset($diff);
+ break;
+ }
if ($update_mode == 'download')
{
@@ -921,7 +992,25 @@ class install_update extends module
break;
case 'modified':
- $diff = $this->return_diff($this->old_location . $original_file, $phpbb_root_path . $original_file, $this->new_location . $file);
+ $option = request_var('op', 0);
+
+ switch ($option)
+ {
+ case MERGE_NO_MERGE_NEW:
+ case MERGE_NO_MERGE_MOD:
+
+ $diff = $this->return_diff(array(), ($option == MERGE_NO_MERGE_NEW) ? $this->new_location . $original_file : $phpbb_root_path . $file);
+
+ $template->assign_var('S_DIFF_NEW_FILE', true);
+ $diff_mode = 'inline';
+ $this->page_title = 'VIEWING_FILE_CONTENTS';
+
+ break;
+
+ default:
+ $diff = $this->return_diff($this->old_location . $original_file, $phpbb_root_path . $original_file, $this->new_location . $file);
+ break;
+ }
break;
case 'not_modified':
@@ -1234,6 +1323,7 @@ class install_update extends module
switch ($mode)
{
case 'version_info':
+ global $phpbb_root_path, $phpEx;
$info = get_remote_file('www.phpbb.com', '/updatecheck', '30x.txt', $errstr, $errno);
if ($info !== false)
diff --git a/phpBB/install/schemas/mysql_40_schema.sql b/phpBB/install/schemas/mysql_40_schema.sql
index b0aed4d177..e2dc0718e7 100644
--- a/phpBB/install/schemas/mysql_40_schema.sql
+++ b/phpBB/install/schemas/mysql_40_schema.sql
@@ -228,7 +228,7 @@ CREATE TABLE phpbb_forums (
forum_desc_uid varbinary(5) DEFAULT '' NOT NULL,
forum_link blob NOT NULL,
forum_password varbinary(120) DEFAULT '' NOT NULL,
- forum_style tinyint(4) DEFAULT '0' NOT NULL,
+ forum_style smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
forum_image varbinary(255) DEFAULT '' NOT NULL,
forum_rules blob NOT NULL,
forum_rules_link blob NOT NULL,
@@ -303,9 +303,9 @@ CREATE TABLE phpbb_groups (
group_desc_uid varbinary(5) DEFAULT '' NOT NULL,
group_display tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
group_avatar varbinary(255) DEFAULT '' NOT NULL,
- group_avatar_type tinyint(4) DEFAULT '0' NOT NULL,
- group_avatar_width tinyint(4) DEFAULT '0' NOT NULL,
- group_avatar_height tinyint(4) DEFAULT '0' NOT NULL,
+ group_avatar_type tinyint(2) DEFAULT '0' NOT NULL,
+ group_avatar_width smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
+ group_avatar_height smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
group_rank mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
group_colour varbinary(6) DEFAULT '' NOT NULL,
group_sig_chars mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
@@ -713,13 +713,13 @@ CREATE TABLE phpbb_smilies (
# Table: 'phpbb_styles'
CREATE TABLE phpbb_styles (
- style_id tinyint(4) NOT NULL auto_increment,
+ style_id smallint(4) UNSIGNED NOT NULL auto_increment,
style_name blob NOT NULL,
style_copyright blob NOT NULL,
style_active tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
- template_id tinyint(4) DEFAULT '0' NOT NULL,
- theme_id tinyint(4) DEFAULT '0' NOT NULL,
- imageset_id tinyint(4) DEFAULT '0' NOT NULL,
+ template_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
+ theme_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
+ imageset_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (style_id),
UNIQUE style_name (style_name(255)),
KEY template_id (template_id),
@@ -730,7 +730,7 @@ CREATE TABLE phpbb_styles (
# Table: 'phpbb_styles_template'
CREATE TABLE phpbb_styles_template (
- template_id tinyint(4) NOT NULL auto_increment,
+ template_id smallint(4) UNSIGNED NOT NULL auto_increment,
template_name blob NOT NULL,
template_copyright blob NOT NULL,
template_path varbinary(100) DEFAULT '' NOT NULL,
@@ -743,7 +743,7 @@ CREATE TABLE phpbb_styles_template (
# Table: 'phpbb_styles_template_data'
CREATE TABLE phpbb_styles_template_data (
- template_id tinyint(4) NOT NULL auto_increment,
+ template_id smallint(4) UNSIGNED NOT NULL auto_increment,
template_filename varbinary(100) DEFAULT '' NOT NULL,
template_included blob NOT NULL,
template_mtime int(11) UNSIGNED DEFAULT '0' NOT NULL,
@@ -755,7 +755,7 @@ CREATE TABLE phpbb_styles_template_data (
# Table: 'phpbb_styles_theme'
CREATE TABLE phpbb_styles_theme (
- theme_id tinyint(4) NOT NULL auto_increment,
+ theme_id smallint(4) UNSIGNED NOT NULL auto_increment,
theme_name blob NOT NULL,
theme_copyright blob NOT NULL,
theme_path varbinary(100) DEFAULT '' NOT NULL,
@@ -769,7 +769,7 @@ CREATE TABLE phpbb_styles_theme (
# Table: 'phpbb_styles_imageset'
CREATE TABLE phpbb_styles_imageset (
- imageset_id tinyint(4) NOT NULL auto_increment,
+ imageset_id smallint(4) UNSIGNED NOT NULL auto_increment,
imageset_name blob NOT NULL,
imageset_copyright blob NOT NULL,
imageset_path varbinary(100) DEFAULT '' NOT NULL,
@@ -786,7 +786,7 @@ CREATE TABLE phpbb_styles_imageset_data (
image_lang varbinary(30) DEFAULT '' NOT NULL,
image_height smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
image_width smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
- imageset_id tinyint(4) DEFAULT '0' NOT NULL,
+ imageset_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (image_id),
KEY i_d (imageset_id)
);
@@ -914,7 +914,7 @@ CREATE TABLE phpbb_users (
user_timezone decimal(5,2) DEFAULT '0' NOT NULL,
user_dst tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
user_dateformat varbinary(90) DEFAULT 'd M Y H:i' NOT NULL,
- user_style tinyint(4) DEFAULT '0' NOT NULL,
+ user_style smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
user_rank mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
user_colour varbinary(6) DEFAULT '' NOT NULL,
user_new_privmsg tinyint(4) DEFAULT '0' NOT NULL,
diff --git a/phpBB/install/schemas/mysql_41_schema.sql b/phpBB/install/schemas/mysql_41_schema.sql
index 7fee7f696d..022c3ecbfe 100644
--- a/phpBB/install/schemas/mysql_41_schema.sql
+++ b/phpBB/install/schemas/mysql_41_schema.sql
@@ -228,7 +228,7 @@ CREATE TABLE phpbb_forums (
forum_desc_uid varchar(5) DEFAULT '' NOT NULL,
forum_link varchar(255) DEFAULT '' NOT NULL,
forum_password varchar(40) DEFAULT '' NOT NULL,
- forum_style tinyint(4) DEFAULT '0' NOT NULL,
+ forum_style smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
forum_image varchar(255) DEFAULT '' NOT NULL,
forum_rules text NOT NULL,
forum_rules_link varchar(255) DEFAULT '' NOT NULL,
@@ -303,9 +303,9 @@ CREATE TABLE phpbb_groups (
group_desc_uid varchar(5) DEFAULT '' NOT NULL,
group_display tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
group_avatar varchar(255) DEFAULT '' NOT NULL,
- group_avatar_type tinyint(4) DEFAULT '0' NOT NULL,
- group_avatar_width tinyint(4) DEFAULT '0' NOT NULL,
- group_avatar_height tinyint(4) DEFAULT '0' NOT NULL,
+ group_avatar_type tinyint(2) DEFAULT '0' NOT NULL,
+ group_avatar_width smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
+ group_avatar_height smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
group_rank mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
group_colour varchar(6) DEFAULT '' NOT NULL,
group_sig_chars mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
@@ -713,13 +713,13 @@ CREATE TABLE phpbb_smilies (
# Table: 'phpbb_styles'
CREATE TABLE phpbb_styles (
- style_id tinyint(4) NOT NULL auto_increment,
+ style_id smallint(4) UNSIGNED NOT NULL auto_increment,
style_name varchar(255) DEFAULT '' NOT NULL,
style_copyright varchar(255) DEFAULT '' NOT NULL,
style_active tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
- template_id tinyint(4) DEFAULT '0' NOT NULL,
- theme_id tinyint(4) DEFAULT '0' NOT NULL,
- imageset_id tinyint(4) DEFAULT '0' NOT NULL,
+ template_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
+ theme_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
+ imageset_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (style_id),
UNIQUE style_name (style_name),
KEY template_id (template_id),
@@ -730,7 +730,7 @@ CREATE TABLE phpbb_styles (
# Table: 'phpbb_styles_template'
CREATE TABLE phpbb_styles_template (
- template_id tinyint(4) NOT NULL auto_increment,
+ template_id smallint(4) UNSIGNED NOT NULL auto_increment,
template_name varchar(255) DEFAULT '' NOT NULL,
template_copyright varchar(255) DEFAULT '' NOT NULL,
template_path varchar(100) DEFAULT '' NOT NULL,
@@ -743,7 +743,7 @@ CREATE TABLE phpbb_styles_template (
# Table: 'phpbb_styles_template_data'
CREATE TABLE phpbb_styles_template_data (
- template_id tinyint(4) NOT NULL auto_increment,
+ template_id smallint(4) UNSIGNED NOT NULL auto_increment,
template_filename varchar(100) DEFAULT '' NOT NULL,
template_included text NOT NULL,
template_mtime int(11) UNSIGNED DEFAULT '0' NOT NULL,
@@ -755,7 +755,7 @@ CREATE TABLE phpbb_styles_template_data (
# Table: 'phpbb_styles_theme'
CREATE TABLE phpbb_styles_theme (
- theme_id tinyint(4) NOT NULL auto_increment,
+ theme_id smallint(4) UNSIGNED NOT NULL auto_increment,
theme_name varchar(255) DEFAULT '' NOT NULL,
theme_copyright varchar(255) DEFAULT '' NOT NULL,
theme_path varchar(100) DEFAULT '' NOT NULL,
@@ -769,7 +769,7 @@ CREATE TABLE phpbb_styles_theme (
# Table: 'phpbb_styles_imageset'
CREATE TABLE phpbb_styles_imageset (
- imageset_id tinyint(4) NOT NULL auto_increment,
+ imageset_id smallint(4) UNSIGNED NOT NULL auto_increment,
imageset_name varchar(255) DEFAULT '' NOT NULL,
imageset_copyright varchar(255) DEFAULT '' NOT NULL,
imageset_path varchar(100) DEFAULT '' NOT NULL,
@@ -786,7 +786,7 @@ CREATE TABLE phpbb_styles_imageset_data (
image_lang varchar(30) DEFAULT '' NOT NULL,
image_height smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
image_width smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
- imageset_id tinyint(4) DEFAULT '0' NOT NULL,
+ imageset_id smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (image_id),
KEY i_d (imageset_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;
@@ -914,7 +914,7 @@ CREATE TABLE phpbb_users (
user_timezone decimal(5,2) DEFAULT '0' NOT NULL,
user_dst tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
user_dateformat varchar(30) DEFAULT 'd M Y H:i' NOT NULL,
- user_style tinyint(4) DEFAULT '0' NOT NULL,
+ user_style smallint(4) UNSIGNED DEFAULT '0' NOT NULL,
user_rank mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
user_colour varchar(6) DEFAULT '' NOT NULL,
user_new_privmsg tinyint(4) DEFAULT '0' NOT NULL,
diff --git a/phpBB/install/schemas/oracle_schema.sql b/phpBB/install/schemas/oracle_schema.sql
index 69889a3db2..7dad10dd67 100644
--- a/phpBB/install/schemas/oracle_schema.sql
+++ b/phpBB/install/schemas/oracle_schema.sql
@@ -593,7 +593,7 @@ CREATE TABLE phpbb_groups (
group_desc_uid varchar2(5) DEFAULT '' ,
group_display number(1) DEFAULT '0' NOT NULL,
group_avatar varchar2(255) DEFAULT '' ,
- group_avatar_type number(4) DEFAULT '0' NOT NULL,
+ group_avatar_type number(2) DEFAULT '0' NOT NULL,
group_avatar_width number(4) DEFAULT '0' NOT NULL,
group_avatar_height number(4) DEFAULT '0' NOT NULL,
group_rank number(8) DEFAULT '0' NOT NULL,
diff --git a/phpBB/install/schemas/postgres_schema.sql b/phpBB/install/schemas/postgres_schema.sql
index c49423bcf9..f9b0557d8a 100644
--- a/phpBB/install/schemas/postgres_schema.sql
+++ b/phpBB/install/schemas/postgres_schema.sql
@@ -361,7 +361,7 @@ CREATE TABLE phpbb_forums (
forum_desc_uid varchar(5) DEFAULT '' NOT NULL,
forum_link varchar(255) DEFAULT '' NOT NULL,
forum_password varchar(40) DEFAULT '' NOT NULL,
- forum_style INT2 DEFAULT '0' NOT NULL,
+ forum_style INT2 DEFAULT '0' NOT NULL CHECK (forum_style >= 0),
forum_image varchar(255) DEFAULT '' NOT NULL,
forum_rules varchar(4000) DEFAULT '' NOT NULL,
forum_rules_link varchar(255) DEFAULT '' NOT NULL,
@@ -447,8 +447,8 @@ CREATE TABLE phpbb_groups (
group_display INT2 DEFAULT '0' NOT NULL CHECK (group_display >= 0),
group_avatar varchar(255) DEFAULT '' NOT NULL,
group_avatar_type INT2 DEFAULT '0' NOT NULL,
- group_avatar_width INT2 DEFAULT '0' NOT NULL,
- group_avatar_height INT2 DEFAULT '0' NOT NULL,
+ group_avatar_width INT2 DEFAULT '0' NOT NULL CHECK (group_avatar_width >= 0),
+ group_avatar_height INT2 DEFAULT '0' NOT NULL CHECK (group_avatar_height >= 0),
group_rank INT4 DEFAULT '0' NOT NULL CHECK (group_rank >= 0),
group_colour varchar(6) DEFAULT '' NOT NULL,
group_sig_chars INT4 DEFAULT '0' NOT NULL CHECK (group_sig_chars >= 0),
@@ -946,9 +946,9 @@ CREATE TABLE phpbb_styles (
style_name varchar(255) DEFAULT '' NOT NULL,
style_copyright varchar(255) DEFAULT '' NOT NULL,
style_active INT2 DEFAULT '1' NOT NULL CHECK (style_active >= 0),
- template_id INT2 DEFAULT '0' NOT NULL,
- theme_id INT2 DEFAULT '0' NOT NULL,
- imageset_id INT2 DEFAULT '0' NOT NULL,
+ template_id INT2 DEFAULT '0' NOT NULL CHECK (template_id >= 0),
+ theme_id INT2 DEFAULT '0' NOT NULL CHECK (theme_id >= 0),
+ imageset_id INT2 DEFAULT '0' NOT NULL CHECK (imageset_id >= 0),
PRIMARY KEY (style_id)
);
@@ -1035,7 +1035,7 @@ CREATE TABLE phpbb_styles_imageset_data (
image_lang varchar(30) DEFAULT '' NOT NULL,
image_height INT2 DEFAULT '0' NOT NULL CHECK (image_height >= 0),
image_width INT2 DEFAULT '0' NOT NULL CHECK (image_width >= 0),
- imageset_id INT2 DEFAULT '0' NOT NULL,
+ imageset_id INT2 DEFAULT '0' NOT NULL CHECK (imageset_id >= 0),
PRIMARY KEY (image_id)
);
@@ -1179,7 +1179,7 @@ CREATE TABLE phpbb_users (
user_timezone decimal(5,2) DEFAULT '0' NOT NULL,
user_dst INT2 DEFAULT '0' NOT NULL CHECK (user_dst >= 0),
user_dateformat varchar(30) DEFAULT 'd M Y H:i' NOT NULL,
- user_style INT2 DEFAULT '0' NOT NULL,
+ user_style INT2 DEFAULT '0' NOT NULL CHECK (user_style >= 0),
user_rank INT4 DEFAULT '0' NOT NULL CHECK (user_rank >= 0),
user_colour varchar(6) DEFAULT '' NOT NULL,
user_new_privmsg INT2 DEFAULT '0' NOT NULL,
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index 81e8c3cf80..cce71d0593 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -12,6 +12,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_local
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_remote', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_upload', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_bbcode', '1');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_birthdays', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_bookmarks', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_emailreuse', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_forum_notify', '1');
@@ -205,7 +206,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('topics_per_page',
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 ('version', '3.0.RC3');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.0.RC4');
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');
diff --git a/phpBB/install/schemas/sqlite_schema.sql b/phpBB/install/schemas/sqlite_schema.sql
index 156e4bfc76..90847e9d31 100644
--- a/phpBB/install/schemas/sqlite_schema.sql
+++ b/phpBB/install/schemas/sqlite_schema.sql
@@ -221,7 +221,7 @@ CREATE TABLE phpbb_forums (
forum_desc_uid varchar(5) NOT NULL DEFAULT '',
forum_link varchar(255) NOT NULL DEFAULT '',
forum_password varchar(40) NOT NULL DEFAULT '',
- forum_style tinyint(4) NOT NULL DEFAULT '0',
+ forum_style INTEGER UNSIGNED NOT NULL DEFAULT '0',
forum_image varchar(255) NOT NULL DEFAULT '',
forum_rules text(65535) NOT NULL DEFAULT '',
forum_rules_link varchar(255) NOT NULL DEFAULT '',
@@ -295,9 +295,9 @@ CREATE TABLE phpbb_groups (
group_desc_uid varchar(5) NOT NULL DEFAULT '',
group_display INTEGER UNSIGNED NOT NULL DEFAULT '0',
group_avatar varchar(255) NOT NULL DEFAULT '',
- group_avatar_type tinyint(4) NOT NULL DEFAULT '0',
- group_avatar_width tinyint(4) NOT NULL DEFAULT '0',
- group_avatar_height tinyint(4) NOT NULL DEFAULT '0',
+ group_avatar_type tinyint(2) NOT NULL DEFAULT '0',
+ group_avatar_width INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ group_avatar_height INTEGER UNSIGNED NOT NULL DEFAULT '0',
group_rank INTEGER UNSIGNED NOT NULL DEFAULT '0',
group_colour varchar(6) NOT NULL DEFAULT '',
group_sig_chars INTEGER UNSIGNED NOT NULL DEFAULT '0',
@@ -693,9 +693,9 @@ CREATE TABLE phpbb_styles (
style_name varchar(255) NOT NULL DEFAULT '',
style_copyright varchar(255) NOT NULL DEFAULT '',
style_active INTEGER UNSIGNED NOT NULL DEFAULT '1',
- template_id tinyint(4) NOT NULL DEFAULT '0',
- theme_id tinyint(4) NOT NULL DEFAULT '0',
- imageset_id tinyint(4) NOT NULL DEFAULT '0'
+ template_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ theme_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ imageset_id INTEGER UNSIGNED NOT NULL DEFAULT '0'
);
CREATE UNIQUE INDEX phpbb_styles_style_name ON phpbb_styles (style_name);
@@ -758,7 +758,7 @@ CREATE TABLE phpbb_styles_imageset_data (
image_lang varchar(30) NOT NULL DEFAULT '',
image_height INTEGER UNSIGNED NOT NULL DEFAULT '0',
image_width INTEGER UNSIGNED NOT NULL DEFAULT '0',
- imageset_id tinyint(4) NOT NULL DEFAULT '0'
+ imageset_id INTEGER UNSIGNED NOT NULL DEFAULT '0'
);
CREATE INDEX phpbb_styles_imageset_data_i_d ON phpbb_styles_imageset_data (imageset_id);
@@ -884,7 +884,7 @@ CREATE TABLE phpbb_users (
user_timezone decimal(5,2) NOT NULL DEFAULT '0',
user_dst INTEGER UNSIGNED NOT NULL DEFAULT '0',
user_dateformat varchar(30) NOT NULL DEFAULT 'd M Y H:i',
- user_style tinyint(4) NOT NULL DEFAULT '0',
+ user_style INTEGER UNSIGNED NOT NULL DEFAULT '0',
user_rank INTEGER UNSIGNED NOT NULL DEFAULT '0',
user_colour varchar(6) NOT NULL DEFAULT '',
user_new_privmsg tinyint(4) NOT NULL DEFAULT '0',
diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php
index 90676cf6bc..5d0627475c 100644
--- a/phpBB/language/en/acp/board.php
+++ b/phpBB/language/en/acp/board.php
@@ -55,10 +55,12 @@ $lang = array_merge($lang, array(
'ACP_BOARD_FEATURES_EXPLAIN' => 'Here you can enable/disable several board features.',
'ALLOW_ATTACHMENTS' => 'Allow attachments',
+ 'ALLOW_BIRTHDAYS' => 'Allow birthdays',
+ 'ALLOW_BIRTHDAYS_EXPLAIN' => 'Allow birthdays to be entered and age being displayed in profiles. Please note the birthday list within the board index is controlled by a separate load setting.',
'ALLOW_BOOKMARKS' => 'Allow bookmarking topics',
'ALLOW_BOOKMARKS_EXPLAIN' => 'User is able to store personal bookmarks.',
'ALLOW_BBCODE' => 'Allow BBCode',
- 'ALLOW_FORUM_NOTIFY' => 'Allow forum watching',
+ 'ALLOW_FORUM_NOTIFY' => 'Allow subscribing to forums',
'ALLOW_NAME_CHANGE' => 'Allow username changes',
'ALLOW_NO_CENSORS' => 'Allow disabling of word censoring',
'ALLOW_NO_CENSORS_EXPLAIN' => 'Users can choose to disable the automatic word censoring of posts and private messages.',
@@ -71,7 +73,7 @@ $lang = array_merge($lang, array(
'ALLOW_SIG_LINKS_EXPLAIN' => 'If disallowed the <code>[URL]</code> BBCode tag and automatic/magic URLs are disabled.',
'ALLOW_SIG_SMILIES' => 'Allow use of smilies in user signatures',
'ALLOW_SMILIES' => 'Allow smilies',
- 'ALLOW_TOPIC_NOTIFY' => 'Allow topic watching',
+ 'ALLOW_TOPIC_NOTIFY' => 'Allow subscribing to topics',
'BOARD_PM' => 'Private messaging',
'BOARD_PM_EXPLAIN' => 'Enable or disable private messaging for all users.',
));
@@ -271,6 +273,7 @@ $lang = array_merge($lang, array(
'YES_ANON_READ_MARKING' => 'Enable topic marking for guests',
'YES_ANON_READ_MARKING_EXPLAIN' => 'Stores read/unread status information for guests. If disabled posts are always read for guests.',
'YES_BIRTHDAYS' => 'Enable birthday listing',
+ 'YES_BIRTHDAYS_EXPLAIN' => 'If disabled the birthday listing is no longer displayed. To let this setting take effect the birthday feature need to be enabled too.',
'YES_JUMPBOX' => 'Enable display of jumpbox',
'YES_MODERATORS' => 'Enable display of moderators',
'YES_ONLINE' => 'Enable online user listings',
@@ -376,7 +379,7 @@ $lang = array_merge($lang, array(
// Email Settings
$lang = array_merge($lang, array(
- 'ACP_EMAIL_SETTINGS_EXPLAIN' => 'This information is used when the board sends e-mails to your users. Please ensure the e-mail address you specify is valid, any bounced or undeliverable messages will likely be sent to that address. If your host does not provide a native (PHP based) e-mail service you can instead send messages directly using SMTP. This requires the address of an appropriate server (ask your provider if necessary), do not specify any old name here! If the server requires authentication (and only if it does) enter the necessary username and password. Please note only basic authentication is offered, different authentication implementations are not currently supported.',
+ 'ACP_EMAIL_SETTINGS_EXPLAIN' => 'This information is used when the board sends e-mails to your users. Please ensure the e-mail address you specify is valid, any bounced or undeliverable messages will likely be sent to that address. If your host does not provide a native (PHP based) e-mail service you can instead send messages directly using SMTP. This requires the address of an appropriate server (ask your provider if necessary). If the server requires authentication (and only if it does) enter the necessary username, password and authentication method.',
'ADMIN_EMAIL' => 'Return e-mail address',
'ADMIN_EMAIL_EXPLAIN' => 'This will be used as the return address on all e-mails, the technical contact e-mail address. It will always be used as the <samp>Return-Path</samp> and <samp>Sender</samp> address in e-mails.',
@@ -389,7 +392,7 @@ $lang = array_merge($lang, array(
'EMAIL_FUNCTION_NAME' => 'E-mail function name',
'EMAIL_FUNCTION_NAME_EXPLAIN' => 'The e-mail function used to send mails through PHP.',
'EMAIL_PACKAGE_SIZE' => 'E-mail package size',
- 'EMAIL_PACKAGE_SIZE_EXPLAIN' => 'This is the number of e-mails sent in one package.',
+ 'EMAIL_PACKAGE_SIZE_EXPLAIN' => 'This is the number of maximum e-mails sent out in one package. This setting is applied to the internal message queue; set this value to 0 if you have problems with non-delivered notification emails.',
'EMAIL_SIG' => 'E-mail signature',
'EMAIL_SIG_EXPLAIN' => 'This text will be attached to all e-mails the board sends.',
'ENABLE_EMAIL' => 'Enable board-wide e-mails',
diff --git a/phpBB/language/en/acp/bots.php b/phpBB/language/en/acp/bots.php
index a166142d24..ffc5442482 100644
--- a/phpBB/language/en/acp/bots.php
+++ b/phpBB/language/en/acp/bots.php
@@ -33,7 +33,7 @@ if (empty($lang) || !is_array($lang))
// Bot settings
$lang = array_merge($lang, array(
'BOTS' => 'Manage bots',
- 'BOTS_EXPLAIN' => '&quot;Bots&quot;, &quot;spiders&quot; or &quot;crawlers&quot; are automated agents most commonly used by search engines to update their databases. Since they rarely make proper use of sessions they can distort visitor counts, increase load and sometimes fail to index sites correctly. Here you can define a special type of user to overcome these problems.',
+ 'BOTS_EXPLAIN' => '“Botsâ€, “spiders†or “crawlers†are automated agents most commonly used by search engines to update their databases. Since they rarely make proper use of sessions they can distort visitor counts, increase load and sometimes fail to index sites correctly. Here you can define a special type of user to overcome these problems.',
'BOT_ACTIVATE' => 'Activate',
'BOT_ACTIVE' => 'Bot active',
'BOT_ADD' => 'Add bot',
@@ -51,7 +51,7 @@ $lang = array_merge($lang, array(
'BOT_IP_EXPLAIN' => 'Partial matches are allowed, separate addresses with a comma.',
'BOT_NAME' => 'Bot name',
'BOT_NAME_EXPLAIN' => 'Used only for your own information.',
- 'BOT_NAME_TAKEN' => 'The name is already in use on your board and can\'t be used for the Bot.',
+ 'BOT_NAME_TAKEN' => 'The name is already in use on your board and can’t be used for the Bot.',
'BOT_NEVER' => 'Never',
'BOT_STYLE' => 'Bot style',
'BOT_STYLE_EXPLAIN' => 'The style used for the board by the bot.',
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index 92e6d77dfb..576b87eabd 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -296,6 +296,7 @@ $lang = array_merge($lang, array(
'AVATAR_DIR_SIZE' => 'Avatar directory size',
'BOARD_STARTED' => 'Board started',
+ 'BOARD_VERSION' => 'Board version',
'DATABASE_SERVER_INFO' => 'Database server',
'DATABASE_SIZE' => 'Database size',
@@ -402,6 +403,8 @@ $lang = array_merge($lang, array(
'LOG_ADMIN_AUTH_FAIL' => '<strong>Failed administration login attempt</strong>',
'LOG_ADMIN_AUTH_SUCCESS' => '<strong>Successful administration login</strong>',
+ 'LOG_ATTACHMENTS_DELETED' => '<strong>Removed user attachments</strong><br />» %s',
+
'LOG_ATTACH_EXT_ADD' => '<strong>Added or edited attachment extension</strong><br />» %s',
'LOG_ATTACH_EXT_DEL' => '<strong>Removed attachment extension</strong><br />» %s',
'LOG_ATTACH_EXT_UPDATE' => '<strong>Updated attachment extension</strong><br />» %s',
@@ -523,6 +526,7 @@ $lang = array_merge($lang, array(
'LOG_IMAGESET_EDIT_DETAILS' => '<strong>Edited imageset details</strong><br />» %s',
'LOG_IMAGESET_EDIT' => '<strong>Edited imageset</strong><br />» %s',
'LOG_IMAGESET_EXPORT' => '<strong>Exported imageset</strong><br />» %s',
+ 'LOG_IMAGESET_LANG_MISSING' => '<strong>Imageset misses “%2$s†localisation</strong><br />» %1$s',
'LOG_IMAGESET_LANG_REFRESHED' => '<strong>Refreshed “%2$s†localisation of imageset</strong><br />» %1$s',
'LOG_IMAGESET_REFRESHED' => '<strong>Refreshed imageset</strong><br />» %s',
diff --git a/phpBB/language/en/acp/database.php b/phpBB/language/en/acp/database.php
index 8efeaef978..9d0e5e3cf6 100644
--- a/phpBB/language/en/acp/database.php
+++ b/phpBB/language/en/acp/database.php
@@ -33,7 +33,7 @@ if (empty($lang) || !is_array($lang))
// Database Backup/Restore
$lang = array_merge($lang, array(
'ACP_BACKUP_EXPLAIN' => 'Here you can backup all your phpBB related data. You may store the resulting archive in your <samp>store/</samp> folder or download it directly. Depending on your server configuration you may be able to compress the file in a number of formats.',
- 'ACP_RESTORE_EXPLAIN' => 'This will perform a full restore of all phpBB tables from a saved file. If your server supports it you may use a gzip or bzip2 compressed text file and it will automatically be decompressed. <strong>WARNING</strong> This will overwrite any existing data. The restore may take a long time to process please do not move from this page till it is complete. Backups are stored in the <samp>store/</samp> folder and are assumed to be generated by phpBB\'s backup functionality. Restoring backups that were not created by the built in system may or may not work.',
+ 'ACP_RESTORE_EXPLAIN' => 'This will perform a full restore of all phpBB tables from a saved file. If your server supports it you may use a gzip or bzip2 compressed text file and it will automatically be decompressed. <strong>WARNING</strong> This will overwrite any existing data. The restore may take a long time to process please do not move from this page till it is complete. Backups are stored in the <samp>store/</samp> folder and are assumed to be generated by phpBB’s backup functionality. Restoring backups that were not created by the built in system may or may not work.',
'BACKUP_DELETE' => 'The backup file has been deleted successfully.',
'BACKUP_INVALID' => 'The selected file to backup is invalid.',
diff --git a/phpBB/language/en/acp/forums.php b/phpBB/language/en/acp/forums.php
index 5281651bad..8ad28f175d 100644
--- a/phpBB/language/en/acp/forums.php
+++ b/phpBB/language/en/acp/forums.php
@@ -62,7 +62,7 @@ $lang = array_merge($lang, array(
'ENABLE_TOPIC_ICONS' => 'Enable topic icons',
'FORUM_ADMIN' => 'Forum administration',
- 'FORUM_ADMIN_EXPLAIN' => 'In phpBB3 there are no categories, everything is forum based. Each forum can have an unlimited number of sub-forums and you can determine whether each may be posted to or not (i.e. whether it acts like an old category). Here you can add, edit, delete, lock, unlock individual forums as well as set certain additional controls. If your posts and topics have got out of sync you can also resynchronise a forum.',
+ 'FORUM_ADMIN_EXPLAIN' => 'In phpBB3 there are no categories, everything is forum based. Each forum can have an unlimited number of sub-forums and you can determine whether each may be posted to or not (i.e. whether it acts like an old category). Here you can add, edit, delete, lock, unlock individual forums as well as set certain additional controls. If your posts and topics have got out of sync you can also resynchronise a forum. <strong>You need to copy or set appropriate permissions for newly created forums to have them displayed.</strong>',
'FORUM_AUTO_PRUNE' => 'Enable auto-pruning',
'FORUM_AUTO_PRUNE_EXPLAIN' => 'Prunes the forum of topics, set the frequency/age parameters below.',
'FORUM_CREATED' => 'Forum created successfully.',
@@ -102,6 +102,8 @@ $lang = array_merge($lang, array(
'FORUM_TYPE' => 'Forum type',
'FORUM_UPDATED' => 'Forum information updated successfully.',
+ 'FORUM_WITH_SUBFORUMS_NOT_TO_LINK' => 'You want to change a postable forum having subforums to a link. Please move all subforums out of this forum before you proceed, because after changing to a link you are no longer able to see the subforums currently connected to this forum.',
+
'GENERAL_FORUM_SETTINGS' => 'General forum settings',
'LINK' => 'Link',
@@ -126,7 +128,7 @@ $lang = array_merge($lang, array(
'PRUNE_STICKY' => 'Prune stickies',
'PRUNE_OLD_POLLS' => 'Prune old polls',
'PRUNE_OLD_POLLS_EXPLAIN' => 'Removes topics with polls not voted in for post age days.',
-
+
'REDIRECT_ACL' => 'Now you are able to %sset permissions%s for this forum.',
'SYNC_IN_PROGRESS' => 'Synchronizing forum',
diff --git a/phpBB/language/en/acp/permissions.php b/phpBB/language/en/acp/permissions.php
index ee05c5a568..3deeb344af 100644
--- a/phpBB/language/en/acp/permissions.php
+++ b/phpBB/language/en/acp/permissions.php
@@ -139,6 +139,7 @@ $lang = array_merge($lang, array(
'REMOVE_PERMISSIONS' => 'Remove permissions',
'REMOVE_ROLE' => 'Remove role',
+ 'RESULTING_PERMISSION' => 'Resulting permission',
'ROLE' => 'Role',
'ROLE_ADD_SUCCESS' => 'Role successfully added.',
'ROLE_ASSIGNED_TO' => 'Users/Groups assigned to %s',
@@ -214,27 +215,44 @@ $lang = array_merge($lang, array(
'TRACE_FOR' => 'Trace for',
'TRACE_GLOBAL_SETTING' => '%s (global)',
'TRACE_GROUP_NEVER_TOTAL_NEVER' => 'This group’s permission is set to <samp>NEVER</samp> like the total result so the old result is kept.',
+ 'TRACE_GROUP_NEVER_TOTAL_NEVER_LOCAL' => 'This group’s permission for this forum is set to <samp>NEVER</samp> like the total result so the old result is kept.',
'TRACE_GROUP_NEVER_TOTAL_NO' => 'This group’s permission is set to <samp>NEVER</samp> which becomes the new total value because it wasn’t set yet (set to <samp>NO</samp>).',
+ 'TRACE_GROUP_NEVER_TOTAL_NO_LOCAL' => 'This group’s permission for this forum is set to <samp>NEVER</samp> which becomes the new total value because it wasn’t set yet (set to <samp>NO</samp>).',
'TRACE_GROUP_NEVER_TOTAL_YES' => 'This group’s permission is set to <samp>NEVER</samp> which overwrites the total <samp>YES</samp> to a <samp>NEVER</samp> for this user.',
+ 'TRACE_GROUP_NEVER_TOTAL_YES_LOCAL' => 'This group’s permission for this forum is set to <samp>NEVER</samp> which overwrites the total <samp>YES</samp> to a <samp>NEVER</samp> for this user.',
'TRACE_GROUP_NO' => 'The permission is <samp>NO</samp> for this group so the old total value is kept.',
+ 'TRACE_GROUP_NO_LOCAL' => 'The permission is <samp>NO</samp> for this group within this forum so the old total value is kept.',
'TRACE_GROUP_YES_TOTAL_NEVER' => 'This group’s permission is set to <samp>YES</samp> but the total <samp>NEVER</samp> cannot be overwritten.',
+ 'TRACE_GROUP_YES_TOTAL_NEVER_LOCAL' => 'This group’s permission for this forum is set to <samp>YES</samp> but the total <samp>NEVER</samp> cannot be overwritten.',
'TRACE_GROUP_YES_TOTAL_NO' => 'This group’s permission is set to <samp>YES</samp> which becomes the new total value because it wasn’t set yet (set to <samp>NO</samp>).',
+ 'TRACE_GROUP_YES_TOTAL_NO_LOCAL' => 'This group’s permission for this forum is set to <samp>YES</samp> which becomes the new total value because it wasn’t set yet (set to <samp>NO</samp>).',
'TRACE_GROUP_YES_TOTAL_YES' => 'This group’s permission is set to <samp>YES</samp> and the total permission is already set to <samp>YES</samp>, so the total result is kept.',
+ 'TRACE_GROUP_YES_TOTAL_YES_LOCAL' => 'This group’s permission for this forum is set to <samp>YES</samp> and the total permission is already set to <samp>YES</samp>, so the total result is kept.',
'TRACE_PERMISSION' => 'Trace permission - %s',
+ 'TRACE_RESULT' => 'Trace result',
'TRACE_SETTING' => 'Trace setting',
'TRACE_USER_GLOBAL_YES_TOTAL_YES' => 'The forum independent user permission evaluates to <samp>YES</samp> but the total permission is already set to <samp>YES</samp>, so the total result is kept. %sTrace global permission%s',
'TRACE_USER_GLOBAL_YES_TOTAL_NEVER' => 'The forum independent user permission evaluates to <samp>YES</samp> which overwrites the current local result <samp>NEVER</samp>. %sTrace global permission%s',
'TRACE_USER_GLOBAL_NEVER_TOTAL_KEPT' => 'The forum independent user permission evaluates to <samp>NEVER</samp> which doesn’t influence the local permission. %sTrace global permission%s',
+
'TRACE_USER_FOUNDER' => 'The user has the founder type set, therefore admin permissions are set to <samp>YES</samp> by default.',
- 'TRACE_USER_KEPT' => 'The user permission is <samp>NO</samp> so the old total value is kept.',
- 'TRACE_USER_NEVER_TOTAL_NEVER' => 'The user permission is set to <samp>NEVER</samp> and the total value is set to <samp>NEVER</samp>, so nothing is changed.',
- 'TRACE_USER_NEVER_TOTAL_NO' => 'The user permission is set to <samp>NEVER</samp> which becomes the total value because it was set to NO.',
- 'TRACE_USER_NEVER_TOTAL_YES' => 'The user permission is set to <samp>NEVER</samp> and overwrites the previous <samp>YES</samp>.',
- 'TRACE_USER_NO_TOTAL_NO' => 'The user permission is <samp>NO</samp> and the total value was set to NO so it defaults to <samp>NEVER</samp>.',
- 'TRACE_USER_YES_TOTAL_NEVER' => 'The user permission is set to <samp>YES</samp> but the total <samp>NEVER</samp> cannot be overwritten.',
- 'TRACE_USER_YES_TOTAL_NO' => 'The user permission is set to <samp>YES</samp> which becomes the total value because it was set to <samp>NO</samp>.',
- 'TRACE_USER_YES_TOTAL_YES' => 'The user permission is set to <samp>YES</samp> and the total value is set to <samp>YES</samp>, so nothing is changed.',
+ 'TRACE_USER_KEPT' => 'The user’s permission is <samp>NO</samp> so the old total value is kept.',
+ 'TRACE_USER_KEPT_LOCAL' => 'The user’s permission for this forum is <samp>NO</samp> so the old total value is kept.',
+ 'TRACE_USER_NEVER_TOTAL_NEVER' => 'The user’s permission is set to <samp>NEVER</samp> and the total value is set to <samp>NEVER</samp>, so nothing is changed.',
+ 'TRACE_USER_NEVER_TOTAL_NEVER_LOCAL' => 'The user’s permission for this forum is set to <samp>NEVER</samp> and the total value is set to <samp>NEVER</samp>, so nothing is changed.',
+ 'TRACE_USER_NEVER_TOTAL_NO' => 'The user’s permission is set to <samp>NEVER</samp> which becomes the total value because it was set to NO.',
+ 'TRACE_USER_NEVER_TOTAL_NO_LOCAL' => 'The user’s permission for this forum is set to <samp>NEVER</samp> which becomes the total value because it was set to NO.',
+ 'TRACE_USER_NEVER_TOTAL_YES' => 'The user’s permission is set to <samp>NEVER</samp> and overwrites the previous <samp>YES</samp>.',
+ 'TRACE_USER_NEVER_TOTAL_YES_LOCAL' => 'The user’s permission for this forum is set to <samp>NEVER</samp> and overwrites the previous <samp>YES</samp>.',
+ 'TRACE_USER_NO_TOTAL_NO' => 'The user’s permission is <samp>NO</samp> and the total value was set to NO so it defaults to <samp>NEVER</samp>.',
+ 'TRACE_USER_NO_TOTAL_NO_LOCAL' => 'The user’s permission for this forum is <samp>NO</samp> and the total value was set to NO so it defaults to <samp>NEVER</samp>.',
+ 'TRACE_USER_YES_TOTAL_NEVER' => 'The user’s permission is set to <samp>YES</samp> but the total <samp>NEVER</samp> cannot be overwritten.',
+ 'TRACE_USER_YES_TOTAL_NEVER_LOCAL' => 'The user’s permission for this forum is set to <samp>YES</samp> but the total <samp>NEVER</samp> cannot be overwritten.',
+ 'TRACE_USER_YES_TOTAL_NO' => 'The user’s permission is set to <samp>YES</samp> which becomes the total value because it was set to <samp>NO</samp>.',
+ 'TRACE_USER_YES_TOTAL_NO_LOCAL' => 'The user’s permission for this forum is set to <samp>YES</samp> which becomes the total value because it was set to <samp>NO</samp>.',
+ 'TRACE_USER_YES_TOTAL_YES' => 'The user’s permission is set to <samp>YES</samp> and the total value is set to <samp>YES</samp>, so nothing is changed.',
+ 'TRACE_USER_YES_TOTAL_YES_LOCAL' => 'The user’s permission for this forum is set to <samp>YES</samp> and the total value is set to <samp>YES</samp>, so nothing is changed.',
'TRACE_WHO' => 'Who',
'TRACE_TOTAL' => 'Total',
diff --git a/phpBB/language/en/acp/permissions_phpbb.php b/phpBB/language/en/acp/permissions_phpbb.php
index 00c53257ad..6579f23018 100644
--- a/phpBB/language/en/acp/permissions_phpbb.php
+++ b/phpBB/language/en/acp/permissions_phpbb.php
@@ -78,17 +78,21 @@ $lang = array_merge($lang, array(
'user_group' => 'Users &amp; Groups',
),
+ // With defining 'global' here we are able to specify what is printed out if the permission is within the global scope.
'permission_type' => array(
'u_' => 'User permissions',
'a_' => 'Admin permissions',
'm_' => 'Moderator permissions',
'f_' => 'Forum permissions',
+ 'global' => array(
+ 'm_' => 'Global moderator permissions',
+ ),
),
));
// User Permissions
$lang = array_merge($lang, array(
- 'acl_u_viewprofile' => array('lang' => 'Can view profiles', 'cat' => 'profile'),
+ 'acl_u_viewprofile' => array('lang' => 'Can view profiles, memberlist and online list', 'cat' => 'profile'),
'acl_u_chgname' => array('lang' => 'Can change username', 'cat' => 'profile'),
'acl_u_chgpasswd' => array('lang' => 'Can change password', 'cat' => 'profile'),
'acl_u_chgemail' => array('lang' => 'Can change e-mail address', 'cat' => 'profile'),
@@ -175,8 +179,8 @@ $lang = array_merge($lang, array(
'acl_m_merge' => array('lang' => 'Can merge topics', 'cat' => 'topic_actions'),
'acl_m_info' => array('lang' => 'Can view post details', 'cat' => 'misc'),
- 'acl_m_warn' => array('lang' => 'Can issue warnings', 'cat' => 'misc'), // This moderator setting is only global (and not local)
- 'acl_m_ban' => array('lang' => 'Can manage bans', 'cat' => 'misc'), // This moderator setting is only global (and not local)
+ 'acl_m_warn' => array('lang' => 'Can issue warnings<br /><em>This setting is only assigned globally. It is not forum based.</em>', 'cat' => 'misc'), // This moderator setting is only global (and not local)
+ 'acl_m_ban' => array('lang' => 'Can manage bans<br /><em>This setting is only assigned globally. It is not forum based.</em>', 'cat' => 'misc'), // This moderator setting is only global (and not local)
));
// Admin Permissions
@@ -196,7 +200,7 @@ $lang = array_merge($lang, array(
'acl_a_bbcode' => array('lang' => 'Can define BBCode tags', 'cat' => 'posting'),
'acl_a_attach' => array('lang' => 'Can alter attachment related settings', 'cat' => 'posting'),
- 'acl_a_user' => array('lang' => 'Can manage users', 'cat' => 'user_group'),
+ 'acl_a_user' => array('lang' => 'Can manage users<br /><em>This also includes seeing the users browser agent within the viewonline list.</em>', 'cat' => 'user_group'),
'acl_a_userdel' => array('lang' => 'Can delete/prune users', 'cat' => 'user_group'),
'acl_a_group' => array('lang' => 'Can manage groups', 'cat' => 'user_group'),
'acl_a_groupadd' => array('lang' => 'Can add new groups', 'cat' => 'user_group'),
diff --git a/phpBB/language/en/acp/posting.php b/phpBB/language/en/acp/posting.php
index 1644e1393b..bededcf947 100644
--- a/phpBB/language/en/acp/posting.php
+++ b/phpBB/language/en/acp/posting.php
@@ -56,12 +56,12 @@ $lang = array_merge($lang, array(
'EXAMPLES' => 'Examples:',
'HTML_REPLACEMENT' => 'HTML replacement',
- 'HTML_REPLACEMENT_EXAMPLE' => '&lt;span style="background-color:{COLOR};"&gt;{TEXT}&lt;/span&gt;<br /><br />&lt;span style="font-family:{TEXT1};"&gt;{TEXT2}&lt;/span&gt;',
+ 'HTML_REPLACEMENT_EXAMPLE' => '&lt;span style="background-color: {COLOR};"&gt;{TEXT}&lt;/span&gt;<br /><br />&lt;span style="font-family: {TEXT1};"&gt;{TEXT2}&lt;/span&gt;',
'HTML_REPLACEMENT_EXPLAIN' => 'Here you define the default HTML replacement. Do not forget to put back tokens you used above!',
'TOKEN' => 'Token',
'TOKENS' => 'Tokens',
- 'TOKENS_EXPLAIN' => 'Tokens are placeholders for user input. The input will be validated only if it matches the corresponding definition. If needed, you can number them by adding a number as the last character between the braces, e.g. {USERNAME1}, {USERNAME2}.<br /><br />In addition to these tokens you can use any language string present in your language/ directory like this: {L_<em>&lt;STRINGNAME&gt;</em>} where <em>&lt;STRINGNAME&gt;</em> is the name of the translated string you want to add. For example, {L_WROTE} will be displayed as &quot;wrote&quot; or its translation according to user’s locale.',
+ 'TOKENS_EXPLAIN' => 'Tokens are placeholders for user input. The input will be validated only if it matches the corresponding definition. If needed, you can number them by adding a number as the last character between the braces, e.g. {TEXT1}, {TEXT2}.<br /><br />Within the HTML replacement you can also use any language string present in your language/ directory like this: {L_<em>&lt;STRINGNAME&gt;</em>} where <em>&lt;STRINGNAME&gt;</em> is the name of the translated string you want to add. For example, {L_WROTE} will be displayed as &quot;wrote&quot; or its translation according to user’s locale.<br /><br /><strong>Please note that only tokens listed below are able to be used within custom BBCodes.</strong>',
'TOKEN_DEFINITION' => 'What can it be?',
'TOO_MANY_BBCODES' => 'You cannot create any more BBCodes. Please remove one or more BBCodes then try again.',
@@ -69,7 +69,7 @@ $lang = array_merge($lang, array(
'TEXT' => 'Any text, including foreign characters, numbers, etc…',
'NUMBER' => 'Any series of digits',
'EMAIL' => 'A valid e-mail address',
- 'URL' => 'A valid URL using any protocol (http, ftp, etc… cannot be used for javascript exploits). If none is given, "http://" is prefixed to the string.',
+ 'URL' => 'A valid URL using any protocol (http, ftp, etc… cannot be used for javascript exploits). If none is given, &quot;http://&quot; is prefixed to the string.',
'LOCAL_URL' => 'A local URL. The URL must be relative to the topic page and cannot contain a server name or protocol.',
'COLOR' => 'A HTML colour, can be either in the numeric form <samp>#FF1234</samp> or a <a href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS colour keyword</a> such as <samp>fuchsia</samp> or <samp>InactiveBorder</samp>'
)
@@ -162,7 +162,7 @@ $lang = array_merge($lang, array(
// Word censors
$lang = array_merge($lang, array(
- 'ACP_WORDS_EXPLAIN' => 'From this control panel you can add, edit, and remove words that will be automatically censored on your forums. In addition people will not be allowed to register with usernames containing these words. Wildcards (*) are accepted in the word field, eg. *test* will match detestable, test* would match testing, *test would match detest.',
+ 'ACP_WORDS_EXPLAIN' => 'From this control panel you can add, edit, and remove words that will be automatically censored on your forums. In addition people will not be allowed to register with usernames containing these words. Wildcards (*) are accepted in the word field, e.g. *test* will match detestable, test* would match testing, *test would match detest.',
'ADD_WORD' => 'Add new word',
'EDIT_WORD' => 'Edit word censor',
diff --git a/phpBB/language/en/acp/profile.php b/phpBB/language/en/acp/profile.php
index 24e7b732f2..15fe8391cd 100644
--- a/phpBB/language/en/acp/profile.php
+++ b/phpBB/language/en/acp/profile.php
@@ -38,7 +38,7 @@ $lang = array_merge($lang, array(
'ALWAYS_TODAY' => 'Always the current date',
'BOOL_ENTRIES_EXPLAIN' => 'Enter your options now',
- 'BOOL_TYPE_EXPLAIN' => 'Define the type, either a checkbox or radio buttons.',
+ 'BOOL_TYPE_EXPLAIN' => 'Define the type, either a checkbox or radio buttons. A checkbox will only be displayed if it is checked for a given user. In that case the <strong>second</strong> language option will be used. Radio buttons will display regardless of their value.',
'CHANGED_PROFILE_FIELD' => 'Successfully changed profile field.',
'CHARS_ANY' => 'Any character',
@@ -62,7 +62,7 @@ $lang = array_merge($lang, array(
'DISPLAY_AT_REGISTER' => 'Display at registration screen',
'DISPLAY_AT_REGISTER_EXPLAIN' => 'If this option is enabled, the field will be displayed on registration and able to be changed within the user control panel.',
'DISPLAY_PROFILE_FIELD' => 'Display profile field',
- 'DISPLAY_PROFILE_FIELD_EXPLAIN' => 'The profile field will be shown on topic pages, profiles and the memberlist if this is enabled within the load settings. Only showing within the users profile is enabled by default.',
+ 'DISPLAY_PROFILE_FIELD_EXPLAIN' => 'The profile field will be shown in all places allowed within the load settings. Setting this to “no†will hide the field from topic pages, profiles and the memberlist.',
'DROPDOWN_ENTRIES_EXPLAIN' => 'Enter your options now, every option in one line.',
'EDIT_DROPDOWN_LANG_EXPLAIN' => 'Please note that you are able to change your options text and also able to add new options to the end. It is not advised to add new options between existing options - this could result in wrong options assigned to your users. This can also happen if you remove options in-between. Removing options from the end result in users having assigned this item now reverting back to the default one.',
diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php
index 3367f63e48..2d6019c3d4 100644
--- a/phpBB/language/en/acp/search.php
+++ b/phpBB/language/en/acp/search.php
@@ -52,7 +52,7 @@ $lang = array_merge($lang, array(
'FULLTEXT_MYSQL_TOTAL_POSTS' => 'Total number of indexed posts',
'FULLTEXT_MYSQL_MBSTRING' => 'Support for non-latin UTF-8 characters using mbstring:',
'FULLTEXT_MYSQL_PCRE' => 'Support for non-latin UTF-8 characters using PCRE:',
- 'FULLTEXT_MYSQL_MBSTRING_EXPLAIN' => 'If PCRE does not have unicode character properties, the search backend will try to use mbstring\'s regular expression engine.',
+ 'FULLTEXT_MYSQL_MBSTRING_EXPLAIN' => 'If PCRE does not have unicode character properties, the search backend will try to use mbstring’s regular expression engine.',
'FULLTEXT_MYSQL_PCRE_EXPLAIN' => 'This search backend requires PCRE unicode character properties, only available in PHP 4.4, 5.1 and above, if you want to search for non-latin characters.',
'GENERAL_SEARCH_SETTINGS' => 'General search settings',
diff --git a/phpBB/language/en/acp/styles.php b/phpBB/language/en/acp/styles.php
index 4f7472e5ff..4be2e79982 100644
--- a/phpBB/language/en/acp/styles.php
+++ b/phpBB/language/en/acp/styles.php
@@ -97,6 +97,7 @@ $lang = array_merge($lang, array(
'EDIT_THEME' => 'Edit theme',
'EDIT_THEME_EXPLAIN' => 'Here you can edit the selected theme, changing colours, images, etc.',
'EDIT_THEME_STORED_DB' => 'The stylesheet file was unwritable so the stylesheet is now stored in the database containing your modification.',
+ 'EDIT_THEME_STORE_PARSED' => 'The theme requires that its stylesheet is parsed. This is only possible if it’s stored in the database.',
'EXPORT' => 'Export',
'FOREGROUND' => 'Foreground',
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index 9d2755667d..fe528d48fe 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -294,6 +294,7 @@ $lang = array_merge($lang, array(
'LOGIN_INFO' => 'In order to login you must be registered. Registering takes only a few moments but gives you increased capabilities. The board administrator may also grant additional permissions to registered users. Before you register please ensure you are familiar with our terms of use and related policies. Please ensure you read any forum rules as you navigate around the board.',
'LOGIN_VIEWFORUM' => 'The board requires you to be registered and logged in to view this forum.',
'LOGIN_EXPLAIN_EDIT' => 'In order to edit posts in this forum you have to be registered and logged in.',
+ 'LOGIN_EXPLAIN_VIEWONLINE' => 'In order to view the online list you have to be registered and logged in.',
'LOGOUT' => 'Logout',
'LOGOUT_USER' => 'Logout [ %s ]',
'LOG_ME_IN' => 'Log me on automatically each visit',
@@ -320,7 +321,7 @@ $lang = array_merge($lang, array(
'MSNM' => 'MSNM/WLM',
'NA' => 'N/A',
- 'NEWEST_USER' => 'Our newest member <strong>%s%s%s</strong>',
+ 'NEWEST_USER' => 'Our newest member <strong>%s</strong>',
'NEW_MESSAGE' => 'New message',
'NEW_MESSAGES' => 'New messages',
'NEW_PM' => '<strong>%d</strong> new message',
@@ -590,8 +591,8 @@ $lang = array_merge($lang, array(
'UNREAD_MESSAGES' => 'Unread messages',
'UNREAD_PM' => '<strong>%d</strong> unread message',
'UNREAD_PMS' => '<strong>%d</strong> unread messages',
- 'UNWATCHED_FORUMS' => 'You are no longer watching the selected forums.',
- 'UNWATCHED_TOPICS' => 'You are no longer watching the selected topics.',
+ 'UNWATCHED_FORUMS' => 'You are no longer subscribed to the selected forums.',
+ 'UNWATCHED_TOPICS' => 'You are no longer subscribed to the selected topics.',
'UPDATE' => 'Update',
'UPLOAD_IN_PROGRESS' => 'The upload is currently in progress.',
'URL_REDIRECT' => 'If your browser does not support meta redirection %splease click HERE to be redirected%s.',
@@ -645,6 +646,7 @@ $lang = array_merge($lang, array(
'WRONG_DATA_JABBER' => 'The name you entered is not a valid Jabber account name.',
'WRONG_DATA_LANG' => 'The language you specified is not valid.',
'WRONG_DATA_WEBSITE' => 'The website address has to be a valid URL, including the protocol. For example http://www.example.com/.',
+ 'WROTE' => 'wrote',
'YEAR' => 'Year',
'YEAR_MONTH_DAY' => '(YYYY-MM-DD)',
diff --git a/phpBB/language/en/help_bbcode.php b/phpBB/language/en/help_bbcode.php
index 8c7b4c2329..5ffe3ac742 100644
--- a/phpBB/language/en/help_bbcode.php
+++ b/phpBB/language/en/help_bbcode.php
@@ -32,7 +32,7 @@ $help = array(
),
array(
0 => 'What is BBCode?',
- 1 => 'BBCode is a special implementation of HTML. Whether you can actually use BBCode in your posts on the forum is determined by the administrator. In addition you can disable BBCode on a per post basis via the posting form. BBCode itself is similar in style to HTML, tags are enclosed in square braces [ and ] rather than &lt; and &gt; and it offers greater control over what and how something is displayed. Depending on the template you are using you may find adding BBCode to your posts is made much easier through a clickable interface above the message area on the posting form. Even with this you may find the following guide useful.'
+ 1 => 'BBCode is a special implementation of HTML. Whether you can actually use BBCode in your posts on the forum is determined by the administrator. In addition you can disable BBCode on a per post basis via the posting form. BBCode itself is similar in style to HTML, tags are enclosed in square brackets [ and ] rather than &lt; and &gt; and it offers greater control over what and how something is displayed. Depending on the template you are using you may find adding BBCode to your posts is made much easier through a clickable interface above the message area on the posting form. Even with this you may find the following guide useful.'
),
array(
0 => '--',
@@ -40,15 +40,15 @@ $help = array(
),
array(
0 => 'How to create bold, italic and underlined text',
- 1 => 'BBCode includes tags to allow you to quickly change the basic style of your text. This is achieved in the following ways: <ul><li>To make a piece of text bold enclose it in <strong>[b][/b]</strong>, eg. <br /><br /><strong>[b]</strong>Hello<strong>[/b]</strong><br /><br />will become <strong>Hello</strong></li><li>For underlining use <strong>[u][/u]</strong>, for example:<br /><br /><strong>[u]</strong>Good Morning<strong>[/u]</strong><br /><br />becomes <span style="text-decoration: underline">Good Morning</span></li><li>To italicise text use <strong>[i][/i]</strong>, eg.<br /><br />This is <strong>[i]</strong>Great!<strong>[/i]</strong><br /><br />would give This is <i>Great!</i></li></ul>'
+ 1 => 'BBCode includes tags to allow you to quickly change the basic style of your text. This is achieved in the following ways: <ul><li>To make a piece of text bold enclose it in <strong>[b][/b]</strong>, e.g. <br /><br /><strong>[b]</strong>Hello<strong>[/b]</strong><br /><br />will become <strong>Hello</strong></li><li>For underlining use <strong>[u][/u]</strong>, for example:<br /><br /><strong>[u]</strong>Good Morning<strong>[/u]</strong><br /><br />becomes <span style="text-decoration: underline">Good Morning</span></li><li>To italicise text use <strong>[i][/i]</strong>, e.g.<br /><br />This is <strong>[i]</strong>Great!<strong>[/i]</strong><br /><br />would give This is <i>Great!</i></li></ul>'
),
array(
0 => 'How to change the text colour or size',
- 1 => 'To alter the colour or size of your text the following tags can be used. Keep in mind that how the output appears will depend on the viewers browser and system: <ul><li>Changing the colour of text is achieved by wrapping it in <strong>[color=][/color]</strong>. You can specify either a recognised colour name (eg. red, blue, yellow, etc.) or the hexadecimal triplet alternative, eg. #FFFFFF, #000000. For example, to create red text you could use:<br /><br /><strong>[color=red]</strong>Hello!<strong>[/color]</strong><br /><br />or<br /><br /><strong>[color=#FF0000]</strong>Hello!<strong>[/color]</strong><br /><br />will both output <span style="color:red">Hello!</span></li><li>Changing the text size is achieved in a similar way using <strong>[size=][/size]</strong>. This tag is dependent on the template the user has selected but the recommended format is a numerical value representing the text size in percent, starting at 20 through to 200 (very large) by default. For example:<br /><br /><strong>[size=30]</strong>SMALL<strong>[/size]</strong><br /><br />will generally be <span style="font-size:30%;">SMALL</span><br /><br />whereas:<br /><br /><strong>[size=200]</strong>HUGE!<strong>[/size]</strong><br /><br />will be <span style="font-size:200%;">HUGE!</span></li></ul>'
+ 1 => 'To alter the colour or size of your text the following tags can be used. Keep in mind that how the output appears will depend on the viewers browser and system: <ul><li>Changing the colour of text is achieved by wrapping it in <strong>[color=][/color]</strong>. You can specify either a recognised colour name (eg. red, blue, yellow, etc.) or the hexadecimal triplet alternative, e.g. #FFFFFF, #000000. For example, to create red text you could use:<br /><br /><strong>[color=red]</strong>Hello!<strong>[/color]</strong><br /><br />or<br /><br /><strong>[color=#FF0000]</strong>Hello!<strong>[/color]</strong><br /><br />Both will output <span style="color:red">Hello!</span></li><li>Changing the text size is achieved in a similar way using <strong>[size=][/size]</strong>. This tag is dependent on the template the user has selected but the recommended format is a numerical value representing the text size in percent, starting at 20 (very small) through to 200 (very large) by default. For example:<br /><br /><strong>[size=30]</strong>SMALL<strong>[/size]</strong><br /><br />will generally be <span style="font-size:30%;">SMALL</span><br /><br />whereas:<br /><br /><strong>[size=200]</strong>HUGE!<strong>[/size]</strong><br /><br />will be <span style="font-size:200%;">HUGE!</span></li></ul>'
),
array(
0 => 'Can I combine formatting tags?',
- 1 => 'Yes, of course you can, for example to get someones attention you may write:<br /><br /><strong>[size=150][color=red][b]</strong>LOOK AT ME!<strong>[/b][/color][/size]</strong><br /><br />this would output <span style="color:red;font-size:250%;"><strong>LOOK AT ME!</strong></span><br /><br />We don’t recommend you output lots of text that looks like this though! Remember it is up to you, the poster to ensure tags are closed correctly. For example the following is incorrect:<br /><br /><strong>[b][u]</strong>This is wrong<strong>[/b][/u]</strong>'
+ 1 => 'Yes, of course you can, for example to get someones attention you may write:<br /><br /><strong>[size=200][color=red][b]</strong>LOOK AT ME!<strong>[/b][/color][/size]</strong><br /><br />this would output <span style="color:red;font-size:200%;"><strong>LOOK AT ME!</strong></span><br /><br />We don’t recommend you output lots of text that looks like this though! Remember it is up to you, the poster, to ensure tags are closed correctly. For example the following is incorrect:<br /><br /><strong>[b][u]</strong>This is wrong<strong>[/b][/u]</strong>'
),
array(
0 => '--',
@@ -56,23 +56,23 @@ $help = array(
),
array(
0 => 'Quoting text in replies',
- 1 => 'There are two ways you can quote text, with a reference or without.<ul><li>When you utilise the Quote function to reply to a post on the board you should notice that the post text is added to the message window enclosed in a <strong>[quote=&quot;&quot;][/quote]</strong> block. This method allows you to quote with a reference to a person or whatever else you choose to put! For example to quote a piece of text Mr. Blobby wrote you would enter:<br /><br /><strong>[quote=&quot;Mr. Blobby&quot;]</strong>The text Mr. Blobby wrote would go here<strong>[/quote]</strong><br /><br />The resulting output will automatically add, Mr. Blobby wrote: before the actual text. Remember you <strong>must</strong> include the quotation marks &quot;&quot; around the name you are quoting, they are not optional.</li><li>The second method allows you to blindly quote something. To utilise this enclose the text in <strong>[quote][/quote]</strong> tags. When you view the message it will simply show the text within a quotation block.</li></ul>'
+ 1 => 'There are two ways you can quote text, with a reference or without.<ul><li>When you utilise the Quote function to reply to a post on the board you should notice that the post text is added to the message window enclosed in a <strong>[quote=&quot;&quot;][/quote]</strong> block. This method allows you to quote with a reference to a person or whatever else you choose to put! For example to quote a piece of text Mr. Blobby wrote you would enter:<br /><br /><strong>[quote=&quot;Mr. Blobby&quot;]</strong>The text Mr. Blobby wrote would go here<strong>[/quote]</strong><br /><br />The resulting output will automatically add &quot;Mr. Blobby wrote:&quot; before the actual text. Remember you <strong>must</strong> include the quotation marks &quot;&quot; around the name you are quoting, they are not optional.</li><li>The second method allows you to blindly quote something. To utilise this enclose the text in <strong>[quote][/quote]</strong> tags. When you view the message it will simply show the text within a quotation block.</li></ul>'
),
array(
0 => 'Outputting code or fixed width data',
- 1 => 'If you want to output a piece of code or in fact anything that requires a fixed width, eg. Courier type font you should enclose the text in <strong>[code][/code]</strong> tags, eg.<br /><br /><strong>[code]</strong>echo &quot;This is some code&quot;;<strong>[/code]</strong><br /><br />All formatting used within <strong>[code][/code]</strong> tags is retained when you later view it. PHP syntax highlighting can be enabled using <strong>[code=php][/code]</strong> and is recommended when posting PHP code samples as it improves readability.'
+ 1 => 'If you want to output a piece of code or in fact anything that requires a fixed width, e.g. Courier type font you should enclose the text in <strong>[code][/code]</strong> tags, e.g.<br /><br /><strong>[code]</strong>echo &quot;This is some code&quot;;<strong>[/code]</strong><br /><br />All formatting used within <strong>[code][/code]</strong> tags is retained when you later view it. PHP syntax highlighting can be enabled using <strong>[code=php][/code]</strong> and is recommended when posting PHP code samples as it improves readability.'
),
array(
0 => '--',
1 => 'Generating lists'
),
array(
- 0 => 'Creating an Un-ordered list',
+ 0 => 'Creating an Unordered list',
1 => 'BBCode supports two types of lists, unordered and ordered. They are essentially the same as their HTML equivalents. An unordered list outputs each item in your list sequentially one after the other indenting each with a bullet character. To create an unordered list you use <strong>[list][/list]</strong> and define each item within the list using <strong>[*]</strong>. For example to list your favourite colours you could use:<br /><br /><strong>[list]</strong><br /><strong>[*]</strong>Red<br /><strong>[*]</strong>Blue<br /><strong>[*]</strong>Yellow<br /><strong>[/list]</strong><br /><br />This would generate the following list:<ul><li>Red</li><li>Blue</li><li>Yellow</li></ul>'
),
array(
0 => 'Creating an Ordered list',
- 1 => 'The second type of list, an ordered list gives you control over what is output before each item. To create an ordered list you use <strong>[list=1][/list]</strong> to create a numbered list or alternatively <strong>[list=a][/list]</strong> for an alphabetical list. As with the unordered list items are specified using <strong>[*]</strong>. For example:<br /><br /><strong>[list=1]</strong><br /><strong>[*]</strong>Go to the shops<br /><strong>[*]</strong>Buy a new computer<br /><strong>[*]</strong>Swear at computer when it crashes<br /><strong>[/list]</strong><br /><br />will generate the following:<ol style="list-style-type: arabic-numbers"><li>Go to the shops</li><li>Buy a new computer</li><li>Swear at computer when it crashes</li></ol>Whereas for an alphabetical list you would use:<br /><br /><strong>[list=a]</strong><br /><strong>[*]</strong>The first possible answer<br /><strong>[*]</strong>The second possible answer<br /><strong>[*]</strong>The third possible answer<br /><strong>[/list]</strong><br /><br />giving<ol style="list-style-type: lower-alpha"><li>The first possible answer</li><li>The second possible answer</li><li>The third possible answer</li></ol>'
+ 1 => 'The second type of list, an ordered list, gives you control over what is output before each item. To create an ordered list you use <strong>[list=1][/list]</strong> to create a numbered list or alternatively <strong>[list=a][/list]</strong> for an alphabetical list. As with the unordered list, items are specified using <strong>[*]</strong>. For example:<br /><br /><strong>[list=1]</strong><br /><strong>[*]</strong>Go to the shops<br /><strong>[*]</strong>Buy a new computer<br /><strong>[*]</strong>Swear at computer when it crashes<br /><strong>[/list]</strong><br /><br />will generate the following:<ol style="list-style-type: arabic-numbers"><li>Go to the shops</li><li>Buy a new computer</li><li>Swear at computer when it crashes</li></ol>Whereas for an alphabetical list you would use:<br /><br /><strong>[list=a]</strong><br /><strong>[*]</strong>The first possible answer<br /><strong>[*]</strong>The second possible answer<br /><strong>[*]</strong>The third possible answer<br /><strong>[/list]</strong><br /><br />giving<ol style="list-style-type: lower-alpha"><li>The first possible answer</li><li>The second possible answer</li><li>The third possible answer</li></ol>'
),
array(
0 => '--',
@@ -80,7 +80,7 @@ $help = array(
),
array(
0 => 'Linking to another site',
- 1 => 'phpBB BBCode supports a number of ways of creating URIs, Uniform Resource Indicators better known as URLs.<ul><li>The first of these uses the <strong>[url=][/url]</strong> tag, whatever you type after the = sign will cause the contents of that tag to act as a URL. For example to link to phpBB.com you could use:<br /><br /><strong>[url=http://www.phpbb.com/]</strong>Visit phpBB!<strong>[/url]</strong><br /><br />This would generate the following link, <a href="http://www.phpbb.com/">Visit phpBB!</a> Please notice that the link opens in the same window or a new window depending on the users browser preferences.</li><li>If you want the URL itself displayed as the link you can do this by simply using:<br /><br /><strong>[url]</strong>http://www.phpbb.com/<strong>[/url]</strong><br /><br />This would generate the following link, <a href="http://www.phpbb.com/">http://www.phpbb.com/</a></li><li>Additionally phpBB features something called <i>Magic Links</i>, this will turn any syntactically correct URL into a link without you needing to specify any tags or even the leading http://. For example typing www.phpbb.com into your message will automatically lead to <a href="http://www.phpbb.com/">www.phpbb.com</a> being output when you view the message.</li><li>The same thing applies equally to e-mail addresses, you can either specify an address explicitly for example:<br /><br /><strong>[email]</strong>no.one@domain.adr<strong>[/email]</strong><br /><br />which will output <a href="mailto:no.one@domain.adr">no.one@domain.adr</a> or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.</li></ul>As with all the BBCode tags you can wrap URLs around any of the other tags such as <strong>[img][/img]</strong> (see next entry), <strong>[b][/b]</strong>, etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:<br /><br /><strong>[url=http://www.google.com/][img]</strong>http://www.google.com/intl/en_ALL/images/logo.gif<strong>[/url][/img]</strong><br /><br />is <span style="text-decoration: underline">not</span> correct which may lead to your post being deleted so take care.'
+ 1 => 'phpBB BBCode supports a number of ways of creating URIs (Uniform Resource Indicators) better known as URLs.<ul><li>The first of these uses the <strong>[url=][/url]</strong> tag, whatever you type after the = sign will cause the contents of that tag to act as a URL. For example to link to phpBB.com you could use:<br /><br /><strong>[url=http://www.phpbb.com/]</strong>Visit phpBB!<strong>[/url]</strong><br /><br />This would generate the following link, <a href="http://www.phpbb.com/">Visit phpBB!</a> Please notice that the link opens in the same window or a new window depending on the users browser preferences.</li><li>If you want the URL itself displayed as the link you can do this by simply using:<br /><br /><strong>[url]</strong>http://www.phpbb.com/<strong>[/url]</strong><br /><br />This would generate the following link, <a href="http://www.phpbb.com/">http://www.phpbb.com/</a></li><li>Additionally, phpBB features something called <i>Magic Links</i>, this will turn any syntactically correct URL into a link without you needing to specify any tags or even the leading http://. For example typing www.phpbb.com into your message will automatically lead to <a href="http://www.phpbb.com/">www.phpbb.com</a> being output when you view the message.</li><li>The same thing applies equally to e-mail addresses, you can either specify an address explicitly for example:<br /><br /><strong>[email]</strong>no.one@domain.adr<strong>[/email]</strong><br /><br />which will output <a href="mailto:no.one@domain.adr">no.one@domain.adr</a> or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.</li></ul>As with all the BBCode tags you can wrap URLs around any of the other tags such as <strong>[img][/img]</strong> (see next entry), <strong>[b][/b]</strong>, etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:<br /><br /><strong>[url=http://www.google.com/][img]</strong>http://www.google.com/intl/en_ALL/images/logo.gif<strong>[/url][/img]</strong><br /><br />is <span style="text-decoration: underline">not</span> correct which may lead to your post being deleted so take care.'
),
array(
0 => '--',
@@ -88,11 +88,11 @@ $help = array(
),
array(
0 => 'Adding an image to a post',
- 1 => 'phpBB BBCode incorporates a tag for including images in your posts. Two very important things to remember when using this tag are; many users do not appreciate lots of images being shown in posts and secondly the image you display must already be available on the internet (it cannot exist only on your computer for example, unless you run a webserver!). To display an image you must surround the URL pointing to the image with <strong>[img][/img]</strong> tags. For example:<br /><br /><strong>[img]</strong>http://www.google.com/intl/en_ALL/images/logo.gif<strong>[/img]</strong><br /><br />As noted in the URL section above you can wrap an image in a <strong>[url][/url]</strong> tag if you wish, eg.<br /><br /><strong>[url=http://www.google.com/][img]</strong>http://www.google.com/intl/en_ALL/images/logo.gif<strong>[/img][/url]</strong><br /><br />would generate:<br /><br /><a href="http://www.google.com/"><img src="http://www.google.com/intl/en_ALL/images/logo.gif" alt="" /></a>'
+ 1 => 'phpBB BBCode incorporates a tag for including images in your posts. Two very important things to remember when using this tag are: many users do not appreciate lots of images being shown in posts and secondly the image you display must already be available on the internet (it cannot exist only on your computer for example, unless you run a webserver!). To display an image you must surround the URL pointing to the image with <strong>[img][/img]</strong> tags. For example:<br /><br /><strong>[img]</strong>http://www.google.com/intl/en_ALL/images/logo.gif<strong>[/img]</strong><br /><br />As noted in the URL section above you can wrap an image in a <strong>[url][/url]</strong> tag if you wish, e.g.<br /><br /><strong>[url=http://www.google.com/][img]</strong>http://www.google.com/intl/en_ALL/images/logo.gif<strong>[/img][/url]</strong><br /><br />would generate:<br /><br /><a href="http://www.google.com/"><img src="http://www.google.com/intl/en_ALL/images/logo.gif" alt="" /></a>'
),
array(
0 => 'Adding attachments into a post',
- 1 => 'Attachments can now be placed in any part of a post by using the new <strong>[attachment=][/attachment]</strong> BBCode, if the attachments functionality has been enabled by a board administrator &amp; if you are given the appropriate permissions to create attachments. Within the posting screen is a drop-down box for placing attachments inline.'
+ 1 => 'Attachments can now be placed in any part of a post by using the new <strong>[attachment=][/attachment]</strong> BBCode, if the attachments functionality has been enabled by a board administrator and if you are given the appropriate permissions to create attachments. Within the posting screen is a drop-down box (respectively a button) for placing attachments inline.'
),
array(
0 => '--',
diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php
index 180157d5e0..1a932369a8 100755
--- a/phpBB/language/en/install.php
+++ b/phpBB/language/en/install.php
@@ -58,6 +58,7 @@ $lang = array_merge($lang, array(
'CHANGE' => 'Change',
'CHECK_TABLE_PREFIX' => 'Please check your table prefix and try again.',
'CLEAN_VERIFY' => 'Cleaning up and verifying the final structure',
+ 'CLEANING_USERNAMES' => 'Cleaning usernames',
'COLLIDING_CLEAN_USERNAME' => '<strong>%s</strong> is the clean username for:',
'COLLIDING_USERNAMES_FOUND' => 'Colliding usernames were found on your old board. In order to complete the conversion please delete or rename these users so that there is only one user on your old board for each clean username.',
'COLLIDING_USER' => '» user id: <strong>%d</strong> username: <strong>%s</strong> (%d posts)',
@@ -245,6 +246,8 @@ $lang = array_merge($lang, array(
'INST_ERR_USER_TOO_SHORT' => 'The username you entered is too short. The minimum length is 3 characters.',
'INVALID_PRIMARY_KEY' => 'Invalid primary key : %s',
+ 'LONG_SCRIPT_EXECUTION' => 'Please note that this can take a while... Please do not stop the script.',
+
// mbstring
'MBSTRING_CHECK' => '<samp>mbstring</samp> extension check',
'MBSTRING_CHECK_EXPLAIN' => '<strong>Required</strong> - <samp>mbstring</samp> is a PHP extension that provides multibyte string functions. Certain features of mbstring are not compatible with phpBB and must be disabled.',
@@ -360,7 +363,9 @@ $lang = array_merge($lang, array(
'BACK' => 'Back',
'BINARY_FILE' => 'Binary file',
+ 'BOT' => 'Spider/Robot',
+ 'CHANGE_CLEAN_NAMES' => 'The method used to make sure a username is not used by multiple users has been changed. There are some users which have the same name when compared with the new method. You have to delete or rename these users to make sure that each name is only used by one user before you can proceed.',
'CHECK_FILES' => 'Check files',
'CHECK_FILES_AGAIN' => 'Check files again',
'CHECK_FILES_EXPLAIN' => 'Within the next step all files will be checked against the update files - this can take a while if this is the first file check.',
@@ -375,6 +380,8 @@ $lang = array_merge($lang, array(
'DATABASE_TYPE' => 'Database type',
'DATABASE_UPDATE_INFO_OLD' => 'The database update file within the install directory is outdated. Please make sure you uploaded the correct version of the file.',
+ 'DELETE_USER_REMOVE' => 'Delete user and remove posts',
+ 'DELETE_USER_RETAIN' => 'Delete user but keep posts',
'DESTINATION' => 'Destination file',
'DIFF_INLINE' => 'Inline',
'DIFF_RAW' => 'Raw unified diff',
@@ -388,7 +395,8 @@ $lang = array_merge($lang, array(
'DOWNLOAD_UPDATE_METHOD' => 'Download modified files archive',
'DOWNLOAD_UPDATE_METHOD_EXPLAIN' => 'Once downloaded you should unpack the archive. You will find the modified files you need to upload to your phpBB root directory within it. Please upload the files to their respective locations then. After you have uploaded all files, please check the files again with the other button below.',
- 'ERROR' => 'Error',
+ 'ERROR' => 'Error',
+ 'EDIT_USERNAME' => 'Edit username',
'FILE_ALREADY_UP_TO_DATE' => 'File is already up to date.',
'FILE_DIFF_NOT_ALLOWED' => 'File not allowed to be diffed.',
@@ -412,6 +420,8 @@ $lang = array_merge($lang, array(
'INCOMPLETE_UPDATE_FILES' => 'The update files are incomplete.',
'INLINE_UPDATE_SUCCESSFUL' => 'The database update was successful. Now you need to continue the update process.',
+ 'KEEP_OLD_NAME' => 'Keep username',
+
'LATEST_VERSION' => 'Latest version',
'LINE' => 'Line',
'LINE_ADDED' => 'Added',
@@ -421,6 +431,9 @@ $lang = array_merge($lang, array(
'LOGIN_UPDATE_EXPLAIN' => 'In order to update your installation you need to login first.',
'MAPPING_FILE_STRUCTURE' => 'To ease the upload here are the file locations which map your phpBB installation.',
+
+ 'MERGE_MODIFICATIONS_OPTION' => 'Merge modifications',
+
'MERGE_NO_MERGE_NEW_OPTION' => 'Do not merge - use new file',
'MERGE_NO_MERGE_MOD_OPTION' => 'Do not merge - use currently installed file',
'MERGE_MOD_FILE_OPTION' => 'Merge differences and use modified code within conflicting block',
@@ -428,6 +441,7 @@ $lang = array_merge($lang, array(
'MERGE_SELECT_ERROR' => 'Conflicting file merge modes are not correctly selected.',
'NEW_FILE' => 'New updated file',
+ 'NEW_USERNAME' => 'New username',
'NO_AUTH_UPDATE' => 'Not authorised to update',
'NO_ERRORS' => 'No errors',
'NO_UPDATE_FILES' => 'Not updating the following files',
@@ -442,8 +456,9 @@ $lang = array_merge($lang, array(
'OLD_UPDATE_FILES' => 'Update files are out of date. The update files found are for updating from phpBB %1$s to phpBB %2$s but the latest version of phpBB is %3$s.',
+ 'PACKAGE_UPDATES_TO' => 'Current package updates to version',
'PERFORM_DATABASE_UPDATE' => 'Perform database update',
- 'PERFORM_DATABASE_UPDATE_EXPLAIN' => 'Below you will find a link to the database update script. This script needs to be run separately because updating the database might result in unexpected behaviour if you are logged in. The database update can take a while, so please do not stop the execution if it seems to hang. After the database update had been performed just follow the link presented to continue the update process.',
+ 'PERFORM_DATABASE_UPDATE_EXPLAIN' => 'Below you will find a button to the database update script. The database update can take a while, so please do not stop the execution if it seems to hang. After the database update has been performed just follow the instructions to continue the update process.',
'PREVIOUS_VERSION' => 'Previous version',
'PROGRESS' => 'Progress',
@@ -513,6 +528,7 @@ $lang = array_merge($lang, array(
',
'UPDATE_METHOD' => 'Update method',
'UPDATE_METHOD_EXPLAIN' => 'You are now able to choose your preferred update method. Using the FTP upload will present you with a form you need to enter your FTP account details into. With this method the files will be automatically moved to the new location and backups of the old files being created by appending .bak to the filename. If you choose to download the modified files you are able to unpack and upload them to their correct location manually later.',
+ 'UPDATE_REQUIRES_FILE' => 'The updater requires that the following file is present: %s',
'UPDATE_SUCCESS' => 'Update was successful',
'UPDATE_SUCCESS_EXPLAIN' => 'Successfully updated all files. The next step involves checking all files again to make sure the files got updated correctly.',
'UPDATE_VERSION_OPTIMIZE' => 'Updating version and optimising tables',
@@ -522,6 +538,8 @@ $lang = array_merge($lang, array(
'UPLOAD_METHOD' => 'Upload method',
'UPDATE_DB_SUCCESS' => 'Database update was successful.',
+ 'USER_ACTIVE' => 'Active user',
+ 'USER_INACTIVE' => 'Inactive user',
'VERSION_CHECK' => 'Version check',
'VERSION_CHECK_EXPLAIN' => 'Checks to see if the version of phpBB you are currently running is up to date.',
@@ -561,7 +579,7 @@ $lang = array_merge($lang, array(
'REPORT_WAREZ' => 'The post contains links to illegal or pirated software.',
'REPORT_SPAM' => 'The reported post has the only purpose to advertise for a website or another product.',
'REPORT_OFF_TOPIC' => 'The reported post is off topic.',
- 'REPORT_OTHER' => 'The reported post does not fit into any other category, please use the description field.',
+ 'REPORT_OTHER' => 'The reported post does not fit into any other category, please use the further information field.',
'SMILIES_ARROW' => 'Arrow',
'SMILIES_CONFUSED' => 'Confused',
diff --git a/phpBB/language/en/mcp.php b/phpBB/language/en/mcp.php
index 087e8997e5..dc20fd64e8 100644
--- a/phpBB/language/en/mcp.php
+++ b/phpBB/language/en/mcp.php
@@ -362,7 +362,7 @@ $lang = array_merge($lang, array(
'WAREZ' => 'The post contains links to illegal or pirated software.',
'SPAM' => 'The reported post has the only purpose to advertise for a website or another product.',
'OFF_TOPIC' => 'The reported post is off topic.',
- 'OTHER' => 'The reported post does not fit into any other category, please use the description field.',
+ 'OTHER' => 'The reported post does not fit into any other category, please use the further information field.',
)
),
));
diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php
index 6feb16c02c..c4a392c81d 100644
--- a/phpBB/language/en/memberlist.php
+++ b/phpBB/language/en/memberlist.php
@@ -78,6 +78,7 @@ $lang = array_merge($lang, array(
'IM_MSNM_BROWSER' => 'Your browser does not support this.',
'IM_MSNM_CONNECT' => 'MSNM is not connected.\nYou have to connect to MSNM to continue.',
'IM_NAME' => 'Your Name',
+ 'IM_NO_DATA' => 'There is no suitable contact information for this user.',
'IM_NO_JABBER' => 'Sorry, direct messaging of Jabber users is not supported on this server. You will need a Jabber client installed on your system to contact the recipient above.',
'IM_RECIPIENT' => 'Recipient',
'IM_SEND' => 'Send message',
diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php
index 4ff4b9be62..6f7b273efe 100644
--- a/phpBB/language/en/posting.php
+++ b/phpBB/language/en/posting.php
@@ -53,7 +53,7 @@ $lang = array_merge($lang, array(
'BBCODE_O_HELP' => 'Ordered list: [list=]text[/list]',
'BBCODE_P_HELP' => 'Insert image: [img]http://image_url[/img]',
'BBCODE_Q_HELP' => 'Quote text: [quote]text[/quote]',
- 'BBCODE_S_HELP' => 'Font color: [color=red]text[/color] Tip: you can also use color=#FF0000',
+ 'BBCODE_S_HELP' => 'Font colour: [color=red]text[/color] Tip: you can also use color=#FF0000',
'BBCODE_U_HELP' => 'Underline text: [u]text[/u]',
'BBCODE_W_HELP' => 'Insert URL: [url]http://url[/url] or [url=http://url]URL text[/url]',
'BBCODE_D_HELP' => 'Flash: [flash=width,height]http://url[/flash]',
@@ -91,8 +91,8 @@ $lang = array_merge($lang, array(
'FLASH_IS_OFF' => '[flash] is <em>OFF</em>',
'FLASH_IS_ON' => '[flash] is <em>ON</em>',
'FLOOD_ERROR' => 'You cannot make another post so soon after your last.',
- 'FONT_COLOR' => 'Font color',
- 'FONT_COLOR_HIDE' => 'Hide font color',
+ 'FONT_COLOR' => 'Font colour',
+ 'FONT_COLOR_HIDE' => 'Hide font colour',
'FONT_HUGE' => 'Huge',
'FONT_LARGE' => 'Large',
'FONT_NORMAL' => 'Normal',
@@ -151,7 +151,7 @@ $lang = array_merge($lang, array(
'POLL_VOTE_CHANGE' => 'Allow re-voting',
'POLL_VOTE_CHANGE_EXPLAIN' => 'If enabled users are able to change their vote.',
'POSTED_ATTACHMENTS' => 'Posted attachments',
- 'POST_APPROVAL_NOTIFY' => ' You will be notified when your post has been approved.',
+ 'POST_APPROVAL_NOTIFY' => 'You will be notified when your post has been approved.',
'POST_CONFIRMATION' => 'Confirmation of post',
'POST_CONFIRM_EXPLAIN' => 'To prevent automated posts the board requires you to enter a confirmation code. The code is displayed in the image you should see below. If you are visually impaired or cannot otherwise read this code please contact the %sBoard Administrator%s.',
'POST_DELETED' => 'This message has been deleted successfully.',
diff --git a/phpBB/language/en/search.php b/phpBB/language/en/search.php
index 641aa74efc..7f4b2d932f 100644
--- a/phpBB/language/en/search.php
+++ b/phpBB/language/en/search.php
@@ -73,7 +73,7 @@ $lang = array_merge($lang, array(
'SEARCH_AUTHOR_EXPLAIN' => 'Use * as a wildcard for partial matches.',
'SEARCH_FIRST_POST' => 'First post of topics only',
'SEARCH_FORUMS' => 'Search in forums',
- 'SEARCH_FORUMS_EXPLAIN' => 'Select the forum or forums you wish to search in. For speed all subforums can be searched by selecting the parent and setting enable search subforums below.',
+ 'SEARCH_FORUMS_EXPLAIN' => 'Select the forum or forums you wish to search in. Subforums are searched automatically if you do not disable “search subforums“ below.',
'SEARCH_IN_RESULTS' => 'Search these results',
'SEARCH_KEYWORDS_EXPLAIN' => 'Place <strong>+</strong> in front of a word which must be found and <strong>-</strong> in front of a word which must not be found. Put a list of words separated by <strong>|</strong> into brackets if only one of the words must be found. Use * as a wildcard for partial matches.',
'SEARCH_MSG_ONLY' => 'Message text only',
diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php
index 4c402d9b59..34040317a0 100644
--- a/phpBB/language/en/ucp.php
+++ b/phpBB/language/en/ucp.php
@@ -34,7 +34,7 @@ if (empty($lang) || !is_array($lang))
$lang = array_merge($lang, array(
'TERMS_OF_USE_CONTENT' => 'By accessing “%1$s†(hereinafter “weâ€, “usâ€, “ourâ€, “%1$sâ€, “%2$sâ€), you agree to be legally bound by the following terms. If you do not agree to be legally bound by all of the following terms then please do not access and/or use “%1$sâ€. We may change these at any time and we’ll do our utmost in informing you, though it would be prudent to review this regularly yourself as your continued usage of “%1$s†after changes mean you agree to be legally bound by these terms as they are updated and/or amended.<br />
<br />
- Our forums are powered by phpBB (hereinafter “theyâ€, “themâ€, “theirâ€, “phpBB softwareâ€, “www.phpbb.comâ€, “phpBB Groupâ€, “phpBB Teamsâ€) which is a bulletin board solution released under the “<a href="http://www.gnu.org/licenses/gpl.html">General Public License</a>†(hereinafter “GPLâ€) and can be downloaded from <a href="http://www.phpbb.com/">www.phpbb.com</a>. The phpBB software only facilitates Internet based discussions and the GPL strictly forbids them in what we allow and/or disallow as permissible content and/or conduct. For further information about phpBB, please see: <a href="http://www.phpbb.com/">http://www.phpbb.com/</a>.<br />
+ Our forums are powered by phpBB (hereinafter “theyâ€, “themâ€, “theirâ€, “phpBB softwareâ€, “www.phpbb.comâ€, “phpBB Groupâ€, “phpBB Teamsâ€) which is a bulletin board solution released under the “<a href="http://www.gnu.org/licenses/gpl.html">General Public License</a>†(hereinafter “GPLâ€) and can be downloaded from <a href="http://www.phpbb.com/">www.phpbb.com</a>. The phpBB software only facilitates internet based discussions, the phpBB Group are not responsible for what we allow and/or disallow as permissible content and/or conduct. For further information about phpBB, please see: <a href="http://www.phpbb.com/">http://www.phpbb.com/</a>.<br />
<br />
You agree not to post any abusive, obscene, vulgar, slanderous, hateful, threatening, sexually-orientated or any other material that may violate any laws be it of your country, the country where “%1$s†is hosted or International Law. Doing so may lead to you being immediately and permanently banned, with notification of your Internet Service Provider if deemed required by us. The IP address of all posts are recorded to aid in enforcing these conditions. You agree that “%1$s†have the right to remove, edit, move or close any topic at any time should we see fit. As a user you agree to any information you have entered to being stored in a database. While this information will not be disclosed to any third party without your consent, neither “%1$s†nor phpBB shall be held responsible for any hacking attempt that may lead to the data being compromised.
',
@@ -105,6 +105,7 @@ $lang = array_merge($lang, array(
'CANNOT_EDIT_MESSAGE_TIME' => 'You can no longer edit or delete that message.',
'CANNOT_MOVE_TO_SAME_FOLDER'=> 'Messages can not be moved to the folder you want to remove.',
+ 'CANNOT_MOVE_FROM_SPECIAL' => 'Messages can not be moved from the outbox.',
'CANNOT_RENAME_FOLDER' => 'This folder can not be renamed.',
'CANNOT_REMOVE_FOLDER' => 'This folder can not be removed.',
'CHANGE_DEFAULT_GROUP' => 'Change default group',
@@ -161,7 +162,7 @@ $lang = array_merge($lang, array(
'EDIT_DRAFT_EXPLAIN' => 'Here you are able to edit your draft. Drafts do not contain attachment and poll information.',
'EMAIL_BANNED_EMAIL' => 'The e-mail address you entered is not allowed to be used.',
'EMAIL_INVALID_EMAIL' => 'The e-mail address you entered is invalid.',
- 'EMAIL_REMIND' => 'This must be the e-mail address you supplied when registering.',
+ 'EMAIL_REMIND' => 'This must be the e-mail address associated with your account. If you have not changed this via your user control panel then it is the e-mail address you registered your account with.',
'EMAIL_TAKEN_EMAIL' => 'The entered e-mail address is already in use.',
'EMPTY_DRAFT' => 'You must enter a message to submit your changes.',
'EMPTY_DRAFT_TITLE' => 'You must enter a draft title.',
@@ -210,7 +211,7 @@ $lang = array_merge($lang, array(
'GLOBAL_ANNOUNCEMENT' => 'Global announcement',
'HIDE_ONLINE' => 'Hide my online status',
- 'HIDE_ONLINE_EXPLAIN' => 'Changing this setting won\'t become effective until your next visit to the board.',
+ 'HIDE_ONLINE_EXPLAIN' => 'Changing this setting won’t become effective until your next visit to the board.',
'HOLD_NEW_MESSAGES' => 'Do not accept new messages (New messages will be held back until enough space is available)',
'HOLD_NEW_MESSAGES_SHORT' => 'New messages will be held back',
@@ -288,6 +289,7 @@ $lang = array_merge($lang, array(
'NO_BCC_RECIPIENT' => 'None',
'NO_BOOKMARKS' => 'You have no bookmarks.',
'NO_BOOKMARKS_SELECTED' => 'You have selected no bookmarks.',
+ 'NO_EDIT_READ_MESSAGE' => 'Private message cannot be edited because it has already been read.',
'NO_EMAIL_USER' => 'The e-mail/username information submitted could not be found.',
'NO_FOES' => 'No foes currently defined',
'NO_FRIENDS' => 'No friends currently defined',
@@ -304,8 +306,8 @@ $lang = array_merge($lang, array(
'NO_RULES_DEFINED' => 'No rules defined.',
'NO_SAVED_DRAFTS' => 'No drafts saved.',
'NO_TO_RECIPIENT' => 'None',
- 'NO_WATCHED_FORUMS' => 'You are not watching any forums.',
- 'NO_WATCHED_TOPICS' => 'You are not watching any topics.',
+ 'NO_WATCHED_FORUMS' => 'You are not subscribed to any forums.',
+ 'NO_WATCHED_TOPICS' => 'You are not subscribed to any topics.',
'PASS_TYPE_ALPHA_EXPLAIN' => 'Password must be between %1$d and %2$d characters long, must contain letters in mixed case and must contain numbers.',
'PASS_TYPE_ANY_EXPLAIN' => 'Must be between %1$d and %2$d characters.',
diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php
index aec904eddc..59d3371f45 100644
--- a/phpBB/language/en/viewtopic.php
+++ b/phpBB/language/en/viewtopic.php
@@ -101,7 +101,6 @@ $lang = array_merge($lang, array(
'VISIT_WEBSITE' => 'WWW',
'VOTE_SUBMITTED' => 'Your vote has been cast.',
- 'WROTE' => 'wrote',
));
?> \ No newline at end of file
diff --git a/phpBB/mcp.php b/phpBB/mcp.php
index 94c17c83f7..c772918dd7 100644
--- a/phpBB/mcp.php
+++ b/phpBB/mcp.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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);
@@ -78,7 +78,7 @@ $post_id = request_var('p', 0);
$topic_id = request_var('t', 0);
$forum_id = request_var('f', 0);
$user_id = request_var('u', 0);
-$username = request_var('username', '', true);
+$username = utf8_normalize_nfc(request_var('username', '', true));
if ($post_id)
{
@@ -129,14 +129,14 @@ if (!$auth->acl_getf_global('m_'))
if (!$allow_user)
{
- trigger_error($user->lang['NOT_AUTHORISED']);
+ trigger_error('NOT_AUTHORISED');
}
}
// if the user cannot read the forum he tries to access then we won't allow mcp access either
if ($forum_id && !$auth->acl_get('f_read', $forum_id))
{
- trigger_error($user->lang['NOT_AUTHORISED']);
+ trigger_error('NOT_AUTHORISED');
}
if ($forum_id)
diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php
index dfeaf9801f..c88845340b 100644
--- a/phpBB/memberlist.php
+++ b/phpBB/memberlist.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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_display.' . $phpEx);
@@ -316,7 +316,11 @@ switch ($mode)
if (!$row)
{
- trigger_error('NO_USER_DATA');
+ trigger_error('NO_USER');
+ }
+ else if (empty($row[$sql_field]))
+ {
+ trigger_error('IM_NO_DATA');
}
// Post data grab actions
@@ -328,7 +332,7 @@ switch ($mode)
include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
$subject = sprintf($user->lang['IM_JABBER_SUBJECT'], $user->data['username'], $config['server_name']);
- $message = trim(request_var('message', '', true));
+ $message = utf8_normalize_nfc(request_var('message', '', true));
if (empty($message))
{
@@ -586,7 +590,7 @@ switch ($mode)
);
}
- // Now generate page tilte
+ // Now generate page title
$page_title = sprintf($user->lang['VIEWING_PROFILE'], $member['username']);
$template_html = 'memberlist_view.html';
@@ -665,7 +669,7 @@ switch ($mode)
{
if (!$auth->acl_get('f_read', $row['forum_id']))
{
- trigger_error($user->lang['SORRY_AUTH_READ']);
+ trigger_error('SORRY_AUTH_READ');
}
if (!$auth->acl_get('f_email', $row['forum_id']))
@@ -678,7 +682,7 @@ switch ($mode)
// If global announcement, we need to check if the user is able to at least read and email in one forum...
if (!$auth->acl_getf_global('f_read'))
{
- trigger_error($user->lang['SORRY_AUTH_READ']);
+ trigger_error('SORRY_AUTH_READ');
}
if (!$auth->acl_getf_global('f_email'))
@@ -694,11 +698,11 @@ switch ($mode)
$error = array();
- $name = request_var('name', '', true);
+ $name = utf8_normalize_nfc(request_var('name', '', true));
$email = request_var('email', '');
$email_lang = request_var('lang', $config['default_lang']);
- $subject = request_var('subject', '', true);
- $message = request_var('message', '', true);
+ $subject = utf8_normalize_nfc(request_var('subject', '', true));
+ $message = utf8_normalize_nfc(request_var('message', '', true));
$cc = (isset($_POST['cc_email'])) ? true : false;
$submit = (isset($_POST['submit'])) ? true : false;
@@ -1240,7 +1244,7 @@ switch ($mode)
'S_JOINED_TIME_OPTIONS' => $s_find_join_time,
'S_ACTIVE_TIME_OPTIONS' => $s_find_active_time,
'S_GROUP_SELECT' => $s_group_select,
- 'S_SEARCH_ACTION' => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=searchuser&amp;form=$form&amp;field=$field"))
+ 'S_USER_SEARCH_ACTION' => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=searchuser&amp;form=$form&amp;field=$field"))
);
}
@@ -1440,7 +1444,7 @@ function show_profile($data)
if ($config['load_onlinetrack'])
{
$update_time = $config['load_online_time'] * 60;
- $online = (time() - $update_time < $data['session_time'] && ((isset($data['session_viewonline'])) || $auth->acl_get('u_viewonline'))) ? true : false;
+ $online = (time() - $update_time < $data['session_time'] && ((isset($data['session_viewonline']) && $data['session_viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
}
else
{
@@ -1458,7 +1462,7 @@ function show_profile($data)
$age = '';
- if ($data['user_birthday'])
+ if ($config['allow_birthdays'] && $data['user_birthday'])
{
list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $data['user_birthday']));
diff --git a/phpBB/posting.php b/phpBB/posting.php
index 403eea5418..92b44b3f21 100644
--- a/phpBB/posting.php
+++ b/phpBB/posting.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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_posting.' . $phpEx);
@@ -476,12 +476,12 @@ if ($save && $user->data['is_registered'] && $auth->acl_get('u_savedrafts') && (
if (confirm_box(true))
{
$sql = 'INSERT INTO ' . DRAFTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
- 'user_id' => $user->data['user_id'],
- 'topic_id' => $topic_id,
- 'forum_id' => $forum_id,
- 'save_time' => $current_time,
- 'draft_subject' => $subject,
- 'draft_message' => $message)
+ 'user_id' => (int) $user->data['user_id'],
+ 'topic_id' => (int) $topic_id,
+ 'forum_id' => (int) $forum_id,
+ 'save_time' => (int) $current_time,
+ 'draft_subject' => (string) $subject,
+ 'draft_message' => (string) $message)
);
$db->sql_query($sql);
@@ -512,7 +512,7 @@ if ($save && $user->data['is_registered'] && $auth->acl_get('u_savedrafts') && (
}
else
{
- if (!$subject)
+ if (!$subject || !utf_clean_string($subject))
{
$error[] = $user->lang['EMPTY_SUBJECT'];
}
@@ -561,7 +561,7 @@ $solved_captcha = false;
if ($submit || $preview || $refresh)
{
$post_data['topic_cur_post_id'] = request_var('topic_cur_post_id', 0);
- $post_data['post_subject'] = trim(utf8_normalize_nfc(request_var('subject', '', true)));
+ $post_data['post_subject'] = utf8_normalize_nfc(request_var('subject', '', true));
$message_parser->message = utf8_normalize_nfc(request_var('message', '', true));
$post_data['username'] = utf8_normalize_nfc(request_var('username', $post_data['username'], true));
@@ -756,7 +756,7 @@ if ($submit || $preview || $refresh)
}
// Parse subject
- if (!$preview && !$refresh && !$post_data['post_subject'] && ($mode == 'post' || ($mode == 'edit' && $post_data['topic_first_post_id'] == $post_id)))
+ if (!$preview && !$refresh && !utf8_clean_string($post_data['post_subject']) && ($mode == 'post' || ($mode == 'edit' && $post_data['topic_first_post_id'] == $post_id)))
{
$error[] = $user->lang['EMPTY_SUBJECT'];
}
@@ -994,7 +994,7 @@ if ($submit || $preview || $refresh)
{
meta_refresh(10, $redirect_url);
$message = ($mode == 'edit') ? $user->lang['POST_EDITED_MOD'] : $user->lang['POST_STORED_MOD'];
- $message .= (($user->data['user_id'] == ANONYMOUS) ? '' : $user->lang['POST_APPROVAL_NOTIFY']);
+ $message .= (($user->data['user_id'] == ANONYMOUS) ? '' : ' '. $user->lang['POST_APPROVAL_NOTIFY']);
}
else
{
@@ -1070,10 +1070,11 @@ if (!sizeof($error) && $preview)
$preview_poll_options = explode('<br />', $parse_poll->message);
unset($parse_poll);
- foreach ($preview_poll_options as $option)
+ foreach ($preview_poll_options as $key => $option)
{
$template->assign_block_vars('poll_option', array(
- 'POLL_OPTION_CAPTION' => $option)
+ 'POLL_OPTION_CAPTION' => $option,
+ 'POLL_OPTION_ID' => $key + 1)
);
}
unset($preview_poll_options);
diff --git a/phpBB/report.php b/phpBB/report.php
index cbae24b228..090dee5d0c 100644
--- a/phpBB/report.php
+++ b/phpBB/report.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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_display.' . $phpEx);
diff --git a/phpBB/search.php b/phpBB/search.php
index 0693b32569..8dabfa895a 100644
--- a/phpBB/search.php
+++ b/phpBB/search.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
@@ -30,8 +30,8 @@ $topic_id = request_var('t', 0);
$view = request_var('view', '');
$submit = request_var('submit', false);
-$keywords = request_var('keywords', '', true);
-$add_keywords = request_var('add_keywords', '', true);
+$keywords = utf8_normalize_nfc(request_var('keywords', '', true));
+$add_keywords = utf8_normalize_nfc(request_var('add_keywords', '', true));
$author = request_var('author', '', true);
$author_id = request_var('author_id', 0);
$show_results = ($topic_id) ? 'posts' : request_var('sr', 'posts');
@@ -44,19 +44,21 @@ $sort_days = request_var('st', 0);
$sort_key = request_var('sk', 't');
$sort_dir = request_var('sd', 'd');
-$return_chars = request_var('ch', ($topic_id) ? -1 : 200);
+$return_chars = request_var('ch', ($topic_id) ? -1 : 300);
$search_forum = request_var('fid', array(0));
// Is user able to search? Has search been disabled?
if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$config['load_search'])
{
- trigger_error($user->lang['NO_SEARCH']);
+ $template->assign_var('S_NO_SEARCH', true);
+ trigger_error('NO_SEARCH');
}
// Check search load limit
if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load'])))
{
- trigger_error($user->lang['NO_SEARCH_TIME']);
+ $template->assign_var('S_NO_SEARCH', true);
+ trigger_error('NO_SEARCH_TIME');
}
// Check flood limit ... if applicable
@@ -65,7 +67,8 @@ if ($interval && !$auth->acl_get('u_ignoreflood'))
{
if ($user->data['user_last_search'] > time() - $interval)
{
- trigger_error($user->lang['NO_SEARCH_TIME']);
+ $template->assign_var('S_NO_SEARCH', true);
+ trigger_error('NO_SEARCH_TIME');
}
}
@@ -121,7 +124,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
if (!sizeof($author_id_ary))
{
- trigger_error($user->lang['NO_SEARCH_RESULTS']);
+ trigger_error('NO_SEARCH_RESULTS');
}
}
@@ -416,13 +419,14 @@ if ($keywords || $author || $author_id || $search_id || $submit)
}
else if (sizeof($author_id_ary))
{
- $total_match_count = $search->author_search($show_results, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $id_ary, $start, $per_page);
+ $firstpost_only = ($search_fields === 'firstpost') ? true : false;
+ $total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $id_ary, $start, $per_page);
}
// For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options.
if (!sizeof($id_ary) && !$search_id)
{
- trigger_error($user->lang['NO_SEARCH_RESULTS']);
+ trigger_error('NO_SEARCH_RESULTS');
}
$sql_where = '';
@@ -473,7 +477,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$u_search .= ($u_search_forum) ? '&amp;fid%5B%5D=' . $u_search_forum : '';
$u_search .= (!$search_child) ? '&amp;sc=0' : '';
$u_search .= ($search_fields != 'all') ? '&amp;sf=' . $search_fields : '';
- $u_search .= ($return_chars != 200) ? '&amp;ch=' . $return_chars : '';
+ $u_search .= ($return_chars != 300) ? '&amp;ch=' . $return_chars : '';
$template->assign_vars(array(
'SEARCH_TITLE' => $l_search_title,
@@ -995,7 +999,7 @@ unset($pad_store);
if (!$s_forums)
{
- trigger_error($user->lang['NO_SEARCH']);
+ trigger_error('NO_SEARCH');
}
// Number of chars returned
@@ -1006,13 +1010,29 @@ $s_characters .= '<option value="50">50</option>';
for ($i = 100; $i <= 1000 ; $i += 100)
{
- $selected = ($i == 200) ? ' selected="selected"' : '';
+ $selected = ($i == 300) ? ' selected="selected"' : '';
$s_characters .= '<option value="' . $i . '"' . $selected . '>' . $i . '</option>';
}
+$s_hidden_fields = array('t' => $topic_id);
+
+if ($_SID)
+{
+ $s_hidden_fields['sid'] = $_SID;
+}
+
+if (!empty($_EXTRA_URL))
+{
+ foreach ($_EXTRA_URL as $url_param)
+ {
+ $url_param = explode('=', $url_param, 2);
+ $s_hidden_fields[$url_param[0]] = $url_param[1];
+ }
+}
+
$template->assign_vars(array(
'S_SEARCH_ACTION' => "{$phpbb_root_path}search.$phpEx",
- 'S_HIDDEN_FIELDS' => build_hidden_fields(array('sid' => $user->session_id, 't' => $topic_id)),
+ 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields),
'S_CHARACTER_OPTIONS' => $s_characters,
'S_FORUM_OPTIONS' => $s_forums,
'S_SELECT_SORT_DIR' => $s_sort_dir,
diff --git a/phpBB/style.php b/phpBB/style.php
index 58eabd0e7f..b33d473ae7 100644
--- a/phpBB/style.php
+++ b/phpBB/style.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'config.' . $phpEx);
@@ -33,7 +33,7 @@ if (!empty($load_extensions))
}
-$sid = (isset($_GET['sid'])) ? htmlspecialchars($_GET['sid']) : '';
+$sid = (isset($_GET['sid']) && !is_array($_GET['sid'])) ? htmlspecialchars($_GET['sid']) : '';
$id = (isset($_GET['id'])) ? intval($_GET['id']) : 0;
if (strspn($sid, 'abcdefABCDEF0123456789') !== strlen($sid))
@@ -126,6 +126,19 @@ if ($id && $sid)
exit;
}
+ // gzip_compression
+ if ($config['gzip_compress'])
+ {
+ if (@extension_loaded('zlib') && !headers_sent())
+ {
+ ob_start('ob_gzhandler');
+ }
+ }
+
+ // Expire time of seven days if not recached
+ $expire_time = 7*86400;
+ $recache = false;
+
// Re-cache stylesheet data if necessary
if ($recompile || empty($theme['theme_data']))
{
@@ -141,46 +154,53 @@ if ($id && $sid)
else if (!$recache)
{
$last_change = $theme['theme_mtime'];
+ $dir = @opendir("{$phpbb_root_path}styles/{$theme['theme_path']}/theme");
- foreach (glob("{$phpbb_root_path}styles/{$theme['theme_path']}/theme/*.css", GLOB_NOSORT) as $file)
+ if ($dir)
{
- if ($last_change < @filemtime($file))
+ while (($entry = readdir($dir)) !== false)
{
- $recache = true;
- break;
+ if (substr(strrchr($entry, '.'), 1) == 'css' && $last_change < @filemtime("{$phpbb_root_path}styles/{$theme['theme_path']}/theme/{$entry}"))
+ {
+ $recache = true;
+ break;
+ }
}
+ closedir($dir);
}
}
+ }
- if ($recache)
- {
- include_once($phpbb_root_path . 'includes/acp/acp_styles.' . $phpEx);
+ header('Content-type: text/css; charset=UTF-8');
- $theme['theme_data'] = acp_styles::db_theme_data($theme);
- $theme['theme_mtime'] = $update_time;
+ if ($recache)
+ {
+ include_once($phpbb_root_path . 'includes/acp/acp_styles.' . $phpEx);
- // Save CSS contents
- $sql_ary = array(
- 'theme_mtime' => $theme['theme_mtime'],
- 'theme_data' => $theme['theme_data']
- );
+ $theme['theme_data'] = acp_styles::db_theme_data($theme);
+ $theme['theme_mtime'] = $update_time;
- $sql = 'UPDATE ' . STYLES_THEME_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
- WHERE theme_id = $id";
- $db->sql_query($sql);
+ // Save CSS contents
+ $sql_ary = array(
+ 'theme_mtime' => $theme['theme_mtime'],
+ 'theme_data' => $theme['theme_data']
+ );
- $cache->destroy('sql', STYLES_THEME_TABLE);
+ $sql = 'UPDATE ' . STYLES_THEME_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
+ WHERE theme_id = $id";
+ $db->sql_query($sql);
- header('Expires: 0');
- }
+ $cache->destroy('sql', STYLES_THEME_TABLE);
+
+ header('Cache-Control: private, no-cache="set-cookie"');
+ header('Expires: 0');
+ header('Pragma: no-cache');
}
else
{
- header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));
+ header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + $expire_time));
}
- header('Content-type: text/css');
-
// Parse Theme Data
$replace = array(
'{T_THEME_PATH}' => "{$phpbb_root_path}styles/" . $theme['theme_path'] . '/theme',
@@ -255,4 +275,6 @@ if ($id && $sid)
$db->sql_close();
}
+exit;
+
?> \ No newline at end of file
diff --git a/phpBB/styles/prosilver/template/drafts.html b/phpBB/styles/prosilver/template/drafts.html
index 2b48785e32..25a5681b70 100644
--- a/phpBB/styles/prosilver/template/drafts.html
+++ b/phpBB/styles/prosilver/template/drafts.html
@@ -21,7 +21,7 @@
</dl>
</li>
</ul>
- <ul class="topiclist">
+ <ul class="topiclist cplist">
<!-- BEGIN draftrow -->
<li class="row<!-- IF draftrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js
index e9754aeae2..dd6c9b2aa1 100644
--- a/phpBB/styles/prosilver/template/forum_fn.js
+++ b/phpBB/styles/prosilver/template/forum_fn.js
@@ -229,7 +229,7 @@ function play_qt_file(obj)
if (rectangle)
{
- rectangle = rectangle.split(',')
+ rectangle = rectangle.split(',');
var x1 = parseInt(rectangle[0]);
var x2 = parseInt(rectangle[2]);
var y1 = parseInt(rectangle[1]);
diff --git a/phpBB/styles/prosilver/template/index_body.html b/phpBB/styles/prosilver/template/index_body.html
index b2f43b79aa..51255489ef 100644
--- a/phpBB/styles/prosilver/template/index_body.html
+++ b/phpBB/styles/prosilver/template/index_body.html
@@ -19,14 +19,17 @@
<h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a>&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a></h3>
<fieldset class="quick-login">
<label for="username">{L_USERNAME}:</label>&nbsp;<input type="text" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" />
- <label for="password">{L_PASSWORD}:</label>&nbsp;<input type="password" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" /> |
- <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin" /></label> <input type="submit" name="login" value="{L_LOGIN}" class="button2" />
+ <label for="password">{L_PASSWORD}:</label>&nbsp;<input type="password" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" />
+ <!-- IF S_AUTOLOGIN_ENABLED -->
+ | <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin" />
+ <!-- ENDIF -->
+ </label> <input type="submit" name="login" value="{L_LOGIN}" class="button2" />
</fieldset>
</form>
<!-- ENDIF -->
<!-- IF S_DISPLAY_ONLINE_LIST -->
- <h3><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h3>
+ <!-- IF U_VIEWONLINE --><h3><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h3><!-- ELSE --><h3>{L_WHO_IS_ONLINE}</h3><!-- ENDIF -->
<p>{TOTAL_USERS_ONLINE} ({L_ONLINE_EXPLAIN})<br />{RECORD_USERS}<br /> <br />{LOGGED_IN_USER_LIST}
<!-- IF LEGEND --><br /><em>{L_LEGEND}: {LEGEND}</em><!-- ENDIF --></p>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/jumpbox.html b/phpBB/styles/prosilver/template/jumpbox.html
index 369321f36d..637e5c7e9a 100644
--- a/phpBB/styles/prosilver/template/jumpbox.html
+++ b/phpBB/styles/prosilver/template/jumpbox.html
@@ -9,7 +9,7 @@
<!-- ELSEIF SEARCH_TOPIC -->
<p><a class="left-box {S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}" accesskey="r">{L_RETURN_TO}: {SEARCH_TOPIC}</a></p>
<!-- ELSEIF S_SEARCH_ACTION -->
- <p><a class="left-box {S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">{L_RETURN_TO} {L_SEARCH_ADV}</a></p>
+ <p><a class="left-box {S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">{L_RETURN_TO_SEARCH_ADV}</a></p>
<!-- ENDIF -->
<!-- IF $CUSTOM_FIELDSET_CLASS -->
diff --git a/phpBB/styles/prosilver/template/mcp_notes_user.html b/phpBB/styles/prosilver/template/mcp_notes_user.html
index bb47956a57..480ec47b3a 100644
--- a/phpBB/styles/prosilver/template/mcp_notes_user.html
+++ b/phpBB/styles/prosilver/template/mcp_notes_user.html
@@ -17,7 +17,7 @@
<div class="column2">
<dl class="details">
<!-- IF RANK_TITLE --><dt>{L_RANK}:</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
- <!-- IF RANK_IMG --><dt>{L_RANK}:</dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
+ <!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE -->&nbsp;<!-- ELSE -->{L_RANK}:<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
<dt>{L_JOINED}:</dt><dd>{JOINED}</dd>
<dt>{L_TOTAL_POSTS}:</dt><dd>{POSTS}</dd>
<dt>{L_WARNINGS}: </dt><dd>{WARNINGS}</dd>
diff --git a/phpBB/styles/prosilver/template/mcp_post.html b/phpBB/styles/prosilver/template/mcp_post.html
index 9cfaa05db3..65798a89a8 100644
--- a/phpBB/styles/prosilver/template/mcp_post.html
+++ b/phpBB/styles/prosilver/template/mcp_post.html
@@ -180,8 +180,8 @@
<!-- IF S_CLEAR_ALLOWED -->
<fieldset class="submit-buttons">
- <input class="button2" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />&nbsp;
- <input class="button2" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />
+ <input class="button2" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />&nbsp;
+ <input class="button2" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />
</fieldset>
<!-- ENDIF -->
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/mcp_topic.html b/phpBB/styles/prosilver/template/mcp_topic.html
index 52d815eb8e..4b61c469c8 100644
--- a/phpBB/styles/prosilver/template/mcp_topic.html
+++ b/phpBB/styles/prosilver/template/mcp_topic.html
@@ -60,8 +60,7 @@ onload_functions.push('subPanels()');
<dl>
<dt><label for="icon">{L_TOPIC_ICON}:</label></dt>
<dd><label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" /> {L_NO_TOPIC_ICON}</label>
- <!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label>
- <!-- END topic_icon --></dd>
+ <!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label> <!-- END topic_icon --></dd>
</dl>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/mcp_warn_list.html b/phpBB/styles/prosilver/template/mcp_warn_list.html
index e0401e1912..df922c015e 100644
--- a/phpBB/styles/prosilver/template/mcp_warn_list.html
+++ b/phpBB/styles/prosilver/template/mcp_warn_list.html
@@ -7,7 +7,7 @@
<div class="panel">
<div class="inner"><span class="corners-top"><span></span></span>
- <p>{L_WARNED_USERS_EXPLAIN}<p>
+ <p>{L_WARNED_USERS_EXPLAIN}</p>
<!-- IF .user -->
<ul class="linklist">
diff --git a/phpBB/styles/prosilver/template/mcp_warn_post.html b/phpBB/styles/prosilver/template/mcp_warn_post.html
index e887a246e8..f420a10bf6 100644
--- a/phpBB/styles/prosilver/template/mcp_warn_post.html
+++ b/phpBB/styles/prosilver/template/mcp_warn_post.html
@@ -17,7 +17,7 @@
<div class="column2">
<dl class="details">
<!-- IF RANK_TITLE --><dt>{L_RANK}:</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
- <!-- IF RANK_IMG --><dt>{L_RANK}:</dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
+ <!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE -->&nbsp;<!-- ELSE -->{L_RANK}:<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
<dt>{L_JOINED}:</dt><dd>{JOINED}</dd>
<dt>{L_TOTAL_POSTS}:</dt><dd>{POSTS}</dd>
<dt>{L_WARNINGS}: </dt><dd>{WARNINGS}</dd>
diff --git a/phpBB/styles/prosilver/template/mcp_warn_user.html b/phpBB/styles/prosilver/template/mcp_warn_user.html
index 7604ceb868..2dcb75fbe2 100644
--- a/phpBB/styles/prosilver/template/mcp_warn_user.html
+++ b/phpBB/styles/prosilver/template/mcp_warn_user.html
@@ -17,7 +17,7 @@
<div class="column2">
<dl class="details">
<!-- IF RANK_TITLE --><dt>{L_RANK}:</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
- <!-- IF RANK_IMG --><dt>{L_RANK}:</dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
+ <!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE -->&nbsp;<!-- ELSE -->{L_RANK}:<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
<dt>{L_JOINED}:</dt><dd>{JOINED}</dd>
<dt>{L_TOTAL_POSTS}:</dt><dd>{POSTS}</dd>
<dt>{L_WARNINGS}: </dt><dd>{WARNINGS}</dd>
diff --git a/phpBB/styles/prosilver/template/memberlist_body.html b/phpBB/styles/prosilver/template/memberlist_body.html
index 0f9d1cb792..a76ca2229d 100644
--- a/phpBB/styles/prosilver/template/memberlist_body.html
+++ b/phpBB/styles/prosilver/template/memberlist_body.html
@@ -90,6 +90,11 @@
<!-- BEGIN memberrow -->
<!-- IF S_SHOW_GROUP -->
<!-- IF not memberrow.S_GROUP_LEADER and not $S_MEMBER_HEADER -->
+ <!-- IF memberrow.S_FIRST_ROW -->
+ <tr class="bg1">
+ <td colspan="<!-- IF U_SORT_ACTIVE -->5<!-- ELSE -->4<!-- ENDIF -->">&nbsp;</td>
+ </tr>
+ <!-- ENDIF -->
</tbody>
</table>
diff --git a/phpBB/styles/prosilver/template/memberlist_view.html b/phpBB/styles/prosilver/template/memberlist_view.html
index c30a6d69b5..ce299e22f6 100644
--- a/phpBB/styles/prosilver/template/memberlist_view.html
+++ b/phpBB/styles/prosilver/template/memberlist_view.html
@@ -23,7 +23,7 @@
</dd>
<!-- IF not AVATAR_IMG -->
<!-- IF RANK_TITLE --><dt>{L_RANK}:</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
- <!-- IF RANK_IMG --><dt>{L_RANK}:</dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
+ <!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE -->&nbsp;<!-- ELSE -->{L_RANK}:<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
<!-- ENDIF -->
<!-- IF S_USER_INACTIVE --><dt>{L_USER_IS_INACTIVE}:</dt><dd>{USER_INACTIVE_REASON}</dd><!-- ENDIF -->
<!-- IF LOCATION --><dt>{L_LOCATION}:</dt> <dd>{LOCATION}</dd><!-- ENDIF -->
@@ -31,7 +31,19 @@
<!-- IF OCCUPATION --><dt>{L_OCCUPATION}:</dt> <dd>{OCCUPATION}</dd><!-- ENDIF -->
<!-- IF INTERESTS --><dt>{L_INTERESTS}:</dt> <dd>{INTERESTS}</dd><!-- ENDIF -->
<!-- IF S_GROUP_OPTIONS --><dt>{L_USERGROUPS}:</dt> <dd><select name="g">{S_GROUP_OPTIONS}</select> <input type="submit" name="submit" value="{L_GO}" class="button2" /></dd><!-- ENDIF -->
- <!-- IF SIGNATURE --><dt>{L_SIGNATURE}:</dt> <dd><div class="signature">{SIGNATURE}</div></dd><!-- ENDIF -->
+ <!-- BEGIN custom_fields --><dt>{custom_fields.PROFILE_FIELD_NAME}:</dt> <dd>{custom_fields.PROFILE_FIELD_VALUE}</dd><!-- END custom_fields -->
+ <!-- IF S_USER_LOGGED_IN and S_ZEBRA -->
+ <!-- IF U_ADD_FRIEND and U_ADD_FOE-->
+ <dt>&nbsp;</dt> <dd><a href="{U_ADD_FRIEND}"><strong>{L_ADD_FRIEND}</strong></a></dd>
+ <dt>&nbsp;</dt> <dd><a href="{U_ADD_FOE}"><strong>{L_ADD_FOE}</strong></a></dd>
+ <!-- ELSE -->
+ <!-- IF U_REMOVE_FRIEND -->
+ <dt>&nbsp;</dt> <dd><a href="{U_REMOVE_FRIEND}"><strong>{L_REMOVE_FRIEND}</strong></a></dd>
+ <!-- ELSE -->
+ <dt>&nbsp;</dt> <dd><a href="{U_REMOVE_FOE}"><strong>{L_REMOVE_FOE}</strong></a></dd>
+ <!-- ENDIF -->
+ <!-- ENDIF -->
+ <!-- ENDIF -->
</dl>
<span class="corners-bottom"><span></span></span></div>
@@ -57,19 +69,6 @@
<!-- NOTE: Use a construct like this to include admin defined profile fields. Replace FIELD1 with the name of your field. -->
<dt>{postrow.PROFILE_FIELD1_NAME}:</dt> <dd>{postrow.PROFILE_FIELD1_VALUE}</dd>
<!-- ENDIF -->
- <!-- BEGIN custom_fields --><dt>{custom_fields.PROFILE_FIELD_NAME}:</dt> <dd>{custom_fields.PROFILE_FIELD_VALUE}</dd><!-- END custom_fields -->
- <!-- IF S_USER_LOGGED_IN and S_ZEBRA -->
- <!-- IF U_ADD_FRIEND and U_ADD_FOE-->
- <dt>&nbsp;</dt> <dd><a href="{U_ADD_FRIEND}"><strong>{L_ADD_FRIEND}</strong></a></dd>
- <dt>&nbsp;</dt> <dd><a href="{U_ADD_FOE}"><strong>{L_ADD_FOE}</strong></a></dd>
- <!-- ELSE -->
- <!-- IF U_REMOVE_FRIEND -->
- <dt>&nbsp;</dt> <dd><a href="{U_REMOVE_FRIEND}"><strong>{L_REMOVE_FRIEND}</strong></a></dd>
- <!-- ELSE -->
- <dt>&nbsp;</dt> <dd><a href="{U_REMOVE_FOE}"><strong>{L_REMOVE_FOE}</strong></a></dd>
- <!-- ENDIF -->
- <!-- ENDIF -->
- <!-- ENDIF -->
</dl>
</div>
@@ -91,6 +90,19 @@
</div>
<span class="corners-bottom"><span></span></span></div>
</div>
+
+<!-- IF SIGNATURE -->
+<div class="panel bg1">
+ <div class="inner"><span class="corners-top"><span></span></span>
+
+ <h3>{L_SIGNATURE}</h3>
+
+ <div class="postbody"><div class="content">{SIGNATURE}</div></div>
+
+ <span class="corners-bottom"><span></span></span></div>
+</div>
+<!-- ENDIF -->
+
</form>
<!-- INCLUDE jumpbox.html -->
diff --git a/phpBB/styles/prosilver/template/message_body.html b/phpBB/styles/prosilver/template/message_body.html
index a1b6ddd530..eac7aeb2cb 100644
--- a/phpBB/styles/prosilver/template/message_body.html
+++ b/phpBB/styles/prosilver/template/message_body.html
@@ -4,7 +4,7 @@
<div class="inner"><span class="corners-top"><span></span></span>
<h2>{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
- <!-- IF SCRIPT_NAME == "search" --><p><a href="{U_SEARCH}" class="{S_CONTENT_FLOW_BEGIN}">{L_RETURN_TO_SEARCH_ADV}</a></p><!-- ENDIF -->
+ <!-- IF SCRIPT_NAME == "search" and not S_BOARD_DISABLED and not S_NO_SEARCH --><p><a href="{U_SEARCH}" class="{S_CONTENT_FLOW_BEGIN}">{L_RETURN_TO_SEARCH_ADV}</a></p><!-- ENDIF -->
<span class="corners-bottom"><span></span></span></div>
</div>
diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html
index a1da979548..23dfe073fd 100644
--- a/phpBB/styles/prosilver/template/overall_footer.html
+++ b/phpBB/styles/prosilver/template/overall_footer.html
@@ -30,7 +30,7 @@
The phpBB Group : 2006
//-->
- <div class="copyright">Powered by <a href="http://www.phpbb.com/">phpBB</a> {PHPBB_VERSION} &copy; 2000, 2002, 2005, 2007 phpBB Group
+ <div class="copyright">Powered by <a href="http://www.phpbb.com/">phpBB</a> &copy; 2000, 2002, 2005, 2007 phpBB Group
<!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF -->
<!-- IF DEBUG_OUTPUT --><br />{DEBUG_OUTPUT}<!-- ENDIF -->
<!-- IF U_ACP --><br /><strong><a href="{U_ACP}">{L_ACP}</a></strong><!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html
index 8a6f129f50..7b578d2c1d 100644
--- a/phpBB/styles/prosilver/template/overall_header.html
+++ b/phpBB/styles/prosilver/template/overall_header.html
@@ -77,18 +77,12 @@
<script type="text/javascript" src="{T_TEMPLATE_PATH}/styleswitcher.js"></script>
<script type="text/javascript" src="{T_TEMPLATE_PATH}/forum_fn.js"></script>
-<!-- IF T_STYLESHEET_LINK and not S_FORCE_EMBED_STYLE -->
- <link href="{T_THEME_PATH}/print.css" rel="stylesheet" type="text/css" media="print" title="printonly" />
- <link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
-
- <link href="{T_THEME_PATH}/normal.css" rel="stylesheet" type="text/css" title="A" />
- <link href="{T_THEME_PATH}/medium.css" rel="alternate stylesheet" type="text/css" title="A+" />
- <link href="{T_THEME_PATH}/large.css" rel="alternate stylesheet" type="text/css" title="A++" />
-<!-- ELSE -->
- <style type="text/css" media="screen, projection">
- {T_THEME_DATA}
- </style>
-<!-- ENDIF -->
+<link href="{T_THEME_PATH}/print.css" rel="stylesheet" type="text/css" media="print" title="printonly" />
+<link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
+
+<link href="{T_THEME_PATH}/normal.css" rel="stylesheet" type="text/css" title="A" />
+<link href="{T_THEME_PATH}/medium.css" rel="alternate stylesheet" type="text/css" title="A+" />
+<link href="{T_THEME_PATH}/large.css" rel="alternate stylesheet" type="text/css" title="A++" />
<!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
<link href="{T_THEME_PATH}/bidi.css" rel="stylesheet" type="text/css" media="screen, projection" />
diff --git a/phpBB/styles/prosilver/template/posting_editor.html b/phpBB/styles/prosilver/template/posting_editor.html
index 0e903b1b05..26cbe54387 100644
--- a/phpBB/styles/prosilver/template/posting_editor.html
+++ b/phpBB/styles/prosilver/template/posting_editor.html
@@ -78,7 +78,7 @@
<dt><label for="icon">{L_ICON}:</label></dt>
<dd>
<label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" /> <!-- IF S_SHOW_TOPIC_ICONS -->{L_NO_TOPIC_ICON}<!-- ELSE -->{L_NO_PM_ICON}<!-- ENDIF --></label>
- <!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label><!-- END topic_icon -->
+ <!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label> <!-- END topic_icon -->
</dd>
</dl>
<!-- ENDIF -->
@@ -93,7 +93,7 @@
<!-- IF S_POST_ACTION or S_PRIVMSGS or S_EDIT_DRAFT -->
<dl style="clear: left;">
<dt><label for="subject">{L_SUBJECT}:</label></dt>
- <dd><input type="text" name="subject" id="subject" size="45" maxlength="64" tabindex="2" value="{SUBJECT}{DRAFT_SUBJECT}" class="inputbox" /></dd>
+ <dd><input type="text" name="subject" id="subject" size="45" maxlength="64" tabindex="2" value="{SUBJECT}{DRAFT_SUBJECT}" class="inputbox autowidth" /></dd>
</dl>
<!-- IF S_CONFIRM_CODE -->
<dl>
@@ -156,9 +156,9 @@
<!-- BEGIN attach_row -->
<dl>
- <dt><label for="comment_list[{attach_row.ASSOC_INDEX}]">{L_FILE_COMMENT}:</label><br />
- <span><br /><a href="{attach_row.U_VIEW_ATTACHMENT}" class="{S_CONTENT_FLOW_END}">{attach_row.FILENAME}</a></span></dt>
+ <dt><label for="comment_list[{attach_row.ASSOC_INDEX}]">{L_FILE_COMMENT}:</label></dt>
<dd><textarea name="comment_list[{attach_row.ASSOC_INDEX}]" id="comment_list[{attach_row.ASSOC_INDEX}]" rows="1" cols="35" class="inputbox">{attach_row.FILE_COMMENT}</textarea></dd>
+ <dd><a href="{attach_row.U_VIEW_ATTACHMENT}" class="{S_CONTENT_FLOW_END}">{attach_row.FILENAME}</a></dd>
<dd style="margin-top: 5px;">
<!-- IF S_INLINE_ATTACHMENT_OPTIONS --><input type="button" value="{L_PLACE_INLINE}" onclick="attach_inline({attach_row.ASSOC_INDEX}, '{attach_row.FILENAME}');" class="button2" />&nbsp; <!-- ENDIF -->
<input type="submit" name="delete_file[{attach_row.ASSOC_INDEX}]" value="{L_DELETE_FILE}" class="button2" />
diff --git a/phpBB/styles/prosilver/template/report_body.html b/phpBB/styles/prosilver/template/report_body.html
index ecd8a8a706..d67fe90b98 100644
--- a/phpBB/styles/prosilver/template/report_body.html
+++ b/phpBB/styles/prosilver/template/report_body.html
@@ -39,7 +39,7 @@
<div class="content">
<fieldset class="submit-buttons">
<input type="submit" name="submit" class="button1" value="{L_SUBMIT}" />&nbsp;
- <input type="submit" name="cancel" class="button2" value="{L_CANCEL}">
+ <input type="submit" name="cancel" class="button2" value="{L_CANCEL}" />
</fieldset>
</div>
diff --git a/phpBB/styles/prosilver/template/search_results.html b/phpBB/styles/prosilver/template/search_results.html
index e62f8f73bc..186f4b01da 100644
--- a/phpBB/styles/prosilver/template/search_results.html
+++ b/phpBB/styles/prosilver/template/search_results.html
@@ -48,7 +48,7 @@
</dl>
</li>
</ul>
- <ul class="topiclist">
+ <ul class="topiclist topics">
<!-- BEGIN searchresults -->
<li class="row<!-- IF searchresults.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html
index eaf6e6dd03..e702dcc48b 100644
--- a/phpBB/styles/prosilver/template/simple_header.html
+++ b/phpBB/styles/prosilver/template/simple_header.html
@@ -43,18 +43,12 @@
</script>
<script type="text/javascript" src="{T_TEMPLATE_PATH}/styleswitcher.js"></script>
-<!-- IF T_STYLESHEET_LINK -->
- <link href="{T_THEME_PATH}/print.css" rel="stylesheet" type="text/css" media="print" title="printonly" />
- <link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
+<link href="{T_THEME_PATH}/print.css" rel="stylesheet" type="text/css" media="print" title="printonly" />
+<link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
- <link href="{T_THEME_PATH}/normal.css" rel="alternate stylesheet" type="text/css" title="A" />
- <link href="{T_THEME_PATH}/medium.css" rel="alternate stylesheet" type="text/css" title="A+" />
- <link href="{T_THEME_PATH}/large.css" rel="alternate stylesheet" type="text/css" title="A++" />
-<!-- ELSE -->
- <style type="text/css" media="screen, projection">
- {T_THEME_DATA}
- </style>
-<!-- ENDIF -->
+<link href="{T_THEME_PATH}/normal.css" rel="alternate stylesheet" type="text/css" title="A" />
+<link href="{T_THEME_PATH}/medium.css" rel="alternate stylesheet" type="text/css" title="A+" />
+<link href="{T_THEME_PATH}/large.css" rel="alternate stylesheet" type="text/css" title="A++" />
<!-- DEFINE $POPUP = 1 -->
</head>
diff --git a/phpBB/styles/prosilver/template/ucp_groups_manage.html b/phpBB/styles/prosilver/template/ucp_groups_manage.html
index 318c97d497..84b9aae8f9 100644
--- a/phpBB/styles/prosilver/template/ucp_groups_manage.html
+++ b/phpBB/styles/prosilver/template/ucp_groups_manage.html
@@ -104,7 +104,7 @@
<tbody>
<!-- BEGIN leader -->
<tr class="<!-- IF leader.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
- <td class="name"><a href="{leader.U_USER_VIEW}"><strong>{leader.USERNAME}</strong></a></td>
+ <td class="name">{leader.USERNAME_FULL}</td>
<td><!-- IF leader.S_GROUP_DEFAULT -->{L_YES}<!-- ELSE -->{L_NO}<!-- ENDIF --></td>
<td class="posts">{leader.USER_POSTS}</td>
<td class="joined">{leader.JOINED}</td>
@@ -143,7 +143,7 @@
<tbody>
<!-- ELSE -->
<tr class="<!-- IF member.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
- <td class="name"><a href="{member.U_USER_VIEW}"><strong>{member.USERNAME}</strong></a></td>
+ <td class="name">{member.USERNAME_FULL}</td>
<td><!-- IF member.S_GROUP_DEFAULT -->{L_YES}<!-- ELSE -->{L_NO}<!-- ENDIF --></td>
<td class="posts">{member.USER_POSTS}</td>
<td class="joined">{member.JOINED}</td>
diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
index 9aba7614d2..c21d4b0213 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
@@ -31,8 +31,8 @@
<p class="author">
<strong>{L_SENT_AT}:</strong> {SENT_DATE}
<br /><strong>{L_PM_FROM}:</strong> {MESSAGE_AUTHOR_FULL}
- <!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}:</strong> <!-- BEGIN to_recipient --><a href="{to_recipient.U_VIEW}" style="color:<!-- IF to_recipient.COLOUR -->{to_recipient.COLOUR}<!-- ELSEIF to_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{to_recipient.NAME}</a> <!-- END to_recipient --><!-- ENDIF -->
- <!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}:</strong> <!-- BEGIN bcc_recipient --><a href="{bcc_recipient.U_VIEW}" style="color:<!-- IF bcc_recipient.COLOUR -->{bcc_recipient.COLOUR}<!-- ELSEIF bcc_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{bcc_recipient.NAME}</a> <!-- END bcc_recipient --><!-- ENDIF -->
+ <!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}:</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}" style="color:<!-- IF to_recipient.COLOUR -->{to_recipient.COLOUR}<!-- ELSEIF to_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{to_recipient.NAME}</a><!-- ENDIF --> <!-- END to_recipient --><!-- ENDIF -->
+ <!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}:</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}" style="color:<!-- IF bcc_recipient.COLOUR -->{bcc_recipient.COLOUR}<!-- ELSEIF bcc_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{bcc_recipient.NAME}</a><!-- ENDIF --> <!-- END bcc_recipient --><!-- ENDIF -->
</p>
@@ -98,7 +98,7 @@
<!-- IF U_NEXT_PM --><a href="{U_NEXT_PM}" class="right-box {S_CONTENT_FLOW_END}">{L_VIEW_NEXT_PM}</a><!-- ENDIF -->
<!-- IF S_MARK_OPTIONS --><label for="mark_option"><select name="mark_option" id="mark_option">{S_MARK_OPTIONS}</select></label>&nbsp;<input class="button2" type="submit" name="submit_mark" value="{L_GO}" /><!-- ENDIF -->
- <!-- IF not S_UNREAD --><label for="dest_folder"><!-- IF S_VIEW_MESSAGE -->{L_MOVE_TO_FOLDER}: <!-- ELSE -->{L_MOVE_MARKED_TO_FOLDER}<!-- ENDIF --> <select name="dest_folder" id="dest_folder">{S_TO_FOLDER_OPTIONS}</select></label> <input class="button2" type="submit" name="move_pm" value="{L_GO}" /><!-- ENDIF -->
+ <!-- IF not S_UNREAD and not S_SPECIAL_FOLDER --><label for="dest_folder"><!-- IF S_VIEW_MESSAGE -->{L_MOVE_TO_FOLDER}: <!-- ELSE -->{L_MOVE_MARKED_TO_FOLDER}<!-- ENDIF --> <select name="dest_folder" id="dest_folder">{S_TO_FOLDER_OPTIONS}</select></label> <input class="button2" type="submit" name="move_pm" value="{L_GO}" /><!-- ENDIF -->
<input type="hidden" name="marked_msg_id[]" value="{MSG_ID}" />
<input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
<input type="hidden" name="p" value="{MSG_ID}" />
diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
index d323e9d038..b8151ce399 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
@@ -122,7 +122,7 @@ hr.sep {
<td align="{S_CONTENT_FLOW_END}"><span class="gensmall">{S_TIMEZONE}</span></td>
</tr>
<tr>
- <td colspan="2" align="center"><span class="gensmall">Powered by phpBB {PHPBB_VERSION} &copy; 2000, 2002, 2005, 2007 phpBB Group<br />http://www.phpbb.com/</span></td>
+ <td colspan="2" align="center"><span class="gensmall">Powered by phpBB &copy; 2000, 2002, 2005, 2007 phpBB Group<br />http://www.phpbb.com/</span></td>
</tr>
</table>
diff --git a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html
index 7ae6fd054b..329597f542 100644
--- a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html
+++ b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html
@@ -46,17 +46,19 @@
<dt><label for="interests">{L_INTERESTS}:</label></dt>
<dd><textarea name="interests" id="interests" class="inputbox" rows="3" cols="30">{INTERESTS}</textarea></dd>
</dl>
- <dl>
- <dt><label for="bday_day">{L_BIRTHDAY}:</label><br /><span>{L_BIRTHDAY_EXPLAIN}</span></dt>
- <dd>
- <label for="bday_day">{L_DAY}: <select name="bday_day" id="bday_day" style="width: 40px;">{S_BIRTHDAY_DAY_OPTIONS}</select></label>
- <label for="bday_month">{L_MONTH}: <select name="bday_month" id="bday_month" style="width: 40px;">{S_BIRTHDAY_MONTH_OPTIONS}</select></label>
- <label for="bday_year">{L_YEAR}: <select name="bday_year" id="bday_year" style="width: 60px;">{S_BIRTHDAY_YEAR_OPTIONS}</select></label>
- </dd>
- </dl>
+ <!-- IF S_BIRTHDAYS_ENABLED -->
+ <dl>
+ <dt><label for="bday_day">{L_BIRTHDAY}:</label><br /><span>{L_BIRTHDAY_EXPLAIN}</span></dt>
+ <dd>
+ <label for="bday_day">{L_DAY}: <select name="bday_day" id="bday_day" style="width: 40px;">{S_BIRTHDAY_DAY_OPTIONS}</select></label>
+ <label for="bday_month">{L_MONTH}: <select name="bday_month" id="bday_month" style="width: 40px;">{S_BIRTHDAY_MONTH_OPTIONS}</select></label>
+ <label for="bday_year">{L_YEAR}: <select name="bday_year" id="bday_year" style="width: 60px;">{S_BIRTHDAY_YEAR_OPTIONS}</select></label>
+ </dd>
+ </dl>
+ <!-- ENDIF -->
<!-- BEGIN profile_fields -->
<dl>
- <dt><label for="{profile_fields.FIELD_ID}">{profile_fields.LANG_NAME}:<!-- IF profile_fields.S_REQUIRED --> *<!-- ENDIF --></label>
+ <dt><label <!-- IF profile_fields.FIELD_ID -->for="{profile_fields.FIELD_ID}"<!-- ENDIF -->>{profile_fields.LANG_NAME}:<!-- IF profile_fields.S_REQUIRED --> *<!-- ENDIF --></label>
<!-- IF profile_fields.LANG_EXPLAIN --><br /><span>{profile_fields.LANG_EXPLAIN}</span><!-- ENDIF --></dt>
<!-- IF profile_fields.ERROR --><dd class="error">{profile_fields.ERROR}</dd><!-- ENDIF -->
<dd>{profile_fields.FIELD}</dd>
diff --git a/phpBB/styles/prosilver/template/ucp_register.html b/phpBB/styles/prosilver/template/ucp_register.html
index e9e17fc2cf..66245f3e6d 100644
--- a/phpBB/styles/prosilver/template/ucp_register.html
+++ b/phpBB/styles/prosilver/template/ucp_register.html
@@ -63,7 +63,7 @@
<!-- BEGIN profile_fields -->
<dl>
- <dt><label for="{profile_fields.FIELD_ID}">{profile_fields.LANG_NAME}:<!-- IF profile_fields.S_REQUIRED --> *<!-- ENDIF --></label>
+ <dt><label <!-- IF profile_fields.FIELD_ID -->for="{profile_fields.FIELD_ID}" <!-- ENDIF -->>{profile_fields.LANG_NAME}:<!-- IF profile_fields.S_REQUIRED --> *<!-- ENDIF --></label>
<!-- IF profile_fields.LANG_EXPLAIN --><br /><span>{profile_fields.LANG_EXPLAIN}</span><!-- ENDIF -->
<!-- IF profile_fields.ERROR --><br /><span class="error">{profile_fields.ERROR}</span><!-- ENDIF --></dt>
<dd>{profile_fields.FIELD}</dd>
diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html
index c950055574..7d03939605 100644
--- a/phpBB/styles/prosilver/template/viewforum_body.html
+++ b/phpBB/styles/prosilver/template/viewforum_body.html
@@ -28,21 +28,19 @@
<!-- IF S_HAS_SUBFORUM -->
<!-- IF not S_IS_BOT and U_MARK_FORUMS -->
<ul class="linklist">
- <li class="rightside"><a href="{U_MARK_FORUMS}">{L_MARK_FORUMS_READ}</a></li>
+ <li class="rightside"><a href="{U_MARK_FORUMS}">{L_MARK_FORUMS_READ}</a></li>
</ul>
<!-- ENDIF -->
<!-- INCLUDE forumlist_body.html -->
<!-- ENDIF -->
-<!-- IF U_POST_REPLY_TOPIC or S_IS_POSTABLE or PAGINATION or TOTAL_POSTS or TOTAL_TOPICS -->
+<!-- IF S_DISPLAY_POST_INFO or PAGINATION or TOTAL_POSTS or TOTAL_TOPICS -->
<div class="topic-actions" <!-- IF S_HAS_SUBFORUM -->style="margin-top: 2em;"<!-- ENDIF -->>
- <!-- IF not S_IS_BOT -->
- <!-- IF U_POST_REPLY_TOPIC or S_IS_POSTABLE -->
- <div class="buttons">
- <div class="post-icon"><a href="{U_POST_NEW_TOPIC}" accesskey="n"><span>{L_POST_TOPIC}</span></a></div>
- </div>
- <!-- ENDIF -->
+ <!-- IF not S_IS_BOT and S_DISPLAY_POST_INFO -->
+ <div class="buttons">
+ <div class="post-icon"><a href="{U_POST_NEW_TOPIC}" accesskey="n"><span>{L_POST_TOPIC}</span></a></div>
+ </div>
<!-- ENDIF -->
<!-- IF S_DISPLAY_SEARCHBOX -->
@@ -123,7 +121,7 @@
<!-- IF topicrow.S_FIRST_ROW or not topicrow.S_TOPIC_TYPE_SWITCH -->
<div class="forumbg<!-- IF topicrow.S_TOPIC_TYPE_SWITCH --> announcement<!-- ENDIF -->">
<div class="inner"><span class="corners-top"><span></span></span>
- <ul class="topiclist topics">
+ <ul class="topiclist">
<li class="header">
<dl class="icon">
<dt><!-- IF S_DISPLAY_ACTIVE -->{L_ACTIVE_TOPICS}<!-- ELSEIF topicrow.S_TOPIC_TYPE_SWITCH and topicrow.S_TOPIC_TYPE gt 1 -->{L_ANNOUNCEMENTS}<!-- ELSE -->{L_TOPICS}<!-- ENDIF --></dt>
@@ -159,17 +157,15 @@
<!-- ENDIF -->
<!-- BEGINELSE -->
- <!-- IF S_IS_POSTABLE -->
<div class="panel">
<div class="inner"><span class="corners-top"><span></span></span>
<strong>{L_NO_TOPICS}</strong>
<span class="corners-bottom"><span></span></span></div>
</div>
- <!-- ENDIF -->
<!-- END topicrow -->
<!-- IF S_SELECT_SORT_DAYS and not S_DISPLAY_ACTIVE -->
- <form method="post" action="{S_TOPIC_ACTION}">
+ <form method="post" action="{S_FORUM_ACTION}">
<fieldset class="display-options">
<!-- IF PREVIOUS_PAGE --><a href="{PREVIOUS_PAGE}" class="left-box {S_CONTENT_FLOW_BEGIN}">{L_PREVIOUS}</a><!-- ENDIF -->
<!-- IF NEXT_PAGE --><a href="{NEXT_PAGE}" class="right-box {S_CONTENT_FLOW_END}">{L_NEXT}</a><!-- ENDIF -->
@@ -183,15 +179,15 @@
<!-- IF .topicrow and not S_DISPLAY_ACTIVE -->
<div class="topic-actions">
- <!-- IF S_IS_POSTABLE and not S_IS_BOT -->
+ <!-- IF not S_IS_BOT and S_DISPLAY_POST_INFO -->
<div class="buttons">
- <div class="post-icon"><a href="{U_POST_NEW_TOPIC}"><span>{L_POST_REPLY}</span></a></div>
+ <div class="post-icon"><a href="{U_POST_NEW_TOPIC}"><span>{L_POST_TOPIC}</span></a></div>
</div>
<!-- ENDIF -->
<!-- IF PAGINATION or TOTAL_POSTS or TOTAL_TOPICS -->
<div class="pagination">
- <!-- IF not U_POST_REPLY_TOPIC and TOTAL_TOPICS and not S_IS_BOT and U_MARK_TOPICS --><a href="{U_MARK_TOPICS}">{L_MARK_TOPICS_READ}</a> &bull; <!-- ENDIF -->
+ <!-- IF TOTAL_TOPICS and not S_IS_BOT and U_MARK_TOPICS --><a href="{U_MARK_TOPICS}">{L_MARK_TOPICS_READ}</a> &bull; <!-- ENDIF -->
<!-- IF TOTAL_POSTS and not NEWEST_USER --> {TOTAL_POSTS}<!-- ELSEIF TOTAL_TOPICS and not NEWEST_USER --> {TOTAL_TOPICS}<!-- ENDIF -->
<!-- IF TOTAL_USERS -->{TOTAL_USERS}<!-- ENDIF -->
<!-- IF PAGINATION --> &bull; <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a>
@@ -208,7 +204,7 @@
<p>{LOGGED_IN_USER_LIST}</p>
<!-- ENDIF -->
-<!-- IF S_IS_POSTABLE -->
+<!-- IF S_DISPLAY_POST_INFO -->
<h3>{L_FORUM_PERMISSIONS}</h3>
<p><!-- BEGIN rules -->{rules.RULE}<br /><!-- END rules --></p>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/viewonline_body.html b/phpBB/styles/prosilver/template/viewonline_body.html
index 47fe6709f2..9f338b2104 100644
--- a/phpBB/styles/prosilver/template/viewonline_body.html
+++ b/phpBB/styles/prosilver/template/viewonline_body.html
@@ -23,7 +23,8 @@
<tbody>
<!-- BEGIN user_row -->
<tr class="<!-- IF user_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
- <td><!-- IF user_row.U_USER_PROFILE --><a href="{user_row.U_USER_PROFILE}" class="title"><!-- ENDIF -->{user_row.USERNAME}<!-- IF user_row.U_USER_PROFILE --></a><!-- ENDIF --><!-- IF user_row.USER_IP --> <span style="margin-left:30px; ">{L_IP}: <a href="{user_row.U_USER_IP}">{user_row.USER_IP}</a> &#187; <a href="{user_row.U_WHOIS}" onclick="popup('{user_row.U_WHOIS}', 750, 500);return false">{L_WHOIS}</a></span><!-- ENDIF --></td>
+ <td>{user_row.USERNAME_FULL}<!-- IF user_row.USER_IP --> <span style="margin-left: 30px;">{L_IP}: <a href="{user_row.U_USER_IP}">{user_row.USER_IP}</a> &#187; <a href="{user_row.U_WHOIS}" onclick="popup('{user_row.U_WHOIS}', 750, 500);return false">{L_WHOIS}</a></span><!-- ENDIF -->
+ <!-- IF user_row.USER_BROWSER --><br />{user_row.USER_BROWSER}<!-- ENDIF --></td>
<td class="info"><a href="{user_row.U_FORUM_LOCATION}">{user_row.FORUM_LOCATION}</a></td>
<td class="active">{user_row.LASTUPDATE}</td>
</tr>
diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html
index 58d1f1a780..840d029b3b 100644
--- a/phpBB/styles/prosilver/template/viewtopic_body.html
+++ b/phpBB/styles/prosilver/template/viewtopic_body.html
@@ -31,8 +31,8 @@
<div class="topic-actions">
<div class="buttons">
- <!-- IF not S_IS_BOT -->
- <!-- IF U_POST_REPLY_TOPIC or S_IS_POSTABLE --><div class="<!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->reply-icon<!-- ENDIF -->"><a href="{U_POST_REPLY_TOPIC}"><span><!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF --></span></a></div><!-- ENDIF -->
+ <!-- IF not S_IS_BOT and S_DISPLAY_REPLY_INFO -->
+ <div class="<!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->reply-icon<!-- ENDIF -->"><a href="{U_POST_REPLY_TOPIC}"><span><!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF --></span></a></div>
<!-- ENDIF -->
</div>
@@ -206,6 +206,7 @@
<!-- IF postrow.U_YIM --><li class="yahoo-icon"><a href="{postrow.U_YIM}" title="{L_YIM}"><span>{L_YIM}</span></a></li><!-- ENDIF -->
<!-- IF postrow.U_AIM --><li class="aim-icon"><a href="{postrow.U_AIM}" title="{L_AIM}"><span>{L_AIM}</span></a></li><!-- ENDIF -->
<!-- IF postrow.U_JABBER --><li class="jabber-icon"><a href="{postrow.U_JABBER}" onclick="popup('{postrow.U_JABBER}', 550, 320); return false;" title="{L_JABBER}"><span>{L_JABBER}</span></a></li><!-- ENDIF -->
+ </ul>
</dd>
<!-- ENDIF -->
<!-- ENDIF -->
@@ -237,8 +238,8 @@
<div class="topic-actions">
<div class="buttons">
- <!-- IF not S_IS_BOT -->
- <!-- IF U_POST_REPLY_TOPIC or S_IS_POSTABLE --><div class="<!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->reply-icon<!-- ENDIF -->"><a href="{U_POST_REPLY_TOPIC}"><span><!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF --></span></a></div><!-- ENDIF -->
+ <!-- IF not S_IS_BOT and S_DISPLAY_REPLY_INFO -->
+ <div class="<!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->reply-icon<!-- ENDIF -->"><a href="{U_POST_REPLY_TOPIC}"><span><!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF --></span></a></div>
<!-- ENDIF -->
</div>
@@ -255,7 +256,7 @@
<!-- IF S_TOPIC_MOD -->
<form method="post" action="{S_MOD_ACTION}">
<fieldset class="quickmod">
- <label>{L_QUICK_MOD}: {S_TOPIC_MOD}</label> <input type="submit" value="{L_GO}" class="button2" />
+ <label>{L_QUICK_MOD}:</label>{S_TOPIC_MOD} <input type="submit" value="{L_GO}" class="button2" />
</fieldset>
</form>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/viewtopic_print.html b/phpBB/styles/prosilver/template/viewtopic_print.html
index db6a5c7648..a7d9731ab2 100644
--- a/phpBB/styles/prosilver/template/viewtopic_print.html
+++ b/phpBB/styles/prosilver/template/viewtopic_print.html
@@ -54,7 +54,7 @@
//-->
<div id="page-footer">
<div class="page-number">{S_TIMEZONE}<br />{PAGE_NUMBER}</div>
- <div class="copyright">Powered by phpBB {PHPBB_VERSION} &copy; 2000, 2002, 2005, 2007 phpBB Group<br />http://www.phpbb.com/</div>
+ <div class="copyright">Powered by phpBB &copy; 2000, 2002, 2005, 2007 phpBB Group<br />http://www.phpbb.com/</div>
</div>
</div>
diff --git a/phpBB/styles/prosilver/theme/buttons.css b/phpBB/styles/prosilver/theme/buttons.css
index b3a4e68705..6d07dd3511 100644
--- a/phpBB/styles/prosilver/theme/buttons.css
+++ b/phpBB/styles/prosilver/theme/buttons.css
@@ -66,10 +66,6 @@ a.sendemail {
width: 22px;
}
-a.sendemail:hover {
- background-position: 0 -18px;
-}
-
a.fontsize {
background-image: none;
background-position: 0 -1px;
diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css
index c1a0c504ca..e46bbba836 100644
--- a/phpBB/styles/prosilver/theme/common.css
+++ b/phpBB/styles/prosilver/theme/common.css
@@ -321,6 +321,7 @@ ul.linklist li.rightside, p.rightside {
ul.navlinks {
padding-bottom: 1px;
+ margin-bottom: 1px;
border-bottom: 1px solid #FFFFFF;
font-weight: bold;
}
@@ -581,6 +582,10 @@ div.rules {
font-size: 1.1em;
}
+div.rules li {
+ margin-left: 20px;
+}
+
p.rules {
background-color: #ececec;
background-image: none;
diff --git a/phpBB/styles/prosilver/theme/forms.css b/phpBB/styles/prosilver/theme/forms.css
index 8031f52b81..1f48d02dae 100644
--- a/phpBB/styles/prosilver/theme/forms.css
+++ b/phpBB/styles/prosilver/theme/forms.css
@@ -79,12 +79,12 @@ fieldset dd {
/* Specific layout 1 */
fieldset.fields1 dt {
- width: 10em;
+ width: 15em;
border-right-width: 0;
}
fieldset.fields1 dd {
- margin-left: 10em;
+ margin-left: 15em;
border-left-width: 0;
}
@@ -294,7 +294,7 @@ fieldset.submit-buttons input {
input.inputbox { width: 85%; }
input.medium { width: 50%; }
input.narrow { width: 25%; }
-input.tiny { width: 110px; }
+input.tiny { width: 125px; }
textarea.inputbox {
width: 85%;
diff --git a/phpBB/styles/subsilver2/template/index_body.html b/phpBB/styles/subsilver2/template/index_body.html
index 1a78fff7c7..e45a5d9383 100644
--- a/phpBB/styles/subsilver2/template/index_body.html
+++ b/phpBB/styles/subsilver2/template/index_body.html
@@ -21,7 +21,7 @@
<table class="tablebg" width="100%" cellspacing="1">
<tr>
- <td class="cat" colspan="2"><h4><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h4></td>
+ <td class="cat" colspan="2"><!-- IF U_VIEWONLINE --><h4><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h4><!-- ELSE --><h4>{L_WHO_IS_ONLINE}</h4><!-- ENDIF --></td>
</tr>
<tr>
<!-- IF LEGEND -->
@@ -75,7 +75,7 @@
<td class="cat"><h4><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a></h4></td>
</tr>
<tr>
- <td class="row1" align="center"><span class="genmed">{L_USERNAME}:</span> <input class="post" type="text" name="username" size="10" />&nbsp; <span class="genmed">{L_PASSWORD}:</span> <input class="post" type="password" name="password" size="10" />&nbsp; <span class="gensmall">{L_LOG_ME_IN}</span> <input type="checkbox" class="radio" name="autologin" />&nbsp; <input type="submit" class="btnmain" name="login" value="{L_LOGIN}" /></td>
+ <td class="row1" align="center"><span class="genmed">{L_USERNAME}:</span> <input class="post" type="text" name="username" size="10" />&nbsp; <span class="genmed">{L_PASSWORD}:</span> <input class="post" type="password" name="password" size="10" />&nbsp; <!-- IF S_AUTOLOGIN_ENABLED --> <span class="gensmall">{L_LOG_ME_IN}</span> <input type="checkbox" class="radio" name="autologin" /><!-- ENDIF -->&nbsp; <input type="submit" class="btnmain" name="login" value="{L_LOGIN}" /></td>
</tr>
</table>
diff --git a/phpBB/styles/subsilver2/template/mcp_approve.html b/phpBB/styles/subsilver2/template/mcp_approve.html
index b8e89b330a..22b89cff47 100644
--- a/phpBB/styles/subsilver2/template/mcp_approve.html
+++ b/phpBB/styles/subsilver2/template/mcp_approve.html
@@ -11,7 +11,7 @@
<tr>
<td class="row1" align="center">
<!-- IF ADDITIONAL_MSG -->
- <span class="gen" style="color:red">{ADDITIONAL_MSG}</span><br />
+ <span class="gen error">{ADDITIONAL_MSG}</span><br />
<!-- ENDIF -->
<!-- IF S_NOTIFY_POSTER -->
<input type="checkbox" class="radio" name="notify_poster" checked="checked" /><span class="gen"><!-- IF S_APPROVE -->{L_NOTIFY_POSTER_APPROVAL}<!-- ELSE -->{L_NOTIFY_POSTER_DISAPPROVAL}<!-- ENDIF --></span><br />
diff --git a/phpBB/styles/subsilver2/template/mcp_logs.html b/phpBB/styles/subsilver2/template/mcp_logs.html
index d759af5931..e163cf35d0 100644
--- a/phpBB/styles/subsilver2/template/mcp_logs.html
+++ b/phpBB/styles/subsilver2/template/mcp_logs.html
@@ -26,7 +26,7 @@
</tr>
<!-- IF S_CLEAR_ALLOWED -->
<tr>
- <td class="cat" colspan="5" align="center"><input class="btnlite" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />&nbsp; <input class="btnlite" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" /></td>
+ <td class="cat" colspan="5" align="center"><input class="btnlite" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />&nbsp; <input class="btnlite" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" /></td>
</tr>
<!-- ENDIF -->
<!-- ELSE -->
diff --git a/phpBB/styles/subsilver2/template/mcp_move.html b/phpBB/styles/subsilver2/template/mcp_move.html
index eed7ca8fe3..6e2356044f 100644
--- a/phpBB/styles/subsilver2/template/mcp_move.html
+++ b/phpBB/styles/subsilver2/template/mcp_move.html
@@ -11,7 +11,7 @@
<tr>
<td class="row1" align="center">
<!-- IF ADDITIONAL_MSG -->
- <span class="gen" style="color:red">{ADDITIONAL_MSG}</span><br />
+ <span class="gen error">{ADDITIONAL_MSG}</span><br />
<!-- ENDIF -->
<!-- IF S_FORUM_SELECT -->
<span class="gen"><br />{L_SELECT_DESTINATION_FORUM}&nbsp;&nbsp;</span>
diff --git a/phpBB/styles/subsilver2/template/mcp_notes_user.html b/phpBB/styles/subsilver2/template/mcp_notes_user.html
index 54ddeb05be..fdc3bcd094 100644
--- a/phpBB/styles/subsilver2/template/mcp_notes_user.html
+++ b/phpBB/styles/subsilver2/template/mcp_notes_user.html
@@ -80,7 +80,7 @@
<!-- IF S_CLEAR_ALLOWED -->
<tr>
- <td class="cat" colspan="5" align="center"><input class="btnlite" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />&nbsp; <input class="btnlite" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" /></td>
+ <td class="cat" colspan="5" align="center"><input class="btnlite" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />&nbsp; <input class="btnlite" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" /></td>
</tr>
<!-- ENDIF -->
diff --git a/phpBB/styles/subsilver2/template/mcp_topic.html b/phpBB/styles/subsilver2/template/mcp_topic.html
index 5cf4ac5ca6..9bcd302c9b 100644
--- a/phpBB/styles/subsilver2/template/mcp_topic.html
+++ b/phpBB/styles/subsilver2/template/mcp_topic.html
@@ -25,7 +25,7 @@
<td class="row2" colspan="2">
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
- <td><span class="genmed nowrap"><input type="radio" class="radio" name="icon" value="0"<!-- IF not S_TOPIC_ICON --> checked="checked"<!-- ENDIF --> />{L_NO_TOPIC_ICON}</span> <!-- BEGIN topic_icon --><span class="nowrap"><input type="radio" class="radio" name="icon" value="{topic_icon.ICON_ID}"<!-- IF topic_icon.S_CHECKED --> checked="checked"<!-- ENDIF --> /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" hspace="2" vspace="2" /></span><!-- END topic_icon --></td>
+ <td><span class="genmed nowrap"><input type="radio" class="radio" name="icon" value="0"<!-- IF not S_TOPIC_ICON --> checked="checked"<!-- ENDIF --> />{L_NO_TOPIC_ICON}</span> <!-- BEGIN topic_icon --><span class="nowrap"><input type="radio" class="radio" name="icon" value="{topic_icon.ICON_ID}"<!-- IF topic_icon.S_CHECKED --> checked="checked"<!-- ENDIF --> /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" hspace="2" vspace="2" /></span> <!-- END topic_icon --></td>
</tr>
</table>
</td>
diff --git a/phpBB/styles/subsilver2/template/memberlist_view.html b/phpBB/styles/subsilver2/template/memberlist_view.html
index fb9a014331..98536a5265 100644
--- a/phpBB/styles/subsilver2/template/memberlist_view.html
+++ b/phpBB/styles/subsilver2/template/memberlist_view.html
@@ -138,10 +138,12 @@
<td class="gen" align="{S_CONTENT_FLOW_END}" nowrap="nowrap">{L_LOCATION}: </td>
<td><!-- IF LOCATION --><b class="genmed">{LOCATION}</b><!-- ENDIF --></td>
</tr>
+ <!-- IF AGE -->
<tr>
<td class="gen" align="{S_CONTENT_FLOW_END}" nowrap="nowrap">{L_AGE}: </td>
- <td><!-- IF AGE --><b class="genmed">{AGE}</b><!-- ENDIF --></td>
+ <td><b class="genmed"><!-- IF AGE -->{AGE}<!-- ELSE --> - <!-- ENDIF --></b></td>
</tr>
+ <!-- ENDIF -->
<tr>
<td class="gen" align="{S_CONTENT_FLOW_END}" nowrap="nowrap">{L_OCCUPATION}: </td>
<td><!-- IF OCCUPATION --><b class="genmed">{OCCUPATION}</b><!-- ENDIF --></td>
diff --git a/phpBB/styles/subsilver2/template/overall_header.html b/phpBB/styles/subsilver2/template/overall_header.html
index 3eaae01108..4cdd0c993e 100644
--- a/phpBB/styles/subsilver2/template/overall_header.html
+++ b/phpBB/styles/subsilver2/template/overall_header.html
@@ -14,13 +14,7 @@
{META}
<title>{SITENAME} &bull; <!-- IF S_IN_MCP -->{L_MCP} &bull; <!-- ELSEIF S_IN_UCP -->{L_UCP} &bull; <!-- ENDIF -->{PAGE_TITLE}</title>
-<!-- IF T_STYLESHEET_LINK -->
<link rel="stylesheet" href="{T_STYLESHEET_LINK}" type="text/css" />
-<!-- ELSE -->
-<style type="text/css">
-{T_THEME_DATA}
-</style>
-<!-- ENDIF -->
<script type="text/javascript">
<!--
diff --git a/phpBB/styles/subsilver2/template/posting_body.html b/phpBB/styles/subsilver2/template/posting_body.html
index 7a803f5e7d..c0870da8f6 100644
--- a/phpBB/styles/subsilver2/template/posting_body.html
+++ b/phpBB/styles/subsilver2/template/posting_body.html
@@ -7,10 +7,10 @@
<!-- IF S_FORUM_RULES -->
<div class="forumrules">
<!-- IF U_FORUM_RULES -->
- <h3 style="color:red">{L_FORUM_RULES}</h3><br />
+ <h3>{L_FORUM_RULES}</h3><br />
<a href="{U_FORUM_RULES}"><b>{L_FORUM_RULES_LINK}</b></a>
<!-- ELSE -->
- <h3 style="color:red">{L_FORUM_RULES}</h3><br />
+ <h3>{L_FORUM_RULES}</h3><br />
{FORUM_RULES}
<!-- ENDIF -->
</div>
@@ -110,7 +110,7 @@
<!-- IF ERROR -->
<tr>
- <td class="row2" colspan="2" align="center"><span class="genmed" style="color:red">{ERROR}</span></td>
+ <td class="row2" colspan="2" align="center"><span class="genmed error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
diff --git a/phpBB/styles/subsilver2/template/ucp_groups_manage.html b/phpBB/styles/subsilver2/template/ucp_groups_manage.html
index ed26b75140..bce8546920 100644
--- a/phpBB/styles/subsilver2/template/ucp_groups_manage.html
+++ b/phpBB/styles/subsilver2/template/ucp_groups_manage.html
@@ -97,7 +97,7 @@
<!-- IF S_DISPLAY_GALLERY -->
<tr>
<td class="row1" width="35%"><label>{L_AVATAR_GALLERY}:</label></td>
- <td class="row2"><input class="button2" type="submit" name="display_gallery" value="{L_DISPLAY_GALLERY}" /></td>
+ <td class="row2"><input class="btnmain" type="submit" name="display_gallery" value="{L_DISPLAY_GALLERY}" /></td>
</tr>
<!-- ENDIF -->
<!-- ELSE -->
@@ -107,7 +107,7 @@
</tr>
<tr>
<td class="row1" width="35%"><label for="category">{L_AVATAR_CATEGORY}:</label></td>
- <td class="row2"><select name="category" id="category">{S_CAT_OPTIONS}</select>&nbsp;<input class="button2" type="submit" value="{L_GO}" name="display_gallery" /></td>
+ <td class="row2"><select name="category" id="category">{S_CAT_OPTIONS}</select>&nbsp;<input class="btnmain" type="submit" value="{L_GO}" name="display_gallery" /></td>
</tr>
<tr>
<td class="row1" width="35%">
@@ -126,14 +126,14 @@
<!-- END avatar_row -->
</table>
</td>
- <td class="row2"><input class="button2" type="submit" name="cancel" value="{L_CANCEL}" /></td>
+ <td class="row2"><input class="btnmain" type="submit" name="cancel" value="{L_CANCEL}" /></td>
</tr>
<!-- ENDIF -->
<tr>
- <td class="cat" colspan="2" align="center"><input class="button1" type="submit" id="submit" name="update" value="{L_SUBMIT}" />&nbsp;
- <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" /></td>
+ <td class="cat" colspan="2" align="center"><input class="btnlite" type="submit" id="submit" name="update" value="{L_SUBMIT}" />&nbsp;
+ <input class="btnmain" type="reset" id="reset" name="reset" value="{L_RESET}" /></td>
</tr>
</table>
@@ -157,7 +157,7 @@
</tr>
<!-- BEGIN leader -->
<!-- IF leader.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
- <td><a href="{leader.U_USER_VIEW}">{leader.USERNAME}</a></td>
+ <td>{leader.USERNAME_FULL}</td>
<td style="text-align: center;"><!-- IF leader.S_GROUP_DEFAULT -->{L_YES}<!-- ELSE -->{L_NO}<!-- ENDIF --></td>
<td style="text-align: center;">{leader.JOINED}</td>
<td style="text-align: center;">{leader.USER_POSTS}</td>
@@ -174,7 +174,7 @@
</tr>
<!-- ELSE -->
<!-- IF member.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
- <td><a href="{member.U_USER_VIEW}">{member.USERNAME}</a></td>
+ <td>{member.USERNAME_FULL}</td>
<td style="text-align: center;"><!-- IF member.S_GROUP_DEFAULT -->{L_YES}<!-- ELSE -->{L_NO}<!-- ENDIF --></td>
<td style="text-align: center;">{member.JOINED}</td>
<td style="text-align: center;">{member.USER_POSTS}</td>
@@ -187,7 +187,7 @@
</tr>
<!-- END member -->
<tr>
- <td class="cat" colspan="5" align="center"><div style="float: {S_CONTENT_FLOW_END};"><span class="small"><a href="#" onclick="marklist('ucp', 'mark', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('ucp', 'mark', false); return false;">{L_UNMARK_ALL}</a></span></div><div style="float: {S_CONTENT_FLOW_BEGIN};"><select name="action"><option class="sep" value="">{L_SELECT_OPTION}</option>{S_ACTION_OPTIONS}</select> <input class="button2" type="submit" name="update" value="{L_SUBMIT}" /></div></td>
+ <td class="cat" colspan="5" align="center"><div style="float: {S_CONTENT_FLOW_END};"><span class="small"><a href="#" onclick="marklist('ucp', 'mark', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('ucp', 'mark', false); return false;">{L_UNMARK_ALL}</a></span></div><div style="float: {S_CONTENT_FLOW_BEGIN};"><select name="action"><option class="sep" value="">{L_SELECT_OPTION}</option>{S_ACTION_OPTIONS}</select> <input class="btnmain" type="submit" name="update" value="{L_SUBMIT}" /></div></td>
</tr>
</table>
@@ -219,7 +219,7 @@
<td class="row2"><textarea id="usernames" name="usernames" cols="40" rows="5"></textarea><br />[ <a href="{U_FIND_USERNAME}" onclick="find_username(); return false;">{L_FIND_USERNAME}</a> ]</td>
</tr>
<tr>
- <td class="cat" colspan="2" align="center"><input class="button2" type="submit" name="addusers" value="{L_SUBMIT}" /></td>
+ <td class="cat" colspan="2" align="center"><input class="btnmain" type="submit" name="addusers" value="{L_SUBMIT}" /></td>
</tr>
</table>
diff --git a/phpBB/styles/subsilver2/template/ucp_main_drafts.html b/phpBB/styles/subsilver2/template/ucp_main_drafts.html
index 05749efabe..a8611684b3 100644
--- a/phpBB/styles/subsilver2/template/ucp_main_drafts.html
+++ b/phpBB/styles/subsilver2/template/ucp_main_drafts.html
@@ -10,7 +10,7 @@
<!-- IF ERROR -->
<tr>
- <td class="row1" colspan="2" align="center"><span class="genmed" style="color:red">{ERROR}</span></td>
+ <td class="row1" colspan="2" align="center"><span class="genmed error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
diff --git a/phpBB/styles/subsilver2/template/ucp_main_front.html b/phpBB/styles/subsilver2/template/ucp_main_front.html
index 8d0d752559..4dbe2353ae 100644
--- a/phpBB/styles/subsilver2/template/ucp_main_front.html
+++ b/phpBB/styles/subsilver2/template/ucp_main_front.html
@@ -43,7 +43,7 @@
</tr>
<tr>
<td align="{S_CONTENT_FLOW_END}" valign="top" nowrap="nowrap"><b class="genmed">{L_TOTAL_POSTS}: </b></td>
- <td><!-- IF POSTS_PCT --><b class="gen">{POSTS}</b><br /><span class="genmed">[{POSTS_PCT} / {POSTS_DAY}]<br /><a href="{U_SEARCH_USER}">{L_SEARCH_USER_POSTS}</a></span><!-- ELSE --><b class="gen">{POSTS}<b><!-- ENDIF --></td>
+ <td><!-- IF POSTS_PCT --><b class="gen">{POSTS}</b><br /><span class="genmed">[{POSTS_PCT} / {POSTS_DAY}]<br /><a href="{U_SEARCH_SELF}">{L_SEARCH_YOUR_POSTS}</a></span><!-- ELSE --><b class="gen">{POSTS}<b><!-- ENDIF --></td>
</tr>
<!-- IF S_SHOW_ACTIVITY -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_pm_message_footer.html b/phpBB/styles/subsilver2/template/ucp_pm_message_footer.html
index 61d3c8300e..b65ab40129 100644
--- a/phpBB/styles/subsilver2/template/ucp_pm_message_footer.html
+++ b/phpBB/styles/subsilver2/template/ucp_pm_message_footer.html
@@ -18,12 +18,14 @@
</td>
<td align="{S_CONTENT_FLOW_END}" nowrap="nowrap">
<!-- IF S_VIEW_MESSAGE -->
- <form name="movepm" method="post" action="{S_PM_ACTION}" style="margin:0px">
- <input type="hidden" name="marked_msg_id[]" value="{MSG_ID}" />
- <input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
- <input type="hidden" name="p" value="{MSG_ID}" />
- <select name="dest_folder">{S_TO_FOLDER_OPTIONS}</select>&nbsp;<input class="btnlite" type="submit" name="move_pm" value="{L_MOVE_TO_FOLDER}" />
- </form>
+ <!-- IF not S_SPECIAL_FOLDER -->
+ <form name="movepm" method="post" action="{S_PM_ACTION}" style="margin:0px">
+ <input type="hidden" name="marked_msg_id[]" value="{MSG_ID}" />
+ <input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
+ <input type="hidden" name="p" value="{MSG_ID}" />
+ <select name="dest_folder">{S_TO_FOLDER_OPTIONS}</select>&nbsp;<input class="btnlite" type="submit" name="move_pm" value="{L_MOVE_TO_FOLDER}" />
+ </form>
+ <!-- ENDIF -->
<!-- ELSE -->
<form name="sortmsg" method="post" action="{S_PM_ACTION}" style="margin:0px">
<span class="gensmall">{L_DISPLAY_MESSAGES}:</span> {S_SELECT_SORT_DAYS} <span class="gensmall">{L_SORT_BY}</span> {S_SELECT_SORT_KEY} {S_SELECT_SORT_DIR} <input class="btnlite" type="submit" name="sort" value="{L_GO}" />
diff --git a/phpBB/styles/subsilver2/template/ucp_pm_options.html b/phpBB/styles/subsilver2/template/ucp_pm_options.html
index a2a95826fd..fe0d8ce199 100644
--- a/phpBB/styles/subsilver2/template/ucp_pm_options.html
+++ b/phpBB/styles/subsilver2/template/ucp_pm_options.html
@@ -4,8 +4,8 @@
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="row3" align="center">
- <!-- IF ERROR_MESSAGE --><span class="genmed" style="color:red">{ERROR_MESSAGE}</span><!-- ENDIF -->
- <!-- IF NOTIFICATION_MESSAGE --><span class="genmed" style="color:red">{NOTIFICATION_MESSAGE}</span><!-- ENDIF -->
+ <!-- IF ERROR_MESSAGE --><span class="genmed error">{ERROR_MESSAGE}</span><!-- ENDIF -->
+ <!-- IF NOTIFICATION_MESSAGE --><span class="genmed error">{NOTIFICATION_MESSAGE}</span><!-- ENDIF -->
</td>
</tr>
</table>
diff --git a/phpBB/styles/subsilver2/template/ucp_pm_viewmessage.html b/phpBB/styles/subsilver2/template/ucp_pm_viewmessage.html
index f3dea150b2..321bc28a40 100644
--- a/phpBB/styles/subsilver2/template/ucp_pm_viewmessage.html
+++ b/phpBB/styles/subsilver2/template/ucp_pm_viewmessage.html
@@ -80,7 +80,7 @@
<!-- ENDIF -->
<!-- IF S_DISPLAY_NOTICE -->
- <span class="gensmall" style="color:red;"><br /><br />{L_DOWNLOAD_NOTICE}</span>
+ <span class="gensmall error"><br /><br />{L_DOWNLOAD_NOTICE}</span>
<!-- ENDIF -->
<!-- IF SIGNATURE -->
<span class="postbody"><br />_________________<br />{SIGNATURE}</span>
diff --git a/phpBB/styles/subsilver2/template/ucp_prefs_personal.html b/phpBB/styles/subsilver2/template/ucp_prefs_personal.html
index 3546a127f7..3dd6e3cfb4 100644
--- a/phpBB/styles/subsilver2/template/ucp_prefs_personal.html
+++ b/phpBB/styles/subsilver2/template/ucp_prefs_personal.html
@@ -24,7 +24,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_prefs_post.html b/phpBB/styles/subsilver2/template/ucp_prefs_post.html
index 7ef608f379..edf0070baa 100644
--- a/phpBB/styles/subsilver2/template/ucp_prefs_post.html
+++ b/phpBB/styles/subsilver2/template/ucp_prefs_post.html
@@ -6,7 +6,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_prefs_view.html b/phpBB/styles/subsilver2/template/ucp_prefs_view.html
index 41b6cd88cd..b97bcfde00 100644
--- a/phpBB/styles/subsilver2/template/ucp_prefs_view.html
+++ b/phpBB/styles/subsilver2/template/ucp_prefs_view.html
@@ -6,7 +6,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_profile_avatar.html b/phpBB/styles/subsilver2/template/ucp_profile_avatar.html
index c8f5608c57..c981b8df75 100644
--- a/phpBB/styles/subsilver2/template/ucp_profile_avatar.html
+++ b/phpBB/styles/subsilver2/template/ucp_profile_avatar.html
@@ -6,7 +6,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html b/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html
index 564faa2524..c08b873834 100644
--- a/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html
+++ b/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html
@@ -6,7 +6,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
@@ -48,10 +48,12 @@
<td class="row1" width="35%"><b class="genmed">{L_INTERESTS}: </b></td>
<td class="row2"><textarea class="post" name="interests" rows="3" cols="30">{INTERESTS}</textarea></td>
</tr>
-<tr>
- <td class="row1" width="35%"><b class="genmed">{L_BIRTHDAY}: </b><br /><span class="gensmall">{L_BIRTHDAY_EXPLAIN}</span></td>
- <td class="row2"><span class="genmed">{L_DAY}:</span> <select name="bday_day">{S_BIRTHDAY_DAY_OPTIONS}</select> <span class="genmed">{L_MONTH}:</span> <select name="bday_month">{S_BIRTHDAY_MONTH_OPTIONS}</select> <span class="genmed">{L_YEAR}:</span> <select name="bday_year">{S_BIRTHDAY_YEAR_OPTIONS}</select></td>
-</tr>
+<!-- IF S_BIRTHDAYS_ENABLED -->
+ <tr>
+ <td class="row1" width="35%"><b class="genmed">{L_BIRTHDAY}: </b><br /><span class="gensmall">{L_BIRTHDAY_EXPLAIN}</span></td>
+ <td class="row2"><span class="genmed">{L_DAY}:</span> <select name="bday_day">{S_BIRTHDAY_DAY_OPTIONS}</select> <span class="genmed">{L_MONTH}:</span> <select name="bday_month">{S_BIRTHDAY_MONTH_OPTIONS}</select> <span class="genmed">{L_YEAR}:</span> <select name="bday_year">{S_BIRTHDAY_YEAR_OPTIONS}</select></td>
+ </tr>
+<!-- ENDIF -->
<!-- BEGIN profile_fields -->
<tr>
<td class="row1" width="35%">
@@ -59,7 +61,7 @@
<!-- IF profile_fields.S_REQUIRED --><b>*</b><!-- ENDIF -->
<!-- IF profile_fields.LANG_EXPLAIN --><br /><span class="gensmall">{profile_fields.LANG_EXPLAIN}</span><!-- ENDIF -->
</td>
- <td class="row2">{profile_fields.FIELD}<!-- IF profile_fields.ERROR --><br /><span class="gensmall" style="color:red">{profile_fields.ERROR}</span><!-- ENDIF --></td>
+ <td class="row2">{profile_fields.FIELD}<!-- IF profile_fields.ERROR --><br /><span class="gensmall error">{profile_fields.ERROR}</span><!-- ENDIF --></td>
</tr>
<!-- END profile_fields -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
index eed1efcb64..78fb5a9628 100644
--- a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
+++ b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
@@ -11,7 +11,7 @@
<!-- ENDIF -->
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_register.html b/phpBB/styles/subsilver2/template/ucp_register.html
index 171b017633..cfcca28e70 100644
--- a/phpBB/styles/subsilver2/template/ucp_register.html
+++ b/phpBB/styles/subsilver2/template/ucp_register.html
@@ -22,7 +22,7 @@
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</td>
</tr>
<!-- ENDIF -->
@@ -72,7 +72,7 @@
<!-- IF profile_fields.S_REQUIRED --><b>*</b><!-- ENDIF -->
<!-- IF profile_fields.LANG_EXPLAIN --><br /><span class="gensmall">{profile_fields.LANG_EXPLAIN}</span><!-- ENDIF -->
</td>
- <td class="row2">{profile_fields.FIELD}<!-- IF profile_fields.ERROR --><br /><span class="gensmall" style="color:red">{profile_fields.ERROR}</span><!-- ENDIF --></td>
+ <td class="row2">{profile_fields.FIELD}<!-- IF profile_fields.ERROR --><br /><span class="gensmall error">{profile_fields.ERROR}</span><!-- ENDIF --></td>
</tr>
<!-- END profile_fields -->
diff --git a/phpBB/styles/subsilver2/template/ucp_zebra_foes.html b/phpBB/styles/subsilver2/template/ucp_zebra_foes.html
index d87eed567c..406be35658 100644
--- a/phpBB/styles/subsilver2/template/ucp_zebra_foes.html
+++ b/phpBB/styles/subsilver2/template/ucp_zebra_foes.html
@@ -9,7 +9,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_zebra_friends.html b/phpBB/styles/subsilver2/template/ucp_zebra_friends.html
index 4be2b8838f..147e3f070b 100644
--- a/phpBB/styles/subsilver2/template/ucp_zebra_friends.html
+++ b/phpBB/styles/subsilver2/template/ucp_zebra_friends.html
@@ -9,7 +9,7 @@
</tr>
<!-- IF ERROR -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall" style="color:red">{ERROR}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td>
</tr>
<!-- ENDIF -->
<tr>
diff --git a/phpBB/styles/subsilver2/template/viewforum_body.html b/phpBB/styles/subsilver2/template/viewforum_body.html
index 6aa444d20e..f2786d4ea1 100644
--- a/phpBB/styles/subsilver2/template/viewforum_body.html
+++ b/phpBB/styles/subsilver2/template/viewforum_body.html
@@ -3,10 +3,10 @@
<!-- IF S_FORUM_RULES -->
<div class="forumrules">
<!-- IF U_FORUM_RULES -->
- <h3 style="color:red">{L_FORUM_RULES}</h3><br />
+ <h3>{L_FORUM_RULES}</h3><br />
<a href="{U_FORUM_RULES}"><b>{L_FORUM_RULES_LINK}</b></a>
<!-- ELSE -->
- <h3 style="color:red">{L_FORUM_RULES}</h3><br />
+ <h3>{L_FORUM_RULES}</h3><br />
{FORUM_RULES}
<!-- ENDIF -->
</div>
@@ -133,10 +133,10 @@
<br clear="all" />
<!-- ENDIF -->
- <!-- IF S_IS_POSTABLE or TOTAL_TOPICS -->
+ <!-- IF S_DISPLAY_POST_INFO or TOTAL_TOPICS -->
<table width="100%" cellspacing="1">
<tr>
- <!-- IF S_IS_POSTABLE and not S_IS_BOT -->
+ <!-- IF S_DISPLAY_POST_INFO and not S_IS_BOT -->
<td align="{S_CONTENT_FLOW_BEGIN}" valign="middle"><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a></td>
<!-- ENDIF -->
<!-- IF TOTAL_TOPICS -->
@@ -148,7 +148,6 @@
</table>
<!-- ENDIF -->
- <!-- IF S_IS_POSTABLE -->
<table class="tablebg" width="100%" cellspacing="1">
<tr>
<td class="cat" colspan="<!-- IF S_TOPIC_ICONS -->7<!-- ELSE -->6<!-- ENDIF -->">
@@ -236,18 +235,22 @@
</tr>
</table>
+ <!-- IF S_DISPLAY_POST_INFO or TOTAL_TOPICS -->
<table width="100%" cellspacing="1">
<tr>
- <td align="{S_CONTENT_FLOW_BEGIN}" valign="middle"><!-- IF not S_IS_BOT --><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a><!-- ENDIF --></td>
- <td class="nav" nowrap="nowrap">&nbsp;{PAGE_NUMBER}</td>
- <td class="gensmall" nowrap="nowrap">&nbsp;[ {TOTAL_TOPICS} ]</td>
- <td class="nav" width="100%" align="{S_CONTENT_FLOW_END}" nowrap="nowrap"><!-- INCLUDE pagination.html --></td>
+ <!-- IF S_DISPLAY_POST_INFO and not S_IS_BOT -->
+ <td align="{S_CONTENT_FLOW_BEGIN}" valign="middle"><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a></td>
+ <!-- ENDIF -->
+ <!-- IF TOTAL_TOPICS -->
+ <td class="nav" valign="middle" nowrap="nowrap">&nbsp;{PAGE_NUMBER}<br /></td>
+ <td class="gensmall" nowrap="nowrap">&nbsp;[ {TOTAL_TOPICS} ]&nbsp;</td>
+ <td class="gensmall" width="100%" align="{S_CONTENT_FLOW_END}" nowrap="nowrap"><!-- INCLUDE pagination.html --></td>
+ <!-- ENDIF -->
</tr>
</table>
-
- <br clear="all" />
<!-- ENDIF -->
+ <br clear="all" />
</div>
<!-- INCLUDE breadcrumbs.html -->
@@ -265,7 +268,7 @@
</table>
<!-- ENDIF -->
-<!-- IF S_IS_POSTABLE -->
+<!-- IF S_DISPLAY_POST_INFO -->
<br clear="all" />
<table width="100%" cellspacing="0">
diff --git a/phpBB/styles/subsilver2/template/viewonline_body.html b/phpBB/styles/subsilver2/template/viewonline_body.html
index f7404d9b90..ce3b9a77c6 100644
--- a/phpBB/styles/subsilver2/template/viewonline_body.html
+++ b/phpBB/styles/subsilver2/template/viewonline_body.html
@@ -21,7 +21,8 @@
</tr>
<!-- BEGIN user_row -->
<tr>
- <td class="row1"><p class="gen"><!-- IF user_row.U_USER_PROFILE --><a href="{user_row.U_USER_PROFILE}"><!-- ENDIF -->{user_row.USERNAME}<!-- IF user_row.U_USER_PROFILE --></a><!-- ENDIF --></p><!-- IF user_row.USER_IP --><p class="gensmall">{L_IP}: <a href="{user_row.U_USER_IP}">{user_row.USER_IP}</a> &#187; <a href="{user_row.U_WHOIS}" onclick="popup('{user_row.U_WHOIS}', 750, 500);return false">{L_WHOIS}</a></p><!-- ENDIF --></td>
+ <td class="row1"><p class="gen">{user_row.USERNAME_FULL}</p><!-- IF user_row.USER_IP --><p class="gensmall">{L_IP}: <a href="{user_row.U_USER_IP}">{user_row.USER_IP}</a> &#187; <a href="{user_row.U_WHOIS}" onclick="popup('{user_row.U_WHOIS}', 750, 500);return false">{L_WHOIS}</a></p><!-- ENDIF -->
+ <!-- IF user_row.USER_BROWSER -->{user_row.USER_BROWSER}<!-- ENDIF --></td>
<td class="row2" align="center" nowrap="nowrap"><p class="genmed">&nbsp;{user_row.LASTUPDATE}</p></td>
<td class="row1"><p class="genmed"><a href="{user_row.U_FORUM_LOCATION}">{user_row.FORUM_LOCATION}</a></p></td>
</tr>
diff --git a/phpBB/styles/subsilver2/template/viewtopic_body.html b/phpBB/styles/subsilver2/template/viewtopic_body.html
index 434bb6ce26..ead4d17690 100644
--- a/phpBB/styles/subsilver2/template/viewtopic_body.html
+++ b/phpBB/styles/subsilver2/template/viewtopic_body.html
@@ -3,10 +3,10 @@
<!-- IF S_FORUM_RULES -->
<div class="forumrules">
<!-- IF U_FORUM_RULES -->
- <h3 style="color:red">{L_FORUM_RULES}</h3><br />
+ <h3>{L_FORUM_RULES}</h3><br />
<a href="{U_FORUM_RULES}"><b>{L_FORUM_RULES_LINK}</b></a>
<!-- ELSE -->
- <h3 style="color:red">{L_FORUM_RULES}</h3><br />
+ <h3>{L_FORUM_RULES}</h3><br />
{FORUM_RULES}
<!-- ENDIF -->
</div>
@@ -31,7 +31,12 @@
<table width="100%" cellspacing="1">
<tr>
- <td align="{S_CONTENT_FLOW_BEGIN}" valign="middle" nowrap="nowrap"><!-- IF not S_IS_BOT --><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a>&nbsp;<a href="{U_POST_REPLY_TOPIC}">{REPLY_IMG}</a><!-- ENDIF --></td>
+ <td align="{S_CONTENT_FLOW_BEGIN}" valign="middle" nowrap="nowrap">
+ <!-- IF not S_IS_BOT -->
+ <!-- IF S_DISPLAY_POST_INFO --><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a>&nbsp;<!-- ENDIF -->
+ <!-- IF S_DISPLAY_REPLY_INFO --><a href="{U_POST_REPLY_TOPIC}">{REPLY_IMG}</a><!-- ENDIF -->
+ <!-- ENDIF -->
+ </td>
<!-- IF TOTAL_POSTS -->
<td class="nav" valign="middle" nowrap="nowrap">&nbsp;{PAGE_NUMBER}<br /></td>
<td class="gensmall" nowrap="nowrap">&nbsp;[ {TOTAL_POSTS} ]&nbsp;</td>
@@ -225,7 +230,7 @@
<!-- ENDIF -->
<!-- IF postrow.S_DISPLAY_NOTICE -->
- <span class="gensmall" style="color:red;"><br /><br />{L_DOWNLOAD_NOTICE}</span>
+ <span class="gensmall error"><br /><br />{L_DOWNLOAD_NOTICE}</span>
<!-- ENDIF -->
<!-- IF postrow.SIGNATURE -->
<span class="postbody"><br />_________________<br />{postrow.SIGNATURE}</span>
@@ -294,7 +299,12 @@
<table width="100%" cellspacing="1">
<tr>
- <td align="{S_CONTENT_FLOW_BEGIN}" valign="middle" nowrap="nowrap"><!-- IF not S_IS_BOT --><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a>&nbsp;<a href="{U_POST_REPLY_TOPIC}">{REPLY_IMG}</a><!-- ENDIF --></td>
+ <td align="{S_CONTENT_FLOW_BEGIN}" valign="middle" nowrap="nowrap">
+ <!-- IF not S_IS_BOT -->
+ <!-- IF S_DISPLAY_POST_INFO --><a href="{U_POST_NEW_TOPIC}">{POST_IMG}</a>&nbsp;<!-- ENDIF -->
+ <!-- IF S_DISPLAY_REPLY_INFO --><a href="{U_POST_REPLY_TOPIC}">{REPLY_IMG}</a><!-- ENDIF -->
+ <!-- ENDIF -->
+ </td>
<!-- IF TOTAL_POSTS -->
<td class="nav" valign="middle" nowrap="nowrap">&nbsp;{PAGE_NUMBER}<br /></td>
<td class="gensmall" nowrap="nowrap">&nbsp;[ {TOTAL_POSTS} ]&nbsp;</td>
diff --git a/phpBB/styles/subsilver2/theme/stylesheet.css b/phpBB/styles/subsilver2/theme/stylesheet.css
index 0c659cee8e..62baa33566 100644
--- a/phpBB/styles/subsilver2/theme/stylesheet.css
+++ b/phpBB/styles/subsilver2/theme/stylesheet.css
@@ -94,6 +94,10 @@ body {
font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
}
+.forumrules h3 {
+ color: red;
+}
+
#pageheader { }
#pagecontent { }
#pagefooter { }
diff --git a/phpBB/ucp.php b/phpBB/ucp.php
index e3b665db2b..0df248dd2d 100755
--- a/phpBB/ucp.php
+++ b/phpBB/ucp.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'common.' . $phpEx);
require($phpbb_root_path . 'includes/functions_user.' . $phpEx);
@@ -82,7 +82,7 @@ switch ($mode)
break;
case 'logout':
- if ($user->data['user_id'] != ANONYMOUS && (!empty($_GET['sid']) && ($_GET['sid'] == $user->session_id)))
+ if ($user->data['user_id'] != ANONYMOUS && isset($_GET['sid']) && !is_array($_GET['sid']) && $_GET['sid'] === $user->session_id)
{
$user->session_kill();
$user->session_begin();
diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php
index 9709b85752..dc56afc7d6 100644
--- a/phpBB/viewforum.php
+++ b/phpBB/viewforum.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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_display.' . $phpEx);
@@ -77,16 +77,23 @@ if (isset($_GET['e']) && !$user->data['is_registered'])
}
// Permissions check
-if (!$auth->acl_gets('f_list', 'f_read', $forum_id))
+if (!$auth->acl_gets('f_list', 'f_read', $forum_id) || ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'] && !$auth->acl_get('f_read', $forum_id)))
{
if ($user->data['user_id'] != ANONYMOUS)
{
- trigger_error($user->lang['SORRY_AUTH_READ']);
+ trigger_error('SORRY_AUTH_READ');
}
login_box('', $user->lang['LOGIN_VIEWFORUM']);
}
+// Forum is passworded ... check whether access has been granted to this
+// user this session, if not show login box
+if ($forum_data['forum_password'])
+{
+ login_forum_box($forum_data);
+}
+
// Is this forum a link? ... User got here either because the
// number of clicks is being tracked or they guessed the id
if ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'])
@@ -103,13 +110,6 @@ if ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'])
redirect($forum_data['forum_link']);
}
-// Forum is passworded ... check whether access has been granted to this
-// user this session, if not show login box
-if ($forum_data['forum_password'])
-{
- login_forum_box($forum_data);
-}
-
// Build navigation links
generate_forum_nav($forum_data);
@@ -275,7 +275,10 @@ $template->assign_vars(array(
'L_NO_TOPICS' => ($forum_data['forum_status'] == ITEM_LOCKED) ? $user->lang['POST_FORUM_LOCKED'] : $user->lang['NO_TOPICS'],
+ 'S_DISPLAY_POST_INFO' => ($forum_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
+
'S_IS_POSTABLE' => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
+ 'S_USER_CAN_POST' => ($auth->acl_get('f_post', $forum_id)) ? true : false,
'S_DISPLAY_ACTIVE' => $s_display_active,
'S_SELECT_SORT_DIR' => $s_sort_dir,
'S_SELECT_SORT_KEY' => $s_sort_key,
@@ -290,7 +293,7 @@ $template->assign_vars(array(
'S_SINGLE_MODERATOR' => (!empty($moderators[$forum_id]) && sizeof($moderators[$forum_id]) > 1) ? false : true,
'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;i=main&amp;mode=forum_view", true, $user->session_id) : '',
- 'U_POST_NEW_TOPIC' => append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&amp;f=' . $forum_id),
+ 'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&amp;f=' . $forum_id) : '',
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;$u_sort_param&amp;start=$start"),
'U_MARK_TOPICS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;mark=topics") : '',
));
diff --git a/phpBB/viewonline.php b/phpBB/viewonline.php
index 3bd6bfd51d..f25afea1eb 100644
--- a/phpBB/viewonline.php
+++ b/phpBB/viewonline.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
@@ -29,6 +29,17 @@ $sort_key = request_var('sk', 'b');
$sort_dir = request_var('sd', 'd');
$show_guests= ($config['load_online_guests']) ? request_var('sg', 0) : 0;
+// Can this user view profiles/memberlist?
+if (!$auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel'))
+{
+ if ($user->data['user_id'] != ANONYMOUS)
+ {
+ trigger_error('NO_VIEW_USERS');
+ }
+
+ login_box('', $user->lang['LOGIN_EXPLAIN_VIEWONLINE']);
+}
+
$sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_LOCATION'], 'c' => $user->lang['SORT_JOINED']);
$sort_key_sql = array('a' => 'u.username_clean', 'b' => 's.session_time', 'c' => 's.session_page');
@@ -117,7 +128,7 @@ if (!$show_guests)
}
// Get user list
-$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_type, u.user_colour, s.session_id, s.session_time, s.session_page, s.session_ip, s.session_viewonline
+$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_type, u.user_colour, s.session_id, s.session_time, s.session_page, s.session_ip, s.session_browser, s.session_viewonline
FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . ' s
WHERE u.user_id = s.session_user_id
AND s.session_time >= ' . (time() - ($config['load_online_time'] * 60)) .
@@ -132,19 +143,18 @@ while ($row = $db->sql_fetchrow($result))
{
if ($row['user_id'] != ANONYMOUS && !isset($prev_id[$row['user_id']]))
{
- $view_online = false;
-
- if ($row['user_colour'])
- {
- $row['username'] = '<b style="color:#' . $row['user_colour'] . '">' . $row['username'] . '</b>';
- }
+ $view_online = $s_user_hidden = false;
+ $user_colour = ($row['user_colour']) ? ' style="color:#' . $row['user_colour'] . '" class="username-coloured"' : '';
+
+ $username_full = ($row['user_type'] != USER_IGNORE) ? get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']) : '<span' . $user_colour . '>' . $row['username'] . '</span>';
if (!$row['session_viewonline'])
{
$view_online = ($auth->acl_get('u_viewonline')) ? true : false;
$logged_hidden_online++;
- $row['username'] = '<i>' . $row['username'] . '</i>';
+ $username_full = '<em>' . $username_full . '</em>';
+ $s_user_hidden = true;
}
else
{
@@ -175,7 +185,8 @@ while ($row = $db->sql_fetchrow($result))
continue;
}
- $row['username'] = $user->lang['GUEST'];
+ $s_user_hidden = false;
+ $username_full = get_username_string('full', $row['user_id'], $user->lang['GUEST']);
}
else
{
@@ -203,7 +214,7 @@ while ($row = $db->sql_fetchrow($result))
case 'posting':
case 'viewforum':
case 'viewtopic':
- preg_match('#f=([0-9]+)#', $row['session_page'], $forum_id);
+ preg_match('#_f_=([0-9]+)x#i', $row['session_page'], $forum_id);
$forum_id = (sizeof($forum_id)) ? (int) $forum_id[1] : 0;
if ($forum_id && $auth->acl_get('f_list', $forum_id))
@@ -318,18 +329,22 @@ while ($row = $db->sql_fetchrow($result))
$template->assign_block_vars('user_row', array(
'USERNAME' => $row['username'],
+ 'USERNAME_COLOUR' => $row['user_colour'],
+ 'USERNAME_FULL' => $username_full,
'LASTUPDATE' => $user->format_date($row['session_time']),
'FORUM_LOCATION' => $location,
'USER_IP' => ($auth->acl_get('a_')) ? (($mode == 'lookup' && $session_id == $row['session_id']) ? gethostbyaddr($row['session_ip']) : $row['session_ip']) : '',
+ 'USER_BROWSER' => ($auth->acl_get('a_user')) ? $row['session_browser'] : '',
- 'U_USER_PROFILE' => (($row['user_type'] == USER_NORMAL || $row['user_type'] == USER_FOUNDER) && $row['user_id'] != ANONYMOUS) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $row['user_id']) : '',
+ 'U_USER_PROFILE' => ($row['user_type'] != USER_IGNORE) ? get_username_string('profile', $row['user_id'], '') : '',
'U_USER_IP' => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'mode=lookup' . (($mode != 'lookup' || $row['session_id'] != $session_id) ? '&amp;s=' . $row['session_id'] : '') . "&amp;sg=$show_guests&amp;start=$start&amp;sk=$sort_key&amp;sd=$sort_dir"),
'U_WHOIS' => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'mode=whois&amp;s=' . $row['session_id']),
'U_FORUM_LOCATION' => $location_url,
+ 'S_USER_HIDDEN' => $s_user_hidden,
'S_GUEST' => ($row['user_id'] == ANONYMOUS) ? true : false,
- 'S_USER_TYPE' => $row['user_type'])
- );
+ 'S_USER_TYPE' => $row['user_type'],
+ ));
}
$db->sql_freeresult($result);
unset($prev_id, $prev_ip);
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index 2f6aac1fc6..afa818fdc3 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -12,7 +12,7 @@
* @ignore
*/
define('IN_PHPBB', true);
-$phpbb_root_path = './';
+$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_display.' . $phpEx);
@@ -37,6 +37,9 @@ $sort_dir = request_var('sd', ((!empty($user->data['user_post_sortby_dir'])) ? $
$update = request_var('update', false);
+/**
+* @todo normalize?
+*/
$hilit_words = request_var('hilit', '', true);
// Do we have a topic or post id?
@@ -560,11 +563,14 @@ $template->assign_vars(array(
'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&amp;start=$start"),
'S_TOPIC_MOD' => ($topic_mod != '') ? '<select name="action">' . $topic_mod . '</select>' : '',
- 'S_MOD_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "t=$topic_id&amp;f=$forum_id&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
+ 'S_MOD_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
'S_DISPLAY_SEARCHBOX' => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
'S_SEARCHBOX_ACTION' => append_sid("{$phpbb_root_path}search.$phpEx", 't=' . $topic_id),
+ 'S_DISPLAY_POST_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
+ 'S_DISPLAY_REPLY_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
+
'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&amp;t=$topic_id",
'U_FORUM' => $server_path,
'U_VIEW_TOPIC' => $viewtopic_url,
@@ -581,8 +587,8 @@ $template->assign_vars(array(
'U_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&amp;bookmark=1' : '',
'L_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'],
- 'U_POST_NEW_TOPIC' => append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&amp;f=$forum_id"),
- 'U_POST_REPLY_TOPIC' => append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&amp;f=$forum_id&amp;t=$topic_id"),
+ 'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&amp;f=$forum_id") : '',
+ 'U_POST_REPLY_TOPIC' => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&amp;f=$forum_id&amp;t=$topic_id") : '',
'U_BUMP_TOPIC' => (bump_topic_allowed($forum_id, $topic_data['topic_bumped'], $topic_data['topic_last_post_time'], $topic_data['topic_poster'], $topic_data['topic_last_poster_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=bump&amp;f=$forum_id&amp;t=$topic_id") : '')
);
@@ -1053,7 +1059,7 @@ while ($row = $db->sql_fetchrow($result))
$user_cache[$poster_id]['icq'] = '';
}
- if (!empty($row['user_birthday']))
+ if ($config['allow_birthdays'] && !empty($row['user_birthday']))
{
list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $row['user_birthday']));