From 17f5c6bf71f560be2f4e2ecabae83ab2973bec47 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Sat, 18 Feb 2012 12:00:12 +0100 Subject: [PATCH 001/255] [ticket/10605] Check for orphan privmsgs when deleting a user Also moved the hole code into a new function. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 116 ++++++++++++++++++++++++++ phpBB/includes/functions_user.php | 58 +------------ 2 files changed, 120 insertions(+), 54 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index c40ceb088f..30cff8ed72 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1083,6 +1083,122 @@ function delete_pm($user_id, $msg_ids, $folder_id) return true; } +/** +* Delete all PM(s) for a given user and delete the ones without references +*/ +function delete_user_pms($user_id) +{ + global $db, $user, $phpbb_root_path, $phpEx; + + $user_id = (int) $user_id; + + if (!$user_id) + { + return false; + } + + // Get PM Information for later deleting + $sql = 'SELECT msg_id, author_id, folder_id, pm_unread, pm_new + FROM ' . PRIVMSGS_TO_TABLE . ' + WHERE user_id = ' . $user_id . ' + OR (author_id = ' . $user_id . ' + AND folder_id = ' . PRIVMSGS_NO_BOX . ')'; + $result = $db->sql_query($sql); + + $undelivered_msg = $undelivered_user = $delete_rows = array(); + $num_unread = $num_new = $num_deleted = 0; + while ($row = $db->sql_fetchrow($result)) + { + if ($row['author_id'] == $user_id && $row['folder_id'] == PRIVMSGS_NO_BOX) + { + // Undelivered messages + $undelivered_msg[] = $row['msg_id']; + $undelivered_user[$row['user_id']][] = true; + } + + $delete_rows[$row['msg_id']] = 1; + } + $db->sql_freeresult($result); + + if (!sizeof($delete_rows)) + { + return false; + } + + $db->sql_transaction('begin'); + + if (sizeof($undelivered_msg)) + { + $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' + WHERE ' . $db->sql_in_set('msg_id', $undelivered_msg); + $db->sql_query($sql); + } + + foreach ($undelivered_user as $_user_id => $ary) + { + if ($_user_id == $user_id) + { + continue; + } + + $sql = 'UPDATE ' . USERS_TABLE . ' + SET user_new_privmsg = user_new_privmsg - ' . sizeof($ary) . ', + user_unread_privmsg = user_unread_privmsg - ' . sizeof($ary) . ' + WHERE user_id = ' . $_user_id; + $db->sql_query($sql); + } + + // Delete private message data + $sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . " + WHERE user_id = $user_id + AND " . $db->sql_in_set('msg_id', array_keys($delete_rows)); + $db->sql_query($sql); + + // Now we have to check which messages we can delete completely + $sql = 'SELECT msg_id + FROM ' . PRIVMSGS_TO_TABLE . ' + WHERE ' . $db->sql_in_set('msg_id', array_keys($delete_rows)); + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + unset($delete_rows[$row['msg_id']]); + } + $db->sql_freeresult($result); + + $delete_ids = array_keys($delete_rows); + + if (sizeof($delete_ids)) + { + // Check if there are any attachments we need to remove + if (!function_exists('delete_attachments')) + { + include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); + } + + delete_attachments('message', $delete_ids, false); + + $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' + WHERE ' . $db->sql_in_set('msg_id', $delete_ids); + $db->sql_query($sql); + } + + // Set the remaining author id to anonymous - this way users are still able to read messages from users being removed + $sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' + SET author_id = ' . ANONYMOUS . ' + WHERE author_id = ' . $user_id; + $db->sql_query($sql); + + $sql = 'UPDATE ' . PRIVMSGS_TABLE . ' + SET author_id = ' . ANONYMOUS . ' + WHERE author_id = ' . $user_id; + $db->sql_query($sql); + + $db->sql_transaction('commit'); + + return true; +} + /** * Rebuild message header */ diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 6b5cca8abb..20923ea495 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -528,62 +528,12 @@ function user_delete($mode, $user_id, $post_username = false) WHERE session_user_id = ' . $user_id; $db->sql_query($sql); - // Remove any undelivered mails... - $sql = 'SELECT msg_id, user_id - FROM ' . PRIVMSGS_TO_TABLE . ' - WHERE author_id = ' . $user_id . ' - AND folder_id = ' . PRIVMSGS_NO_BOX; - $result = $db->sql_query($sql); - - $undelivered_msg = $undelivered_user = array(); - while ($row = $db->sql_fetchrow($result)) + // Clean the private messages tables from the user + if (!function_exists('delete_user_pms')) { - $undelivered_msg[] = $row['msg_id']; - $undelivered_user[$row['user_id']][] = true; - } - $db->sql_freeresult($result); - - if (sizeof($undelivered_msg)) - { - $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' - WHERE ' . $db->sql_in_set('msg_id', $undelivered_msg); - $db->sql_query($sql); - } - - $sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . ' - WHERE author_id = ' . $user_id . ' - AND folder_id = ' . PRIVMSGS_NO_BOX; - $db->sql_query($sql); - - // Delete all to-information - $sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . ' - WHERE user_id = ' . $user_id; - $db->sql_query($sql); - - // Set the remaining author id to anonymous - this way users are still able to read messages from users being removed - $sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' - SET author_id = ' . ANONYMOUS . ' - WHERE author_id = ' . $user_id; - $db->sql_query($sql); - - $sql = 'UPDATE ' . PRIVMSGS_TABLE . ' - SET author_id = ' . ANONYMOUS . ' - WHERE author_id = ' . $user_id; - $db->sql_query($sql); - - foreach ($undelivered_user as $_user_id => $ary) - { - if ($_user_id == $user_id) - { - continue; - } - - $sql = 'UPDATE ' . USERS_TABLE . ' - SET user_new_privmsg = user_new_privmsg - ' . sizeof($ary) . ', - user_unread_privmsg = user_unread_privmsg - ' . sizeof($ary) . ' - WHERE user_id = ' . $_user_id; - $db->sql_query($sql); + include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx); } + delete_user_pms($user_id); $db->sql_transaction('commit'); From cd5c01ac2da2ec316e997e8850e1b2d326191e56 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 21 Feb 2012 11:10:10 +0100 Subject: [PATCH 002/255] [ticket/9089] Add tabindex to PM recipient box, to allow tabbing to the subject I also added tabindex 1 to the buttons for adding the recipients. Also note, that duplicated tabindex are fine: http://www.w3.org/TR/html4/interact/forms.html#adef-tabindex PHPBB3-9089 --- phpBB/styles/prosilver/template/posting_editor.html | 6 +++--- phpBB/styles/subsilver2/template/ucp_header.html | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/styles/prosilver/template/posting_editor.html b/phpBB/styles/prosilver/template/posting_editor.html index 5f7fb8408e..e7c1dc21eb 100644 --- a/phpBB/styles/prosilver/template/posting_editor.html +++ b/phpBB/styles/prosilver/template/posting_editor.html @@ -37,10 +37,10 @@
-
+
{L_FIND_USERNAME}
-
-
+
+
diff --git a/phpBB/styles/subsilver2/template/ucp_header.html b/phpBB/styles/subsilver2/template/ucp_header.html index ea64dcb299..1566a15929 100644 --- a/phpBB/styles/subsilver2/template/ucp_header.html +++ b/phpBB/styles/subsilver2/template/ucp_header.html @@ -26,7 +26,7 @@ {L_USERNAMES}: -
+
[ {L_FIND_USERNAME} ] @@ -41,7 +41,7 @@ -
  
  
+
  
  
From 45f39c6d1f2adc318d521bd9eb75d80f0750fdb8 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Sat, 18 Feb 2012 12:16:21 +0100 Subject: [PATCH 003/255] [ticket/10605] Delete orphan private messages on update PHPBB3-10605 --- phpBB/install/database_update.php | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index a1b7dcd47f..b6298ca651 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2024,6 +2024,48 @@ function change_database_data(&$no_updates, $version) // No changes from 3.0.10-RC3 to 3.0.10 case '3.0.10-RC3': break; + + // Changes from 3.0.10 to 3.0.11-RC1 + case '3.0.10': + // Delete orphan private messages + $batch_size = 500; + + $sql_array = array( + 'SELECT' => 'p.msg_id', + 'FROM' => array( + PRIVMSGS_TABLE => 'p', + ), + 'LEFT_JOIN' => array( + array( + 'FROM' => array(PRIVMSGS_TO_TABLE, 't'), + 'ON' => 'p.msg_id = t.msg_id', + ), + ), + 'WHERE' => 't.user_id IS NULL'; + $sql = $db->sql_build_query('SELECT', $sql_array); + + do + { + $result = $db->sql_query_limit($sql, $batch_size); + + $delete_pms = array(); + while ($row = $db->sql_fetchrow($result)) + { + $delete_pms[] = (int) $row['msg_id']; + } + $db->sql_freeresult($result); + + if (!empty($delete_pms)) + { + $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' + WHERE ' . $db->sql_in_set('msg_id', $delete_pms); + $db->sql_query($sql); + } + } + while (sizeof($delete_pms) == $batch_size); + + $no_updates = false; + break; } } From 17dc8c6c5c0e651a305961fae579c59d09abf88d Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 27 Feb 2012 17:16:42 +0100 Subject: [PATCH 004/255] [ticket/9089] Add tabindex to pm/topic/post icon-options aswell PHPBB3-9089 --- phpBB/styles/prosilver/template/posting_editor.html | 4 ++-- phpBB/styles/subsilver2/template/posting_body.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/styles/prosilver/template/posting_editor.html b/phpBB/styles/prosilver/template/posting_editor.html index e7c1dc21eb..67ba74a690 100644 --- a/phpBB/styles/prosilver/template/posting_editor.html +++ b/phpBB/styles/prosilver/template/posting_editor.html @@ -87,8 +87,8 @@
- - + +
diff --git a/phpBB/styles/subsilver2/template/posting_body.html b/phpBB/styles/subsilver2/template/posting_body.html index fec6d7ff6c..dbdf6b230c 100644 --- a/phpBB/styles/subsilver2/template/posting_body.html +++ b/phpBB/styles/subsilver2/template/posting_body.html @@ -127,7 +127,7 @@ - +
{L_NO_TOPIC_ICON}{L_NO_PM_ICON} {L_NO_TOPIC_ICON}{L_NO_PM_ICON}
From ba6943a6a0ea50af772dc6e94f13b56292cd9f37 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 12 Mar 2012 10:11:52 +0100 Subject: [PATCH 005/255] [ticket/10605] Prefix function with phpbb_ and use true instead of 1 PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 4 ++-- phpBB/includes/functions_user.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 30cff8ed72..34f16ea9da 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1086,7 +1086,7 @@ function delete_pm($user_id, $msg_ids, $folder_id) /** * Delete all PM(s) for a given user and delete the ones without references */ -function delete_user_pms($user_id) +function phpbb_delete_user_pms($user_id) { global $db, $user, $phpbb_root_path, $phpEx; @@ -1116,7 +1116,7 @@ function delete_user_pms($user_id) $undelivered_user[$row['user_id']][] = true; } - $delete_rows[$row['msg_id']] = 1; + $delete_rows[$row['msg_id']] = true; } $db->sql_freeresult($result); diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 20923ea495..92a7b8e0e9 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -529,11 +529,11 @@ function user_delete($mode, $user_id, $post_username = false) $db->sql_query($sql); // Clean the private messages tables from the user - if (!function_exists('delete_user_pms')) + if (!function_exists('phpbb_delete_user_pms')) { include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx); } - delete_user_pms($user_id); + phpbb_delete_user_pms($user_id); $db->sql_transaction('commit'); From e8830f605f73a0c8fa5c3ea579ee18f295b81600 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 01:18:02 +0200 Subject: [PATCH 006/255] [ticket/10605] Use unset() instead of checking user_id over and over again. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 34f16ea9da..59dea50094 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1134,13 +1134,9 @@ function phpbb_delete_user_pms($user_id) $db->sql_query($sql); } + unset($undelivered_user[$user_id]); foreach ($undelivered_user as $_user_id => $ary) { - if ($_user_id == $user_id) - { - continue; - } - $sql = 'UPDATE ' . USERS_TABLE . ' SET user_new_privmsg = user_new_privmsg - ' . sizeof($ary) . ', user_unread_privmsg = user_unread_privmsg - ' . sizeof($ary) . ' From 2203bc204e55c33e2e9b212eeb0c7bf2e3060851 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 01:29:29 +0200 Subject: [PATCH 007/255] [ticket/10605] Turn $undelivered_user into a real array of counters. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 59dea50094..352bd4d15d 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1113,7 +1113,15 @@ function phpbb_delete_user_pms($user_id) { // Undelivered messages $undelivered_msg[] = $row['msg_id']; - $undelivered_user[$row['user_id']][] = true; + + if (isset($undelivered_user[$row['user_id']])) + { + ++$undelivered_user[$row['user_id']]; + } + else + { + $undelivered_user[$row['user_id']] = 1; + } } $delete_rows[$row['msg_id']] = true; @@ -1135,11 +1143,11 @@ function phpbb_delete_user_pms($user_id) } unset($undelivered_user[$user_id]); - foreach ($undelivered_user as $_user_id => $ary) + foreach ($undelivered_user as $_user_id => $count) { $sql = 'UPDATE ' . USERS_TABLE . ' - SET user_new_privmsg = user_new_privmsg - ' . sizeof($ary) . ', - user_unread_privmsg = user_unread_privmsg - ' . sizeof($ary) . ' + SET user_new_privmsg = user_new_privmsg - ' . $count . ', + user_unread_privmsg = user_unread_privmsg - ' . $count . ' WHERE user_id = ' . $_user_id; $db->sql_query($sql); } From dbc7a69ad2bf6b062a4d7a40d62be29a410b5c18 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 01:30:52 +0200 Subject: [PATCH 008/255] [ticket/10605] Remove unused variable declarations. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 1 - 1 file changed, 1 deletion(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 352bd4d15d..4ff0c53420 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1106,7 +1106,6 @@ function phpbb_delete_user_pms($user_id) $result = $db->sql_query($sql); $undelivered_msg = $undelivered_user = $delete_rows = array(); - $num_unread = $num_new = $num_deleted = 0; while ($row = $db->sql_fetchrow($result)) { if ($row['author_id'] == $user_id && $row['folder_id'] == PRIVMSGS_NO_BOX) From 9040f18d7cf9de137acbac6072dc2ffd3cede1b5 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 01:35:01 +0200 Subject: [PATCH 009/255] [ticket/10605] Remove unnecessary array_keys calls on $delete_rows. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 4ff0c53420..00029a1986 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1123,7 +1123,7 @@ function phpbb_delete_user_pms($user_id) } } - $delete_rows[$row['msg_id']] = true; + $delete_rows[(int) $row['msg_id']] = (int) $row['msg_id']; } $db->sql_freeresult($result); @@ -1154,13 +1154,13 @@ function phpbb_delete_user_pms($user_id) // Delete private message data $sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . " WHERE user_id = $user_id - AND " . $db->sql_in_set('msg_id', array_keys($delete_rows)); + AND " . $db->sql_in_set('msg_id', $delete_rows); $db->sql_query($sql); // Now we have to check which messages we can delete completely $sql = 'SELECT msg_id FROM ' . PRIVMSGS_TO_TABLE . ' - WHERE ' . $db->sql_in_set('msg_id', array_keys($delete_rows)); + WHERE ' . $db->sql_in_set('msg_id', $delete_rows); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) From dd53d0576d8256e37074cc23dd5b9769acc12d1a Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 01:39:49 +0200 Subject: [PATCH 010/255] [ticket/10605] Remove unnecessary $delete_ids array. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 00029a1986..23f582641b 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1169,9 +1169,7 @@ function phpbb_delete_user_pms($user_id) } $db->sql_freeresult($result); - $delete_ids = array_keys($delete_rows); - - if (sizeof($delete_ids)) + if (!empty($delete_rows)) { // Check if there are any attachments we need to remove if (!function_exists('delete_attachments')) @@ -1179,10 +1177,10 @@ function phpbb_delete_user_pms($user_id) include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); } - delete_attachments('message', $delete_ids, false); + delete_attachments('message', $delete_rows, false); $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' - WHERE ' . $db->sql_in_set('msg_id', $delete_ids); + WHERE ' . $db->sql_in_set('msg_id', $delete_rows); $db->sql_query($sql); } From ad073d22b9e543d5842af7b8ef94fe7e6b443504 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 01:43:09 +0200 Subject: [PATCH 011/255] [ticket/10605] Break long comment into multiple lines 80 chars short. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 23f582641b..e7beae3fab 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1184,7 +1184,8 @@ function phpbb_delete_user_pms($user_id) $db->sql_query($sql); } - // Set the remaining author id to anonymous - this way users are still able to read messages from users being removed + // Set the remaining author id to anonymous + // This way users are still able to read messages from users being removed $sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' SET author_id = ' . ANONYMOUS . ' WHERE author_id = ' . $user_id; From 9c8aab4d32a001ae66fe005b7124737fc5ad7dd6 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 27 Mar 2012 02:02:17 +0200 Subject: [PATCH 012/255] [ticket/10605] Rename $delete_rows to $delete_ids. PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index e7beae3fab..576da4d439 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1105,7 +1105,7 @@ function phpbb_delete_user_pms($user_id) AND folder_id = ' . PRIVMSGS_NO_BOX . ')'; $result = $db->sql_query($sql); - $undelivered_msg = $undelivered_user = $delete_rows = array(); + $undelivered_msg = $undelivered_user = $delete_ids = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['author_id'] == $user_id && $row['folder_id'] == PRIVMSGS_NO_BOX) @@ -1123,11 +1123,11 @@ function phpbb_delete_user_pms($user_id) } } - $delete_rows[(int) $row['msg_id']] = (int) $row['msg_id']; + $delete_ids[(int) $row['msg_id']] = (int) $row['msg_id']; } $db->sql_freeresult($result); - if (!sizeof($delete_rows)) + if (empty($delete_ids)) { return false; } @@ -1154,22 +1154,22 @@ function phpbb_delete_user_pms($user_id) // Delete private message data $sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . " WHERE user_id = $user_id - AND " . $db->sql_in_set('msg_id', $delete_rows); + AND " . $db->sql_in_set('msg_id', $delete_ids); $db->sql_query($sql); // Now we have to check which messages we can delete completely $sql = 'SELECT msg_id FROM ' . PRIVMSGS_TO_TABLE . ' - WHERE ' . $db->sql_in_set('msg_id', $delete_rows); + WHERE ' . $db->sql_in_set('msg_id', $delete_ids); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { - unset($delete_rows[$row['msg_id']]); + unset($delete_ids[$row['msg_id']]); } $db->sql_freeresult($result); - if (!empty($delete_rows)) + if (!empty($delete_ids)) { // Check if there are any attachments we need to remove if (!function_exists('delete_attachments')) @@ -1177,10 +1177,10 @@ function phpbb_delete_user_pms($user_id) include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); } - delete_attachments('message', $delete_rows, false); + delete_attachments('message', $delete_ids, false); $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' - WHERE ' . $db->sql_in_set('msg_id', $delete_rows); + WHERE ' . $db->sql_in_set('msg_id', $delete_ids); $db->sql_query($sql); } From 0397b462174887bda3fea4bcebf9a26f6b591a3e Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 27 Mar 2012 17:29:03 +0200 Subject: [PATCH 013/255] [ticket/10605] Split query to be able to use indexes PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 34 ++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 576da4d439..dd81e8f92d 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1098,11 +1098,11 @@ function phpbb_delete_user_pms($user_id) } // Get PM Information for later deleting + // The two queries where split, so we can use our indexes + // Part 1: get PMs the user received $sql = 'SELECT msg_id, author_id, folder_id, pm_unread, pm_new FROM ' . PRIVMSGS_TO_TABLE . ' - WHERE user_id = ' . $user_id . ' - OR (author_id = ' . $user_id . ' - AND folder_id = ' . PRIVMSGS_NO_BOX . ')'; + WHERE user_id = ' . $user_id; $result = $db->sql_query($sql); $undelivered_msg = $undelivered_user = $delete_ids = array(); @@ -1127,6 +1127,34 @@ function phpbb_delete_user_pms($user_id) } $db->sql_freeresult($result); + // Part 2: get PMs the user sent + $sql = 'SELECT msg_id, author_id, folder_id, pm_unread, pm_new + FROM ' . PRIVMSGS_TO_TABLE . ' + WHERE author_id = ' . $user_id . ' + AND folder_id = ' . PRIVMSGS_NO_BOX; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + if ($row['author_id'] == $user_id && $row['folder_id'] == PRIVMSGS_NO_BOX) + { + // Undelivered messages + $undelivered_msg[] = $row['msg_id']; + + if (isset($undelivered_user[$row['user_id']])) + { + ++$undelivered_user[$row['user_id']]; + } + else + { + $undelivered_user[$row['user_id']] = 1; + } + } + + $delete_ids[(int) $row['msg_id']] = (int) $row['msg_id']; + } + $db->sql_freeresult($result); + if (empty($delete_ids)) { return false; From b9324577aca6f7f7632b609e975e510e25d8ec86 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 27 Mar 2012 17:32:55 +0200 Subject: [PATCH 014/255] =?UTF-8?q?[ticket/10605]=20Reset=20user=C2=B4s=20?= =?UTF-8?q?pm=20count=20to=200=20when=20deleting=20his=20PMs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index dd81e8f92d..14a6d83b2a 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1169,7 +1169,17 @@ function phpbb_delete_user_pms($user_id) $db->sql_query($sql); } - unset($undelivered_user[$user_id]); + // Reset the user´s pm count to 0 + if (isset($undelivered_user[$user_id])) + { + $sql = 'UPDATE ' . USERS_TABLE . ' + SET user_new_privmsg = 0, + user_unread_privmsg = 0 + WHERE user_id = ' . $user_id; + $db->sql_query($sql); + unset($undelivered_user[$user_id]); + } + foreach ($undelivered_user as $_user_id => $count) { $sql = 'UPDATE ' . USERS_TABLE . ' From 31ea2da5ac5dbec6a7a6f1a2575960af582df2f3 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Sat, 31 Mar 2012 18:02:49 +0530 Subject: [PATCH 015/255] [ticket/10734] CSS tweaks Modified colours.css Removed the corner images. Added border radius. PHPBB3-10734 --- phpBB/styles/prosilver/theme/colours.css | 33 +++++++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index 855febf4aa..11fa6932db 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -47,25 +47,50 @@ hr { background-color: #12A3EB; background-image: url("./images/bg_header.gif"); color: #FFFFFF; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; } .navbar { background-color: #cadceb; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + } .forabg { background-color: #0076b1; background-image: url("./images/bg_list.gif"); + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + } .forumbg { background-color: #12A3EB; background-image: url("./images/bg_header.gif"); + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + } .panel { background-color: #ECF1F3; color: #28313F; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; +} + +.post { + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + } .post:target .content { @@ -89,19 +114,19 @@ hr { } span.corners-top { - background-image: url("./images/corners_left.png"); + } span.corners-top span { - background-image: url("./images/corners_right.png"); + } span.corners-bottom { - background-image: url("./images/corners_left.png"); + } span.corners-bottom span { - background-image: url("./images/corners_right.png"); + } /* Horizontal lists From 609e8e3b1123c6144712cf7c94aa6de5ad49bce7 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Sat, 31 Mar 2012 18:32:05 +0530 Subject: [PATCH 016/255] [ticket/10734] Fixed template files Removed unnecessary span from overall_header, overall_footer, forumlist_body, viewforum_body. PHPBB3-10734 --- .../prosilver/template/forumlist_body.html | 10 ++++----- .../prosilver/template/overall_footer.html | 6 ++--- .../prosilver/template/overall_header.html | 10 ++++----- .../prosilver/template/viewforum_body.html | 22 +++++++++---------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html index d6596203e5..cb6d14e47e 100644 --- a/phpBB/styles/prosilver/template/forumlist_body.html +++ b/phpBB/styles/prosilver/template/forumlist_body.html @@ -3,13 +3,13 @@ - +
-
+
  • @@ -55,14 +55,14 @@
-
+
-
+
{L_NO_FORUMS} -
+
diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 1561bae26a..81736cc917 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -3,8 +3,8 @@ +
-
+
  • @@ -156,16 +156,16 @@
-
+
-
+
{L_NO_TOPICS} -
+
From 259b86199be326e75080630f28407114aab7a56a Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Sat, 31 Mar 2012 18:57:49 +0530 Subject: [PATCH 017/255] [ticket/10734] Fixed template files Removed unnecessary span from several other template files PHPBB3-10734 --- phpBB/styles/prosilver/template/faq_body.html | 4 ++-- phpBB/styles/prosilver/template/login_body.html | 8 ++++---- phpBB/styles/prosilver/template/login_forum.html | 4 ++-- .../prosilver/template/memberlist_body.html | 12 ++++++------ .../prosilver/template/memberlist_email.html | 8 ++++---- .../prosilver/template/memberlist_search.html | 4 ++-- .../prosilver/template/memberlist_view.html | 12 ++++++------ .../styles/prosilver/template/message_body.html | 4 ++-- .../prosilver/template/search_results.html | 16 ++++++++-------- 9 files changed, 36 insertions(+), 36 deletions(-) diff --git a/phpBB/styles/prosilver/template/faq_body.html b/phpBB/styles/prosilver/template/faq_body.html index 36d677a505..7aa32b66b9 100644 --- a/phpBB/styles/prosilver/template/faq_body.html +++ b/phpBB/styles/prosilver/template/faq_body.html @@ -4,7 +4,7 @@ diff --git a/phpBB/styles/prosilver/template/login_body.html b/phpBB/styles/prosilver/template/login_body.html index 03615398c1..a3a70e3333 100644 --- a/phpBB/styles/prosilver/template/login_body.html +++ b/phpBB/styles/prosilver/template/login_body.html @@ -8,7 +8,7 @@
-
+

{LOGIN_EXPLAIN}{L_LOGIN}

@@ -45,13 +45,13 @@
-
+
-
+

{L_REGISTER}

@@ -61,7 +61,7 @@

{L_REGISTER}

-
+
diff --git a/phpBB/styles/prosilver/template/login_forum.html b/phpBB/styles/prosilver/template/login_forum.html index 569638411c..e66e531fcd 100644 --- a/phpBB/styles/prosilver/template/login_forum.html +++ b/phpBB/styles/prosilver/template/login_forum.html @@ -5,7 +5,7 @@ {S_FORM_TOKEN}
-
+

{L_LOGIN_FORUM}

@@ -27,7 +27,7 @@ {S_LOGIN_REDIRECT} -
+
diff --git a/phpBB/styles/prosilver/template/memberlist_body.html b/phpBB/styles/prosilver/template/memberlist_body.html index 504d1b80ef..f6f7bdc485 100644 --- a/phpBB/styles/prosilver/template/memberlist_body.html +++ b/phpBB/styles/prosilver/template/memberlist_body.html @@ -28,7 +28,7 @@

{PAGE_TITLE}: {SEARCH_WORDS}

-
+
-
+
-
+
@@ -77,11 +77,11 @@
-
+
-
+
@@ -121,7 +121,7 @@
-
+
diff --git a/phpBB/styles/prosilver/template/memberlist_email.html b/phpBB/styles/prosilver/template/memberlist_email.html index 9759abb859..062d266252 100644 --- a/phpBB/styles/prosilver/template/memberlist_email.html +++ b/phpBB/styles/prosilver/template/memberlist_email.html @@ -5,7 +5,7 @@
-
+

{ERROR_MESSAGE}

@@ -46,17 +46,17 @@
-
+
-
+
-
+
{S_FORM_TOKEN}
diff --git a/phpBB/styles/prosilver/template/memberlist_search.html b/phpBB/styles/prosilver/template/memberlist_search.html index 9df648f644..8d2ccf044c 100644 --- a/phpBB/styles/prosilver/template/memberlist_search.html +++ b/phpBB/styles/prosilver/template/memberlist_search.html @@ -44,7 +44,7 @@ function insert_single(user)
-
+

{L_FIND_USERNAME_EXPLAIN}

@@ -118,7 +118,7 @@ function insert_single(user) {S_FORM_TOKEN} -
+
diff --git a/phpBB/styles/prosilver/template/memberlist_view.html b/phpBB/styles/prosilver/template/memberlist_view.html index d8bb92a731..b50e3a84ad 100644 --- a/phpBB/styles/prosilver/template/memberlist_view.html +++ b/phpBB/styles/prosilver/template/memberlist_view.html @@ -4,7 +4,7 @@
-
+
@@ -49,11 +49,11 @@
-
+
-
+

{L_CONTACT_USER} {USERNAME}

@@ -94,18 +94,18 @@
-
+
-
+

{L_SIGNATURE}

{SIGNATURE}
-
+
diff --git a/phpBB/styles/prosilver/template/message_body.html b/phpBB/styles/prosilver/template/message_body.html index 3a970769b7..645807cd89 100644 --- a/phpBB/styles/prosilver/template/message_body.html +++ b/phpBB/styles/prosilver/template/message_body.html @@ -5,11 +5,11 @@
-
+

{MESSAGE_TITLE}

{MESSAGE_TEXT}

{L_RETURN_TO_SEARCH_ADV}

-
+
diff --git a/phpBB/styles/prosilver/template/search_results.html b/phpBB/styles/prosilver/template/search_results.html index 942d154d44..dbda076086 100644 --- a/phpBB/styles/prosilver/template/search_results.html +++ b/phpBB/styles/prosilver/template/search_results.html @@ -36,7 +36,7 @@
-
+
  • @@ -71,13 +71,13 @@
-
+
-
+
{L_NO_SEARCH_RESULTS} -
+
@@ -85,7 +85,7 @@
-
+
@@ -114,13 +114,13 @@ -
+
-
+
{L_NO_SEARCH_RESULTS} -
+
From d0e0f3e72b6d37b63c1e2eac7e1fb5a789a4dc43 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Sat, 31 Mar 2012 19:54:40 +0530 Subject: [PATCH 018/255] [ticket/10734] Fixed common.css Fixed padding. PHPBB3-10734 --- phpBB/styles/prosilver/theme/common.css | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 31015b28f9..6fd410029d 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -251,30 +251,35 @@ a#logo:hover { .headerbar { background: transparent none repeat-x 0 0; margin-bottom: 4px; - padding: 0 5px; + padding: 5px; } .navbar { padding: 0 10px; + background-color: #ebebeb; + padding: 5px 10px 5px 10px; } .forabg { background: transparent none repeat-x 0 0; margin-bottom: 4px; - padding: 0 5px; + padding: 5px; clear: both; } .forumbg { background: transparent none repeat-x 0 0; margin-bottom: 4px; - padding: 0 5px; + padding: 5px; clear: both; } .panel { margin-bottom: 4px; padding: 0 10px; + padding: 5px 10px; + background-color: #f3f3f3; + color: #3f3f3f; } .post { @@ -319,6 +324,11 @@ span.corners-bottom span { background-position: 100% 100%; } +span.clear { + background-image: none; + clear: both; +} + .headbg span.corners-bottom { margin-bottom: -1px; } From 05cbecb5581b0191ce9ba82b7966858595f81f85 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Sat, 31 Mar 2012 20:40:01 +0530 Subject: [PATCH 019/255] [ticket/10734] Removed unnecessary images Deleted the corner_left and corner_right images. PHPBB-10734 --- phpBB/styles/prosilver/theme/images/.DS_Store | Bin 0 -> 6148 bytes .../prosilver/theme/images/corners_left.gif | Bin 55 -> 0 bytes .../prosilver/theme/images/corners_left.png | Bin 195 -> 0 bytes .../prosilver/theme/images/corners_right.gif | Bin 56 -> 0 bytes .../prosilver/theme/images/corners_right.png | Bin 201 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 phpBB/styles/prosilver/theme/images/.DS_Store delete mode 100644 phpBB/styles/prosilver/theme/images/corners_left.gif delete mode 100644 phpBB/styles/prosilver/theme/images/corners_left.png delete mode 100644 phpBB/styles/prosilver/theme/images/corners_right.gif delete mode 100644 phpBB/styles/prosilver/theme/images/corners_right.png diff --git a/phpBB/styles/prosilver/theme/images/.DS_Store b/phpBB/styles/prosilver/theme/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T04$o>ne4iAh3&L2`^WYRA5oO4L^V4Js-_;eQwGtO9r vb18?EcF5l3lUA6=a3sAULP~`}Ac4V8+^F^0SN$nKYZyFT{an^LB{Ts5ju$_5 From 33a10f57f96d365bac2cd23764d23c76325d2c1b Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Sat, 31 Mar 2012 22:21:18 +0530 Subject: [PATCH 020/255] [ticket/10734] Removed unwanted CSS hacks Removed -webkit and -moz as suggested by cyberalien. Removed unused style elements. PHPBB-10734 --- phpBB/styles/prosilver/theme/colours.css | 32 ------------------------ 1 file changed, 32 deletions(-) diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index 11fa6932db..4f7bc12818 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -48,49 +48,33 @@ hr { background-image: url("./images/bg_header.gif"); color: #FFFFFF; border-radius: 7px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; } .navbar { background-color: #cadceb; border-radius: 7px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - } .forabg { background-color: #0076b1; background-image: url("./images/bg_list.gif"); border-radius: 7px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - } .forumbg { background-color: #12A3EB; background-image: url("./images/bg_header.gif"); border-radius: 7px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - } .panel { background-color: #ECF1F3; color: #28313F; border-radius: 7px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; } .post { border-radius: 7px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - } .post:target .content { @@ -113,22 +97,6 @@ hr { background-color: #E7E8EA; } -span.corners-top { - -} - -span.corners-top span { - -} - -span.corners-bottom { - -} - -span.corners-bottom span { - -} - /* Horizontal lists ----------------------------------------*/ From a728b08e9056473f19906f93f38339b9eb8f2ffc Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 00:05:37 +0530 Subject: [PATCH 021/255] [ticket/10734] Used pseudo class for clearing Instead of using a separate class for clearing, pseudo :after class is added. PHPBB3-10734 --- phpBB/styles/prosilver/theme/common.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 6fd410029d..790b9c154a 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -289,6 +289,12 @@ a#logo:hover { background-position: 100% 0; } +.inner:after { + content: ''; + clear: both; + display: block; +} + .rowbg { margin: 5px 5px 2px 5px; } From 03f5fde7476797ff06b9bdabcb5d56730180c628 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 00:42:11 +0530 Subject: [PATCH 022/255] [ticket/10734] Removed unwanted span classes Removed the corner and clear span classes PHPBB-10734 --- .../styles/prosilver/template/confirm_body.html | 4 ++-- phpBB/styles/prosilver/template/drafts.html | 8 ++++---- phpBB/styles/prosilver/template/faq_body.html | 6 +++--- .../prosilver/template/forumlist_body.html | 6 +++--- phpBB/styles/prosilver/template/login_body.html | 4 ++-- phpBB/styles/prosilver/template/login_forum.html | 2 +- .../prosilver/template/memberlist_body.html | 6 +++--- .../prosilver/template/memberlist_email.html | 4 ++-- .../styles/prosilver/template/memberlist_im.html | 4 ++-- .../prosilver/template/memberlist_leaders.html | 4 ++-- .../prosilver/template/memberlist_search.html | 2 +- .../styles/prosilver/template/message_body.html | 2 +- .../prosilver/template/overall_footer.html | 2 +- .../prosilver/template/overall_header.html | 8 ++++---- .../prosilver/template/posting_attach_body.html | 4 ++-- .../prosilver/template/posting_editor.html | 12 ++++++------ .../prosilver/template/posting_layout.html | 16 ++++++++-------- .../prosilver/template/posting_pm_layout.html | 8 ++++---- .../prosilver/template/posting_poll_body.html | 4 ++-- .../prosilver/template/posting_preview.html | 8 ++++---- .../prosilver/template/posting_review.html | 6 +++--- .../prosilver/template/posting_smilies.html | 4 ++-- .../prosilver/template/posting_topic_review.html | 6 +++--- .../prosilver/template/quickreply_editor.html | 4 ++-- phpBB/styles/prosilver/template/report_body.html | 8 ++++---- phpBB/styles/prosilver/template/search_body.html | 16 ++++++++-------- .../prosilver/template/search_results.html | 8 ++++---- .../prosilver/template/viewforum_body.html | 12 ++++++------ .../prosilver/template/viewonline_body.html | 4 ++-- .../prosilver/template/viewonline_whois.html | 4 ++-- .../prosilver/template/viewtopic_body.html | 12 ++++++------ 31 files changed, 99 insertions(+), 99 deletions(-) diff --git a/phpBB/styles/prosilver/template/confirm_body.html b/phpBB/styles/prosilver/template/confirm_body.html index 5b783915a4..cddbdee391 100644 --- a/phpBB/styles/prosilver/template/confirm_body.html +++ b/phpBB/styles/prosilver/template/confirm_body.html @@ -2,7 +2,7 @@
-
+

{MESSAGE_TITLE}

{MESSAGE_TEXT}

@@ -13,7 +13,7 @@ -
+
diff --git a/phpBB/styles/prosilver/template/drafts.html b/phpBB/styles/prosilver/template/drafts.html index dea3bb414e..c3c54876e3 100644 --- a/phpBB/styles/prosilver/template/drafts.html +++ b/phpBB/styles/prosilver/template/drafts.html @@ -2,16 +2,16 @@
-
+

{L_LOAD_DRAFT}

{L_LOAD_DRAFT_EXPLAIN}

-
+
-
+
  • @@ -39,6 +39,6 @@
-
+
diff --git a/phpBB/styles/prosilver/template/faq_body.html b/phpBB/styles/prosilver/template/faq_body.html index 7aa32b66b9..46f738aa3a 100644 --- a/phpBB/styles/prosilver/template/faq_body.html +++ b/phpBB/styles/prosilver/template/faq_body.html @@ -21,7 +21,7 @@
- + @@ -30,7 +30,7 @@
-
+

{faq_block.BLOCK_TITLE}

@@ -44,7 +44,7 @@
-
+
diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html index cb6d14e47e..ed08aa791a 100644 --- a/phpBB/styles/prosilver/template/forumlist_body.html +++ b/phpBB/styles/prosilver/template/forumlist_body.html @@ -3,7 +3,7 @@ - + @@ -55,7 +55,7 @@ - + @@ -63,6 +63,6 @@
{L_NO_FORUMS} -
+
diff --git a/phpBB/styles/prosilver/template/login_body.html b/phpBB/styles/prosilver/template/login_body.html index a3a70e3333..d8b9b01779 100644 --- a/phpBB/styles/prosilver/template/login_body.html +++ b/phpBB/styles/prosilver/template/login_body.html @@ -45,7 +45,7 @@ - + @@ -61,7 +61,7 @@

{L_REGISTER}

- + diff --git a/phpBB/styles/prosilver/template/login_forum.html b/phpBB/styles/prosilver/template/login_forum.html index e66e531fcd..13669a78bb 100644 --- a/phpBB/styles/prosilver/template/login_forum.html +++ b/phpBB/styles/prosilver/template/login_forum.html @@ -27,7 +27,7 @@ {S_LOGIN_REDIRECT} - + diff --git a/phpBB/styles/prosilver/template/memberlist_body.html b/phpBB/styles/prosilver/template/memberlist_body.html index f6f7bdc485..d5154761e9 100644 --- a/phpBB/styles/prosilver/template/memberlist_body.html +++ b/phpBB/styles/prosilver/template/memberlist_body.html @@ -46,7 +46,7 @@ - + @@ -77,7 +77,7 @@ - +
@@ -121,7 +121,7 @@ -
+ diff --git a/phpBB/styles/prosilver/template/memberlist_email.html b/phpBB/styles/prosilver/template/memberlist_email.html index 062d266252..97bea144e8 100644 --- a/phpBB/styles/prosilver/template/memberlist_email.html +++ b/phpBB/styles/prosilver/template/memberlist_email.html @@ -46,7 +46,7 @@ - +
@@ -56,7 +56,7 @@
- + {S_FORM_TOKEN} diff --git a/phpBB/styles/prosilver/template/memberlist_im.html b/phpBB/styles/prosilver/template/memberlist_im.html index 88c57eb8c5..ccef778ebb 100644 --- a/phpBB/styles/prosilver/template/memberlist_im.html +++ b/phpBB/styles/prosilver/template/memberlist_im.html @@ -6,7 +6,7 @@
-
+

{L_SEND_IM_EXPLAIN}

@@ -79,7 +79,7 @@ {S_FORM_TOKEN} -
+
diff --git a/phpBB/styles/prosilver/template/memberlist_leaders.html b/phpBB/styles/prosilver/template/memberlist_leaders.html index bce1a69619..d0daa564c1 100644 --- a/phpBB/styles/prosilver/template/memberlist_leaders.html +++ b/phpBB/styles/prosilver/template/memberlist_leaders.html @@ -6,7 +6,7 @@
-
+
@@ -37,7 +37,7 @@
-
+
diff --git a/phpBB/styles/prosilver/template/memberlist_search.html b/phpBB/styles/prosilver/template/memberlist_search.html index 8d2ccf044c..2ea32fc774 100644 --- a/phpBB/styles/prosilver/template/memberlist_search.html +++ b/phpBB/styles/prosilver/template/memberlist_search.html @@ -118,7 +118,7 @@ function insert_single(user) {S_FORM_TOKEN} - + diff --git a/phpBB/styles/prosilver/template/message_body.html b/phpBB/styles/prosilver/template/message_body.html index 645807cd89..fb6dfce35f 100644 --- a/phpBB/styles/prosilver/template/message_body.html +++ b/phpBB/styles/prosilver/template/message_body.html @@ -9,7 +9,7 @@

{MESSAGE_TITLE}

{MESSAGE_TEXT}

{L_RETURN_TO_SEARCH_ADV}

- + diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 81736cc917..3973ffe73f 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -16,7 +16,7 @@
  • {L_THE_TEAM}{L_DELETE_COOKIES}{S_TIMEZONE}
  • - + - + + @@ -165,8 +165,8 @@
    -
    +
    {L_INFORMATION}: {L_BOARD_DISABLED} -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_attach_body.html b/phpBB/styles/prosilver/template/posting_attach_body.html index d39405487d..162b0b5d4e 100644 --- a/phpBB/styles/prosilver/template/posting_attach_body.html +++ b/phpBB/styles/prosilver/template/posting_attach_body.html @@ -1,5 +1,5 @@
    -
    +

    {L_ADD_ATTACHMENT_EXPLAIN}

    @@ -17,5 +17,5 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_editor.html b/phpBB/styles/prosilver/template/posting_editor.html index efd2c054d5..a5b41b6da4 100644 --- a/phpBB/styles/prosilver/template/posting_editor.html +++ b/phpBB/styles/prosilver/template/posting_editor.html @@ -149,13 +149,13 @@ -
    +
    -
    +

    {L_POSTED_ATTACHMENTS}

    @@ -177,13 +177,13 @@
    -
    +
    -
    +
    {S_HIDDEN_ADDRESS_FIELD} {S_HIDDEN_FIELDS} @@ -194,7 +194,7 @@
    -
    +
    @@ -210,7 +210,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_layout.html b/phpBB/styles/prosilver/template/posting_layout.html index b81c8162d7..a5cb3fc154 100644 --- a/phpBB/styles/prosilver/template/posting_layout.html +++ b/phpBB/styles/prosilver/template/posting_layout.html @@ -8,7 +8,7 @@
    -
    +
    {L_FORUM_RULES} @@ -17,7 +17,7 @@ {FORUM_RULES} -
    +
    @@ -25,12 +25,12 @@
    -
    +

    {L_INFORMATION}

    {L_DRAFT_LOADED}

    -
    +
    @@ -40,7 +40,7 @@
    -
    +

    {L_SELECT_DESTINATION_FORUM}

    {L_UNGLOBALISE_EXPLAIN}

    @@ -55,21 +55,21 @@
    -
    +
    -
    +

    {L_POST_A}

    {S_FORM_TOKEN} -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_pm_layout.html b/phpBB/styles/prosilver/template/posting_pm_layout.html index ebeb90b6d3..5421cc2cbd 100644 --- a/phpBB/styles/prosilver/template/posting_pm_layout.html +++ b/phpBB/styles/prosilver/template/posting_pm_layout.html @@ -2,12 +2,12 @@
    -
    +

    {L_INFORMATION}

    {L_DRAFT_LOADED_PM}

    -
    +
    @@ -18,12 +18,12 @@

    {L_TITLE}

    -
    +
    -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_poll_body.html b/phpBB/styles/prosilver/template/posting_poll_body.html index ba0014ce57..3f64c5d5b5 100644 --- a/phpBB/styles/prosilver/template/posting_poll_body.html +++ b/phpBB/styles/prosilver/template/posting_poll_body.html @@ -1,5 +1,5 @@
    -
    +

    {L_ADD_POLL_EXPLAIN}

    @@ -52,5 +52,5 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_preview.html b/phpBB/styles/prosilver/template/posting_preview.html index 82227c23b0..16fc4ba233 100644 --- a/phpBB/styles/prosilver/template/posting_preview.html +++ b/phpBB/styles/prosilver/template/posting_preview.html @@ -1,5 +1,5 @@
    -
    +
    @@ -16,11 +16,11 @@
    -
    +
    -
    +
    @@ -41,7 +41,7 @@
    {PREVIEW_SIGNATURE}
    -
    +

    diff --git a/phpBB/styles/prosilver/template/posting_review.html b/phpBB/styles/prosilver/template/posting_review.html index 540f116de4..2771c9829a 100644 --- a/phpBB/styles/prosilver/template/posting_review.html +++ b/phpBB/styles/prosilver/template/posting_review.html @@ -5,11 +5,11 @@
    -
    +
    {post_review_row.L_IGNORE_POST}
    -
    +
    @@ -28,7 +28,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/posting_smilies.html b/phpBB/styles/prosilver/template/posting_smilies.html index 9f7e25406e..84191588e2 100644 --- a/phpBB/styles/prosilver/template/posting_smilies.html +++ b/phpBB/styles/prosilver/template/posting_smilies.html @@ -10,12 +10,12 @@

    {L_SMILIES}

    -
    +
    {smiley.SMILEY_CODE} -
    +
    {PAGINATION}
    {L_CLOSE_WINDOW} diff --git a/phpBB/styles/prosilver/template/posting_topic_review.html b/phpBB/styles/prosilver/template/posting_topic_review.html index 1c4b67044d..5e7b36c526 100644 --- a/phpBB/styles/prosilver/template/posting_topic_review.html +++ b/phpBB/styles/prosilver/template/posting_topic_review.html @@ -14,11 +14,11 @@
    -
    +
    {topic_review_row.L_IGNORE_POST}
    -
    +
    @@ -45,7 +45,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/quickreply_editor.html b/phpBB/styles/prosilver/template/quickreply_editor.html index 4cd5eedd3e..f2c1eeb139 100644 --- a/phpBB/styles/prosilver/template/quickreply_editor.html +++ b/phpBB/styles/prosilver/template/quickreply_editor.html @@ -1,6 +1,6 @@
    -
    +

    {L_QUICKREPLY}

    @@ -17,6 +17,6 @@    
    -
    +
    diff --git a/phpBB/styles/prosilver/template/report_body.html b/phpBB/styles/prosilver/template/report_body.html index ec1a1e5820..3e876afe85 100644 --- a/phpBB/styles/prosilver/template/report_body.html +++ b/phpBB/styles/prosilver/template/report_body.html @@ -4,7 +4,7 @@
    -
    +

    {L_REPORT_POST_EXPLAIN}{L_REPORT_MESSAGE_EXPLAIN}

    @@ -30,11 +30,11 @@
    -
    +
    -
    +
    @@ -44,7 +44,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/search_body.html b/phpBB/styles/prosilver/template/search_body.html index 4b1d30d77d..a8baafa5f1 100644 --- a/phpBB/styles/prosilver/template/search_body.html +++ b/phpBB/styles/prosilver/template/search_body.html @@ -11,7 +11,7 @@
    -
    +

    {L_SEARCH_QUERY}

    @@ -27,11 +27,11 @@
    -
    +
    -
    +

    {L_SEARCH_OPTIONS}

    @@ -81,25 +81,25 @@ -
    +
    -
    +
    {S_HIDDEN_FIELDS} 
    -
    +
    -
    +
    @@ -121,7 +121,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/search_results.html b/phpBB/styles/prosilver/template/search_results.html index dbda076086..5d75bd3d56 100644 --- a/phpBB/styles/prosilver/template/search_results.html +++ b/phpBB/styles/prosilver/template/search_results.html @@ -71,13 +71,13 @@ -
    +
    {L_NO_SEARCH_RESULTS} -
    +
    @@ -114,13 +114,13 @@ -
    +
    {L_NO_SEARCH_RESULTS} -
    +
    diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html index f62815ede1..f5ff1d3f98 100644 --- a/phpBB/styles/prosilver/template/viewforum_body.html +++ b/phpBB/styles/prosilver/template/viewforum_body.html @@ -21,7 +21,7 @@ {FORUM_RULES} - + @@ -72,7 +72,7 @@
    {L_NO_READ_ACCESS} -
    +
    @@ -104,7 +104,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -156,7 +156,7 @@ - + @@ -165,7 +165,7 @@
    {L_NO_TOPICS} -
    +
    diff --git a/phpBB/styles/prosilver/template/viewonline_body.html b/phpBB/styles/prosilver/template/viewonline_body.html index 3f1f0e64bf..9da8202783 100644 --- a/phpBB/styles/prosilver/template/viewonline_body.html +++ b/phpBB/styles/prosilver/template/viewonline_body.html @@ -8,7 +8,7 @@
    -
    +
    @@ -38,7 +38,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/viewonline_whois.html b/phpBB/styles/prosilver/template/viewonline_whois.html index 88a41a1a3f..8abd933efa 100644 --- a/phpBB/styles/prosilver/template/viewonline_whois.html +++ b/phpBB/styles/prosilver/template/viewonline_whois.html @@ -3,13 +3,13 @@

    {L_WHOIS}

    -
    +
    {WHOIS}
    -
    +
    {L_CLOSE_WINDOW} diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index 3c551b3d52..9110cea4e9 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -12,7 +12,7 @@
    -
    +
    {L_FORUM_RULES} @@ -21,7 +21,7 @@ {FORUM_RULES} -
    +
    @@ -59,7 +59,7 @@
    -
    +

    {POLL_QUESTION}

    @@ -98,7 +98,7 @@
    -
    +
    {S_FORM_TOKEN} {S_HIDDEN_FIELDS}
    @@ -111,7 +111,7 @@
    -
    +
    @@ -221,7 +221,7 @@ -
    +

    From 57ba42d8df363a51cb2443ae8a502d58ae63f26d Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 00:49:31 +0530 Subject: [PATCH 023/255] [ticket/10734] Removed unwanted css elements Removed all the corner css elements PHPBB-10734 --- phpBB/styles/prosilver/theme/colours.css | 33 -------------------- phpBB/styles/prosilver/theme/common.css | 38 +----------------------- 2 files changed, 1 insertion(+), 70 deletions(-) diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index 4f7bc12818..b6d1f310c6 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -877,39 +877,6 @@ ul.cplist { background-color: #FFFFFF; } -#cp-main span.corners-top, #cp-menu span.corners-top { - background-image: url("./images/corners_left2.gif"); -} - -#cp-main span.corners-top span, #cp-menu span.corners-top span { - background-image: url("./images/corners_right2.gif"); -} - -#cp-main span.corners-bottom, #cp-menu span.corners-bottom { - background-image: url("./images/corners_left2.gif"); -} - -#cp-main span.corners-bottom span, #cp-menu span.corners-bottom span { - background-image: url("./images/corners_right2.gif"); -} - -/* Topicreview */ -#cp-main .panel #topicreview span.corners-top, #cp-menu .panel #topicreview span.corners-top { - background-image: url("./images/corners_left.gif"); -} - -#cp-main .panel #topicreview span.corners-top span, #cp-menu .panel #topicreview span.corners-top span { - background-image: url("./images/corners_right.gif"); -} - -#cp-main .panel #topicreview span.corners-bottom, #cp-menu .panel #topicreview span.corners-bottom { - background-image: url("./images/corners_left.gif"); -} - -#cp-main .panel #topicreview span.corners-bottom span, #cp-menu .panel #topicreview span.corners-bottom span { - background-image: url("./images/corners_right.gif"); -} - /* Friends list */ .cp-mini { background-color: #eef5f9; diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 790b9c154a..249e3a3822 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -283,7 +283,7 @@ a#logo:hover { } .post { - padding: 0 10px; + padding: 10px; margin-bottom: 4px; background-repeat: no-repeat; background-position: 100% 0; @@ -299,42 +299,6 @@ a#logo:hover { margin: 5px 5px 2px 5px; } -span.corners-top, span.corners-bottom, span.corners-top span, span.corners-bottom span { - font-size: 1px; - line-height: 1px; - display: block; - height: 5px; - background-repeat: no-repeat; -} - -span.corners-top { - background-image: none; - background-position: 0 0; - margin: 0 -5px; -} - -span.corners-top span { - background-image: none; - background-position: 100% 0; -} - -span.corners-bottom { - background-image: none; - background-position: 0 100%; - margin: 0 -5px; - clear: both; -} - -span.corners-bottom span { - background-image: none; - background-position: 100% 100%; -} - -span.clear { - background-image: none; - clear: both; -} - .headbg span.corners-bottom { margin-bottom: -1px; } From 6498f2d33a16fa493f18c0d84bcce2dca1478179 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 01:47:08 +0530 Subject: [PATCH 024/255] [ticket/10734] Fixed IE7 clear float bug Modified tweaks.css to fix IE bug PHPBB-10734 --- phpBB/styles/prosilver/theme/tweaks.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/phpBB/styles/prosilver/theme/tweaks.css b/phpBB/styles/prosilver/theme/tweaks.css index 416c4a5510..cdef01965e 100644 --- a/phpBB/styles/prosilver/theme/tweaks.css +++ b/phpBB/styles/prosilver/theme/tweaks.css @@ -28,4 +28,9 @@ dl.details dd { /* Headerbar height fix for IE7 */ #site-description p { *margin-bottom: 1.0em; +} + +/* Clear float fix for IE7 */ +.inner { + zoom: 1; } \ No newline at end of file From 97ff7ee9d80ed04210242c5c902f05c583467513 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 02:04:11 +0530 Subject: [PATCH 025/255] [ticket/10734] Fixed padding issues Fixed padding for post and panel. PHPBB-10734 --- phpBB/styles/prosilver/theme/common.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 249e3a3822..592b6a2ff9 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -277,13 +277,12 @@ a#logo:hover { .panel { margin-bottom: 4px; padding: 0 10px; - padding: 5px 10px; background-color: #f3f3f3; color: #3f3f3f; } .post { - padding: 10px; + padding: 5px 10px; margin-bottom: 4px; background-repeat: no-repeat; background-position: 100% 0; From 3ced1d2bfcee5ee4c0c62cae752d84c9cd4c9ea0 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 16:15:55 +0530 Subject: [PATCH 026/255] [ticket/10734] Removed all the unnecessary corner classes Removed the corner span classes from all the template and theme files. PHPBB-10734 --- .../prosilver/template/captcha_default.html | 4 +- .../styles/prosilver/template/captcha_qa.html | 4 +- .../prosilver/template/captcha_recaptcha.html | 4 +- .../prosilver/template/mcp_approve.html | 4 +- phpBB/styles/prosilver/template/mcp_ban.html | 10 ++--- .../styles/prosilver/template/mcp_forum.html | 4 +- .../styles/prosilver/template/mcp_front.html | 16 ++++---- .../styles/prosilver/template/mcp_header.html | 2 +- phpBB/styles/prosilver/template/mcp_logs.html | 6 +-- phpBB/styles/prosilver/template/mcp_move.html | 4 +- .../prosilver/template/mcp_notes_front.html | 4 +- .../prosilver/template/mcp_notes_user.html | 12 +++--- phpBB/styles/prosilver/template/mcp_post.html | 28 +++++++------- .../styles/prosilver/template/mcp_queue.html | 4 +- .../prosilver/template/mcp_reports.html | 4 +- .../styles/prosilver/template/mcp_topic.html | 18 ++++----- .../prosilver/template/mcp_warn_front.html | 12 +++--- .../prosilver/template/mcp_warn_list.html | 4 +- .../prosilver/template/mcp_warn_post.html | 12 +++--- .../prosilver/template/mcp_warn_user.html | 8 ++-- .../styles/prosilver/template/mcp_whois.html | 4 +- .../prosilver/template/ucp_agreement.html | 12 +++--- .../prosilver/template/ucp_attachments.html | 4 +- .../template/ucp_avatar_options.html | 8 ++-- .../prosilver/template/ucp_groups_manage.html | 16 ++++---- .../template/ucp_groups_membership.html | 12 +++--- .../styles/prosilver/template/ucp_header.html | 10 ++--- .../template/ucp_main_bookmarks.html | 4 +- .../prosilver/template/ucp_main_drafts.html | 6 +-- .../prosilver/template/ucp_main_front.html | 4 +- .../template/ucp_main_subscribed.html | 4 +- .../prosilver/template/ucp_pm_history.html | 4 +- .../template/ucp_pm_message_header.html | 2 +- .../prosilver/template/ucp_pm_options.html | 4 +- .../prosilver/template/ucp_pm_popup.html | 4 +- .../prosilver/template/ucp_pm_viewfolder.html | 6 +-- .../template/ucp_pm_viewmessage.html | 6 +-- .../template/ucp_prefs_personal.html | 4 +- .../prosilver/template/ucp_prefs_post.html | 4 +- .../prosilver/template/ucp_prefs_view.html | 4 +- .../template/ucp_profile_profile_info.html | 4 +- .../template/ucp_profile_reg_details.html | 8 ++-- .../template/ucp_profile_signature.html | 8 ++-- .../prosilver/template/ucp_register.html | 12 +++--- .../styles/prosilver/template/ucp_remind.html | 4 +- .../styles/prosilver/template/ucp_resend.html | 4 +- .../prosilver/template/ucp_zebra_foes.html | 4 +- .../prosilver/template/ucp_zebra_friends.html | 4 +- phpBB/styles/prosilver/theme/common.css | 24 ------------ phpBB/styles/prosilver/theme/cp.css | 37 ------------------- 50 files changed, 167 insertions(+), 228 deletions(-) diff --git a/phpBB/styles/prosilver/template/captcha_default.html b/phpBB/styles/prosilver/template/captcha_default.html index bccf231251..007cff644f 100644 --- a/phpBB/styles/prosilver/template/captcha_default.html +++ b/phpBB/styles/prosilver/template/captcha_default.html @@ -1,6 +1,6 @@
    -
    +

    {L_CONFIRMATION}

    {L_CONFIRM_EXPLAIN}

    @@ -19,6 +19,6 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/captcha_qa.html b/phpBB/styles/prosilver/template/captcha_qa.html index 0b18ada3bb..7986b1faa2 100644 --- a/phpBB/styles/prosilver/template/captcha_qa.html +++ b/phpBB/styles/prosilver/template/captcha_qa.html @@ -1,6 +1,6 @@
    -
    +

    {L_CONFIRMATION}

    @@ -16,6 +16,6 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/captcha_recaptcha.html b/phpBB/styles/prosilver/template/captcha_recaptcha.html index 51a1615bd5..087a5b9405 100644 --- a/phpBB/styles/prosilver/template/captcha_recaptcha.html +++ b/phpBB/styles/prosilver/template/captcha_recaptcha.html @@ -1,6 +1,6 @@
    -
    +

    {L_CONFIRMATION}

    {L_CONFIRM_EXPLAIN}

    @@ -45,6 +45,6 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_approve.html b/phpBB/styles/prosilver/template/mcp_approve.html index 1010ac6e6f..8b7f7c8c6d 100644 --- a/phpBB/styles/prosilver/template/mcp_approve.html +++ b/phpBB/styles/prosilver/template/mcp_approve.html @@ -3,7 +3,7 @@
    {S_FORM_TOKEN} -
    +
    @@ -45,7 +45,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_ban.html b/phpBB/styles/prosilver/template/mcp_ban.html index f8cdc1a687..adcd86d057 100644 --- a/phpBB/styles/prosilver/template/mcp_ban.html +++ b/phpBB/styles/prosilver/template/mcp_ban.html @@ -36,7 +36,7 @@

    {L_TITLE}

    -
    +

    {L_TITLE}

    {L_EXPLAIN}

    @@ -72,7 +72,7 @@ -
    +
    @@ -82,7 +82,7 @@
    -
    +

    {L_UNBAN_TITLE}

    {L_UNBAN_EXPLAIN}

    @@ -107,7 +107,7 @@ -
    +
    @@ -119,7 +119,7 @@

    {L_NO_BAN_CELL}

    -
    + diff --git a/phpBB/styles/prosilver/template/mcp_forum.html b/phpBB/styles/prosilver/template/mcp_forum.html index 49d4601dfa..afd4f2308a 100644 --- a/phpBB/styles/prosilver/template/mcp_forum.html +++ b/phpBB/styles/prosilver/template/mcp_forum.html @@ -8,7 +8,7 @@
    -
    +
    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_front.html b/phpBB/styles/prosilver/template/mcp_front.html index e9635e528c..69e0b02a4e 100644 --- a/phpBB/styles/prosilver/template/mcp_front.html +++ b/phpBB/styles/prosilver/template/mcp_front.html @@ -7,7 +7,7 @@
    -
    +

    {L_LATEST_UNAPPROVED}

    {L_UNAPPROVED_TOTAL}

    @@ -42,7 +42,7 @@ -
    +
    {S_FORM_TOKEN}
    @@ -59,7 +59,7 @@
    -
    +

    {L_LATEST_REPORTED}

    {L_REPORTS_TOTAL}

    @@ -92,13 +92,13 @@ -
    +
    -
    +

    {L_LATEST_REPORTED_PMS}

    {L_PM_REPORTS_TOTAL}

    @@ -131,13 +131,13 @@ -
    +
    -
    +

    {L_LATEST_LOGS}

    @@ -170,7 +170,7 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_header.html b/phpBB/styles/prosilver/template/mcp_header.html index 13cc7e12cf..7b9e4c13cb 100644 --- a/phpBB/styles/prosilver/template/mcp_header.html +++ b/phpBB/styles/prosilver/template/mcp_header.html @@ -19,7 +19,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_logs.html b/phpBB/styles/prosilver/template/mcp_logs.html index 713ab7d9da..b5561687b2 100644 --- a/phpBB/styles/prosilver/template/mcp_logs.html +++ b/phpBB/styles/prosilver/template/mcp_logs.html @@ -5,7 +5,7 @@
    -
    +
    {S_FORM_TOKEN} -
    +
    @@ -80,7 +80,7 @@ {S_FORM_TOKEN} -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_move.html b/phpBB/styles/prosilver/template/mcp_move.html index 03a5c475db..4611412a9e 100644 --- a/phpBB/styles/prosilver/template/mcp_move.html +++ b/phpBB/styles/prosilver/template/mcp_move.html @@ -3,7 +3,7 @@
    -
    +

    {MESSAGE_TITLE}

    @@ -30,7 +30,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_notes_front.html b/phpBB/styles/prosilver/template/mcp_notes_front.html index 38970198e7..3da66ccb2e 100644 --- a/phpBB/styles/prosilver/template/mcp_notes_front.html +++ b/phpBB/styles/prosilver/template/mcp_notes_front.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +
    @@ -15,7 +15,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_notes_user.html b/phpBB/styles/prosilver/template/mcp_notes_user.html index 129f2ca839..afe904dab3 100644 --- a/phpBB/styles/prosilver/template/mcp_notes_user.html +++ b/phpBB/styles/prosilver/template/mcp_notes_user.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {USERNAME_FULL}

    @@ -25,11 +25,11 @@
    -
    +
    -
    +

    {L_ADD_FEEDBACK}

    {L_ADD_FEEDBACK_EXPLAIN}

    @@ -38,7 +38,7 @@
    - +
    @@ -48,7 +48,7 @@
    -
    +
    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_post.html b/phpBB/styles/prosilver/template/mcp_post.html index 496d9ffd0f..752fbdd078 100644 --- a/phpBB/styles/prosilver/template/mcp_post.html +++ b/phpBB/styles/prosilver/template/mcp_post.html @@ -8,7 +8,7 @@
    -
    +

    {L_REPORT_REASON}: {REPORT_REASON_TITLE}

    @@ -25,7 +25,7 @@
    -
    +
    @@ -45,7 +45,7 @@
    -
    +
    @@ -115,12 +115,12 @@
    -
    +
    -
    +

    {L_MOD_OPTIONS}

    @@ -159,18 +159,18 @@ -
    +
    -
    +

    {RETURN_QUEUE} | {RETURN_TOPIC_SIMPLE} | {RETURN_POST}{RETURN_REPORTS} | {L_VIEW_POST} | {L_VIEW_TOPIC} | {L_VIEW_FORUM}{RETURN_TOPIC}

    -
    +
    @@ -179,7 +179,7 @@
    -
    +
    @@ -216,13 +216,13 @@
    -
    +
    -
    +

    {L_MCP_POST_REPORTS}

    @@ -231,13 +231,13 @@

    {reports.REASON_TITLE}: {reports.REASON_DESC}
    {reports.REPORT_TEXT}

    -
    +
    -
    +

    {L_THIS_POST_IP}: {POST_IPADDR}{POST_IP} ({POST_IP}{L_LOOKUP_IP}) @@ -289,7 +289,7 @@

    {L_LOOKUP_ALL}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_queue.html b/phpBB/styles/prosilver/template/mcp_queue.html index f86678ebe4..e9a477a24c 100644 --- a/phpBB/styles/prosilver/template/mcp_queue.html +++ b/phpBB/styles/prosilver/template/mcp_queue.html @@ -11,7 +11,7 @@

    {L_TITLE}

    -
    +

    {L_EXPLAIN}

    @@ -81,7 +81,7 @@

    {L_NO_TOPICS_QUEUE}{L_NO_POSTS_QUEUE}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_reports.html b/phpBB/styles/prosilver/template/mcp_reports.html index 5f06fc091e..95e7d9e021 100644 --- a/phpBB/styles/prosilver/template/mcp_reports.html +++ b/phpBB/styles/prosilver/template/mcp_reports.html @@ -13,7 +13,7 @@

    {L_TITLE}

    -
    +

    {L_EXPLAIN}

    @@ -83,7 +83,7 @@

    {L_NO_REPORTS}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_topic.html b/phpBB/styles/prosilver/template/mcp_topic.html index ab0c83a56f..1da1b1b3d4 100644 --- a/phpBB/styles/prosilver/template/mcp_topic.html +++ b/phpBB/styles/prosilver/template/mcp_topic.html @@ -22,15 +22,15 @@ onload_functions.push('subPanels()');
    @@ -39,7 +39,7 @@ onload_functions.push('subPanels()');
    -
    +
    @@ -89,11 +89,11 @@ onload_functions.push('subPanels()');
    -
    +
    -
    +

    {L_EXPAND_VIEW} @@ -103,7 +103,7 @@ onload_functions.push('subPanels()');
    -
    +
    @@ -131,7 +131,7 @@ onload_functions.push('subPanels()');
    -
    +
    @@ -147,7 +147,7 @@ onload_functions.push('subPanels()'); -

    +
    diff --git a/phpBB/styles/prosilver/template/mcp_warn_front.html b/phpBB/styles/prosilver/template/mcp_warn_front.html index 8f42e28cc0..f631cfb00d 100644 --- a/phpBB/styles/prosilver/template/mcp_warn_front.html +++ b/phpBB/styles/prosilver/template/mcp_warn_front.html @@ -5,7 +5,7 @@

    {L_WARN_USER}

    -
    +

    {L_SELECT_USER}

    @@ -17,7 +17,7 @@
    -
    +
    @@ -28,7 +28,7 @@
    -
    +

    {L_MOST_WARNINGS}

    @@ -58,11 +58,11 @@

    {L_WARNINGS_ZERO_TOTAL}

    -
    +
    -
    +

    {L_LATEST_WARNINGS}

    @@ -91,7 +91,7 @@

    {L_WARNINGS_ZERO_TOTAL}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/mcp_warn_list.html b/phpBB/styles/prosilver/template/mcp_warn_list.html index d9c0bce088..b17b1dd589 100644 --- a/phpBB/styles/prosilver/template/mcp_warn_list.html +++ b/phpBB/styles/prosilver/template/mcp_warn_list.html @@ -5,7 +5,7 @@

    {L_WARNED_USERS}

    -
    +

    {L_WARNED_USERS_EXPLAIN}

    @@ -56,7 +56,7 @@

    {L_WARNINGS_ZERO_TOTAL}

    -
    +
    {S_FORM_TOKEN}
    diff --git a/phpBB/styles/prosilver/template/mcp_warn_post.html b/phpBB/styles/prosilver/template/mcp_warn_post.html index fd8c60d25a..540abb9473 100644 --- a/phpBB/styles/prosilver/template/mcp_warn_post.html +++ b/phpBB/styles/prosilver/template/mcp_warn_post.html @@ -5,7 +5,7 @@

    {L_MCP_WARN_POST}

    -
    +

    {USERNAME}{USERNAME}

    @@ -25,11 +25,11 @@
    -
    +
    -
    +

    {L_POST_DETAILS}

    @@ -41,11 +41,11 @@
    -
    +
    -
    +

    {L_ADD_WARNING}

    {L_ADD_WARNING_EXPLAIN}

    @@ -61,7 +61,7 @@
    - +
    diff --git a/phpBB/styles/prosilver/template/mcp_warn_user.html b/phpBB/styles/prosilver/template/mcp_warn_user.html index 6c326c8bc6..5e99c8d7e1 100644 --- a/phpBB/styles/prosilver/template/mcp_warn_user.html +++ b/phpBB/styles/prosilver/template/mcp_warn_user.html @@ -5,7 +5,7 @@

    {L_WARN_USER}

    -
    +

    {USERNAME_FULL}

    @@ -25,11 +25,11 @@
    -
    +
    -
    +

    {L_ADD_WARNING}

    {L_ADD_WARNING_EXPLAIN}

    @@ -45,7 +45,7 @@
    - +
    diff --git a/phpBB/styles/prosilver/template/mcp_whois.html b/phpBB/styles/prosilver/template/mcp_whois.html index 0da9b6187e..88d3269a71 100644 --- a/phpBB/styles/prosilver/template/mcp_whois.html +++ b/phpBB/styles/prosilver/template/mcp_whois.html @@ -2,7 +2,7 @@

    {L_WHOIS}

    -
    +

    {L_RETURN_POST}

    @@ -10,7 +10,7 @@

    {L_RETURN_POST}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_agreement.html b/phpBB/styles/prosilver/template/ucp_agreement.html index 3825abc08f..4109b6ef34 100644 --- a/phpBB/styles/prosilver/template/ucp_agreement.html +++ b/phpBB/styles/prosilver/template/ucp_agreement.html @@ -31,16 +31,16 @@
    -
    +

    {SITENAME} - {L_REGISTRATION}

    {L_COPPA_BIRTHDAY}{L_TERMS_OF_USE}

    -
    +
    -
    +
    {L_COPPA_NO}  {L_COPPA_YES} @@ -51,21 +51,21 @@ {S_HIDDEN_FIELDS} {S_FORM_TOKEN}
    -
    +
    -
    +

    {SITENAME} - {AGREEMENT_TITLE}

    {AGREEMENT_TEXT}


    {L_BACK}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_attachments.html b/phpBB/styles/prosilver/template/ucp_attachments.html index 5a15339b8a..84e4c2e875 100644 --- a/phpBB/styles/prosilver/template/ucp_attachments.html +++ b/phpBB/styles/prosilver/template/ucp_attachments.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {L_ATTACHMENTS_EXPLAIN}

    @@ -63,7 +63,7 @@

    {L_UCP_NO_ATTACHMENTS}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_avatar_options.html b/phpBB/styles/prosilver/template/ucp_avatar_options.html index 7012c42f3b..9801e065a5 100644 --- a/phpBB/styles/prosilver/template/ucp_avatar_options.html +++ b/phpBB/styles/prosilver/template/ucp_avatar_options.html @@ -1,6 +1,6 @@
    -
    +

    {L_AVATAR_FEATURES_DISABLED}

    @@ -43,11 +43,11 @@
    - +
    -
    +

    {L_AVATAR_GALLERY}

    @@ -66,5 +66,5 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_groups_manage.html b/phpBB/styles/prosilver/template/ucp_groups_manage.html index a6f8e1d793..a13c043e48 100644 --- a/phpBB/styles/prosilver/template/ucp_groups_manage.html +++ b/phpBB/styles/prosilver/template/ucp_groups_manage.html @@ -5,7 +5,7 @@
    -
    +

    {L_GROUPS_EXPLAIN}

    @@ -45,11 +45,11 @@ -
    +
    -
    +

    {L_GROUP_SETTINGS_SAVE}

    @@ -63,7 +63,7 @@
    -
    +
    @@ -163,7 +163,7 @@ - +
    @@ -173,7 +173,7 @@
    -
    +

    {L_ADD_USERS}

    @@ -194,7 +194,7 @@ -
    +
    @@ -230,7 +230,7 @@

    {L_NO_LEADERS}

    - + diff --git a/phpBB/styles/prosilver/template/ucp_groups_membership.html b/phpBB/styles/prosilver/template/ucp_groups_membership.html index 26ee6d8a52..a312911ae4 100644 --- a/phpBB/styles/prosilver/template/ucp_groups_membership.html +++ b/phpBB/styles/prosilver/template/ucp_groups_membership.html @@ -5,7 +5,7 @@
    -
    +

    {L_GROUPS_EXPLAIN}

    @@ -66,12 +66,12 @@ -
    +
    -
    +
    • @@ -98,12 +98,12 @@
    -
    +
    -
    +
    • @@ -130,7 +130,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_header.html b/phpBB/styles/prosilver/template/ucp_header.html index 4d008564c4..c5d58b8eaa 100644 --- a/phpBB/styles/prosilver/template/ucp_header.html +++ b/phpBB/styles/prosilver/template/ucp_header.html @@ -15,7 +15,7 @@
    -
    +
    @@ -63,7 +63,7 @@
    -
    +
    {L_FRIENDS}
    @@ -77,13 +77,13 @@
    -
    +
    -
    +
    {L_MESSAGE_COLOURS}
    @@ -92,7 +92,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_main_bookmarks.html b/phpBB/styles/prosilver/template/ucp_main_bookmarks.html index 50310f3b79..89502bbc3d 100644 --- a/phpBB/styles/prosilver/template/ucp_main_bookmarks.html +++ b/phpBB/styles/prosilver/template/ucp_main_bookmarks.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {L_BOOKMARKS_EXPLAIN}

    @@ -60,7 +60,7 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_main_drafts.html b/phpBB/styles/prosilver/template/ucp_main_drafts.html index 2fc9e3e1fc..2155abeda3 100644 --- a/phpBB/styles/prosilver/template/ucp_main_drafts.html +++ b/phpBB/styles/prosilver/template/ucp_main_drafts.html @@ -5,14 +5,14 @@

    {L_TITLE}

    -
    +

    {L_DRAFTS_EXPLAIN}

    -
    +
    @@ -55,7 +55,7 @@

    {L_NO_SAVED_DRAFTS}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_main_front.html b/phpBB/styles/prosilver/template/ucp_main_front.html index 20afd119cc..b7a0619227 100644 --- a/phpBB/styles/prosilver/template/ucp_main_front.html +++ b/phpBB/styles/prosilver/template/ucp_main_front.html @@ -3,7 +3,7 @@

    {L_TITLE}

    -
    +

    {L_UCP_WELCOME}

    @@ -39,7 +39,7 @@
    {L_YOUR_WARNINGS}:
    {WARNING_IMG} [{WARNINGS}]
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_main_subscribed.html b/phpBB/styles/prosilver/template/ucp_main_subscribed.html index 2711c9486f..ab65d9b3ae 100644 --- a/phpBB/styles/prosilver/template/ucp_main_subscribed.html +++ b/phpBB/styles/prosilver/template/ucp_main_subscribed.html @@ -4,7 +4,7 @@

    {L_TITLE}

    -
    +

    {L_WATCHED_EXPLAIN}

    @@ -77,7 +77,7 @@

    {L_NO_WATCHED_TOPICS}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_pm_history.html b/phpBB/styles/prosilver/template/ucp_pm_history.html index 9051eb2ee0..d7fcbb9e54 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_history.html +++ b/phpBB/styles/prosilver/template/ucp_pm_history.html @@ -12,7 +12,7 @@
    -
    +
    @@ -28,7 +28,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_pm_message_header.html b/phpBB/styles/prosilver/template/ucp_pm_message_header.html index ae66dd0a36..d6659fad0f 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_message_header.html +++ b/phpBB/styles/prosilver/template/ucp_pm_message_header.html @@ -3,7 +3,7 @@
    -
    +

    {FOLDER_STATUS}

    diff --git a/phpBB/styles/prosilver/template/ucp_pm_options.html b/phpBB/styles/prosilver/template/ucp_pm_options.html index c2a2e58c97..dde8ee639b 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_options.html +++ b/phpBB/styles/prosilver/template/ucp_pm_options.html @@ -5,7 +5,7 @@
    -
    +

    {ERROR_MESSAGE}

    {NOTIFICATION_MESSAGE}

    @@ -123,7 +123,7 @@
    - + {S_FORM_TOKEN}
    diff --git a/phpBB/styles/prosilver/template/ucp_pm_popup.html b/phpBB/styles/prosilver/template/ucp_pm_popup.html index 1a9a4d015e..4cc39ee450 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_popup.html +++ b/phpBB/styles/prosilver/template/ucp_pm_popup.html @@ -14,12 +14,12 @@ function jump_to_inbox(url)
    -
    +

    {L_LOGIN_CHECK_PM}{MESSAGE}

    {CLICK_TO_VIEW}

    {L_CLOSE_WINDOW}

    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html b/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html index dac03c3505..20394b254e 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html +++ b/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html @@ -8,7 +8,7 @@

    {L_EXPORT_AS_CSV}

    -
    +

    {L_OPTIONS}

    @@ -20,7 +20,7 @@
    -
    +
    @@ -110,7 +110,7 @@ - + diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html index 5411fda572..2e7a7c4ac9 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html +++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html @@ -2,7 +2,7 @@ - + @@ -15,7 +15,7 @@
    -
    +
    @@ -96,7 +96,7 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_prefs_personal.html b/phpBB/styles/prosilver/template/ucp_prefs_personal.html index 635f321469..1c829899fd 100644 --- a/phpBB/styles/prosilver/template/ucp_prefs_personal.html +++ b/phpBB/styles/prosilver/template/ucp_prefs_personal.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {ERROR}

    @@ -95,7 +95,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_prefs_post.html b/phpBB/styles/prosilver/template/ucp_prefs_post.html index ee3ae3f34e..0ca51ed7d6 100644 --- a/phpBB/styles/prosilver/template/ucp_prefs_post.html +++ b/phpBB/styles/prosilver/template/ucp_prefs_post.html @@ -4,7 +4,7 @@

    {L_TITLE}

    -
    +

    {ERROR}

    @@ -38,7 +38,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_prefs_view.html b/phpBB/styles/prosilver/template/ucp_prefs_view.html index 125a62e12a..2e47c2e054 100644 --- a/phpBB/styles/prosilver/template/ucp_prefs_view.html +++ b/phpBB/styles/prosilver/template/ucp_prefs_view.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {ERROR}

    @@ -81,7 +81,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html index 0f53c82e76..b6f6a8988d 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html +++ b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {L_PROFILE_INFO_NOTICE}

    @@ -66,7 +66,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html index 9d4a9e3463..4f74c7193b 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html +++ b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html @@ -4,7 +4,7 @@

    {L_TITLE}

    -
    +

    {L_FORCE_PASSWORD_EXPLAIN}

    @@ -31,11 +31,11 @@
    -
    +
    -
    +
    @@ -44,7 +44,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_profile_signature.html b/phpBB/styles/prosilver/template/ucp_profile_signature.html index cf5a6c3229..574f61ed9f 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_signature.html +++ b/phpBB/styles/prosilver/template/ucp_profile_signature.html @@ -6,17 +6,17 @@
    -
    +

    {L_SIGNATURE_PREVIEW}

    {SIGNATURE_PREVIEW}
    -
    +
    -
    +

    {L_SIGNATURE_EXPLAIN}

    @@ -36,7 +36,7 @@
    - +
    diff --git a/phpBB/styles/prosilver/template/ucp_register.html b/phpBB/styles/prosilver/template/ucp_register.html index 30ed37eecc..47253af37c 100644 --- a/phpBB/styles/prosilver/template/ucp_register.html +++ b/phpBB/styles/prosilver/template/ucp_register.html @@ -21,7 +21,7 @@
    -
    +

    {SITENAME} - {L_REGISTRATION}

    @@ -72,7 +72,7 @@
    - + @@ -83,17 +83,17 @@
    -
    +

    {L_COPPA_COMPLIANCE}

    {L_COPPA_EXPLAIN}

    -
    +
    -
    +
    {S_HIDDEN_FIELDS} @@ -102,7 +102,7 @@ {S_FORM_TOKEN}
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_remind.html b/phpBB/styles/prosilver/template/ucp_remind.html index afc23b3f21..d480258209 100644 --- a/phpBB/styles/prosilver/template/ucp_remind.html +++ b/phpBB/styles/prosilver/template/ucp_remind.html @@ -3,7 +3,7 @@
    -
    +

    {L_SEND_PASSWORD}

    @@ -25,7 +25,7 @@
    - + diff --git a/phpBB/styles/prosilver/template/ucp_resend.html b/phpBB/styles/prosilver/template/ucp_resend.html index 0481c2a601..36e112863c 100644 --- a/phpBB/styles/prosilver/template/ucp_resend.html +++ b/phpBB/styles/prosilver/template/ucp_resend.html @@ -4,7 +4,7 @@
    -
    +

    {L_UCP_RESEND}

    @@ -25,7 +25,7 @@
    -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_zebra_foes.html b/phpBB/styles/prosilver/template/ucp_zebra_foes.html index 8a2c9cbff5..7aceac74c3 100644 --- a/phpBB/styles/prosilver/template/ucp_zebra_foes.html +++ b/phpBB/styles/prosilver/template/ucp_zebra_foes.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {L_FOES_EXPLAIN}

    @@ -28,7 +28,7 @@ -
    +
    diff --git a/phpBB/styles/prosilver/template/ucp_zebra_friends.html b/phpBB/styles/prosilver/template/ucp_zebra_friends.html index 928ec1a881..8908e4ba69 100644 --- a/phpBB/styles/prosilver/template/ucp_zebra_friends.html +++ b/phpBB/styles/prosilver/template/ucp_zebra_friends.html @@ -5,7 +5,7 @@

    {L_TITLE}

    -
    +

    {L_FRIENDS_EXPLAIN}

    @@ -28,7 +28,7 @@
    - +
    diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 592b6a2ff9..fd67c48111 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -298,22 +298,6 @@ a#logo:hover { margin: 5px 5px 2px 5px; } -.headbg span.corners-bottom { - margin-bottom: -1px; -} - -.post span.corners-top, .post span.corners-bottom, .panel span.corners-top, .panel span.corners-bottom, .navbar span.corners-top, .navbar span.corners-bottom { - margin: 0 -10px; -} - -.rules span.corners-top { - margin: 0 -10px 5px -10px; -} - -.rules span.corners-bottom { - margin: 5px -10px 0 -10px; -} - /* Horizontal lists ----------------------------------------*/ ul.linklist { @@ -437,14 +421,6 @@ table.info tbody th { margin: 0 -1px; } -.forumbg-table > .inner > span.corners-top { - margin: 0 -4px -1px -4px; -} - -.forumbg-table > .inner > span.corners-bottom { - margin: -1px -4px 0 -4px; -} - /* Misc layout styles ---------------------------------------- */ /* column[1-2] styles are containers for two column layouts diff --git a/phpBB/styles/prosilver/theme/cp.css b/phpBB/styles/prosilver/theme/cp.css index 74f11e47a6..d073b2b9d1 100644 --- a/phpBB/styles/prosilver/theme/cp.css +++ b/phpBB/styles/prosilver/theme/cp.css @@ -240,49 +240,12 @@ ul.cplist { margin-left: 10px; } -#cp-main span.corners-top, #cp-menu span.corners-top { - background-image: none; -} - -#cp-main span.corners-top span, #cp-menu span.corners-top span { - background-image: none; -} - -#cp-main span.corners-bottom, #cp-menu span.corners-bottom { - background-image: none; -} - -#cp-main span.corners-bottom span, #cp-menu span.corners-bottom span { - background-image: none; -} - -/* Topicreview */ -#cp-main .panel #topicreview span.corners-top, #cp-menu .panel #topicreview span.corners-top { - background-image: none; -} - -#cp-main .panel #topicreview span.corners-top span, #cp-menu .panel #topicreview span.corners-top span { - background-image: none; -} - -#cp-main .panel #topicreview span.corners-bottom, #cp-menu .panel #topicreview span.corners-bottom { - background-image: none; -} - -#cp-main .panel #topicreview span.corners-bottom span, #cp-menu .panel #topicreview span.corners-bottom span { - background-image: none; -} - /* Friends list */ .cp-mini { padding: 0 5px; margin: 10px 15px 10px 5px; } -.cp-mini span.corners-top, .cp-mini span.corners-bottom { - margin: 0 -5px; -} - dl.mini dt { font-weight: bold; } From d8c67937d6e9bb07f4ab103e66c96efaf0bb51d1 Mon Sep 17 00:00:00 2001 From: Shibu Lijack Date: Mon, 2 Apr 2012 16:53:09 +0530 Subject: [PATCH 027/255] [ticket/10734] Fixed cp css Fixed border radius and padding of the ucp and mcp. PHPBB-10734 --- phpBB/styles/prosilver/theme/colours.css | 1 + phpBB/styles/prosilver/theme/common.css | 2 +- phpBB/styles/prosilver/theme/cp.css | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index b6d1f310c6..53fa2dd653 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -871,6 +871,7 @@ ul.cplist { #cp-main .panel { background-color: #F9F9F9; + padding: 5px 10px; } #cp-main .pm { diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index fd67c48111..57696d71ee 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -276,7 +276,7 @@ a#logo:hover { .panel { margin-bottom: 4px; - padding: 0 10px; + padding: 5px 10px; background-color: #f3f3f3; color: #3f3f3f; } diff --git a/phpBB/styles/prosilver/theme/cp.css b/phpBB/styles/prosilver/theme/cp.css index d073b2b9d1..899b02faf1 100644 --- a/phpBB/styles/prosilver/theme/cp.css +++ b/phpBB/styles/prosilver/theme/cp.css @@ -179,7 +179,9 @@ ul.cplist { #minitabs li { display: block; float: right; - padding: 0 10px 4px 10px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + padding: 5px 10px 4px 10px; font-size: 1em; font-weight: bold; margin-left: 2px; From 57065095d570f0ff5976470ce81a4b216fe5f98e Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 00:41:56 +0300 Subject: [PATCH 028/255] [ticket/10754] Changing $style to $phpbb_style Renaming global variable $style to $phpbb_style PHPBB3-10754 --- phpBB/adm/index.php | 4 ++-- phpBB/common.php | 2 +- phpBB/includes/functions_messenger.php | 4 ++-- phpBB/includes/user.php | 4 ++-- phpBB/install/index.php | 6 +++--- phpBB/install/install_update.php | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/phpBB/adm/index.php b/phpBB/adm/index.php index 91894e5aec..e20bbe4bec 100644 --- a/phpBB/adm/index.php +++ b/phpBB/adm/index.php @@ -51,8 +51,8 @@ $module_id = request_var('i', ''); $mode = request_var('mode', ''); // Set custom style for admin area -$style->set_ext_dir_prefix('adm/'); -$style->set_custom_style('admin', $phpbb_admin_path . 'style', ''); +$phpbb_style->set_ext_dir_prefix('adm/'); +$phpbb_style->set_custom_style('admin', $phpbb_admin_path . 'style', ''); $template->assign_var('T_ASSETS_PATH', $phpbb_root_path . 'assets'); $template->assign_var('T_TEMPLATE_PATH', $phpbb_admin_path . 'style'); diff --git a/phpBB/common.php b/phpBB/common.php index b3b8d7e4f7..a00e3e82a8 100644 --- a/phpBB/common.php +++ b/phpBB/common.php @@ -125,7 +125,7 @@ $phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_ro $phpbb_style_resource_locator = new phpbb_style_resource_locator(); $phpbb_style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); $template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider); -$style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); +$phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); $phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager); $phpbb_subscriber_loader->load(); diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index aae200df55..f608c95fe4 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -211,7 +211,7 @@ class messenger $style_resource_locator = new phpbb_style_resource_locator(); $style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); $tpl = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider); - $stl = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $tpl); + $style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $tpl); $this->tpl_msg[$template_lang . $template_file] = $tpl; $fallback_template_path = false; @@ -230,7 +230,7 @@ class messenger } } - $stl->set_custom_style($template_lang . '_email', array($template_path, $fallback_template_path), ''); + $style->set_custom_style($template_lang . '_email', array($template_path, $fallback_template_path), ''); $tpl->set_filenames(array( 'body' => $template_file . '.txt', diff --git a/phpBB/includes/user.php b/phpBB/includes/user.php index 1676f82ccb..ce9c804f23 100644 --- a/phpBB/includes/user.php +++ b/phpBB/includes/user.php @@ -72,7 +72,7 @@ class phpbb_user extends phpbb_session */ function setup($lang_set = false, $style_id = false) { - global $db, $style, $template, $config, $auth, $phpEx, $phpbb_root_path, $cache; + global $db, $phpbb_style, $template, $config, $auth, $phpEx, $phpbb_root_path, $cache; if ($this->data['user_id'] != ANONYMOUS) { @@ -206,7 +206,7 @@ class phpbb_user extends phpbb_session } } - $style->set_style(); + $phpbb_style->set_style(); $this->img_lang = $this->lang_name; diff --git a/phpBB/install/index.php b/phpBB/install/index.php index 13ab30a9fa..bb10521bba 100644 --- a/phpBB/install/index.php +++ b/phpBB/install/index.php @@ -203,9 +203,9 @@ $config = new phpbb_config(array( $phpbb_style_resource_locator = new phpbb_style_resource_locator(); $phpbb_style_path_provider = new phpbb_style_path_provider(); $template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider); -$style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); -$style->set_ext_dir_prefix('adm/'); -$style->set_custom_style('admin', '../adm/style', ''); +$phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); +$phpbb_style->set_ext_dir_prefix('adm/'); +$phpbb_style->set_custom_style('admin', '../adm/style', ''); $template->assign_var('T_ASSETS_PATH', '../assets'); $template->assign_var('T_TEMPLATE_PATH', '../adm/style'); diff --git a/phpBB/install/install_update.php b/phpBB/install/install_update.php index dcf01e5cc8..c2feaa086a 100644 --- a/phpBB/install/install_update.php +++ b/phpBB/install/install_update.php @@ -131,7 +131,7 @@ class install_update extends module } // Set custom template again. ;) - $style->set_custom_style('admin', '../adm/style', ''); + $phpbb_style->set_custom_style('admin', '../adm/style', ''); $template->assign_vars(array( 'S_USER_LANG' => $user->lang['USER_LANG'], From 084e1ae5603f4204945d25afcfabaeb1198df20f Mon Sep 17 00:00:00 2001 From: Hari Sankar R Date: Tue, 3 Apr 2012 22:15:59 +0530 Subject: [PATCH 029/255] [ticket/10561] All users can choose deactivated styles (fixed). A form exploit enabled the users to select a deactivated style. Fixed with extra check on submit, with a new function styles_verify to check if the selected style is activated or not. PHPBB3-10561 --- phpBB/includes/functions.php | 18 ++++++++++++++++++ phpBB/includes/ucp/ucp_prefs.php | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 0320230a7d..530638c56b 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1238,6 +1238,24 @@ function style_select($default = '', $all = false) return $style_options; } +/** +* Check if style is activated +*/ +function style_verify($style_id = 0) +{ + global $db; + + $sql = 'SELECT style_id, style_active + FROM ' . STYLES_TABLE . " + WHERE style_id = $style_id"; + $result = $db->sql_query($sql); + + $style_verified = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + return $style_verified['style_active']; +} + /** * Pick a timezone */ diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php index 13167b2b3d..0df8acd5af 100644 --- a/phpBB/includes/ucp/ucp_prefs.php +++ b/phpBB/includes/ucp/ucp_prefs.php @@ -61,7 +61,8 @@ class ucp_prefs if ($submit) { - $data['style'] = ($config['override_user_style']) ? $config['default_style'] : $data['style']; + $data['style'] = ($config['override_user_style']) ? $config['default_style'] : + (style_verify($data['style']) ? $data['style'] : ((int) $user->data['user_style'])); $error = validate_data($data, array( 'dateformat' => array('string', false, 1, 30), From b81a5afc2541e035b78bfe5f7c8374c9d4ae6b9f Mon Sep 17 00:00:00 2001 From: Hari Sankar R Date: Tue, 3 Apr 2012 22:56:06 +0530 Subject: [PATCH 030/255] [ticket/10561] Changes made to function phpbb_style_is_active(). Fixed return type, documented function and, removed style_id from fetch. PHPBB3-10561 --- phpBB/includes/functions.php | 12 +++++++----- phpBB/includes/ucp/ucp_prefs.php | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 530638c56b..3881299648 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1239,21 +1239,23 @@ function style_select($default = '', $all = false) } /** -* Check if style is activated +* @author Hari Sankar R +* @param int $style_id The style_id of a style which should be checked if activated or not. +* @return boolean */ -function style_verify($style_id = 0) +function phpbb_style_is_active($style_id) { global $db; - $sql = 'SELECT style_id, style_active + $sql = 'SELECT style_active FROM ' . STYLES_TABLE . " - WHERE style_id = $style_id"; + WHERE style_id = ". (int) $style_id; $result = $db->sql_query($sql); $style_verified = $db->sql_fetchrow($result); $db->sql_freeresult($result); - return $style_verified['style_active']; + return (bool) $style_verified['style_active']; } /** diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php index 0df8acd5af..e81bd1e1bb 100644 --- a/phpBB/includes/ucp/ucp_prefs.php +++ b/phpBB/includes/ucp/ucp_prefs.php @@ -62,7 +62,7 @@ class ucp_prefs if ($submit) { $data['style'] = ($config['override_user_style']) ? $config['default_style'] : - (style_verify($data['style']) ? $data['style'] : ((int) $user->data['user_style'])); + (phpbb_style_is_active($data['style']) ? $data['style'] : ((int) $user->data['user_style'])); $error = validate_data($data, array( 'dateformat' => array('string', false, 1, 30), From c5481371b9e4dc6f30f7a9bce1beba21530f9977 Mon Sep 17 00:00:00 2001 From: Hari Sankar R Date: Tue, 3 Apr 2012 23:04:56 +0530 Subject: [PATCH 031/255] [ticket/10561] Changes made to $db->sql_fetchrow(). Changed $db->sql_fetchrow() to $db->sql_fetchfield(). PHPBB3-10561 --- phpBB/includes/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 3881299648..a6ddcdd0a3 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1252,10 +1252,10 @@ function phpbb_style_is_active($style_id) WHERE style_id = ". (int) $style_id; $result = $db->sql_query($sql); - $style_verified = $db->sql_fetchrow($result); + $style_verified = (bool) $db->sql_fetchfield('style_active');; $db->sql_freeresult($result); - return (bool) $style_verified['style_active']; + return $style_verified; } /** From a84b97f58e8177eb28ad41cfb261200d523c9ff5 Mon Sep 17 00:00:00 2001 From: Hari Sankar R Date: Tue, 3 Apr 2012 23:15:16 +0530 Subject: [PATCH 032/255] [ticket/10561] Fixed syntax error and renamed return variables. Renamed $style_verified to $style_is_active and fixed extra ';'. PHPBB3-10561 --- phpBB/includes/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index a6ddcdd0a3..70a961a744 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1252,10 +1252,10 @@ function phpbb_style_is_active($style_id) WHERE style_id = ". (int) $style_id; $result = $db->sql_query($sql); - $style_verified = (bool) $db->sql_fetchfield('style_active');; + $style_is_active = (bool) $db->sql_fetchfield('style_active'); $db->sql_freeresult($result); - return $style_verified; + return $style_is_active; } /** From e769e0f723224b24cd9363530eb101be4818dc21 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Wed, 4 Apr 2012 13:07:24 +0300 Subject: [PATCH 033/255] [ticket/10762] Changing version format in style.cfg Splitting version into style_version and phpbb_version in style.cfg PHPBB3-10762 --- phpBB/styles/prosilver/style.cfg | 3 ++- phpBB/styles/subsilver2/style.cfg | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/style.cfg b/phpBB/styles/prosilver/style.cfg index a80f1ed537..633079e4a6 100644 --- a/phpBB/styles/prosilver/style.cfg +++ b/phpBB/styles/prosilver/style.cfg @@ -18,7 +18,8 @@ # General Information about this style name = prosilver copyright = © phpBB Group, 2007 -version = 3.1.0-dev +style_version = 3.1.0-dev +phpbb_version = 3.1.0-dev # Defining a different template bitfield # template_bitfield = lNg= diff --git a/phpBB/styles/subsilver2/style.cfg b/phpBB/styles/subsilver2/style.cfg index 1a71e7254d..ca81337d17 100644 --- a/phpBB/styles/subsilver2/style.cfg +++ b/phpBB/styles/subsilver2/style.cfg @@ -18,7 +18,8 @@ # General Information about this style name = subsilver2 copyright = © 2005 phpBB Group -version = 3.1.0-dev +style_version = 3.1.0-dev +phpbb_version = 3.1.0-dev # Defining a different template bitfield # template_bitfield = lNg= From bb628044071f40130cdfc632d7f5636a11711ae0 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Wed, 4 Apr 2012 13:13:12 +0300 Subject: [PATCH 034/255] [ticket/10762] Check for phpbb_version when installing style Check if phpbb_version exists when installing style. Do not warn users about installing outdated styles yet, that part of acp_styles will be changed in different branch. PHPBB3-10762 --- phpBB/includes/acp/acp_styles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index d33be274b4..de1f678e38 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -1056,7 +1056,7 @@ class acp_styles */ protected function read_style_cfg($dir) { - static $required = array('name', 'version', 'copyright'); + static $required = array('name', 'phpbb_version', 'copyright'); $cfg = parse_cfg_file($this->styles_path . $dir . '/style.cfg'); // Check if it is a valid file From 018419b36cf4d81cf2fa3f82d85f9bc8580c9c19 Mon Sep 17 00:00:00 2001 From: Hari Sankar R Date: Thu, 5 Apr 2012 19:31:18 +0530 Subject: [PATCH 035/255] [ticket/10561] Moved and renamed the funtion validate_style(). Fixed minor changes as suggested by @bantu. PHPBB3-10561 --- phpBB/includes/functions.php | 20 -------------------- phpBB/includes/functions_user.php | 19 +++++++++++++++++++ phpBB/includes/ucp/ucp_prefs.php | 10 ++++++++-- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 70a961a744..0320230a7d 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1238,26 +1238,6 @@ function style_select($default = '', $all = false) return $style_options; } -/** -* @author Hari Sankar R -* @param int $style_id The style_id of a style which should be checked if activated or not. -* @return boolean -*/ -function phpbb_style_is_active($style_id) -{ - global $db; - - $sql = 'SELECT style_active - FROM ' . STYLES_TABLE . " - WHERE style_id = ". (int) $style_id; - $result = $db->sql_query($sql); - - $style_is_active = (bool) $db->sql_fetchfield('style_active'); - $db->sql_freeresult($result); - - return $style_is_active; -} - /** * Pick a timezone */ diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 10fb57ea97..7313844955 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -1948,6 +1948,25 @@ function validate_jabber($jid) return false; } +/** +* @param int $style_id The style_id of a style which should be checked if activated or not. +* @return boolean +*/ +function phpbb_validate_style($style_id) +{ + global $db; + + $sql = 'SELECT style_active + FROM ' . STYLES_TABLE . ' + WHERE style_id = '. (int) $style_id; + $result = $db->sql_query($sql); + + $style_is_active = (bool) $db->sql_fetchfield('style_active'); + $db->sql_freeresult($result); + + return $style_is_active; +} + /** * Remove avatar */ diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php index e81bd1e1bb..5b915824d6 100644 --- a/phpBB/includes/ucp/ucp_prefs.php +++ b/phpBB/includes/ucp/ucp_prefs.php @@ -61,8 +61,14 @@ class ucp_prefs if ($submit) { - $data['style'] = ($config['override_user_style']) ? $config['default_style'] : - (phpbb_style_is_active($data['style']) ? $data['style'] : ((int) $user->data['user_style'])); + if ($config['override_user_style']) + { + $data['style'] = $config['default_style']; + } + else if (!phpbb_validate_style($data['style'])) + { + $data['style'] = (int) $user->data['user_style']); + } $error = validate_data($data, array( 'dateformat' => array('string', false, 1, 30), From be9eb577856d2dec24a3023ef00275b0e6ac88b4 Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Thu, 5 Apr 2012 22:22:11 +0100 Subject: [PATCH 036/255] [ticket/10455] Removed NOTE from prosilver overall_header.html. PHPBB3-10455 --- phpBB/styles/prosilver/template/overall_header.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index a46c161542..c75cc92940 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -28,10 +28,6 @@ Based on style: prosilver (this is the default phpBB3 style) Original author: Tom Beddard ( http://www.subBlue.com/ ) Modified by: - - NOTE: This page was generated by phpBB, the free open-source bulletin board package. - The phpBB Group is not responsible for the content of this page and forum. For more information - about phpBB please visit http://www.phpbb.com --> - - + + - + - + - + From 4771af08339d456174cbe3ebb1563e0f756733dd Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Wed, 11 Apr 2012 14:33:09 +0100 Subject: [PATCH 080/255] [ticket/10783] Added assets_version to subsilver2. PHPBB3-10783 --- phpBB/styles/subsilver2/template/overall_footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/subsilver2/template/overall_footer.html b/phpBB/styles/subsilver2/template/overall_footer.html index 4f686cf5e4..24c6f8105c 100644 --- a/phpBB/styles/subsilver2/template/overall_footer.html +++ b/phpBB/styles/subsilver2/template/overall_footer.html @@ -9,7 +9,7 @@ - + {SCRIPTS} From 6ad58c7e046c9f257ad5441b7a583cddb213ad3f Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Wed, 11 Apr 2012 14:37:15 +0100 Subject: [PATCH 081/255] [ticket/10783] Added assets_version to ACP and simple_*.html. PHPBB3-10783 --- phpBB/adm/style/overall_footer.html | 4 ++-- phpBB/adm/style/overall_header.html | 2 +- phpBB/adm/style/simple_footer.html | 2 +- phpBB/adm/style/simple_header.html | 2 +- phpBB/styles/prosilver/template/simple_footer.html | 2 +- phpBB/styles/prosilver/template/simple_header.html | 8 ++++---- phpBB/styles/subsilver2/template/simple_footer.html | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/phpBB/adm/style/overall_footer.html b/phpBB/adm/style/overall_footer.html index 0d88c8bcc5..2bc9ee52d7 100644 --- a/phpBB/adm/style/overall_footer.html +++ b/phpBB/adm/style/overall_footer.html @@ -37,8 +37,8 @@ - - + + {SCRIPTS} diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html index be5ac29131..f79c0318b5 100644 --- a/phpBB/adm/style/overall_header.html +++ b/phpBB/adm/style/overall_header.html @@ -5,7 +5,7 @@ {META} {PAGE_TITLE} - + - + diff --git a/phpBB/adm/style/simple_header.html b/phpBB/adm/style/simple_header.html index 84ff665acc..d4cbcb6cbe 100644 --- a/phpBB/adm/style/simple_header.html +++ b/phpBB/adm/style/simple_header.html @@ -5,7 +5,7 @@ {META} {PAGE_TITLE} - + - + {SCRIPTS} diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html index f0dcbed5a4..5440d66520 100644 --- a/phpBB/styles/prosilver/template/simple_header.html +++ b/phpBB/styles/prosilver/template/simple_header.html @@ -40,18 +40,18 @@ // ]]> - + - + - + diff --git a/phpBB/styles/subsilver2/template/simple_footer.html b/phpBB/styles/subsilver2/template/simple_footer.html index 771765ee12..6082b71891 100644 --- a/phpBB/styles/subsilver2/template/simple_footer.html +++ b/phpBB/styles/subsilver2/template/simple_footer.html @@ -6,7 +6,7 @@ - + {SCRIPTS} From 534d96695744e2ddeebf33a971edef40d443e585 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 11 Apr 2012 21:39:27 +0200 Subject: [PATCH 082/255] [ticket/10788] Add imkingdavid to the list of developers in docs/AUTHORS. PHPBB3-10788 --- phpBB/docs/AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS index de599193d2..234f8c273b 100644 --- a/phpBB/docs/AUTHORS +++ b/phpBB/docs/AUTHORS @@ -25,6 +25,7 @@ phpBB Lead Developer: naderman (Nils Adermann) phpBB Developers: Acyd Burn (Meik Sievertsen) [Lead 09/2005 - 01/2010] bantu (Andreas Fischer) ckwalsh (Cullen Walsh) + imkingdavid (David King) igorw (Igor Wiedler) kellanved (Henry Sudhof) nickvergessen (Joas Schilling) From f394fd250e5cf35a38579ecc403a78e223f37da8 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 11 Apr 2012 22:08:36 +0200 Subject: [PATCH 083/255] [ticket/10788] Move ckwalsh and kellanved to the Former Contributors section. PHPBB3-10788 --- phpBB/docs/AUTHORS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS index 234f8c273b..57adec6a67 100644 --- a/phpBB/docs/AUTHORS +++ b/phpBB/docs/AUTHORS @@ -24,10 +24,8 @@ phpBB Lead Developer: naderman (Nils Adermann) phpBB Developers: Acyd Burn (Meik Sievertsen) [Lead 09/2005 - 01/2010] bantu (Andreas Fischer) - ckwalsh (Cullen Walsh) imkingdavid (David King) igorw (Igor Wiedler) - kellanved (Henry Sudhof) nickvergessen (Joas Schilling) Oleg (Oleg Pudeyev) rxu (Ruslan Uzdenov) @@ -49,9 +47,11 @@ phpBB Developers: A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010] APTX (Marek A. RuszczyĹ„ski) [12/2007 - 04/2011] Ashe (Ludovic Arnaud) [10/2002 - 11/2003, 06/2006 - 10/2006] BartVB (Bart van Bragt) [11/2000 - 03/2006] + ckwalsh (Cullen Walsh) [01/2010 - 07/2011] DavidMJ (David M.) [12/2005 - 08/2009] dhn (Dominik Dröscher) [05/2007 - 01/2011] GrahamJE (Graham Eames) [09/2005 - 11/2006] + kellanved (Henry Sudhof) [04/2007 - 03/2011] TerraFrost (Jim Wigginton) [04/2009 - 01/2011] Vic D'Elfant (Vic D'Elfant) [04/2007 - 04/2009] From 8382e449423fd1dfecb416389613e847b02f63c6 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 11 Apr 2012 23:57:36 -0400 Subject: [PATCH 084/255] [ticket/10688] Update readme for 3.1 and current practices. PHPBB3-10688 --- phpBB/docs/README.html | 55 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html index 7cd727c60e..6adc1ee7cb 100644 --- a/phpBB/docs/README.html +++ b/phpBB/docs/README.html @@ -84,23 +84,26 @@
    -

    Installation, update and conversion instructions can be found in the INSTALL document contained in this distribution. If you are intending to convert from a previous phpBB 2.0.x installation we highly recommend you backup any existing data before proceeding!

    +

    Installation, update and conversion instructions can be found in the INSTALL document contained in this distribution. If you are intending to convert from a previous phpBB 2.0.x or 3.0.x installation we highly recommend you backup any existing data before proceeding!

    -

    Users of phpBB3 Beta versions cannot directly update.

    +

    Users of phpBB 3.0 and 3.1 Beta versions cannot directly update.

    Please note that we won't support the following installation types:

      -
    • Updates from phpBB3 Beta versions to phpBB3 RC1 and higher
    • -
    • Conversions from phpBB 2.0.x to phpBB3 Beta versions
    • -
    • phpBB3 Beta installations
    • +
    • Updates from phpBB 3.0 Beta versions to phpBB 3.0 RC1 and higher
    • +
    • Updates from phpBB 3.1 Beta versions to phpBB 3.1 RC1 and higher
    • +
    • Conversions from phpBB 2.0.x to phpBB 3.0 or 3.1 Beta versions
    • +
    • phpBB 3.0 or 3.1 Beta installations

    We give support for the following installation types:

      -
    • Updates from phpBB3 RC1 to the latest version
    • +
    • Updates from phpBB 3.0 RC1 and 3.1 RC1 to the latest version
    • +
    • Note: if using the Automatic Update Package, updates are supported from phpBB 3.0.2 onward. To update a pre-3.0.2 installation, first update to 3.0.2 and then update to the current version.
    • Conversions from phpBB 2.0.x to the latest version
    • -
    • New installations of phpBB3 - always only the latest released version
    • +
    • New installations of phpBB 3.0.x - always only the latest released version
    • +
    • New installations of phpBB 3.1.x - always only the latest released version
    @@ -129,13 +132,13 @@

    This is the official location for all supported language sets. If you download a package from a 3rd party site you do so with the understanding that we cannot offer support. So please, do not ask for help in these cases!

    -

    Installation of these packages is straightforward, simply download the required language pack and unarchive it into the languages/ folder. Please ensure you retain the directory structure when doing this! Once uploaded go to the Admin->System->Language Packs and install the now appeared new language pack. To install the style imageset you should download the imageset for your language and unarchive the file/s into the relevant imageset directory (styles/prosilver/imageset or styles/subsilver2/imageset), again you must retain the directory structure. Once installed the imageset will become immediately available.

    +

    Installation of these packages is straightforward, simply download the required language pack and unarchive it into the languages/ folder. Please ensure you retain the directory structure when doing this! Once uploaded go to the Admin->System->Language Packs and install the now appearing new language pack. To install the style imageset you should download the imageset for your language and unarchive the file/s into the relevant imageset directory (styles/prosilver/imageset or styles/subsilver2/imageset), again you must retain the directory structure. Once installed the imageset will become immediately available.

    If your language is not available please visit our forums where you will find a topic listing translations currently available or in preparation. This topic also gives you information should you wish to volunteer to translate a language not currently listed.

    2.ii. Styles

    -

    Although phpBB Group are rather proud of the included styles we realise that it may not be to everyones tastes. Therefore phpBB3 allows styles to be switched with relative ease. Firstly you need to locate and download a style you like. We maintain such a site at

    +

    Although phpBB Group are rather proud of the included styles we realise that they may not be to everyone's tastes. Therefore phpBB3 allows styles to be switched with relative ease. Firstly you need to locate and download a style you like. We maintain such a site at

    http://www.phpbb.com/styles/

    @@ -185,7 +188,7 @@

    phpBB Group maintains a thriving community where a number of people have generously decided to donate their time to help support users. This site can be found at:

    -

    http://www.phpbb.com/

    +

    http://www.phpbb.com/community/

    If you do seek help via our forums please be sure to do a Search before posting. This may well save both you and us time and allow the developer, moderator and support groups to spend more time responding to people with unknown issues and problems. Please also remember that phpBB is an entirely volunteer effort, no one receives any compensation for the time they give, this includes moderators as well as developers. So please be respectful and mindful when awaiting responses.

    @@ -193,6 +196,8 @@

    Another place you may find help is our IRC channel. This operates on the Freenode IRC network, irc.freenode.net and the channel is #phpbb and can be accessed by any good IRC client such as mIRC, XChat, etc. Again, please do not abuse this service and be respectful of other users.

    +

    There are other IRC channels available, please see http://www.phpbb.com/support/irc/ for the complete list.

    + @@ -209,13 +214,13 @@
    -

    This is the third stable release of phpBB. The 3.0.x line is essentially feature frozen, with only point releases seeing fixes for bugs and security issues, though feature alterations and minor feature additions may be done if deemed absolutely required. Our next major release will be phpBB 3.2 and the planning phase has begun (the unstable development version is 3.1). Please do not post questions asking when 3.2 will be available, no release date has been set.

    +

    This is a stable release of phpBB. The 3.1.x line is feature frozen, with point releases principally including fixes for bugs and security issues. Feature alterations and minor feature additions may be done if deemed absolutely required. The next major release will be phpBB 3.2 which is currently under development. Please do not post questions asking when 3.2 will be available, no release date has been set.

    -

    For those interested in the development of phpBB should keep an eye on the community forums to see how things are progressing:

    +

    Those interested in the development of phpBB should keep an eye on the development forums to see how things are progressing:

    http://area51.phpbb.com/phpBB/

    -

    Please note that this forum should NOT be used to obtain support for or ask questions about phpBB 2.0.x or phpBB 3.1.x, the main community forums are the place for this. Any such posts will be locked and go unanswered.

    +

    Please note that this forum should NOT be used to obtain support for phpBB, the main community forums are the place for this.

    @@ -233,31 +238,33 @@
    -

    The phpBB Group uses a bug tracking system to store, list and manage all reported bugs, it can be found at the location listed below. Please DO NOT post bug reports to our forums, they will be locked. In addition please DO NOT use the bug tracker for support requests. Posting such a request will only see you directed to the support forums (while taking time away from working on real bugs).

    +

    The phpBB Group uses a bug tracking system to store, list and manage all reported bugs, it can be found at the location listed below. Please DO NOT post bug reports to our forums. In addition please DO NOT use the bug tracker for support requests. Posting such a request will only see you directed to the support forums (while taking time away from working on real bugs).

    -

    http://tracker.phpbb.com/

    +

    http://tracker.phpbb.com/browse/PHPBB3

    While we very much appreciate receiving bug reports (the more reports the more stable phpBB will be) we ask you carry out a few steps before adding new entries:

      -
    • Firstly determine if your bug is reproduceable, how to determine this depends on the bug in question. Only if the bug is reproduceable it is likely to be a problem with phpBB3 (or in some way connected). If something cannot be reproduced it may turn out to have been your hosting provider working on something, a user doing something silly, etc. Bug reports for non-reproduceable events can slow down our attempts to fix real, reproduceable issues

    • +
    • Firstly determine if your bug is reproduceable, how to determine this depends on the bug in question. Only if the bug is reproduceable it is likely to be a problem with phpBB3 (or in some way connected). If something cannot be reproduced it may turn out to have been your hosting provider working on something, a user doing something silly, etc. Bug reports for non-reproduceable events can slow down our attempts to fix real, reproduceable issues.

    • Next please read or search through the existing bug reports to see if your bug (or one very similar to it) is already listed. If it is please add to that existing bug rather than creating a new duplicate entry (all this does is slow us down).

    • -
    • Check the forums (use search!) to see if people have discussed anything that sounds similar to what you are seeing. However, as noted above please DO NOT post your particular bug to the forum unless it's non-reproduceable or you are sure it's related to something you have done rather phpBB3

    • -
    • If no existing bug exists then please feel free to add it
    • +
    • Check the forums (use search!) to see if people have discussed anything that sounds similar to what you are seeing. However, as noted above please DO NOT post your particular bug to the forum unless it's non-reproduceable or you are sure it's related to something you have done rather phpBB3.

    • +
    • If no existing bug exists then please feel free to add it.

    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:

      -
    • Your server type/version, e.g. Apache 1.3.28, IIS 4, Sambar, etc.
    • -
    • PHP version and mode of operation, e.g. PHP 5.1.1 as a module, PHP 4.4.4 running as CGI, etc.
    • -
    • DB type/version, e.g. MySQL 4.0.1, PostgreSQL 7.3.2, MSSQL Server 2000 SP1, etc.
    • +
    • Your server type/version, e.g. Apache 2.2.3, IIS 7, Sambar, etc.
    • +
    • PHP version and mode of operation, e.g. PHP 5.3.2 as a module, PHP 5.4.0 running as CGI, etc.
    • +
    • DB type/version, e.g. MySQL 5.0.77, PostgreSQL 9.0.6, MSSQL Server 2000 SP1, etc.
    -

    The relevant database type/version is listed within the administration control panel

    +

    The relevant database type/version is listed within the administration control panel.

    Please also be as detailed as you can in your report, if possible list the steps required to duplicate the problem. If you have a patch that fixes the issue, please attach it to the ticket or submit a pull request on GitHub.

    +

    If you create a patch, it is very much appreciated (but not required) if you follow the phpBB coding guidelines. Please note that the coding guidelines are somewhat different between different versions of phpBB. For phpBB 3.1.x the coding guidelines may be found here: http://area51.phpbb.com/docs/31x/coding-guidelines.html

    +

    Once a bug has been submitted you will be emailed any follow up comments added to it. Please if you are requested to supply additional information, do so! It is frustrating for us to receive bug reports, ask for additional information but get nothing. In these cases we have a policy of closing the bug, which may leave a very real problem in place. Obviously we would rather not have this situation arise.

    5.i. Security related bugs

    @@ -306,11 +313,11 @@
    -

    phpBB is no longer supported on PHP4 due to several compatibility issues and we recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.2.0.

    +

    phpBB 3.1.x takes advantage of new features added in PHP 5.3. We recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.3.2.

    Please remember that running any application on a developmental version of PHP can lead to strange/unexpected results which may appear to be bugs in the application (which may not be true). Therefore we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a developmental version of PHP please check any bugs you find on a system running a stable release before submitting.

    -

    This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MSSQL Server 2000, PostgreSQL 7.x, Oracle 8, SQLite and Firebird. Versions of PHP used range from 5.2.0 to 5.3.x without problem.

    +

    This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.

    7.i. Notice on PHP security issues

    From 8bb083eed91f049600ff0db4d8528e7a6c7e5093 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 12 Apr 2012 00:24:09 -0400 Subject: [PATCH 085/255] [ticket/10688] Update install.html for 3.1 and current practices. PHPBB3-10688 --- phpBB/docs/INSTALL.html | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index 9628e4c337..47cf546ee8 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -124,7 +124,7 @@
    -

    phpBB3 has a few requirements which must be met before you are able to install and use it.

    +

    phpBB 3.1.x has a few requirements which must be met before you are able to install and use it.

    • A webserver or web hosting account running on any major Operating System with support for PHP
    • @@ -134,13 +134,17 @@
    • PostgreSQL 7.3+
    • SQLite 2.8.2+
    • Firebird 2.1+
    • -
    • MS SQL Server 2000 or above (directly or via ODBC)
    • +
    • MS SQL Server 2000 or above (directly or via ODBC or the native adapter)
    • Oracle
    -
  • PHP 5.2.0+ with support for the database you intend to use.
  • +
  • PHP 5.3.2+ with support for the database you intend to use.
  • +
  • The following PHP modules are required:
  • +
      +
    • json
    • +
  • getimagesize() function need to be enabled.
  • -
  • These optional presence of the following modules within PHP will provide access to additional features, but they are not required. +
  • Presence of the following modules within PHP will provide access to additional features, but they are not required:
    • zlib Compression support
    • Remote FTP support
    • @@ -151,7 +155,7 @@
    -

    If your server or hosting account does not meet the requirements above we are afraid phpBB3 is not for you.

    +

    If your server or hosting account does not meet the requirements above we are afraid phpBB 3.1.x is not for you.

  • @@ -175,7 +179,7 @@

    All .php, .inc, .sql, .cfg, .html and .txt files should be uploaded in ASCII mode, while all graphics should be uploaded in BINARY mode. If you are unfamiliar with what this means please refer to your FTP client documentation. In most cases this is all handled transparantly by your ftp client but if you encounter problems later you should be sure the files where uploaded correctly as described here.

    -

    phpBB3 comes supplied with english as its standard language. However a number of separate packs for different languages are available. If you are not a native english speaker you may wish to install one or more of these packages before continuing. The installation process below will allow you to select a default language from those available (you can of course change this default at a later stage). For more details of language packs, where to obtain them and how to install them please see the README.

    +

    phpBB3 comes supplied with British English as its standard language. However a number of separate packs for different languages are available. If you are not a native English speaker you may wish to install one or more of these packages before continuing. The installation process below will allow you to select a default language from those available (you can of course change this default at a later stage). For more details of language packs, where to obtain them and how to install them please see the README.

    Once all the files have been uploaded to your site you should point your browser at this location with the addition of install/. For example if your domain name is www.mydomain.tld and you placed phpBB3 in a directory /phpBB3 off your web root you would enter http://www.mydomain.tld/phpBB3/install/ or (alternatively) http://www.mydomain.tld/phpBB3/install/index.php into your browser. When you have done this you should see the phpBB3 Installation screen appear.

    @@ -267,7 +271,7 @@

    This package is meant for those wanting to only replace changed files from a previous version to the latest version. This package normally contains the changed files from up to five previous versions.

    -

    This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have 3.0.9 you should select the phpBB-3.0.9_to_3.0.10.zip/tar.gz file.

    +

    This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have 3.1.0 you should select the phpBB-3.1.0_to_3.1.1.zip/tar.gz file.

    The directory structure has been preserved enabling you (if you wish) to simply upload the contents of the archive to the appropriate location on your server, i.e. simply overwrite the existing files with the new versions. Do not forget that if you have installed any MODs these files will overwrite the originals possibly destroying them in the process. You will need to re-add MODs to any affected file before uploading.

    @@ -279,7 +283,7 @@

    The patch file is one solution for those with many Modifications (MODs) or other changes who do not want to re-add them back to all the changed files if they use the method explained above. To use this you will need command line access to a standard UNIX type patch application. If you do not have access to such an application but still want to use this update approach, we strongly recommend the Automatic update package explained below. It is also the recommended update method.

    -

    A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.9 you need the phpBB-3.0.9_to_3.0.10.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: patch -cl -d [PHPBB DIRECTORY] -p1 < [PATCH NAME] (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.

    +

    A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.1.0 you need the phpBB-3.1.0_to_3.1.1.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: patch -cl -d [PHPBB DIRECTORY] -p1 < [PATCH NAME] (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.

    If you do get failures you should look at using the Changed files only package to replace the files which failed to patch, please note that you will need to manually re-add any Modifications (MODs) to these particular files. Alternatively if you know how you can examine the .rej files to determine what failed where and make manual adjustments to the relevant source.

    From 7a9d9f97ef83b61ce155a09c1e75c90f4c533f3f Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Wed, 11 Apr 2012 23:29:47 +0200 Subject: [PATCH 086/255] [ticket/10784] Do not show ajax overlay unless needed PHPBB3-10784 --- phpBB/adm/style/ajax.js | 12 ++++++++---- phpBB/assets/javascript/core.js | 6 +++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index fd2f7a2122..12541cb057 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -28,7 +28,8 @@ phpbb.add_ajax_callback('forum_down', function() { phpbb.ajaxify({ selector: el.parents('span').siblings('.up').children('a'), - callback: 'forum_up' + callback: 'forum_up', + overlay: false }); } @@ -43,7 +44,8 @@ phpbb.add_ajax_callback('forum_down', function() { phpbb.ajaxify({ selector: tr.prev().find('.down').children('a'), - callback: 'forum_down' + callback: 'forum_down', + overlay: false }); } }); @@ -61,7 +63,8 @@ phpbb.add_ajax_callback('forum_up', function() { phpbb.ajaxify({ selector: el.parents('span').siblings('.down').children('a'), - callback: 'forum_down' + callback: 'forum_down', + overlay: false }); } @@ -76,7 +79,8 @@ phpbb.add_ajax_callback('forum_up', function() { phpbb.ajaxify({ selector: tr.next().find('.up').children('a'), - callback: 'forum_up' + callback: 'forum_up', + overlay: false }); } }); diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index c41edfa145..958b6c9ff6 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -245,6 +245,7 @@ phpbb.ajaxify = function(options) { var elements = $(options.selector), refresh = options.refresh, callback = options.callback, + overlay = (typeof options.overlay !== 'undefined') ? options.overlay : true, is_form = elements.is('form'), event_name = is_form ? 'submit' : 'click'; @@ -382,7 +383,10 @@ phpbb.ajaxify = function(options) { return; } - phpbb.loading_alert(); + if (overlay) + { + phpbb.loading_alert(); + } $.ajax({ url: action, From 8a1d084d6d00500b3ea17a7fd3168ec4f321b31b Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Fri, 13 Apr 2012 04:03:07 +0200 Subject: [PATCH 087/255] [ticket/10783] Correctly add assets_version config var to includejs urls PHPBB3-10783 --- phpBB/includes/style/template.php | 3 +++ phpBB/includes/style/template_filter.php | 10 ++++------ tests/template/template_includejs_test.php | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/phpBB/includes/style/template.php b/phpBB/includes/style/template.php index 3f15355f7a..9d476e74b9 100644 --- a/phpBB/includes/style/template.php +++ b/phpBB/includes/style/template.php @@ -507,6 +507,9 @@ class phpbb_style_template $file = $this->locator->get_first_file_location(array($file), true, true); } + $file .= (strpos($file, '?') === false) ? '?' : '&'; + $file .= 'assets_version=' . $this->config['assets_version']; + // Add HTML code $code = ''; $this->context->append_var('SCRIPTS', $code); diff --git a/phpBB/includes/style/template_filter.php b/phpBB/includes/style/template_filter.php index f9bbcce4b2..6ef9d80a3d 100644 --- a/phpBB/includes/style/template_filter.php +++ b/phpBB/includes/style/template_filter.php @@ -138,7 +138,7 @@ class phpbb_style_template_filter extends php_user_filter /** * Initializer, called on creation. * - * Get the allow_php option, root directory and locator from params, + * Get the allow_php option, root directory and locator from params, * which are passed to stream_filter_append. */ public function onCreate() @@ -882,8 +882,6 @@ class phpbb_style_template_filter extends php_user_filter */ private function compile_tag_include_js($tag_args) { - global $config; - // Process dynamic includes if ($tag_args[0] == '{') { @@ -896,14 +894,14 @@ class phpbb_style_template_filter extends php_user_filter } // Locate file - $filename = $this->locator->get_first_file_location(array($tag_args), false, true) . '?assets_version=' . $config['assets_version']; - + $filename = $this->locator->get_first_file_location(array($tag_args), false, true); + if ($filename === false) { // File does not exist, find it during run time return ' $_template->_js_include(\'' . addslashes($tag_args) . '\', true); '; } - + if (substr($filename, 0, strlen($this->phpbb_root_path)) != $this->phpbb_root_path) { // Absolute path, include as is diff --git a/tests/template/template_includejs_test.php b/tests/template/template_includejs_test.php index fa23837553..632fde61d1 100644 --- a/tests/template/template_includejs_test.php +++ b/tests/template/template_includejs_test.php @@ -14,14 +14,14 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes public function test_includejs_compilation() { // Reset the engine state - $this->setup_engine(); + $this->setup_engine(array('assets_version' => 1)); // Prepare correct result $dir = dirname(__FILE__); $scripts = array( - '', - '', - '' + '', + '', + '' ); // Run test From 875958573cfbda4ea5ae42000bbd40ec9dfa3241 Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Fri, 13 Apr 2012 12:10:49 +0100 Subject: [PATCH 088/255] [ticket/10783] Fixed an HTML error with assets_version. PHPBB3-10783 --- phpBB/styles/prosilver/template/overall_footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 621f7ab0af..5d61f5b580 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -51,7 +51,7 @@ - {SCRIPTS} From f8a5a16d0b8ed23653e1ce261c569fafe0bd6365 Mon Sep 17 00:00:00 2001 From: Rahul R Date: Wed, 11 Apr 2012 06:10:45 +0530 Subject: [PATCH 089/255] [ticket/10777] Split the comment into 2 lines Split the comment into 2 lines each having less than 79 characters. PHPBB3-10777 --- phpBB/viewtopic.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index df6ccc5905..1f167ed722 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -1629,7 +1629,8 @@ else $all_marked_read = true; } -// If there are absolutely no more unread posts in this forum and unread posts shown, we can safely show the #unread link +// If there are absolutely no more unread posts in this forum +// and unread posts shown, we can safely show the #unread link if ($all_marked_read) { if ($post_unread) From 4b6b41a1e5cb3d4ba7c896dfa4d72082aa2f069e Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Apr 2012 16:26:41 +0200 Subject: [PATCH 090/255] [ticket/10605] Add parameter documentation to phpbb_delete_user_pms PHPBB3-10605 --- phpBB/includes/functions_privmsgs.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 14a6d83b2a..00bec11569 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1085,6 +1085,10 @@ function delete_pm($user_id, $msg_ids, $folder_id) /** * Delete all PM(s) for a given user and delete the ones without references +* +* @param int $user_id ID of the user whose private messages we want to delete +* +* @return boolean False if there were no pms found, true otherwise. */ function phpbb_delete_user_pms($user_id) { From 7a4b4c7599f3203664350158e36e666a59ca9de2 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Fri, 13 Apr 2012 16:31:49 +0200 Subject: [PATCH 091/255] [ticket/10094] Purge acm_file cache before phpBB installation. PHPBB3-10094 --- phpBB/install/install_install.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 026fc0d404..08d072c522 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -53,11 +53,13 @@ class install_install extends module function main($mode, $sub) { - global $lang, $template, $language, $phpbb_root_path; + global $lang, $template, $language, $phpbb_root_path, $cache; switch ($sub) { case 'intro': + $cache->purge(); + $this->page_title = $lang['SUB_INTRO']; $template->assign_vars(array( From 3741e99aab94fc903db82c1c4d3d6b1f7b1e2a1a Mon Sep 17 00:00:00 2001 From: Senky Date: Sun, 15 Apr 2012 20:10:51 +0200 Subject: [PATCH 092/255] [ticket/10161] all "e-mail" strings in language files changed to "email" according to Oleg's comment: email is preferred by RFCs and probably the way of the future PHPBB3-10161 --- phpBB/language/en/acp/ban.php | 14 ++--- phpBB/language/en/acp/board.php | 58 +++++++++---------- phpBB/language/en/acp/common.php | 32 +++++----- phpBB/language/en/acp/email.php | 6 +- phpBB/language/en/acp/language.php | 2 +- phpBB/language/en/acp/permissions.php | 2 +- phpBB/language/en/acp/permissions_phpbb.php | 10 ++-- phpBB/language/en/acp/posting.php | 2 +- phpBB/language/en/acp/styles.php | 4 +- phpBB/language/en/acp/users.php | 6 +- phpBB/language/en/common.php | 28 ++++----- phpBB/language/en/email/admin_send_email.txt | 4 +- .../en/email/admin_welcome_inactive.txt | 2 +- .../en/email/coppa_resend_inactive.txt | 2 +- .../en/email/coppa_welcome_inactive.txt | 2 +- phpBB/language/en/email/email_notify.txt | 6 +- phpBB/language/en/email/installed.txt | 2 +- .../language/en/email/profile_send_email.txt | 4 +- .../en/email/user_reactivate_account.txt | 2 +- .../en/email/user_resend_inactive.txt | 2 +- phpBB/language/en/email/user_welcome.txt | 2 +- .../en/email/user_welcome_inactive.txt | 2 +- phpBB/language/en/help_bbcode.php | 2 +- phpBB/language/en/help_faq.php | 12 ++-- phpBB/language/en/install.php | 4 +- phpBB/language/en/mcp.php | 2 +- phpBB/language/en/memberlist.php | 20 +++---- phpBB/language/en/ucp.php | 46 +++++++-------- phpBB/language/en/viewtopic.php | 4 +- 29 files changed, 142 insertions(+), 142 deletions(-) diff --git a/phpBB/language/en/acp/ban.php b/phpBB/language/en/acp/ban.php index 77e8a93f3c..2dc0489030 100644 --- a/phpBB/language/en/acp/ban.php +++ b/phpBB/language/en/acp/ban.php @@ -40,7 +40,7 @@ $lang = array_merge($lang, array( '30_MINS' => '30 minutes', '6_HOURS' => '6 hours', - 'ACP_BAN_EXPLAIN' => 'Here you can control the banning of users by name, IP or e-mail address. These methods prevent a user reaching any part of the board. You can give a short (maximum 3000 characters) reason for the ban if you wish. This will be displayed in the admin log. The duration of a ban can also be specified. If you want the ban to end on a specific date rather than after a set time period select Until -> for the ban length and enter a date in YYYY-MM-DD format.', + 'ACP_BAN_EXPLAIN' => 'Here you can control the banning of users by name, IP or email address. These methods prevent a user reaching any part of the board. You can give a short (maximum 3000 characters) reason for the ban if you wish. This will be displayed in the admin log. The duration of a ban can also be specified. If you want the ban to end on a specific date rather than after a set time period select Until -> for the ban length and enter a date in YYYY-MM-DD format.', 'BAN_EXCLUDE' => 'Exclude from banning', 'BAN_LENGTH' => 'Length of ban', @@ -50,12 +50,12 @@ $lang = array_merge($lang, array( 'BANNED_UNTIL_DATE' => 'until %s', // Example: "until Mon 13.Jul.2009, 14:44" 'BANNED_UNTIL_DURATION' => '%1$s (until %2$s)', // Example: "7 days (until Tue 14.Jul.2009, 14:44)" - 'EMAIL_BAN' => 'Ban one or more e-mail addresses', - 'EMAIL_BAN_EXCLUDE_EXPLAIN' => 'Enable this to exclude the entered e-mail address from all current bans.', - 'EMAIL_BAN_EXPLAIN' => 'To specify more than one e-mail address enter each on a new line. To match partial addresses use * as the wildcard, e.g. *@hotmail.com, *@*.domain.tld, etc.', - 'EMAIL_NO_BANNED' => 'No banned e-mail addresses', - 'EMAIL_UNBAN' => 'Un-ban or un-exclude e-mails', - 'EMAIL_UNBAN_EXPLAIN' => 'You can unban (or un-exclude) multiple e-mail addresses in one go using the appropriate combination of mouse and keyboard for your computer and browser. Excluded e-mail addresses are emphasised.', + 'EMAIL_BAN' => 'Ban one or more email addresses', + 'EMAIL_BAN_EXCLUDE_EXPLAIN' => 'Enable this to exclude the entered email address from all current bans.', + 'EMAIL_BAN_EXPLAIN' => 'To specify more than one email address enter each on a new line. To match partial addresses use * as the wildcard, e.g. *@hotmail.com, *@*.domain.tld, etc.', + 'EMAIL_NO_BANNED' => 'No banned email addresses', + 'EMAIL_UNBAN' => 'Un-ban or un-exclude emails', + 'EMAIL_UNBAN_EXPLAIN' => 'You can unban (or un-exclude) multiple email addresses in one go using the appropriate combination of mouse and keyboard for your computer and browser. Excluded email addresses are emphasised.', 'IP_BAN' => 'Ban one or more IPs', 'IP_BAN_EXCLUDE_EXPLAIN' => 'Enable this to exclude the entered IP from all current bans.', diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php index 0bb99b5449..758ef8ed82 100644 --- a/phpBB/language/en/acp/board.php +++ b/phpBB/language/en/acp/board.php @@ -207,7 +207,7 @@ $lang = array_merge($lang, array( 'ACP_REGISTER_SETTINGS_EXPLAIN' => 'Here you are able to define registration and profile related settings.', 'ACC_ACTIVATION' => 'Account activation', - 'ACC_ACTIVATION_EXPLAIN' => 'This determines whether users have immediate access to the board or if confirmation is required. You can also completely disable new registrations. “Board-wide e-mail” must be enabled in order to use user or admin activation.', + 'ACC_ACTIVATION_EXPLAIN' => 'This determines whether users have immediate access to the board or if confirmation is required. You can also completely disable new registrations. “Board-wide email” must be enabled in order to use user or admin activation.', 'NEW_MEMBER_POST_LIMIT' => 'New member post limit', 'NEW_MEMBER_POST_LIMIT_EXPLAIN' => 'New members are within the Newly Registered Users group until they reach this number of posts. You can use this group to keep them from using the PM system or to review their posts. A value of 0 disables this feature.', 'NEW_MEMBER_GROUP_DEFAULT' => 'Set Newly Registered Users group to default', @@ -216,10 +216,10 @@ $lang = array_merge($lang, array( 'ACC_ADMIN' => 'By admin', 'ACC_DISABLE' => 'Disable registration', 'ACC_NONE' => 'No activation (immediate access)', - 'ACC_USER' => 'By user (e-mail verification)', + 'ACC_USER' => 'By user (email verification)', // 'ACC_USER_ADMIN' => 'User + Admin', - 'ALLOW_EMAIL_REUSE' => 'Allow e-mail address re-use', - 'ALLOW_EMAIL_REUSE_EXPLAIN' => 'Different users can register with the same e-mail address.', + 'ALLOW_EMAIL_REUSE' => 'Allow email address re-use', + 'ALLOW_EMAIL_REUSE_EXPLAIN' => 'Different users can register with the same email address.', 'COPPA' => 'COPPA', 'COPPA_FAX' => 'COPPA fax number', 'COPPA_MAIL' => 'COPPA mailing address', @@ -390,10 +390,10 @@ $lang = array_merge($lang, array( 'LDAP_DN' => 'LDAP base dn', 'LDAP_DN_EXPLAIN' => 'This is the Distinguished Name, locating the user information, e.g. o=My Company,c=US.', - 'LDAP_EMAIL' => 'LDAP e-mail attribute', - 'LDAP_EMAIL_EXPLAIN' => 'Set this to the name of your user entry e-mail attribute (if one exists) in order to automatically set the e-mail address for new users. Leaving this empty results in empty e-mail address for users who log in for the first time.', + 'LDAP_EMAIL' => 'LDAP email attribute', + 'LDAP_EMAIL_EXPLAIN' => 'Set this to the name of your user entry email attribute (if one exists) in order to automatically set the email address for new users. Leaving this empty results in empty email address for users who log in for the first time.', 'LDAP_INCORRECT_USER_PASSWORD' => 'Binding to LDAP server failed with specified user/password.', - 'LDAP_NO_EMAIL' => 'The specified e-mail attribute does not exist.', + 'LDAP_NO_EMAIL' => 'The specified email attribute does not exist.', 'LDAP_NO_IDENTITY' => 'Could not find a login identity for %s.', 'LDAP_PASSWORD' => 'LDAP password', 'LDAP_PASSWORD_EXPLAIN' => 'Leave blank to use anonymous binding, otherwise fill in the password for the above user. Required for Active Directory Servers.
    Warning: This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.', @@ -411,7 +411,7 @@ $lang = array_merge($lang, array( // Server Settings $lang = array_merge($lang, array( - 'ACP_SERVER_SETTINGS_EXPLAIN' => 'Here you define server and domain dependant settings. Please ensure the data you enter is accurate, errors will result in e-mails containing incorrect information. When entering the domain name remember it does include http:// or other protocol term. Only alter the port number if you know your server uses a different value, port 80 is correct in most cases.', + 'ACP_SERVER_SETTINGS_EXPLAIN' => 'Here you define server and domain dependant settings. Please ensure the data you enter is accurate, errors will result in emails containing incorrect information. When entering the domain name remember it does include http:// or other protocol term. Only alter the port number if you know your server uses a different value, port 80 is correct in most cases.', 'ENABLE_GZIP' => 'Enable GZip compression', 'ENABLE_GZIP_EXPLAIN' => 'Generated content will be compressed prior to sending it to the user. This can reduce network traffic but will also increase CPU usage on both server and client side. Requires zlib PHP extension to be loaded.', @@ -454,8 +454,8 @@ $lang = array_merge($lang, array( 'CHECK_DNSBL_EXPLAIN' => 'If enabled the user’s IP address is checked against the following DNSBL services on registration and posting: spamcop.net and www.spamhaus.org. This lookup may take a while, depending on the server’s configuration. If slowdowns are experienced or too many false positives reported it is recommended to disable this check.', 'CLASS_B' => 'A.B', 'CLASS_C' => 'A.B.C', - 'EMAIL_CHECK_MX' => 'Check e-mail domain for valid MX record', - 'EMAIL_CHECK_MX_EXPLAIN' => 'If enabled, the e-mail domain provided on registration and profile changes is checked for a valid MX record.', + 'EMAIL_CHECK_MX' => 'Check email domain for valid MX record', + 'EMAIL_CHECK_MX_EXPLAIN' => 'If enabled, the email domain provided on registration and profile changes is checked for a valid MX record.', 'FORCE_PASS_CHANGE' => 'Force password change', 'FORCE_PASS_CHANGE_EXPLAIN' => 'Require user to change their password after a set number of days. Setting this value to 0 disables this behaviour.', 'FORM_TIME_MAX' => 'Maximum time to submit forms', @@ -492,24 +492,24 @@ $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). If the server requires authentication (and only if it does) enter the necessary username, password and authentication method.', + 'ACP_EMAIL_SETTINGS_EXPLAIN' => 'This information is used when the board sends emails to your users. Please ensure the email 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) email 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 Return-Path and Sender address in e-mails.', - 'BOARD_EMAIL_FORM' => 'Users send e-mail via board', - 'BOARD_EMAIL_FORM_EXPLAIN' => 'Instead of showing the users e-mail address users are able to send e-mails via the board.', - 'BOARD_HIDE_EMAILS' => 'Hide e-mail addresses', - 'BOARD_HIDE_EMAILS_EXPLAIN' => 'This function keeps e-mail addresses completely private.', - 'CONTACT_EMAIL' => 'Contact e-mail address', - 'CONTACT_EMAIL_EXPLAIN' => 'This address will be used whenever a specific contact point is needed, e.g. spam, error output, etc. It will always be used as the From and Reply-To address in e-mails.', - '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 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 e-mails.', - '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', - 'ENABLE_EMAIL_EXPLAIN' => 'If this is set to disabled no e-mails will be sent by the board at all. Note the user and admin account activation settings require this setting to be enabled. If currently using “user” or “admin” activation in the activation settings, disabling this setting will require no activation of new accounts.', + 'ADMIN_EMAIL' => 'Return email address', + 'ADMIN_EMAIL_EXPLAIN' => 'This will be used as the return address on all emails, the technical contact email address. It will always be used as the Return-Path and Sender address in emails.', + 'BOARD_EMAIL_FORM' => 'Users send email via board', + 'BOARD_EMAIL_FORM_EXPLAIN' => 'Instead of showing the users email address users are able to send emails via the board.', + 'BOARD_HIDE_EMAILS' => 'Hide email addresses', + 'BOARD_HIDE_EMAILS_EXPLAIN' => 'This function keeps email addresses completely private.', + 'CONTACT_EMAIL' => 'Contact email address', + 'CONTACT_EMAIL_EXPLAIN' => 'This address will be used whenever a specific contact point is needed, e.g. spam, error output, etc. It will always be used as the From and Reply-To address in emails.', + 'EMAIL_FUNCTION_NAME' => 'Email function name', + 'EMAIL_FUNCTION_NAME_EXPLAIN' => 'The email function used to send mails through PHP.', + 'EMAIL_PACKAGE_SIZE' => 'Email package size', + 'EMAIL_PACKAGE_SIZE_EXPLAIN' => 'This is the number of maximum emails 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' => 'Email signature', + 'EMAIL_SIG_EXPLAIN' => 'This text will be attached to all emails the board sends.', + 'ENABLE_EMAIL' => 'Enable board-wide emails', + 'ENABLE_EMAIL_EXPLAIN' => 'If this is set to disabled no emails will be sent by the board at all. Note the user and admin account activation settings require this setting to be enabled. If currently using “user” or “admin” activation in the activation settings, disabling this setting will require no activation of new accounts.', 'SMTP_AUTH_METHOD' => 'Authentication method for SMTP', 'SMTP_AUTH_METHOD_EXPLAIN' => 'Only used if a username/password is set, ask your provider if you are unsure which method to use.', 'SMTP_CRAM_MD5' => 'CRAM-MD5', @@ -525,8 +525,8 @@ $lang = array_merge($lang, array( 'SMTP_SETTINGS' => 'SMTP settings', 'SMTP_USERNAME' => 'SMTP username', 'SMTP_USERNAME_EXPLAIN' => 'Only enter a username if your SMTP server requires it.', - 'USE_SMTP' => 'Use SMTP server for e-mail', - 'USE_SMTP_EXPLAIN' => 'Select “Yes” if you want or have to send e-mail via a named server instead of the local mail function.', + 'USE_SMTP' => 'Use SMTP server for email', + 'USE_SMTP_EXPLAIN' => 'Select “Yes” if you want or have to send email via a named server instead of the local mail function.', )); // Jabber settings diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php index 6012c59483..dc35969955 100644 --- a/phpBB/language/en/acp/common.php +++ b/phpBB/language/en/acp/common.php @@ -47,7 +47,7 @@ $lang = array_merge($lang, array( 'ACP_BACKUP' => 'Backup', 'ACP_BAN' => 'Banning', - 'ACP_BAN_EMAILS' => 'Ban e-mails', + 'ACP_BAN_EMAILS' => 'Ban emails', 'ACP_BAN_IPS' => 'Ban IPs', 'ACP_BAN_USERNAMES' => 'Ban usernames', 'ACP_BBCODES' => 'BBCodes', @@ -79,7 +79,7 @@ $lang = array_merge($lang, array( 'ACP_DISALLOW' => 'Disallow', 'ACP_DISALLOW_USERNAMES' => 'Disallow usernames', - 'ACP_EMAIL_SETTINGS' => 'E-mail settings', + 'ACP_EMAIL_SETTINGS' => 'Email settings', 'ACP_EXTENSION_GROUPS' => 'Manage extension groups', 'ACP_FORUM_BASED_PERMISSIONS' => 'Forum based permissions', @@ -123,7 +123,7 @@ $lang = array_merge($lang, array( 'ACP_MANAGE_RANKS' => 'Manage ranks', 'ACP_MANAGE_REASONS' => 'Manage report/denial reasons', 'ACP_MANAGE_USERS' => 'Manage users', - 'ACP_MASS_EMAIL' => 'Mass e-mail', + 'ACP_MASS_EMAIL' => 'Mass email', 'ACP_MESSAGES' => 'Messages', 'ACP_MESSAGE_SETTINGS' => 'Private message settings', 'ACP_MODULE_MANAGEMENT' => 'Module management', @@ -265,7 +265,7 @@ $lang = array_merge($lang, array( 'NOTIFY' => 'Notification', 'NO_ADMIN' => 'You are not authorised to administer this board.', - 'NO_EMAILS_DEFINED' => 'No valid e-mail addresses found.', + 'NO_EMAILS_DEFINED' => 'No valid email addresses found.', 'NO_FILES_TO_DELETE' => 'Attachments you selected for deletion do not exist.', 'NO_PASSWORD_SUPPLIED' => 'You need to enter your password to access the Administration Control Panel.', @@ -314,7 +314,7 @@ $lang = array_merge($lang, array( // Logs $lang = array_merge($lang, array( 'ACP_ADMIN_LOGS_EXPLAIN' => 'This lists all the actions carried out by board administrators. You can sort by username, date, IP or action. If you have appropriate permissions you can also clear individual operations or the log as a whole.', - 'ACP_CRITICAL_LOGS_EXPLAIN' => 'This lists the actions carried out by the board itself. This log provides you with information you are able to use for solving specific problems, for example non-delivery of e-mails. You can sort by username, date, IP or action. If you have appropriate permissions you can also clear individual operations or the log as a whole.', + 'ACP_CRITICAL_LOGS_EXPLAIN' => 'This lists the actions carried out by the board itself. This log provides you with information you are able to use for solving specific problems, for example non-delivery of emails. You can sort by username, date, IP or action. If you have appropriate permissions you can also clear individual operations or the log as a whole.', 'ACP_MOD_LOGS_EXPLAIN' => 'This lists all actions done on forums, topics and posts as well as actions carried out on users by moderators, including banning. You can sort by username, date, IP or action. If you have appropriate permissions you can also clear individual operations or the log as a whole.', 'ACP_USERS_LOGS_EXPLAIN' => 'This lists all actions carried out by users or on users (reports, warnings and user notes).', 'ALL_ENTRIES' => 'All entries', @@ -426,8 +426,8 @@ $lang = array_merge($lang, array( 'INACTIVE_REASON_REMIND' => 'Forced user account reactivation', 'INACTIVE_REASON_UNKNOWN' => 'Unknown', 'INACTIVE_USERS' => 'Inactive users', - 'INACTIVE_USERS_EXPLAIN' => 'This is a list of users who have registered but whose accounts are inactive. You can activate, delete or remind (by sending an e-mail) these users if you wish.', - 'INACTIVE_USERS_EXPLAIN_INDEX' => 'This is a list of the last 10 registered users who have inactive accounts. Accounts are inactive either because account activation was enabled in user registration settings and these users’ accounts have not yet been activated, or because these accounts have been deactivated. A full list is available by following the link below from where you can activate, delete or remind (by sending an e-mail) these users if you wish.', + 'INACTIVE_USERS_EXPLAIN' => 'This is a list of users who have registered but whose accounts are inactive. You can activate, delete or remind (by sending an email) these users if you wish.', + 'INACTIVE_USERS_EXPLAIN_INDEX' => 'This is a list of the last 10 registered users who have inactive accounts. Accounts are inactive either because account activation was enabled in user registration settings and these users’ accounts have not yet been activated, or because these accounts have been deactivated. A full list is available by following the link below from where you can activate, delete or remind (by sending an email) these users if you wish.', 'NO_INACTIVE_USERS' => 'No inactive users', @@ -497,13 +497,13 @@ $lang = array_merge($lang, array( 'LOG_BAN_EXCLUDE_USER' => 'Excluded user from ban for reason “%1$s”
    » %2$s', 'LOG_BAN_EXCLUDE_IP' => 'Excluded IP from ban for reason “%1$s”
    » %2$s', - 'LOG_BAN_EXCLUDE_EMAIL' => 'Excluded e-mail from ban for reason “%1$s”
    » %2$s', + 'LOG_BAN_EXCLUDE_EMAIL' => 'Excluded email from ban for reason “%1$s”
    » %2$s', 'LOG_BAN_USER' => 'Banned user for reason “%1$s”
    » %2$s', 'LOG_BAN_IP' => 'Banned IP for reason “%1$s”
    » %2$s', - 'LOG_BAN_EMAIL' => 'Banned e-mail for reason “%1$s”
    » %2$s', + 'LOG_BAN_EMAIL' => 'Banned email for reason “%1$s”
    » %2$s', 'LOG_UNBAN_USER' => 'Unbanned user
    » %s', 'LOG_UNBAN_IP' => 'Unbanned IP
    » %s', - 'LOG_UNBAN_EMAIL' => 'Unbanned e-mail
    » %s', + 'LOG_UNBAN_EMAIL' => 'Unbanned email
    » %s', 'LOG_BBCODE_ADD' => 'Added new BBCode
    » %s', 'LOG_BBCODE_EDIT' => 'Edited BBCode
    » %s', @@ -523,7 +523,7 @@ $lang = array_merge($lang, array( 'LOG_CONFIG_AUTH' => 'Altered authentication settings', 'LOG_CONFIG_AVATAR' => 'Altered avatar settings', 'LOG_CONFIG_COOKIE' => 'Altered cookie settings', - 'LOG_CONFIG_EMAIL' => 'Altered e-mail settings', + 'LOG_CONFIG_EMAIL' => 'Altered email settings', 'LOG_CONFIG_FEATURES' => 'Altered board features', 'LOG_CONFIG_LOAD' => 'Altered load settings', 'LOG_CONFIG_MESSAGE' => 'Altered private message settings', @@ -576,7 +576,7 @@ $lang = array_merge($lang, array( 'LOG_DOWNLOAD_REMOVE_IP' => 'Removed IP/hostname from download list
    » %s', 'LOG_ERROR_JABBER' => 'Jabber error
    » %s', - 'LOG_ERROR_EMAIL' => 'E-mail error
    » %s', + 'LOG_ERROR_EMAIL' => 'Email error
    » %s', 'LOG_FORUM_ADD' => 'Created new forum
    » %s', 'LOG_FORUM_COPIED_PERMISSIONS' => 'Copied forum permissions from %1$s
    » %2$s', @@ -612,7 +612,7 @@ $lang = array_merge($lang, array( 'LOG_INACTIVE_ACTIVATE' => 'Activated inactive users
    » %s', 'LOG_INACTIVE_DELETE' => 'Deleted inactive users
    » %s', - 'LOG_INACTIVE_REMIND' => 'Sent reminder e-mails to inactive users
    » %s', + 'LOG_INACTIVE_REMIND' => 'Sent reminder emails to inactive users
    » %s', 'LOG_INSTALL_CONVERTED' => 'Converted from %1$s to phpBB %2$s', 'LOG_INSTALL_INSTALLED' => 'Installed phpBB %s', @@ -629,7 +629,7 @@ $lang = array_merge($lang, array( 'LOG_LANGUAGE_FILE_REPLACED' => 'Replaced language file
    » %s', 'LOG_LANGUAGE_FILE_SUBMITTED' => 'Submitted language file and placed in store folder
    » %s', - 'LOG_MASS_EMAIL' => 'Sent mass e-mail
    » %s', + 'LOG_MASS_EMAIL' => 'Sent mass email
    » %s', 'LOG_MCP_CHANGE_POSTER' => 'Changed poster in topic “%1$s”
    » from %2$s to %3$s', @@ -723,7 +723,7 @@ $lang = array_merge($lang, array( 'LOG_USER_ACTIVE' => 'User activated
    » %s', 'LOG_USER_BAN_USER' => 'Banned User via user management for reason “%1$s”
    » %2$s', 'LOG_USER_BAN_IP' => 'Banned IP via user management for reason “%1$s”
    » %2$s', - 'LOG_USER_BAN_EMAIL' => 'Banned e-mail via user management for reason “%1$s”
    » %2$s', + 'LOG_USER_BAN_EMAIL' => 'Banned email via user management for reason “%1$s”
    » %2$s', 'LOG_USER_DELETED' => 'Deleted user
    » %s', 'LOG_USER_DEL_ATTACH' => 'Removed all attachments made by the user
    » %s', 'LOG_USER_DEL_AVATAR' => 'Removed user avatar
    » %s', @@ -736,7 +736,7 @@ $lang = array_merge($lang, array( 'LOG_USER_REACTIVATE' => 'Forced user account reactivation
    » %s', 'LOG_USER_REMOVED_NR' => 'Removed newly registered flag from user
    » %s', - 'LOG_USER_UPDATE_EMAIL' => 'User “%1$s” changed e-mail
    » from “%2$s” to “%3$s”', + 'LOG_USER_UPDATE_EMAIL' => 'User “%1$s” changed email
    » from “%2$s” to “%3$s”', 'LOG_USER_UPDATE_NAME' => 'Changed username
    » from “%1$s” to “%2$s”', 'LOG_USER_USER_UPDATE' => 'Updated user details
    » %s', diff --git a/phpBB/language/en/acp/email.php b/phpBB/language/en/acp/email.php index c39b8743e7..aacb35b9bb 100644 --- a/phpBB/language/en/acp/email.php +++ b/phpBB/language/en/acp/email.php @@ -36,12 +36,12 @@ if (empty($lang) || !is_array($lang)) // Email settings $lang = array_merge($lang, array( - 'ACP_MASS_EMAIL_EXPLAIN' => 'Here you can e-mail a message to either all of your users or all users of a specific group having the option to receive mass e-mails enabled. To achieve this an e-mail will be sent out to the administrative e-mail address supplied, with a blind carbon copy sent to all recipients. The default setting is to only include 50 recipients in such an e-mail, for more recipients more e-mails will be sent. If you are emailing a large group of people please be patient after submitting and do not stop the page halfway through. It is normal for a mass emailing to take a long time, you will be notified when the script has completed.', + 'ACP_MASS_EMAIL_EXPLAIN' => 'Here you can email a message to either all of your users or all users of a specific group having the option to receive mass emails enabled. To achieve this an email will be sent out to the administrative email address supplied, with a blind carbon copy sent to all recipients. The default setting is to only include 50 recipients in such an email, for more recipients more emails will be sent. If you are emailing a large group of people please be patient after submitting and do not stop the page halfway through. It is normal for a mass emailing to take a long time, you will be notified when the script has completed.', 'ALL_USERS' => 'All users', 'COMPOSE' => 'Compose', - 'EMAIL_SEND_ERROR' => 'There were one or more errors while sending the e-mail. Please check the %sError log%s for detailed error messages.', + 'EMAIL_SEND_ERROR' => 'There were one or more errors while sending the email. Please check the %sError log%s for detailed error messages.', 'EMAIL_SENT' => 'This message has been sent.', 'EMAIL_SENT_QUEUE' => 'This message has been queued for sending.', @@ -53,7 +53,7 @@ $lang = array_merge($lang, array( 'SEND_TO_USERS_EXPLAIN' => 'Entering names here will override any group selected above. Enter each username on a new line.', 'MAIL_BANNED' => 'Mail banned users', - 'MAIL_BANNED_EXPLAIN' => 'When sending a mass e-mail to a group you can select here whether banned users will also receive the e-mail.', + 'MAIL_BANNED_EXPLAIN' => 'When sending a mass email to a group you can select here whether banned users will also receive the email.', 'MAIL_HIGH_PRIORITY' => 'High', 'MAIL_LOW_PRIORITY' => 'Low', 'MAIL_NORMAL_PRIORITY' => 'Normal', diff --git a/phpBB/language/en/acp/language.php b/phpBB/language/en/acp/language.php index 6bac0a815b..154551bd6e 100644 --- a/phpBB/language/en/acp/language.php +++ b/phpBB/language/en/acp/language.php @@ -38,7 +38,7 @@ $lang = array_merge($lang, array( 'ACP_FILES' => 'Admin language files', 'ACP_LANGUAGE_PACKS_EXPLAIN' => 'Here you are able to install/remove language packs. The default language pack is marked with an asterisk (*).', - 'EMAIL_FILES' => 'E-mail templates', + 'EMAIL_FILES' => 'Email templates', 'FILE_CONTENTS' => 'File contents', 'FILE_FROM_STORAGE' => 'File from storage folder', diff --git a/phpBB/language/en/acp/permissions.php b/phpBB/language/en/acp/permissions.php index 2a8d857197..cf5ad33bab 100644 --- a/phpBB/language/en/acp/permissions.php +++ b/phpBB/language/en/acp/permissions.php @@ -202,7 +202,7 @@ $lang = array_merge($lang, array( 'ROLE_DESCRIPTION_MOD_SIMPLE' => 'Can only use basic topic actions. Cannot send warnings or use moderation queue.', 'ROLE_DESCRIPTION_MOD_STANDARD' => 'Can use most moderating tools, but cannot ban users or change the post author.', 'ROLE_DESCRIPTION_USER_FULL' => 'Can use all available forum features for users, including changing the user name or ignoring the flood limit.
    Not recommended.', - 'ROLE_DESCRIPTION_USER_LIMITED' => 'Can access some of the user features. Attachments, e-mails, or instant messages are not allowed.', + 'ROLE_DESCRIPTION_USER_LIMITED' => 'Can access some of the user features. Attachments, emails, or instant messages are not allowed.', 'ROLE_DESCRIPTION_USER_NOAVATAR' => 'Has a limited feature set and is not allowed to use the Avatar feature.', 'ROLE_DESCRIPTION_USER_NOPM' => 'Has a limited feature set, and is not allowed to use Private Messages.', 'ROLE_DESCRIPTION_USER_STANDARD' => 'Can access most but not all user features. Cannot change user name or ignore the flood limit, for instance.', diff --git a/phpBB/language/en/acp/permissions_phpbb.php b/phpBB/language/en/acp/permissions_phpbb.php index f8cb35ed6a..17649693fa 100644 --- a/phpBB/language/en/acp/permissions_phpbb.php +++ b/phpBB/language/en/acp/permissions_phpbb.php @@ -99,7 +99,7 @@ $lang = array_merge($lang, array( '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'), + 'acl_u_chgemail' => array('lang' => 'Can change email address', 'cat' => 'profile'), 'acl_u_chgavatar' => array('lang' => 'Can change avatar', 'cat' => 'profile'), 'acl_u_chggrp' => array('lang' => 'Can change default usergroup', 'cat' => 'profile'), @@ -116,7 +116,7 @@ $lang = array_merge($lang, array( 'acl_u_pm_edit' => array('lang' => 'Can edit own private messages', 'cat' => 'pm'), 'acl_u_pm_delete' => array('lang' => 'Can remove private messages from own folder', 'cat' => 'pm'), 'acl_u_pm_forward' => array('lang' => 'Can forward private messages', 'cat' => 'pm'), - 'acl_u_pm_emailpm' => array('lang' => 'Can e-mail private messages', 'cat' => 'pm'), + 'acl_u_pm_emailpm' => array('lang' => 'Can email private messages', 'cat' => 'pm'), 'acl_u_pm_printpm' => array('lang' => 'Can print private messages', 'cat' => 'pm'), 'acl_u_pm_attach' => array('lang' => 'Can attach files in private messages', 'cat' => 'pm'), 'acl_u_pm_download' => array('lang' => 'Can download files in private messages', 'cat' => 'pm'), @@ -125,7 +125,7 @@ $lang = array_merge($lang, array( 'acl_u_pm_img' => array('lang' => 'Can use [img] BBCode tag in private messages', 'cat' => 'pm'), 'acl_u_pm_flash' => array('lang' => 'Can use [flash] BBCode tag in private messages', 'cat' => 'pm'), - 'acl_u_sendemail' => array('lang' => 'Can send e-mails', 'cat' => 'misc'), + 'acl_u_sendemail' => array('lang' => 'Can send emails', 'cat' => 'misc'), 'acl_u_sendim' => array('lang' => 'Can send instant messages', 'cat' => 'misc'), 'acl_u_ignoreflood' => array('lang' => 'Can ignore flood limit', 'cat' => 'misc'), 'acl_u_hideonline' => array('lang' => 'Can hide online status', 'cat' => 'misc'), @@ -162,7 +162,7 @@ $lang = array_merge($lang, array( 'acl_f_report' => array('lang' => 'Can report posts', 'cat' => 'actions'), 'acl_f_subscribe' => array('lang' => 'Can subscribe forum', 'cat' => 'actions'), 'acl_f_print' => array('lang' => 'Can print topics', 'cat' => 'actions'), - 'acl_f_email' => array('lang' => 'Can e-mail topics', 'cat' => 'actions'), + 'acl_f_email' => array('lang' => 'Can email topics', 'cat' => 'actions'), 'acl_f_search' => array('lang' => 'Can search the forum', 'cat' => 'misc'), 'acl_f_ignoreflood' => array('lang' => 'Can ignore flood limit', 'cat' => 'misc'), @@ -230,7 +230,7 @@ $lang = array_merge($lang, array( 'acl_a_clearlogs' => array('lang' => 'Can clear logs', 'cat' => 'misc'), 'acl_a_modules' => array('lang' => 'Can manage modules', 'cat' => 'misc'), 'acl_a_language' => array('lang' => 'Can manage language packs', 'cat' => 'misc'), - 'acl_a_email' => array('lang' => 'Can send mass e-mail', 'cat' => 'misc'), + 'acl_a_email' => array('lang' => 'Can send mass email', 'cat' => 'misc'), 'acl_a_bots' => array('lang' => 'Can manage bots', 'cat' => 'misc'), 'acl_a_reasons' => array('lang' => 'Can manage report/denial reasons', 'cat' => 'misc'), 'acl_a_backup' => array('lang' => 'Can backup/restore database', 'cat' => 'misc'), diff --git a/phpBB/language/en/acp/posting.php b/phpBB/language/en/acp/posting.php index 76d4869990..89e171744f 100644 --- a/phpBB/language/en/acp/posting.php +++ b/phpBB/language/en/acp/posting.php @@ -81,7 +81,7 @@ $lang = array_merge($lang, array( 'INTTEXT' => 'Unicode letter characters, numbers, spaces, commas, dots, minus, plus, hyphen, underscore and whitespaces.', 'IDENTIFIER' => 'Characters from the latin alphabet (A-Z), numbers, hyphen and underscore', 'NUMBER' => 'Any series of digits', - 'EMAIL' => 'A valid e-mail address', + 'EMAIL' => 'A valid email 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.', '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 #FF1234 or a CSS colour keyword such as fuchsia or InactiveBorder' diff --git a/phpBB/language/en/acp/styles.php b/phpBB/language/en/acp/styles.php index f5bab1d76f..e7954ff148 100644 --- a/phpBB/language/en/acp/styles.php +++ b/phpBB/language/en/acp/styles.php @@ -183,7 +183,7 @@ $lang = array_merge($lang, array( 'IMG_ICON_BACK_TOP' => 'Top', 'IMG_ICON_CONTACT_AIM' => 'AIM', - 'IMG_ICON_CONTACT_EMAIL' => 'Send e-mail', + 'IMG_ICON_CONTACT_EMAIL' => 'Send email', 'IMG_ICON_CONTACT_ICQ' => 'ICQ', 'IMG_ICON_CONTACT_JABBER' => 'Jabber', 'IMG_ICON_CONTACT_MSNM' => 'WLM', @@ -255,7 +255,7 @@ $lang = array_merge($lang, array( 'NO_UNIT' => 'None', 'ONLY_STYLE' => 'This is the only remaining style, you cannot delete it.', - + 'PARENT_STYLE_NOT_FOUND' => 'Parent style was not found. This style may not work correctly. Please uninstall it.', 'PURGED_CACHE' => 'Cache was purged.', diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php index 852f68bcd7..4496fdba7c 100644 --- a/phpBB/language/en/acp/users.php +++ b/phpBB/language/en/acp/users.php @@ -54,7 +54,7 @@ $lang = array_merge($lang, array( 'CANNOT_REMOVE_YOURSELF' => 'You are not allowed to remove your own user account.', 'CANNOT_SET_FOUNDER_IGNORED' => 'You are not able to promote ignored users to be founders.', 'CANNOT_SET_FOUNDER_INACTIVE' => 'You need to activate users before you promote them to founders, only activated users are able to be promoted.', - 'CONFIRM_EMAIL_EXPLAIN' => 'You only need to specify this if you are changing the users e-mail address.', + 'CONFIRM_EMAIL_EXPLAIN' => 'You only need to specify this if you are changing the users email address.', 'DELETE_POSTS' => 'Delete posts', 'DELETE_USER' => 'Delete user', @@ -93,8 +93,8 @@ $lang = array_merge($lang, array( 'USER_ADMIN_ACTIVATE' => 'Activate account', 'USER_ADMIN_ACTIVATED' => 'User activated successfully.', 'USER_ADMIN_AVATAR_REMOVED' => 'Successfully removed avatar from user account.', - 'USER_ADMIN_BAN_EMAIL' => 'Ban by e-mail', - 'USER_ADMIN_BAN_EMAIL_REASON' => 'E-mail address banned via user management', + 'USER_ADMIN_BAN_EMAIL' => 'Ban by email', + 'USER_ADMIN_BAN_EMAIL_REASON' => 'Email address banned via user management', 'USER_ADMIN_BAN_IP' => 'Ban by IP', 'USER_ADMIN_BAN_IP_REASON' => 'IP banned via user management', 'USER_ADMIN_BAN_NAME_REASON' => 'Username banned via user management', diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 12f8edad9e..75717e1807 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -101,7 +101,7 @@ $lang = array_merge($lang, array( 'BACK_TO_TOP' => 'Top', 'BACK_TO_PREV' => 'Back to previous page', - 'BAN_TRIGGERED_BY_EMAIL'=> 'A ban has been issued on your e-mail address.', + 'BAN_TRIGGERED_BY_EMAIL'=> 'A ban has been issued on your email address.', 'BAN_TRIGGERED_BY_IP' => 'A ban has been issued on your IP address.', 'BAN_TRIGGERED_BY_USER' => 'A ban has been issued on your username.', 'BBCODE_GUIDE' => 'BBCode guide', @@ -169,9 +169,9 @@ $lang = array_merge($lang, array( ), 'EDIT_POST' => 'Edit post', - 'EMAIL' => 'E-mail', // Short form for EMAIL_ADDRESS - 'EMAIL_ADDRESS' => 'E-mail address', - 'EMAIL_SMTP_ERROR_RESPONSE' => 'Ran into problems sending e-mail at Line %1$s. Response: %2$s.', + 'EMAIL' => 'Email', // Short form for EMAIL_ADDRESS + 'EMAIL_ADDRESS' => 'Email address', + 'EMAIL_SMTP_ERROR_RESPONSE' => 'Ran into problems sending email at Line %1$s. Response: %2$s.', 'EMPTY_SUBJECT' => 'You must specify a subject when posting a new topic.', 'EMPTY_MESSAGE_SUBJECT' => 'You must specify a subject when composing a new message.', 'ENABLED' => 'Enabled', @@ -296,7 +296,7 @@ $lang = array_merge($lang, array( 'INFORMATION' => 'Information', 'INTERESTS' => 'Interests', 'INVALID_DIGEST_CHALLENGE' => 'Invalid digest challenge.', - 'INVALID_EMAIL_LOG' => '%s possibly an invalid e-mail address?', + 'INVALID_EMAIL_LOG' => '%s possibly an invalid email address?', 'INVALID_PLURAL_RULE' => 'The chosen plural rule is invalid. Valid values are integers between 0 and 15.', 'IP' => 'IP', 'IP_BLACKLISTED' => 'Your IP %1$s has been blocked because it is blacklisted. For details please see %2$s.', @@ -391,9 +391,9 @@ $lang = array_merge($lang, array( 'NO_AUTH_OPERATION' => 'You do not have the necessary permissions to complete this operation.', 'NO_CONNECT_TO_SMTP_HOST' => 'Could not connect to smtp host : %1$s : %2$s', 'NO_BIRTHDAYS' => 'No birthdays today', - 'NO_EMAIL_MESSAGE' => 'E-mail message was blank.', + 'NO_EMAIL_MESSAGE' => 'Email message was blank.', 'NO_EMAIL_RESPONSE_CODE' => 'Could not get mail server response codes.', - 'NO_EMAIL_SUBJECT' => 'No e-mail subject specified.', + 'NO_EMAIL_SUBJECT' => 'No email subject specified.', 'NO_FORUM' => 'The forum you selected does not exist.', 'NO_FORUMS' => 'This board has no forums.', 'NO_GROUP' => 'The requested usergroup does not exist.', @@ -521,7 +521,7 @@ $lang = array_merge($lang, array( 'REPORT_BY' => 'Report by', 'REPORT_POST' => 'Report this post', 'REPORTING_POST' => 'Reporting post', - 'RESEND_ACTIVATION' => 'Resend activation e-mail', + 'RESEND_ACTIVATION' => 'Resend activation email', 'RESET' => 'Reset', 'RESTORE_PERMISSIONS' => 'Restore permissions', 'RETURN_INDEX' => '%sReturn to the index page%s', @@ -571,8 +571,8 @@ $lang = array_merge($lang, array( 'SELECT_ALL_CODE' => 'Select all', 'SELECT_DESTINATION_FORUM' => 'Please select a destination forum', 'SELECT_FORUM' => 'Select a forum', - 'SEND_EMAIL' => 'E-mail', // Used for submit buttons - 'SEND_EMAIL_USER' => 'E-mail', // Used as: {L_SEND_EMAIL_USER} {USERNAME} -> E-mail UserX + 'SEND_EMAIL' => 'Email', // Used for submit buttons + 'SEND_EMAIL_USER' => 'Email', // Used as: {L_SEND_EMAIL_USER} {USERNAME} -> Email UserX 'SEND_PRIVATE_MESSAGE' => 'Send private message', 'SETTINGS' => 'Settings', 'SIGNATURE' => 'Signature', @@ -604,7 +604,7 @@ $lang = array_merge($lang, array( 'THE_TEAM' => 'The team', 'TIME' => 'Time', 'TIMEOUT_PROCESSING_REQ' => 'Request timed out.', - + 'TOO_LARGE' => 'The value you entered is too large.', 'TOO_LARGE_MAX_RECIPIENTS' => 'The value of Maximum number of allowed recipients per private message setting you entered is too large.', @@ -623,7 +623,7 @@ $lang = array_merge($lang, array( 'TOO_LONG_PASSWORD_CONFIRM' => 'The password confirmation you entered is too long.', 'TOO_LONG_USER_PASSWORD' => 'The password you entered is too long.', 'TOO_LONG_USERNAME' => 'The username you entered is too long.', - 'TOO_LONG_EMAIL' => 'The e-mail address you entered is too long.', + 'TOO_LONG_EMAIL' => 'The email address you entered is too long.', 'TOO_LONG_WEBSITE' => 'The website address you entered is too long.', 'TOO_LONG_YIM' => 'The Yahoo! Messenger name you entered is too long.', @@ -644,10 +644,10 @@ $lang = array_merge($lang, array( 'TOO_SHORT_PASSWORD_CONFIRM' => 'The password confirmation you entered is too short.', 'TOO_SHORT_USER_PASSWORD' => 'The password you entered is too short.', 'TOO_SHORT_USERNAME' => 'The username you entered is too short.', - 'TOO_SHORT_EMAIL' => 'The e-mail address you entered is too short.', + 'TOO_SHORT_EMAIL' => 'The email address you entered is too short.', 'TOO_SHORT_WEBSITE' => 'The website address you entered is too short.', 'TOO_SHORT_YIM' => 'The Yahoo! Messenger name you entered is too short.', - + 'TOO_SMALL' => 'The value you entered is too small.', 'TOO_SMALL_MAX_RECIPIENTS' => 'The value of Maximum number of allowed recipients per private message setting you entered is too small.', diff --git a/phpBB/language/en/email/admin_send_email.txt b/phpBB/language/en/email/admin_send_email.txt index 6687404527..b778496258 100644 --- a/phpBB/language/en/email/admin_send_email.txt +++ b/phpBB/language/en/email/admin_send_email.txt @@ -1,9 +1,9 @@ -The following is an e-mail sent to you by an administrator of "{SITENAME}". If this message is spam, contains abusive or other comments you find offensive please contact the webmaster of the board at the following address: +The following is an email sent to you by an administrator of "{SITENAME}". If this message is spam, contains abusive or other comments you find offensive please contact the webmaster of the board at the following address: {CONTACT_EMAIL} -Include this full e-mail (particularly the headers). +Include this full email (particularly the headers). Message sent to you follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/phpBB/language/en/email/admin_welcome_inactive.txt b/phpBB/language/en/email/admin_welcome_inactive.txt index 30b3aae852..8605956318 100644 --- a/phpBB/language/en/email/admin_welcome_inactive.txt +++ b/phpBB/language/en/email/admin_welcome_inactive.txt @@ -2,7 +2,7 @@ Subject: Welcome to "{SITENAME}" {WELCOME_MSG} -Please keep this e-mail for your records. Your account information is as follows: +Please keep this email for your records. Your account information is as follows: ---------------------------- Username: {USERNAME} diff --git a/phpBB/language/en/email/coppa_resend_inactive.txt b/phpBB/language/en/email/coppa_resend_inactive.txt index c3e4af576d..915534a13e 100644 --- a/phpBB/language/en/email/coppa_resend_inactive.txt +++ b/phpBB/language/en/email/coppa_resend_inactive.txt @@ -16,7 +16,7 @@ OR mail it to: Permission to participate at "{SITENAME}" - {U_BOARD} Username: {USERNAME} -E-mail: {EMAIL_ADDRESS} +Email: {EMAIL_ADDRESS} I HAVE REVIEWED THE INFORMATION PROVIDED BY MY CHILD AND HEREBY GRANT PERMISSION TO "{SITENAME}" TO STORE THIS INFORMATION. I UNDERSTAND THIS INFORMATION CAN BE CHANGED AT ANY TIME BY ENTERING A PASSWORD. diff --git a/phpBB/language/en/email/coppa_welcome_inactive.txt b/phpBB/language/en/email/coppa_welcome_inactive.txt index c3e4af576d..915534a13e 100644 --- a/phpBB/language/en/email/coppa_welcome_inactive.txt +++ b/phpBB/language/en/email/coppa_welcome_inactive.txt @@ -16,7 +16,7 @@ OR mail it to: Permission to participate at "{SITENAME}" - {U_BOARD} Username: {USERNAME} -E-mail: {EMAIL_ADDRESS} +Email: {EMAIL_ADDRESS} I HAVE REVIEWED THE INFORMATION PROVIDED BY MY CHILD AND HEREBY GRANT PERMISSION TO "{SITENAME}" TO STORE THIS INFORMATION. I UNDERSTAND THIS INFORMATION CAN BE CHANGED AT ANY TIME BY ENTERING A PASSWORD. diff --git a/phpBB/language/en/email/email_notify.txt b/phpBB/language/en/email/email_notify.txt index 0d0ac7fc28..725b52f0cc 100644 --- a/phpBB/language/en/email/email_notify.txt +++ b/phpBB/language/en/email/email_notify.txt @@ -1,8 +1,8 @@ -Subject: "{SITENAME}" - E-mail a friend +Subject: "{SITENAME}" - Email a friend Hello {TO_USERNAME}, -This e-mail was sent from "{SITENAME}" by {FROM_USERNAME} who thought you may be interested in the following topic: +This email was sent from "{SITENAME}" by {FROM_USERNAME} who thought you may be interested in the following topic: {TOPIC_NAME} @@ -10,7 +10,7 @@ You can find it at: {U_TOPIC} -A message from {FROM_USERNAME} may also be included below. Please note that this message has not been seen or approved by the board administrators. If you wish to complain about having received this e-mail please contact the board administrator at {BOARD_CONTACT}. Please quote the message headers when contacting this address. +A message from {FROM_USERNAME} may also be included below. Please note that this message has not been seen or approved by the board administrators. If you wish to complain about having received this email please contact the board administrator at {BOARD_CONTACT}. Please quote the message headers when contacting this address. ---------- diff --git a/phpBB/language/en/email/installed.txt b/phpBB/language/en/email/installed.txt index 2aa03a7f33..9ec93484e1 100644 --- a/phpBB/language/en/email/installed.txt +++ b/phpBB/language/en/email/installed.txt @@ -4,7 +4,7 @@ Congratulations, You have successfully installed phpBB on your server. -This e-mail contains important information regarding your installation and should be kept for reference. Your password has been securely stored in our database and cannot be retrieved. In the event that it is forgotten, you will be able to reset it using the email address associated with your account. +This email contains important information regarding your installation and should be kept for reference. Your password has been securely stored in our database and cannot be retrieved. In the event that it is forgotten, you will be able to reset it using the email address associated with your account. ---------------------------- Username: {USERNAME} diff --git a/phpBB/language/en/email/profile_send_email.txt b/phpBB/language/en/email/profile_send_email.txt index 9fb19e7eb1..3e63777c9f 100644 --- a/phpBB/language/en/email/profile_send_email.txt +++ b/phpBB/language/en/email/profile_send_email.txt @@ -1,11 +1,11 @@ Hello {TO_USERNAME}, -The following is an e-mail sent to you by {FROM_USERNAME} via your account on "{SITENAME}". If this message is spam, contains abusive or other comments you find offensive please contact the webmaster of the board at the following address: +The following is an email sent to you by {FROM_USERNAME} via your account on "{SITENAME}". If this message is spam, contains abusive or other comments you find offensive please contact the webmaster of the board at the following address: {BOARD_CONTACT} -Include this full e-mail (particularly the headers). Please note that the reply address to this e-mail has been set to that of {FROM_USERNAME}. +Include this full email (particularly the headers). Please note that the reply address to this email has been set to that of {FROM_USERNAME}. Message sent to you follows ~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/phpBB/language/en/email/user_reactivate_account.txt b/phpBB/language/en/email/user_reactivate_account.txt index 4ef7dd899a..7e25018f4d 100644 --- a/phpBB/language/en/email/user_reactivate_account.txt +++ b/phpBB/language/en/email/user_reactivate_account.txt @@ -3,7 +3,7 @@ Subject: Reactivate your account on "{SITENAME}" A board administrator requested that your account be reactivated. Your account is currently inactive. Please follow the steps listed here to reactivate your account. -Please keep this e-mail for your records. Your account information is as follows: +Please keep this email for your records. Your account information is as follows: ---------------------------- Username: {USERNAME} diff --git a/phpBB/language/en/email/user_resend_inactive.txt b/phpBB/language/en/email/user_resend_inactive.txt index 4638d6df63..7879b914b9 100644 --- a/phpBB/language/en/email/user_resend_inactive.txt +++ b/phpBB/language/en/email/user_resend_inactive.txt @@ -2,7 +2,7 @@ Subject: Welcome to "{SITENAME}" {WELCOME_MSG} -Please keep this e-mail for your records. Your account information is as follows: +Please keep this email for your records. Your account information is as follows: ---------------------------- Username: {USERNAME} diff --git a/phpBB/language/en/email/user_welcome.txt b/phpBB/language/en/email/user_welcome.txt index 2648769dfd..aaead86afc 100644 --- a/phpBB/language/en/email/user_welcome.txt +++ b/phpBB/language/en/email/user_welcome.txt @@ -2,7 +2,7 @@ Subject: Welcome to "{SITENAME}" {WELCOME_MSG} -Please keep this e-mail for your records. Your account information is as follows: +Please keep this email for your records. Your account information is as follows: ---------------------------- Username: {USERNAME} diff --git a/phpBB/language/en/email/user_welcome_inactive.txt b/phpBB/language/en/email/user_welcome_inactive.txt index 1b72b1c5a8..5cbb3af3de 100644 --- a/phpBB/language/en/email/user_welcome_inactive.txt +++ b/phpBB/language/en/email/user_welcome_inactive.txt @@ -2,7 +2,7 @@ Subject: Welcome to "{SITENAME}" {WELCOME_MSG} -Please keep this e-mail for your records. Your account information is as follows: +Please keep this email for your records. Your account information is as follows: ---------------------------- Username: {USERNAME} diff --git a/phpBB/language/en/help_bbcode.php b/phpBB/language/en/help_bbcode.php index 7b2672ad94..e0cda9df04 100644 --- a/phpBB/language/en/help_bbcode.php +++ b/phpBB/language/en/help_bbcode.php @@ -88,7 +88,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.
    • The first of these uses the [url=][/url] 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:

      [url=http://www.phpbb.com/]Visit phpBB![/url]

      This would generate the following link, Visit phpBB! Please notice that the link opens in the same window or a new window depending on the users browser preferences.
    • If you want the URL itself displayed as the link you can do this by simply using:

      [url]http://www.phpbb.com/[/url]

      This would generate the following link, http://www.phpbb.com/
    • Additionally, phpBB features something called Magic Links, 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 www.phpbb.com being output when you view the message.
    • The same thing applies equally to e-mail addresses, you can either specify an address explicitly for example:

      [email]no.one@domain.adr[/email]

      which will output no.one@domain.adr or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.
    As with all the BBCode tags you can wrap URLs around any of the other tags such as [img][/img] (see next entry), [b][/b], etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:

    [url=http://www.google.com/][img]http://www.google.com/intl/en_ALL/images/logo.gif[/url][/img]

    is not 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.
    • The first of these uses the [url=][/url] 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:

      [url=http://www.phpbb.com/]Visit phpBB![/url]

      This would generate the following link, Visit phpBB! Please notice that the link opens in the same window or a new window depending on the users browser preferences.
    • If you want the URL itself displayed as the link you can do this by simply using:

      [url]http://www.phpbb.com/[/url]

      This would generate the following link, http://www.phpbb.com/
    • Additionally, phpBB features something called Magic Links, 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 www.phpbb.com being output when you view the message.
    • The same thing applies equally to email addresses, you can either specify an address explicitly for example:

      [email]no.one@domain.adr[/email]

      which will output no.one@domain.adr or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.
    As with all the BBCode tags you can wrap URLs around any of the other tags such as [img][/img] (see next entry), [b][/b], etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:

    [url=http://www.google.com/][img]http://www.google.com/intl/en_ALL/images/logo.gif[/url][/img]

    is not correct which may lead to your post being deleted so take care.' ), array( 0 => '--', diff --git a/phpBB/language/en/help_faq.php b/phpBB/language/en/help_faq.php index b14f155f3a..f21a8d866e 100644 --- a/phpBB/language/en/help_faq.php +++ b/phpBB/language/en/help_faq.php @@ -55,7 +55,7 @@ $help = array( ), array( 0 => 'I registered but cannot login!', - 1 => 'First, check your username and password. If they are correct, then one of two things may have happened. If COPPA support is enabled and you specified being under 13 years old during registration, you will have to follow the instructions you received. Some boards will also require new registrations to be activated, either by yourself or by an administrator before you can logon; this information was present during registration. If you were sent an e-mail, follow the instructions. If you did not receive an e-mail, you may have provided an incorrect e-mail address or the e-mail may have been picked up by a spam filer. If you are sure the e-mail address you provided is correct, try contacting an administrator.' + 1 => 'First, check your username and password. If they are correct, then one of two things may have happened. If COPPA support is enabled and you specified being under 13 years old during registration, you will have to follow the instructions you received. Some boards will also require new registrations to be activated, either by yourself or by an administrator before you can logon; this information was present during registration. If you were sent an email, follow the instructions. If you did not receive an email, you may have provided an incorrect email address or the email may have been picked up by a spam filer. If you are sure the email address you provided is correct, try contacting an administrator.' ), array( 0 => 'I registered in the past but cannot login any more?!', @@ -102,8 +102,8 @@ $help = array( 1 => 'Ranks, which appear below your username, indicate the number of posts you have made or identify certain users, e.g. moderators and administrators. In general, you cannot directly change the wording of any board ranks as they are set by the board administrator. Please do not abuse the board by posting unnecessarily just to increase your rank. Most boards will not tolerate this and the moderator or administrator will simply lower your post count.' ), array( - 0 => 'When I click the e-mail link for a user it asks me to login?', - 1 => 'Only registered users can send e-mail to other users via the built-in e-mail form, and only if the administrator has enabled this feature. This is to prevent malicious use of the e-mail system by anonymous users.' + 0 => 'When I click the email link for a user it asks me to login?', + 1 => 'Only registered users can send email to other users via the built-in email form, and only if the administrator has enabled this feature. This is to prevent malicious use of the email system by anonymous users.' ), array( 0 => '--', @@ -255,8 +255,8 @@ $help = array( 1 => 'You can block a user from sending you private messages by using message rules within your User Control Panel. If you are receiving abusive private messages from a particular user, inform a board administrator; they have the power to prevent a user from sending private messages.' ), array( - 0 => 'I have received a spamming or abusive e-mail from someone on this board!', - 1 => 'We are sorry to hear that. The e-mail form feature of this board includes safeguards to try and track users who send such posts, so e-mail the board administrator with a full copy of the e-mail you received. It is very important that this includes the headers that contain the details of the user that sent the e-mail. The board administrator can then take action.' + 0 => 'I have received a spamming or abusive email from someone on this board!', + 1 => 'We are sorry to hear that. The email form feature of this board includes safeguards to try and track users who send such posts, so email the board administrator with a full copy of the email you received. It is very important that this includes the headers that contain the details of the user that sent the email. The board administrator can then take action.' ), array( 0 => '--', @@ -336,6 +336,6 @@ $help = array( ), array( 0 => 'Who do I contact about abusive and/or legal matters related to this board?', - 1 => 'Any of the administrators listed on the “The team” page should be an appropriate point of contact for your complaints. If this still gets no response then you should contact the owner of the domain (do a whois lookup) or, if this is running on a free service (e.g. Yahoo!, free.fr, f2s.com, etc.), the management or abuse department of that service. Please note that the phpBB Group has absolutely no jurisdiction and cannot in any way be held liable over how, where or by whom this board is used. Do not contact the phpBB Group in relation to any legal (cease and desist, liable, defamatory comment, etc.) matter not directly related to the phpBB.com website or the discrete software of phpBB itself. If you do e-mail phpBB Group about any third party use of this software then you should expect a terse response or no response at all.' + 1 => 'Any of the administrators listed on the “The team” page should be an appropriate point of contact for your complaints. If this still gets no response then you should contact the owner of the domain (do a whois lookup) or, if this is running on a free service (e.g. Yahoo!, free.fr, f2s.com, etc.), the management or abuse department of that service. Please note that the phpBB Group has absolutely no jurisdiction and cannot in any way be held liable over how, where or by whom this board is used. Do not contact the phpBB Group in relation to any legal (cease and desist, liable, defamatory comment, etc.) matter not directly related to the phpBB.com website or the discrete software of phpBB itself. If you do email phpBB Group about any third party use of this software then you should expect a terse response or no response at all.' ) ); diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php index ca6045a921..03f2e964ec 100644 --- a/phpBB/language/en/install.php +++ b/phpBB/language/en/install.php @@ -240,8 +240,8 @@ $lang = array_merge($lang, array( 'INST_ERR_DB_NO_FIREBIRD_PS'=> 'The database you selected for Firebird has a page size less than 8192, it must be at least 8192.', 'INST_ERR_DB_NO_POSTGRES' => 'The database you have selected was not created in UNICODE or UTF8 encoding. Try installing with a database in UNICODE or UTF8 encoding.', 'INST_ERR_DB_NO_NAME' => 'No database name specified.', - 'INST_ERR_EMAIL_INVALID' => 'The e-mail address you entered is invalid.', - 'INST_ERR_EMAIL_MISMATCH' => 'The e-mails you entered did not match.', + 'INST_ERR_EMAIL_INVALID' => 'The email address you entered is invalid.', + 'INST_ERR_EMAIL_MISMATCH' => 'The emails you entered did not match.', 'INST_ERR_FATAL' => 'Fatal installation error', 'INST_ERR_FATAL_DB' => 'A fatal and unrecoverable database error has occurred. This may be because the specified user does not have appropriate permissions to CREATE TABLES or INSERT data, etc. Further information may be given below. Please contact your hosting provider in the first instance or the support forums of phpBB for further assistance.', 'INST_ERR_FTP_PATH' => 'Could not change to the given directory, please check the path.', diff --git a/phpBB/language/en/mcp.php b/phpBB/language/en/mcp.php index 3ee619ea16..eaa2d7e3a5 100644 --- a/phpBB/language/en/mcp.php +++ b/phpBB/language/en/mcp.php @@ -144,7 +144,7 @@ $lang = array_merge($lang, array( 'MCP_ADD' => 'Add a warning', 'MCP_BAN' => 'Banning', - 'MCP_BAN_EMAILS' => 'Ban e-mails', + 'MCP_BAN_EMAILS' => 'Ban emails', 'MCP_BAN_IPS' => 'Ban IPs', 'MCP_BAN_USERNAMES' => 'Ban Usernames', diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php index c3ab27871e..cdbedebefc 100644 --- a/phpBB/language/en/memberlist.php +++ b/phpBB/language/en/memberlist.php @@ -46,25 +46,25 @@ $lang = array_merge($lang, array( 'BEFORE' => 'Before', - 'CC_EMAIL' => 'Send a copy of this e-mail to yourself.', + 'CC_EMAIL' => 'Send a copy of this email to yourself.', 'CONTACT_USER' => 'Contact', 'DEST_LANG' => 'Language', 'DEST_LANG_EXPLAIN' => 'Select an appropriate language (if available) for the recipient of this message.', - 'EMAIL_BODY_EXPLAIN' => 'This message will be sent as plain text, do not include any HTML or BBCode. The return address for this message will be set to your e-mail address.', - 'EMAIL_DISABLED' => 'Sorry but all e-mail related functions have been disabled.', - 'EMAIL_SENT' => 'The e-mail has been sent.', - 'EMAIL_TOPIC_EXPLAIN' => 'This message will be sent as plain text, do not include any HTML or BBCode. Please note that the topic information is already included in the message. The return address for this message will be set to your e-mail address.', - 'EMPTY_ADDRESS_EMAIL' => 'You must provide a valid e-mail address for the recipient.', + 'EMAIL_BODY_EXPLAIN' => 'This message will be sent as plain text, do not include any HTML or BBCode. The return address for this message will be set to your email address.', + 'EMAIL_DISABLED' => 'Sorry but all email related functions have been disabled.', + 'EMAIL_SENT' => 'The email has been sent.', + 'EMAIL_TOPIC_EXPLAIN' => 'This message will be sent as plain text, do not include any HTML or BBCode. Please note that the topic information is already included in the message. The return address for this message will be set to your email address.', + 'EMPTY_ADDRESS_EMAIL' => 'You must provide a valid email address for the recipient.', 'EMPTY_MESSAGE_EMAIL' => 'You must enter a message to be emailed.', 'EMPTY_MESSAGE_IM' => 'You must enter a message to be send.', 'EMPTY_NAME_EMAIL' => 'You must enter the real name of the recipient.', - 'EMPTY_SUBJECT_EMAIL' => 'You must specify a subject for the e-mail.', + 'EMPTY_SUBJECT_EMAIL' => 'You must specify a subject for the email.', 'EQUAL_TO' => 'Equal to', 'FIND_USERNAME_EXPLAIN' => 'Use this form to search for specific members. You do not need to fill out all fields. To match partial data use * as a wildcard. When entering dates use the format YYYY-MM-DD, e.g. 2004-02-29. Use the mark checkboxes to select one or more usernames (several usernames may be accepted depending on the form itself) and click the Select Marked button to return to the previous form.', - 'FLOOD_EMAIL_LIMIT' => 'You cannot send another e-mail at this time. Please try again later.', + 'FLOOD_EMAIL_LIMIT' => 'You cannot send another email at this time. Please try again later.', 'GROUP_LEADER' => 'Group leader', @@ -103,7 +103,7 @@ $lang = array_merge($lang, array( 'MORE_THAN' => 'More than', - 'NO_EMAIL' => 'You are not permitted to send e-mail to this user.', + 'NO_EMAIL' => 'You are not permitted to send email to this user.', 'NO_VIEW_USERS' => 'You are not authorised to view the member list or profiles.', 'ORDER' => 'Order', @@ -126,7 +126,7 @@ $lang = array_merge($lang, array( 'SEND_MESSAGE' => 'Message', 'SEND_MSNM_MESSAGE' => 'Send WLM message', 'SEND_YIM_MESSAGE' => 'Send YIM message', - 'SORT_EMAIL' => 'E-mail', + 'SORT_EMAIL' => 'Email', 'SORT_LAST_ACTIVE' => 'Last active', 'SORT_POST_COUNT' => 'Post count', diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index aa1e9c27ce..2212e44628 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -49,9 +49,9 @@ $lang = array_merge($lang, array(
    We may also create cookies external to the phpBB software whilst browsing “%1$s”, though these are outside the scope of this document which is intended to only cover the pages created by the phpBB software. The second way in which we collect your information is by what you submit to us. This can be, and is not limited to: posting as an anonymous user (hereinafter “anonymous posts”), registering on “%1$s” (hereinafter “your account”) and posts submitted by you after registration and whilst logged in (hereinafter “your posts”).

    - Your account will at a bare minimum contain a uniquely identifiable name (hereinafter “your user name”), a personal password used for logging into your account (hereinafter “your password”) and a personal, valid e-mail address (hereinafter “your e-mail”). Your information for your account at “%1$s” is protected by data-protection laws applicable in the country that hosts us. Any information beyond your user name, your password, and your e-mail address required by “%1$s” during the registration process is either mandatory or optional, at the discretion of “%1$s”. In all cases, you have the option of what information in your account is publicly displayed. Furthermore, within your account, you have the option to opt-in or opt-out of automatically generated e-mails from the phpBB software.
    + Your account will at a bare minimum contain a uniquely identifiable name (hereinafter “your user name”), a personal password used for logging into your account (hereinafter “your password”) and a personal, valid email address (hereinafter “your email”). Your information for your account at “%1$s” is protected by data-protection laws applicable in the country that hosts us. Any information beyond your user name, your password, and your email address required by “%1$s” during the registration process is either mandatory or optional, at the discretion of “%1$s”. In all cases, you have the option of what information in your account is publicly displayed. Furthermore, within your account, you have the option to opt-in or opt-out of automatically generated emails from the phpBB software.

    - Your password is ciphered (a one-way hash) so that it is secure. However, it is recommended that you do not reuse the same password across a number of different websites. Your password is the means of accessing your account at “%1$s”, so please guard it carefully and under no circumstance will anyone affiliated with “%1$s”, phpBB or another 3rd party, legitimately ask you for your password. Should you forget your password for your account, you can use the “I forgot my password” feature provided by the phpBB software. This process will ask you to submit your user name and your e-mail, then the phpBB software will generate a new password to reclaim your account.
    + Your password is ciphered (a one-way hash) so that it is secure. However, it is recommended that you do not reuse the same password across a number of different websites. Your password is the means of accessing your account at “%1$s”, so please guard it carefully and under no circumstance will anyone affiliated with “%1$s”, phpBB or another 3rd party, legitimately ask you for your password. Should you forget your password for your account, you can use the “I forgot my password” feature provided by the phpBB software. This process will ask you to submit your user name and your email, then the phpBB software will generate a new password to reclaim your account.
    ', )); @@ -61,13 +61,13 @@ $lang = array_merge($lang, array( 'ACCOUNT_ACTIVE_ADMIN' => 'The account has now been activated.', 'ACCOUNT_ACTIVE_PROFILE' => 'Your account has now been successfully reactivated.', 'ACCOUNT_ADDED' => 'Thank you for registering, your account has been created. You may now login with your username and password.', - 'ACCOUNT_COPPA' => 'Your account has been created but has to be approved, please check your e-mail for details.', - 'ACCOUNT_EMAIL_CHANGED' => 'Your account has been updated. However, this board requires account reactivation on e-mail changes. An activation key has been sent to the new e-mail address you provided. Please check your e-mail for further information.', - 'ACCOUNT_EMAIL_CHANGED_ADMIN' => 'Your account has been updated. However, this board requires account reactivation by the administrators on e-mail changes. An e-mail has been sent to them and you will be informed when your account has been reactivated.', - 'ACCOUNT_INACTIVE' => 'Your account has been created. However, this board requires account activation, an activation key has been sent to the e-mail address you provided. Please check your e-mail for further information.', - 'ACCOUNT_INACTIVE_ADMIN' => 'Your account has been created. However, this board requires account activation by the administrator group. An e-mail has been sent to them and you will be informed when your account has been activated.', - 'ACTIVATION_EMAIL_SENT' => 'The activation e-mail has been sent to your e-mail address.', - 'ACTIVATION_EMAIL_SENT_ADMIN' => 'The activation e-mail has been sent to the administrators e-mail addresses.', + 'ACCOUNT_COPPA' => 'Your account has been created but has to be approved, please check your email for details.', + 'ACCOUNT_EMAIL_CHANGED' => 'Your account has been updated. However, this board requires account reactivation on email changes. An activation key has been sent to the new email address you provided. Please check your email for further information.', + 'ACCOUNT_EMAIL_CHANGED_ADMIN' => 'Your account has been updated. However, this board requires account reactivation by the administrators on email changes. An email has been sent to them and you will be informed when your account has been reactivated.', + 'ACCOUNT_INACTIVE' => 'Your account has been created. However, this board requires account activation, an activation key has been sent to the email address you provided. Please check your email for further information.', + 'ACCOUNT_INACTIVE_ADMIN' => 'Your account has been created. However, this board requires account activation by the administrator group. An email has been sent to them and you will be informed when your account has been activated.', + 'ACTIVATION_EMAIL_SENT' => 'The activation email has been sent to your email address.', + 'ACTIVATION_EMAIL_SENT_ADMIN' => 'The activation email has been sent to the administrators email addresses.', 'ADD' => 'Add', 'ADD_BCC' => 'Add [BCC]', 'ADD_FOES' => 'Add new foes', @@ -79,7 +79,7 @@ $lang = array_merge($lang, array( 'ADD_RULE' => 'Add rule', 'ADD_TO' => 'Add [To]', 'ADD_USERS_UCP_EXPLAIN' => 'Here you can add new users to the group. You may select whether this group becomes the new default for the selected users. Please enter each username on a separate line.', - 'ADMIN_EMAIL' => 'Administrators can e-mail me information', + 'ADMIN_EMAIL' => 'Administrators can email me information', 'AGREE' => 'I agree to these terms', 'ALLOW_PM' => 'Allow users to send you private messages', 'ALLOW_PM_EXPLAIN' => 'Note that administrators and moderators will always be able to send you messages.', @@ -134,7 +134,7 @@ $lang = array_merge($lang, array( 'CREATE_FOLDER' => 'Add folder…', 'CURRENT_IMAGE' => 'Current image', 'CURRENT_PASSWORD' => 'Current password', - 'CURRENT_PASSWORD_EXPLAIN' => 'You must confirm your current password if you wish to change it, alter your e-mail address or username.', + 'CURRENT_PASSWORD_EXPLAIN' => 'You must confirm your current password if you wish to change it, alter your email address or username.', 'CUR_PASSWORD_EMPTY' => 'You did not enter your current password.', 'CUR_PASSWORD_ERROR' => 'The current password you entered is incorrect.', 'CUSTOM_DATEFORMAT' => 'Custom…', @@ -164,17 +164,17 @@ $lang = array_merge($lang, array( 'DEMOTE_SELECTED' => 'Demote selected', 'DISABLE_CENSORS' => 'Enable word censoring', 'DISPLAY_GALLERY' => 'Display gallery', - 'DOMAIN_NO_MX_RECORD_EMAIL' => 'The entered e-mail domain has no valid MX record.', + 'DOMAIN_NO_MX_RECORD_EMAIL' => 'The entered email domain has no valid MX record.', 'DOWNLOADS' => 'Downloads', 'DRAFTS_DELETED' => 'All selected drafts were successfully deleted.', 'DRAFTS_EXPLAIN' => 'Here you can view, edit and delete your saved drafts.', 'DRAFT_UPDATED' => 'Draft successfully updated.', '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 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.', + 'EMAIL_BANNED_EMAIL' => 'The email address you entered is not allowed to be used.', + 'EMAIL_INVALID_EMAIL' => 'The email address you entered is invalid.', + 'EMAIL_REMIND' => 'This must be the email address associated with your account. If you have not changed this via your user control panel then it is the email address you registered your account with.', + 'EMAIL_TAKEN_EMAIL' => 'The entered email 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.', 'EXPORT_AS_XML' => 'Export as XML', @@ -286,7 +286,7 @@ $lang = array_merge($lang, array( 'NEW_PASSWORD_ERROR' => 'The passwords you entered do not match.', 'NOTIFY_METHOD' => 'Notification method', 'NOTIFY_METHOD_BOTH' => 'Both', - 'NOTIFY_METHOD_EMAIL' => 'E-mail only', + 'NOTIFY_METHOD_EMAIL' => 'Email only', 'NOTIFY_METHOD_EXPLAIN' => 'Method for sending messages sent via this board.', 'NOTIFY_METHOD_IM' => 'Jabber only', 'NOTIFY_ON_PM' => 'Notify me on new private messages', @@ -324,7 +324,7 @@ $lang = array_merge($lang, array( '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_EMAIL_USER' => 'The email/username information submitted could not be found.', 'NO_FOES' => 'No foes currently defined', 'NO_FRIENDS' => 'No friends currently defined', 'NO_FRIENDS_OFFLINE' => 'No friends offline', @@ -350,7 +350,7 @@ $lang = array_merge($lang, array( 'PASS_TYPE_SYMBOL_EXPLAIN' => 'Password must be between %1$s and %2$s long, must contain letters in mixed case, must contain numbers and must contain symbols.', 'PASSWORD' => 'Password', 'PASSWORD_ACTIVATED' => 'Your new password has been activated.', - 'PASSWORD_UPDATED' => 'A new password was sent to your registered e-mail address.', + 'PASSWORD_UPDATED' => 'A new password was sent to your registered email address.', 'PERMISSIONS_RESTORED' => 'Successfully restored original permissions.', 'PERMISSIONS_TRANSFERRED' => 'Successfully transferred permissions from %s, you are now able to browse the board with this user’s permissions.
    Please note that admin permissions were not transferred. You are able to revert to your permission set at any time.', 'PM_DISABLED' => 'Private messaging has been disabled on this board.', @@ -408,7 +408,7 @@ $lang = array_merge($lang, array( 'SEARCH_YOUR_POSTS' => 'Show your posts', 'SEND_PASSWORD' => 'Send password', 'SENT_AT' => 'Sent', // Used before dates in private messages - 'SHOW_EMAIL' => 'Users can contact me by e-mail', + 'SHOW_EMAIL' => 'Users can contact me by email', 'SIGNATURE_EXPLAIN' => 'This is a block of text that can be added to posts you make. There is a %d character limit.', 'SIGNATURE_PREVIEW' => 'Your signature will appear like this in posts', 'SIGNATURE_TOO_LONG' => 'Your signature is too long.', @@ -427,12 +427,12 @@ $lang = array_merge($lang, array( 'UCP' => 'User Control Panel', 'UCP_ACTIVATE' => 'Activate account', - 'UCP_ADMIN_ACTIVATE' => 'Please note that you will need to enter a valid e-mail address before your account is activated. The administrator will review your account and if approved you will receive an e-mail at the address you specified.', + 'UCP_ADMIN_ACTIVATE' => 'Please note that you will need to enter a valid email address before your account is activated. The administrator will review your account and if approved you will receive an email at the address you specified.', 'UCP_AIM' => 'AOL Instant Messenger', 'UCP_ATTACHMENTS' => 'Attachments', 'UCP_COPPA_BEFORE' => 'Before %s', 'UCP_COPPA_ON_AFTER' => 'On or after %s', - 'UCP_EMAIL_ACTIVATE' => 'Please note that you will need to enter a valid e-mail address before your account is activated. You will receive an e-mail at the address you provide that contains an account activation link.', + 'UCP_EMAIL_ACTIVATE' => 'Please note that you will need to enter a valid email address before your account is activated. You will receive an email at the address you provide that contains an account activation link.', 'UCP_ICQ' => 'ICQ number', 'UCP_JABBER' => 'Jabber address', @@ -472,7 +472,7 @@ $lang = array_merge($lang, array( 'UCP_REGISTER_DISABLE' => 'Creating a new account is currently not possible.', 'UCP_REMIND' => 'Send password', - 'UCP_RESEND' => 'Send activation e-mail', + 'UCP_RESEND' => 'Send activation email', 'UCP_WELCOME' => 'Welcome to the User Control Panel. From here you can monitor, view and update your profile, preferences, subscribed forums and topics. You can also send messages to other users (if permitted). Please ensure you read any announcements before continuing.', 'UCP_YIM' => 'Yahoo Messenger', 'UCP_ZEBRA' => 'Friends & Foes', diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php index 184f88ed3c..278c064fe7 100644 --- a/phpBB/language/en/viewtopic.php +++ b/phpBB/language/en/viewtopic.php @@ -57,13 +57,13 @@ $lang = array_merge($lang, array( 1 => 'Last edited by %2$s on %3$s, edited %1$d time in total.', 2 => 'Last edited by %2$s on %3$s, edited %1$d times in total.', ), - 'EMAIL_TOPIC' => 'E-mail friend', + 'EMAIL_TOPIC' => 'Email friend', 'ERROR_NO_ATTACHMENT' => 'The selected attachment does not exist anymore.', 'FILE_NOT_FOUND_404' => 'The file %s does not exist.', 'FORK_TOPIC' => 'Copy topic', 'FULL_EDITOR' => 'Full Editor & Preview', - + 'LINKAGE_FORBIDDEN' => 'You are not authorised to view, download or link from/to this site.', 'LOGIN_NOTIFY_TOPIC' => 'You have been notified about this topic, please login to view it.', 'LOGIN_VIEWTOPIC' => 'The board requires you to be registered and logged in to view this topic.', From 249d8ede1261f6736a1d245ad204bc2bca544945 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Mon, 16 Apr 2012 01:24:10 +0530 Subject: [PATCH 093/255] [ticket/10797] user rank is displayed in mcp_warn.php When warning a user in MCP, the user's rank title and image are displayed. language key user rank also added. PHPBB3-10797 --- phpBB/includes/mcp/mcp_warn.php | 4 ++-- phpBB/language/en/mcp.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php index 63e5b19155..1016204ff8 100644 --- a/phpBB/includes/mcp/mcp_warn.php +++ b/phpBB/includes/mcp/mcp_warn.php @@ -308,7 +308,7 @@ class mcp_warn include($phpbb_root_path . 'includes/functions_display.' . $phpEx); } - $rank_title = $rank_img = ''; + get_user_rank($user_row['user_rank'], $user_row['user_posts'], $rank_title, $rank_img, $rank_img_src); $avatar_img = get_user_avatar($user_row['user_avatar'], $user_row['user_avatar_type'], $user_row['user_avatar_width'], $user_row['user_avatar_height']); $template->assign_vars(array( @@ -413,7 +413,7 @@ class mcp_warn include($phpbb_root_path . 'includes/functions_display.' . $phpEx); } - $rank_title = $rank_img = ''; + get_user_rank($user_row['user_rank'], $user_row['user_posts'], $rank_title, $rank_img, $rank_img_src); $avatar_img = get_user_avatar($user_row['user_avatar'], $user_row['user_avatar_type'], $user_row['user_avatar_width'], $user_row['user_avatar_height']); // OK, they didn't submit a warning so lets build the page for them to do so diff --git a/phpBB/language/en/mcp.php b/phpBB/language/en/mcp.php index d0bcec0d9c..16b55b3612 100644 --- a/phpBB/language/en/mcp.php +++ b/phpBB/language/en/mcp.php @@ -274,6 +274,7 @@ $lang = array_merge($lang, array( 'POST_REPORTED_SUCCESS' => 'This post has been successfully reported.', 'POST_UNLOCKED_SUCCESS' => 'Post unlocked successfully.', + 'RANK' => 'User rank', 'READ_USERNOTES' => 'User notes', 'READ_WARNINGS' => 'User warnings', 'REPORTER' => 'Reporter', From 7a6d3ec61bff708fa1ebc60765c91af0a5648fc9 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Sun, 15 Apr 2012 23:33:34 -0500 Subject: [PATCH 094/255] [ticket/10819] Improve side-by-side diff styling Used transparent background for unchanged lines Shortened the table headers and make the background grey Added a border between the columns Increased the font size on pre blocks Added Consolas as the first pre font, for Windows users Added wordwrapping for pre blocks PHPBB3-10819 --- phpBB/adm/style/install_update_diff.html | 27 ++++++++++++------------ 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html index b65a014312..96bf2532b1 100644 --- a/phpBB/adm/style/install_update_diff.html +++ b/phpBB/adm/style/install_update_diff.html @@ -119,6 +119,7 @@ table.hrdiff { overflow: hidden; border-bottom: 1px solid #999; table-layout: fixed; + background: transparent; } table.hrdiff th { @@ -128,7 +129,8 @@ table.hrdiff th { font-family: Verdana,Helvetica,sans-serif; font-size: 11px; border-bottom: 1px solid #999; - background: transparent; + border-right: 1px solid #999; + background: #D9D9D9; } table.hrdiff thead th { @@ -142,29 +144,28 @@ table.hrdiff tr:first-child th { } table.hrdiff tbody th { - padding: 2em 1px 1px 1px; font-size: 80%; border-top: 1px solid #999; } -table.hrdiff tbody td.old { - border-left: 1px solid #999; - border-right: 1px solid #999; -} -table.hrdiff tbody td.new { +table.hrdiff tbody td { border-right: 1px solid #999; } +/* Variant of http://www.longren.org/wrapping-text-inside-pre-tags/ */ table.hrdiff td pre { - overflow: auto; - display: block; - width: 100%; - overflow: auto; - display: block; + font-family: "Consolas", monospace; + font-size: 1.1em; + overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */ + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ } table.hrdiff .unmodified { - background: #fff; + background: transparent; } table.hrdiff .added { From 09621342a54525e9dfcd3419b91d39e13ee7a326 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Sun, 15 Apr 2012 23:38:12 -0500 Subject: [PATCH 095/255] [ticket/10819] Forgot this causes vertical scrollbars on IE PHPBB3-10819 --- phpBB/adm/style/install_update_diff.html | 1 - 1 file changed, 1 deletion(-) diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html index 96bf2532b1..e57d19161d 100644 --- a/phpBB/adm/style/install_update_diff.html +++ b/phpBB/adm/style/install_update_diff.html @@ -156,7 +156,6 @@ table.hrdiff tbody td { table.hrdiff td pre { font-family: "Consolas", monospace; font-size: 1.1em; - overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */ white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ From bdf21e45caadd74c7f4c41d6e1bf4737d9300cf4 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 16 Apr 2012 03:04:29 -0400 Subject: [PATCH 096/255] [ticket/10767] Revert unconditional unfatality in commit-msg hook. Revert "[ticket/10093] Make commit-msg always not fatal by nuking all fatal logic." This reverts commit 88cad5523e7cdac6826dd8581e27e22a65afda26. PHPBB3-10093 PHPBB3-10767 --- git-tools/hooks/commit-msg | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg index 52969670ca..3c42411602 100755 --- a/git-tools/hooks/commit-msg +++ b/git-tools/hooks/commit-msg @@ -12,6 +12,11 @@ # ln -s ../../git-tools/hooks/commit-msg \\ # .git/hooks/commit-msg # +# You can configure whether invalid commit messages abort commits: +# +# git config phpbb.hooks.commit-msg.fatal true (abort, this is the default) +# git config phpbb.hooks.commit-msg.fatal false (warn only, do not abort) +# # Warning/error messages use color by default if the output is a terminal # ("output" here is normally standard error when you run git commit). # To force or disable the use of color: @@ -21,6 +26,13 @@ config_ns="phpbb.hooks.commit-msg"; +if [ "$(git config --bool $config_ns.fatal)" = "false" ] +then + fatal=0; +else + fatal=1; +fi + debug_level=$(git config --int $config_ns.debug || echo 0); # Error codes @@ -47,9 +59,12 @@ debug() quit() { - # Now we always exit with success, since git will trash - # entered commit message if commit-msg hook exits with a failure. - exit 0 + if [ $1 -gt 0 ] && [ $1 -ne $ERR_UNKNOWN ] && [ $fatal -eq 0 ] + then + exit 0; + else + exit $1; + fi } use_color() From 1ce8a1d7ee1f361278358f5b2b3e15b449d2a8aa Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Tue, 17 Apr 2012 05:49:59 -0400 Subject: [PATCH 097/255] [ticket/10767] Default to non-fatal behavior. PHPBB3-10767 --- git-tools/hooks/commit-msg | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg index 3c42411602..4c9e56f555 100755 --- a/git-tools/hooks/commit-msg +++ b/git-tools/hooks/commit-msg @@ -14,9 +14,11 @@ # # You can configure whether invalid commit messages abort commits: # -# git config phpbb.hooks.commit-msg.fatal true (abort, this is the default) +# git config phpbb.hooks.commit-msg.fatal true (abort) # git config phpbb.hooks.commit-msg.fatal false (warn only, do not abort) # +# The default is to warn only. +# # Warning/error messages use color by default if the output is a terminal # ("output" here is normally standard error when you run git commit). # To force or disable the use of color: @@ -26,11 +28,11 @@ config_ns="phpbb.hooks.commit-msg"; -if [ "$(git config --bool $config_ns.fatal)" = "false" ] +if [ "$(git config --bool $config_ns.fatal)" = "true" ] then - fatal=0; -else fatal=1; +else + fatal=0; fi debug_level=$(git config --int $config_ns.debug || echo 0); From 45b910f9b445dc50cf65e456d8fe6f3aae2cbc11 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Tue, 17 Apr 2012 05:56:09 -0400 Subject: [PATCH 098/255] [ticket/10767] Use warning/error language as appropriate. When commit-msg hook is fatal, label the message as an error. When it is not fatal, label the message as a warning. "Syntax error" is still always an error, not sure if this should be changed. PHPBB3-10767 --- git-tools/hooks/commit-msg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg index 4c9e56f555..fbeda805b7 100755 --- a/git-tools/hooks/commit-msg +++ b/git-tools/hooks/commit-msg @@ -31,8 +31,10 @@ config_ns="phpbb.hooks.commit-msg"; if [ "$(git config --bool $config_ns.fatal)" = "true" ] then fatal=1; + severity=Error; else fatal=0; + severity=Warning; fi debug_level=$(git config --int $config_ns.debug || echo 0); @@ -187,7 +189,7 @@ do # Don't be too strict. # Commits may be temporary, intended to be squashed later. # Just issue a warning here. - complain "Warning: heading should be a sentence beginning with a capital letter." 1>&2 + complain "$severity: heading should be a sentence beginning with a capital letter." 1>&2 complain "You entered:" 1>&2 complain "$line" 1>&2 fi From aceca2566b80753d79c1dc77f5470618b0a2078d Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Tue, 17 Apr 2012 05:59:35 -0400 Subject: [PATCH 099/255] [ticket/10767] Clarify what happens at the end of the hook. If there are problems and fatal is true, print that the commit is aborted. If there are problems and fatal is false, print instructions for fixing the commit. PHPBB3-10767 --- git-tools/hooks/commit-msg | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg index fbeda805b7..b156d276df 100755 --- a/git-tools/hooks/commit-msg +++ b/git-tools/hooks/commit-msg @@ -63,10 +63,17 @@ debug() quit() { - if [ $1 -gt 0 ] && [ $1 -ne $ERR_UNKNOWN ] && [ $fatal -eq 0 ] + if [ $1 -eq 0 ] || [ $1 -eq $ERR_UNKNOWN ] then + # success + exit 0; + elif [ $fatal -eq 0 ] + then + # problems found but fatal is false + complain 'Please run `git commit --amend` and fix the problems mentioned.' 1>&2 exit 0; else + complain "Aborting commit." 1>&2 exit $1; fi } From 00c54f8a7cad92eff14fe62530766666c2c796a7 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Tue, 17 Apr 2012 22:59:10 -0500 Subject: [PATCH 100/255] [ticket/10819] Remove support for older browsers PHPBB3-10819 --- phpBB/adm/style/install_update_diff.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html index e57d19161d..4d8bcfd1fc 100644 --- a/phpBB/adm/style/install_update_diff.html +++ b/phpBB/adm/style/install_update_diff.html @@ -152,14 +152,10 @@ table.hrdiff tbody td { border-right: 1px solid #999; } -/* Variant of http://www.longren.org/wrapping-text-inside-pre-tags/ */ table.hrdiff td pre { font-family: "Consolas", monospace; font-size: 1.1em; white-space: pre-wrap; /* css-3 */ - white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ } From b3e42635ca201eea2fa82fb057f021768daf6786 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 10 Apr 2012 22:41:59 +0300 Subject: [PATCH 101/255] [ticket/10759] Fixing style in database updater Fixing error in database updater caused by style components merge PHPBB3-10759 --- phpBB/install/database_update.php | 155 ++++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 28 deletions(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 5368ec06bb..0b33168496 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -1110,20 +1110,6 @@ function database_update_info() 'group_legend' => array('UINT', 0), ), ), - 'drop_columns' => array( - STYLES_TABLE => array( - 'imageset_id', - 'template_id', - 'theme_id', - ), - ), - 'drop_tables' => array( - STYLES_IMAGESET_TABLE, - STYLES_IMAGESET_DATA_TABLE, - STYLES_TEMPLATE_TABLE, - STYLES_TEMPLATE_DATA_TABLE, - STYLES_THEME_TABLE, - ), ), ); } @@ -1135,7 +1121,7 @@ function database_update_info() *****************************************************************************/ function change_database_data(&$no_updates, $version) { - global $db, $errored, $error_ary, $config, $phpbb_root_path, $phpEx; + global $db, $errored, $error_ary, $config, $phpbb_root_path, $phpEx, $db_tools; switch ($version) { @@ -2312,13 +2298,6 @@ function change_database_data(&$no_updates, $version) 'auth' => 'acl_a_styles', 'cat' => 'ACP_STYLE_MANAGEMENT', ), - 'edit' => array( - 'base' => 'acp_styles', - 'class' => 'acp', - 'title' => 'ACP_STYLES_EDIT', - 'auth' => 'acl_a_styles', - 'cat' => 'ACP_STYLE_MANAGEMENT', - ), 'cache' => array( 'base' => 'acp_styles', 'class' => 'acp', @@ -2421,13 +2400,133 @@ function change_database_data(&$no_updates, $version) { set_config('teampage_memberships', '1'); } - - // Clear styles table and add prosilver entry - _sql('DELETE FROM ' . STYLES_TABLE, $errored, $error_ary); - $sql = 'INSERT INTO ' . STYLES_TABLE . " (style_name, style_copyright, style_active, style_path, bbcode_bitfield, style_parent_id, style_parent_tree) VALUES ('prosilver', '© phpBB Group', 1, 'prosilver', 'kNg=', 0, '')"; - _sql($sql, $errored, $error_ary); - + // Check if styles table was already updated + if ($db_tools->sql_table_exists(STYLES_THEME_TABLE)) + { + // Get list of valid installed styles + $available_styles = array('prosilver'); + + $iterator = new DirectoryIterator($phpbb_root_path . 'styles'); + $skip_dirs = array('.', '..', 'prosilver'); + foreach ($iterator as $fileinfo) + { + if ($fileinfo->isDir() && !in_array($fileinfo->getFilename(), $skip_dirs) && file_exists($fileinfo->getPathname() . '/style.cfg')) + { + $style_cfg = parse_cfg_file($fileinfo->getPathname() . '/style.cfg'); + if (isset($style_cfg['phpbb_version']) && version_compare($style_cfg['phpbb_version'], '3.1.0-dev', '>=')) + { + // 3.1 style + $available_styles[] = $fileinfo->getFilename(); + } + } + } + + // Get all installed styles + if ($db_tools->sql_table_exists(STYLES_IMAGESET_TABLE)) + { + $sql = 'SELECT s.style_id, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_id, i.imageset_path, i.imageset_id + FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . " i + WHERE t.template_id = s.template_id + AND c.theme_id = s.theme_id + AND i.imageset_id = s.imageset_id"; + } + else + { + $sql = 'SELECT s.style_id, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_id + FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . " c + WHERE t.template_id = s.template_id + AND c.theme_id = s.theme_id"; + } + $result = $db->sql_query($sql); + + $styles = array(); + while ($row = $db->sql_fetchrow($result)) + { + $styles[] = $row; + } + $db->sql_freeresult($result); + + // Check each style + $valid_styles = array(); + foreach ($styles as $style_row) + { + if ( + // Ignore styles with parent style + $style_row['template_inherits_id'] == 0 && + // Check if components match + $style_row['template_path'] == $style_row['theme_path'] && (!isset($style_row['imageset_path']) || $style_row['template_path'] == $style_row['imageset_path']) && + // Check if components are valid + in_array($style_row['template_path'], $available_styles) + ) + { + // Valid style. Keep it + $sql_ary = array( + 'style_path' => $style_row['template_path'], + 'bbcode_bitfield' => $style_row['bbcode_bitfield'], + 'style_parent_id' => 0, + 'style_parent_tree' => '', + ); + _sql('UPDATE ' . STYLES_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE style_id = ' . $style_row['style_id'], $errored, $error_ary); + $valid_styles[] = $style_row['style_id']; + } + } + + // Remove old styles tables + $changes = array( + 'drop_columns' => array( + STYLES_TABLE => array( + 'imageset_id', + 'template_id', + 'theme_id', + ), + ), + + 'drop_tables' => array( + STYLES_IMAGESET_TABLE, + STYLES_IMAGESET_DATA_TABLE, + STYLES_TEMPLATE_TABLE, + STYLES_TEMPLATE_DATA_TABLE, + STYLES_THEME_TABLE, + ) + ); + $statements = $db_tools->perform_schema_changes($changes); + + foreach ($statements as $sql) + { + _sql($sql, $errored, $error_ary); + } + + // Remove old entries from styles table + if (!sizeof($valid_styles)) + { + // No valid styles: remove everything and add prosilver + _sql('DELETE FROM ' . STYLES_TABLE, $errored, $error_ary); + + $sql = 'INSERT INTO ' . STYLES_TABLE . " (style_id, style_name, style_copyright, style_active, style_path, bbcode_bitfield, style_parent_id, style_parent_tree) VALUES (1, 'prosilver', '© phpBB Group', 1, 'prosilver', 'kNg=', 0, '')"; + _sql($sql, $errored, $error_ary); + + set_config('default_style', '1'); + + $sql = 'UPDATE ' . USERS_TABLE . ' SET user_style = 0'; + _sql($sql, $errored, $error_ary); + } + else + { + // There are valid styles in styles table. Remove styles that are outdated + _sql('DELETE FROM ' . STYLES_TABLE . ' WHERE ' . $db->sql_in_set('style_id', $valid_styles, true), $errored, $error_ary); + + // Change default style + if (!in_array($config['default_style'], $valid_styles)) + { + set_config('default_style', $valid_styles[0]); + } + + // Reset styles for users + _sql('UPDATE ' . USERS_TABLE . ' SET user_style = 0 WHERE ' . $db->sql_in_set('user_style', $valid_styles, true), $errored, $error_ary); + } + } + $no_updates = false; if (!isset($config['assets_version'])) From ea8f83de6f87af8fc9413e1be557953cabe8811e Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 19 Apr 2012 03:06:40 +0200 Subject: [PATCH 102/255] [ticket/10759] Fix whitespace in database_update.php PHPBB3-10759 --- phpBB/install/database_update.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 0b33168496..cddc1c4164 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2310,7 +2310,7 @@ function change_database_data(&$no_updates, $version) _add_modules($modules_to_install); $sql = 'DELETE FROM ' . MODULES_TABLE . " - WHERE (module_basename = 'styles' OR module_basename = 'acp_styles') AND (module_mode = 'imageset' OR module_mode = 'theme' OR module_mode = 'template')"; + WHERE (module_basename = 'styles' OR module_basename = 'acp_styles') AND (module_mode = 'imageset' OR module_mode = 'theme' OR module_mode = 'template')"; _sql($sql, $errored, $error_ary); // Localise Global Announcements @@ -2474,15 +2474,15 @@ function change_database_data(&$no_updates, $version) // Remove old styles tables $changes = array( - 'drop_columns' => array( - STYLES_TABLE => array( + 'drop_columns' => array( + STYLES_TABLE => array( 'imageset_id', 'template_id', 'theme_id', ), ), - 'drop_tables' => array( + 'drop_tables' => array( STYLES_IMAGESET_TABLE, STYLES_IMAGESET_DATA_TABLE, STYLES_TEMPLATE_TABLE, From c43373068636a4f361423f2fe41231ac2e32f70f Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 19 Apr 2012 03:18:20 +0200 Subject: [PATCH 103/255] [ticket/10759] Retrieve style_id after INSERT since we cannot set it PHPBB3-10759 --- phpBB/install/database_update.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index cddc1c4164..d71226a29c 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2503,10 +2503,17 @@ function change_database_data(&$no_updates, $version) // No valid styles: remove everything and add prosilver _sql('DELETE FROM ' . STYLES_TABLE, $errored, $error_ary); - $sql = 'INSERT INTO ' . STYLES_TABLE . " (style_id, style_name, style_copyright, style_active, style_path, bbcode_bitfield, style_parent_id, style_parent_tree) VALUES (1, 'prosilver', '© phpBB Group', 1, 'prosilver', 'kNg=', 0, '')"; + $sql = 'INSERT INTO ' . STYLES_TABLE . " (style_name, style_copyright, style_active, style_path, bbcode_bitfield, style_parent_id, style_parent_tree) VALUES ('prosilver', '© phpBB Group', 1, 'prosilver', 'kNg=', 0, '')"; _sql($sql, $errored, $error_ary); - set_config('default_style', '1'); + $sql = 'SELECT style_id + FROM ' . $table . " + WHERE style_name = 'prosilver'"; + $result = _sql($sql, $errored, $error_ary); + $default_style = $db->sql_fetchfield($result); + $db->sql_freeresult($result); + + set_config('default_style', $default_style); $sql = 'UPDATE ' . USERS_TABLE . ' SET user_style = 0'; _sql($sql, $errored, $error_ary); From 0b7a0fa2d11c4f30d31e36f2c11c574491432d4a Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 19 Apr 2012 03:27:42 +0200 Subject: [PATCH 104/255] [ticket/10759] Clarify comments a bit PHPBB3-10759 --- phpBB/install/database_update.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index d71226a29c..c30508dcee 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2404,7 +2404,7 @@ function change_database_data(&$no_updates, $version) // Check if styles table was already updated if ($db_tools->sql_table_exists(STYLES_THEME_TABLE)) { - // Get list of valid installed styles + // Get list of valid 3.1 styles $available_styles = array('prosilver'); $iterator = new DirectoryIterator($phpbb_root_path . 'styles'); @@ -2447,12 +2447,12 @@ function change_database_data(&$no_updates, $version) } $db->sql_freeresult($result); - // Check each style + // Decide which styles to keep, all others will be deleted $valid_styles = array(); foreach ($styles as $style_row) { if ( - // Ignore styles with parent style + // Delete styles with parent style (not supported yet) $style_row['template_inherits_id'] == 0 && // Check if components match $style_row['template_path'] == $style_row['theme_path'] && (!isset($style_row['imageset_path']) || $style_row['template_path'] == $style_row['imageset_path']) && From 18704215216cf31e8d96058d2df7ef7cf20a3f7b Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 19 Apr 2012 03:38:01 +0200 Subject: [PATCH 105/255] [ticket/10759] Don't select imageset_id, it's not needed PHPBB3-10759 --- phpBB/install/database_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index c30508dcee..88ebb8209e 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2425,7 +2425,7 @@ function change_database_data(&$no_updates, $version) // Get all installed styles if ($db_tools->sql_table_exists(STYLES_IMAGESET_TABLE)) { - $sql = 'SELECT s.style_id, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_id, i.imageset_path, i.imageset_id + $sql = 'SELECT s.style_id, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_id, i.imageset_path FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . " i WHERE t.template_id = s.template_id AND c.theme_id = s.theme_id From 439ade4ee2f2fcd301ad3690624a821a779c95ee Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 19 Apr 2012 03:51:17 +0200 Subject: [PATCH 106/255] [ticket/10759] Make sure style ids are integers PHPBB3-10759 --- phpBB/install/database_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 88ebb8209e..a0892005d2 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2468,7 +2468,7 @@ function change_database_data(&$no_updates, $version) 'style_parent_tree' => '', ); _sql('UPDATE ' . STYLES_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE style_id = ' . $style_row['style_id'], $errored, $error_ary); - $valid_styles[] = $style_row['style_id']; + $valid_styles[] = (int) $style_row['style_id']; } } From 733018f99a7d8c6200921f31c683606c6f01fe76 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 11:23:09 +0300 Subject: [PATCH 107/255] [ticket/10756] Moving template classes Moving template class files from includes/style/ to includes/template/ and removing template_ file prefix PHPBB3-10756 --- .../includes/{style/template_compile.php => template/compile.php} | 0 .../includes/{style/template_context.php => template/context.php} | 0 phpBB/includes/{style/template_filter.php => template/filter.php} | 0 .../{style/template_renderer.php => template/renderer.php} | 0 .../template_renderer_eval.php => template/renderer_eval.php} | 0 .../renderer_include.php} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename phpBB/includes/{style/template_compile.php => template/compile.php} (100%) rename phpBB/includes/{style/template_context.php => template/context.php} (100%) rename phpBB/includes/{style/template_filter.php => template/filter.php} (100%) rename phpBB/includes/{style/template_renderer.php => template/renderer.php} (100%) rename phpBB/includes/{style/template_renderer_eval.php => template/renderer_eval.php} (100%) rename phpBB/includes/{style/template_renderer_include.php => template/renderer_include.php} (100%) diff --git a/phpBB/includes/style/template_compile.php b/phpBB/includes/template/compile.php similarity index 100% rename from phpBB/includes/style/template_compile.php rename to phpBB/includes/template/compile.php diff --git a/phpBB/includes/style/template_context.php b/phpBB/includes/template/context.php similarity index 100% rename from phpBB/includes/style/template_context.php rename to phpBB/includes/template/context.php diff --git a/phpBB/includes/style/template_filter.php b/phpBB/includes/template/filter.php similarity index 100% rename from phpBB/includes/style/template_filter.php rename to phpBB/includes/template/filter.php diff --git a/phpBB/includes/style/template_renderer.php b/phpBB/includes/template/renderer.php similarity index 100% rename from phpBB/includes/style/template_renderer.php rename to phpBB/includes/template/renderer.php diff --git a/phpBB/includes/style/template_renderer_eval.php b/phpBB/includes/template/renderer_eval.php similarity index 100% rename from phpBB/includes/style/template_renderer_eval.php rename to phpBB/includes/template/renderer_eval.php diff --git a/phpBB/includes/style/template_renderer_include.php b/phpBB/includes/template/renderer_include.php similarity index 100% rename from phpBB/includes/style/template_renderer_include.php rename to phpBB/includes/template/renderer_include.php From ef295a28606789874b524445f9fa690408c8eafc Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 11:27:15 +0300 Subject: [PATCH 108/255] [ticket/10756] Renaming template classes Renaming template classes from phpbb_style_template_ to phpbb_template_ PHPBB3-10756 --- phpBB/includes/style/style.php | 2 +- phpBB/includes/style/template.php | 20 ++++++++++---------- phpBB/includes/template/compile.php | 4 ++-- phpBB/includes/template/context.php | 2 +- phpBB/includes/template/filter.php | 2 +- phpBB/includes/template/renderer.php | 4 ++-- phpBB/includes/template/renderer_eval.php | 4 ++-- phpBB/includes/template/renderer_include.php | 4 ++-- tests/template/renderer_eval_test.php | 4 ++-- tests/template/template_compile_test.php | 2 +- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/phpBB/includes/style/style.php b/phpBB/includes/style/style.php index 5ac61c9f10..4bfb9eaa07 100644 --- a/phpBB/includes/style/style.php +++ b/phpBB/includes/style/style.php @@ -119,7 +119,7 @@ class phpbb_style $this->template->cachepath = $this->phpbb_root_path . 'cache/tpl_' . str_replace('_', '-', $name) . '_'; - $this->template->context = new phpbb_style_template_context(); + $this->template->context = new phpbb_template_context(); if ($template_path !== false) { diff --git a/phpBB/includes/style/template.php b/phpBB/includes/style/template.php index 9d476e74b9..ad4c452268 100644 --- a/phpBB/includes/style/template.php +++ b/phpBB/includes/style/template.php @@ -32,7 +32,7 @@ if (!defined('IN_PHPBB')) class phpbb_style_template { /** - * @var phpbb_style_template_context Template context. + * @var phpbb_template_context Template context. * Stores template data used during template rendering. */ public $context; @@ -253,15 +253,15 @@ class phpbb_style_template * configuration setting may be used to force templates to be always * recompiled. * - * Returns an object implementing phpbb_style_template_renderer, or null + * Returns an object implementing phpbb_template_renderer, or null * if template loading or compilation failed. Call render() on the * renderer to display the template. This will result in template * contents sent to the output stream (unless, of course, output * buffering is in effect). * * @param string $handle Handle of the template to load - * @return phpbb_style_template_renderer Template renderer object, or null on failure - * @uses phpbb_style_template_compile is used to compile template source + * @return phpbb_template_renderer Template renderer object, or null on failure + * @uses phpbb_template_compile is used to compile template source */ private function _tpl_load($handle) { @@ -285,18 +285,18 @@ class phpbb_style_template // Recompile page if the original template is newer, otherwise load the compiled version if (!$recompile) { - return new phpbb_style_template_renderer_include($output_file, $this); + return new phpbb_template_renderer_include($output_file, $this); } - $compile = new phpbb_style_template_compile($this->config['tpl_allow_php'], $this->locator, $this->phpbb_root_path); + $compile = new phpbb_template_compile($this->config['tpl_allow_php'], $this->locator, $this->phpbb_root_path); if ($compile->compile_file_to_file($source_file, $output_file) !== false) { - $renderer = new phpbb_style_template_renderer_include($output_file, $this); + $renderer = new phpbb_template_renderer_include($output_file, $this); } else if (($code = $compile->compile_file($source_file)) !== false) { - $renderer = new phpbb_style_template_renderer_eval($code, $this); + $renderer = new phpbb_template_renderer_eval($code, $this); } else { @@ -358,7 +358,7 @@ class phpbb_style_template $this->context->append_var($varname, $varval); } - // Docstring is copied from phpbb_style_template_context method with the same name. + // Docstring is copied from phpbb_template_context method with the same name. /** * Assign key variable pairs from an array to a specified block * @param string $blockname Name of block to assign $vararray to @@ -369,7 +369,7 @@ class phpbb_style_template return $this->context->assign_block_vars($blockname, $vararray); } - // Docstring is copied from phpbb_style_template_context method with the same name. + // Docstring is copied from phpbb_template_context method with the same name. /** * Change already assigned key variable pair (one-dimensional - single loop entry) * diff --git a/phpBB/includes/template/compile.php b/phpBB/includes/template/compile.php index fa0928f424..82b301c1a2 100644 --- a/phpBB/includes/template/compile.php +++ b/phpBB/includes/template/compile.php @@ -15,7 +15,7 @@ if (!defined('IN_PHPBB')) exit; } -stream_filter_register('phpbb_template', 'phpbb_style_template_filter'); +stream_filter_register('phpbb_template', 'phpbb_template_filter'); /** * Extension of template class - Functions needed for compiling templates only. @@ -23,7 +23,7 @@ stream_filter_register('phpbb_template', 'phpbb_style_template_filter'); * @package phpBB3 * @uses template_filter As a PHP stream filter to perform compilation of templates */ -class phpbb_style_template_compile +class phpbb_template_compile { /** * Array of parameters to forward to template filter diff --git a/phpBB/includes/template/context.php b/phpBB/includes/template/context.php index b22f77da2e..5e0b1d4a7e 100644 --- a/phpBB/includes/template/context.php +++ b/phpBB/includes/template/context.php @@ -20,7 +20,7 @@ if (!defined('IN_PHPBB')) * * @package phpBB3 */ -class phpbb_style_template_context +class phpbb_template_context { /** * variable that holds all the data we'll be substituting into diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php index 6ef9d80a3d..4a2593b757 100644 --- a/phpBB/includes/template/filter.php +++ b/phpBB/includes/template/filter.php @@ -35,7 +35,7 @@ if (!defined('IN_PHPBB')) * @see template_compile * @package phpBB3 */ -class phpbb_style_template_filter extends php_user_filter +class phpbb_template_filter extends php_user_filter { const REGEX_NS = '[a-z_][a-z_0-9]+'; diff --git a/phpBB/includes/template/renderer.php b/phpBB/includes/template/renderer.php index bd2a786e86..30e234a733 100644 --- a/phpBB/includes/template/renderer.php +++ b/phpBB/includes/template/renderer.php @@ -23,12 +23,12 @@ if (!defined('IN_PHPBB')) * * @package phpBB3 */ -interface phpbb_style_template_renderer +interface phpbb_template_renderer { /** * Displays the template managed by this renderer. * - * @param phpbb_style_template_context $context Template context to use + * @param phpbb_template_context $context Template context to use * @param array $lang Language entries to use */ public function render($context, $lang); diff --git a/phpBB/includes/template/renderer_eval.php b/phpBB/includes/template/renderer_eval.php index 3e08b06e69..62dfbc3708 100644 --- a/phpBB/includes/template/renderer_eval.php +++ b/phpBB/includes/template/renderer_eval.php @@ -21,7 +21,7 @@ if (!defined('IN_PHPBB')) * * @package phpBB3 */ -class phpbb_style_template_renderer_eval implements phpbb_style_template_renderer +class phpbb_template_renderer_eval implements phpbb_template_renderer { /** * Template code to be eval'ed. @@ -45,7 +45,7 @@ class phpbb_style_template_renderer_eval implements phpbb_style_template_rendere * Displays the template managed by this renderer by eval'ing php code * of the template. * - * @param phpbb_style_template_context $context Template context to use + * @param phpbb_template_context $context Template context to use * @param array $lang Language entries to use */ public function render($context, $lang) diff --git a/phpBB/includes/template/renderer_include.php b/phpBB/includes/template/renderer_include.php index 91c1a1bb65..f5c9026abf 100644 --- a/phpBB/includes/template/renderer_include.php +++ b/phpBB/includes/template/renderer_include.php @@ -22,7 +22,7 @@ if (!defined('IN_PHPBB')) * * @package phpBB3 */ -class phpbb_style_template_renderer_include implements phpbb_style_template_renderer +class phpbb_template_renderer_include implements phpbb_template_renderer { /** * Template path to be included. @@ -45,7 +45,7 @@ class phpbb_style_template_renderer_include implements phpbb_style_template_rend * Displays the template managed by this renderer by including * the php file containing the template. * - * @param phpbb_style_template_context $context Template context to use + * @param phpbb_template_context $context Template context to use * @param array $lang Language entries to use */ public function render($context, $lang) diff --git a/tests/template/renderer_eval_test.php b/tests/template/renderer_eval_test.php index 9b4f74c824..7ebb8b9bda 100644 --- a/tests/template/renderer_eval_test.php +++ b/tests/template/renderer_eval_test.php @@ -13,8 +13,8 @@ class phpbb_template_renderer_eval_test extends phpbb_test_case { $compiled_code = ''; $valid_code = ''; - $context = new phpbb_style_template_context(); - $template = new phpbb_style_template_renderer_eval($compiled_code, NULL); + $context = new phpbb_template_context(); + $template = new phpbb_template_renderer_eval($compiled_code, NULL); ob_start(); try { diff --git a/tests/template/template_compile_test.php b/tests/template/template_compile_test.php index e2264fb1b7..0cfcd6ceb5 100644 --- a/tests/template/template_compile_test.php +++ b/tests/template/template_compile_test.php @@ -16,7 +16,7 @@ class phpbb_template_template_compile_test extends phpbb_test_case protected function setUp() { - $this->template_compile = new phpbb_style_template_compile(false, null, ''); + $this->template_compile = new phpbb_template_compile(false, null, ''); $this->template_path = dirname(__FILE__) . '/templates'; } From ea3a2ef2234095e9db2d79f8c1d17bf1dfda1a23 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 13:19:03 +0300 Subject: [PATCH 109/255] [ticket/10756] Creating locator interface Creating locator interface to be used in template class PHPBB3-10756 --- phpBB/includes/style/resource_locator.php | 2 +- phpBB/includes/style/template.php | 8 +- phpBB/includes/template/locator.php | 133 ++++++++++++++++++++++ 3 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 phpBB/includes/template/locator.php diff --git a/phpBB/includes/style/resource_locator.php b/phpBB/includes/style/resource_locator.php index 3e6dd5d6aa..fafa11c352 100644 --- a/phpBB/includes/style/resource_locator.php +++ b/phpBB/includes/style/resource_locator.php @@ -30,7 +30,7 @@ if (!defined('IN_PHPBB')) * * @package phpBB3 */ -class phpbb_style_resource_locator +class phpbb_style_resource_locator implements phpbb_template_locator { /** * Paths to style directories. diff --git a/phpBB/includes/style/template.php b/phpBB/includes/style/template.php index ad4c452268..1967ec7d96 100644 --- a/phpBB/includes/style/template.php +++ b/phpBB/includes/style/template.php @@ -63,8 +63,8 @@ class phpbb_style_template private $user; /** - * Style resource locator - * @var phpbb_style_resource_locator + * Template locator + * @var phpbb_template_locator */ private $locator; @@ -85,10 +85,10 @@ class phpbb_style_template * * @param string $phpbb_root_path phpBB root path * @param user $user current user - * @param phpbb_style_resource_locator $locator style resource locator + * @param phpbb_template_locator $locator template locator * @param phpbb_style_path_provider $provider style path provider */ - public function __construct($phpbb_root_path, $phpEx, $config, $user, phpbb_style_resource_locator $locator, phpbb_style_path_provider_interface $provider) + public function __construct($phpbb_root_path, $phpEx, $config, $user, phpbb_template_locator $locator, phpbb_style_path_provider_interface $provider) { $this->phpbb_root_path = $phpbb_root_path; $this->phpEx = $phpEx; diff --git a/phpBB/includes/template/locator.php b/phpBB/includes/template/locator.php new file mode 100644 index 0000000000..836046e92b --- /dev/null +++ b/phpBB/includes/template/locator.php @@ -0,0 +1,133 @@ + filename pairs. + * + * @param array $filname_array Should be a hash of handle => filename pairs. + */ + public function set_filenames(array $filename_array); + + /** + * Determines the filename for a template handle. + * + * The filename comes from array used in a set_filenames call, + * which should have been performed prior to invoking this function. + * Return value is a file basename (without path). + * + * @param $handle string Template handle + * @return string Filename corresponding to the template handle + */ + public function get_filename_for_handle($handle); + + /** + * Determines the source file path for a template handle without + * regard for styles tree. + * + * This function returns the path in "primary" style directory + * corresponding to the given template handle. That path may or + * may not actually exist on the filesystem. Because this function + * does not perform stat calls to determine whether the path it + * returns actually exists, it is faster than get_source_file_for_handle. + * + * Use get_source_file_for_handle to obtain the actual path that is + * guaranteed to exist (which might come from the parent style + * directory if primary style has parent styles). + * + * This function will trigger an error if the handle was never + * associated with a template file via set_filenames. + * + * @param $handle string Template handle + * @return string Path to source file path in primary style directory + */ + public function get_virtual_source_file_for_handle($handle); + + /** + * Determines the source file path for a template handle, accounting + * for styles tree and verifying that the path exists. + * + * This function returns the actual path that may be compiled for + * the specified template handle. It will trigger an error if + * the template handle was never associated with a template path + * via set_filenames or if the template file does not exist on the + * filesystem. + * + * Use get_virtual_source_file_for_handle to just resolve a template + * handle to a path without any filesystem or styles tree checks. + * + * @param string $handle Template handle (i.e. "friendly" template name) + * @param bool $find_all If true, each root path will be checked and function + * will return array of files instead of string and will not + * trigger a error if template does not exist + * @return string Source file path + */ + public function get_source_file_for_handle($handle, $find_all = false); + + /** + * Locates source file path, accounting for styles tree and verifying that + * the path exists. + * + * Unlike previous functions, this function works without template handle + * and it can search for more than one file. If more than one file name is + * specified, it will return location of file that it finds first. + * + * @param array $files List of files to locate. + * @param bool $return_default Determines what to return if file does not + * exist. If true, function will return location where file is + * supposed to be. If false, function will return false. + * @param bool $return_full_path If true, function will return full path + * to file. If false, function will return file name. This + * parameter can be used to check which one of set of files + * is available. + * @return string or boolean Source file path if file exists or $return_default is + * true. False if file does not exist and $return_default is false + */ + public function get_first_file_location($files, $return_default = false, $return_full_path = true); +} From 6cecc91326135fbb36eb9d73aa25fc40cfdfb54b Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 13:23:08 +0300 Subject: [PATCH 110/255] [ticket/10756] Removing path provider from template class Removing path provider from template class because it is not used by template class PHPBB3-10756 --- phpBB/common.php | 3 ++- phpBB/includes/bbcode.php | 2 +- phpBB/includes/functions_messenger.php | 4 +++- phpBB/includes/style/template.php | 10 +--------- phpBB/install/index.php | 2 +- tests/template/template_test_case.php | 2 +- tests/template/template_test_case_with_tree.php | 2 +- 7 files changed, 10 insertions(+), 15 deletions(-) diff --git a/phpBB/common.php b/phpBB/common.php index a00e3e82a8..7694620b36 100644 --- a/phpBB/common.php +++ b/phpBB/common.php @@ -124,7 +124,8 @@ $phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_ro // Initialize style $phpbb_style_resource_locator = new phpbb_style_resource_locator(); $phpbb_style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); -$template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider); + +$template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); $phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); $phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager); diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index 612ced8ad6..3adf9582d6 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -134,7 +134,7 @@ class bbcode $style_resource_locator = new phpbb_style_resource_locator(); $style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); - $template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider); + $template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator); $style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $template); $style->set_style(); $template->set_filenames(array('bbcode.html' => 'bbcode.html')); diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index f608c95fe4..de14703817 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -210,8 +210,10 @@ class messenger { $style_resource_locator = new phpbb_style_resource_locator(); $style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); - $tpl = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider); + + $tpl = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator); $style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $tpl); + $this->tpl_msg[$template_lang . $template_file] = $tpl; $fallback_template_path = false; diff --git a/phpBB/includes/style/template.php b/phpBB/includes/style/template.php index 1967ec7d96..6dd588c17b 100644 --- a/phpBB/includes/style/template.php +++ b/phpBB/includes/style/template.php @@ -68,12 +68,6 @@ class phpbb_style_template */ private $locator; - /** - * Template path provider - * @var phpbb_style_path_provider - */ - private $provider; - /** * Location of templates directory within style directories * @var string @@ -86,9 +80,8 @@ class phpbb_style_template * @param string $phpbb_root_path phpBB root path * @param user $user current user * @param phpbb_template_locator $locator template locator - * @param phpbb_style_path_provider $provider style path provider */ - public function __construct($phpbb_root_path, $phpEx, $config, $user, phpbb_template_locator $locator, phpbb_style_path_provider_interface $provider) + public function __construct($phpbb_root_path, $phpEx, $config, $user, phpbb_template_locator $locator) { $this->phpbb_root_path = $phpbb_root_path; $this->phpEx = $phpEx; @@ -96,7 +89,6 @@ class phpbb_style_template $this->user = $user; $this->locator = $locator; $this->template_path = $this->locator->template_path; - $this->provider = $provider; } /** diff --git a/phpBB/install/index.php b/phpBB/install/index.php index bb10521bba..be5ebc53b5 100644 --- a/phpBB/install/index.php +++ b/phpBB/install/index.php @@ -202,7 +202,7 @@ $config = new phpbb_config(array( $phpbb_style_resource_locator = new phpbb_style_resource_locator(); $phpbb_style_path_provider = new phpbb_style_path_provider(); -$template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider); +$template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); $phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); $phpbb_style->set_ext_dir_prefix('adm/'); $phpbb_style->set_custom_style('admin', '../adm/style', ''); diff --git a/tests/template/template_test_case.php b/tests/template/template_test_case.php index a87e531a07..4170fdf278 100644 --- a/tests/template/template_test_case.php +++ b/tests/template/template_test_case.php @@ -66,7 +66,7 @@ class phpbb_template_template_test_case extends phpbb_test_case $this->template_path = dirname(__FILE__) . '/templates'; $this->style_resource_locator = new phpbb_style_resource_locator(); $this->style_provider = new phpbb_style_path_provider(); - $this->template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider); + $this->template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); $this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template); $this->style->set_custom_style('tests', $this->template_path, ''); } diff --git a/tests/template/template_test_case_with_tree.php b/tests/template/template_test_case_with_tree.php index e76d9436cf..536ac394a8 100644 --- a/tests/template/template_test_case_with_tree.php +++ b/tests/template/template_test_case_with_tree.php @@ -22,7 +22,7 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat $this->parent_template_path = dirname(__FILE__) . '/parent_templates'; $this->style_resource_locator = new phpbb_style_resource_locator(); $this->style_provider = new phpbb_style_path_provider(); - $this->template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider); + $this->template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); $this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template); $this->style->set_custom_style('tests', array($this->template_path, $this->parent_template_path), ''); } From d91abbb146d3a808764bf19b9e6adc6e14db1751 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 13:57:12 +0300 Subject: [PATCH 111/255] [ticket/10756] Renaming phpbb_style_template to phpbb_template Renaming phpbb_style_template to phpbb_template PHPBB3-10756 --- phpBB/common.php | 3 +-- phpBB/includes/bbcode.php | 2 +- phpBB/includes/functions_messenger.php | 3 +-- phpBB/includes/style/style.php | 6 +++--- phpBB/includes/template/context.php | 2 +- phpBB/includes/template/renderer_eval.php | 2 +- phpBB/includes/{style => template}/template.php | 2 +- phpBB/install/index.php | 2 +- tests/template/template_test_case.php | 2 +- tests/template/template_test_case_with_tree.php | 2 +- 10 files changed, 12 insertions(+), 14 deletions(-) rename phpBB/includes/{style => template}/template.php (99%) diff --git a/phpBB/common.php b/phpBB/common.php index 7694620b36..81fe275008 100644 --- a/phpBB/common.php +++ b/phpBB/common.php @@ -124,8 +124,7 @@ $phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_ro // Initialize style $phpbb_style_resource_locator = new phpbb_style_resource_locator(); $phpbb_style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); - -$template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); +$template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); $phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); $phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager); diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index 3adf9582d6..fde917e5b1 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -134,7 +134,7 @@ class bbcode $style_resource_locator = new phpbb_style_resource_locator(); $style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); - $template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator); + $template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator); $style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $template); $style->set_style(); $template->set_filenames(array('bbcode.html' => 'bbcode.html')); diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index de14703817..e9073553d0 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -210,8 +210,7 @@ class messenger { $style_resource_locator = new phpbb_style_resource_locator(); $style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); - - $tpl = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator); + $tpl = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator); $style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $style_resource_locator, $style_path_provider, $tpl); $this->tpl_msg[$template_lang . $template_file] = $tpl; diff --git a/phpBB/includes/style/style.php b/phpBB/includes/style/style.php index 4bfb9eaa07..2be4cb8855 100644 --- a/phpBB/includes/style/style.php +++ b/phpBB/includes/style/style.php @@ -22,7 +22,7 @@ if (!defined('IN_PHPBB')) class phpbb_style { /** - * @var phpbb_style_template Template class. + * @var phpbb_template Template class. * Handles everything related to templates. */ private $template; @@ -66,9 +66,9 @@ class phpbb_style * @param user $user current user * @param phpbb_style_resource_locator $locator style resource locator * @param phpbb_style_path_provider $provider style path provider - * @param phpbb_style_template $template template + * @param phpbb_template $template template */ - public function __construct($phpbb_root_path, $phpEx, $config, $user, phpbb_style_resource_locator $locator, phpbb_style_path_provider_interface $provider, phpbb_style_template $template) + public function __construct($phpbb_root_path, $phpEx, $config, $user, phpbb_style_resource_locator $locator, phpbb_style_path_provider_interface $provider, phpbb_template $template) { $this->phpbb_root_path = $phpbb_root_path; $this->phpEx = $phpEx; diff --git a/phpBB/includes/template/context.php b/phpBB/includes/template/context.php index 5e0b1d4a7e..ec09da1cf3 100644 --- a/phpBB/includes/template/context.php +++ b/phpBB/includes/template/context.php @@ -86,7 +86,7 @@ class phpbb_template_context * Returns a reference to template data array. * * This function is public so that template renderer may invoke it. - * Users should alter template variables via functions in phpbb_style_template. + * Users should alter template variables via functions in phpbb_template. * * Note: modifying returned array will affect data stored in the context. * diff --git a/phpBB/includes/template/renderer_eval.php b/phpBB/includes/template/renderer_eval.php index 62dfbc3708..f8e4cb7b10 100644 --- a/phpBB/includes/template/renderer_eval.php +++ b/phpBB/includes/template/renderer_eval.php @@ -33,7 +33,7 @@ class phpbb_template_renderer_eval implements phpbb_template_renderer * Template includes are delegated to template object $template. * * @param string $code php code of the template - * @param phpbb_style_template $template template object + * @param phpbb_template $template template object */ public function __construct($code, $template) { diff --git a/phpBB/includes/style/template.php b/phpBB/includes/template/template.php similarity index 99% rename from phpBB/includes/style/template.php rename to phpBB/includes/template/template.php index 6dd588c17b..0a3e992b03 100644 --- a/phpBB/includes/style/template.php +++ b/phpBB/includes/template/template.php @@ -29,7 +29,7 @@ if (!defined('IN_PHPBB')) * Base Template class. * @package phpBB3 */ -class phpbb_style_template +class phpbb_template { /** * @var phpbb_template_context Template context. diff --git a/phpBB/install/index.php b/phpBB/install/index.php index be5ebc53b5..f992b67bb7 100644 --- a/phpBB/install/index.php +++ b/phpBB/install/index.php @@ -202,7 +202,7 @@ $config = new phpbb_config(array( $phpbb_style_resource_locator = new phpbb_style_resource_locator(); $phpbb_style_path_provider = new phpbb_style_path_provider(); -$template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); +$template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); $phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); $phpbb_style->set_ext_dir_prefix('adm/'); $phpbb_style->set_custom_style('admin', '../adm/style', ''); diff --git a/tests/template/template_test_case.php b/tests/template/template_test_case.php index 4170fdf278..d660aa3f56 100644 --- a/tests/template/template_test_case.php +++ b/tests/template/template_test_case.php @@ -66,7 +66,7 @@ class phpbb_template_template_test_case extends phpbb_test_case $this->template_path = dirname(__FILE__) . '/templates'; $this->style_resource_locator = new phpbb_style_resource_locator(); $this->style_provider = new phpbb_style_path_provider(); - $this->template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); + $this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); $this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template); $this->style->set_custom_style('tests', $this->template_path, ''); } diff --git a/tests/template/template_test_case_with_tree.php b/tests/template/template_test_case_with_tree.php index 536ac394a8..9522c97330 100644 --- a/tests/template/template_test_case_with_tree.php +++ b/tests/template/template_test_case_with_tree.php @@ -22,7 +22,7 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat $this->parent_template_path = dirname(__FILE__) . '/parent_templates'; $this->style_resource_locator = new phpbb_style_resource_locator(); $this->style_provider = new phpbb_style_path_provider(); - $this->template = new phpbb_style_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); + $this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); $this->style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator, $this->style_provider, $this->template); $this->style->set_custom_style('tests', array($this->template_path, $this->parent_template_path), ''); } From ed9a58a6ccea5b9b2685488ff0cfc45f0ccdbeb5 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 3 Apr 2012 14:32:49 +0300 Subject: [PATCH 112/255] [ticket/10756] Fixing variable declarations in style and template classes Fixing variable declaration, removing function from template locator that does not belong there PHPBB3-10756 --- phpBB/includes/style/style.php | 15 ++++++++++----- phpBB/includes/template/locator.php | 12 ------------ phpBB/includes/template/template.php | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/phpBB/includes/style/style.php b/phpBB/includes/style/style.php index 2be4cb8855..3f470015f6 100644 --- a/phpBB/includes/style/style.php +++ b/phpBB/includes/style/style.php @@ -22,28 +22,33 @@ if (!defined('IN_PHPBB')) class phpbb_style { /** - * @var phpbb_template Template class. + * Template class. * Handles everything related to templates. + * @var phpbb_template */ private $template; /** - * @var string phpBB root path + * phpBB root path + * @var string */ private $phpbb_root_path; /** - * @var phpEx PHP file extension + * PHP file extension + * @var string */ private $phpEx; /** - * @var phpbb_config phpBB config instance + * phpBB config instance + * @var phpbb_config */ private $config; /** - * @var user current user + * Current user + * @var phpbb_user */ private $user; diff --git a/phpBB/includes/template/locator.php b/phpBB/includes/template/locator.php index 836046e92b..01c79eec4e 100644 --- a/phpBB/includes/template/locator.php +++ b/phpBB/includes/template/locator.php @@ -35,18 +35,6 @@ if (!defined('IN_PHPBB')) */ interface phpbb_template_locator { - /** - * Sets the list of style paths - * - * These paths will be searched for style files in the provided order. - * Paths may be outside of phpBB, but templates loaded from these paths - * will still be cached. - * - * @param array $style_paths An array of paths to style directories - * @return null - */ - public function set_paths($style_paths); - /** * Sets the template filenames for handles. $filename_array * should be a hash of handle => filename pairs. diff --git a/phpBB/includes/template/template.php b/phpBB/includes/template/template.php index 0a3e992b03..e6512c8417 100644 --- a/phpBB/includes/template/template.php +++ b/phpBB/includes/template/template.php @@ -32,33 +32,39 @@ if (!defined('IN_PHPBB')) class phpbb_template { /** - * @var phpbb_template_context Template context. + * Template context. * Stores template data used during template rendering. + * @var phpbb_template_context */ public $context; /** - * @var string Path of the cache directory for the template + * Path of the cache directory for the template + * @var string */ public $cachepath = ''; /** - * @var string phpBB root path + * phpBB root path + * @var string */ private $phpbb_root_path; /** - * @var phpEx PHP file extension + * PHP file extension + * @var string */ private $phpEx; /** - * @var phpbb_config phpBB config instance + * phpBB config instance + * @var phpbb_config */ private $config; /** - * @var user current user + * Current user + * @var phpbb_user */ private $user; From 00172afa532c99329f4683ecaefb0ba851e46b94 Mon Sep 17 00:00:00 2001 From: riadhchtara Date: Sun, 15 Apr 2012 12:36:42 +0100 Subject: [PATCH 113/255] [ticket/10813] Installer now checks json extension Installer now checks json extension and cannot continue without it. Changes are made in phpBB/install/install_install.php where the checking for json is added and to phpBB/language/en/install.php where 2 new keys for the messages that would be displayed are also added. PHPBB3-10813 --- phpBB/install/install_install.php | 22 +++++++++++++++++++++- phpBB/language/en/install.php | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 7558fde944..ad84155585 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -128,7 +128,7 @@ class install_install extends module 'BODY' => $lang['REQUIREMENTS_EXPLAIN'], )); - $passed = array('php' => false, 'db' => false, 'files' => false, 'pcre' => false, 'imagesize' => false,); + $passed = array('php' => false, 'db' => false, 'files' => false, 'pcre' => false, 'imagesize' => false, 'json' => false,); // Test for basic PHP settings $template->assign_block_vars('checks', array( @@ -244,6 +244,26 @@ class install_install extends module 'S_EXPLAIN' => true, 'S_LEGEND' => false, )); + + // Check for php json support + if (@extension_loaded('json')) + { + $passed['json'] = true; + $result = '' . $lang['YES'] . ''; + } + else + { + $result = '' . $lang['NO'] . ''; + } + + $template->assign_block_vars('checks', array( + 'TITLE' => $lang['PHP_JSON_SUPPORT'], + 'TITLE_EXPLAIN' => $lang['PHP_JSON_SUPPORT_EXPLAIN'], + 'RESULT' => $result, + + 'S_EXPLAIN' => true, + 'S_LEGEND' => false, + )); /** * Better not enabling and adding to the loaded extensions due to the specific requirements needed diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php index ca6045a921..29664ae5f0 100644 --- a/phpBB/language/en/install.php +++ b/phpBB/language/en/install.php @@ -292,6 +292,8 @@ $lang = array_merge($lang, array( 'PCRE_UTF_SUPPORT_EXPLAIN' => 'phpBB will not run if your PHP installation is not compiled with UTF-8 support in the PCRE extension.', 'PHP_GETIMAGESIZE_SUPPORT' => 'PHP function getimagesize() is available', 'PHP_GETIMAGESIZE_SUPPORT_EXPLAIN' => 'Required - In order for phpBB to function correctly, the getimagesize function needs to be available.', + 'PHP_JSON_SUPPORT' => 'PHP JSON support', + 'PHP_JSON_SUPPORT_EXPLAIN' => 'Required - In order for phpBB to function correctly, the PHP JSON extension needs to be available.', 'PHP_OPTIONAL_MODULE' => 'Optional modules', 'PHP_OPTIONAL_MODULE_EXPLAIN' => 'Optional - These modules or applications are optional. However, if they are available they will enable extra features.', 'PHP_SUPPORTED_DB' => 'Supported databases', From 90fc8fe59f5f6e53071a8ccb85d085d62491c466 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 20 Apr 2012 04:30:42 +0530 Subject: [PATCH 114/255] [ticket/10797] language key rank moved to common Language key RANK moved from memberlist to common. Removed from mcp language. PHPBB3-10797 --- phpBB/language/en/common.php | 1 + phpBB/language/en/mcp.php | 1 - phpBB/language/en/memberlist.php | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 005640b7dd..dc6bab3ce2 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -459,6 +459,7 @@ $lang = array_merge($lang, array( 'PRIVATE_MESSAGING' => 'Private messaging', 'PROFILE' => 'User Control Panel', + 'RANK' => 'Rank', 'READING_FORUM' => 'Viewing topics in %s', 'READING_GLOBAL_ANNOUNCE' => 'Reading global announcement', 'READING_LINK' => 'Following forum link %s', diff --git a/phpBB/language/en/mcp.php b/phpBB/language/en/mcp.php index 16b55b3612..d0bcec0d9c 100644 --- a/phpBB/language/en/mcp.php +++ b/phpBB/language/en/mcp.php @@ -274,7 +274,6 @@ $lang = array_merge($lang, array( 'POST_REPORTED_SUCCESS' => 'This post has been successfully reported.', 'POST_UNLOCKED_SUCCESS' => 'Post unlocked successfully.', - 'RANK' => 'User rank', 'READ_USERNOTES' => 'User notes', 'READ_WARNINGS' => 'User warnings', 'REPORTER' => 'Reporter', diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php index e71f9d6565..7dc5e6b74a 100644 --- a/phpBB/language/en/memberlist.php +++ b/phpBB/language/en/memberlist.php @@ -110,7 +110,6 @@ $lang = array_merge($lang, array( 'POST_IP' => 'Posted from IP/domain', - 'RANK' => 'Rank', 'REAL_NAME' => 'Recipient name', 'RECIPIENT' => 'Recipient', 'REMOVE_FOE' => 'Remove foe', From edf60bcd550334a521f35700d52d800b1851d693 Mon Sep 17 00:00:00 2001 From: galaxyAbstractor Date: Sat, 14 Apr 2012 18:57:21 +0200 Subject: [PATCH 115/255] [ticket/10812] Disabled register_globals check in PHP 5.4 Disabled the check for register_globals if PHP version is 5.4+ PHPBB3-10812 --- phpBB/install/install_install.php | 37 +++++++++++++++++-------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 026fc0d404..454c8b4df0 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -166,25 +166,28 @@ class install_install extends module 'S_LEGEND' => false, )); - // Check for register_globals being enabled - if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on') + // Don't check for register_globals on 5.4+ + if (version_compare($php_version, '5.4.0-dev') < 0) { - $result = '' . $lang['NO'] . ''; + // Check for register_globals being enabled + if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on') + { + $result = '' . $lang['NO'] . ''; + } + else + { + $result = '' . $lang['YES'] . ''; + } + + $template->assign_block_vars('checks', array( + 'TITLE' => $lang['PHP_REGISTER_GLOBALS'], + 'TITLE_EXPLAIN' => $lang['PHP_REGISTER_GLOBALS_EXPLAIN'], + 'RESULT' => $result, + + 'S_EXPLAIN' => true, + 'S_LEGEND' => false, + )); } - else - { - $result = '' . $lang['YES'] . ''; - } - - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['PHP_REGISTER_GLOBALS'], - 'TITLE_EXPLAIN' => $lang['PHP_REGISTER_GLOBALS_EXPLAIN'], - 'RESULT' => $result, - - 'S_EXPLAIN' => true, - 'S_LEGEND' => false, - )); - // Check for url_fopen if (@ini_get('allow_url_fopen') == '1' || strtolower(@ini_get('allow_url_fopen')) == 'on') From 4788705a9a885df4bc9af834d6911a8c9919ce0b Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sun, 15 Apr 2012 15:01:32 +0530 Subject: [PATCH 116/255] [ticket/10815] enables feed feature by default for a fresh install PHPBB3-10815 --- phpBB/install/schemas/schema_data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index fcc372ae93..efc81e37c0 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -99,7 +99,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_package_size INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_pm_icons', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_post_confirm', '1'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_enable', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_enable', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_http_auth', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_limit_post', '15'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_limit_topic', '10'); From de70b17b1dc19e19faa0d56395a1aba8868c9624 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Fri, 20 Apr 2012 23:50:49 -0500 Subject: [PATCH 117/255] [ticket/10492] Separate config generation from the installer PHPBB3-10492 --- phpBB/includes/functions_install.php | 52 +++++++++++++++++++ phpBB/install/install_install.php | 28 +--------- .../phpbb_database_test_case.php | 40 ++------------ .../phpbb_test_case_helpers.php | 45 ++++++++++++++++ 4 files changed, 102 insertions(+), 63 deletions(-) diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 6caa5c943f..633b2755f0 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -512,4 +512,56 @@ function adjust_language_keys_callback($matches) } } +/** +* Creates the output to be stored in a phpBB config.php file +* +* @param array $data Array containing the database connection information +* @param string $dbms The name of the DBAL class to use +* @param array $load_extensions Array of additional extensions that should be loaded +* @param bool $debug If the debug constants should be enabled by default or not +* +* @return string The output to write to the file +*/ +function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug = false) +{ + $load_extensions = implode(',', $load_extensions); + + $config_data = " $dbms, + 'dbhost' => $data['dbhost'], + 'dbport' => $data['dbport'], + 'dbname' => $data['dbname'], + 'dbuser' => $data['dbuser'], + 'dbpasswd' => htmlspecialchars_decode($data['dbpasswd']), + 'table_prefix' => $data['table_prefix'], + 'acm_type' => 'file', + 'load_extensions' => $load_extensions, + ); + + foreach ($config_data_array as $key => $value) + { + $config_data .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n"; + } + + $config_data .= "\n@define('PHPBB_INSTALLED', true);\n"; + + if ($debug) + { + $config_data .= "@define('DEBUG', true);\n"; + $config_data .= "@define('DEBUG_EXTRA', true);\n"; + } + else + { + $config_data .= "// @define('DEBUG', true);\n"; + $config_data .= "// @define('DEBUG_EXTRA', true);\n"; + } + + $config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused! + + return $config_data; +} + ?> \ No newline at end of file diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 454c8b4df0..81dac9ecde 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -884,34 +884,8 @@ class install_install extends module @chmod($phpbb_root_path . 'cache/install_lock', 0777); - $load_extensions = implode(',', $load_extensions); - // Time to convert the data provided into a config file - $config_data = " $available_dbms[$data['dbms']]['DRIVER'], - 'dbhost' => $data['dbhost'], - 'dbport' => $data['dbport'], - 'dbname' => $data['dbname'], - 'dbuser' => $data['dbuser'], - 'dbpasswd' => htmlspecialchars_decode($data['dbpasswd']), - 'table_prefix' => $data['table_prefix'], - 'acm_type' => 'file', - 'load_extensions' => $load_extensions, - ); - - foreach ($config_data_array as $key => $value) - { - $config_data .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n"; - } - unset($config_data_array); - - $config_data .= "\n@define('PHPBB_INSTALLED', true);\n"; - $config_data .= "// @define('DEBUG', true);\n"; - $config_data .= "// @define('DEBUG_EXTRA', true);\n"; - $config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused! + $config_data = phpbb_create_config_file_data($data, $available_dbms[$data['dbms']]['DRIVER'], $load_extensions); // Attempt to write out the config file directly. If it works, this is the easiest way to do it ... if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx)) || phpbb_is_writable($phpbb_root_path)) diff --git a/tests/test_framework/phpbb_database_test_case.php b/tests/test_framework/phpbb_database_test_case.php index fdb662b284..e742b543b0 100644 --- a/tests/test_framework/phpbb_database_test_case.php +++ b/tests/test_framework/phpbb_database_test_case.php @@ -40,46 +40,14 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test public function get_database_config() { - if (isset($_SERVER['PHPBB_TEST_DBMS'])) - { - return array( - 'dbms' => isset($_SERVER['PHPBB_TEST_DBMS']) ? $_SERVER['PHPBB_TEST_DBMS'] : '', - 'dbhost' => isset($_SERVER['PHPBB_TEST_DBHOST']) ? $_SERVER['PHPBB_TEST_DBHOST'] : '', - 'dbport' => isset($_SERVER['PHPBB_TEST_DBPORT']) ? $_SERVER['PHPBB_TEST_DBPORT'] : '', - 'dbname' => isset($_SERVER['PHPBB_TEST_DBNAME']) ? $_SERVER['PHPBB_TEST_DBNAME'] : '', - 'dbuser' => isset($_SERVER['PHPBB_TEST_DBUSER']) ? $_SERVER['PHPBB_TEST_DBUSER'] : '', - 'dbpasswd' => isset($_SERVER['PHPBB_TEST_DBPASSWD']) ? $_SERVER['PHPBB_TEST_DBPASSWD'] : '', - ); - } - else if (file_exists(dirname(__FILE__) . '/../test_config.php')) - { - include(dirname(__FILE__) . '/../test_config.php'); + $config = phpbb_test_case_helpers::get_test_config(); - return array( - 'dbms' => $dbms, - 'dbhost' => $dbhost, - 'dbport' => $dbport, - 'dbname' => $dbname, - 'dbuser' => $dbuser, - 'dbpasswd' => $dbpasswd, - ); - } - else if (extension_loaded('sqlite') && version_compare(PHPUnit_Runner_Version::id(), '3.4.15', '>=')) - { - // Silently use sqlite - return array( - 'dbms' => 'sqlite', - 'dbhost' => dirname(__FILE__) . '/../phpbb_unit_tests.sqlite2', // filename - 'dbport' => '', - 'dbname' => '', - 'dbuser' => '', - 'dbpasswd' => '', - ); - } - else + if (!isset($config['dbms'])) { $this->markTestSkipped('Missing test_config.php: See first error.'); } + + return $config; } public function getConnection() diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php index 9a7ab2d237..9c60969d76 100644 --- a/tests/test_framework/phpbb_test_case_helpers.php +++ b/tests/test_framework/phpbb_test_case_helpers.php @@ -41,4 +41,49 @@ class phpbb_test_case_helpers $this->expectedTriggerError = true; $this->test_case->setExpectedException($exceptionName, (string) $message, $errno); } + + static public function get_test_config() + { + $config = array(); + + if (extension_loaded('sqlite') && version_compare(PHPUnit_Runner_Version::id(), '3.4.15', '>=')) + { + $config = array_merge($config, array( + 'dbms' => 'sqlite', + 'dbhost' => dirname(__FILE__) . '/../phpbb_unit_tests.sqlite2', // filename + 'dbport' => '', + 'dbname' => '', + 'dbuser' => '', + 'dbpasswd' => '', + )); + } + + if (file_exists(dirname(__FILE__) . '/../test_config.php')) + { + include(dirname(__FILE__) . '/../test_config.php'); + + $config = array_merge($config, array( + 'dbms' => $dbms, + 'dbhost' => $dbhost, + 'dbport' => $dbport, + 'dbname' => $dbname, + 'dbuser' => $dbuser, + 'dbpasswd' => $dbpasswd, + )); + } + + if (isset($_SERVER['PHPBB_TEST_DBMS'])) + { + $config = array_merge($config, array( + 'dbms' => isset($_SERVER['PHPBB_TEST_DBMS']) ? $_SERVER['PHPBB_TEST_DBMS'] : '', + 'dbhost' => isset($_SERVER['PHPBB_TEST_DBHOST']) ? $_SERVER['PHPBB_TEST_DBHOST'] : '', + 'dbport' => isset($_SERVER['PHPBB_TEST_DBPORT']) ? $_SERVER['PHPBB_TEST_DBPORT'] : '', + 'dbname' => isset($_SERVER['PHPBB_TEST_DBNAME']) ? $_SERVER['PHPBB_TEST_DBNAME'] : '', + 'dbuser' => isset($_SERVER['PHPBB_TEST_DBUSER']) ? $_SERVER['PHPBB_TEST_DBUSER'] : '', + 'dbpasswd' => isset($_SERVER['PHPBB_TEST_DBPASSWD']) ? $_SERVER['PHPBB_TEST_DBPASSWD'] : '' + )); + } + + return $config; + } } From 2aa994b5ad76941689e7993707509e48438c500b Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Sat, 21 Apr 2012 04:37:57 -0500 Subject: [PATCH 118/255] [ticket/10492] Backporting functional tests PHPBB3-10492 --- phpunit.xml.all | 4 + phpunit.xml.dist | 5 + phpunit.xml.functional | 35 ++++ tests/bootstrap.php | 5 + tests/functional/browse_test.php | 26 +++ .../phpbb_functional_test_case.php | 164 ++++++++++++++++++ .../phpbb_test_case_helpers.php | 12 ++ vendor/goutte.phar | Bin 0 -> 267414 bytes 8 files changed, 251 insertions(+) create mode 100644 phpunit.xml.functional create mode 100644 tests/functional/browse_test.php create mode 100644 tests/test_framework/phpbb_functional_test_case.php create mode 100644 vendor/goutte.phar diff --git a/phpunit.xml.all b/phpunit.xml.all index 1be2830729..9e220ff559 100644 --- a/phpunit.xml.all +++ b/phpunit.xml.all @@ -14,6 +14,10 @@ ./tests/ + ./tests/functional + + + ./tests/functional diff --git a/phpunit.xml.dist b/phpunit.xml.dist index de8134da8e..f8bf063d9a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,11 +14,16 @@ ./tests/ + ./tests/functional + + + ./tests/functional + functional slow diff --git a/phpunit.xml.functional b/phpunit.xml.functional new file mode 100644 index 0000000000..376d52e6d8 --- /dev/null +++ b/phpunit.xml.functional @@ -0,0 +1,35 @@ + + + + + + ./tests/ + ./tests/functional + + + ./tests/functional + + + + + + functional + + + + + + ./tests/ + + + diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 2fb805043e..d6c5d25bc8 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -19,3 +19,8 @@ require_once 'test_framework/phpbb_test_case_helpers.php'; require_once 'test_framework/phpbb_test_case.php'; require_once 'test_framework/phpbb_database_test_case.php'; require_once 'test_framework/phpbb_database_test_connection_manager.php'; + +if (version_compare(PHP_VERSION, '5.3.0-dev', '>=')) +{ + require_once 'test_framework/phpbb_functional_test_case.php'; +} diff --git a/tests/functional/browse_test.php b/tests/functional/browse_test.php new file mode 100644 index 0000000000..d056003578 --- /dev/null +++ b/tests/functional/browse_test.php @@ -0,0 +1,26 @@ +request('GET', 'index.php'); + $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); + } + + public function test_viewforum() + { + $crawler = $this->request('GET', 'viewforum.php?f=2'); + $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); + } +} diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php new file mode 100644 index 0000000000..b5e6f7e377 --- /dev/null +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -0,0 +1,164 @@ +markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.'); + } + + $this->client = new Goutte\Client(); + $this->root_url = self::$config['phpbb_functional_url']; + } + + public function request($method, $path) + { + return $this->client->request($method, $this->root_url . $path); + } + + // bootstrap, called after board is set up + // once per test case class + // test cases can override this + protected function bootstrap() + { + } + + public function __construct($name = NULL, array $data = array(), $dataName = '') + { + parent::__construct($name, $data, $dataName); + + $this->backupStaticAttributesBlacklist += array( + 'phpbb_functional_test_case' => array('config', 'already_installed'), + ); + + if (!static::$already_installed) + { + $this->install_board(); + $this->bootstrap(); + static::$already_installed = true; + } + } + + protected function install_board() + { + global $phpbb_root_path, $phpEx; + + self::$config = phpbb_test_case_helpers::get_test_config(); + + if (!isset(self::$config['phpbb_functional_url'])) + { + return; + } + + self::$config['table_prefix'] = 'phpbb_'; + $this->recreate_database(self::$config); + + if (file_exists($phpbb_root_path . "config.$phpEx")) + { + if (!file_exists($phpbb_root_path . "config_dev.$phpEx")) + { + rename($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_dev.$phpEx"); + } + else + { + unlink($phpbb_root_path . "config.$phpEx"); + } + } + + // begin data + $data = array(); + + $data = array_merge($data, self::$config); + + $data = array_merge($data, array( + 'default_lang' => 'en', + 'admin_name' => 'admin', + 'admin_pass1' => 'admin', + 'admin_pass2' => 'admin', + 'board_email' => 'nobody@example.com', + )); + + $parseURL = parse_url(self::$config['phpbb_functional_url']); + + $data = array_merge($data, array( + 'email_enable' => false, + 'smtp_delivery' => false, + 'smtp_host' => '', + 'smtp_auth' => '', + 'smtp_user' => '', + 'smtp_pass' => '', + 'cookie_secure' => false, + 'force_server_vars' => false, + 'server_protocol' => $parseURL['scheme'] . '://', + 'server_name' => 'localhost', + 'server_port' => isset($parseURL['port']) ? (int) $parseURL['port'] : 80, + 'script_path' => $parseURL['path'], + )); + // end data + + $content = $this->do_request('install'); + $this->assertContains('Welcome to Installation', $content); + + $this->do_request('create_table', $data); + + file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], array(), true)); + + $this->do_request('config_file', $data); + + copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx"); + + $this->do_request('final', $data); + } + + private function do_request($sub, $post_data = null) + { + $context = null; + + if ($post_data) + { + $context = stream_context_create(array( + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-Type: application/x-www-form-urlencoded', + 'content' => http_build_query($post_data), + 'ignore_errors' => true, + ), + )); + } + + return file_get_contents(self::$config['phpbb_functional_url'] . 'install/index.php?mode=install&sub=' . $sub, false, $context); + } + + private function recreate_database($config) + { + $db_conn_mgr = new phpbb_database_test_connection_manager($config); + $db_conn_mgr->recreate_db(); + } +} diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php index 9c60969d76..b46c36efaa 100644 --- a/tests/test_framework/phpbb_test_case_helpers.php +++ b/tests/test_framework/phpbb_test_case_helpers.php @@ -70,6 +70,11 @@ class phpbb_test_case_helpers 'dbuser' => $dbuser, 'dbpasswd' => $dbpasswd, )); + + if (isset($phpbb_functional_url)) + { + $config['phpbb_functional_url'] = $phpbb_functional_url; + } } if (isset($_SERVER['PHPBB_TEST_DBMS'])) @@ -84,6 +89,13 @@ class phpbb_test_case_helpers )); } + if (isset($_SERVER['PHPBB_FUNCTIONAL_URL'])) + { + $config = array_merge($config, array( + 'phpbb_functional_url' => isset($_SERVER['PHPBB_FUNCTIONAL_URL']) ? $_SERVER['PHPBB_FUNCTIONAL_URL'] : '', + )); + } + return $config; } } diff --git a/vendor/goutte.phar b/vendor/goutte.phar new file mode 100644 index 0000000000000000000000000000000000000000..20b7166a6717aa5b904859fc1ffe3b32106d55a8 GIT binary patch literal 267414 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 L-+lYd^KbrtSl@Ba literal 0 HcmV?d00001 From 6293bbf09949335bb8101bcef8f043750d756dc9 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Sat, 21 Apr 2012 05:24:57 -0500 Subject: [PATCH 119/255] [ticket/10492] Fix line endings PHPBB3-10492 --- tests/functional/browse_test.php | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tests/functional/browse_test.php b/tests/functional/browse_test.php index d056003578..723cf93232 100644 --- a/tests/functional/browse_test.php +++ b/tests/functional/browse_test.php @@ -1,26 +1,26 @@ -request('GET', 'index.php'); - $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); - } - - public function test_viewforum() - { - $crawler = $this->request('GET', 'viewforum.php?f=2'); - $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); - } -} +request('GET', 'index.php'); + $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); + } + + public function test_viewforum() + { + $crawler = $this->request('GET', 'viewforum.php?f=2'); + $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); + } +} From a21b367b21d811a3673145572b0bdd123ccc4767 Mon Sep 17 00:00:00 2001 From: galaxyAbstractor Date: Sat, 21 Apr 2012 14:16:55 +0200 Subject: [PATCH 120/255] [ticket/10836] Enable avatars by default at install Enables avatars and local avatar upload by default. PHPBB3-10836 --- phpBB/install/schemas/schema_data.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index efc81e37c0..ba2d18da00 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -8,10 +8,10 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('active_sessions', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_attachments', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_autologin', '1'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_local', '0'); 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_avatar_upload', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_remote_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'); From 8cf0b79a4746b416e66264cc3313f46d995b1783 Mon Sep 17 00:00:00 2001 From: David King Date: Mon, 23 Apr 2012 17:16:16 -0400 Subject: [PATCH 121/255] [task/functional] Increase code coverage for functional tests PHPBB3-10758 --- tests/functional/auth_test.php | 40 ++++++++++ tests/functional/browse_test.php | 6 ++ tests/functional/lang_test.php | 37 +++++++++ .../phpbb_functional_test_case.php | 77 ++++++++++++++++++- 4 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 tests/functional/auth_test.php create mode 100644 tests/functional/lang_test.php diff --git a/tests/functional/auth_test.php b/tests/functional/auth_test.php new file mode 100644 index 0000000000..e955dcb4df --- /dev/null +++ b/tests/functional/auth_test.php @@ -0,0 +1,40 @@ +login(); + + // check for logout link + $crawler = $this->request('GET', 'index.php'); + $this->assertContains($this->lang('LOGOUT_USER', 'admin'), $crawler->filter('.navbar')->text()); + } + + /** + * @depends test_login + */ + public function test_logout() + { + $this->login(); + $this->add_lang('ucp'); + + // logout + $crawler = $this->request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout'); + $this->assertContains($this->lang('LOGOUT_REDIRECT'), $crawler->filter('#message')->text()); + + // look for a register link, which should be visible only when logged out + $crawler = $this->request('GET', 'index.php'); + $this->assertContains($this->lang('REGISTER'), $crawler->filter('.navbar')->text()); + } +} diff --git a/tests/functional/browse_test.php b/tests/functional/browse_test.php index 723cf93232..26c18c4c1f 100644 --- a/tests/functional/browse_test.php +++ b/tests/functional/browse_test.php @@ -23,4 +23,10 @@ class phpbb_functional_browse_test extends phpbb_functional_test_case $crawler = $this->request('GET', 'viewforum.php?f=2'); $this->assertGreaterThan(0, $crawler->filter('.topiclist')->count()); } + + public function test_viewtopic() + { + $crawler = $this->request('GET', 'viewtopic.php?t=1'); + $this->assertGreaterThan(0, $crawler->filter('.postbody')->count()); + } } diff --git a/tests/functional/lang_test.php b/tests/functional/lang_test.php new file mode 100644 index 0000000000..f77dd511a3 --- /dev/null +++ b/tests/functional/lang_test.php @@ -0,0 +1,37 @@ +assertEquals('Board index', $this->lang('FORUM_INDEX')); + } + + public function test_add_lang() + { + $this->add_lang('ucp'); + + // Test a language string present only in the UCP language file + $this->assertEquals('Your account has now been activated. Thank you for registering.', $this->lang('ACCOUNT_ACTIVE')); + } + + public function test_add_langs() + { + $this->add_lang(array('groups', 'memberlist')); + + // Test a language string from each UCP and memberlist + $this->assertEquals('The selected group is already your default group.', $this->lang('ALREADY_DEFAULT_GROUP')); + $this->assertEquals('Profile', $this->lang('ABOUT_USER')); + } +} diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index b5e6f7e377..f14e214a78 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -6,6 +6,7 @@ * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 * */ +use Symfony\Component\BrowserKit\CookieJar; require_once __DIR__ . '/../../phpBB/includes/functions_install.php'; @@ -13,6 +14,14 @@ class phpbb_functional_test_case extends phpbb_test_case { protected $client; protected $root_url; + /** + * @var string Session ID for current test's session (each test makes its own) + */ + protected $sid; + /** + * @var array Language array used by phpBB + */ + private $lang = array(); static protected $config = array(); static protected $already_installed = false; @@ -34,8 +43,13 @@ class phpbb_functional_test_case extends phpbb_test_case $this->markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.'); } - $this->client = new Goutte\Client(); + $this->cookieJar = new CookieJar; + $this->client = new Goutte\Client(array(), array(), null, $this->cookieJar); $this->root_url = self::$config['phpbb_functional_url']; + // Clear the language array so that things + // that were added in other tests are gone + $this->lang = array(); + $this->add_lang('common'); } public function request($method, $path) @@ -161,4 +175,65 @@ class phpbb_functional_test_case extends phpbb_test_case $db_conn_mgr = new phpbb_database_test_connection_manager($config); $db_conn_mgr->recreate_db(); } + + protected function login() + { + $this->add_lang('ucp'); + + $crawler = $this->request('GET', 'ucp.php'); + $this->assertContains($this->lang('LOGIN_EXPLAIN_UCP'), $crawler->filter('html')->text()); + + $form = $crawler->selectButton($this->lang('LOGIN'))->form(); + $login = $this->client->submit($form, array('username' => 'admin', 'password' => 'admin')); + + $cookies = $this->cookieJar->all(); + $sid = ''; + // get the SID from the cookie + foreach ($cookies as $key => $cookie); + { + if (substr($key, -4) == '_sid') + { + $this->sid = $cookie->getValue(); + } + } + } + + protected function add_lang($lang_file) + { + global $phpbb_root_path, $phpEx; + + if (is_array($lang_file)) + { + foreach ($lang_file as $file) + { + $this->add_lang($file); + } + } + + $lang_path = "{$phpbb_root_path}language/en/$lang_file.$phpEx"; + + $lang = array(); + + if (file_exists($lang_path)) + { + include($lang_path); + } + + $this->lang = array_merge($this->lang, $lang); + } + + protected function lang() + { + $args = func_get_args(); + $key = $args[0]; + + if (empty($this->lang[$key])) + { + throw new Exception('Language key "' . $key . '" could not be found.'); + } + + $args[0] = $this->lang[$key]; + + return call_user_func_array('sprintf', $args); + } } From b82c77b38f69aa2d8030ee848042a0169592878b Mon Sep 17 00:00:00 2001 From: David King Date: Tue, 24 Apr 2012 14:10:50 -0400 Subject: [PATCH 122/255] [task/functional] Make sure missing language values are handled properly PHPBB3-10758 --- tests/functional/lang_test.php | 8 ++++++++ tests/test_framework/phpbb_functional_test_case.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/functional/lang_test.php b/tests/functional/lang_test.php index f77dd511a3..053806a431 100644 --- a/tests/functional/lang_test.php +++ b/tests/functional/lang_test.php @@ -18,6 +18,14 @@ class phpbb_functional_lang_test extends phpbb_functional_test_case $this->assertEquals('Board index', $this->lang('FORUM_INDEX')); } + /** + * @expectedException RuntimeException + */ + public function test_lang_missing() + { + $this->assertEquals('Your account has now been activated. Thank you for registering.', $this->lang('ACCOUNT_ACTIVE')); + } + public function test_add_lang() { $this->add_lang('ucp'); diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index f14e214a78..177f93cf3b 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -229,7 +229,7 @@ class phpbb_functional_test_case extends phpbb_test_case if (empty($this->lang[$key])) { - throw new Exception('Language key "' . $key . '" could not be found.'); + throw new RuntimeException('Language key "' . $key . '" could not be found.'); } $args[0] = $this->lang[$key]; From 1a8db76a200bd0de0bf17acd89e87e4875513d4c Mon Sep 17 00:00:00 2001 From: galaxyAbstractor Date: Sat, 21 Apr 2012 22:52:11 +0200 Subject: [PATCH 123/255] [ticket/10836] Check if avatar directory is writable after install Check if the avatar directory is writeable after the installation is complete. If it isn't, disable avatars and avatar uploading by default. PHPBB3-10836 --- phpBB/install/install_install.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 81dac9ecde..35fc0bb58e 100644 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -105,6 +105,7 @@ class install_install extends module $this->add_language($mode, $sub); $this->add_bots($mode, $sub); $this->email_admin($mode, $sub); + $this->disable_avatars_if_unwritable(); // Remove the lock file @unlink($phpbb_root_path . 'cache/install_lock'); @@ -1941,6 +1942,21 @@ class install_install extends module )); } + /** + * Check if the avatar directory is writable and disable avatars + * if it isn't writable. + */ + function disable_avatars_if_unwritable() + { + global $phpbb_root_path; + + if (!phpbb_is_writable($phpbb_root_path . 'images/avatars/upload/')) + { + set_config('allow_avatar', 0); + set_config('allow_avatar_upload', 0); + } + } + /** * Generate a list of available mail server authentication methods */ From 02cc32b901d29df4b67c0d09c02370cbaf61170d Mon Sep 17 00:00:00 2001 From: Senky Date: Mon, 16 Apr 2012 15:19:10 +0200 Subject: [PATCH 124/255] [ticket/10161] coding-guidelines.html updated PHPBB3-10161 --- phpBB/docs/coding-guidelines.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html index 6d428916c7..e60d20cd43 100644 --- a/phpBB/docs/coding-guidelines.html +++ b/phpBB/docs/coding-guidelines.html @@ -356,7 +356,7 @@ phpbb_dir_subdir_class_name - includes/dir/subdir/class_name.php

    The basic philosophy here is to not hurt code clarity for the sake of laziness. This has to be balanced by a little bit of common sense, though; print_login_status_for_a_given_user() goes too far, for example -- that function would be better named print_user_login_status(), or just print_login_status().

    Special Namings:

    -

    For all emoticons use the term smiley in singular and smilies in plural.

    +

    For all emoticons use the term smiley in singular and smilies in plural. For emails we use the term email (without dash between “e” and “m”)

    2.ii. Code Layout

    From 0858a8023be7b01e308959383bc1f955dbd4bf2d Mon Sep 17 00:00:00 2001 From: Senky Date: Mon, 16 Apr 2012 23:53:11 +0200 Subject: [PATCH 125/255] [ticket/10161] added fullstop to the end of sentence PHPBB3-10161 --- phpBB/docs/coding-guidelines.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html index e60d20cd43..3f2c142ac6 100644 --- a/phpBB/docs/coding-guidelines.html +++ b/phpBB/docs/coding-guidelines.html @@ -356,7 +356,7 @@ phpbb_dir_subdir_class_name - includes/dir/subdir/class_name.php

    The basic philosophy here is to not hurt code clarity for the sake of laziness. This has to be balanced by a little bit of common sense, though; print_login_status_for_a_given_user() goes too far, for example -- that function would be better named print_user_login_status(), or just print_login_status().

    Special Namings:

    -

    For all emoticons use the term smiley in singular and smilies in plural. For emails we use the term email (without dash between “e” and “m”)

    +

    For all emoticons use the term smiley in singular and smilies in plural. For emails we use the term email (without dash between “e” and “m”).

    2.ii. Code Layout

    From 8d45901657801dcbf33ac2936559dbfe2ac373d8 Mon Sep 17 00:00:00 2001 From: galaxyAbstractor Date: Fri, 27 Apr 2012 22:19:41 +0200 Subject: [PATCH 126/255] [ticket/10849] Added missing helptext for listitem Added the missing helptext for list item in subsilver2. PHPBB3-10849 --- phpBB/styles/subsilver2/template/posting_buttons.html | 1 + 1 file changed, 1 insertion(+) diff --git a/phpBB/styles/subsilver2/template/posting_buttons.html b/phpBB/styles/subsilver2/template/posting_buttons.html index a9105b5eec..cfe69dee56 100644 --- a/phpBB/styles/subsilver2/template/posting_buttons.html +++ b/phpBB/styles/subsilver2/template/posting_buttons.html @@ -16,6 +16,7 @@ q: '{LA_BBCODE_Q_HELP}', c: '{LA_BBCODE_C_HELP}', l: '{LA_BBCODE_L_HELP}', + e: '{LA_BBCODE_LISTITEM_HELP}', o: '{LA_BBCODE_O_HELP}', p: '{LA_BBCODE_P_HELP}', w: '{LA_BBCODE_W_HELP}', From 51347ebc09d18a55fa93fe86ef50a215148c935f Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Sun, 29 Apr 2012 00:30:08 +0300 Subject: [PATCH 127/255] [ticket/10800] Changing template paths in tests Changing template paths in tests from absolute to relative PHPBB3-10800 --- tests/template/template_includejs_test.php | 7 +++---- tests/template/template_locate_test.php | 6 +++--- tests/template/template_test.php | 2 +- tests/template/template_test_case.php | 4 +++- tests/template/template_test_case_with_tree.php | 4 ++-- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/template/template_includejs_test.php b/tests/template/template_includejs_test.php index 632fde61d1..d80254072b 100644 --- a/tests/template/template_includejs_test.php +++ b/tests/template/template_includejs_test.php @@ -17,11 +17,10 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes $this->setup_engine(array('assets_version' => 1)); // Prepare correct result - $dir = dirname(__FILE__); $scripts = array( - '', - '', - '' + '', + '', + '' ); // Run test diff --git a/tests/template/template_locate_test.php b/tests/template/template_locate_test.php index d6e2e82a47..be9ae06809 100644 --- a/tests/template/template_locate_test.php +++ b/tests/template/template_locate_test.php @@ -17,21 +17,21 @@ class phpbb_template_template_locate_test extends phpbb_template_template_test_c // First element of the array is test name - keep them distinct array( 'simple inheritance - only parent template exists', - dirname(__FILE__) . '/parent_templates/parent_only.html', + $this->test_path . '/parent_templates/parent_only.html', 'parent_only.html', false, true, ), array( 'simple inheritance - only child template exists', - dirname(__FILE__) . '/templates/child_only.html', + $this->test_path . '/templates/child_only.html', 'child_only.html', false, true, ), array( 'simple inheritance - both parent and child templates exist', - dirname(__FILE__) . '/templates/parent_and_child.html', + $this->test_path . '/templates/parent_and_child.html', 'parent_and_child.html', false, true, diff --git a/tests/template/template_test.php b/tests/template/template_test.php index 739bbe9387..f8677ed913 100644 --- a/tests/template/template_test.php +++ b/tests/template/template_test.php @@ -277,7 +277,7 @@ class phpbb_template_template_test extends phpbb_template_template_test_case $this->template->set_filenames(array('test' => $filename)); $this->assertFileNotExists($this->template_path . '/' . $filename, 'Testing missing file, file cannot exist'); - $expecting = sprintf('style resource locator: File for handle test does not exist. Could not find: %s', realpath($this->template_path . '/../') . '/templates/' . $filename); + $expecting = sprintf('style resource locator: File for handle test does not exist. Could not find: %s', $this->test_path . '/templates/' . $filename); $this->setExpectedTriggerError(E_USER_ERROR, $expecting); $this->display('test'); diff --git a/tests/template/template_test_case.php b/tests/template/template_test_case.php index d660aa3f56..dd0acba6cd 100644 --- a/tests/template/template_test_case.php +++ b/tests/template/template_test_case.php @@ -18,6 +18,8 @@ class phpbb_template_template_test_case extends phpbb_test_case protected $style_resource_locator; protected $style_provider; + protected $test_path = 'tests/template'; + // Keep the contents of the cache for debugging? const PRESERVE_CACHE = true; @@ -63,7 +65,7 @@ class phpbb_template_template_test_case extends phpbb_test_case $defaults = $this->config_defaults(); $config = new phpbb_config(array_merge($defaults, $new_config)); - $this->template_path = dirname(__FILE__) . '/templates'; + $this->template_path = $this->test_path . '/templates'; $this->style_resource_locator = new phpbb_style_resource_locator(); $this->style_provider = new phpbb_style_path_provider(); $this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); diff --git a/tests/template/template_test_case_with_tree.php b/tests/template/template_test_case_with_tree.php index 9522c97330..05ccb7ee55 100644 --- a/tests/template/template_test_case_with_tree.php +++ b/tests/template/template_test_case_with_tree.php @@ -18,8 +18,8 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat $defaults = $this->config_defaults(); $config = new phpbb_config(array_merge($defaults, $new_config)); - $this->template_path = dirname(__FILE__) . '/templates'; - $this->parent_template_path = dirname(__FILE__) . '/parent_templates'; + $this->template_path = $this->test_path . '/templates'; + $this->parent_template_path = $this->test_path . '/parent_templates'; $this->style_resource_locator = new phpbb_style_resource_locator(); $this->style_provider = new phpbb_style_path_provider(); $this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->style_resource_locator); From 3978e2620ea3ad50f80bc273542ff9dc830743fd Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Sun, 29 Apr 2012 19:07:48 +0100 Subject: [PATCH 128/255] [ticket/10855] Modified coding guidelines to reflect JS brace changes. Braces always go on the same line in JavaScript. PHPBB3-10855 --- phpBB/docs/coding-guidelines.html | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html index 3f2c142ac6..fbec59a6ff 100644 --- a/phpBB/docs/coding-guidelines.html +++ b/phpBB/docs/coding-guidelines.html @@ -397,7 +397,7 @@ for ($i = 0; $i < size; $i++)

    Where to put the braces:

    -

    This one is a bit of a holy war, but we're going to use a style that can be summed up in one sentence: Braces always go on their own line. The closing brace should also always be at the same column as the corresponding opening brace, examples:

    +

    In PHP code, braces always go on their own line. The closing brace should also always be at the same column as the corresponding opening brace, examples:

     if (condition)
    @@ -427,6 +427,30 @@ function do_stuff()
     	...
     }
     	
    + +

    In JavaScript code, braces always go on the same line:

    + +
    +if (condition) {
    +	while (condition2) {
    +		...
    +	}
    +} else {
    +	...
    +}
    +
    +for (var i = 0; i < size; i++) {
    +	...
    +}
    +
    +while (condition) {
    +	...
    +}
    +
    +function do_stuff() {
    +	...
    +}
    +	

    Use spaces between tokens:

    This is another simple, easy step that helps keep code readable without much effort. Whenever you write an assignment, expression, etc.. Always leave one space between the tokens. Basically, write code as if it was English. Put spaces between variable names and operators. Don't put spaces just after an opening bracket or before a closing bracket. Don't put spaces just before a comma or a semicolon. This is best shown with a few examples, examples:

    From b83fa0349ad30eefed3e8064d29793a9b3dd17f7 Mon Sep 17 00:00:00 2001 From: Senky Date: Mon, 30 Apr 2012 21:55:24 +0200 Subject: [PATCH 129/255] [ticket/10847] fixing all misspelled "dependant" to "dependent" PHPBB3-10847 --- phpBB/develop/create_schema_files.php | 2 +- phpBB/develop/mysql_upgrader.php | 2 +- phpBB/includes/db/db_tools.php | 2 +- phpBB/includes/utf/utf_tools.php | 2 +- phpBB/language/en/acp/board.php | 2 +- phpBB/viewtopic.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/phpBB/develop/create_schema_files.php b/phpBB/develop/create_schema_files.php index 4088657743..7a9bda32a0 100644 --- a/phpBB/develop/create_schema_files.php +++ b/phpBB/develop/create_schema_files.php @@ -397,7 +397,7 @@ foreach ($supported_dbms as $dbms) } } - // Adjust default value if db-dependant specified + // Adjust default value if db-dependent specified if (is_array($column_data[1])) { $column_data[1] = (isset($column_data[1][$dbms])) ? $column_data[1][$dbms] : $column_data[1]['default']; diff --git a/phpBB/develop/mysql_upgrader.php b/phpBB/develop/mysql_upgrader.php index 88596e9461..e2d8c97e8b 100644 --- a/phpBB/develop/mysql_upgrader.php +++ b/phpBB/develop/mysql_upgrader.php @@ -176,7 +176,7 @@ foreach ($schema_data as $table_name => $table_data) $column_type = $dbms_type_map['mysql_41'][$column_data[0]]; } - // Adjust default value if db-dependant specified + // Adjust default value if db-dependent specified if (is_array($column_data[1])) { $column_data[1] = (isset($column_data[1][$dbms])) ? $column_data[1][$dbms] : $column_data[1]['default']; diff --git a/phpBB/includes/db/db_tools.php b/phpBB/includes/db/db_tools.php index efb8b3ebd7..73eae4e967 100644 --- a/phpBB/includes/db/db_tools.php +++ b/phpBB/includes/db/db_tools.php @@ -1503,7 +1503,7 @@ class phpbb_db_tools $column_type = $this->dbms_type_map[$this->sql_layer][$column_data[0]]; } - // Adjust default value if db-dependant specified + // Adjust default value if db-dependent specified if (is_array($column_data[1])) { $column_data[1] = (isset($column_data[1][$this->sql_layer])) ? $column_data[1][$this->sql_layer] : $column_data[1]['default']; diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php index 9dc0634e5b..c402e15032 100644 --- a/phpBB/includes/utf/utf_tools.php +++ b/phpBB/includes/utf/utf_tools.php @@ -1933,7 +1933,7 @@ function utf8_wordwrap($string, $width = 75, $break = "\n", $cut = false) * UTF8-safe basename() function * * basename() has some limitations and is dependent on the locale setting -* according to the PHP manual. Therefore we provide our own locale independant +* according to the PHP manual. Therefore we provide our own locale independent * basename function. * * @param string $filename The filename basename() should be applied to diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php index 758ef8ed82..7e3c227893 100644 --- a/phpBB/language/en/acp/board.php +++ b/phpBB/language/en/acp/board.php @@ -411,7 +411,7 @@ $lang = array_merge($lang, array( // Server Settings $lang = array_merge($lang, array( - 'ACP_SERVER_SETTINGS_EXPLAIN' => 'Here you define server and domain dependant settings. Please ensure the data you enter is accurate, errors will result in emails containing incorrect information. When entering the domain name remember it does include http:// or other protocol term. Only alter the port number if you know your server uses a different value, port 80 is correct in most cases.', + 'ACP_SERVER_SETTINGS_EXPLAIN' => 'Here you define server and domain dependent settings. Please ensure the data you enter is accurate, errors will result in emails containing incorrect information. When entering the domain name remember it does include http:// or other protocol term. Only alter the port number if you know your server uses a different value, port 80 is correct in most cases.', 'ENABLE_GZIP' => 'Enable GZip compression', 'ENABLE_GZIP_EXPLAIN' => 'Generated content will be compressed prior to sending it to the user. This can reduce network traffic but will also increase CPU usage on both server and client side. Requires zlib PHP extension to be loaded.', diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 1f167ed722..b75f4aeccf 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -1099,7 +1099,7 @@ while ($row = $db->sql_fetchrow($result)) { $user_sig = ''; - // We add the signature to every posters entry because enable_sig is post dependant + // We add the signature to every posters entry because enable_sig is post dependent if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs')) { $user_sig = $row['user_sig']; From 665f38d42f8692f5eab76348568ddb46b372492d Mon Sep 17 00:00:00 2001 From: Senky Date: Mon, 30 Apr 2012 22:01:53 +0200 Subject: [PATCH 130/255] [ticket/10846] fixing SQL query bug in acp_main.php PHPBB3-10846 --- phpBB/includes/acp/acp_main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index e529ae0e5a..cffe296651 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -201,7 +201,7 @@ class acp_main // No maximum post id? :o if (!$max_post_id) { - $sql = 'SELECT MAX(post_id) + $sql = 'SELECT MAX(post_id) as max_post_id FROM ' . POSTS_TABLE; $result = $db->sql_query($sql); $max_post_id = (int) $db->sql_fetchfield('max_post_id'); From 2dd71f65204c8e484c81147e4966e33fcb7d1f42 Mon Sep 17 00:00:00 2001 From: Senky Date: Tue, 1 May 2012 09:52:48 +0200 Subject: [PATCH 131/255] [ticket/10835] fixing misleading message in UCP PHPBB3-10835 --- phpBB/language/en/ucp.php | 3 ++- phpBB/styles/prosilver/template/ucp_profile_reg_details.html | 4 ++-- phpBB/styles/subsilver2/template/ucp_profile_reg_details.html | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 3ebc863447..fb417a5742 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -137,7 +137,8 @@ $lang = array_merge($lang, array( 'CREATE_FOLDER' => 'Add folder…', 'CURRENT_IMAGE' => 'Current image', 'CURRENT_PASSWORD' => 'Current password', - 'CURRENT_PASSWORD_EXPLAIN' => 'You must confirm your current password if you wish to change it, alter your e-mail address or username.', + 'CURRENT_PASSWORD_EXPLAIN' => 'You must enter your current password if you wish to alter your e-mail address or username.', + 'CURRENT_CHANGE_PASSWORD_EXPLAIN' => 'You must enter your current password if you wish to change it, alter your e-mail address or username.', 'CUR_PASSWORD_EMPTY' => 'You did not enter your current password.', 'CUR_PASSWORD_ERROR' => 'The current password you entered is incorrect.', 'CUSTOM_DATEFORMAT' => 'Custom…', diff --git a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html index edd58d5e25..5eb55dc71c 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html +++ b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html @@ -45,7 +45,7 @@
    -

    {L_CURRENT_PASSWORD_EXPLAIN}
    +

    {L_CURRENT_CHANGE_PASSWORD_EXPLAIN}{L_CURRENT_PASSWORD_EXPLAIN}
    @@ -54,7 +54,7 @@
    - {S_HIDDEN_FIELDS}  + {S_HIDDEN_FIELDS}  {S_FORM_TOKEN}
    diff --git a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html index 78fb5a9628..09f60ad5a7 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html @@ -42,7 +42,7 @@ {L_CONFIRM_CHANGES} - {L_CURRENT_PASSWORD}:
    {L_CURRENT_PASSWORD_EXPLAIN} + {L_CURRENT_PASSWORD}:
    {L_CURRENT_CHANGE_PASSWORD_EXPLAIN}{L_CURRENT_PASSWORD_EXPLAIN} From 5114edcafe440df04357d789c03b390d6da48db5 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 1 May 2012 17:41:46 +0300 Subject: [PATCH 132/255] [ticket/10800] Changing html to js for includejs tests Changing .html to .js files for includejs tests PHPBB3-10800 --- tests/template/parent_templates/parent_and_child.js | 1 + tests/template/parent_templates/parent_only.js | 1 + tests/template/template_includejs_test.php | 8 ++++---- tests/template/templates/child_only.js | 1 + tests/template/templates/includejs.html | 4 ++-- tests/template/templates/parent_and_child.js | 1 + 6 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 tests/template/parent_templates/parent_and_child.js create mode 100644 tests/template/parent_templates/parent_only.js create mode 100644 tests/template/templates/child_only.js create mode 100644 tests/template/templates/parent_and_child.js diff --git a/tests/template/parent_templates/parent_and_child.js b/tests/template/parent_templates/parent_and_child.js new file mode 100644 index 0000000000..6d9bb163bf --- /dev/null +++ b/tests/template/parent_templates/parent_and_child.js @@ -0,0 +1 @@ +// JavaScript file in a parent style. diff --git a/tests/template/parent_templates/parent_only.js b/tests/template/parent_templates/parent_only.js new file mode 100644 index 0000000000..9c3007d83f --- /dev/null +++ b/tests/template/parent_templates/parent_only.js @@ -0,0 +1 @@ +// JavaScript file only in parent style. diff --git a/tests/template/template_includejs_test.php b/tests/template/template_includejs_test.php index d80254072b..a8f9a9037f 100644 --- a/tests/template/template_includejs_test.php +++ b/tests/template/template_includejs_test.php @@ -18,13 +18,13 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes // Prepare correct result $scripts = array( - '', - '', - '' + '', + '', + '' ); // Run test $cache_file = $this->template->cachepath . 'includejs.html.php'; - $this->run_template('includejs.html', array('PARENT' => 'parent_only.html'), array(), array(), implode('', $scripts), $cache_file); + $this->run_template('includejs.html', array('PARENT' => 'parent_only.js'), array(), array(), implode('', $scripts), $cache_file); } } diff --git a/tests/template/templates/child_only.js b/tests/template/templates/child_only.js new file mode 100644 index 0000000000..542b26526c --- /dev/null +++ b/tests/template/templates/child_only.js @@ -0,0 +1 @@ +// JavaScript file only in a child style. diff --git a/tests/template/templates/includejs.html b/tests/template/templates/includejs.html index 186fc30b43..8a2587d76b 100644 --- a/tests/template/templates/includejs.html +++ b/tests/template/templates/includejs.html @@ -1,5 +1,5 @@ - + - + {SCRIPTS} \ No newline at end of file diff --git a/tests/template/templates/parent_and_child.js b/tests/template/templates/parent_and_child.js new file mode 100644 index 0000000000..d544d94d83 --- /dev/null +++ b/tests/template/templates/parent_and_child.js @@ -0,0 +1 @@ +// JavaScript file in a child style. From 63b41913a472a688b5b85bdbbd01e45366449781 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Tue, 1 May 2012 18:25:11 +0300 Subject: [PATCH 133/255] [ticket/10799] Removing global variable from includejs Removing global $phpbb_root_path from includejs implementation PHPBB3-10799 --- phpBB/includes/template/filter.php | 4 ++-- phpBB/includes/template/template.php | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php index 4a2593b757..ad2e35de6a 100644 --- a/phpBB/includes/template/filter.php +++ b/phpBB/includes/template/filter.php @@ -905,12 +905,12 @@ class phpbb_template_filter extends php_user_filter if (substr($filename, 0, strlen($this->phpbb_root_path)) != $this->phpbb_root_path) { // Absolute path, include as is - return ' $_template->_js_include(\'' . addslashes($filename) . '\', false); '; + return ' $_template->_js_include(\'' . addslashes($filename) . '\', false, false); '; } // Relative path, remove root path from it $filename = substr($filename, strlen($this->phpbb_root_path)); - return ' global $phpbb_root_path; $_template->_js_include($phpbb_root_path . \'' . addslashes($filename) . '\', false); '; + return ' $_template->_js_include(\'' . addslashes($filename) . '\', false, true); '; } /** diff --git a/phpBB/includes/template/template.php b/phpBB/includes/template/template.php index e6512c8417..8ab3c44be3 100644 --- a/phpBB/includes/template/template.php +++ b/phpBB/includes/template/template.php @@ -496,14 +496,19 @@ class phpbb_template * * @param string $file file name * @param bool $locate True if file needs to be located + * @param bool $relative True if path is relative to phpBB root directory. Ignored if $locate == true */ - public function _js_include($file, $locate = false) + public function _js_include($file, $locate = false, $relative = false) { // Locate file if ($locate) { $file = $this->locator->get_first_file_location(array($file), true, true); } + else if ($relative) + { + $file = $this->phpbb_root_path . $file; + } $file .= (strpos($file, '?') === false) ? '?' : '&'; $file .= 'assets_version=' . $this->config['assets_version']; From 7294c7143144b06dde799936e7631493b1df4e6c Mon Sep 17 00:00:00 2001 From: Vinny Date: Thu, 26 Apr 2012 21:19:08 -0300 Subject: [PATCH 134/255] [ticket/10778] Remove extra space from close link in prosilver smilies window PHPBB3-10778 --- phpBB/styles/prosilver/template/posting_smilies.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/prosilver/template/posting_smilies.html b/phpBB/styles/prosilver/template/posting_smilies.html index 84191588e2..d3d6293586 100644 --- a/phpBB/styles/prosilver/template/posting_smilies.html +++ b/phpBB/styles/prosilver/template/posting_smilies.html @@ -18,6 +18,6 @@
    {PAGINATION}
    -{L_CLOSE_WINDOW} +{L_CLOSE_WINDOW} From ed67dcf3d83d40623471fe191fdc415289c59c21 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 2 May 2012 21:12:18 +0200 Subject: [PATCH 135/255] [ticket/10818] Global Announcements Update Dialog should call exit_handler() PHPBB3-10818 --- phpBB/install/database_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index a0892005d2..665db1f2f0 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -260,7 +260,7 @@ if ($has_global && !$ga_forum_id) Date: Thu, 3 May 2012 22:30:22 +0100 Subject: [PATCH 136/255] [ticket/10855] Added array trailing commas info in js to guidelines. PHPBB3-10855 --- phpBB/docs/coding-guidelines.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html index fbec59a6ff..be78ad0b3b 100644 --- a/phpBB/docs/coding-guidelines.html +++ b/phpBB/docs/coding-guidelines.html @@ -526,7 +526,7 @@ $post_url = "{$phpbb_root_path}posting.$phpEx?mode=$mode&amp;start=$start";

    In SQL statements mixing single and double quotes is partly allowed (following the guidelines listed here about SQL formatting), else one should try to only use one method - mostly single quotes.

    Commas after every array element:

    -

    If an array is defined with each element on its own line, you still have to modify the previous line to add a comma when appending a new element. PHP allows for trailing (useless) commas in array definitions. These should always be used so each element including the comma can be appended with a single line

    +

    If an array is defined with each element on its own line, you still have to modify the previous line to add a comma when appending a new element. PHP allows for trailing (useless) commas in array definitions. These should always be used so each element including the comma can be appended with a single line. In JavaScript, you should not use the trailing comma, as IE doesn't like it.

    // wrong

    
    From 06efa6c0beac3cb4fed0e7412c3b60f91f4181bb Mon Sep 17 00:00:00 2001
    From: Callum Macrae 
    Date: Thu, 3 May 2012 22:34:35 +0100
    Subject: [PATCH 137/255] [ticket/10855] Added JS camelCaps info to guidelines.
    
    PHPBB3-10855
    ---
     phpBB/docs/coding-guidelines.html | 10 ++++++++--
     1 file changed, 8 insertions(+), 2 deletions(-)
    
    diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html
    index be78ad0b3b..237bc18d20 100644
    --- a/phpBB/docs/coding-guidelines.html
    +++ b/phpBB/docs/coding-guidelines.html
    @@ -295,11 +295,17 @@ PHPBB_QA                   (Set board to QA-Mode, which means the updater also c
     	

    We will not be using any form of hungarian notation in our naming conventions. Many of us believe that hungarian naming is one of the primary code obfuscation techniques currently in use.

    Variable Names:

    -

    Variable names should be in all lowercase, with words separated by an underscore, example:

    +

    In PHP, variable names should be in all lowercase, with words separated by an underscore, example:

    $current_user is right, but $currentuser and $currentUser are not.

    + +

    In JavaScript, variable names should use camel caps:

    + +
    +

    currentUser is right, but currentuser and current_user are not.

    +

    Names should be descriptive, but concise. We don't want huge sentences as our variable names, but typing an extra couple of characters is always better than wondering what exactly a certain variable is for.

    @@ -317,7 +323,7 @@ for ($i = 0; $i < $outer_size; $i++)

    Function Names:

    -

    Functions should also be named descriptively. We're not programming in C here, we don't want to write functions called things like "stristr()". Again, all lower-case names with words separated by a single underscore character. Function names should preferably have a verb in them somewhere. Good function names are print_login_status(), get_user_data(), etc.

    +

    Functions should also be named descriptively. We're not programming in C here, we don't want to write functions called things like "stristr()". Again, all lower-case names with words separated by a single underscore character in PHP, and camel caps in JavaScript. Function names should preferably have a verb in them somewhere. Good function names are print_login_status(), get_user_data(), etc. Constructor functions in JavaScript should begin with a capital letter.

    Function Arguments:

    Arguments are subject to the same guidelines as variable names. We don't want a bunch of functions like: do_stuff($a, $b, $c). In most cases, we'd like to be able to tell how to use a function by just looking at its declaration.

    From 0e906f2575892d25a359f3ad8020e8f66b91054d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=A8rejean?= Date: Fri, 4 May 2012 00:13:27 +0200 Subject: [PATCH 138/255] [task/10869] Remove PHP 5.2 check from .travis.yml The travis configuration file contains a statement that checks whether the test is ran against PHP 5.2 but as that version isn't tested at all the check can be removed. PHPBB3-10869 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 82f7d27e35..cc2383de57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_script: - sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi" - - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then pear install --force phpunit/DbUnit; else pyrus install --force phpunit/DbUnit; fi" + - pyrus install --force phpunit/DbUnit - phpenv rehash - cd phpBB - curl -s http://getcomposer.org/installer | php From fce0c5d436f7a2b3b8b39128b607e0e9d81018ea Mon Sep 17 00:00:00 2001 From: Bruno Ais Date: Fri, 4 May 2012 20:08:42 +0100 Subject: [PATCH 139/255] [ticket/10871] Delete the unwanted implode Deleted the implode that had no reason to be there PHPBB3-10871 --- phpBB/includes/mcp/mcp_queue.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php index 59fa8b7263..4d720a435c 100644 --- a/phpBB/includes/mcp/mcp_queue.php +++ b/phpBB/includes/mcp/mcp_queue.php @@ -268,8 +268,6 @@ class mcp_queue trigger_error('NOT_MODERATOR'); } - $forum_list = implode(', ', $forum_list); - $sql = 'SELECT SUM(forum_topics) as sum_forum_topics FROM ' . FORUMS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_list); From 58842b5ca8020b16a99f5420381a2b095bba89de Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Sat, 5 May 2012 16:01:07 -0400 Subject: [PATCH 140/255] [ticket/10834] Backport general development language changes to 3.0. PHPBB3-10688 PHPBB3-10834 --- phpBB/docs/README.html | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html index aa60d7dd25..fb30ef5cba 100644 --- a/phpBB/docs/README.html +++ b/phpBB/docs/README.html @@ -106,6 +106,7 @@
    • Updates from phpBB3 RC1 to the latest version
    • +
    • Note: if using the Automatic Update Package, updates are supported from phpBB 3.0.2 onward. To update a pre-3.0.2 installation, first update to 3.0.2 and then update to the current version.
    • Conversions from phpBB 2.0.x to the latest version
    • New installations of phpBB3 - always only the latest released version
    @@ -136,13 +137,13 @@

    This is the official location for all supported language sets. If you download a package from a 3rd party site you do so with the understanding that we cannot offer support. So please, do not ask for help in these cases!

    -

    Installation of these packages is straightforward, simply download the required language pack and unarchive it into the languages/ folder. Please ensure you retain the directory structure when doing this! Once uploaded go to the Admin->System->Language Packs and install the now appeared new language pack. To install the style imageset you should download the imageset for your language and unarchive the file/s into the relevant imageset directory (styles/prosilver/imageset or styles/subsilver2/imageset), again you must retain the directory structure. Once installed the imageset will become immediately available.

    +

    Installation of these packages is straightforward, simply download the required language pack and unarchive it into the languages/ folder. Please ensure you retain the directory structure when doing this! Once uploaded go to the Admin->System->Language Packs and install the now appearing new language pack. To install the style imageset you should download the imageset for your language and unarchive the file/s into the relevant imageset directory (styles/prosilver/imageset or styles/subsilver2/imageset), again you must retain the directory structure. Once installed the imageset will become immediately available.

    If your language is not available please visit our forums where you will find a topic listing translations currently available or in preparation. This topic also gives you information should you wish to volunteer to translate a language not currently listed.

    2.ii. Styles

    -

    Although phpBB Group are rather proud of the included styles we realise that it may not be to everyones tastes. Therefore phpBB3 allows styles to be switched with relative ease. Firstly you need to locate and download a style you like. We maintain such a site at

    +

    Although phpBB Group are rather proud of the included styles we realise that they may not be to everyone's tastes. Therefore phpBB3 allows styles to be switched with relative ease. Firstly you need to locate and download a style you like. We maintain such a site at

    http://www.phpbb.com/styles/

    @@ -192,7 +193,7 @@

    phpBB Group maintains a thriving community where a number of people have generously decided to donate their time to help support users. This site can be found at:

    -

    http://www.phpbb.com/

    +

    http://www.phpbb.com/community/

    If you do seek help via our forums please be sure to do a Search before posting. This may well save both you and us time and allow the developer, moderator and support groups to spend more time responding to people with unknown issues and problems. Please also remember that phpBB is an entirely volunteer effort, no one receives any compensation for the time they give, this includes moderators as well as developers. So please be respectful and mindful when awaiting responses.

    @@ -200,6 +201,8 @@

    Another place you may find help is our IRC channel. This operates on the Freenode IRC network, irc.freenode.net and the channel is #phpbb and can be accessed by any good IRC client such as mIRC, XChat, etc. Again, please do not abuse this service and be respectful of other users.

    +

    There are other IRC channels available, please see http://www.phpbb.com/support/irc/ for the complete list.

    + @@ -216,9 +219,9 @@
    -

    This is the third stable release of phpBB. The 3.0.x line is essentially feature frozen, with only point releases seeing fixes for bugs and security issues, though feature alterations and minor feature additions may be done if deemed absolutely required. Our next major release will be phpBB 3.2 and the planning phase has begun (the unstable development version is 3.1). Please do not post questions asking when 3.2 will be available, no release date has been set.

    +

    This is the third stable release of phpBB. The 3.0.x line is essentially feature frozen, with only point releases seeing fixes for bugs and security issues, though feature alterations and minor feature additions may be done if deemed absolutely required. Our next major release will be phpBB 3.1. Please do not post questions asking when 3.1 will be available, no release date has been set.

    -

    For those interested in the development of phpBB should keep an eye on the community forums to see how things are progressing:

    +

    Those interested in the development of phpBB should keep an eye on the development forums to see how things are progressing:

    http://area51.phpbb.com/phpBB/

    @@ -240,17 +243,17 @@
    -

    The phpBB Group uses a bug tracking system to store, list and manage all reported bugs, it can be found at the location listed below. Please DO NOT post bug reports to our forums, they will be locked. In addition please DO NOT use the bug tracker for support requests. Posting such a request will only see you directed to the support forums (while taking time away from working on real bugs).

    +

    The phpBB Group uses a bug tracking system to store, list and manage all reported bugs, it can be found at the location listed below. Please DO NOT post bug reports to our forums. In addition please DO NOT use the bug tracker for support requests. Posting such a request will only see you directed to the support forums (while taking time away from working on real bugs).

    -

    http://tracker.phpbb.com/

    +

    http://tracker.phpbb.com/browse/PHPBB3

    While we very much appreciate receiving bug reports (the more reports the more stable phpBB will be) we ask you carry out a few steps before adding new entries:

      -
    • Firstly determine if your bug is reproduceable, how to determine this depends on the bug in question. Only if the bug is reproduceable it is likely to be a problem with phpBB3 (or in some way connected). If something cannot be reproduced it may turn out to have been your hosting provider working on something, a user doing something silly, etc. Bug reports for non-reproduceable events can slow down our attempts to fix real, reproduceable issues

    • +
    • Firstly determine if your bug is reproduceable, how to determine this depends on the bug in question. Only if the bug is reproduceable it is likely to be a problem with phpBB3 (or in some way connected). If something cannot be reproduced it may turn out to have been your hosting provider working on something, a user doing something silly, etc. Bug reports for non-reproduceable events can slow down our attempts to fix real, reproduceable issues.

    • Next please read or search through the existing bug reports to see if your bug (or one very similar to it) is already listed. If it is please add to that existing bug rather than creating a new duplicate entry (all this does is slow us down).

    • -
    • Check the forums (use search!) to see if people have discussed anything that sounds similar to what you are seeing. However, as noted above please DO NOT post your particular bug to the forum unless it's non-reproduceable or you are sure it's related to something you have done rather phpBB3

    • -
    • If no existing bug exists then please feel free to add it
    • +
    • Check the forums (use search!) to see if people have discussed anything that sounds similar to what you are seeing. However, as noted above please DO NOT post your particular bug to the forum unless it's non-reproduceable or you are sure it's related to something you have done rather phpBB3.

    • +
    • If no existing bug exists then please feel free to add it.

    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:

    @@ -261,10 +264,12 @@
  • DB type/version, e.g. MySQL 4.0.1, PostgreSQL 7.3.2, MSSQL Server 2000 SP1, etc.
  • -

    The relevant database type/version is listed within the administration control panel

    +

    The relevant database type/version is listed within the administration control panel.

    Please also be as detailed as you can in your report, if possible list the steps required to duplicate the problem. If you have a patch that fixes the issue, please attach it to the ticket or submit a pull request on GitHub.

    +

    If you create a patch, it is very much appreciated (but not required) if you follow the phpBB coding guidelines. Please note that the coding guidelines are somewhat different between different versions of phpBB. For phpBB 3.0.x the coding guidelines may be found here: http://area51.phpbb.com/docs/30x/coding-guidelines.html

    +

    Once a bug has been submitted you will be emailed any follow up comments added to it. Please if you are requested to supply additional information, do so! It is frustrating for us to receive bug reports, ask for additional information but get nothing. In these cases we have a policy of closing the bug, which may leave a very real problem in place. Obviously we would rather not have this situation arise.

    5.i. Security related bugs

    @@ -317,7 +322,7 @@

    Please remember that running any application on a developmental version of PHP can lead to strange/unexpected results which may appear to be bugs in the application (which may not be true). Therefore we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a developmental version of PHP please check any bugs you find on a system running a stable release before submitting.

    -

    This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MSSQL Server 2000, PostgreSQL 7.x, Oracle 8, SQLite and Firebird. Versions of PHP used range from 4.3.3 to 6.0.0-dev without problem.

    +

    This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MSSQL Server 2000, PostgreSQL 7.x, Oracle 8, SQLite and Firebird. Versions of PHP used range from 4.3.3 to 5.4.x without problem.

    7.i. Notice on PHP security issues

    From c34ee343ba1ff0c401f3a04216e9e7ffb9a1a859 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Sat, 5 May 2012 16:08:37 -0400 Subject: [PATCH 141/255] [ticket/10843] Backport changes to install language. PHPBB3-10688 PHPBB3-10843 --- phpBB/docs/INSTALL.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index c54e408be2..6ab118e3ee 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -141,13 +141,13 @@
  • PostgreSQL 7.3+
  • SQLite 2.8.2+
  • Firebird 2.1+
  • -
  • MS SQL Server 2000 or above (directly or via ODBC)
  • +
  • MS SQL Server 2000 or above (directly or via ODBC or the native adapter)
  • Oracle
  • -
  • PHP 4.3.3+ (>=4.3.3, >4.4.x, >5.x.x, >6.0-dev (compatible)) with support for the database you intend to use.
  • +
  • PHP 4.3.3+ (>=4.3.3, >=4.4.x, >=5.x.x, >=5.4.x) with support for the database you intend to use.
  • getimagesize() function need to be enabled.
  • -
  • These optional presence of the following modules within PHP will provide access to additional features, but they are not required. +
  • Presence of the following modules within PHP will provide access to additional features, but they are not required:
    • zlib Compression support
    • Remote FTP support
    • @@ -182,7 +182,7 @@

      All .php, .inc, .sql, .cfg, .html and .txt files should be uploaded in ASCII mode, while all graphics should be uploaded in BINARY mode. If you are unfamiliar with what this means please refer to your FTP client documentation. In most cases this is all handled transparantly by your ftp client but if you encounter problems later you should be sure the files where uploaded correctly as described here.

      -

      phpBB3 comes supplied with english as its standard language. However a number of separate packs for different languages are available. If you are not a native english speaker you may wish to install one or more of these packages before continuing. The installation process below will allow you to select a default language from those available (you can of course change this default at a later stage). For more details of language packs, where to obtain them and how to install them please see the README.

      +

      phpBB3 comes supplied with British English as its standard language. However a number of separate packs for different languages are available. If you are not a native English speaker you may wish to install one or more of these packages before continuing. The installation process below will allow you to select a default language from those available (you can of course change this default at a later stage). For more details of language packs, where to obtain them and how to install them please see the README.

      Once all the files have been uploaded to your site you should point your browser at this location with the addition of install/. For example if your domain name is www.mydomain.tld and you placed phpBB3 in a directory /phpBB3 off your web root you would enter http://www.mydomain.tld/phpBB3/install/ or (alternatively) http://www.mydomain.tld/phpBB3/install/index.php into your browser. When you have done this you should see the phpBB3 Installation screen appear.

      From a960bd6790a60bd1023e632230848e9e786c8921 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Sun, 6 May 2012 19:37:49 +0300 Subject: [PATCH 142/255] [ticket/10860] Fixing js error in updater Fixing javascript error in side-by-side diff styling in updater: resizing inner block instead of outer block and increasing height by inner/outer block difference. PHPBB3-10860 --- phpBB/adm/style/install_update_diff.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html index b65a014312..15ea00141d 100644 --- a/phpBB/adm/style/install_update_diff.html +++ b/phpBB/adm/style/install_update_diff.html @@ -15,12 +15,12 @@ // Date: Mon, 7 May 2012 08:18:50 +0200 Subject: [PATCH 143/255] [ticket/10835] changing CURRENT_CHANGE_PASSWORD_EXPLAIN language entry PHPBB3-10835 --- phpBB/language/en/ucp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index fb417a5742..6f6b319d48 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -138,7 +138,7 @@ $lang = array_merge($lang, array( 'CURRENT_IMAGE' => 'Current image', 'CURRENT_PASSWORD' => 'Current password', 'CURRENT_PASSWORD_EXPLAIN' => 'You must enter your current password if you wish to alter your e-mail address or username.', - 'CURRENT_CHANGE_PASSWORD_EXPLAIN' => 'You must enter your current password if you wish to change it, alter your e-mail address or username.', + 'CURRENT_CHANGE_PASSWORD_EXPLAIN' => 'To change your password, your email address, or your username, you must enter your current password.', 'CUR_PASSWORD_EMPTY' => 'You did not enter your current password.', 'CUR_PASSWORD_ERROR' => 'The current password you entered is incorrect.', 'CUSTOM_DATEFORMAT' => 'Custom…', From 5b96b5fce7283ebd52f88ef6daa3c8233a7df1ec Mon Sep 17 00:00:00 2001 From: David King Date: Mon, 7 May 2012 10:39:49 -0400 Subject: [PATCH 144/255] [ticket/10837] Removed tearDownAfterClass() from extension_controller_test.php PHPBB3-10837 --- tests/functional/extension_controller_test.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/functional/extension_controller_test.php b/tests/functional/extension_controller_test.php index 4ee0e68718..e9409d9d3f 100644 --- a/tests/functional/extension_controller_test.php +++ b/tests/functional/extension_controller_test.php @@ -65,15 +65,6 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c } } - public static function tearDownAfterClass() - { - $phpbb_root_path = self::$config['phpbb_functional_path']; - - // @todo delete the fixtures from the $phpbb_root_path board - // Note that it might be best to find a public domain function - // and port it into here instead of writing it from scratch - } - public function setUp() { parent::setUp(); From e52d23848a1b116d32fbad9dd384e0755553b829 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Tue, 8 May 2012 18:44:43 -0500 Subject: [PATCH 145/255] [ticket/10858] Fix MSSQL Native's row seeking behavior The result_mssqlnative class remains in case someone wants to use it PHPBB3-10858 --- phpBB/includes/db/mssqlnative.php | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/db/mssqlnative.php b/phpBB/includes/db/mssqlnative.php index 7fbc374e77..6391664a3e 100644 --- a/phpBB/includes/db/mssqlnative.php +++ b/phpBB/includes/db/mssqlnative.php @@ -447,14 +447,39 @@ class dbal_mssqlnative extends dbal { global $cache; + if ($query_id === false) + { + $query_id = $this->query_result; + } + if (isset($cache->sql_rowset[$query_id])) { return $cache->sql_rowseek($rownum, $query_id); } - $seek = new result_mssqlnative($query_id); - $row = $seek->seek($rownum); - return ($row = $seek->fetch()) ? $row : false; + if ($query_id === false) + { + return false; + } + + $this->sql_freeresult($query_id); + $query_id = $this->sql_query($this->last_query_text); + + if ($query_id === false) + { + return false; + } + + // We do not fetch the row for rownum == 0 because then the next resultset would be the second row + for ($i = 0; $i < $rownum; $i++) + { + if (!$this->sql_fetchrow($query_id)) + { + return false; + } + } + + return true; } /** From afbaa6979b62acb16fa09247ec4613d5d7d683fa Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Tue, 8 May 2012 18:45:51 -0500 Subject: [PATCH 146/255] [ticket/10858] Tests for row seeking with fetchfield() PHPBB3-10858 --- tests/dbal/select_test.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/dbal/select_test.php b/tests/dbal/select_test.php index 21b12777dc..1b04450fcd 100644 --- a/tests/dbal/select_test.php +++ b/tests/dbal/select_test.php @@ -125,6 +125,32 @@ class phpbb_dbal_select_test extends phpbb_database_test_case $this->assertEquals($expected, $ary); } + public static function fetchfield_seek_data() + { + return array( + array(1, 'foobar'), + array(0, 'barfoo'), + array(2, 'bertie'), + ); + } + + /** + * @dataProvider fetchfield_seek_data + */ + public function test_fetchfield_seek($rownum, $expected) + { + $db = $this->new_dbal(); + + $result = $db->sql_query('SELECT username_clean + FROM phpbb_users + ORDER BY user_id ASC'); + + $field = $db->sql_fetchfield('username_clean', $rownum, $result); + $db->sql_freeresult($result); + + $this->assertEquals($expected, $field); + } + public static function query_limit_data() { return array( From 09d49fb7b2be51a29f5a03c0a1a3816d7e55a466 Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Tue, 8 May 2012 19:41:22 -0500 Subject: [PATCH 147/255] [ticket/10858] Move generic row seeking to DBAL Removed from: firebird, mssql_odbc, and mssqlnative PHPBB3-10858 --- phpBB/includes/db/dbal.php | 43 +++++++++++++++++++++++++++++++ phpBB/includes/db/firebird.php | 43 ------------------------------- phpBB/includes/db/mssql_odbc.php | 43 ------------------------------- phpBB/includes/db/mssqlnative.php | 43 ------------------------------- 4 files changed, 43 insertions(+), 129 deletions(-) diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php index 5d456c2ff0..358df50402 100644 --- a/phpBB/includes/db/dbal.php +++ b/phpBB/includes/db/dbal.php @@ -194,6 +194,49 @@ class dbal return false; } + /** + * Seek to given row number + * rownum is zero-based + */ + function sql_rowseek($rownum, &$query_id) + { + global $cache; + + if ($query_id === false) + { + $query_id = $this->query_result; + } + + if (isset($cache->sql_rowset[$query_id])) + { + return $cache->sql_rowseek($rownum, $query_id); + } + + if ($query_id === false) + { + return false; + } + + $this->sql_freeresult($query_id); + $query_id = $this->sql_query($this->last_query_text); + + if ($query_id === false) + { + return false; + } + + // We do not fetch the row for rownum == 0 because then the next resultset would be the second row + for ($i = 0; $i < $rownum; $i++) + { + if (!$this->sql_fetchrow($query_id)) + { + return false; + } + } + + return true; + } + /** * Fetch field * if rownum is false, the current row is used, else it is pointing to the row (zero-based) diff --git a/phpBB/includes/db/firebird.php b/phpBB/includes/db/firebird.php index 7e3f15ed1d..7072c58ac0 100644 --- a/phpBB/includes/db/firebird.php +++ b/phpBB/includes/db/firebird.php @@ -359,49 +359,6 @@ class dbal_firebird extends dbal return (sizeof($row)) ? $row : false; } - /** - * Seek to given row number - * rownum is zero-based - */ - function sql_rowseek($rownum, &$query_id) - { - global $cache; - - if ($query_id === false) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_rowseek($rownum, $query_id); - } - - if ($query_id === false) - { - return; - } - - $this->sql_freeresult($query_id); - $query_id = $this->sql_query($this->last_query_text); - - if ($query_id === false) - { - return false; - } - - // We do not fetch the row for rownum == 0 because then the next resultset would be the second row - for ($i = 0; $i < $rownum; $i++) - { - if (!$this->sql_fetchrow($query_id)) - { - return false; - } - } - - return true; - } - /** * Get last inserted id after insert statement */ diff --git a/phpBB/includes/db/mssql_odbc.php b/phpBB/includes/db/mssql_odbc.php index 75a080b1b7..34f7a87337 100644 --- a/phpBB/includes/db/mssql_odbc.php +++ b/phpBB/includes/db/mssql_odbc.php @@ -255,49 +255,6 @@ class dbal_mssql_odbc extends dbal return ($query_id !== false) ? @odbc_fetch_array($query_id) : false; } - /** - * Seek to given row number - * rownum is zero-based - */ - function sql_rowseek($rownum, &$query_id) - { - global $cache; - - if ($query_id === false) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_rowseek($rownum, $query_id); - } - - if ($query_id === false) - { - return false; - } - - $this->sql_freeresult($query_id); - $query_id = $this->sql_query($this->last_query_text); - - if ($query_id === false) - { - return false; - } - - // We do not fetch the row for rownum == 0 because then the next resultset would be the second row - for ($i = 0; $i < $rownum; $i++) - { - if (!$this->sql_fetchrow($query_id)) - { - return false; - } - } - - return true; - } - /** * Get last inserted id after insert statement */ diff --git a/phpBB/includes/db/mssqlnative.php b/phpBB/includes/db/mssqlnative.php index 6391664a3e..92ac9b1fb9 100644 --- a/phpBB/includes/db/mssqlnative.php +++ b/phpBB/includes/db/mssqlnative.php @@ -439,49 +439,6 @@ class dbal_mssqlnative extends dbal return $row; } - /** - * Seek to given row number - * rownum is zero-based - */ - function sql_rowseek($rownum, &$query_id) - { - global $cache; - - if ($query_id === false) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_rowseek($rownum, $query_id); - } - - if ($query_id === false) - { - return false; - } - - $this->sql_freeresult($query_id); - $query_id = $this->sql_query($this->last_query_text); - - if ($query_id === false) - { - return false; - } - - // We do not fetch the row for rownum == 0 because then the next resultset would be the second row - for ($i = 0; $i < $rownum; $i++) - { - if (!$this->sql_fetchrow($query_id)) - { - return false; - } - } - - return true; - } - /** * Get last inserted id after insert statement */ From 9a38a034e56fc6e30207f1fee385f0b18de0dcc2 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 10 May 2012 03:23:48 -0400 Subject: [PATCH 148/255] [ticket/10882] Add test for an invalid template tag. PHPBB3-10882 --- tests/template/invalid_constructs_test.php | 43 +++++++++++++++++++ .../templates/invalid/output/unknown_tag.html | 1 + .../templates/invalid/unknown_tag.html | 1 + 3 files changed, 45 insertions(+) create mode 100644 tests/template/invalid_constructs_test.php create mode 100644 tests/template/templates/invalid/output/unknown_tag.html create mode 100644 tests/template/templates/invalid/unknown_tag.html diff --git a/tests/template/invalid_constructs_test.php b/tests/template/invalid_constructs_test.php new file mode 100644 index 0000000000..08fb5d4289 --- /dev/null +++ b/tests/template/invalid_constructs_test.php @@ -0,0 +1,43 @@ +template->cachepath . str_replace('/', '.', $file) . '.php'; + + $this->assertFileNotExists($cache_file); + + $expected = file_get_contents(dirname(__FILE__) . '/templates/' . $expected); + // apparently the template engine does not put + // the trailing newline into compiled templates + $expected = trim($expected); + $this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file); + } +} diff --git a/tests/template/templates/invalid/output/unknown_tag.html b/tests/template/templates/invalid/output/unknown_tag.html new file mode 100644 index 0000000000..1489e5e31a --- /dev/null +++ b/tests/template/templates/invalid/output/unknown_tag.html @@ -0,0 +1 @@ + diff --git a/tests/template/templates/invalid/unknown_tag.html b/tests/template/templates/invalid/unknown_tag.html new file mode 100644 index 0000000000..1489e5e31a --- /dev/null +++ b/tests/template/templates/invalid/unknown_tag.html @@ -0,0 +1 @@ + From 720d07c9b3942a103ceedc1996fb11e13c1bc2f0 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 10 May 2012 03:28:54 -0400 Subject: [PATCH 149/255] [ticket/10882] Add test for an ENDIF without IF. PHPBB3-10882 --- tests/template/invalid_constructs_test.php | 12 ++++++++++++ .../template/templates/invalid/endif_without_if.html | 1 + .../templates/invalid/output/endif_without_if.html | 1 + 3 files changed, 14 insertions(+) create mode 100644 tests/template/templates/invalid/endif_without_if.html create mode 100644 tests/template/templates/invalid/output/endif_without_if.html diff --git a/tests/template/invalid_constructs_test.php b/tests/template/invalid_constructs_test.php index 08fb5d4289..8d54df5014 100644 --- a/tests/template/invalid_constructs_test.php +++ b/tests/template/invalid_constructs_test.php @@ -22,6 +22,18 @@ class phpbb_template_template_test extends phpbb_template_template_test_case array(), 'invalid/output/unknown_tag.html', ), + /* + * Produces a parse error which is fatal, therefore + * destroying the test suite. + array( + 'ENDIF without IF', + 'invalid/endif_without_if.html', + array(), + array(), + array(), + 'invalid/output/endif_without_if.html', + ), + */ ); } diff --git a/tests/template/templates/invalid/endif_without_if.html b/tests/template/templates/invalid/endif_without_if.html new file mode 100644 index 0000000000..e371ffd150 --- /dev/null +++ b/tests/template/templates/invalid/endif_without_if.html @@ -0,0 +1 @@ + diff --git a/tests/template/templates/invalid/output/endif_without_if.html b/tests/template/templates/invalid/output/endif_without_if.html new file mode 100644 index 0000000000..5f2239c964 --- /dev/null +++ b/tests/template/templates/invalid/output/endif_without_if.html @@ -0,0 +1 @@ +Parse error (fatal, destroys php runtime). From 56b2b87423c9afd62312fd36b5c2f6fff2d1d8a7 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 10 May 2012 03:36:58 -0400 Subject: [PATCH 150/255] [ticket/10882] Add a test for including a nonexistent file. PHPBB3-10882 --- tests/template/invalid_constructs_test.php | 32 +++++++++++++++++++ .../invalid/include_nonexistent_file.html | 1 + .../output/include_nonexistent_file.html | 1 + 3 files changed, 34 insertions(+) create mode 100644 tests/template/templates/invalid/include_nonexistent_file.html create mode 100644 tests/template/templates/invalid/output/include_nonexistent_file.html diff --git a/tests/template/invalid_constructs_test.php b/tests/template/invalid_constructs_test.php index 8d54df5014..2430b5b9b1 100644 --- a/tests/template/invalid_constructs_test.php +++ b/tests/template/invalid_constructs_test.php @@ -37,6 +37,21 @@ class phpbb_template_template_test extends phpbb_template_template_test_case ); } + public function template_data_error() + { + return array( + array( + 'Include a nonexistent file', + 'invalid/include_nonexistent_file.html', + array(), + array(), + array(), + E_USER_ERROR, + 'invalid/output/include_nonexistent_file.html', + ), + ); + } + /** * @dataProvider template_data */ @@ -52,4 +67,21 @@ class phpbb_template_template_test extends phpbb_template_template_test_case $expected = trim($expected); $this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file); } + + /** + * @dataProvider template_data_error + */ + public function test_template_error($description, $file, $vars, $block_vars, $destroy, $error, $expected) + { + $cache_file = $this->template->cachepath . str_replace('/', '.', $file) . '.php'; + + $this->assertFileNotExists($cache_file); + + $expected = file_get_contents(dirname(__FILE__) . '/templates/' . $expected); + // apparently the template engine does not put + // the trailing newline into compiled templates + $expected = trim($expected); + $this->setExpectedTriggerError($error, $expected); + $this->run_template($file, $vars, $block_vars, $destroy, '', $cache_file); + } } diff --git a/tests/template/templates/invalid/include_nonexistent_file.html b/tests/template/templates/invalid/include_nonexistent_file.html new file mode 100644 index 0000000000..617d2fdaaa --- /dev/null +++ b/tests/template/templates/invalid/include_nonexistent_file.html @@ -0,0 +1 @@ + diff --git a/tests/template/templates/invalid/output/include_nonexistent_file.html b/tests/template/templates/invalid/output/include_nonexistent_file.html new file mode 100644 index 0000000000..8a118d2713 --- /dev/null +++ b/tests/template/templates/invalid/output/include_nonexistent_file.html @@ -0,0 +1 @@ +style resource locator: File for handle nonexistent.html does not exist. Could not find: From 226743d10bd1c31095c8bf970de8698789ca6e61 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 10 May 2012 11:43:25 +0200 Subject: [PATCH 151/255] [ticket/10881] Replace old (and unify) file headers in develop files. This especially also fixes the problem of the copyright symbol being represented using 0xA9, which is neither ASCII nor the appropriate UTF8 byte sequence for the copyright symbol. PHPBB3-10881 --- phpBB/develop/add_permissions.php | 18 ++++++---------- phpBB/develop/calc_email_hash.php | 18 ++++++---------- phpBB/develop/change_smiley_ref.php | 24 ++++++--------------- phpBB/develop/check_flash_bbcodes.php | 4 +--- phpBB/develop/create_variable_overview.php | 22 ++++++++----------- phpBB/develop/fill.php | 17 +++++++-------- phpBB/develop/merge_attachment_tables.php | 18 ++++++---------- phpBB/develop/merge_post_tables.php | 25 ++++++---------------- phpBB/develop/mysql_upgrader.php | 1 - 9 files changed, 53 insertions(+), 94 deletions(-) diff --git a/phpBB/develop/add_permissions.php b/phpBB/develop/add_permissions.php index 035c23f49c..6f26bf6ac6 100644 --- a/phpBB/develop/add_permissions.php +++ b/phpBB/develop/add_permissions.php @@ -1,15 +1,11 @@ Date: Mon, 26 Mar 2012 22:59:35 +0530 Subject: [PATCH 152/255] [ticket/10308] disable retain/ delete posts option when deleting a user When deleting a user, it asks whether the posts by user should be retained or deleted. The selection should be disable if the user has no posts. PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index 9237e45daf..0eeb7cde8b 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -140,7 +140,7 @@ {L_DELETE_USER}

      {L_DELETE_USER_EXPLAIN}
      -
      +

      From 239e6016a308cd80135ebe9d7057c2eb102af29d Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Mon, 9 Apr 2012 02:21:45 +0530 Subject: [PATCH 153/255] [ticket/10308] Displays message to user if there are no posts. While deletng the user, if the user has no posts in addition to the options being disabled an added message is displayed. PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 3 +++ phpBB/language/en/acp/users.php | 1 + 2 files changed, 4 insertions(+) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index 0eeb7cde8b..b158995563 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -141,6 +141,9 @@


      {L_DELETE_USER_EXPLAIN}
      + +
      {L_NO_POSTS}
      +

      diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php index eda9659795..928699fd11 100644 --- a/phpBB/language/en/acp/users.php +++ b/phpBB/language/en/acp/users.php @@ -77,6 +77,7 @@ $lang = array_merge($lang, array( 'MOVE_POSTS_EXPLAIN' => 'Please select the forum to which you wish to move all the posts this user has made.', + 'NO_POSTS' => 'The user has no posts.', 'NO_SPECIAL_RANK' => 'No special rank assigned', 'NO_WARNINGS' => 'No warnings.', 'NOT_MANAGE_FOUNDER' => 'You tried to manage a user with founder status. Only founders are allowed to manage other founders.', From 8f7e85604bb36679db1baa37588fc5e39a8b853f Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Wed, 11 Apr 2012 03:00:16 +0530 Subject: [PATCH 154/255] [ticket/10308] fixes language entity. Language key has been changed and has been made more specific to avoid conflicts PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 2 +- phpBB/language/en/acp/users.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index b158995563..73be17c4c1 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -142,7 +142,7 @@


      {L_DELETE_USER_EXPLAIN}
      -
      {L_NO_POSTS}
      +
      {L_USER_NO_POSTS}

      diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php index 928699fd11..25e172e55c 100644 --- a/phpBB/language/en/acp/users.php +++ b/phpBB/language/en/acp/users.php @@ -77,7 +77,6 @@ $lang = array_merge($lang, array( 'MOVE_POSTS_EXPLAIN' => 'Please select the forum to which you wish to move all the posts this user has made.', - 'NO_POSTS' => 'The user has no posts.', 'NO_SPECIAL_RANK' => 'No special rank assigned', 'NO_WARNINGS' => 'No warnings.', 'NOT_MANAGE_FOUNDER' => 'You tried to manage a user with founder status. Only founders are allowed to manage other founders.', @@ -125,6 +124,7 @@ $lang = array_merge($lang, array( 'USER_GROUP_SPECIAL' => 'Pre-defined groups user is a member of', 'USER_LIFTED_NR' => 'Successfully removed the user’s newly registered status.', 'USER_NO_ATTACHMENTS' => 'There are no attached files to display.', + 'USER_NO_POSTS' => 'The user has no posts.', 'USER_OUTBOX_EMPTIED' => 'Successfully emptied user’s private message outbox.', 'USER_OUTBOX_EMPTY' => 'The user’s private message outbox was already empty.', 'USER_OVERVIEW_UPDATED' => 'User details updated.', From 59177a86c4160a4879aaf77e602f91ccea0fb107 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 20 Apr 2012 17:11:07 +0530 Subject: [PATCH 155/255] [ticket/10308] fix language and user's total posts language modified to be clear and select box disappears in case no posts by user. user's total posts are fetched using a new query. PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 8 +++++--- phpBB/includes/acp/acp_users.php | 8 ++++++++ phpBB/language/en/acp/users.php | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index 73be17c4c1..e6a1411bbb 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -140,9 +140,11 @@ {L_DELETE_USER}


      {L_DELETE_USER_EXPLAIN}
      -
      - -
      {L_USER_NO_POSTS}
      +
      + + {L_USER_NO_POSTS} + +

      diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 363c900edc..1f0f053a85 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1009,6 +1009,13 @@ class acp_users $user_row['posts_in_queue'] = (int) $db->sql_fetchfield('posts_in_queue'); $db->sql_freeresult($result); + $sql = 'SELECT COUNT(post_id) as user_total_posts + FROM ' . POSTS_TABLE . ' + WHERE poster_id = '. $user_id; + $result = $db->sql_query($sql); + $user_row['user_total_posts'] = (int) $db->sql_fetchfield('user_total_posts'); + $db->sql_freeresult($result); + $template->assign_vars(array( 'L_NAME_CHARS_EXPLAIN' => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']), 'L_CHANGE_PASSWORD_EXPLAIN' => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']), @@ -1036,6 +1043,7 @@ class acp_users 'USER_EMAIL' => $user_row['user_email'], 'USER_WARNINGS' => $user_row['user_warnings'], 'USER_POSTS' => $user_row['user_posts'], + 'USER_TOTAL_POSTS' => $user_row['user_total_posts'], 'USER_INACTIVE_REASON' => $inactive_reason, )); diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php index 25e172e55c..7f3a3d2a48 100644 --- a/phpBB/language/en/acp/users.php +++ b/phpBB/language/en/acp/users.php @@ -124,7 +124,7 @@ $lang = array_merge($lang, array( 'USER_GROUP_SPECIAL' => 'Pre-defined groups user is a member of', 'USER_LIFTED_NR' => 'Successfully removed the user’s newly registered status.', 'USER_NO_ATTACHMENTS' => 'There are no attached files to display.', - 'USER_NO_POSTS' => 'The user has no posts.', + 'USER_NO_POSTS' => 'The user has no posts to retain or delete.', 'USER_OUTBOX_EMPTIED' => 'Successfully emptied user’s private message outbox.', 'USER_OUTBOX_EMPTY' => 'The user’s private message outbox was already empty.', 'USER_OVERVIEW_UPDATED' => 'User details updated.', From faf232219ef3b7a5dcc3d22639d4005040b0d8ad Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 20 Apr 2012 23:11:55 +0530 Subject: [PATCH 156/255] [ticket/10308] renames language key to USER_NO_POSTS_DELETE language key renamed to make its usability more clearer. PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 2 +- phpBB/language/en/acp/users.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index e6a1411bbb..2a27cc2a63 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -142,7 +142,7 @@


      {L_DELETE_USER_EXPLAIN}
      - {L_USER_NO_POSTS} + {L_USER_NO_POSTS_DELETE}
      diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php index 7f3a3d2a48..52b7a35eac 100644 --- a/phpBB/language/en/acp/users.php +++ b/phpBB/language/en/acp/users.php @@ -124,7 +124,7 @@ $lang = array_merge($lang, array( 'USER_GROUP_SPECIAL' => 'Pre-defined groups user is a member of', 'USER_LIFTED_NR' => 'Successfully removed the user’s newly registered status.', 'USER_NO_ATTACHMENTS' => 'There are no attached files to display.', - 'USER_NO_POSTS' => 'The user has no posts to retain or delete.', + 'USER_NO_POSTS_DELETE' => 'The user has no posts to retain or delete.', 'USER_OUTBOX_EMPTIED' => 'Successfully emptied user’s private message outbox.', 'USER_OUTBOX_EMPTY' => 'The user’s private message outbox was already empty.', 'USER_OVERVIEW_UPDATED' => 'User details updated.', From cf303c34788b32e1c09f483e2760b77eff3e05ca Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sat, 21 Apr 2012 14:29:21 +0530 Subject: [PATCH 157/255] [ticket/10308] fixes user deletion if no posts introduces a hidden input field with retain posts as the mode in case user has no posts. PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index 2a27cc2a63..fdc1d55855 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -142,7 +142,7 @@

      {L_DELETE_USER_EXPLAIN}
      - {L_USER_NO_POSTS_DELETE} + {L_USER_NO_POSTS_DELETE}
      From 164054f0679caaa68fb8400d3469b1149022db29 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sun, 22 Apr 2012 00:36:38 +0530 Subject: [PATCH 158/255] [ticket/10308] fixes sql query, limit it to 1 instead of fetching all posts by user we limit the query to 1 to check if a user has posts or not PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 2 +- phpBB/includes/acp/acp_users.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index fdc1d55855..ea2700e5e4 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -141,7 +141,7 @@

      {L_DELETE_USER_EXPLAIN}
      - + {L_USER_NO_POSTS_DELETE}
      diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 1f0f053a85..7565d43690 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1009,11 +1009,11 @@ class acp_users $user_row['posts_in_queue'] = (int) $db->sql_fetchfield('posts_in_queue'); $db->sql_freeresult($result); - $sql = 'SELECT COUNT(post_id) as user_total_posts + $sql = 'SELECT post_id FROM ' . POSTS_TABLE . ' WHERE poster_id = '. $user_id; - $result = $db->sql_query($sql); - $user_row['user_total_posts'] = (int) $db->sql_fetchfield('user_total_posts'); + $result = $db->sql_query_limit($sql, 1); + $user_row['user_has_posts'] = ($db->sql_fetchfield('post_id') ? 1 : 0); $db->sql_freeresult($result); $template->assign_vars(array( @@ -1043,7 +1043,7 @@ class acp_users 'USER_EMAIL' => $user_row['user_email'], 'USER_WARNINGS' => $user_row['user_warnings'], 'USER_POSTS' => $user_row['user_posts'], - 'USER_TOTAL_POSTS' => $user_row['user_total_posts'], + 'USER_HAS_POSTS' => $user_row['user_has_posts'], 'USER_INACTIVE_REASON' => $inactive_reason, )); From 23ea588880a6793b53f2f4da0eb0609bed3fc90c Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Wed, 9 May 2012 21:41:12 +0530 Subject: [PATCH 159/255] [ticket/10308] makes variable boolean makes user_row['user_has_posts'] boolean instead of 1 or 0. PHPBB3-10308 --- phpBB/includes/acp/acp_users.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 7565d43690..70e08f79f2 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1013,7 +1013,7 @@ class acp_users FROM ' . POSTS_TABLE . ' WHERE poster_id = '. $user_id; $result = $db->sql_query_limit($sql, 1); - $user_row['user_has_posts'] = ($db->sql_fetchfield('post_id') ? 1 : 0); + $user_row['user_has_posts'] = (bool) $db->sql_fetchfield('post_id'); $db->sql_freeresult($result); $template->assign_vars(array( From cf556f92c91816f6aef9028d911b5584f08842af Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Wed, 9 May 2012 21:46:27 +0530 Subject: [PATCH 160/255] [ticket/10308] fixes language variable name Language variable has be renamed for better understanding PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 2 +- phpBB/language/en/acp/users.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index ea2700e5e4..1969428e38 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -142,7 +142,7 @@

      {L_DELETE_USER_EXPLAIN}
      - {L_USER_NO_POSTS_DELETE} + {L_USER_NO_POSTS_TO_DELETE}
      diff --git a/phpBB/language/en/acp/users.php b/phpBB/language/en/acp/users.php index 52b7a35eac..785283faea 100644 --- a/phpBB/language/en/acp/users.php +++ b/phpBB/language/en/acp/users.php @@ -124,7 +124,7 @@ $lang = array_merge($lang, array( 'USER_GROUP_SPECIAL' => 'Pre-defined groups user is a member of', 'USER_LIFTED_NR' => 'Successfully removed the user’s newly registered status.', 'USER_NO_ATTACHMENTS' => 'There are no attached files to display.', - 'USER_NO_POSTS_DELETE' => 'The user has no posts to retain or delete.', + 'USER_NO_POSTS_TO_DELETE' => 'The user has no posts to retain or delete.', 'USER_OUTBOX_EMPTIED' => 'Successfully emptied user’s private message outbox.', 'USER_OUTBOX_EMPTY' => 'The user’s private message outbox was already empty.', 'USER_OVERVIEW_UPDATED' => 'User details updated.', From 8393b8e755150593dbf85f545ac7ca3d8798e58c Mon Sep 17 00:00:00 2001 From: Senky Date: Tue, 10 Apr 2012 11:14:05 +0200 Subject: [PATCH 161/255] [ticket/9896] Links changed Link to languaged updated to http://www.phpbb.com/languages/ Link to styles updated to http://www.phpbb.com/customise/db/styles-2/ Link to MODs updated to http://www.phpbb.com/customise/db/modifications-1/ Link to Community Forums updated to http://www.phpbb.com/community/ PHPBB3-9896 --- phpBB/docs/README.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html index aa60d7dd25..0bdf94d181 100644 --- a/phpBB/docs/README.html +++ b/phpBB/docs/README.html @@ -130,9 +130,9 @@

      2.i. Internationalisation (i18n)

      -

      A number of language packs and style localisations are available. You can find them on our official download page:

      +

      A number of language packs and style localisations are available. You can find them on our official language packs page:

      -

      http://www.phpbb.com/downloads/

      +

      http://www.phpbb.com/languages/

      This is the official location for all supported language sets. If you download a package from a 3rd party site you do so with the understanding that we cannot offer support. So please, do not ask for help in these cases!

      @@ -144,7 +144,7 @@

      Although phpBB Group are rather proud of the included styles we realise that it may not be to everyones tastes. Therefore phpBB3 allows styles to be switched with relative ease. Firstly you need to locate and download a style you like. We maintain such a site at

      -

      http://www.phpbb.com/styles/

      +

      http://www.phpbb.com/customise/db/styles-2/

      Please note that 3rd party styles downloaded for versions of phpBB2 will not work in phpBB3.

      @@ -156,7 +156,7 @@

      Although not officially supported by phpBB Group, phpBB has a thriving modification scene. These third party modifications to the standard phpBB extend its capabilities still further and can be found at:

      -

      http://www.phpbb.com/mods/

      +

      http://www.phpbb.com/customise/db/modifications-1/

      Please remember that any bugs or other issues that occur after you have added any modification should NOT be reported to the bug tracker (see below). First remove the modification and see if the problem is resolved.

      @@ -192,7 +192,7 @@

      phpBB Group maintains a thriving community where a number of people have generously decided to donate their time to help support users. This site can be found at:

      -

      http://www.phpbb.com/

      +

      http://www.phpbb.com/community/

      If you do seek help via our forums please be sure to do a Search before posting. This may well save both you and us time and allow the developer, moderator and support groups to spend more time responding to people with unknown issues and problems. Please also remember that phpBB is an entirely volunteer effort, no one receives any compensation for the time they give, this includes moderators as well as developers. So please be respectful and mindful when awaiting responses.

      From 041b7be77ecd4e52048b94b4e47ad8268716a032 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 11 May 2012 01:50:36 +0530 Subject: [PATCH 162/255] [ticket/10308] fixes indentation indentation is fixed and user_posts variable is compared as a boolean variable. PHPBB3-10308 --- phpBB/adm/style/acp_users_overview.html | 38 ++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/phpBB/adm/style/acp_users_overview.html b/phpBB/adm/style/acp_users_overview.html index 1969428e38..e2dcdb6307 100644 --- a/phpBB/adm/style/acp_users_overview.html +++ b/phpBB/adm/style/acp_users_overview.html @@ -135,24 +135,24 @@ -
      -
      - {L_DELETE_USER} -
      -

      {L_DELETE_USER_EXPLAIN}
      -
      - - {L_USER_NO_POSTS_TO_DELETE} - -
      - -
      -

      - - - {S_FORM_TOKEN} -

      -
      -
      +
      +
      + {L_DELETE_USER} +
      +

      {L_DELETE_USER_EXPLAIN}
      +
      + +
      + + {L_USER_NO_POSTS_TO_DELETE} + +
      +

      + + + {S_FORM_TOKEN} +

      +
      +
      From 1019226dfa359cb223d68e7b9132006a8cd2a859 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 10 May 2012 23:22:35 -0400 Subject: [PATCH 163/255] [ticket/10887] Split auto increment test from db tools test. Auto increment test does not need any particular columns and should not depend, in particular, on correct handling of binary data. This commit moves auto increment test into its own file and gives it its own table with a simple schema. PHPBB3-10887 --- tests/dbal/auto_increment_test.php | 100 +++++++++++++++++++++++++++++ tests/dbal/db_tools_test.php | 45 ------------- 2 files changed, 100 insertions(+), 45 deletions(-) create mode 100644 tests/dbal/auto_increment_test.php diff --git a/tests/dbal/auto_increment_test.php b/tests/dbal/auto_increment_test.php new file mode 100644 index 0000000000..c18e589861 --- /dev/null +++ b/tests/dbal/auto_increment_test.php @@ -0,0 +1,100 @@ +createXMLDataSet(dirname(__FILE__).'/fixtures/config.xml'); + } + + protected function setUp() + { + parent::setUp(); + + $this->db = $this->new_dbal(); + $this->tools = new phpbb_db_tools($this->db); + + $this->table_data = array( + 'COLUMNS' => array( + 'c_id' => array('UINT', NULL, 'auto_increment'), + 'c_uint' => array('UINT', 4), + ), + 'PRIMARY_KEY' => 'c_id', + ); + $this->tools->sql_create_table('prefix_table_name', $this->table_data); + $this->table_exists = true; + } + + protected function tearDown() + { + if ($this->table_exists) + { + $this->tools->sql_table_drop('prefix_table_name'); + } + + parent::tearDown(); + } + + static protected function get_default_values() + { + return array( + 'c_uint' => 0, + ); + } + + public function test_auto_increment() + { + $sql = 'DELETE FROM prefix_table_name'; + $result = $this->db->sql_query($sql); + + $row1 = array_merge(self::get_default_values(), array( + 'c_uint' => 1, + )); + $row2 = array_merge(self::get_default_values(), array( + 'c_uint' => 2, + )); + + $sql = 'INSERT INTO prefix_table_name ' . $this->db->sql_build_array('INSERT', $row1); + $result = $this->db->sql_query($sql); + $id1 = $this->db->sql_nextid(); + + $sql = 'INSERT INTO prefix_table_name ' . $this->db->sql_build_array('INSERT', $row2); + $result = $this->db->sql_query($sql); + $id2 = $this->db->sql_nextid(); + + $this->assertGreaterThan($id1, $id2, 'Auto increment should increase the id value'); + + $sql = "SELECT * + FROM prefix_table_name WHERE c_id = $id1"; + $result = $this->db->sql_query($sql); + $row_actual = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + $row1['c_id'] = $id1; + $this->assertEquals($row1, $row_actual); + + $sql = "SELECT * + FROM prefix_table_name WHERE c_id = $id2"; + $result = $this->db->sql_query($sql); + $row_actual = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + $row2['c_id'] = $id2; + $this->assertEquals($row2, $row_actual); + } +} diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php index c7ddb88ce8..516fb9e739 100644 --- a/tests/dbal/db_tools_test.php +++ b/tests/dbal/db_tools_test.php @@ -189,51 +189,6 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case $this->assertEquals($row_expect[$column_name], $row_actual[$column_name], "Column $column_name of type $type should have equal return and input value."); } - public function test_auto_increment() - { - $sql = 'DELETE FROM prefix_table_name'; - $result = $this->db->sql_query($sql); - - $row1 = array_merge(self::get_default_values(), array( - 'c_uint' => 1, - 'c_vchar' => '1', // these values are necessary to avoid unique index issues - 'c_vchar_size' => '1', - )); - $row2 = array_merge(self::get_default_values(), array( - 'c_uint' => 2, - 'c_vchar' => '2', - 'c_vchar_size' => '2', - )); - - $sql = 'INSERT INTO prefix_table_name ' . $this->db->sql_build_array('INSERT', $row1); - $result = $this->db->sql_query($sql); - $id1 = $this->db->sql_nextid(); - - $sql = 'INSERT INTO prefix_table_name ' . $this->db->sql_build_array('INSERT', $row2); - $result = $this->db->sql_query($sql); - $id2 = $this->db->sql_nextid(); - - $this->assertGreaterThan($id1, $id2, 'Auto increment should increase the id value'); - - $sql = "SELECT * - FROM prefix_table_name WHERE c_id = $id1"; - $result = $this->db->sql_query($sql); - $row_actual = $this->db->sql_fetchrow($result); - $this->db->sql_freeresult($result); - - $row1['c_id'] = $id1; - $this->assertEquals($row1, $row_actual); - - $sql = "SELECT * - FROM prefix_table_name WHERE c_id = $id2"; - $result = $this->db->sql_query($sql); - $row_actual = $this->db->sql_fetchrow($result); - $this->db->sql_freeresult($result); - - $row2['c_id'] = $id2; - $this->assertEquals($row2, $row_actual); - } - public function test_list_columns() { $this->assertEquals( From 74e9245df3b6652db10e46302510d27a54db827e Mon Sep 17 00:00:00 2001 From: Senky Date: Fri, 11 May 2012 08:09:56 +0200 Subject: [PATCH 164/255] [ticket/10835] changing "e-mail" to "email" PHPBB3-10835 --- phpBB/language/en/ucp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 6f6b319d48..7df26e040f 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -137,7 +137,7 @@ $lang = array_merge($lang, array( 'CREATE_FOLDER' => 'Add folder…', 'CURRENT_IMAGE' => 'Current image', 'CURRENT_PASSWORD' => 'Current password', - 'CURRENT_PASSWORD_EXPLAIN' => 'You must enter your current password if you wish to alter your e-mail address or username.', + 'CURRENT_PASSWORD_EXPLAIN' => 'You must enter your current password if you wish to alter your email address or username.', 'CURRENT_CHANGE_PASSWORD_EXPLAIN' => 'To change your password, your email address, or your username, you must enter your current password.', 'CUR_PASSWORD_EMPTY' => 'You did not enter your current password.', 'CUR_PASSWORD_ERROR' => 'The current password you entered is incorrect.', From b5b65c214dc42a9e7a9cf15ebc00600d00331985 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 11 May 2012 05:06:46 -0400 Subject: [PATCH 165/255] [ticket/10887] Add spaces. PHPBB3-10887 --- tests/dbal/auto_increment_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dbal/auto_increment_test.php b/tests/dbal/auto_increment_test.php index c18e589861..e87fc1c6bd 100644 --- a/tests/dbal/auto_increment_test.php +++ b/tests/dbal/auto_increment_test.php @@ -19,7 +19,7 @@ class phpbb_dbal_auto_increment_test extends phpbb_database_test_case public function getDataSet() { - return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/config.xml'); + return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml'); } protected function setUp() From e5afe39987200779df35b55259900ab947ce46d0 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 10 Apr 2012 02:41:33 +0200 Subject: [PATCH 166/255] [ticket/10889] Make default value for c_char_size a CHAR(4) as defined. PHPBB3-10889 --- tests/dbal/db_tools_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php index 516fb9e739..9bed0648cd 100644 --- a/tests/dbal/db_tools_test.php +++ b/tests/dbal/db_tools_test.php @@ -106,7 +106,7 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case 'c_bool' => 0, 'c_vchar' => '', 'c_vchar_size' => '', - 'c_char_size' => '', + 'c_char_size' => 'abcd', 'c_xstext' => '', 'c_stext' => '', 'c_text' => '', From 1960629240679965ca22a98e69973dcfe2e05476 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Fri, 11 May 2012 15:17:13 +0200 Subject: [PATCH 167/255] [ticket/10492] Skip functional tests on PHP 5.2 on travis PHPBB3-10492 --- travis/phpunit-mysql-travis.xml | 4 ++++ travis/phpunit-postgres-travis.xml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/travis/phpunit-mysql-travis.xml b/travis/phpunit-mysql-travis.xml index 36845a7f71..e54b2bb77b 100644 --- a/travis/phpunit-mysql-travis.xml +++ b/travis/phpunit-mysql-travis.xml @@ -13,6 +13,10 @@ ../tests/ + tests/functional + + + ../tests/functional diff --git a/travis/phpunit-postgres-travis.xml b/travis/phpunit-postgres-travis.xml index 461a53bcb1..55ba996548 100644 --- a/travis/phpunit-postgres-travis.xml +++ b/travis/phpunit-postgres-travis.xml @@ -13,6 +13,10 @@ ../tests/ + tests/functional + + + ../tests/functional From 3a604145921b3df90379c4e44370a040165c43ef Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Thu, 12 Apr 2012 20:10:20 -0500 Subject: [PATCH 168/255] [ticket/10892] Reformat RUNNING_TESTS.txt to 80 char lines. PHPBB3-10892 --- tests/RUNNING_TESTS.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt index 59197acc0f..3ac8bfcd67 100644 --- a/tests/RUNNING_TESTS.txt +++ b/tests/RUNNING_TESTS.txt @@ -36,8 +36,9 @@ found on the wiki (see below). $dbuser = 'user'; $dbpasswd = 'password'; -Alternatively you can specify parameters in the environment, so e.g. the following -will run phpunit with the same parameters as in the shown test_config.php file: +Alternatively you can specify parameters in the environment, so e.g. the +following will run phpunit with the same parameters as in the shown +test_config.php file: $ PHPBB_TEST_DBMS='mysqli' PHPBB_TEST_DBHOST='localhost' \ PHPBB_TEST_DBNAME='database' PHPBB_TEST_DBUSER='user' \ @@ -46,7 +47,8 @@ will run phpunit with the same parameters as in the shown test_config.php file: Running ======= -Once the prerequisites are installed, run the tests from the project root directory (above phpBB): +Once the prerequisites are installed, run the tests from the project root +directory (above phpBB): $ phpunit @@ -54,8 +56,8 @@ Slow tests -------------- Certain tests, such as the UTF-8 normalizer or the DNS tests tend to be slow. Thus these tests are in the `slow` group, which is excluded by default. You can -enable slow tests by copying the phpunit.xml.all file to phpunit.xml. If you only -want the slow tests, run: +enable slow tests by copying the phpunit.xml.all file to phpunit.xml. If you +only want the slow tests, run: $ phpunit --group slow From 07fb16edb583008ea2bc11556370cbeb41ff7c5e Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 11 May 2012 22:10:19 -0400 Subject: [PATCH 169/255] [ticket/10892] Reformat RUNNING_TESTS.txt to 79 char lines. PHPBB3-10892 --- tests/RUNNING_TESTS.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt index 3ac8bfcd67..dac6753187 100644 --- a/tests/RUNNING_TESTS.txt +++ b/tests/RUNNING_TESTS.txt @@ -24,9 +24,9 @@ Database Tests By default all tests requiring a database connection will use sqlite. If you do not have sqlite installed the tests will be skipped. If you wish to run the tests on a different database you have to create a test_config.php file within -your tests directory following the same format as phpBB's config.php. An example -for mysqli can be found below. More information on configuration options can be -found on the wiki (see below). +your tests directory following the same format as phpBB's config.php. An +example for mysqli can be found below. More information on configuration +options can be found on the wiki (see below). Date: Fri, 11 May 2012 22:14:12 -0400 Subject: [PATCH 170/255] [ticket/10892] Add empty lines for consistency. Some headings had empty lines after them, some did not. Add missing empty lines. PHPBB3-10892 --- tests/RUNNING_TESTS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt index dac6753187..ebc61360de 100644 --- a/tests/RUNNING_TESTS.txt +++ b/tests/RUNNING_TESTS.txt @@ -21,6 +21,7 @@ the following PHP extensions must be installed and enabled to run unit tests: Database Tests -------------- + By default all tests requiring a database connection will use sqlite. If you do not have sqlite installed the tests will be skipped. If you wish to run the tests on a different database you have to create a test_config.php file within @@ -54,6 +55,7 @@ directory (above phpBB): Slow tests -------------- + Certain tests, such as the UTF-8 normalizer or the DNS tests tend to be slow. Thus these tests are in the `slow` group, which is excluded by default. You can enable slow tests by copying the phpunit.xml.all file to phpunit.xml. If you From 2592fbf8e927b064f41b744b8725341f18e02e68 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 11 May 2012 22:14:40 -0400 Subject: [PATCH 171/255] [ticket/10892] Update wiki link to mediawiki. PHPBB3-10892 --- tests/RUNNING_TESTS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt index ebc61360de..c80c42a83d 100644 --- a/tests/RUNNING_TESTS.txt +++ b/tests/RUNNING_TESTS.txt @@ -67,4 +67,4 @@ More Information ================ Further information is available on phpbb wiki: -http://wiki.phpbb.com/display/DEV/Unit+Tests +http://wiki.phpbb.com/Unit_Tests From 725db1ba29960aa8ad2a24c7324078c69c6c8ced Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Fri, 11 May 2012 22:24:01 -0400 Subject: [PATCH 172/255] [ticket/10891] Allow specifying test_config.php path via environment. PHPBB3-10891 --- tests/RUNNING_TESTS.txt | 6 ++++++ tests/test_framework/phpbb_test_case_helpers.php | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt index 59197acc0f..b92423c1f4 100644 --- a/tests/RUNNING_TESTS.txt +++ b/tests/RUNNING_TESTS.txt @@ -36,6 +36,12 @@ found on the wiki (see below). $dbuser = 'user'; $dbpasswd = 'password'; +It is possible to have multiple test_config.php files, for example if you +are testing on multiple databases. You can specify which test_config.php file +to use in the environment as follows: + + $ PHPBB_TEST_CONFIG=tests/test_config.php phpunit + Alternatively you can specify parameters in the environment, so e.g. the following will run phpunit with the same parameters as in the shown test_config.php file: diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php index b46c36efaa..2a3c27f9f9 100644 --- a/tests/test_framework/phpbb_test_case_helpers.php +++ b/tests/test_framework/phpbb_test_case_helpers.php @@ -58,9 +58,19 @@ class phpbb_test_case_helpers )); } - if (file_exists(dirname(__FILE__) . '/../test_config.php')) + if (isset($_SERVER['PHPBB_TEST_CONFIG'])) { - include(dirname(__FILE__) . '/../test_config.php'); + // Could be an absolute path + $test_config = $_SERVER['PHPBB_TEST_CONFIG']; + } + else + { + $test_config = dirname(__FILE__) . '/../test_config.php'; + } + + if (file_exists($test_config)) + { + include($test_config); $config = array_merge($config, array( 'dbms' => $dbms, From 47c6b32d874826e4994c6589ed21a4fd9b4556d5 Mon Sep 17 00:00:00 2001 From: Joseph Warner Date: Sun, 13 May 2012 13:05:20 -0400 Subject: [PATCH 173/255] [ticket/10893] Update the usage of Composer Changes 'vendor/.composer/autoload.php' to 'vendor/autoload.php' as per the change in the way that composer works as noted https://groups.google.com/forum/#!msg/composer-dev/fWIs3KocwoA/nU3aLko9LhQJ PHPBB3-10893 --- phpBB/includes/startup.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/startup.php b/phpBB/includes/startup.php index f75d70e366..441eaec6b1 100644 --- a/phpBB/includes/startup.php +++ b/phpBB/includes/startup.php @@ -150,7 +150,7 @@ if (function_exists('date_default_timezone_set') && function_exists('date_defaul // Autoloading of dependencies. // Three options are supported: // 1. If dependencies are installed with Composer, Composer will create a -// vendor/.composer/autoload.php. If this file exists it will be +// vendor/autoload.php. If this file exists it will be // automatically used by phpBB. This is the default mode that phpBB // will use when shipped. // 2. To disable composer autoloading, PHPBB_NO_COMPOSER_AUTOLOAD can be specified. @@ -171,11 +171,11 @@ if (getenv('PHPBB_NO_COMPOSER_AUTOLOAD')) } else { - if (!file_exists($phpbb_root_path . 'vendor/.composer/autoload.php')) + if (!file_exists($phpbb_root_path . 'vendor/autoload.php')) { trigger_error('You have not set up composer dependencies. See http://getcomposer.org/.', E_USER_ERROR); } - require($phpbb_root_path . 'vendor/.composer/autoload.php'); + require($phpbb_root_path . 'vendor/autoload.php'); } $starttime = explode(' ', microtime()); From f71a9d369c84ec938408a2134b09ea259f6cbbab Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 14 May 2012 00:34:42 +0200 Subject: [PATCH 174/255] [ticket/10605] Put end of array on its own line because start of array is too. PHPBB3-10605 --- phpBB/install/database_update.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 0737061887..2a361aae26 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2043,7 +2043,8 @@ function change_database_data(&$no_updates, $version) 'ON' => 'p.msg_id = t.msg_id', ), ), - 'WHERE' => 't.user_id IS NULL'); + 'WHERE' => 't.user_id IS NULL', + ); $sql = $db->sql_build_query('SELECT', $sql_array); do From 95e1d4e9db8d2174c8ee5c6bb35be06abc57e3cf Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 14 May 2012 00:36:18 +0200 Subject: [PATCH 175/255] [ticket/10605] Use database updater function _sql() instead of $db->sql_query() PHPBB3-10605 --- phpBB/install/database_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 2a361aae26..95a0282878 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2062,7 +2062,7 @@ function change_database_data(&$no_updates, $version) { $sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' WHERE ' . $db->sql_in_set('msg_id', $delete_pms); - $db->sql_query($sql); + _sql($sql, $errored, $error_ary); } } while (sizeof($delete_pms) == $batch_size); From 5ce46cc9603ccc153bf26168b18afee0f3b645af Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sat, 31 Mar 2012 00:16:28 +0530 Subject: [PATCH 176/255] [feature/delete-auto-logins] User can view/delete auto logins. User has an extra option in UCP->Profile to view the auto logins and clear them. PHPBB3-9647 --- phpBB/includes/ucp/info/ucp_profile.php | 1 + phpBB/includes/ucp/ucp_profile.php | 40 +++++++++++++++++ phpBB/language/en/ucp.php | 4 ++ .../template/ucp_profile_autologin_keys.html | 45 +++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html diff --git a/phpBB/includes/ucp/info/ucp_profile.php b/phpBB/includes/ucp/info/ucp_profile.php index 09c0318de9..968538a178 100644 --- a/phpBB/includes/ucp/info/ucp_profile.php +++ b/phpBB/includes/ucp/info/ucp_profile.php @@ -23,6 +23,7 @@ class ucp_profile_info 'signature' => array('title' => 'UCP_PROFILE_SIGNATURE', 'auth' => '', 'cat' => array('UCP_PROFILE')), 'avatar' => array('title' => 'UCP_PROFILE_AVATAR', 'auth' => 'cfg_allow_avatar && (cfg_allow_avatar_local || cfg_allow_avatar_remote || cfg_allow_avatar_upload || cfg_allow_avatar_remote_upload)', 'cat' => array('UCP_PROFILE')), 'reg_details' => array('title' => 'UCP_PROFILE_REG_DETAILS', 'auth' => '', 'cat' => array('UCP_PROFILE')), + 'autologin_keys'=> array('title' => 'UCP_PROFILE_AUTOLOGIN_KEYS', 'auth' => '', 'cat' => array('UCP_PROFILE')), ), ); } diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index 9d81503f0a..f3e0984685 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -618,6 +618,46 @@ class ucp_profile } break; + + case 'autologin_keys': + + add_form_key('ucp_autologin_keys'); + + if ($submit) + { + $keys = request_var('keys', array('')); + + if (!empty($keys)) + { + $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' + WHERE user_id = ' . (int) $user->data['user_id'] . ' + AND ' . $db->sql_in_set('key_id', $keys) ; + + $db->sql_query($sql); + + $message = $user->lang['AUTOLOGIN_SESSIONS_KEYS_DELETED'] . '

      ' . sprintf($user->lang['RETURN_UCP'], '', ''); + trigger_error($message); + } + } + + $sql = 'SELECT key_id, last_ip, last_login + FROM ' . SESSIONS_KEYS_TABLE . ' + WHERE user_id = ' . (int) $user->data['user_id']; + + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $template->assign_block_vars('sessions', array( + 'KEY' => $row['key_id'], + 'IP' => $row['last_ip'], + 'LOGIN_TIME' => $row['last_login'], + )); + } + + $db->sql_freeresult($result); + + break; } $template->assign_vars(array( diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 2212e44628..1e36b4e9f7 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -87,6 +87,7 @@ $lang = array_merge($lang, array( 'ATTACHMENTS_EXPLAIN' => 'This is a list of attachments you have made in posts to this board.', 'ATTACHMENTS_DELETED' => 'Attachments successfully deleted.', 'ATTACHMENT_DELETED' => 'Attachment successfully deleted.', + 'AUTOLOGIN_SESSION_KEYS_DELETED'=> 'The selected auto-login session keys were successfully deleted.', 'AVATAR_CATEGORY' => 'Category', 'AVATAR_EXPLAIN' => 'Maximum dimensions; width: %1$s, height: %2$s, file size: %3$.2f KiB.', 'AVATAR_FEATURES_DISABLED' => 'The avatar functionality is currently disabled.', @@ -376,6 +377,8 @@ $lang = array_merge($lang, array( 'PREFERENCES_UPDATED' => 'Your preferences have been updated.', 'PROFILE_INFO_NOTICE' => 'Please note that this information may be viewable to other members. Be careful when including any personal details. Any fields marked with a * must be completed.', 'PROFILE_UPDATED' => 'Your profile has been updated.', + 'PROFILE_AUTOLOGIN_KEYS' => 'The auto-login session keys can be selected and deleted.', + 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved auto-login session keys.', 'RECIPIENT' => 'Recipient', 'RECIPIENTS' => 'Recipients', @@ -465,6 +468,7 @@ $lang = array_merge($lang, array( 'UCP_PROFILE_PROFILE_INFO' => 'Edit profile', 'UCP_PROFILE_REG_DETAILS' => 'Edit account settings', 'UCP_PROFILE_SIGNATURE' => 'Edit signature', + 'UCP_PROFILE_AUTOLOGIN_KEYS'=> 'Edit auto-login session keys', 'UCP_USERGROUPS' => 'Usergroups', 'UCP_USERGROUPS_MEMBER' => 'Edit memberships', diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html new file mode 100644 index 0000000000..ad7b7a920d --- /dev/null +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -0,0 +1,45 @@ + + +
      + +

      {L_TITLE}

      +
      +
      + +
      +

      {ERROR}

      + +

      {L_PROFILE_AUTOLOGIN_KEYS}

      + + + + + + + + + + + + + + + +
      KeyIPLogin-Time
      {sessions.KEY}{sessions.IP}{sessions.LOGIN_TIME}
      + +

      {L_PROFILE_NO_AUTOLOGIN_KEYS}

      + +
      +
      +
      + + +
      + {S_HIDDEN_FIELDS}  + + {S_FORM_TOKEN} +
      + +
      + + From 79ef96043546074e19bf849e7a58279b3b463c1a Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sat, 31 Mar 2012 18:27:34 +0530 Subject: [PATCH 177/255] [feature/delete-auto-logins] Fixes language entries and redirection. The user is redirected after deleting auto login session keys. PHPBB3-9647 --- phpBB/includes/ucp/ucp_profile.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index f3e0984685..2595e48fb5 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -635,7 +635,8 @@ class ucp_profile $db->sql_query($sql); - $message = $user->lang['AUTOLOGIN_SESSIONS_KEYS_DELETED'] . '

      ' . sprintf($user->lang['RETURN_UCP'], '', ''); + meta_refresh(3, $this->u_action); + $message = $user->lang['AUTOLOGIN_SESSION_KEYS_DELETED'] . '

      ' . sprintf($user->lang['RETURN_UCP'], '', ''); trigger_error($message); } } From 4129711e9f9b67ea102594254434f6210cd03e81 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sun, 1 Apr 2012 16:57:46 +0530 Subject: [PATCH 178/255] [feature/delete-auto-logins] checks form key The form key is checked after submission if not correct error is returned. PHPBB3-9647 --- phpBB/includes/ucp/ucp_profile.php | 33 +++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index 2595e48fb5..d4e5d75c10 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -627,18 +627,29 @@ class ucp_profile { $keys = request_var('keys', array('')); - if (!empty($keys)) + if (!check_form_key('ucp_autologin_keys')) { - $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' - WHERE user_id = ' . (int) $user->data['user_id'] . ' - AND ' . $db->sql_in_set('key_id', $keys) ; - - $db->sql_query($sql); - - meta_refresh(3, $this->u_action); - $message = $user->lang['AUTOLOGIN_SESSION_KEYS_DELETED'] . '

      ' . sprintf($user->lang['RETURN_UCP'], '', ''); - trigger_error($message); + $error[] = 'FORM_INVALID'; } + + if (!sizeof($error)) + { + if (!empty($keys)) + { + $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' + WHERE user_id = ' . (int) $user->data['user_id'] . ' + AND ' . $db->sql_in_set('key_id', $keys) ; + + $db->sql_query($sql); + + meta_refresh(3, $this->u_action); + $message = $user->lang['AUTOLOGIN_SESSION_KEYS_DELETED'] . '

      ' . sprintf($user->lang['RETURN_UCP'], '', ''); + trigger_error($message); + } + } + + // Replace "error" strings with their real, localised form + $error = array_map(array($user, 'lang'), $error); } $sql = 'SELECT key_id, last_ip, last_login @@ -650,6 +661,8 @@ class ucp_profile while ($row = $db->sql_fetchrow($result)) { $template->assign_block_vars('sessions', array( + 'ERROR' => (sizeof($error)) ? implode('
      ', $error) : '', + 'KEY' => $row['key_id'], 'IP' => $row['last_ip'], 'LOGIN_TIME' => $row['last_login'], From dfedc995ed04c777c933dc68d0da388d8214cb1b Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Tue, 10 Apr 2012 18:33:55 +0530 Subject: [PATCH 179/255] [feature/delete-auto-logins] Fixes language entries Fixed language entries so that UI shows persistent login keys instead of autologin keys. PHPBB3-9647 --- phpBB/language/en/ucp.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 1e36b4e9f7..926af99a12 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -87,7 +87,7 @@ $lang = array_merge($lang, array( 'ATTACHMENTS_EXPLAIN' => 'This is a list of attachments you have made in posts to this board.', 'ATTACHMENTS_DELETED' => 'Attachments successfully deleted.', 'ATTACHMENT_DELETED' => 'Attachment successfully deleted.', - 'AUTOLOGIN_SESSION_KEYS_DELETED'=> 'The selected auto-login session keys were successfully deleted.', + 'AUTOLOGIN_SESSION_KEYS_DELETED'=> 'The selected persistent login keys were successfully deleted.', 'AVATAR_CATEGORY' => 'Category', 'AVATAR_EXPLAIN' => 'Maximum dimensions; width: %1$s, height: %2$s, file size: %3$.2f KiB.', 'AVATAR_FEATURES_DISABLED' => 'The avatar functionality is currently disabled.', @@ -377,8 +377,8 @@ $lang = array_merge($lang, array( 'PREFERENCES_UPDATED' => 'Your preferences have been updated.', 'PROFILE_INFO_NOTICE' => 'Please note that this information may be viewable to other members. Be careful when including any personal details. Any fields marked with a * must be completed.', 'PROFILE_UPDATED' => 'Your profile has been updated.', - 'PROFILE_AUTOLOGIN_KEYS' => 'The auto-login session keys can be selected and deleted.', - 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved auto-login session keys.', + 'PROFILE_AUTOLOGIN_KEYS' => 'The persisten login keys can be selected and deleted.', + 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved persistent login keys.', 'RECIPIENT' => 'Recipient', 'RECIPIENTS' => 'Recipients', @@ -468,7 +468,7 @@ $lang = array_merge($lang, array( 'UCP_PROFILE_PROFILE_INFO' => 'Edit profile', 'UCP_PROFILE_REG_DETAILS' => 'Edit account settings', 'UCP_PROFILE_SIGNATURE' => 'Edit signature', - 'UCP_PROFILE_AUTOLOGIN_KEYS'=> 'Edit auto-login session keys', + 'UCP_PROFILE_AUTOLOGIN_KEYS'=> 'Edit persistent login keys', 'UCP_USERGROUPS' => 'Usergroups', 'UCP_USERGROUPS_MEMBER' => 'Edit memberships', From d5b1e108f92e7bae9a0c4afa972f85276e84df2a Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Wed, 11 Apr 2012 03:13:19 +0530 Subject: [PATCH 180/255] [feature/delete-auto-logins] fixes css corners PHPBB3-9647 --- .../styles/prosilver/template/ucp_profile_autologin_keys.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index ad7b7a920d..7767943d5c 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -4,7 +4,7 @@

      {L_TITLE}

      -
      +

      {ERROR}

      @@ -30,7 +30,7 @@

      {L_PROFILE_NO_AUTOLOGIN_KEYS}

      -
      +
      From bdf66b27ab6e46cfb1978feb05b13c83c9bd9597 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Wed, 11 Apr 2012 03:34:29 +0530 Subject: [PATCH 181/255] [feature/delete-auto-logins] using loop for errors instead of hardcoding html code into ERROR variable, we use errors array and use loop in template file. PHPBB3-9647 --- phpBB/includes/ucp/ucp_profile.php | 2 +- .../prosilver/template/ucp_profile_autologin_keys.html | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index d4e5d75c10..a7b6eb29a1 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -661,7 +661,7 @@ class ucp_profile while ($row = $db->sql_fetchrow($result)) { $template->assign_block_vars('sessions', array( - 'ERROR' => (sizeof($error)) ? implode('
      ', $error) : '', + 'errors' => $error, 'KEY' => $row['key_id'], 'IP' => $row['last_ip'], diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index 7767943d5c..89913d21bf 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -7,7 +7,13 @@
      -

      {ERROR}

      + +

      + + {errors}
      + +

      +

      {L_PROFILE_AUTOLOGIN_KEYS}

      From 71f84164805293a2ab5c70ec49799ee8bfa5eac3 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 13 Apr 2012 21:29:31 +0530 Subject: [PATCH 182/255] [feature/delete-auto-logins] improved styling and fixes language Table ahs been styled. Date is now formatted properly instead of the unix timestamp being displayed earlier. fixes small mistake in language entry PHPBB3-9647 --- phpBB/includes/ucp/ucp_profile.php | 2 +- phpBB/language/en/ucp.php | 2 +- .../template/ucp_profile_autologin_keys.html | 18 +++++++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index a7b6eb29a1..2ac82fb52f 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -665,7 +665,7 @@ class ucp_profile 'KEY' => $row['key_id'], 'IP' => $row['last_ip'], - 'LOGIN_TIME' => $row['last_login'], + 'LOGIN_TIME' => $user->format_date($row['last_login']), )); } diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 926af99a12..44d14b2349 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -377,7 +377,7 @@ $lang = array_merge($lang, array( 'PREFERENCES_UPDATED' => 'Your preferences have been updated.', 'PROFILE_INFO_NOTICE' => 'Please note that this information may be viewable to other members. Be careful when including any personal details. Any fields marked with a * must be completed.', 'PROFILE_UPDATED' => 'Your profile has been updated.', - 'PROFILE_AUTOLOGIN_KEYS' => 'The persisten login keys can be selected and deleted.', + 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys can be selected and deleted.', 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved persistent login keys.', 'RECIPIENT' => 'Recipient', diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index 89913d21bf..e4dd954d39 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -16,21 +16,25 @@

      {L_PROFILE_AUTOLOGIN_KEYS}

      -
      +
      + - + + + - - - - - + + + + + +
      Mark Key IP Login-Time
      {sessions.KEY}{sessions.IP}{sessions.LOGIN_TIME}
      {sessions.IP}{sessions.LOGIN_TIME}

      {L_PROFILE_NO_AUTOLOGIN_KEYS}

      From ca0d5ebf7a289e7ba759023e6322820450e79ec7 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 13 Apr 2012 21:38:22 +0530 Subject: [PATCH 183/255] [feature/delete-auto-logins] template added for subsilver2 PHPBB3-9647 --- .../template/ucp_profile_autologin_keys.html | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html diff --git a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html new file mode 100644 index 0000000000..cb6aac7674 --- /dev/null +++ b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {L_TITLE}
      + + {errors}
      + +
      {L_PROFILE_AUTOLOGIN_KEYS}
      MarkKeyIPLogin-Time
      {sessions.IP}{sessions.LOGIN_TIME}
      {L_PROFILE_NO_AUTOLOGIN_KEYS}
      + {S_HIDDEN_FIELDS}  + + {S_FORM_TOKEN} +
      + + From 124068b0b1c05df692a81b529e03f9a22702d270 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Fri, 20 Apr 2012 04:13:20 +0530 Subject: [PATCH 184/255] [feature/delete-auto-logins] explain persistent keys in the ucp. a short explaination of persistent keys in edit persistent keys section PHPBB3-9647 --- phpBB/language/en/ucp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 44d14b2349..398163f38a 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -377,7 +377,7 @@ $lang = array_merge($lang, array( 'PREFERENCES_UPDATED' => 'Your preferences have been updated.', 'PROFILE_INFO_NOTICE' => 'Please note that this information may be viewable to other members. Be careful when including any personal details. Any fields marked with a * must be completed.', 'PROFILE_UPDATED' => 'Your profile has been updated.', - 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys can be selected and deleted.', + 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys keeps the user logged in till the user signs out. Logout does only delete the persistent key on the current machine. The persistent login keys for all machines can be viewed/deleted by the user.', 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved persistent login keys.', 'RECIPIENT' => 'Recipient', From 9db1ed6e804e1ebf536b81d1d68daf44d558c2e1 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sat, 21 Apr 2012 13:28:01 +0530 Subject: [PATCH 185/255] [feature/delete-auto-logins] fix language keys and styling introduction of language variables instead of hardcoded language. PHPBB3-9647 --- phpBB/language/en/ucp.php | 4 +++- .../prosilver/template/ucp_profile_autologin_keys.html | 10 +++++----- .../template/ucp_profile_autologin_keys.html | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 398163f38a..1ed978f788 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -256,6 +256,8 @@ $lang = array_merge($lang, array( 'LINK_REMOTE_SIZE' => 'Avatar dimensions', 'LINK_REMOTE_SIZE_EXPLAIN' => 'Specify the width and height of the avatar, leave blank to attempt automatic verification.', 'LOGIN_EXPLAIN_UCP' => 'Please login in order to access the User Control Panel.', + 'LOGIN_KEY' => 'Login Key', + 'LOGIN_TIME' => 'Login Time', 'LOGIN_REDIRECT' => 'You have been successfully logged in.', 'LOGOUT_FAILED' => 'You were not logged out, as the request did not match your session. Please contact the board administrator if you continue to experience problems.', 'LOGOUT_REDIRECT' => 'You have been successfully logged out.', @@ -377,7 +379,7 @@ $lang = array_merge($lang, array( 'PREFERENCES_UPDATED' => 'Your preferences have been updated.', 'PROFILE_INFO_NOTICE' => 'Please note that this information may be viewable to other members. Be careful when including any personal details. Any fields marked with a * must be completed.', 'PROFILE_UPDATED' => 'Your profile has been updated.', - 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys keeps the user logged in till the user signs out. Logout does only delete the persistent key on the current machine. The persistent login keys for all machines can be viewed/deleted by the user.', + 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys logins the user automatically on each visit until logout. Logout does only delete the persistent key on the current machine. The persistent login keys for all machines can be viewed/deleted by the user here.', 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved persistent login keys.', 'RECIPIENT' => 'Recipient', diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index e4dd954d39..143cb925ec 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -15,14 +15,14 @@

      -

      {L_PROFILE_AUTOLOGIN_KEYS}

      +

      {L_PROFILE_AUTOLOGIN_KEYS}


      - - - - + + + + diff --git a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html index cb6aac7674..365b6f4a52 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html @@ -18,10 +18,10 @@ - - - - + + + + From 1cfb84e61e808a50b12e4686781eb85202b4e87b Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sat, 21 Apr 2012 15:29:44 +0530 Subject: [PATCH 186/255] [feature/delete-auto-logins] fixes language entry PHPBB3-9647 --- phpBB/language/en/ucp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 1ed978f788..4c945140bb 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -379,7 +379,7 @@ $lang = array_merge($lang, array( 'PREFERENCES_UPDATED' => 'Your preferences have been updated.', 'PROFILE_INFO_NOTICE' => 'Please note that this information may be viewable to other members. Be careful when including any personal details. Any fields marked with a * must be completed.', 'PROFILE_UPDATED' => 'Your profile has been updated.', - 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys logins the user automatically on each visit until logout. Logout does only delete the persistent key on the current machine. The persistent login keys for all machines can be viewed/deleted by the user here.', + 'PROFILE_AUTOLOGIN_KEYS' => 'The persistent login keys automatically log you in when you visit the board. If you logout, the persistent login key is deleted only on the computer you are using to logout. Here you can see persistent login keys created on other computers you used to access this site.', 'PROFILE_NO_AUTOLOGIN_KEYS' => 'There are no saved persistent login keys.', 'RECIPIENT' => 'Recipient', From d612a7e647b276c33c320d75108405847df7ac1d Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sat, 21 Apr 2012 16:21:37 +0530 Subject: [PATCH 187/255] [feature/delete-auto-logins] improves styling PHPBB3-9647 --- .../template/ucp_profile_autologin_keys.html | 47 +++++++++---------- .../template/ucp_profile_autologin_keys.html | 37 +++++++-------- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index 143cb925ec..a8af932cb6 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -14,31 +14,30 @@

      - -

      {L_PROFILE_AUTOLOGIN_KEYS}


      -
      MarkKeyIPLogin-Time{L_MARK}{L_LOGIN_KEY}{L_IP}{L_LOGIN_TIME}
      {L_PROFILE_AUTOLOGIN_KEYS}
      MarkKeyIPLogin-Time{L_MARK}{L_LOGIN_KEY}{L_IP}{L_LOGIN_TIME}
      - - - - - - + +

      {L_PROFILE_AUTOLOGIN_KEYS}


      +
      {L_MARK}{L_LOGIN_KEY}{L_IP}{L_LOGIN_TIME}
      + + + + + + + + + + + + + + + - - - - - - - - - - - -
      {L_MARK}{L_LOGIN_KEY}{L_IP}{L_LOGIN_TIME}
      {sessions.IP}{sessions.LOGIN_TIME}
      {sessions.IP}{sessions.LOGIN_TIME}
      - -

      {L_PROFILE_NO_AUTOLOGIN_KEYS}

      - + + {L_PROFILE_NO_AUTOLOGIN_KEYS} + + +
  • diff --git a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html index 365b6f4a52..2d3b9f98f8 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html @@ -13,29 +13,28 @@ - - - {L_PROFILE_AUTOLOGIN_KEYS} + + + {L_PROFILE_AUTOLOGIN_KEYS} + + + {L_MARK} + {L_LOGIN_KEY} + {L_IP} + {L_LOGIN_TIME} + + + + + + {sessions.IP} + {sessions.LOGIN_TIME} - - {L_MARK} - {L_LOGIN_KEY} - {L_IP} - {L_LOGIN_TIME} - - - - - - {sessions.IP} - {sessions.LOGIN_TIME} - - - + {L_PROFILE_NO_AUTOLOGIN_KEYS} - + From 73ca5edb296bfe2d599e001d593cc2d952be3941 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Thu, 17 May 2012 14:08:50 +0530 Subject: [PATCH 188/255] [feature/delete-auto-logins] fixes style removes reset button and some minor style fixes in subsilver2 and prosilver. PHPBB3-9647 --- .../prosilver/template/ucp_profile_autologin_keys.html | 5 ++--- .../subsilver2/template/ucp_profile_autologin_keys.html | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index a8af932cb6..a6c19508e2 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -34,7 +34,7 @@ {sessions.LOGIN_TIME} - {L_PROFILE_NO_AUTOLOGIN_KEYS} + {L_PROFILE_NO_AUTOLOGIN_KEYS} @@ -44,8 +44,7 @@
    - {S_HIDDEN_FIELDS}  - + {S_HIDDEN_FIELDS} {S_FORM_TOKEN}
    diff --git a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html index 2d3b9f98f8..1dab9acb9c 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html @@ -32,15 +32,14 @@ - {L_PROFILE_NO_AUTOLOGIN_KEYS} + {L_PROFILE_NO_AUTOLOGIN_KEYS} - {S_HIDDEN_FIELDS}  - + {S_HIDDEN_FIELDS} {S_FORM_TOKEN} From 70be7e109f067d6f6d1add488338294dd59c7785 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Fri, 18 May 2012 11:15:53 +0200 Subject: [PATCH 189/255] [ticket/10898] Do not write ?> into config.php to avoid whitespace output. PHPBB3-10898 --- phpBB/includes/functions_install.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 633b2755f0..9e9c48ff58 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -559,8 +559,6 @@ function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug = $config_data .= "// @define('DEBUG_EXTRA', true);\n"; } - $config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused! - return $config_data; } From e2d286d9f133ffb5128262fc88bfd86766f7b50f Mon Sep 17 00:00:00 2001 From: Rahul R Date: Sat, 19 May 2012 01:59:25 +0530 Subject: [PATCH 190/255] [ticket/10650] Subject is cleared if no permissions exist The subject line will be cleared before passing to the template in case the user doesn't have sufficient permissions. PHPBB3-10650 --- phpBB/includes/functions_display.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 950c1f0cd8..0c5b80c609 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -465,8 +465,8 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod 'FORUM_FOLDER_IMG_ALT' => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '', 'FORUM_IMAGE' => ($row['forum_image']) ? '' . $user->lang[$folder_alt] . '' : '', 'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '', - 'LAST_POST_SUBJECT' => censor_text($last_post_subject), - 'LAST_POST_SUBJECT_TRUNCATED' => $last_post_subject_truncated, + 'LAST_POST_SUBJECT' => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? censor_text($last_post_subject) : "", + 'LAST_POST_SUBJECT_TRUNCATED' => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? $last_post_subject_truncated : "", 'LAST_POST_TIME' => $last_post_time, 'LAST_POSTER' => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']), 'LAST_POSTER_COLOUR' => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']), From 7ec6254078e28e94410adb51cd95d5ea687ae39d Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 22 May 2012 01:25:19 +0200 Subject: [PATCH 191/255] [ticket/10890] Fix test_sql_fetchrow_returns_false_when_empty() on MS and ORA. Fix phpbb_dbal_select_test::test_sql_fetchrow_returns_false_when_empty() on MSSQL and Oracle by specifying an existing table in the query. PHPBB3-10890 --- tests/dbal/select_test.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/dbal/select_test.php b/tests/dbal/select_test.php index 1b04450fcd..81cd13b006 100644 --- a/tests/dbal/select_test.php +++ b/tests/dbal/select_test.php @@ -375,7 +375,9 @@ class phpbb_dbal_select_test extends phpbb_database_test_case { $db = $this->new_dbal(); - $sql = 'SELECT * FROM (SELECT 1) AS TBL WHERE 1 = 0'; + $sql = 'SELECT user_id + FROM phpbb_users + WHERE 1 = 0'; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); From ee875c0a43ac734d1693cdd7393c8f4277233426 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 22 May 2012 02:24:31 +0200 Subject: [PATCH 192/255] [ticket/10790] Remove a (kind of) dead code section from submit_pm(). The type of $user->data['user_id'] is (almost) guranteed to be integer since session::session_create() casts it to integer. The type of $row['user_id'] is only an integer if the DB driver adjusts the PHP type according to the DB type. This is only done by some of our not-so-popular DB drivers and is not the case for MySQL. As such this comparison is (almost) never true and a PM is also sent to the author itself when it is sent to a group the author is also a member of. Since this behaviour seems to have been accepted by the communty, the dead code is removed and current behaviour is kept. Also, checking this in the loop seems to be a rather bad idea. Introduced by 78b1c4caaa17cc8760b685ad41c19f15f9d89b68. PHPBB3-10790 --- phpBB/includes/functions_privmsgs.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index d2fce000aa..261ed45727 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1522,12 +1522,6 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true) while ($row = $db->sql_fetchrow($result)) { - // Additionally, do not include the sender if he is in the group he wants to send to. ;) - if ($row['user_id'] === $user->data['user_id']) - { - continue; - } - $field = ($data['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc'; $recipients[$row['user_id']] = $field; } From efbf14f029b7e6a1724fb1c5aa32294eb33017bc Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 22 May 2012 03:08:39 +0200 Subject: [PATCH 193/255] [ticket/10565] update_forum_tracking_info(): Remove unnecessary GROUP BY clause PHPBB3-10565 --- phpBB/includes/functions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index ce80dc4a66..b415b2742d 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1924,8 +1924,7 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti AND t.topic_last_post_time > ' . $mark_time_forum . ' AND t.topic_moved_id = 0 ' . $sql_update_unapproved . ' - AND (tt.topic_id IS NULL OR tt.mark_time < t.topic_last_post_time) - GROUP BY t.forum_id'; + AND (tt.topic_id IS NULL OR tt.mark_time < t.topic_last_post_time)'; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); From 896b43aa5b7fe439106beb50cf56d6f066928537 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 22 May 2012 03:11:53 +0200 Subject: [PATCH 194/255] [ticket/10565] Add line breaks to query in order to follow coding guidelines. PHPBB3-10565 --- phpBB/includes/functions.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index b415b2742d..bc811cc75b 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1918,13 +1918,17 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti } else { - $sql = 'SELECT t.forum_id FROM ' . TOPICS_TABLE . ' t - LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.topic_id = t.topic_id AND tt.user_id = ' . $user->data['user_id'] . ') + $sql = 'SELECT t.forum_id + FROM ' . TOPICS_TABLE . ' t + LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt + ON (tt.topic_id = t.topic_id + AND tt.user_id = ' . $user->data['user_id'] . ') WHERE t.forum_id = ' . $forum_id . ' AND t.topic_last_post_time > ' . $mark_time_forum . ' AND t.topic_moved_id = 0 ' . $sql_update_unapproved . ' - AND (tt.topic_id IS NULL OR tt.mark_time < t.topic_last_post_time)'; + AND (tt.topic_id IS NULL + OR tt.mark_time < t.topic_last_post_time)'; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); From ea1e2ed36280b8e3a4078885a07f7d3398ce5703 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 22 May 2012 03:32:54 +0200 Subject: [PATCH 195/255] [ticket/10401] Return correct type when ldap_bind() fails in ldap_login(). ldap_login() is supposed to return an array. PHPBB3-10401 --- phpBB/includes/auth/auth_ldap.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/auth/auth_ldap.php b/phpBB/includes/auth/auth_ldap.php index 5dfa74ddab..eebf147d48 100644 --- a/phpBB/includes/auth/auth_ldap.php +++ b/phpBB/includes/auth/auth_ldap.php @@ -156,7 +156,11 @@ function login_ldap(&$username, &$password) { if (!@ldap_bind($ldap, htmlspecialchars_decode($config['ldap_user']), htmlspecialchars_decode($config['ldap_password']))) { - return $user->lang['LDAP_NO_SERVER_CONNECTION']; + return array( + 'status' => LOGIN_ERROR_EXTERNAL_AUTH, + 'error_msg' => 'LDAP_NO_SERVER_CONNECTION', + 'user_row' => array('user_id' => ANONYMOUS), + ); } } From 9fa7ab62ad45abf3a5035cc792748893d6cd8a4d Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 21 May 2012 23:02:12 -0400 Subject: [PATCH 196/255] [ticket/10828] Connect to postgres database by default. When not connecting to a specific database, connect to postgres database which specifically exists as a default database to connect to. PHPBB3-10828 --- .../phpbb_database_test_connection_manager.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/test_framework/phpbb_database_test_connection_manager.php b/tests/test_framework/phpbb_database_test_connection_manager.php index c734c90a1a..ae21be6c34 100644 --- a/tests/test_framework/phpbb_database_test_connection_manager.php +++ b/tests/test_framework/phpbb_database_test_connection_manager.php @@ -80,6 +80,21 @@ class phpbb_database_test_connection_manager { $dsn .= ';dbname=' . $this->config['dbname']; } + else if ($this->dbms['PDO'] == 'pgsql') + { + // Postgres always connects to a + // database. If the database is not + // specified here, but the username + // is specified, then connection + // will be to the database named + // as the username. + // + // For greater compatibility, connect + // instead to postgres database which + // should always exist: + // http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html + $dsn .= ';dbname=postgres'; + } break; } From ffabfefe459c8fd94bf0706766134dd821d294a7 Mon Sep 17 00:00:00 2001 From: David King Date: Tue, 22 May 2012 10:14:20 -0400 Subject: [PATCH 197/255] [ticket/10906] Add setting for last post topic title in schema_data.sql PHPBB3-10906 --- phpBB/install/schemas/schema_data.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 2ea5eca768..5489fd4e3d 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -88,6 +88,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('dbms_version', '') INSERT INTO phpbb_config (config_name, config_value) VALUES ('default_dateformat', 'D M d, Y g:i a'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('default_style', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('display_last_edited', '1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('display_last_subject', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('display_order', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('edit_time', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('delete_time', '0'); From b96c05069569dd1db48a5bffa15c2fcd69369e6b Mon Sep 17 00:00:00 2001 From: David King Date: Tue, 22 May 2012 10:46:36 -0400 Subject: [PATCH 198/255] [task/functional] Change property visibility, remove globals, reword comment PHPBB3-10758 --- tests/test_framework/phpbb_functional_test_case.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index 177f93cf3b..59579c1c33 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -14,14 +14,16 @@ class phpbb_functional_test_case extends phpbb_test_case { protected $client; protected $root_url; + /** * @var string Session ID for current test's session (each test makes its own) */ protected $sid; + /** * @var array Language array used by phpBB */ - private $lang = array(); + protected $lang = array(); static protected $config = array(); static protected $already_installed = false; @@ -187,8 +189,8 @@ class phpbb_functional_test_case extends phpbb_test_case $login = $this->client->submit($form, array('username' => 'admin', 'password' => 'admin')); $cookies = $this->cookieJar->all(); - $sid = ''; - // get the SID from the cookie + + // The session id is stored in a cookie that ends with _sid - we assume there is only one such cookie foreach ($cookies as $key => $cookie); { if (substr($key, -4) == '_sid') @@ -200,8 +202,6 @@ class phpbb_functional_test_case extends phpbb_test_case protected function add_lang($lang_file) { - global $phpbb_root_path, $phpEx; - if (is_array($lang_file)) { foreach ($lang_file as $file) @@ -210,7 +210,7 @@ class phpbb_functional_test_case extends phpbb_test_case } } - $lang_path = "{$phpbb_root_path}language/en/$lang_file.$phpEx"; + $lang_path = "./phpBB/language/en/$lang_file.php"; $lang = array(); From 819accedc87921a6fd1788fa2164d023f6d97f98 Mon Sep 17 00:00:00 2001 From: David King Date: Tue, 22 May 2012 10:52:49 -0400 Subject: [PATCH 199/255] [task/functional] Fix $lang_path variable PHPBB3-10758 --- tests/test_framework/phpbb_functional_test_case.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index 59579c1c33..1bcc3928df 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -210,7 +210,7 @@ class phpbb_functional_test_case extends phpbb_test_case } } - $lang_path = "./phpBB/language/en/$lang_file.php"; + $lang_path = __DIR__ . "/../../phpBB/language/en/$lang_file.php"; $lang = array(); From 09d15db1fabe22fc241d80c528fbd95e0d9fa122 Mon Sep 17 00:00:00 2001 From: David King Date: Tue, 22 May 2012 12:06:27 -0300 Subject: [PATCH 200/255] [task/functional] Use proper format for @var doc blocks. PHPBB3-10758 --- tests/test_framework/phpbb_functional_test_case.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index 1bcc3928df..76fed76fae 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -16,12 +16,14 @@ class phpbb_functional_test_case extends phpbb_test_case protected $root_url; /** - * @var string Session ID for current test's session (each test makes its own) + * Session ID for current test's session (each test makes its own) + * @var string */ protected $sid; /** - * @var array Language array used by phpBB + * Language array used by phpBB + * @var array */ protected $lang = array(); From bad91d8e74eea420d9ea7d9a0ac0ecf47d23fdb7 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 22 May 2012 18:41:15 +0200 Subject: [PATCH 201/255] [ticket/10907] Mark (var)binary tests as incomplete on non-MySQL DBMSes. PHPBB3-10907 --- tests/dbal/db_tools_test.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php index 9bed0648cd..c20e46011f 100644 --- a/tests/dbal/db_tools_test.php +++ b/tests/dbal/db_tools_test.php @@ -165,6 +165,11 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case */ public function test_created_column($column_name, $column_value) { + if ($column_name === 'c_varbinary' && stripos(get_class($this->db), 'mysql') === false) + { + $this->markTestIncomplete('Binary handling is not implemented properly on non-MySQL DBMSes.'); + } + $row_insert = self::get_default_values(); $row_insert[$column_name] = $column_value; From a32a5925b357f78eb8735c0aaf1595935305c126 Mon Sep 17 00:00:00 2001 From: Vinny Date: Tue, 22 May 2012 15:34:39 -0300 Subject: [PATCH 202/255] [ticket/10905] Last topic title for subsilver2 PHPBB3-10905 --- phpBB/styles/subsilver2/template/forumlist_body.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpBB/styles/subsilver2/template/forumlist_body.html b/phpBB/styles/subsilver2/template/forumlist_body.html index 334fd7a968..be32d1fb77 100644 --- a/phpBB/styles/subsilver2/template/forumlist_body.html +++ b/phpBB/styles/subsilver2/template/forumlist_body.html @@ -56,6 +56,9 @@

    {forumrow.POSTS}

    + +

    {forumrow.LAST_POST_SUBJECT_TRUNCATED}

    +

    {UNAPPROVED_IMG} {forumrow.LAST_POST_TIME}

    {forumrow.LAST_POSTER_FULL} {LAST_POST_IMG} From 22cc7c73fdb26420bdf5b7a509da9a22925e274a Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Tue, 22 May 2012 19:38:30 +0100 Subject: [PATCH 203/255] [ticket/10855] Fixed a couple issues in coding guidelines. PHPBB3-10855 --- phpBB/docs/coding-guidelines.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html index 237bc18d20..ae4655e094 100644 --- a/phpBB/docs/coding-guidelines.html +++ b/phpBB/docs/coding-guidelines.html @@ -301,7 +301,7 @@ PHPBB_QA (Set board to QA-Mode, which means the updater also c

    $current_user is right, but $currentuser and $currentUser are not.

    -

    In JavaScript, variable names should use camel caps:

    +

    In JavaScript, variable names should use camel case:

    currentUser is right, but currentuser and current_user are not.

    @@ -532,7 +532,7 @@ $post_url = "{$phpbb_root_path}posting.$phpEx?mode=$mode&amp;start=$start";

    In SQL statements mixing single and double quotes is partly allowed (following the guidelines listed here about SQL formatting), else one should try to only use one method - mostly single quotes.

    Commas after every array element:

    -

    If an array is defined with each element on its own line, you still have to modify the previous line to add a comma when appending a new element. PHP allows for trailing (useless) commas in array definitions. These should always be used so each element including the comma can be appended with a single line. In JavaScript, you should not use the trailing comma, as IE doesn't like it.

    +

    If an array is defined with each element on its own line, you still have to modify the previous line to add a comma when appending a new element. PHP allows for trailing (useless) commas in array definitions. These should always be used so each element including the comma can be appended with a single line. In JavaScript, do not use the trailing comma, as it causes browsers to throw errors.

    // wrong

    
    From c31996ea84fff5038328974b511c95d95fcd3fe7 Mon Sep 17 00:00:00 2001
    From: David King 
    Date: Sat, 26 May 2012 21:21:22 -0400
    Subject: [PATCH 204/255] [ticket/10912] Default last post subject to empty
     lacking last post info
    
    PHPBB3-10912
    ---
     phpBB/includes/functions_display.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
    index 0c5b80c609..1f45d5e8e1 100644
    --- a/phpBB/includes/functions_display.php
    +++ b/phpBB/includes/functions_display.php
    @@ -403,7 +403,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
     		}
     		else
     		{
    -			$last_post_subject = $last_post_time = $last_post_url = '';
    +			$last_post_subject = $last_post_time = $last_post_url = $last_post_subject_truncated = '';
     		}
     
     		// Output moderator listing ... if applicable
    
    From 8cb9004ab3ba01e0833ae25418691f8f69bf0172 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Sun, 27 May 2012 12:30:12 +0200
    Subject: [PATCH 205/255] [ticket/10909] Also test develop-olympus with low PHP
     5.3 version on travis.
    
    Also test develop-olympus with low PHP 5.3 version (i.e. PHP 5.3.3) on travis.
    
    PHPBB3-10909
    ---
     .travis.yml | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/.travis.yml b/.travis.yml
    index d73bbd2a48..6a1ecedac4 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -1,6 +1,7 @@
     language: php
     php:
       - 5.2
    +  - 5.3.3
       - 5.3
       - 5.4
     
    
    From 13f30e8d9d05b69f8b7fda451fa6062b199dd7f7 Mon Sep 17 00:00:00 2001
    From: Nils Adermann 
    Date: Tue, 29 May 2012 14:27:25 +0200
    Subject: [PATCH 206/255] [ticket/10908] Download files only up to
     max_upload_filesize if limit is 0
    
    PHPBB3-10908
    ---
     phpBB/includes/functions_upload.php | 33 +++++++++++++++++++++++++----
     1 file changed, 29 insertions(+), 4 deletions(-)
    
    diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php
    index d5bbd80242..73ac1df2d2 100644
    --- a/phpBB/includes/functions_upload.php
    +++ b/phpBB/includes/functions_upload.php
    @@ -751,6 +751,31 @@ class fileupload
     		$filename = $url['path'];
     		$filesize = 0;
     
    +		$remote_max_filesize = $this->max_filesize;
    +		if (!$remote_max_filesize)
    +		{
    +			$max_filesize = @ini_get('upload_max_filesize');
    +
    +			if (!empty($max_filesize))
    +			{
    +				$unit = strtolower(substr($max_filesize, -1, 1));
    +				$remote_max_filesize = (int) $max_filesize;
    +
    +				switch ($unit)
    +				{
    +					case 'g':
    +						$remote_max_filesize *= 1024;
    +					// no break
    +					case 'm':
    +						$remote_max_filesize *= 1024;
    +					// no break
    +					case 'k':
    +						$remote_max_filesize *= 1024;
    +					// no break
    +				}
    +			}
    +		}
    +
     		$errno = 0;
     		$errstr = '';
     
    @@ -779,9 +804,9 @@ class fileupload
     				$block = @fread($fsock, 1024);
     				$filesize += strlen($block);
     
    -				if ($this->max_filesize && $filesize > $this->max_filesize)
    +				if ($remote_max_filesize && $filesize > $remote_max_filesize)
     				{
    -					$max_filesize = get_formatted_filesize($this->max_filesize, false);
    +					$max_filesize = get_formatted_filesize($remote_max_filesize, false);
     
     					$file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']));
     					return $file;
    @@ -807,9 +832,9 @@ class fileupload
     					{
     						$length = (int) str_replace('content-length: ', '', strtolower($line));
     
    -						if ($length && $length > $this->max_filesize)
    +						if ($remote_max_filesize && $length && $length > $remote_max_filesize)
     						{
    -							$max_filesize = get_formatted_filesize($this->max_filesize, false);
    +							$max_filesize = get_formatted_filesize($remote_max_filesize, false);
     
     							$file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']));
     							return $file;
    
    From 42dd60edad6c3533f6b718e731d43661641fd1fc Mon Sep 17 00:00:00 2001
    From: Nils Adermann 
    Date: Tue, 29 May 2012 14:54:04 +0200
    Subject: [PATCH 207/255] [ticket/10913] Redirect to index if session id is
     required but was not sent
    
    PHPBB3-10913
    ---
     phpBB/includes/session.php | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php
    index a894242a39..496c12a0d1 100644
    --- a/phpBB/includes/session.php
    +++ b/phpBB/includes/session.php
    @@ -322,8 +322,15 @@ class session
     			}
     		}
     
    -		// Is session_id is set or session_id is set and matches the url param if required
    -		if (!empty($this->session_id) && (!defined('NEED_SID') || (isset($_GET['sid']) && $this->session_id === $_GET['sid'])))
    +		// if no session id is set, redirect to index.php
    +		if (defined('NEED_SID') && (!isset($_GET['sid']) || $this->session_id !== $_GET['sid']))
    +		{
    +			send_status_line(401, 'Not authorized');
    +			redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
    +		}
    +
    +		// if session id is set
    +		if (!empty($this->session_id))
     		{
     			$sql = 'SELECT u.*, s.*
     				FROM ' . SESSIONS_TABLE . ' s, ' . USERS_TABLE . " u
    
    From 701bf571dfffa171271d567759cf92c3830d159c Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Tue, 29 May 2012 15:29:31 +0200
    Subject: [PATCH 208/255] [ticket/10550] Sort not installed styles list in the
     styles section of the ACP.
    
    PHPBB3-10550
    ---
     phpBB/includes/acp/acp_styles.php | 6 +++++-
     1 file changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php
    index d7b0484af8..47cd02bca7 100644
    --- a/phpBB/includes/acp/acp_styles.php
    +++ b/phpBB/includes/acp/acp_styles.php
    @@ -667,7 +667,9 @@ inherit_from = {INHERIT_FROM}
     
     						if ($name && !in_array($name, $installed))
     						{
    -							$new_ary[] = array(
    +							// The array key is used for sorting later on.
    +							// $file is appended because $name doesn't have to be unique.
    +							$new_ary[$name . $file] = array(
     								'path'		=> $file,
     								'name'		=> $name,
     								'copyright'	=> $items['copyright'],
    @@ -683,6 +685,8 @@ inherit_from = {INHERIT_FROM}
     
     		if (sizeof($new_ary))
     		{
    +			ksort($new_ary);
    +
     			foreach ($new_ary as $cfg)
     			{
     				$template->assign_block_vars('uninstalled', array(
    
    From c494abc8c765f2398b0b782fc6979a5e033bb0f5 Mon Sep 17 00:00:00 2001
    From: Nils Adermann 
    Date: Tue, 29 May 2012 15:49:52 +0200
    Subject: [PATCH 209/255] [ticket/10908] Document that 0 filesize configuration
     means limited by PHP
    
    PHPBB3-10908
    ---
     phpBB/language/en/acp/attachments.php | 2 +-
     phpBB/language/en/acp/board.php       | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/phpBB/language/en/acp/attachments.php b/phpBB/language/en/acp/attachments.php
    index 1821b8c867..6aeb3c2188 100644
    --- a/phpBB/language/en/acp/attachments.php
    +++ b/phpBB/language/en/acp/attachments.php
    @@ -57,7 +57,7 @@ $lang = array_merge($lang, array(
     	'ATTACH_EXT_GROUPS_URL'				=> 'Extension groups',
     	'ATTACH_ID'							=> 'ID',
     	'ATTACH_MAX_FILESIZE'				=> 'Maximum file size',
    -	'ATTACH_MAX_FILESIZE_EXPLAIN'		=> 'Maximum size of each file, with 0 being unlimited.',
    +	'ATTACH_MAX_FILESIZE_EXPLAIN'		=> 'Maximum size of each file. If this value is 0, the uploadable filesize is only limited by your PHP configuration.',
     	'ATTACH_MAX_PM_FILESIZE'			=> 'Maximum file size messaging',
     	'ATTACH_MAX_PM_FILESIZE_EXPLAIN'	=> 'Maximum size of each file, with 0 being unlimited, attached to a private message.',
     	'ATTACH_ORPHAN_URL'					=> 'Orphan attachments',
    diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php
    index 6e6d4302cd..f24376f8aa 100644
    --- a/phpBB/language/en/acp/board.php
    +++ b/phpBB/language/en/acp/board.php
    @@ -108,7 +108,7 @@ $lang = array_merge($lang, array(
     	'MAX_AVATAR_SIZE'				=> 'Maximum avatar dimensions',
     	'MAX_AVATAR_SIZE_EXPLAIN'		=> 'Width x Height in pixels.',
     	'MAX_FILESIZE'					=> 'Maximum avatar file size',
    -	'MAX_FILESIZE_EXPLAIN'			=> 'For uploaded avatar files.',
    +	'MAX_FILESIZE_EXPLAIN'			=> 'For uploaded avatar files. If this value is 0, the uploaded filesize is only limited by your PHP configuration.',
     	'MIN_AVATAR_SIZE'				=> 'Minimum avatar dimensions',
     	'MIN_AVATAR_SIZE_EXPLAIN'		=> 'Width x Height in pixels.',
     ));
    
    From 6036b948ff8ff02f890d46000aafea5dd157d025 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Wed, 30 May 2012 13:38:41 +0200
    Subject: [PATCH 210/255] [ticket/10611] Generate db_tools instance in
     acp_database module.
    
    PHPBB3-10611
    ---
     phpBB/includes/acp/acp_database.php | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
    index 62bcd43a47..6380f221f8 100644
    --- a/phpBB/includes/acp/acp_database.php
    +++ b/phpBB/includes/acp/acp_database.php
    @@ -21,6 +21,7 @@ if (!defined('IN_PHPBB'))
     */
     class acp_database
     {
    +	var $db_tools;
     	var $u_action;
     
     	function main($id, $mode)
    @@ -28,6 +29,12 @@ class acp_database
     		global $cache, $db, $user, $auth, $template, $table_prefix;
     		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
     
    +		if (!class_exists('phpbb_db_tools'))
    +		{
    +			require($phpbb_root_path . 'includes/db/db_tools.' . $phpEx);
    +		}
    +		$this->db_tools = new phpbb_db_tools($db);
    +
     		$user->add_lang('acp/database');
     
     		$this->tpl_name = 'acp_database';
    
    From 515c27270fe04b5e2f69a0cedc5007ef889fdf77 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Wed, 30 May 2012 13:41:36 +0200
    Subject: [PATCH 211/255] [ticket/10611] Use phpbb_db_tools::sql_list_tables()
     instead of get_tables().
    
    get_tables() was deprecated by phpbb_db_tools::sql_list_tables()
    
    This prevents unnecessarily loading functions_install.php
    
    PHPBB3-10611
    ---
     phpBB/includes/acp/acp_database.php | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
    index 6380f221f8..885760f859 100644
    --- a/phpBB/includes/acp/acp_database.php
    +++ b/phpBB/includes/acp/acp_database.php
    @@ -180,8 +180,7 @@ class acp_database
     					break;
     
     					default:
    -						include($phpbb_root_path . 'includes/functions_install.' . $phpEx);
    -						$tables = get_tables($db);
    +						$tables = $this->db_tools->sql_list_tables();
     						asort($tables);
     						foreach ($tables as $table_name)
     						{
    
    From 9240ddbfa7cc4deb2076dcb989e6bfb318652e47 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Wed, 30 May 2012 13:45:00 +0200
    Subject: [PATCH 212/255] [ticket/10611] Filter out not existing database
     tables when making a backup.
    
    Using $this->db_tools->sql_list_tables() as the first argument gives us table
    names as array keys as a by-product which might be useful at some point.
    
    PHPBB3-10611
    ---
     phpBB/includes/acp/acp_database.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
    index 885760f859..758cd10434 100644
    --- a/phpBB/includes/acp/acp_database.php
    +++ b/phpBB/includes/acp/acp_database.php
    @@ -57,7 +57,7 @@ class acp_database
     				{
     					case 'download':
     						$type	= request_var('type', '');
    -						$table	= request_var('table', array(''));
    +						$table	= array_intersect($this->db_tools->sql_list_tables(), request_var('table', array('')));
     						$format	= request_var('method', '');
     						$where	= request_var('where', '');
     
    
    From de4dff8bb077e98e203e0e83bd52630053970ee0 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Wed, 30 May 2012 21:01:25 +0200
    Subject: [PATCH 213/255] [ticket/10162] Add test cases for top level domain
     names longer than 6 chars.
    
    PHPBB3-10162
    ---
     tests/regex/email_test.php | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/tests/regex/email_test.php b/tests/regex/email_test.php
    index 17f93259c3..b4ea5b23aa 100644
    --- a/tests/regex/email_test.php
    +++ b/tests/regex/email_test.php
    @@ -28,6 +28,8 @@ class phpbb_regex_email_test extends phpbb_test_case
     			array('alice_foo@bar.phpbb.com'),
     			array('alice+tag@foo.phpbb.com'),
     			array('alice&tag@foo.phpbb.com'),
    +			array('alice@phpbb.australia'),
    +			array('alice@phpbb.topZlevelZdomainZnamesZcanZbeZupZtoZsixtyZthreeZcharactersZlong'),
     
     			//array('"John Doe"@example.com'),
     			//array('Alice@[192.168.2.1]'),		// IPv4
    @@ -96,6 +98,7 @@ class phpbb_regex_email_test extends phpbb_test_case
     			array('! "#$%(),/;<>[]`|@invalidCharsInLocal.org'),
     			array('invalidCharsInDomain@! "#$%(),/;<>_[]`|.org'),
     			array('local@SecondLevelDomainNamesAreInvalidIfTheyAreLongerThan64Charactersss.org'),
    +			array('alice@phpbb.topZlevelZdomainZnamesZcanZbeZupZtoZsixtyZthreeZcharactersZlongZ'),
     		);
     	}
     
    
    From 037b95eccc1f039e687360d9f804f7323a65e9df Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Wed, 30 May 2012 21:09:30 +0200
    Subject: [PATCH 214/255] [ticket/10162] Increase maximum length of email
     address TLD from 6 to 63.
    
    Increase maximum length of email address top level domains from 6 to 63.
    
    PHPBB3-10162
    ---
     phpBB/includes/functions.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
    index bc811cc75b..5914831539 100644
    --- a/phpBB/includes/functions.php
    +++ b/phpBB/includes/functions.php
    @@ -3456,7 +3456,7 @@ function get_preg_expression($mode)
     		case 'email':
     			// Regex written by James Watts and Francisco Jose Martin Moreno
     			// http://fightingforalostcause.net/misc/2006/compare-email-regex.php
    -			return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)';
    +			return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)';
     		break;
     
     		case 'bbcode_htm':
    
    From 643a86504a30f6b9fbe0f073bb03009b4fbd0f43 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Thu, 31 May 2012 11:44:41 +0200
    Subject: [PATCH 215/255] [ticket/10751] Add sql_lower_text() to database
     abstraction layer.
    
    On MSSQL, LOWER() can only be called on bounded strings (i.e. varchar or char).
    So, in order to use it on a text column, we have to convert it to an
    appropriate type. We do so using the SUBSTRING function.
    
    PHPBB3-10751
    ---
     phpBB/includes/db/dbal.php        | 12 ++++++++++++
     phpBB/includes/db/mssql.php       |  8 ++++++++
     phpBB/includes/db/mssql_odbc.php  |  8 ++++++++
     phpBB/includes/db/mssqlnative.php |  8 ++++++++
     4 files changed, 36 insertions(+)
    
    diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php
    index 358df50402..9cc337955b 100644
    --- a/phpBB/includes/db/dbal.php
    +++ b/phpBB/includes/db/dbal.php
    @@ -500,6 +500,18 @@ class dbal
     		return $column_name . ' | ' . (1 << $bit) . (($compare) ? ' ' . $compare : '');
     	}
     
    +	/**
    +	* Run LOWER() on DB column of type text (i.e. neither varchar nor char).
    +	*
    +	* @param string $column_name	The column name to use
    +	*
    +	* @return string				A SQL statement like "LOWER($column_name)"
    +	*/
    +	function sql_lower_text($column_name)
    +	{
    +		return "LOWER($column_name)";
    +	}
    +
     	/**
     	* Run more than one insert statement.
     	*
    diff --git a/phpBB/includes/db/mssql.php b/phpBB/includes/db/mssql.php
    index 6899a73902..b7178593dc 100644
    --- a/phpBB/includes/db/mssql.php
    +++ b/phpBB/includes/db/mssql.php
    @@ -332,6 +332,14 @@ class dbal_mssql extends dbal
     		return str_replace(array("'", "\0"), array("''", ''), $msg);
     	}
     
    +	/**
    +	* {@inheritDoc}
    +	*/
    +	function sql_lower_text($column_name)
    +	{
    +		return "LOWER(SUBSTRING($column_name, 1, DATALENGTH($column_name)))";
    +	}
    +
     	/**
     	* Build LIKE expression
     	* @access private
    diff --git a/phpBB/includes/db/mssql_odbc.php b/phpBB/includes/db/mssql_odbc.php
    index 34f7a87337..2ecc42cadf 100644
    --- a/phpBB/includes/db/mssql_odbc.php
    +++ b/phpBB/includes/db/mssql_odbc.php
    @@ -310,6 +310,14 @@ class dbal_mssql_odbc extends dbal
     		return str_replace(array("'", "\0"), array("''", ''), $msg);
     	}
     
    +	/**
    +	* {@inheritDoc}
    +	*/
    +	function sql_lower_text($column_name)
    +	{
    +		return "LOWER(SUBSTRING($column_name, 1, DATALENGTH($column_name)))";
    +	}
    +
     	/**
     	* Build LIKE expression
     	* @access private
    diff --git a/phpBB/includes/db/mssqlnative.php b/phpBB/includes/db/mssqlnative.php
    index 92ac9b1fb9..c91cc188b0 100644
    --- a/phpBB/includes/db/mssqlnative.php
    +++ b/phpBB/includes/db/mssqlnative.php
    @@ -492,6 +492,14 @@ class dbal_mssqlnative extends dbal
     		return str_replace(array("'", "\0"), array("''", ''), $msg);
     	}
     
    +	/**
    +	* {@inheritDoc}
    +	*/
    +	function sql_lower_text($column_name)
    +	{
    +		return "LOWER(SUBSTRING($column_name, 1, DATALENGTH($column_name)))";
    +	}
    +
     	/**
     	* Build LIKE expression
     	* @access private
    
    From 9ab5ad2986a836554bbf137d577c38155540c0a8 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Thu, 31 May 2012 11:48:56 +0200
    Subject: [PATCH 216/255] [ticket/10751] Use sql_lower_text() in view_log().
     log_data is a text column.
    
    PHPBB3-10751
    ---
     phpBB/includes/functions_admin.php | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
    index 0e1a11b4aa..204fa9a43d 100644
    --- a/phpBB/includes/functions_admin.php
    +++ b/phpBB/includes/functions_admin.php
    @@ -2557,7 +2557,8 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id
     		{
     			$sql_keywords .= $db->sql_in_set('l.log_operation', $operations) . ' OR ';
     		}
    -		$sql_keywords .= 'LOWER(l.log_data) ' . implode(' OR LOWER(l.log_data) ', $keywords) . ')';
    +		$sql_lower = $db->sql_lower_text('l.log_data');
    +		$sql_keywords .= "$sql_lower " . implode(" OR $sql_lower ", $keywords) . ')';
     	}
     
     	if ($log_count !== false)
    
    From d22e7ce9df7d54591430fb542f2c2e14535c18cc Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Thu, 31 May 2012 19:57:13 +0200
    Subject: [PATCH 217/255] [ticket/10788] Add Arty to the list of phpBB
     developers in docs/AUTHORS.
    
    PHPBB3-10788
    ---
     phpBB/docs/AUTHORS | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS
    index 57adec6a67..446b204a08 100644
    --- a/phpBB/docs/AUTHORS
    +++ b/phpBB/docs/AUTHORS
    @@ -23,6 +23,7 @@ involved in phpBB.
     phpBB Lead Developer:  naderman (Nils Adermann)
     
     phpBB Developers:      Acyd Burn (Meik Sievertsen) [Lead 09/2005 - 01/2010]
    +                       Arty (Vjacheslav Trushkin)
                            bantu (Andreas Fischer)
                            imkingdavid (David King)
                            igorw (Igor Wiedler)
    
    From d8ddda512180be56100a890410dece8046aade28 Mon Sep 17 00:00:00 2001
    From: Andreas Fischer 
    Date: Thu, 31 May 2012 20:19:28 +0200
    Subject: [PATCH 218/255] [develop-olympus] Bumping version numbers to final
     for 3.0.11 releases.
    
    ---
     phpBB/docs/INSTALL.html                       | 4 ++--
     phpBB/install/convertors/convert_phpbb20.php  | 2 +-
     phpBB/styles/prosilver/imageset/imageset.cfg  | 2 +-
     phpBB/styles/prosilver/style.cfg              | 2 +-
     phpBB/styles/prosilver/template/template.cfg  | 2 +-
     phpBB/styles/prosilver/theme/theme.cfg        | 2 +-
     phpBB/styles/subsilver2/imageset/imageset.cfg | 2 +-
     phpBB/styles/subsilver2/style.cfg             | 2 +-
     phpBB/styles/subsilver2/template/template.cfg | 2 +-
     phpBB/styles/subsilver2/theme/theme.cfg       | 2 +-
     10 files changed, 11 insertions(+), 11 deletions(-)
    
    diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html
    index 6ab118e3ee..e17f496c56 100644
    --- a/phpBB/docs/INSTALL.html
    +++ b/phpBB/docs/INSTALL.html
    @@ -274,7 +274,7 @@
     
     	

    This package is meant for those wanting to only replace changed files from a previous version to the latest version. This package normally contains the changed files from up to five previous versions.

    -

    This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have 3.0.9 you should select the phpBB-3.0.9_to_3.0.10.zip/tar.gz file.

    +

    This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have 3.0.10 you should select the phpBB-3.0.10_to_3.0.11.zip/tar.gz file.

    The directory structure has been preserved enabling you (if you wish) to simply upload the contents of the archive to the appropriate location on your server, i.e. simply overwrite the existing files with the new versions. Do not forget that if you have installed any MODs these files will overwrite the originals possibly destroying them in the process. You will need to re-add MODs to any affected file before uploading.

    @@ -286,7 +286,7 @@

    The patch file is one solution for those with many Modifications (MODs) or other changes who do not want to re-add them back to all the changed files if they use the method explained above. To use this you will need command line access to a standard UNIX type patch application. If you do not have access to such an application but still want to use this update approach, we strongly recommend the Automatic update package explained below. It is also the recommended update method.

    -

    A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.9 you need the phpBB-3.0.9_to_3.0.10.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: patch -cl -d [PHPBB DIRECTORY] -p1 < [PATCH NAME] (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.

    +

    A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.10 you need the phpBB-3.0.10_to_3.0.11.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: patch -cl -d [PHPBB DIRECTORY] -p1 < [PATCH NAME] (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.

    If you do get failures you should look at using the Changed files only package to replace the files which failed to patch, please note that you will need to manually re-add any Modifications (MODs) to these particular files. Alternatively if you know how you can examine the .rej files to determine what failed where and make manual adjustments to the relevant source.

    diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php index 81cc2f68f3..7d6fed6164 100644 --- a/phpBB/install/convertors/convert_phpbb20.php +++ b/phpBB/install/convertors/convert_phpbb20.php @@ -32,7 +32,7 @@ unset($dbpasswd); $convertor_data = array( 'forum_name' => 'phpBB 2.0.x', 'version' => '1.0.3', - 'phpbb_version' => '3.0.10', + 'phpbb_version' => '3.0.11', 'author' => 'phpBB Group', 'dbms' => $dbms, 'dbhost' => $dbhost, diff --git a/phpBB/styles/prosilver/imageset/imageset.cfg b/phpBB/styles/prosilver/imageset/imageset.cfg index 5a703d9e47..d7ba7690f6 100644 --- a/phpBB/styles/prosilver/imageset/imageset.cfg +++ b/phpBB/styles/prosilver/imageset/imageset.cfg @@ -19,7 +19,7 @@ # General Information about this style name = prosilver copyright = © phpBB Group, 2007 -version = 3.0.10 +version = 3.0.11 # Images img_site_logo = site_logo.gif*52*139 diff --git a/phpBB/styles/prosilver/style.cfg b/phpBB/styles/prosilver/style.cfg index 95d8d287e4..97e8aced01 100644 --- a/phpBB/styles/prosilver/style.cfg +++ b/phpBB/styles/prosilver/style.cfg @@ -19,4 +19,4 @@ # General Information about this style name = prosilver copyright = © phpBB Group, 2007 -version = 3.0.10 \ No newline at end of file +version = 3.0.11 \ No newline at end of file diff --git a/phpBB/styles/prosilver/template/template.cfg b/phpBB/styles/prosilver/template/template.cfg index 0b0533573a..eb3df8bfd3 100644 --- a/phpBB/styles/prosilver/template/template.cfg +++ b/phpBB/styles/prosilver/template/template.cfg @@ -19,7 +19,7 @@ # General Information about this template name = prosilver copyright = © phpBB Group, 2007 -version = 3.0.10 +version = 3.0.11 # Defining a different template bitfield template_bitfield = lNg= diff --git a/phpBB/styles/prosilver/theme/theme.cfg b/phpBB/styles/prosilver/theme/theme.cfg index e8698f7fe4..ec489d0b3d 100644 --- a/phpBB/styles/prosilver/theme/theme.cfg +++ b/phpBB/styles/prosilver/theme/theme.cfg @@ -21,7 +21,7 @@ # General Information about this theme name = prosilver copyright = © phpBB Group, 2007 -version = 3.0.10 +version = 3.0.11 # Some configuration options diff --git a/phpBB/styles/subsilver2/imageset/imageset.cfg b/phpBB/styles/subsilver2/imageset/imageset.cfg index 75a4aad038..c943db6735 100644 --- a/phpBB/styles/subsilver2/imageset/imageset.cfg +++ b/phpBB/styles/subsilver2/imageset/imageset.cfg @@ -19,7 +19,7 @@ # General Information about this style name = subsilver2 copyright = © phpBB Group, 2003 -version = 3.0.10 +version = 3.0.11 # Images img_site_logo = site_logo.gif*94*170 diff --git a/phpBB/styles/subsilver2/style.cfg b/phpBB/styles/subsilver2/style.cfg index 13e44435c6..4c40ee4438 100644 --- a/phpBB/styles/subsilver2/style.cfg +++ b/phpBB/styles/subsilver2/style.cfg @@ -19,4 +19,4 @@ # General Information about this style name = subsilver2 copyright = © 2005 phpBB Group -version = 3.0.10 +version = 3.0.11 diff --git a/phpBB/styles/subsilver2/template/template.cfg b/phpBB/styles/subsilver2/template/template.cfg index d557edba87..6568aeca08 100644 --- a/phpBB/styles/subsilver2/template/template.cfg +++ b/phpBB/styles/subsilver2/template/template.cfg @@ -19,7 +19,7 @@ # General Information about this template name = subsilver2 copyright = © phpBB Group, 2003 -version = 3.0.10 +version = 3.0.11 # Template inheritance # See http://blog.phpbb.com/2008/07/31/templating-just-got-easier/ diff --git a/phpBB/styles/subsilver2/theme/theme.cfg b/phpBB/styles/subsilver2/theme/theme.cfg index d7837a3766..5bd4480eef 100644 --- a/phpBB/styles/subsilver2/theme/theme.cfg +++ b/phpBB/styles/subsilver2/theme/theme.cfg @@ -21,7 +21,7 @@ # General Information about this theme name = subsilver2 copyright = © phpBB Group, 2003 -version = 3.0.10 +version = 3.0.11 # Some configuration options From 2011085c29d3141d66d390449b52ba6bd069ab69 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 31 May 2012 20:26:28 +0200 Subject: [PATCH 219/255] [develop-olympus] Bump version numbers for 3.0.11-RC1 release. --- build/build.xml | 6 +++--- phpBB/includes/constants.php | 2 +- phpBB/install/database_update.php | 6 +++--- phpBB/install/schemas/schema_data.sql | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/build.xml b/build/build.xml index 3d8d3de640..c1179015eb 100644 --- a/build/build.xml +++ b/build/build.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php index a0444ea594..5b72d89795 100644 --- a/phpBB/includes/constants.php +++ b/phpBB/includes/constants.php @@ -25,7 +25,7 @@ if (!defined('IN_PHPBB')) */ // phpBB Version -define('PHPBB_VERSION', '3.0.11-dev'); +define('PHPBB_VERSION', '3.0.11-RC1'); // QA-related // define('PHPBB_QA', 1); diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index c700b483a5..c1fe144c62 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -8,7 +8,7 @@ * */ -define('UPDATES_TO_VERSION', '3.0.11-dev'); +define('UPDATES_TO_VERSION', '3.0.11-RC1'); // Enter any version to update from to test updates. The version within the db will not be updated. define('DEBUG_FROM_VERSION', false); @@ -951,7 +951,7 @@ function database_update_info() // this column was removed from the database updater // after 3.0.9-RC3 was released. It might still exist // in 3.0.9-RCX installations and has to be dropped in - // 3.0.11 after the db_tools class is capable of properly + // 3.0.12 after the db_tools class is capable of properly // removing a primary key. // 'attempt_id' => array('UINT', NULL, 'auto_increment'), 'attempt_ip' => array('VCHAR:40', ''), @@ -996,7 +996,7 @@ function database_update_info() // No changes from 3.0.10 to 3.0.11-RC1 '3.0.10' => array(), - /** @todo DROP LOGIN_ATTEMPT_TABLE.attempt_id in 3.0.11-RC1 */ + /** @todo DROP LOGIN_ATTEMPT_TABLE.attempt_id in 3.0.12-RC1 */ ); } diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index ba2d18da00..99b8f7f96d 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -246,7 +246,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.11-dev'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.0.11-RC1'); 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'); From 19a47dfbbc4265e33c14d6679b5693d80120db4b Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 31 May 2012 20:56:40 +0200 Subject: [PATCH 220/255] [develop-olympus] Add changelog for 3.0.11 release. --- phpBB/docs/CHANGELOG.html | 155 +++++++++++++++++++++++++++++++++----- 1 file changed, 136 insertions(+), 19 deletions(-) diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html index 2d3b6a6809..71e28be9bc 100644 --- a/phpBB/docs/CHANGELOG.html +++ b/phpBB/docs/CHANGELOG.html @@ -53,6 +53,7 @@
    1. Changelog
        +
      1. Changes since 3.0.10
      2. Changes since 3.0.9
      3. Changes since 3.0.8
      4. Changes since 3.0.7-PL1
      5. @@ -91,7 +92,123 @@
        -

        1.i. Changes since 3.0.9

        +

        1.i. Changes since 3.0.10

        + +

        Bug

        +
          +
        • [PHPBB3-7432] - Unclear language for Inactive Users on ACP main page
        • +
        • [PHPBB3-8652] - Duplicate Emails Sent When Subscribed to Forum and Topic
        • +
        • [PHPBB3-9079] - Display backtrace on all E_USER_ERROR errors, not only SQL errors (when DEBUG_EXTRA is enabled)
        • +
        • [PHPBB3-9084] - Unable to display 'option equal to non entered value' if dropdown CPF is not required
        • +
        • [PHPBB3-9089] - PM message title box not accessible via Tab key
        • +
        • [PHPBB3-9220] - Blue border width when table in a div
        • +
        • [PHPBB3-9681] - Password length not in security settings
        • +
        • [PHPBB3-9813] - fulltext_native.php on innodb loading deadly slow for big indexes
        • +
        • [PHPBB3-9831] - Cannot change default of Boolean checkbox custom profile field
        • +
        • [PHPBB3-10094] - Clear cache before phpBB installation
        • +
        • [PHPBB3-10129] - Missing apostrophes in ACP user management -> permissions
        • +
        • [PHPBB3-10349] - Unit tests do not remove comments from schemas
        • +
        • [PHPBB3-10399] - Special characters aren't parsed in style component variables
        • +
        • [PHPBB3-10401] - auth_ldap has an incorrect return value in login_ldap()
        • +
        • [PHPBB3-10407] - Incorrect check for empty image file paths during conversion
        • +
        • [PHPBB3-10428] - optionget/optionset functions in session.php and acp_users.php incorrectly check whether $data is at its default value
        • +
        • [PHPBB3-10456] - Subsilver2 does not define $CAPTCHA_TAB_INDEX
        • +
        • [PHPBB3-10508] - Marking forums as read displays misleading language
        • +
        • [PHPBB3-10511] - Grammar defect in permissions language
        • +
        • [PHPBB3-10512] - Test failure when no default timezone is set in php
        • +
        • [PHPBB3-10532] - Out of range $start causes a page with no search results but with pagination
        • +
        • [PHPBB3-10538] - Special character are not correctly parsed for SMTP protocol
        • +
        • [PHPBB3-10542] - Incorrect class="postlink" in styles/subsilver2/template/faq_body.html
        • +
        • [PHPBB3-10546] - Argument missing for adm_back_link() in acp_captcha.php
        • +
        • [PHPBB3-10561] - All users can choose deactivated styles.
        • +
        • [PHPBB3-10569] - template/ucp_main_front.html does not correctly handle active topic with the name "0"
        • +
        • [PHPBB3-10580] - Default tz in registration dropdown not the same as the board default tz
        • +
        • [PHPBB3-10589] - user_birthday does not use table alias in $leap_year_birthdays variable definition
        • +
        • [PHPBB3-10605] - Orpahned privmsgs are left in the prvmsgs table, with no ties in privmsgs_to table
        • +
        • [PHPBB3-10606] - $s_hidden_fields -> incorrect array name (3 files affected)
        • +
        • [PHPBB3-10611] - Add a check for selected tables existence for ACP database backup tool
        • +
        • [PHPBB3-10615] - Static calls in utf normalizer yield E_STRICT spam on php 5.4
        • +
        • [PHPBB3-10630] - Prune Users produced unnecessarily long query; Got a packet bigger than 'max_allowed_packet' bytes
        • +
        • [PHPBB3-10633] - Users are able to get the real filename of attachment
        • +
        • [PHPBB3-10639] - negative value of ranks message
        • +
        • [PHPBB3-10658] - Rank-item is not shown on team-list
        • +
        • [PHPBB3-10675] - Use more descriptive message when disk is out of space
        • +
        • [PHPBB3-10684] - Function user_notification() prevents notifications for users with stale bans
        • +
        • [PHPBB3-10689] - Bug in the popup " Find a member" when select by letter.
        • +
        • [PHPBB3-10691] - Search index creation CLI script incorrectly calculates indexing speed
        • +
        • [PHPBB3-10699] - Long h2 title breaks div.minitabs in MCP
        • +
        • [PHPBB3-10708] - After a conversion, passwords with UTF8 characters do not work when user_pass_convert is set.
        • +
        • [PHPBB3-10717] - memberlist_view.html: including admin defined profile fields doesnt work
        • +
        • [PHPBB3-10723] - Do not use SQLite on PHP 5.4 in Tests on Travis
        • +
        • [PHPBB3-10731] - JS function addquote() works incorrectly in Opera
        • +
        • [PHPBB3-10751] - MS SQL Error when searching Admin Log
        • +
        • [PHPBB3-10760] - In pre-commit git hook, syntax error is thrown, but is not specifically described
        • +
        • [PHPBB3-10767] - Git hooks do not work properly with git GUIs
        • +
        • [PHPBB3-10774] - db_tools::create_unique_index does not use specified index names on MySQL
        • +
        • [PHPBB3-10790] - Strict comparison on user_id for sending pms
        • +
        • [PHPBB3-10797] - Template var for user rank not filled
        • +
        • [PHPBB3-10835] - Misleading message in UCP when no permission to change password
        • +
        • [PHPBB3-10846] - Missing alias for MAX(post_id) in SQL query in acp_main.php
        • +
        • [PHPBB3-10849] - Missing BBCode Help Text in subsilver2
        • +
        • [PHPBB3-10858] - $db->sql_fetchfield returns false with mssqlnative
        • +
        • [PHPBB3-10860] - Side-by-side diff styling javascript bug
        • +
        • [PHPBB3-10881] - Some files use 0xA9 as the copyright symbol which is neither ASCII nor the UTF8 copyright symbol.
        • +
        • [PHPBB3-10887] - Auto increment tests depend on varbinary handling
        • +
        • [PHPBB3-10889] - Default value for c_char_size in database unit tests is an empty string instead of a char(4)
        • +
        • [PHPBB3-10890] - test_sql_fetchrow_returns_false_when_empty() fails on MSSQL and Oracle
        • +
        • [PHPBB3-10908] - No remote avatar size limit results in files limited only by PHP memory limit
        • +
        • [PHPBB3-10913] - Admin is logged out when accessing any url under adm/ without session id
        • +
        +

        Improvement

        +
          +
        • [PHPBB3-8599] - Add "Select All" to "Add multiple smilies" screen
        • +
        • [PHPBB3-8636] - Add resync option to topic_view moderation page
        • +
        • [PHPBB3-9876] - Names and descriptions for roles "Newly registered User" in "User roles" and "Forum roles" must be different
        • +
        • [PHPBB3-9914] - Add backup warning to Automatic DB Updater
        • +
        • [PHPBB3-9916] - License in header not linking to version 2 of GNU GPL
        • +
        • [PHPBB3-10093] - Make commit-msg hook always not fatal
        • +
        • [PHPBB3-10162] - Allow TLDs over 6 characters in email addresses
        • +
        • [PHPBB3-10280] - Change the ACP user activation display
        • +
        • [PHPBB3-10308] - Disable Retain/Delete Posts selection if the user has no posts.
        • +
        • [PHPBB3-10453] - PM viewmessage page is misplacing the online icon
        • +
        • [PHPBB3-10492] - Port functional tests to develop-olympus
        • +
        • [PHPBB3-10507] - Sort installed styles list in admin control panel - styles
        • +
        • [PHPBB3-10550] - Sort not installed styles list in admin control panel - styles
        • +
        • [PHPBB3-10563] - ACP usability improvement: show deactivated styles below active styles in styles list
        • +
        • [PHPBB3-10565] - Performance: Unneeded GROUP BY in update_forum_tracking_info
        • +
        • [PHPBB3-10607] - phpBB Credit Line Hardcoded
        • +
        • [PHPBB3-10653] - Add ability to count table rows to database abstraction layer
        • +
        • [PHPBB3-10730] - Add label tags around "select" text in post splitting UI in MCP
        • +
        • [PHPBB3-10764] - FAQ mentions SourceForge
        • +
        • [PHPBB3-10812] - Installer should not display register globals UI for php 5.4+
        • +
        • [PHPBB3-10815] - Enable Feeds by default
        • +
        • [PHPBB3-10819] - Improve side-by-side diff styling
        • +
        • [PHPBB3-10834] - Backport general development language changes in readme files
        • +
        • [PHPBB3-10836] - Enable Avatars by default
        • +
        • [PHPBB3-10891] - Allow specifying test config file name via environment variable
        • +
        • [PHPBB3-10892] - Cosmetic improvements to RUNNING_TESTS.txt
        • +
        • [PHPBB3-10898] - Do not write ?> into config.php to avoid whitespace output
        • +
        +

        New Feature

        + +

        Sub-task

        +
          +
        • [PHPBB3-10907] - Mark (var)binary tests as incomplete on non-MySQL DBMSes
        • +
        +

        Task

        +
          +
        • [PHPBB3-9896] - Update links in docs/readme.html
        • +
        • [PHPBB3-10434] - Add a script that allows creating a search index from CLI
        • +
        • [PHPBB3-10455] - Remove NOTE from header files
        • +
        • [PHPBB3-10694] - Update notification in ACP (Olympus) for increase of minimum PHP version to 5.3.2
        • +
        • [PHPBB3-10718] - Add Travis CI
        • +
        • [PHPBB3-10788] - Update docs/AUTHORS for 3.0.11-RC1
        • +
        • [PHPBB3-10909] - Update Travis Test Configuration: Travis no longer supports PHP 5.3.2
        • +
        + +

        1.ii. Changes since 3.0.9

        Bug

          @@ -227,7 +344,7 @@
        • [PHPBB3-10480] - Automate changelog building
        -

        1.ii. Changes since 3.0.8

        +

        1.iii. Changes since 3.0.8

        Bug

        @@ -595,7 +712,7 @@ -

        1.iii. Changes since 3.0.7-PL1

        +

        1.iv. Changes since 3.0.7-PL1

        Security

          @@ -1053,13 +1170,13 @@
        -

        1.iiv. Changes since 3.0.7

        +

        1.iv. Changes since 3.0.7

        • [Sec] Do not expose forum content of forums with ACL entries but no actual permission in ATOM Feeds. (Bug #58595)
        -

        1.v. Changes since 3.0.6

        +

        1.vi. Changes since 3.0.6

        • [Fix] Allow ban reason and length to be selected and copied in ACP and subsilver2 MCP. (Bug #51095)
        • @@ -1163,7 +1280,7 @@
        -

        1.vi. Changes since 3.0.5

        +

        1.vii. Changes since 3.0.5

        • [Fix] Allow whitespaces in avatar gallery names. (Bug #44955)
        • @@ -1385,7 +1502,7 @@
        • [Feature] Send anonymous statistical information to phpBB on installation and update (optional).
        -

        1.vii. Changes since 3.0.4

        +

        1.viii. Changes since 3.0.4

        • [Fix] Delete user entry from ban list table upon user deletion (Bug #40015 - Patch by TerraFrost)
        • @@ -1474,7 +1591,7 @@
        • [Sec] Only use forum id supplied for posting if global announcement detected. (Reported by nickvergessen)
        -

        1.viii. Changes since 3.0.3

        +

        1.ix. Changes since 3.0.3

        • [Fix] Allow mixed-case template directories to be inherited (Bug #36725)
        • @@ -1506,7 +1623,7 @@
        • [Sec] Ask for forum password if post within passworded forum quoted in private message. (Reported by nickvergessen)
        -

        1.ix. Changes since 3.0.2

        +

        1.x. Changes since 3.0.2

        • [Fix] Correctly set topic starter if first post in topic removed (Bug #30575 - Patch by blueray2048)
        • @@ -1605,7 +1722,7 @@
        • [Sec Precaution] Stricter validation of the HTTP_HOST header (Thanks to Techie-Micheal et al for pointing out possible issues in derived code)
        -

        1.x. Changes since 3.0.1

        +

        1.xi. Changes since 3.0.1

        • [Fix] Ability to set permissions on non-mysql dbms (Bug #24955)
        • @@ -1653,7 +1770,7 @@
        • [Sec] Only allow urls gone through redirect() being used within login_box(). (thanks nookieman)
        -

        1.xi Changes since 3.0.0

        +

        1.xii Changes since 3.0.0

        • [Change] Validate birthdays (Bug #15004)
        • @@ -1724,7 +1841,7 @@
        • [Fix] Find and display colliding usernames correctly when converting from one database to another (Bug #23925)
        -

        1.xii. Changes since 3.0.RC8

        +

        1.xiii. Changes since 3.0.RC8

        • [Fix] Cleaned usernames contain only single spaces, so "a_name" and "a__name" are treated as the same name (Bug #15634)
        • @@ -1733,7 +1850,7 @@
        • [Fix] Call garbage_collection() within database updater to correctly close connections (affects Oracle for example)
        -

        1.xiii. Changes since 3.0.RC7

        +

        1.xiv. Changes since 3.0.RC7

        • [Fix] Fixed MSSQL related bug in the update system
        • @@ -1768,7 +1885,7 @@
        • [Fix] No duplication of active topics (Bug #15474)
        -

        1.xiv. Changes since 3.0.RC6

        +

        1.xv. Changes since 3.0.RC6

        • [Fix] Submitting language changes using acp_language (Bug #14736)
        • @@ -1778,7 +1895,7 @@
        • [Fix] Able to request new password (Bug #14743)
        -

        1.xv. Changes since 3.0.RC5

        +

        1.xvi. Changes since 3.0.RC5

        • [Feature] Removing constant PHPBB_EMBEDDED in favor of using an exit_handler(); the constant was meant to achive this more or less.
        • @@ -1841,7 +1958,7 @@
        • [Sec] New password hashing mechanism for storing passwords (#i42)
        -

        1.xvi. Changes since 3.0.RC4

        +

        1.xvii. Changes since 3.0.RC4

        • [Fix] MySQL, PostgreSQL and SQLite related database fixes (Bug #13862)
        • @@ -1892,7 +2009,7 @@
        • [Fix] odbc_autocommit causing existing result sets to be dropped (Bug #14182)
        -

        1.xvii. Changes since 3.0.RC3

        +

        1.xviii. Changes since 3.0.RC3

        • [Fix] Fixing some subsilver2 and prosilver style issues
        • @@ -2001,7 +2118,7 @@
        -

        1.xviii. Changes since 3.0.RC2

        +

        1.xviv. Changes since 3.0.RC2

        • [Fix] Re-allow searching within the memberlist
        • @@ -2047,7 +2164,7 @@
        -

        1.xix. Changes since 3.0.RC1

        +

        1.xx. Changes since 3.0.RC1

        • [Fix] (X)HTML issues within the templates (Bug #11255, #11255)
        • From 118c5d90daa783ff55319e6121c0fc77166fe58c Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 31 May 2012 22:07:34 +0200 Subject: [PATCH 221/255] [develop-olympus] Incrementing the version to 3.0.12-dev in develop-olympus. --- phpBB/includes/constants.php | 2 +- phpBB/install/database_update.php | 2 +- phpBB/install/schemas/schema_data.sql | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php index 5b72d89795..17c25ee3c6 100644 --- a/phpBB/includes/constants.php +++ b/phpBB/includes/constants.php @@ -25,7 +25,7 @@ if (!defined('IN_PHPBB')) */ // phpBB Version -define('PHPBB_VERSION', '3.0.11-RC1'); +define('PHPBB_VERSION', '3.0.12-dev'); // QA-related // define('PHPBB_QA', 1); diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index c1fe144c62..a52a329f20 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -8,7 +8,7 @@ * */ -define('UPDATES_TO_VERSION', '3.0.11-RC1'); +define('UPDATES_TO_VERSION', '3.0.12-dev'); // Enter any version to update from to test updates. The version within the db will not be updated. define('DEBUG_FROM_VERSION', false); diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 99b8f7f96d..b139857d28 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -246,7 +246,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.11-RC1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.0.12-dev'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400'); From a9549cbe6ab66732fcf9c321496b74943e2972e7 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Sun, 3 Jun 2012 15:56:55 +0530 Subject: [PATCH 222/255] [feature-delete-auto-logins] adds module to database update ucp delete auto-login keys module is added to database_update.php under 3.1-dev --- phpBB/install/database_update.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 665db1f2f0..a5bd5e7bfe 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -2305,6 +2305,13 @@ function change_database_data(&$no_updates, $version) 'auth' => 'acl_a_styles', 'cat' => 'ACP_STYLE_MANAGEMENT', ), + 'autologin_keys' => array( + 'base' => 'ucp_profile', + 'class' => 'ucp', + 'title' => 'UCP_PROFILE_AUTOLOGIN_KEYS', + 'auth' => '', + 'cat' => 'UCP_PROFILE', + ), ); _add_modules($modules_to_install); From ca974e2f2a3fc49564d0a595b2d55d04006b9ce5 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 13:18:00 +0200 Subject: [PATCH 223/255] [ticket/10931] Add wrapper class for ini_get function. Provides easier handling of the different interpretations of ini values. PHPBB3-10931 --- phpBB/includes/php/ini.php | 165 +++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 phpBB/includes/php/ini.php diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php new file mode 100644 index 0000000000..5c2cadb052 --- /dev/null +++ b/phpBB/includes/php/ini.php @@ -0,0 +1,165 @@ +get($varname); + + if ($value === false) + { + return false; + } + + return trim($value); + } + + /** + * Gets configuration option value as a boolean. + * Interprets the string value 'off' as false. + * + * @param string $varname The configuration option name. + * @return bool False if configuration option does not exist. + * False if configuration option is disabled. + * True otherwise. + */ + public function get_bool($varname) + { + $value = strtolower($this->get_string($varname)); + + if (empty($value) || $value == 'off') + { + return false; + } + + return true; + } + + /** + * Gets configuration option value as an integer. + * + * @param string $varname The configuration option name. + * @return bool|int False if configuration option does not exist, + * the configuration option value (integer) otherwise. + */ + public function get_int($varname) + { + $value = $this->get_string($varname); + + if (!is_numeric($value)) + { + return false; + } + + return (int) $value; + } + + /** + * Gets configuration option value as a float. + * + * @param string $varname The configuration option name. + * @return bool|float False if configuration option does not exist, + * the configuration option value (float) otherwise. + */ + public function get_float($varname) + { + $value = $this->get_string($varname); + + if (!is_numeric($value)) + { + return false; + } + + return (float) $value; + } + + /** + * Gets configuration option value in bytes. + * Converts strings like '128M' to bytes (integer or float). + * + * @param string $varname The configuration option name. + * @return bool|int|float False if configuration option does not exist, + * the configuration option value otherwise. + */ + public function get_bytes($varname) + { + $value = strtolower($this->get_string($varname)); + + if ($value === false) + { + return false; + } + + if (is_numeric($value)) + { + return $value; + } + else if (strlen($value) < 2) + { + return false; + } + + $value_numeric = (int) $value; + + switch ($value[strlen($value) - 1]) + { + case 'g': + $value_numeric *= 1024; + case 'm': + $value_numeric *= 1024; + case 'k': + $value_numeric *= 1024; + break; + + default: + // It's not already in bytes (and thus numeric) + // and does not carry a unit. + return false; + } + + return $value_numeric; + } +} From afd6f86892fbbbe06aa0b1295dba361fab29fd5f Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 13:22:11 +0200 Subject: [PATCH 224/255] [ticket/10931] Unit tests for phpbb_php_ini class. PHPBB3-10931 --- tests/mock/phpbb_php_ini.php | 16 ++++++++ tests/wrapper/phpbb_php_ini_test.php | 58 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 tests/mock/phpbb_php_ini.php create mode 100644 tests/wrapper/phpbb_php_ini_test.php diff --git a/tests/mock/phpbb_php_ini.php b/tests/mock/phpbb_php_ini.php new file mode 100644 index 0000000000..249c1b014a --- /dev/null +++ b/tests/mock/phpbb_php_ini.php @@ -0,0 +1,16 @@ +php_ini = new phpbb_mock_phpbb_php_ini; + } + + public function test_get_string() + { + $this->assertEquals('phpbb', $this->php_ini->get_string(' phpbb ')); + } + + public function test_get_bool() + { + $this->assertEquals(true, $this->php_ini->get_bool('ON')); + $this->assertEquals(true, $this->php_ini->get_bool('on')); + $this->assertEquals(true, $this->php_ini->get_bool('1')); + + $this->assertEquals(false, $this->php_ini->get_bool('OFF')); + $this->assertEquals(false, $this->php_ini->get_bool('off')); + $this->assertEquals(false, $this->php_ini->get_bool('0')); + $this->assertEquals(false, $this->php_ini->get_bool('')); + } + + public function test_get_int() + { + $this->assertEquals(1234, $this->php_ini->get_int('1234')); + $this->assertEquals(false, $this->php_ini->get_int('phpBB')); + } + + public function test_get_float() + { + $this->assertEquals(1234.0, $this->php_ini->get_float('1234')); + $this->assertEquals(false, $this->php_ini->get_float('phpBB')); + } + + public function test_get_bytes() + { + $this->assertEquals(false, $this->php_ini->get_bytes('phpBB')); + $this->assertEquals(false, $this->php_ini->get_bytes('M')); + $this->assertEquals(32 * pow(2, 20), $this->php_ini->get_bytes('32M')); + $this->assertEquals(8 * pow(2, 30), $this->php_ini->get_bytes('8G')); + $this->assertEquals(1234, $this->php_ini->get_bytes('1234')); + } +} From 5bea6ed94658d3302dda54eceaeb326e6f888286 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 13:40:14 +0200 Subject: [PATCH 225/255] [ticket/10931] Let us try ini_get() without error suppression. PHPBB3-10931 --- phpBB/includes/php/ini.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index 5c2cadb052..92965e7f94 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -34,7 +34,7 @@ class phpbb_php_ini */ public function get($varname) { - return @ini_get($varname); + return ini_get($varname); } /** From 63b2e364929c941d814f6ba493551d458076941a Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 13:45:39 +0200 Subject: [PATCH 226/255] [ticket/10931] Correct method description of get_string(). PHPBB3-10931 --- phpBB/includes/php/ini.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index 92965e7f94..3910700163 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -38,8 +38,7 @@ class phpbb_php_ini } /** - * Gets configuration option value as a string and performs various - * normalisation on the returned value. + * Gets the configuration option value as a trimmed string. * * @param string $varname The configuration option name. * @return bool|string False if configuration option does not exist, From 7501ea825af8d25309f81ed0159c45597086b78b Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 13:53:17 +0200 Subject: [PATCH 227/255] [ticket/10931] Document that false is also returned if value is not well formed PHPBB3-10931 --- phpBB/includes/php/ini.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index 3910700163..baafee5273 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -82,6 +82,7 @@ class phpbb_php_ini * * @param string $varname The configuration option name. * @return bool|int False if configuration option does not exist, + * false if configuration option value is not numeric, * the configuration option value (integer) otherwise. */ public function get_int($varname) @@ -101,6 +102,7 @@ class phpbb_php_ini * * @param string $varname The configuration option name. * @return bool|float False if configuration option does not exist, + * false if configuration option value is not numeric, * the configuration option value (float) otherwise. */ public function get_float($varname) @@ -121,6 +123,7 @@ class phpbb_php_ini * * @param string $varname The configuration option name. * @return bool|int|float False if configuration option does not exist, + * false if configuration option value is not well-formed, * the configuration option value otherwise. */ public function get_bytes($varname) From 5086366662d78d79bb6daf4b132709d9273c2f8c Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 14:18:21 +0200 Subject: [PATCH 228/255] [ticket/10931] Make it clear that we are mocking the ini_get() function. PHPBB3-10931 --- .../phpbb_php_ini.php => wrapper/phpbb_php_ini_fake.php} | 2 +- tests/wrapper/phpbb_php_ini_test.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename tests/{mock/phpbb_php_ini.php => wrapper/phpbb_php_ini_fake.php} (79%) diff --git a/tests/mock/phpbb_php_ini.php b/tests/wrapper/phpbb_php_ini_fake.php similarity index 79% rename from tests/mock/phpbb_php_ini.php rename to tests/wrapper/phpbb_php_ini_fake.php index 249c1b014a..14ec77c644 100644 --- a/tests/mock/phpbb_php_ini.php +++ b/tests/wrapper/phpbb_php_ini_fake.php @@ -7,7 +7,7 @@ * */ -class phpbb_mock_phpbb_php_ini extends phpbb_php_ini +class phpbb_php_ini_fake extends phpbb_php_ini { function get($varname) { diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index 164966fba4..5494f1864d 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -7,7 +7,7 @@ * */ -require_once dirname(__FILE__) . '/../mock/phpbb_php_ini.php'; +require_once dirname(__FILE__) . '/phpbb_php_ini_fake.php'; class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case { @@ -15,7 +15,7 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case public function setUp() { - $this->php_ini = new phpbb_mock_phpbb_php_ini; + $this->php_ini = new phpbb_php_ini_fake; } public function test_get_string() From 80dfa53ee3f04dfdba11efe9eb3f49d739bb602b Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 14:24:30 +0200 Subject: [PATCH 229/255] [ticket/10931] Correctly use GNU GPL version 2. PHPBB3-10931 --- phpBB/includes/php/ini.php | 2 +- tests/wrapper/phpbb_php_ini_fake.php | 2 +- tests/wrapper/phpbb_php_ini_test.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index baafee5273..882464275b 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -3,7 +3,7 @@ * * @package phpBB * @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 * */ diff --git a/tests/wrapper/phpbb_php_ini_fake.php b/tests/wrapper/phpbb_php_ini_fake.php index 14ec77c644..49bc5936e5 100644 --- a/tests/wrapper/phpbb_php_ini_fake.php +++ b/tests/wrapper/phpbb_php_ini_fake.php @@ -3,7 +3,7 @@ * * @package testing * @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 * */ diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index 5494f1864d..cdfee802f2 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -3,7 +3,7 @@ * * @package testing * @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 * */ From fb279c9677641db5efa38f24c51db93df004cb46 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 14:31:09 +0200 Subject: [PATCH 230/255] [ticket/10931] Also test lower case units in test_get_bytes(). PHPBB3-10931 --- tests/wrapper/phpbb_php_ini_test.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index cdfee802f2..cbb05e98e9 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -50,8 +50,9 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case public function test_get_bytes() { $this->assertEquals(false, $this->php_ini->get_bytes('phpBB')); + $this->assertEquals(false, $this->php_ini->get_bytes('k')); $this->assertEquals(false, $this->php_ini->get_bytes('M')); - $this->assertEquals(32 * pow(2, 20), $this->php_ini->get_bytes('32M')); + $this->assertEquals(32 * pow(2, 20), $this->php_ini->get_bytes('32m')); $this->assertEquals(8 * pow(2, 30), $this->php_ini->get_bytes('8G')); $this->assertEquals(1234, $this->php_ini->get_bytes('1234')); } From 3872abd824c9371af6cbb45e6e9bbfcb31094f98 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 14:35:18 +0200 Subject: [PATCH 231/255] [ticket/10931] Also test for negative values. PHPBB3-10931 --- tests/wrapper/phpbb_php_ini_test.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index cbb05e98e9..84e2b5e92e 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -38,12 +38,14 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case public function test_get_int() { $this->assertEquals(1234, $this->php_ini->get_int('1234')); + $this->assertEquals(-12345, $this->php_ini->get_int('-12345')); $this->assertEquals(false, $this->php_ini->get_int('phpBB')); } public function test_get_float() { $this->assertEquals(1234.0, $this->php_ini->get_float('1234')); + $this->assertEquals(-12345.0, $this->php_ini->get_float('-12345')); $this->assertEquals(false, $this->php_ini->get_float('phpBB')); } @@ -51,9 +53,14 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case { $this->assertEquals(false, $this->php_ini->get_bytes('phpBB')); $this->assertEquals(false, $this->php_ini->get_bytes('k')); + $this->assertEquals(false, $this->php_ini->get_bytes('-k')); $this->assertEquals(false, $this->php_ini->get_bytes('M')); + $this->assertEquals(false, $this->php_ini->get_bytes('-M')); $this->assertEquals(32 * pow(2, 20), $this->php_ini->get_bytes('32m')); + $this->assertEquals(- 32 * pow(2, 20), $this->php_ini->get_bytes('-32m')); $this->assertEquals(8 * pow(2, 30), $this->php_ini->get_bytes('8G')); + $this->assertEquals(- 8 * pow(2, 30), $this->php_ini->get_bytes('-8G')); $this->assertEquals(1234, $this->php_ini->get_bytes('1234')); + $this->assertEquals(-12345, $this->php_ini->get_bytes('-12345')); } } From 44287e57bf9536bd91933347ad64f289ef2a0391 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 14:43:50 +0200 Subject: [PATCH 232/255] [ticket/10931] Use strict assertSame() instead of assertEquals(). PHPBB3-10931 --- tests/wrapper/phpbb_php_ini_test.php | 38 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index 84e2b5e92e..5c312300d3 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -20,42 +20,42 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case public function test_get_string() { - $this->assertEquals('phpbb', $this->php_ini->get_string(' phpbb ')); + $this->assertSame('phpbb', $this->php_ini->get_string(' phpbb ')); } public function test_get_bool() { - $this->assertEquals(true, $this->php_ini->get_bool('ON')); - $this->assertEquals(true, $this->php_ini->get_bool('on')); - $this->assertEquals(true, $this->php_ini->get_bool('1')); + $this->assertSame(true, $this->php_ini->get_bool('ON')); + $this->assertSame(true, $this->php_ini->get_bool('on')); + $this->assertSame(true, $this->php_ini->get_bool('1')); - $this->assertEquals(false, $this->php_ini->get_bool('OFF')); - $this->assertEquals(false, $this->php_ini->get_bool('off')); - $this->assertEquals(false, $this->php_ini->get_bool('0')); - $this->assertEquals(false, $this->php_ini->get_bool('')); + $this->assertSame(false, $this->php_ini->get_bool('OFF')); + $this->assertSame(false, $this->php_ini->get_bool('off')); + $this->assertSame(false, $this->php_ini->get_bool('0')); + $this->assertSame(false, $this->php_ini->get_bool('')); } public function test_get_int() { - $this->assertEquals(1234, $this->php_ini->get_int('1234')); - $this->assertEquals(-12345, $this->php_ini->get_int('-12345')); - $this->assertEquals(false, $this->php_ini->get_int('phpBB')); + $this->assertSame(1234, $this->php_ini->get_int('1234')); + $this->assertSame(-12345, $this->php_ini->get_int('-12345')); + $this->assertSame(false, $this->php_ini->get_int('phpBB')); } public function test_get_float() { - $this->assertEquals(1234.0, $this->php_ini->get_float('1234')); - $this->assertEquals(-12345.0, $this->php_ini->get_float('-12345')); - $this->assertEquals(false, $this->php_ini->get_float('phpBB')); + $this->assertSame(1234.0, $this->php_ini->get_float('1234')); + $this->assertSame(-12345.0, $this->php_ini->get_float('-12345')); + $this->assertSame(false, $this->php_ini->get_float('phpBB')); } public function test_get_bytes() { - $this->assertEquals(false, $this->php_ini->get_bytes('phpBB')); - $this->assertEquals(false, $this->php_ini->get_bytes('k')); - $this->assertEquals(false, $this->php_ini->get_bytes('-k')); - $this->assertEquals(false, $this->php_ini->get_bytes('M')); - $this->assertEquals(false, $this->php_ini->get_bytes('-M')); + $this->assertSame(false, $this->php_ini->get_bytes('phpBB')); + $this->assertSame(false, $this->php_ini->get_bytes('k')); + $this->assertSame(false, $this->php_ini->get_bytes('-k')); + $this->assertSame(false, $this->php_ini->get_bytes('M')); + $this->assertSame(false, $this->php_ini->get_bytes('-M')); $this->assertEquals(32 * pow(2, 20), $this->php_ini->get_bytes('32m')); $this->assertEquals(- 32 * pow(2, 20), $this->php_ini->get_bytes('-32m')); $this->assertEquals(8 * pow(2, 30), $this->php_ini->get_bytes('8G')); From e9348b172a5b0661b26a8f3a0fe3368568539edb Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 15:06:52 +0200 Subject: [PATCH 233/255] [ticket/10931] Correctly handle inputs such as '-k' as invalid in get_bytes(). PHPBB3-10931 --- phpBB/includes/php/ini.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index 882464275b..de1cb5096c 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -137,10 +137,17 @@ class phpbb_php_ini if (is_numeric($value)) { + // Already in bytes. return $value; } else if (strlen($value) < 2) { + // Single character. + return false; + } + else if (strlen($value) < 3 && $value[0] === '-') + { + // Two characters but the first one is a minus. return false; } From cffcef1e46f7502d679dcd489820e39bcf1f6709 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Mon, 11 Jun 2012 15:08:50 +0200 Subject: [PATCH 234/255] [ticket/10932] Adding composer.phar to the repository to version it PHPBB3-10932 --- composer.phar | Bin 0 -> 499053 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 composer.phar diff --git a/composer.phar b/composer.phar new file mode 100755 index 0000000000000000000000000000000000000000..3572477546e40a03179dda19e93507477060dd3c GIT binary patch literal 499053 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

        • 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 literal 0 HcmV?d00001 From 09fb9a9efe048cef102471d1ce79cdeff932776a Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 15:15:08 +0200 Subject: [PATCH 235/255] [ticket/10931] Make sure get_bytes() always returns either an int or a float. PHPBB3-10931 --- phpBB/includes/php/ini.php | 17 +++++++++++++-- tests/wrapper/phpbb_php_ini_test.php | 31 +++++++++++++++++++++------- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index de1cb5096c..bbe592a7df 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -138,7 +138,7 @@ class phpbb_php_ini if (is_numeric($value)) { // Already in bytes. - return $value; + return $this->to_numeric($value); } else if (strlen($value) < 2) { @@ -151,7 +151,7 @@ class phpbb_php_ini return false; } - $value_numeric = (int) $value; + $value_numeric = $this->to_numeric($value); switch ($value[strlen($value) - 1]) { @@ -171,4 +171,17 @@ class phpbb_php_ini return $value_numeric; } + + /** + * Casts a numeric string $input to an appropriate numeric type (i.e. integer or float) + * + * @param string $input A numeric string. + * + * @return int|float Integer $input if $input fits integer, + * float $input otherwise. + */ + protected function to_numeric($input) + { + return ($input > PHP_INT_MAX) ? (float) $input : (int) $input; + } } diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index 5c312300d3..4d8e583eb8 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -49,18 +49,35 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case $this->assertSame(false, $this->php_ini->get_float('phpBB')); } - public function test_get_bytes() + public function test_get_bytes_invalid() { $this->assertSame(false, $this->php_ini->get_bytes('phpBB')); $this->assertSame(false, $this->php_ini->get_bytes('k')); $this->assertSame(false, $this->php_ini->get_bytes('-k')); $this->assertSame(false, $this->php_ini->get_bytes('M')); $this->assertSame(false, $this->php_ini->get_bytes('-M')); - $this->assertEquals(32 * pow(2, 20), $this->php_ini->get_bytes('32m')); - $this->assertEquals(- 32 * pow(2, 20), $this->php_ini->get_bytes('-32m')); - $this->assertEquals(8 * pow(2, 30), $this->php_ini->get_bytes('8G')); - $this->assertEquals(- 8 * pow(2, 30), $this->php_ini->get_bytes('-8G')); - $this->assertEquals(1234, $this->php_ini->get_bytes('1234')); - $this->assertEquals(-12345, $this->php_ini->get_bytes('-12345')); + } + + /** + * @dataProvider get_bytes_data + */ + public function test_get_bytes($expected, $value) + { + $actual = $this->php_ini->get_bytes($value); + + $this->assertTrue(is_float($actual) || is_int($actual)); + $this->assertEquals($expected, $actual); + } + + static public function get_bytes_data() + { + return array( + array(32 * pow(2, 20), '32m'), + array(- 32 * pow(2, 20), '-32m'), + array(8 * pow(2, 30), '8G'), + array(- 8 * pow(2, 30), '-8G'), + array(1234, '1234'), + array(-12345, '-12345'), + ); } } From 171d661765afaeb34213bfa8e049891e7661137c Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Mon, 11 Jun 2012 15:32:02 +0200 Subject: [PATCH 236/255] [ticket/10932] Use included composer.phar in build process PHPBB3-10932 --- build/build.xml | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/build/build.xml b/build/build.xml index bc65cd0b38..1b8d42a660 100644 --- a/build/build.xml +++ b/build/build.xml @@ -45,13 +45,7 @@ - - @@ -169,13 +163,7 @@ checkreturn="true" /> - - From cbff02db4f84c83c62bdd1f7450b8afbf39a5270 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 15:22:55 +0200 Subject: [PATCH 237/255] [ticket/10931] Make to_numeric function globally available. PHPBB3-10931 --- phpBB/includes/functions.php | 13 +++++++++++++ phpBB/includes/php/ini.php | 17 ++--------------- tests/wrapper/phpbb_php_ini_test.php | 1 + 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 95f2cf8d26..ad64471388 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4987,3 +4987,16 @@ function phpbb_pcre_utf8_support() } return $utf8_pcre_properties; } + +/** +* Casts a numeric string $input to an appropriate numeric type (i.e. integer or float) +* +* @param string $input A numeric string. +* +* @return int|float Integer $input if $input fits integer, +* float $input otherwise. +*/ +function phpbb_to_numeric($input) +{ + return ($input > PHP_INT_MAX) ? (float) $input : (int) $input; +} diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index bbe592a7df..02c2b7ccc6 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -138,7 +138,7 @@ class phpbb_php_ini if (is_numeric($value)) { // Already in bytes. - return $this->to_numeric($value); + return phpbb_to_numeric($value); } else if (strlen($value) < 2) { @@ -151,7 +151,7 @@ class phpbb_php_ini return false; } - $value_numeric = $this->to_numeric($value); + $value_numeric = phpbb_to_numeric($value); switch ($value[strlen($value) - 1]) { @@ -171,17 +171,4 @@ class phpbb_php_ini return $value_numeric; } - - /** - * Casts a numeric string $input to an appropriate numeric type (i.e. integer or float) - * - * @param string $input A numeric string. - * - * @return int|float Integer $input if $input fits integer, - * float $input otherwise. - */ - protected function to_numeric($input) - { - return ($input > PHP_INT_MAX) ? (float) $input : (int) $input; - } } diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index 4d8e583eb8..418448f102 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -8,6 +8,7 @@ */ require_once dirname(__FILE__) . '/phpbb_php_ini_fake.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case { From 72212077ebecee639c49c473646a38340908d058 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 15:31:25 +0200 Subject: [PATCH 238/255] [ticket/10931] Also test get_bytes() and get_string() with false. PHPBB3-10931 --- tests/wrapper/phpbb_php_ini_test.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/wrapper/phpbb_php_ini_test.php b/tests/wrapper/phpbb_php_ini_test.php index 418448f102..8e08d5c204 100644 --- a/tests/wrapper/phpbb_php_ini_test.php +++ b/tests/wrapper/phpbb_php_ini_test.php @@ -21,6 +21,7 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case public function test_get_string() { + $this->assertSame(false, $this->php_ini->get_string(false)); $this->assertSame('phpbb', $this->php_ini->get_string(' phpbb ')); } @@ -52,6 +53,7 @@ class phpbb_wrapper_phpbb_php_ini_test extends phpbb_test_case public function test_get_bytes_invalid() { + $this->assertSame(false, $this->php_ini->get_bytes(false)); $this->assertSame(false, $this->php_ini->get_bytes('phpBB')); $this->assertSame(false, $this->php_ini->get_bytes('k')); $this->assertSame(false, $this->php_ini->get_bytes('-k')); From 4468847107103c44936468e6e3c1badeb333ff52 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 11 Jun 2012 15:45:30 +0200 Subject: [PATCH 239/255] [ticket/10931] Apply strtolower() correctly, i.e. not on false. PHPBB3-10931 --- phpBB/includes/php/ini.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/phpBB/includes/php/ini.php b/phpBB/includes/php/ini.php index 02c2b7ccc6..17e8c54a57 100644 --- a/phpBB/includes/php/ini.php +++ b/phpBB/includes/php/ini.php @@ -67,9 +67,9 @@ class phpbb_php_ini */ public function get_bool($varname) { - $value = strtolower($this->get_string($varname)); + $value = $this->get_string($varname); - if (empty($value) || $value == 'off') + if (empty($value) || strtolower($value) == 'off') { return false; } @@ -128,7 +128,7 @@ class phpbb_php_ini */ public function get_bytes($varname) { - $value = strtolower($this->get_string($varname)); + $value = $this->get_string($varname); if ($value === false) { @@ -151,9 +151,10 @@ class phpbb_php_ini return false; } + $value_lower = strtolower($value); $value_numeric = phpbb_to_numeric($value); - switch ($value[strlen($value) - 1]) + switch ($value_lower[strlen($value_lower) - 1]) { case 'g': $value_numeric *= 1024; From 241033ae88fdaa4aa45da0ee70b94f636e6d0360 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 11 Jun 2012 18:50:05 -0400 Subject: [PATCH 240/255] [ticket/10882] Fix test name - oops. PHPBB3-10882 --- tests/template/invalid_constructs_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/template/invalid_constructs_test.php b/tests/template/invalid_constructs_test.php index 2430b5b9b1..19d192b8b6 100644 --- a/tests/template/invalid_constructs_test.php +++ b/tests/template/invalid_constructs_test.php @@ -9,7 +9,7 @@ require_once dirname(__FILE__) . '/template_test_case.php'; -class phpbb_template_template_test extends phpbb_template_template_test_case +class phpbb_template_invalid_constructs_test extends phpbb_template_template_test_case { public function template_data() { From 33b72ec62bd8b6e6c890e4c474d28389f048632a Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Mon, 2 Apr 2012 11:45:26 +0300 Subject: [PATCH 241/255] [ticket/10743] Changing obtain_cfg_items Changing obtain_cfg_items to work only with style because other components no longer exist PHPBB3-10743 --- phpBB/includes/cache/service.php | 63 +++++++++++++------------------- phpBB/includes/user.php | 3 -- 2 files changed, 26 insertions(+), 40 deletions(-) diff --git a/phpBB/includes/cache/service.php b/phpBB/includes/cache/service.php index aa225ade69..37f32aa753 100644 --- a/phpBB/includes/cache/service.php +++ b/phpBB/includes/cache/service.php @@ -321,50 +321,39 @@ class phpbb_cache_service /** * Obtain cfg file data */ - function obtain_cfg_items($theme) + function obtain_cfg_items($style) { global $config, $phpbb_root_path; - $parsed_items = array( - 'theme' => array(), - 'template' => array(), - 'imageset' => array() - ); + $parsed_array = $this->driver->get('_cfg_' . $style['style_path']); - foreach ($parsed_items as $key => $parsed_array) + if ($parsed_array === false) { - $parsed_array = $this->driver->get('_cfg_' . $key . '_' . $theme[$key . '_path']); - - if ($parsed_array === false) - { - $parsed_array = array(); - } - - $reparse = false; - $filename = $phpbb_root_path . 'styles/' . $theme[$key . '_path'] . '/' . $key . '/' . $key . '.cfg'; - - if (!file_exists($filename)) - { - continue; - } - - if (!isset($parsed_array['filetime']) || (($config['load_tplcompile'] && @filemtime($filename) > $parsed_array['filetime']))) - { - $reparse = true; - } - - // Re-parse cfg file - if ($reparse) - { - $parsed_array = parse_cfg_file($filename); - $parsed_array['filetime'] = @filemtime($filename); - - $this->driver->put('_cfg_' . $key . '_' . $theme[$key . '_path'], $parsed_array); - } - $parsed_items[$key] = $parsed_array; + $parsed_array = array(); } - return $parsed_items; + $reparse = false; + $filename = $phpbb_root_path . 'styles/' . $style['style_path'] . '/style.cfg'; + + if (!file_exists($filename)) + { + continue; + } + + if (!isset($parsed_array['filetime']) || (($config['load_tplcompile'] && @filemtime($filename) > $parsed_array['filetime']))) + { + $reparse = true; + } + + // Re-parse cfg file + if ($reparse) + { + $parsed_array = parse_cfg_file($filename); + $parsed_array['filetime'] = @filemtime($filename); + + $this->driver->put('_cfg_' . $style['style_path'], $parsed_array); + } + return $parsed_array; } /** diff --git a/phpBB/includes/user.php b/phpBB/includes/user.php index ce9c804f23..1db2364f76 100644 --- a/phpBB/includes/user.php +++ b/phpBB/includes/user.php @@ -188,9 +188,6 @@ class phpbb_user extends phpbb_session // Now parse the cfg file and cache it $parsed_items = $cache->obtain_cfg_items($this->theme); - // We are only interested in the theme configuration for now - $parsed_items = $parsed_items['theme']; - $check_for = array( 'pagination_sep' => (string) ', ' ); From 71ca9b4fe69dea8150a5d3c6f30dd177c488ff2b Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Mon, 2 Apr 2012 11:50:13 +0300 Subject: [PATCH 242/255] [ticket/10743] Renaming user->theme Renaming user->theme to user->style PHPBB3-10743 --- phpBB/includes/bbcode.php | 2 +- phpBB/includes/functions.php | 18 +++++++++--------- phpBB/includes/style/style.php | 4 ++-- phpBB/includes/user.php | 18 +++++++++--------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index fde917e5b1..444446e9c3 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -130,7 +130,7 @@ class bbcode if (empty($this->template_filename)) { - $this->template_bitfield = new bitfield($user->theme['bbcode_bitfield']); + $this->template_bitfield = new bitfield($user->style['bbcode_bitfield']); $style_resource_locator = new phpbb_style_resource_locator(); $style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index ad64471388..ddbe1c2c36 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4772,9 +4772,9 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 'T_ASSETS_VERSION' => $config['assets_version'], 'T_ASSETS_PATH' => "{$web_path}assets", - 'T_THEME_PATH' => "{$web_path}styles/" . rawurlencode($user->theme['style_path']) . '/theme', - 'T_TEMPLATE_PATH' => "{$web_path}styles/" . rawurlencode($user->theme['style_path']) . '/template', - 'T_SUPER_TEMPLATE_PATH' => "{$web_path}styles/" . rawurlencode($user->theme['style_path']) . '/template', + 'T_THEME_PATH' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme', + 'T_TEMPLATE_PATH' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/template', + 'T_SUPER_TEMPLATE_PATH' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/template', 'T_IMAGES_PATH' => "{$web_path}images/", 'T_SMILIES_PATH' => "{$web_path}{$config['smilies_path']}/", 'T_AVATAR_PATH' => "{$web_path}{$config['avatar_path']}/", @@ -4782,16 +4782,16 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 'T_ICONS_PATH' => "{$web_path}{$config['icons_path']}/", 'T_RANKS_PATH' => "{$web_path}{$config['ranks_path']}/", 'T_UPLOAD_PATH' => "{$web_path}{$config['upload_path']}/", - 'T_STYLESHEET_LINK' => "{$web_path}styles/" . rawurlencode($user->theme['style_path']) . '/theme/stylesheet.css?assets_version=' . $config['assets_version'], - 'T_STYLESHEET_LANG_LINK' => "{$web_path}styles/" . rawurlencode($user->theme['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'], - 'T_STYLESHEET_NAME' => $user->theme['style_name'], + 'T_STYLESHEET_LINK' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/stylesheet.css?assets_version=' . $config['assets_version'], + 'T_STYLESHEET_LANG_LINK' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'], + 'T_STYLESHEET_NAME' => $user->style['style_name'], 'T_JQUERY_LINK' => ($config['load_jquery_cdn'] && !empty($config['load_jquery_url'])) ? $config['load_jquery_url'] : "{$web_path}assets/javascript/jquery.js?assets_version=" . $config['assets_version'], 'S_JQUERY_FALLBACK' => ($config['load_jquery_cdn']) ? true : false, - 'T_THEME_NAME' => rawurlencode($user->theme['style_path']), + 'T_THEME_NAME' => rawurlencode($user->style['style_path']), 'T_THEME_LANG_NAME' => $user->data['user_lang'], - 'T_TEMPLATE_NAME' => $user->theme['style_path'], - 'T_SUPER_TEMPLATE_NAME' => rawurlencode((isset($user->theme['style_parent_tree']) && $user->theme['style_parent_tree']) ? $user->theme['style_parent_tree'] : $user->theme['style_path']), + 'T_TEMPLATE_NAME' => $user->style['style_path'], + 'T_SUPER_TEMPLATE_NAME' => rawurlencode((isset($user->style['style_parent_tree']) && $user->style['style_parent_tree']) ? $user->style['style_parent_tree'] : $user->style['style_path']), 'T_IMAGES' => 'images', 'T_SMILIES' => $config['smilies_path'], 'T_AVATAR' => $config['avatar_path'], diff --git a/phpBB/includes/style/style.php b/phpBB/includes/style/style.php index 3f470015f6..8d38deb85c 100644 --- a/phpBB/includes/style/style.php +++ b/phpBB/includes/style/style.php @@ -89,8 +89,8 @@ class phpbb_style */ public function set_style() { - $style_name = $this->user->theme['style_path']; - $style_dirs = ($this->user->theme['style_parent_id']) ? array_reverse(explode('/', $this->user->theme['style_parent_tree'])) : array(); + $style_name = $this->user->style['style_path']; + $style_dirs = ($this->user->style['style_parent_id']) ? array_reverse(explode('/', $this->user->style['style_parent_tree'])) : array(); $paths = array($this->get_style_path($style_name)); foreach ($style_dirs as $dir) { diff --git a/phpBB/includes/user.php b/phpBB/includes/user.php index 1db2364f76..cf9e6b9994 100644 --- a/phpBB/includes/user.php +++ b/phpBB/includes/user.php @@ -27,7 +27,7 @@ class phpbb_user extends phpbb_session { var $lang = array(); var $help = array(); - var $theme = array(); + var $style = array(); var $date_format; var $timezone; var $dst; @@ -159,11 +159,11 @@ class phpbb_user extends phpbb_session FROM ' . STYLES_TABLE . " s WHERE s.style_id = $style_id"; $result = $db->sql_query($sql, 3600); - $this->theme = $db->sql_fetchrow($result); + $this->style = $db->sql_fetchrow($result); $db->sql_freeresult($result); // User has wrong style - if (!$this->theme && $style_id == $this->data['user_style']) + if (!$this->style && $style_id == $this->data['user_style']) { $style_id = $this->data['user_style'] = $config['default_style']; @@ -176,17 +176,17 @@ class phpbb_user extends phpbb_session FROM ' . STYLES_TABLE . " s WHERE s.style_id = $style_id"; $result = $db->sql_query($sql, 3600); - $this->theme = $db->sql_fetchrow($result); + $this->style = $db->sql_fetchrow($result); $db->sql_freeresult($result); } - if (!$this->theme) + if (!$this->style) { trigger_error('Could not get style data', E_USER_ERROR); } // Now parse the cfg file and cache it - $parsed_items = $cache->obtain_cfg_items($this->theme); + $parsed_items = $cache->obtain_cfg_items($this->style); $check_for = array( 'pagination_sep' => (string) ', ' @@ -194,12 +194,12 @@ class phpbb_user extends phpbb_session foreach ($check_for as $key => $default_value) { - $this->theme[$key] = (isset($parsed_items[$key])) ? $parsed_items[$key] : $default_value; - settype($this->theme[$key], gettype($default_value)); + $this->style[$key] = (isset($parsed_items[$key])) ? $parsed_items[$key] : $default_value; + settype($this->style[$key], gettype($default_value)); if (is_string($default_value)) { - $this->theme[$key] = htmlspecialchars($this->theme[$key]); + $this->style[$key] = htmlspecialchars($this->style[$key]); } } From 699aab8e8e52bf5980a8078fc460d30cedd65347 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 11 Jun 2012 21:00:22 -0400 Subject: [PATCH 243/255] [ticket/10829] $style_name -> $style_path in style class. Here the style path is taken and the variable name should be $style_path. PHPBB3-10829 --- phpBB/includes/style/style.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/style/style.php b/phpBB/includes/style/style.php index 8d38deb85c..22e0f1d67a 100644 --- a/phpBB/includes/style/style.php +++ b/phpBB/includes/style/style.php @@ -89,9 +89,9 @@ class phpbb_style */ public function set_style() { - $style_name = $this->user->style['style_path']; + $style_path = $this->user->style['style_path']; $style_dirs = ($this->user->style['style_parent_id']) ? array_reverse(explode('/', $this->user->style['style_parent_tree'])) : array(); - $paths = array($this->get_style_path($style_name)); + $paths = array($this->get_style_path($style_path)); foreach ($style_dirs as $dir) { $paths[] = $this->get_style_path($dir); @@ -100,7 +100,7 @@ class phpbb_style // Add 'all' path, used as last fallback path by hooks and extensions $paths[] = $this->get_style_path('all'); - return $this->set_custom_style($style_name, $paths); + return $this->set_custom_style($style_path, $paths); } /** From 2a9698a13a5df8ff6c3b62df0674de07ebebdfc9 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 11 Jun 2012 21:03:12 -0400 Subject: [PATCH 244/255] [ticket/10829] Delete T_STYLESHEET_NAME - no longer used. PHPBB3-10829 --- phpBB/includes/functions.php | 1 - 1 file changed, 1 deletion(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index ddbe1c2c36..e40df93194 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4784,7 +4784,6 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 'T_UPLOAD_PATH' => "{$web_path}{$config['upload_path']}/", 'T_STYLESHEET_LINK' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/stylesheet.css?assets_version=' . $config['assets_version'], 'T_STYLESHEET_LANG_LINK' => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'], - 'T_STYLESHEET_NAME' => $user->style['style_name'], 'T_JQUERY_LINK' => ($config['load_jquery_cdn'] && !empty($config['load_jquery_url'])) ? $config['load_jquery_url'] : "{$web_path}assets/javascript/jquery.js?assets_version=" . $config['assets_version'], 'S_JQUERY_FALLBACK' => ($config['load_jquery_cdn']) ? true : false, From e127ba17ea3259d1fa9a135b8ae5ab9136bc7712 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Tue, 12 Jun 2012 18:40:48 +0530 Subject: [PATCH 245/255] [ticket/10936] fix language key Language key changes from INCOMPATIBLE_VERSION to INCOMPATIBLE_DATABASE to make it more meaningfull. PHPBB3-10936 --- phpBB/includes/search/fulltext_mysql.php | 2 +- phpBB/language/en/acp/search.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/search/fulltext_mysql.php b/phpBB/includes/search/fulltext_mysql.php index 7c94038cc9..c84bfcdcb0 100644 --- a/phpBB/includes/search/fulltext_mysql.php +++ b/phpBB/includes/search/fulltext_mysql.php @@ -70,7 +70,7 @@ class phpbb_search_fulltext_mysql extends phpbb_search_base if ($db->sql_layer != 'mysql4' && $db->sql_layer != 'mysqli') { - return $user->lang['FULLTEXT_MYSQL_INCOMPATIBLE_VERSION']; + return $user->lang['FULLTEXT_MYSQL_INCOMPATIBLE_DATABASE']; } $result = $db->sql_query('SHOW TABLE STATUS LIKE \'' . POSTS_TABLE . '\''); diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php index 3dc89570bf..2badb082d6 100644 --- a/phpBB/language/en/acp/search.php +++ b/phpBB/language/en/acp/search.php @@ -51,7 +51,7 @@ $lang = array_merge($lang, array( 'DELETING_INDEX_IN_PROGRESS' => 'Deleting the index in progress', 'DELETING_INDEX_IN_PROGRESS_EXPLAIN' => 'The search backend is currently cleaning its index. This can take a few minutes.', - 'FULLTEXT_MYSQL_INCOMPATIBLE_VERSION' => 'The MySQL fulltext backend can only be used with MySQL4 and above.', + 'FULLTEXT_MYSQL_INCOMPATIBLE_DATABASE' => 'The MySQL fulltext backend can only be used with MySQL4 and above.', 'FULLTEXT_MYSQL_NOT_MYISAM' => 'MySQL fulltext indexes can only be used with MyISAM tables.', 'FULLTEXT_MYSQL_TOTAL_POSTS' => 'Total number of indexed posts', 'FULLTEXT_MYSQL_MBSTRING' => 'Support for non-latin UTF-8 characters using mbstring:', From 96cb75dedb73dc0e36b842492f6a176db9147023 Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Wed, 13 Jun 2012 01:43:32 +0530 Subject: [PATCH 246/255] [ticket/10936] remove PCRE and mbstring support check Since PCRE UTF8 support already has a global check no need for mbstring or PCRE check here. PHPBB3-10936 --- phpBB/includes/search/fulltext_mysql.php | 99 ++---------------------- phpBB/language/en/acp/search.php | 4 - 2 files changed, 8 insertions(+), 95 deletions(-) diff --git a/phpBB/includes/search/fulltext_mysql.php b/phpBB/includes/search/fulltext_mysql.php index c84bfcdcb0..b59d9908c3 100644 --- a/phpBB/includes/search/fulltext_mysql.php +++ b/phpBB/includes/search/fulltext_mysql.php @@ -27,8 +27,6 @@ class phpbb_search_fulltext_mysql extends phpbb_search_base var $split_words = array(); var $search_query; var $common_words = array(); - var $pcre_properties = false; - var $mbstring_regex = false; public function __construct(&$error) { @@ -36,18 +34,6 @@ class phpbb_search_fulltext_mysql extends phpbb_search_base $this->word_length = array('min' => $config['fulltext_mysql_min_word_len'], 'max' => $config['fulltext_mysql_max_word_len']); - // PHP may not be linked with the bundled PCRE lib and instead with an older version - if (phpbb_pcre_utf8_support()) - { - $this->pcre_properties = true; - } - - if (function_exists('mb_ereg')) - { - $this->mbstring_regex = true; - mb_regex_encoding('UTF-8'); - } - $error = false; } @@ -133,40 +119,10 @@ class phpbb_search_fulltext_mysql extends phpbb_search_base $split_keywords = preg_replace("#[\n\r\t]+#", ' ', trim(htmlspecialchars_decode($keywords))); // Split words - if ($this->pcre_properties) - { - $split_keywords = preg_replace('#([^\p{L}\p{N}\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords))); - } - else if ($this->mbstring_regex) - { - $split_keywords = mb_ereg_replace('([^\w\'*"()])', '\\1\\1', str_replace('\'\'', '\' \'', trim($split_keywords))); - } - else - { - $split_keywords = preg_replace('#([^\w\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords))); - } - - if ($this->pcre_properties) - { - $matches = array(); - preg_match_all('#(?:[^\p{L}\p{N}*"()]|^)([+\-|]?(?:[\p{L}\p{N}*"()]+\'?)*[\p{L}\p{N}*"()])(?:[^\p{L}\p{N}*"()]|$)#u', $split_keywords, $matches); - $this->split_words = $matches[1]; - } - else if ($this->mbstring_regex) - { - mb_ereg_search_init($split_keywords, '(?:[^\w*"()]|^)([+\-|]?(?:[\w*"()]+\'?)*[\w*"()])(?:[^\w*"()]|$)'); - - while (($word = mb_ereg_search_regs())) - { - $this->split_words[] = $word[1]; - } - } - else - { - $matches = array(); - preg_match_all('#(?:[^\w*"()]|^)([+\-|]?(?:[\w*"()]+\'?)*[\w*"()])(?:[^\w*"()]|$)#u', $split_keywords, $matches); - $this->split_words = $matches[1]; - } + $split_keywords = preg_replace('#([^\p{L}\p{N}\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords))); + $matches = array(); + preg_match_all('#(?:[^\p{L}\p{N}*"()]|^)([+\-|]?(?:[\p{L}\p{N}*"()]+\'?)*[\p{L}\p{N}*"()])(?:[^\p{L}\p{N}*"()]|$)#u', $split_keywords, $matches); + $this->split_words = $matches[1]; // We limit the number of allowed keywords to minimize load on the database if ($config['max_num_search_keywords'] && sizeof($this->split_words) > $config['max_num_search_keywords']) @@ -271,41 +227,10 @@ class phpbb_search_fulltext_mysql extends phpbb_search_base global $config; // Split words - if ($this->pcre_properties) - { - $text = preg_replace('#([^\p{L}\p{N}\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text))); - } - else if ($this->mbstring_regex) - { - $text = mb_ereg_replace('([^\w\'*])', '\\1\\1', str_replace('\'\'', '\' \'', trim($text))); - } - else - { - $text = preg_replace('#([^\w\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text))); - } - - if ($this->pcre_properties) - { - $matches = array(); - preg_match_all('#(?:[^\p{L}\p{N}*]|^)([+\-|]?(?:[\p{L}\p{N}*]+\'?)*[\p{L}\p{N}*])(?:[^\p{L}\p{N}*]|$)#u', $text, $matches); - $text = $matches[1]; - } - else if ($this->mbstring_regex) - { - mb_ereg_search_init($text, '(?:[^\w*]|^)([+\-|]?(?:[\w*]+\'?)*[\w*])(?:[^\w*]|$)'); - - $text = array(); - while (($word = mb_ereg_search_regs())) - { - $text[] = $word[1]; - } - } - else - { - $matches = array(); - preg_match_all('#(?:[^\w*]|^)([+\-|]?(?:[\w*]+\'?)*[\w*])(?:[^\w*]|$)#u', $text, $matches); - $text = $matches[1]; - } + $text = preg_replace('#([^\p{L}\p{N}\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text))); + $matches = array(); + preg_match_all('#(?:[^\p{L}\p{N}*]|^)([+\-|]?(?:[\p{L}\p{N}*]+\'?)*[\p{L}\p{N}*])(?:[^\p{L}\p{N}*]|$)#u', $text, $matches); + $text = $matches[1]; // remove too short or too long words $text = array_values($text); @@ -908,14 +833,6 @@ class phpbb_search_fulltext_mysql extends phpbb_search_base global $user, $config; $tpl = ' -
          -

          ' . $user->lang['FULLTEXT_MYSQL_PCRE_EXPLAIN'] . '
          -
          ' . (($this->pcre_properties) ? $user->lang['YES'] : $user->lang['NO']) . ' (PHP ' . PHP_VERSION . ')
          -
          -
          -

          ' . $user->lang['FULLTEXT_MYSQL_MBSTRING_EXPLAIN'] . '
          -
          ' . (($this->mbstring_regex) ? $user->lang['YES'] : $user->lang['NO']). '
          -

          ' . $user->lang['FULLTEXT_MYSQL_MIN_SEARCH_CHARS_EXPLAIN'] . '
          ' . $config['fulltext_mysql_min_word_len'] . '
          diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php index 2badb082d6..2f46856557 100644 --- a/phpBB/language/en/acp/search.php +++ b/phpBB/language/en/acp/search.php @@ -54,10 +54,6 @@ $lang = array_merge($lang, array( 'FULLTEXT_MYSQL_INCOMPATIBLE_DATABASE' => 'The MySQL fulltext backend can only be used with MySQL4 and above.', 'FULLTEXT_MYSQL_NOT_MYISAM' => 'MySQL fulltext indexes can only be used with MyISAM tables.', '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_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.', 'FULLTEXT_MYSQL_MIN_SEARCH_CHARS_EXPLAIN' => 'Words with at least this many characters will be indexed for searching. You or your host can only change this setting by changing the mysql configuration.', 'FULLTEXT_MYSQL_MAX_SEARCH_CHARS_EXPLAIN' => 'Words with no more than this many characters will be indexed for searching. You or your host can only change this setting by changing the mysql configuration.', From 53d846477665ea6b8a3463318f03050282aec89a Mon Sep 17 00:00:00 2001 From: Michael Cullum Date: Sat, 11 Feb 2012 21:12:36 +0000 Subject: [PATCH 247/255] [ticket/10640] Change maximum subject length PHPBB3-10640 --- phpBB/includes/functions_content.php | 2 +- phpBB/styles/prosilver/template/posting_editor.html | 2 +- phpBB/styles/prosilver/template/quickreply_editor.html | 2 +- phpBB/styles/subsilver2/template/posting_body.html | 2 +- phpBB/styles/subsilver2/template/quickreply_editor.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 6b2ee98d7a..752ebe0f13 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1107,7 +1107,7 @@ function extension_allowed($forum_id, $extension, &$extensions) * NOTE: This parameter can cause undesired behavior (returning strings longer than $max_store_length) and is deprecated. * @param string $append String to be appended */ -function truncate_string($string, $max_length = 60, $max_store_length = 255, $allow_reply = false, $append = '') +function truncate_string($string, $max_length = 120, $max_store_length = 255, $allow_reply = false, $append = '') { $chars = array(); diff --git a/phpBB/styles/prosilver/template/posting_editor.html b/phpBB/styles/prosilver/template/posting_editor.html index 60766495c6..d1c86e7e13 100644 --- a/phpBB/styles/prosilver/template/posting_editor.html +++ b/phpBB/styles/prosilver/template/posting_editor.html @@ -103,7 +103,7 @@
          -
          +
          diff --git a/phpBB/styles/prosilver/template/quickreply_editor.html b/phpBB/styles/prosilver/template/quickreply_editor.html index 724fdb85b8..5fcdf0f5d4 100644 --- a/phpBB/styles/prosilver/template/quickreply_editor.html +++ b/phpBB/styles/prosilver/template/quickreply_editor.html @@ -5,7 +5,7 @@
          -
          +
          diff --git a/phpBB/styles/subsilver2/template/posting_body.html b/phpBB/styles/subsilver2/template/posting_body.html index 712c02b856..ae7d2f88d6 100644 --- a/phpBB/styles/subsilver2/template/posting_body.html +++ b/phpBB/styles/subsilver2/template/posting_body.html @@ -173,7 +173,7 @@ {L_SUBJECT}: - + {L_MESSAGE_BODY}:
          {L_MESSAGE_BODY_EXPLAIN} 

          diff --git a/phpBB/styles/subsilver2/template/quickreply_editor.html b/phpBB/styles/subsilver2/template/quickreply_editor.html index 4c3f7a3d0b..7a68a8f605 100644 --- a/phpBB/styles/subsilver2/template/quickreply_editor.html +++ b/phpBB/styles/subsilver2/template/quickreply_editor.html @@ -6,7 +6,7 @@ {L_SUBJECT}: - + {L_MESSAGE}: From a259db71058cd20eb54ac3b45a88b558c66e4cb5 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 2 May 2012 13:13:20 +0200 Subject: [PATCH 248/255] [ticket/10640] Do not change default value of truncate_string() The default value should be kept, so we do not change the behaviour for MODs and Extensions that use the function with its default values. PHPBB3-10640 --- phpBB/includes/functions_content.php | 2 +- phpBB/includes/functions_posting.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 752ebe0f13..6b2ee98d7a 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -1107,7 +1107,7 @@ function extension_allowed($forum_id, $extension, &$extensions) * NOTE: This parameter can cause undesired behavior (returning strings longer than $max_store_length) and is deprecated. * @param string $append String to be appended */ -function truncate_string($string, $max_length = 120, $max_store_length = 255, $allow_reply = false, $append = '') +function truncate_string($string, $max_length = 60, $max_store_length = 255, $allow_reply = false, $append = '') { $chars = array(); diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index f77f54679f..c549f99091 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -1657,8 +1657,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u // First of all make sure the subject and topic title are having the correct length. // To achieve this without cutting off between special chars we convert to an array and then count the elements. - $subject = truncate_string($subject); - $data['topic_title'] = truncate_string($data['topic_title']); + $subject = truncate_string($subject, 120); + $data['topic_title'] = truncate_string($data['topic_title'], 120); // Collect some basic information about which tables and which rows to update/insert $sql_data = $topic_row = array(); From 7a6a5738db3c43b385a15a84c6956c2b295cc709 Mon Sep 17 00:00:00 2001 From: Michael Cullum Date: Sun, 17 Jun 2012 19:01:17 +0100 Subject: [PATCH 249/255] [ticket/10640] Change subject length in MCP PHPBB3-10640 --- phpBB/styles/prosilver/template/mcp_topic.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/prosilver/template/mcp_topic.html b/phpBB/styles/prosilver/template/mcp_topic.html index 2a6de3ce9d..8d0294d226 100644 --- a/phpBB/styles/prosilver/template/mcp_topic.html +++ b/phpBB/styles/prosilver/template/mcp_topic.html @@ -67,7 +67,7 @@ onload_functions.push('subPanels()');
          -
          +
          From a41f86f2f724c31b2bb6e55d278b65e2660697c1 Mon Sep 17 00:00:00 2001 From: Michael Cullum Date: Sun, 17 Jun 2012 19:22:50 +0100 Subject: [PATCH 250/255] [ticket/10640] Change subject length in mcp in subsilver PHPBB3-10640 --- phpBB/styles/subsilver2/template/mcp_topic.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/subsilver2/template/mcp_topic.html b/phpBB/styles/subsilver2/template/mcp_topic.html index 8ff648da39..6bbf13e12c 100644 --- a/phpBB/styles/subsilver2/template/mcp_topic.html +++ b/phpBB/styles/subsilver2/template/mcp_topic.html @@ -12,7 +12,7 @@ {L_SPLIT_SUBJECT} - + {L_SPLIT_FORUM} From 58a3342c3e982b927aa5903a9c6bdf06c233d907 Mon Sep 17 00:00:00 2001 From: David King Date: Mon, 18 Jun 2012 12:26:28 -0400 Subject: [PATCH 251/255] [ticket/10938] Serve subforum listing on forumlist from template loop Subforum listing is available both via implode()-ed PHP loop and via template loop. The latter allows more flexibility for changing the subforum listing per style, so that is the better option. PHPBB3-10938 --- phpBB/styles/prosilver/template/forumlist_body.html | 7 ++++++- phpBB/styles/subsilver2/template/forumlist_body.html | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html index ca5e8abb1d..723c2ffeda 100644 --- a/phpBB/styles/prosilver/template/forumlist_body.html +++ b/phpBB/styles/prosilver/template/forumlist_body.html @@ -35,7 +35,12 @@
          {forumrow.L_MODERATOR_STR}: {forumrow.MODERATORS} -
          {forumrow.L_SUBFORUM_STR} {forumrow.SUBFORUMS} + +
          {forumrow.L_SUBFORUM_STR} + + {forumrow.subforum.SUBFORUM_NAME}, + +
          {L_REDIRECTS}: {forumrow.CLICKS}
          diff --git a/phpBB/styles/subsilver2/template/forumlist_body.html b/phpBB/styles/subsilver2/template/forumlist_body.html index be32d1fb77..b9a1102df0 100644 --- a/phpBB/styles/subsilver2/template/forumlist_body.html +++ b/phpBB/styles/subsilver2/template/forumlist_body.html @@ -48,8 +48,12 @@

          {forumrow.L_MODERATOR_STR}: {forumrow.MODERATORS}

          - -

          {forumrow.L_SUBFORUM_STR} {forumrow.SUBFORUMS}

          + +

          {forumrow.L_SUBFORUM_STR} + + {forumrow.subforum.SUBFORUM_NAME}, + +

          {forumrow.TOPICS}

          From d26606f986eca33495b112e00abb93a2716ac77e Mon Sep 17 00:00:00 2001 From: Patrick Webster Date: Tue, 19 Jun 2012 01:20:58 -0500 Subject: [PATCH 252/255] [ticket/10925] Clarify installation requirements for SQLite PHPBB3-10925 --- phpBB/docs/INSTALL.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index c54e408be2..482d283dfc 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -139,7 +139,7 @@
          • MySQL 3.23 or above (MySQLi supported)
          • PostgreSQL 7.3+
          • -
          • SQLite 2.8.2+
          • +
          • SQLite 2.8.2+ (SQLite 3 is not supported)
          • Firebird 2.1+
          • MS SQL Server 2000 or above (directly or via ODBC)
          • Oracle
          • From bbd3204a9cf15155ccbc1c9270575d2ba44097cb Mon Sep 17 00:00:00 2001 From: Dhruv Goel Date: Tue, 19 Jun 2012 20:03:57 +0530 Subject: [PATCH 253/255] [ticket/9551] uncomment line and change length to 255 incase of partial collation change post_subject field will be changed back to the default collation and length 255. PHPBB3-9551 --- phpBB/includes/search/fulltext_mysql.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/search/fulltext_mysql.php b/phpBB/includes/search/fulltext_mysql.php index 779ec1d216..bd4c003397 100644 --- a/phpBB/includes/search/fulltext_mysql.php +++ b/phpBB/includes/search/fulltext_mysql.php @@ -747,7 +747,7 @@ class fulltext_mysql extends search_backend { if ($db->sql_layer == 'mysqli' || version_compare($db->sql_server_info(true), '4.1.3', '>=')) { - //$alter[] = 'MODIFY post_subject varchar(100) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL'; + $alter[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL'; } else { From 3f7d55a0533d0f8e935cb7da4495817a2a76a163 Mon Sep 17 00:00:00 2001 From: Callum Macrae Date: Tue, 19 Jun 2012 17:16:42 +0100 Subject: [PATCH 254/255] [ticket/10801] Fixed quickmod tools. Fixes 10801, 10802, 10807 and 10808. PHPBB3-10801 --- phpBB/styles/prosilver/template/viewtopic_body.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index 9110cea4e9..1af512732d 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -263,7 +263,7 @@ -
            +