From 9b9618f2dd2a6fb0eea30aca220521db0e481d47 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Sun, 30 Oct 2005 15:17:14 +0000 Subject: [PATCH] 2.0.18 changes git-svn-id: file:///svn/phpbb/branches/phpBB-2_0_0@5283 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/admin/admin_board.php | 10 + phpBB/admin/admin_smilies.php | 2 + phpBB/admin/admin_user_ban.php | 2 +- phpBB/admin/admin_users.php | 13 +- phpBB/common.php | 41 ++- phpBB/docs/AUTHORS | 5 + phpBB/docs/INSTALL.html | 4 +- phpBB/includes/constants.php | 1 + phpBB/includes/db.php | 2 +- phpBB/includes/functions.php | 31 ++- phpBB/includes/functions_validate.php | 6 +- phpBB/includes/page_header.php | 8 + phpBB/includes/sessions.php | 257 ++++++++++++------ phpBB/includes/usercp_avatar.php | 73 ++++- phpBB/index.php | 40 +-- phpBB/install/schemas/ms_access_primer.zip | Bin 51467 -> 52256 bytes phpBB/install/schemas/mssql_basic.sql | 4 +- phpBB/install/schemas/mssql_schema.sql | 15 + phpBB/install/schemas/mysql_basic.sql | 4 +- phpBB/install/schemas/mysql_schema.sql | 13 + phpBB/install/schemas/postgres_basic.sql | 4 +- phpBB/install/schemas/postgres_schema.sql | 15 +- phpBB/install/update_to_latest.php | 52 +++- phpBB/language/lang_english/lang_admin.php | 6 + phpBB/login.php | 14 +- phpBB/posting.php | 8 +- phpBB/privmsg.php | 39 ++- .../subSilver/admin/board_config_body.tpl | 8 + phpBB/templates/subSilver/index_body.tpl | 2 + phpBB/templates/subSilver/login_body.tpl | 2 + 30 files changed, 503 insertions(+), 178 deletions(-) diff --git a/phpBB/admin/admin_board.php b/phpBB/admin/admin_board.php index 8cd2c69d45..b8a3859c07 100644 --- a/phpBB/admin/admin_board.php +++ b/phpBB/admin/admin_board.php @@ -100,6 +100,9 @@ $activation_admin = ( $new['require_activation'] == USER_ACTIVATION_ADMIN ) ? "c $confirm_yes = ($new['enable_confirm']) ? 'checked="checked"' : ''; $confirm_no = (!$new['enable_confirm']) ? 'checked="checked"' : ''; +$allow_autologin_yes = ($new['allow_autologin']) ? 'checked="checked"' : ''; +$allow_autologin_no = (!$new['allow_autologin']) ? 'checked="checked"' : ''; + $board_email_form_yes = ( $new['board_email_form'] ) ? "checked=\"checked\"" : ""; $board_email_form_no = ( !$new['board_email_form'] ) ? "checked=\"checked\"" : ""; @@ -165,6 +168,10 @@ $template->assign_vars(array( "L_ADMIN" => $lang['Acc_Admin'], "L_VISUAL_CONFIRM" => $lang['Visual_confirm'], "L_VISUAL_CONFIRM_EXPLAIN" => $lang['Visual_confirm_explain'], + "L_ALLOW_AUTOLOGIN" => $lang['Allow_autologin'], + "L_ALLOW_AUTOLOGIN_EXPLAIN" => $lang['Allow_autologin_explain'], + "L_AUTOLOGIN_TIME" => $lang['Autologin_time'], + "L_AUTOLOGIN_TIME_EXPLAIN" => $lang['Autologin_time_explain'], "L_COOKIE_SETTINGS" => $lang['Cookie_settings'], "L_COOKIE_SETTINGS_EXPLAIN" => $lang['Cookie_settings_explain'], "L_COOKIE_DOMAIN" => $lang['Cookie_domain'], @@ -254,6 +261,9 @@ $template->assign_vars(array( "ACTIVATION_ADMIN_CHECKED" => $activation_admin, "CONFIRM_ENABLE" => $confirm_yes, "CONFIRM_DISABLE" => $confirm_no, + 'ALLOW_AUTOLOGIN_YES' => $allow_autologin_yes, + 'ALLOW_AUTOLOGIN_NO' => $allow_autologin_no, + 'AUTOLOGIN_TIME' => (int) $new['max_autologin_time'], "BOARD_EMAIL_FORM_ENABLE" => $board_email_form_yes, "BOARD_EMAIL_FORM_DISABLE" => $board_email_form_no, "MAX_POLL_OPTIONS" => $new['max_poll_options'], diff --git a/phpBB/admin/admin_smilies.php b/phpBB/admin/admin_smilies.php index a62a534d4c..b9cfba8f0e 100644 --- a/phpBB/admin/admin_smilies.php +++ b/phpBB/admin/admin_smilies.php @@ -404,6 +404,7 @@ else if ( $mode != "" ) // $smile_code = ( isset($HTTP_POST_VARS['smile_code']) ) ? trim($HTTP_POST_VARS['smile_code']) : trim($HTTP_GET_VARS['smile_code']); $smile_url = ( isset($HTTP_POST_VARS['smile_url']) ) ? trim($HTTP_POST_VARS['smile_url']) : trim($HTTP_GET_VARS['smile_url']); + $smile_url = phpbb_ltrim(basename($smile_url), "'"); $smile_emotion = ( isset($HTTP_POST_VARS['smile_emotion']) ) ? trim($HTTP_POST_VARS['smile_emotion']) : trim($HTTP_GET_VARS['smile_emotion']); $smile_id = ( isset($HTTP_POST_VARS['smile_id']) ) ? intval($HTTP_POST_VARS['smile_id']) : intval($HTTP_GET_VARS['smile_id']); @@ -446,6 +447,7 @@ else if ( $mode != "" ) // $smile_code = ( isset($HTTP_POST_VARS['smile_code']) ) ? $HTTP_POST_VARS['smile_code'] : $HTTP_GET_VARS['smile_code']; $smile_url = ( isset($HTTP_POST_VARS['smile_url']) ) ? $HTTP_POST_VARS['smile_url'] : $HTTP_GET_VARS['smile_url']; + $smile_url = phpbb_ltrim(basename($smile_url), "'"); $smile_emotion = ( isset($HTTP_POST_VARS['smile_emotion']) ) ? $HTTP_POST_VARS['smile_emotion'] : $HTTP_GET_VARS['smile_emotion']; $smile_code = trim($smile_code); $smile_url = trim($smile_url); diff --git a/phpBB/admin/admin_user_ban.php b/phpBB/admin/admin_user_ban.php index f04ed7d0ed..355e5c170d 100644 --- a/phpBB/admin/admin_user_ban.php +++ b/phpBB/admin/admin_user_ban.php @@ -155,7 +155,7 @@ if ( isset($HTTP_POST_VARS['submit']) ) // contained in the annotated php manual at php.com (ereg // section) // - if (preg_match('#^(([a-z0-9&.-_+])|(\*))+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*?[a-z]+$#is', trim($email_list_temp[$i]))) + if (preg_match('/^(([a-z0-9&\'\.\-_\+])|(\*))+@(([a-z0-9\-])|(\*))+\.([a-z0-9\-]+\.)*?[a-z]+$/is', trim($email_list_temp[$i]))) { $email_list[] = trim($email_list_temp[$i]); } diff --git a/phpBB/admin/admin_users.php b/phpBB/admin/admin_users.php index da0c9bf616..fd249e44ca 100644 --- a/phpBB/admin/admin_users.php +++ b/phpBB/admin/admin_users.php @@ -254,6 +254,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) $user_dateformat = ( $HTTP_POST_VARS['dateformat'] ) ? trim( $HTTP_POST_VARS['dateformat'] ) : $board_config['default_dateformat']; $user_avatar_local = ( isset( $HTTP_POST_VARS['avatarselect'] ) && !empty($HTTP_POST_VARS['submitavatar'] ) && $board_config['allow_avatar_local'] ) ? $HTTP_POST_VARS['avatarselect'] : ( ( isset( $HTTP_POST_VARS['avatarlocal'] ) ) ? $HTTP_POST_VARS['avatarlocal'] : '' ); + $user_avatar_category = ( isset($HTTP_POST_VARS['avatarcatname']) && $board_config['allow_avatar_local'] ) ? htmlspecialchars($HTTP_POST_VARS['avatarcatname']) : '' ; $user_avatar_remoteurl = ( !empty($HTTP_POST_VARS['avatarremoteurl']) ) ? trim( $HTTP_POST_VARS['avatarremoteurl'] ) : ''; $user_avatar_url = ( !empty($HTTP_POST_VARS['avatarurl']) ) ? trim( $HTTP_POST_VARS['avatarurl'] ) : ''; @@ -293,7 +294,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) if ( !isset($HTTP_POST_VARS['cancelavatar'])) { - $user_avatar = $user_avatar_local; + $user_avatar = $user_avatar_category . '/' . $user_avatar_local; $user_avatar_type = USER_AVATAR_GALLERY; } } @@ -645,7 +646,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) } else if( $user_avatar_local != "" && $avatar_sql == "" && !$error ) { - $avatar_sql = ", user_avatar = '" . str_replace("\'", "''", $user_avatar_local) . "', user_avatar_type = " . USER_AVATAR_GALLERY; + $avatar_sql = ", user_avatar = '" . str_replace("\'", "''", phpbb_ltrim(basename($user_avatar_category), "'") . '/' . phpbb_ltrim(basename($user_avatar_local), "'")) . "', user_avatar_type = " . USER_AVATAR_GALLERY; } // @@ -822,7 +823,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) { if( preg_match("/(\.gif$|\.png$|\.jpg)$/is", $sub_file) ) { - $avatar_images[$file][$avatar_row_count][$avatar_col_count] = $file . "/" . $sub_file; + $avatar_images[$file][$avatar_row_count][$avatar_col_count] = $sub_file; $avatar_col_count++; if( $avatar_col_count == 5 ) @@ -867,7 +868,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) for($j = 0; $j < count($avatar_images[$category][$i]); $j++) { $template->assign_block_vars("avatar_row.avatar_column", array( - "AVATAR_IMAGE" => "../" . $board_config['avatar_gallery_path'] . "/" . $avatar_images[$category][$i][$j]) + "AVATAR_IMAGE" => "../" . $board_config['avatar_gallery_path'] . '/' . $category . '/' . $avatar_images[$category][$i][$j]) ); $template->assign_block_vars("avatar_row.avatar_option_column", array( @@ -878,7 +879,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) $coppa = ( ( !$HTTP_POST_VARS['coppa'] && !$HTTP_GET_VARS['coppa'] ) || $mode == "register") ? 0 : TRUE; - $s_hidden_fields = ''; + $s_hidden_fields = ''; $s_hidden_fields .= ''; $s_hidden_fields .= ''; @@ -934,7 +935,7 @@ if ( $mode == 'edit' || $mode == 'save' && ( isset($HTTP_POST_VARS['username']) if( !empty($user_avatar_local) ) { - $s_hidden_fields .= ''; + $s_hidden_fields .= ''; } if( $user_avatar_type ) diff --git a/phpBB/common.php b/phpBB/common.php index ce8a6a538a..f5a5655c28 100644 --- a/phpBB/common.php +++ b/phpBB/common.php @@ -28,10 +28,11 @@ if ( !defined('IN_PHPBB') ) error_reporting (E_ERROR | E_WARNING | E_PARSE); // This will NOT report uninitialized variables set_magic_quotes_runtime(0); // Disable magic_quotes_runtime -// The following code (unsetting globals) was contributed by Matt Kavanagh +// The following code (unsetting globals) +// Thanks to Matt Kavanagh and Stefan Esser for providing feedback as well as patch files // PHP5 with register_long_arrays off? -if (!isset($HTTP_POST_VARS) && isset($_POST)) +if (@phpversion() >= '5.0.0' && (!ini_get('register_long_arrays') || @ini_get('register_long_arrays') == '0' || strtolower(@ini_get('register_long_arrays')) == 'off')) { $HTTP_POST_VARS = $_POST; $HTTP_GET_VARS = $_GET; @@ -47,29 +48,19 @@ if (!isset($HTTP_POST_VARS) && isset($_POST)) } } -if (@phpversion() < '4.0.0') +// Protect against GLOBALS tricks +if (isset($HTTP_POST_VARS['GLOBALS']) || isset($HTTP_POST_FILES['GLOBALS']) || isset($HTTP_GET_VARS['GLOBALS']) || isset($HTTP_COOKIE_VARS['GLOBALS'])) { - // PHP3 path; in PHP3, globals are _always_ registered - - // We 'flip' the array of variables to test like this so that - // we can validate later with isset($test[$var]) (no in_array()) - $test = array('HTTP_GET_VARS' => NULL, 'HTTP_POST_VARS' => NULL, 'HTTP_COOKIE_VARS' => NULL, 'HTTP_SERVER_VARS' => NULL, 'HTTP_ENV_VARS' => NULL, 'HTTP_POST_FILES' => NULL, 'phpEx' => NULL, 'phpbb_root_path' => NULL); - - // Loop through each input array - @reset($test); - while (list($input,) = @each($test)) - { - while (list($var,) = @each($$input)) - { - // Validate the variable to be unset - if (!isset($test[$var]) && $var != 'test' && $var != 'input') - { - unset($$var); - } - } - } + die("Hacking attempt"); } -else if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on') + +// Protect against HTTP_SESSION_VARS tricks +if (isset($HTTP_SESSION_VARS) && !is_array($HTTP_SESSION_VARS)) +{ + die("Hacking attempt"); +} + +if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on') { // PHP4+ path $not_unset = array('HTTP_GET_VARS', 'HTTP_POST_VARS', 'HTTP_COOKIE_VARS', 'HTTP_SERVER_VARS', 'HTTP_SESSION_VARS', 'HTTP_ENV_VARS', 'HTTP_POST_FILES', 'phpEx', 'phpbb_root_path'); @@ -77,7 +68,7 @@ else if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_gl // Not only will array_merge give a warning if a parameter // is not an array, it will actually fail. So we check if // HTTP_SESSION_VARS has been initialised. - if (!isset($HTTP_SESSION_VARS)) + if (!isset($HTTP_SESSION_VARS) || !is_array($HTTP_SESSION_VARS)) { $HTTP_SESSION_VARS = array(); } @@ -96,7 +87,7 @@ else if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_gl unset($$var); } } - + unset($input); } diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS index a2d973c857..358e5e179f 100644 --- a/phpBB/docs/AUTHORS +++ b/phpBB/docs/AUTHORS @@ -1 +1,6 @@ Please see: http://www.phpbb.com/about.php for a list of all the people involved in phpBB. +Please see: http://www.phpbb.com/about.php for a list of people involved within the security audit of phpBB (since phpBB 2.0.17). + +[September 2005] +Our special thanks goes to our former developer and manager psoTFX (Paul S. Owen) for being a wonderful teammate and talented programer. +He was a driving force in the project for over 3 years and helped a lot in making phpBB what it is now. diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index a710763cb6..59b9504403 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -194,7 +194,7 @@ p,ul,td {font-size:10pt;}

7.ii. Changed files only

-

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 2.0.16 you should select the phpBB-2.0.16_to_2.0.17.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 2.0.17 you should select the phpBB-2.0.17_to_2.0.18.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.

@@ -204,7 +204,7 @@ p,ul,td {font-size:10pt;}

The patch file is probably the best solution for those with many Mods or other changes who do not want to re-add them back to all the changed files. To use this you will need command line access to a standard UNIX type patch application.

-

A number of patch files are provided to allow you to upgrade from previous stable releases. Select the correct patch, e.g. if your current version is 2.0.16 you need the phpBB-2.0.16_to_2.0.17.patch. Place the correct patch in the parent directory containing the phpBB 2 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 phpBB2, 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 upgrade from previous stable releases. Select the correct patch, e.g. if your current version is 2.0.17 you need the phpBB-2.0.17_to_2.0.18.patch. Place the correct patch in the parent directory containing the phpBB 2 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 phpBB2, 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 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/includes/constants.php b/phpBB/includes/constants.php index 723a8f75ef..70196769c2 100644 --- a/phpBB/includes/constants.php +++ b/phpBB/includes/constants.php @@ -167,6 +167,7 @@ define('SEARCH_TABLE', $table_prefix.'search_results'); define('SEARCH_WORD_TABLE', $table_prefix.'search_wordlist'); define('SEARCH_MATCH_TABLE', $table_prefix.'search_wordmatch'); define('SESSIONS_TABLE', $table_prefix.'sessions'); +define('SESSIONS_KEYS_TABLE', $table_prefix.'sessions_keys'); define('SMILIES_TABLE', $table_prefix.'smilies'); define('THEMES_TABLE', $table_prefix.'themes'); define('THEMES_NAME_TABLE', $table_prefix.'themes_name'); diff --git a/phpBB/includes/db.php b/phpBB/includes/db.php index 73ca94fc38..700bb111ac 100644 --- a/phpBB/includes/db.php +++ b/phpBB/includes/db.php @@ -60,7 +60,7 @@ switch($dbms) $db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname, false); if(!$db->db_connect_id) { - message_die(CRITICAL_ERROR, "Could not connect to the database"); + message_die(CRITICAL_ERROR, "Could not connect to the database"); } ?> \ No newline at end of file diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 38b3f38fc4..993b194df8 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -78,12 +78,41 @@ function get_db_stat($mode) function phpbb_clean_username($username) { $username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25); - $username = phpbb_rtrim($username, "\\"); + $username = phpbb_rtrim($username, "\\"); $username = str_replace("'", "\'", $username); return $username; } +/** +* This function is a wrapper for ltrim, as charlist is only supported in php >= 4.1.0 +* Added in phpBB 2.0.18 +*/ +function phpbb_ltrim($str, $charlist = false) +{ + if ($charlist === false) + { + return ltrim($str); + } + + $php_version = explode('.', PHP_VERSION); + + // php version < 4.1.0 + if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1)) + { + while ($str{0} == $charlist) + { + $str = substr($str, 1); + } + } + else + { + $str = ltrim($str, $charlist); + } + + return $str; +} + // added at phpBB 2.0.12 to fix a bug in PHP 4.3.10 (only supporting charlist in php >= 4.1.0) function phpbb_rtrim($str, $charlist = false) { diff --git a/phpBB/includes/functions_validate.php b/phpBB/includes/functions_validate.php index 3f8a23b699..42bf2e80bb 100644 --- a/phpBB/includes/functions_validate.php +++ b/phpBB/includes/functions_validate.php @@ -32,13 +32,13 @@ function validate_username($username) // Remove doubled up spaces $username = preg_replace('#\s+#', ' ', trim($username)); $username = phpbb_clean_username($username); - + $sql = "SELECT username - FROM " . USERS_TABLE . " + FROM " . USERS_TABLE . " WHERE LOWER(username) = '" . strtolower($username) . "'"; if ($result = $db->sql_query($sql)) { - if ($row = $db->sql_fetchrow($result)) + while ($row = $db->sql_fetchrow($result)) { if (($userdata['session_logged_in'] && $row['username'] != $userdata['username']) || !$userdata['session_logged_in']) { diff --git a/phpBB/includes/page_header.php b/phpBB/includes/page_header.php index 12676e1079..42e8667e42 100644 --- a/phpBB/includes/page_header.php +++ b/phpBB/includes/page_header.php @@ -450,6 +450,14 @@ $template->assign_vars(array( if ( !$userdata['session_logged_in'] ) { $template->assign_block_vars('switch_user_logged_out', array()); + // + // Allow autologin? + // + if (!isset($board_config['allow_autologin']) || $board_config['allow_autologin'] ) + { + $template->assign_block_vars('switch_allow_autologin', array()); + $template->assign_block_vars('switch_user_logged_out.switch_allow_autologin', array()); + } } else { diff --git a/phpBB/includes/sessions.php b/phpBB/includes/sessions.php index b064c8c7e2..ee4d42d31a 100644 --- a/phpBB/includes/sessions.php +++ b/phpBB/includes/sessions.php @@ -57,73 +57,90 @@ function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_a $last_visit = 0; $current_time = time(); - $expiry_time = $current_time - $board_config['session_length']; // - // Try and pull the last time stored in a cookie, if it exists + // Are auto-logins allowed? + // If allow_autologin is not set or is true then they are + // (same behaviour as old 2.0.x session code) // - $sql = "SELECT * - FROM " . USERS_TABLE . " - WHERE user_id = $user_id"; - if ( !($result = $db->sql_query($sql)) ) + if (isset($board_config['allow_autologin']) && !$board_config['allow_autologin']) { - message_die(CRITICAL_ERROR, 'Could not obtain lastvisit data from user table', '', __LINE__, __FILE__, $sql); + $enable_autologin = $sessiondata['autologinid'] = false; } - $userdata = $db->sql_fetchrow($result); + // + // First off attempt to join with the autologin value if we have one + // If not, just use the user_id value + // + $userdata = array(); - if ( $user_id != ANONYMOUS ) + if ($user_id != ANONYMOUS) { - $auto_login_key = $userdata['user_password']; - - if ( $auto_create ) + if (isset($sessiondata['autologinid']) && (string) $sessiondata['autologinid'] != '' && $user_id) { - if ( isset($sessiondata['autologinid']) && $userdata['user_active'] ) + $sql = 'SELECT u.* + FROM ' . USERS_TABLE . ' u, ' . SESSIONS_KEYS_TABLE . ' k + WHERE u.user_id = ' . (int) $user_id . " + AND u.user_active = 1 + AND k.user_id = u.user_id + AND k.key_id = '" . md5($sessiondata['autologinid']) . "'"; + if (!($result = $db->sql_query($sql))) { - // We have to login automagically - if( $sessiondata['autologinid'] === $auto_login_key ) - { - // autologinid matches password - $login = 1; - $enable_autologin = 1; - } - else - { - // No match; don't login, set as anonymous user - $login = 0; - $enable_autologin = 0; - $user_id = $userdata['user_id'] = ANONYMOUS; - - $sql = 'SELECT * FROM ' . USERS_TABLE . ' WHERE user_id = ' . ANONYMOUS; - $result = $db->sql_query($sql); - $userdata = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - } + message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql); } - else - { - // Autologin is not set. Don't login, set as anonymous user - $login = 0; - $enable_autologin = 0; - $user_id = $userdata['user_id'] = ANONYMOUS; - $sql = 'SELECT * FROM ' . USERS_TABLE . ' WHERE user_id = ' . ANONYMOUS; - $result = $db->sql_query($sql); - $userdata = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - } + $userdata = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + $enable_autologin = $login = 1; } - else + else if (!$auto_create) { + $sessiondata['autologinid'] = ''; + $sessiondata['userid'] = $user_id; + + $sql = 'SELECT * + FROM ' . USERS_TABLE . ' + WHERE user_id = ' . (int) $user_id . ' + AND user_active = 1'; + if (!($result = $db->sql_query($sql))) + { + message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql); + } + + $userdata = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + $login = 1; } } - else + + // + // At this point either $userdata should be populated or + // one of the below is true + // * Key didn't match one in the DB + // * User does not exist + // * User is inactive + // + if (!sizeof($userdata) || !is_array($userdata) || !$userdata) { - $login = 0; - $enable_autologin = 0; + $sessiondata['autologinid'] = ''; + $sessiondata['userid'] = $user_id = ANONYMOUS; + $enable_autologin = $login = 0; + + $sql = 'SELECT * + FROM ' . USERS_TABLE . ' + WHERE user_id = ' . (int) $user_id; + if (!($result = $db->sql_query($sql))) + { + message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql); + } + + $userdata = $db->sql_fetchrow($result); + $db->sql_freeresult($result); } + // // Initial ban check against user id, IP and email address // @@ -174,7 +191,7 @@ function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_a } if ( $user_id != ANONYMOUS ) - {// ( $userdata['user_session_time'] > $expiry_time && $auto_create ) ? $userdata['user_lastvisit'] : ( + { $last_visit = ( $userdata['user_session_time'] > 0 ) ? $userdata['user_session_time'] : $current_time; if (!$admin) @@ -190,7 +207,41 @@ function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_a $userdata['user_lastvisit'] = $last_visit; - $sessiondata['autologinid'] = (!$admin) ? (( $enable_autologin && $sessionmethod == SESSION_METHOD_COOKIE ) ? $auto_login_key : '') : $sessiondata['autologinid']; + // + // Regenerate the auto-login key + // + if ($enable_autologin) + { + list($sec, $usec) = explode(' ', microtime()); + mt_srand(hexdec(substr($session_id, 0, 8)) + (float) $sec + ((float) $usec * 1000000)); + $auto_login_key = uniqid(mt_rand(), true); + + if (isset($sessiondata['autologinid']) && (string) $sessiondata['autologinid'] != '') + { + $sql = 'UPDATE ' . SESSIONS_KEYS_TABLE . " + SET last_ip = '$user_ip', key_id = '" . md5($auto_login_key) . "', last_login = $current_time + WHERE key_id = '" . md5($sessiondata['autologinid']) . "'"; + } + else + { + $sql = 'INSERT INTO ' . SESSIONS_KEYS_TABLE . "(key_id, user_id, last_ip, last_login) + VALUES ('" . md5($auto_login_key) . "', $user_id, '$user_ip', $current_time)"; + } + + if ( !$db->sql_query($sql) ) + { + message_die(CRITICAL_ERROR, 'Error updating session key', '', __LINE__, __FILE__, $sql); + } + + $sessiondata['autologinid'] = $auto_login_key; + unset($auto_login_key); + } + else + { + $sessiondata['autologinid'] = ''; + } + +// $sessiondata['autologinid'] = (!$admin) ? (( $enable_autologin && $sessionmethod == SESSION_METHOD_COOKIE ) ? $auto_login_key : '') : $sessiondata['autologinid']; $sessiondata['userid'] = $user_id; } @@ -202,6 +253,7 @@ function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_a $userdata['session_start'] = $current_time; $userdata['session_time'] = $current_time; $userdata['session_admin'] = $admin; + $userdata['session_key'] = $sessiondata['autologinid']; setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure); setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure); @@ -313,18 +365,7 @@ function session_pagestart($user_ip, $thispage_id) } } - // - // Delete expired sessions - // - $expiry_time = $current_time - $board_config['session_length']; - - $sql = "DELETE FROM " . SESSIONS_TABLE . " - WHERE session_time < $expiry_time - AND session_id <> '$session_id'"; - if ( !$db->sql_query($sql) ) - { - message_die(CRITICAL_ERROR, 'Error clearing sessions table', '', __LINE__, __FILE__, $sql); - } + session_clean($userdata['session_id']); setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure); setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure); @@ -350,14 +391,14 @@ function session_pagestart($user_ip, $thispage_id) } -// -// session_end closes out a session -// deleting the corresponding entry -// in the sessions table -// +/** +* Terminates the specified session +* It will delete the entry in the sessions table for this session, +* remove the corresponding auto-login key and reset the cookies +*/ function session_end($session_id, $user_id) { - global $db, $lang, $board_config; + global $db, $lang, $board_config, $userdata; global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID; $cookiename = $board_config['cookie_name']; @@ -367,20 +408,6 @@ function session_end($session_id, $user_id) $current_time = time(); - // - // Pull cookiedata or grab the URI propagated sid - // - if ( isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) ) - { - $session_id = isset( $HTTP_COOKIE_VARS[$cookiename . '_sid'] ) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : ''; - $sessionmethod = SESSION_METHOD_COOKIE; - } - else - { - $session_id = ( isset($HTTP_GET_VARS['sid']) ) ? $HTTP_GET_VARS['sid'] : ''; - $sessionmethod = SESSION_METHOD_GET; - } - if (!preg_match('/^[A-Za-z0-9]*$/', $session_id)) { return; @@ -389,7 +416,7 @@ function session_end($session_id, $user_id) // // Delete existing session // - $sql = "DELETE FROM " . SESSIONS_TABLE . " + $sql = 'DELETE FROM ' . SESSIONS_TABLE . " WHERE session_id = '$session_id' AND session_user_id = $user_id"; if ( !$db->sql_query($sql) ) @@ -397,12 +424,78 @@ function session_end($session_id, $user_id) message_die(CRITICAL_ERROR, 'Error removing user session', '', __LINE__, __FILE__, $sql); } + // + // Remove this auto-login entry (if applicable) + // + if ( isset($userdata['session_key']) && $userdata['session_key'] != '' ) + { + $autologin_key = md5($userdata['session_key']); + $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' + WHERE user_id = ' . (int) $user_id . " + AND key_id = '$autologin_key'"; + if ( !$db->sql_query($sql) ) + { + message_die(CRITICAL_ERROR, 'Error removing auto-login key', '', __LINE__, __FILE__, $sql); + } + } + + // + // We expect that message_die will be called after this function, + // but just in case it isn't, reset $userdata to the details for a guest + // + $sql = 'SELECT * + FROM ' . USERS_TABLE . ' + WHERE user_id = ' . ANONYMOUS; + if ( !($result = $db->sql_query($sql)) ) + { + message_die(CRITICAL_ERROR, 'Error obtaining user details', '', __LINE__, __FILE__, $sql); + } + if ( !($userdata = $db->sql_fetchrow($result)) ) + { + message_die(CRITICAL_ERROR, 'Error obtaining user details', '', __LINE__, __FILE__, $sql); + } + $db->sql_freeresult($result); + + setcookie($cookiename . '_data', '', $current_time - 31536000, $cookiepath, $cookiedomain, $cookiesecure); setcookie($cookiename . '_sid', '', $current_time - 31536000, $cookiepath, $cookiedomain, $cookiesecure); return true; } +/** +* Removes expired sessions and auto-login keys from the database +*/ +function session_clean($session_id) +{ + global $board_config, $db; + + // + // Delete expired sessions + // + $sql = 'DELETE FROM ' . SESSIONS_TABLE . ' + WHERE session_time < ' . (time() - (int) $board_config['session_length']) . " + AND session_id <> '$session_id'"; + if ( !$db->sql_query($sql) ) + { + message_die(CRITICAL_ERROR, 'Error clearing sessions table', '', __LINE__, __FILE__, $sql); + } + + // + // Delete expired auto-login keys + // If max_autologin_time is not set then keys will never be deleted + // (same behaviour as old 2.0.x session code) + // + if (!empty($board_config['max_autologin_time']) && $board_config['max_autologin_time'] > 0) + { + $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' + WHERE last_login < ' . (time() - (86400 * (int) $board_config['max_autologin_time'])); + $db->sql_query($sql); + } + + return true; +} + // // Append $SID to a url. Borrowed from phplib and modified. This is an // extra routine utilised by the session code above and acts as a wrapper diff --git a/phpBB/includes/usercp_avatar.php b/phpBB/includes/usercp_avatar.php index 14772983de..20034c643d 100644 --- a/phpBB/includes/usercp_avatar.php +++ b/phpBB/includes/usercp_avatar.php @@ -63,19 +63,26 @@ function user_avatar_delete($avatar_type, $avatar_file) return ", user_avatar = '', user_avatar_type = " . USER_AVATAR_NONE; } -function user_avatar_gallery($mode, &$error, &$error_msg, $avatar_filename) +function user_avatar_gallery($mode, &$error, &$error_msg, $avatar_filename, $avatar_category) { global $board_config; - $avatar_filename = str_replace(array('../', '..\\', './', '.\\'), '', $avatar_filename); - if ($avatar_filename{0} == '/' || $avatar_filename{0} == "\\") + $avatar_filename = phpbb_ltrim(basename($avatar_filename), "'"); + $avatar_category = phpbb_ltrim(basename($avatar_category), "'"); + + if(!preg_match('/(\.gif$|\.png$|\.jpg|\.jpeg)$/is', $avatar_filename)) { return ''; } - if ( file_exists(@phpbb_realpath($board_config['avatar_gallery_path'] . '/' . $avatar_filename)) && ($mode == 'editprofile') ) + if ($avatar_filename == "" || $avatar_category == "") { - $return = ", user_avatar = '" . str_replace("\'", "''", $avatar_filename) . "', user_avatar_type = " . USER_AVATAR_GALLERY; + return ''; + } + + if ( file_exists(@phpbb_realpath($board_config['avatar_gallery_path'] . '/' . $avatar_category . '/' . $avatar_filename)) && ($mode == 'editprofile') ) + { + $return = ", user_avatar = '" . str_replace("\'", "''", $avatar_category . '/' . $avatar_filename) . "', user_avatar_type = " . USER_AVATAR_GALLERY; } else { @@ -110,6 +117,9 @@ function user_avatar_upload($mode, $avatar_mode, &$current_avatar, &$current_typ $ini_val = ( @phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var'; + $width = $height = 0; + $type = ''; + if ( $avatar_mode == 'remote' && preg_match('/^(http:\/\/)?([\w\-\.]+)\:?([0-9]*)\/(.*)$/', $avatar_filename, $url_ary) ) { if ( empty($url_ary[4]) ) @@ -167,7 +177,7 @@ function user_avatar_upload($mode, $avatar_mode, &$current_avatar, &$current_typ message_die(GENERAL_ERROR, 'Could not write avatar file to local storage. Please contact the board administrator with this message', '', __LINE__, __FILE__); } - list($width, $height) = @getimagesize($tmp_filename); + list($width, $height, $type) = @getimagesize($tmp_filename); } else { @@ -193,7 +203,7 @@ function user_avatar_upload($mode, $avatar_mode, &$current_avatar, &$current_typ return; } - list($width, $height) = @getimagesize($avatar_filename); + list($width, $height, $type) = @getimagesize($avatar_filename); } if ( !($imgtype = check_image_type($avatar_filetype, $error, $error_msg)) ) @@ -201,16 +211,51 @@ function user_avatar_upload($mode, $avatar_mode, &$current_avatar, &$current_typ return; } + switch ($type) + { + // GIF + case 1: + if ($imgtype != '.gif') + { + @unlink($tmp_filename); + message_die(GENERAL_ERROR, 'Unable to upload file', '', __LINE__, __FILE__); + } + break; + + // JPG, JPC, JP2, JPX, JB2 + case 2: + case 9: + case 10: + case 11: + case 12: + if ($imgtype != '.jpg' && $imgtype != '.jpeg') + { + @unlink($tmp_filename); + message_die(GENERAL_ERROR, 'Unable to upload file', '', __LINE__, __FILE__); + } + break; + + // PNG + case 3: + if ($imgtype != '.png') + { + @unlink($tmp_filename); + message_die(GENERAL_ERROR, 'Unable to upload file', '', __LINE__, __FILE__); + } + break; + + default: + @unlink($tmp_filename); + message_die(GENERAL_ERROR, 'Unable to upload file', '', __LINE__, __FILE__); + } + if ( $width > 0 && $height > 0 && $width <= $board_config['avatar_max_width'] && $height <= $board_config['avatar_max_height'] ) { $new_filename = uniqid(rand()) . $imgtype; if ( $mode == 'editprofile' && $current_type == USER_AVATAR_UPLOAD && $current_avatar != '' ) { - if ( file_exists(@phpbb_realpath('./' . $board_config['avatar_path'] . '/' . $current_avatar)) ) - { - @unlink('./' . $board_config['avatar_path'] . '/' . $current_avatar); - } + user_avatar_delete($current_type, $current_avatar); } if( $avatar_mode == 'remote' ) @@ -276,7 +321,7 @@ function display_avatar_gallery($mode, &$category, &$user_id, &$email, &$current { if( preg_match('/(\.gif$|\.png$|\.jpg|\.jpeg)$/is', $sub_file) ) { - $avatar_images[$file][$avatar_row_count][$avatar_col_count] = $file . '/' . $sub_file; + $avatar_images[$file][$avatar_row_count][$avatar_col_count] = $sub_file; $avatar_name[$file][$avatar_row_count][$avatar_col_count] = ucfirst(str_replace("_", " ", preg_replace('/^(.*)\..*$/', '\1', $sub_file))); $avatar_col_count++; @@ -322,7 +367,7 @@ function display_avatar_gallery($mode, &$category, &$user_id, &$email, &$current for($j = 0; $j < count($avatar_images[$category][$i]); $j++) { $template->assign_block_vars('avatar_row.avatar_column', array( - "AVATAR_IMAGE" => $board_config['avatar_gallery_path'] . '/' . $avatar_images[$category][$i][$j], + "AVATAR_IMAGE" => $board_config['avatar_gallery_path'] . '/' . $category . '/' . $avatar_images[$category][$i][$j], "AVATAR_NAME" => $avatar_name[$category][$i][$j]) ); @@ -334,7 +379,7 @@ function display_avatar_gallery($mode, &$category, &$user_id, &$email, &$current $params = array('coppa', 'user_id', 'username', 'email', 'current_email', 'cur_password', 'new_password', 'password_confirm', 'icq', 'aim', 'msn', 'yim', 'website', 'location', 'occupation', 'interests', 'signature', 'viewemail', 'notifypm', 'popup_pm', 'notifyreply', 'attachsig', 'allowhtml', 'allowbbcode', 'allowsmilies', 'hideonline', 'style', 'language', 'timezone', 'dateformat'); - $s_hidden_vars = ''; + $s_hidden_vars = ''; for($i = 0; $i < count($params); $i++) { diff --git a/phpBB/index.php b/phpBB/index.php index 2f9b4023c8..1a8edd8e66 100644 --- a/phpBB/index.php +++ b/phpBB/index.php @@ -119,10 +119,7 @@ if( !($result = $db->sql_query($sql)) ) } $category_rows = array(); -while ($row = $db->sql_fetchrow($result)) -{ - $category_rows[] = $row; -} +while( $category_rows[] = $db->sql_fetchrow($result) ); $db->sql_freeresult($result); if( ( $total_categories = count($category_rows) ) ) @@ -186,8 +183,14 @@ if( ( $total_categories = count($category_rows) ) ) // Obtain a list of topic ids which contain // posts made since user last visited // - if ( $userdata['session_logged_in'] ) + if ($userdata['session_logged_in']) { + // 60 days limit + if ($userdata['user_lastvisit'] < (time() - 5184000)) + { + $userdata['user_lastvisit'] = time() - 5184000; + } + $sql = "SELECT t.forum_id, t.topic_id, p.post_time FROM " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p WHERE p.post_id = t.topic_last_post_id @@ -296,19 +299,6 @@ if( ( $total_categories = count($category_rows) ) ) 'U_MARK_READ' => append_sid("index.$phpEx?mark=forums")) ); - // - // Let's decide which categories we should display - // - $display_categories = array(); - - for ($i = 0; $i < $total_forums; $i++ ) - { - if ($is_auth_ary[$forum_data[$i]['forum_id']]['auth_view']) - { - $display_categories[$forum_data[$i]['cat_id']] = true; - } - } - // // Okay, let's build the index // @@ -316,11 +306,23 @@ if( ( $total_categories = count($category_rows) ) ) { $cat_id = $category_rows[$i]['cat_id']; + // + // Should we display this category/forum set? + // + $display_forums = false; + for($j = 0; $j < $total_forums; $j++) + { + if ( $is_auth_ary[$forum_data[$j]['forum_id']]['auth_view'] && $forum_data[$j]['cat_id'] == $cat_id ) + { + $display_forums = true; + } + } + // // Yes, we should, so first dump out the category // title, then, if appropriate the forum list // - if (isset($display_categories[$cat_id]) && $display_categories[$cat_id]) + if ( $display_forums ) { $template->assign_block_vars('catrow', array( 'CAT_ID' => $cat_id, diff --git a/phpBB/install/schemas/ms_access_primer.zip b/phpBB/install/schemas/ms_access_primer.zip index a62031ebfcd5d11a554b2e10517722768f7ef538..2065705bda9fc6c21cd7e974546a211fb8eac870 100644 GIT binary patch literal 52256 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 H-AMlfi9{5$ literal 51467 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 diff --git a/phpBB/install/schemas/mssql_basic.sql b/phpBB/install/schemas/mssql_basic.sql index e2a059404c..f9efa7626a 100644 --- a/phpBB/install/schemas/mssql_basic.sql +++ b/phpBB/install/schemas/mssql_basic.sql @@ -42,6 +42,8 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_savebox_privms INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_email_sig','Thanks, The Management'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_email','youraddress@yourdomain.com'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_autologin','1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_autologin_time','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_delivery','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_host',''); INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_username',''); @@ -69,7 +71,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('record_online_date INSERT INTO phpbb_config (config_name, config_value) VALUES ('server_name', 'www.yourdomain.tld'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('server_port', '80'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('script_path', '/phpBB2/'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '.0.17'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '.0.18'); /* -- Categories diff --git a/phpBB/install/schemas/mssql_schema.sql b/phpBB/install/schemas/mssql_schema.sql index 007fddaa09..6de6a63ad7 100644 --- a/phpBB/install/schemas/mssql_schema.sql +++ b/phpBB/install/schemas/mssql_schema.sql @@ -195,6 +195,14 @@ CREATE TABLE [phpbb_sessions] ( ) ON [PRIMARY] GO +CREATE TABLE [phpbb_sessions_keys] ( + [key_id] [char] (32) NOT NULL , + [user_id] [int] NOT NULL , + [last_ip] [char] (8) NOT NULL , + [last_login] [int] NOT NULL +) ON [PRIMARY] +GO + CREATE TABLE [phpbb_smilies] ( [smilies_id] [int] IDENTITY (1, 1) NOT NULL , [code] [varchar] (10) NOT NULL , @@ -616,6 +624,7 @@ ALTER TABLE [phpbb_users] WITH NOCHECK ADD CONSTRAINT [DF_phpbb_users_user_allow_viewonline] DEFAULT (1) FOR [user_allow_viewonline], CONSTRAINT [DF_phpbb_users_user_notify_pm] DEFAULT (0) FOR [user_notify_pm], CONSTRAINT [DF_phpbb_users_user_popup_pm] DEFAULT (1) FOR [user_popup_pm], + CONSTRAINT [DF_phpbb_users_user_dateformat] DEFAULT('d M Y H:i') FOR [user_dateformat], CONSTRAINT [DF_phpbb_users_user_avatar_type] DEFAULT (0) FOR [user_avatar_type] GO @@ -667,6 +676,12 @@ GO CREATE INDEX [IX_phpbb_sessions] ON [phpbb_sessions]([session_id], [session_user_id], [session_ip], [session_logged_in]) ON [PRIMARY] GO + CREATE INDEX [IX_phpbb_sessions_keys] ON [phpbb_sessions_keys]([key_id], [user_id]) ON [PRIMARY] +GO + + CREATE INDEX [IX_phpbb_sessions_keys] ON [phpbb_sessions_keys]([last_login]) ON [PRIMARY] +GO + CREATE INDEX [IX_phpbb_topics] ON [phpbb_topics]([forum_id], [topic_type], [topic_first_post_id], [topic_last_post_id]) ON [PRIMARY] GO diff --git a/phpBB/install/schemas/mysql_basic.sql b/phpBB/install/schemas/mysql_basic.sql index 0263b8a8a9..c8569ac5d7 100644 --- a/phpBB/install/schemas/mysql_basic.sql +++ b/phpBB/install/schemas/mysql_basic.sql @@ -24,6 +24,8 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_local INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_remote','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_upload','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_autologin','1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_autologin_time','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('override_user_style','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('posts_per_page','15'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('topics_per_page','50'); @@ -62,7 +64,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('record_online_date INSERT INTO phpbb_config (config_name, config_value) VALUES ('server_name', 'www.myserver.tld'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('server_port', '80'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('script_path', '/phpBB2/'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '.0.17'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '.0.18'); # -- Categories diff --git a/phpBB/install/schemas/mysql_schema.sql b/phpBB/install/schemas/mysql_schema.sql index 342038177a..5272750fed 100644 --- a/phpBB/install/schemas/mysql_schema.sql +++ b/phpBB/install/schemas/mysql_schema.sql @@ -311,6 +311,19 @@ CREATE TABLE phpbb_sessions ( KEY session_id_ip_user_id (session_id, session_ip, session_user_id) ); +# -------------------------------------------------------- +# +# Table structure for table `phpbb_sessions_keys` +# +CREATE TABLE phpbb_sessions_keys ( + key_id varchar(32) DEFAULT '0' NOT NULL, + user_id mediumint(8) DEFAULT '0' NOT NULL, + last_ip varchar(8) DEFAULT '0' NOT NULL, + last_login int(11) DEFAULT '0' NOT NULL, + PRIMARY KEY (key_id, user_id), + KEY last_login (last_login) +); + # -------------------------------------------------------- # diff --git a/phpBB/install/schemas/postgres_basic.sql b/phpBB/install/schemas/postgres_basic.sql index 9d81d50098..cbfd92c49b 100644 --- a/phpBB/install/schemas/postgres_basic.sql +++ b/phpBB/install/schemas/postgres_basic.sql @@ -25,6 +25,8 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_local INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_remote','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_avatar_upload','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_autologin','1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('max_autologin_time','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('override_user_style','0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('posts_per_page','15'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('topics_per_page','50'); @@ -63,7 +65,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('record_online_date INSERT INTO phpbb_config (config_name, config_value) VALUES ('server_name', 'www.yourdomain.tld'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('server_port', '80'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('script_path', '/phpBB2/'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '.0.17'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '.0.18'); -- Categories INSERT INTO phpbb_categories (cat_id, cat_title, cat_order) VALUES (1, 'Test category 1', 10); diff --git a/phpBB/install/schemas/postgres_schema.sql b/phpBB/install/schemas/postgres_schema.sql index 1a7991610d..737f2f1f8b 100644 --- a/phpBB/install/schemas/postgres_schema.sql +++ b/phpBB/install/schemas/postgres_schema.sql @@ -295,6 +295,17 @@ CREATE TABLE phpbb_sessions ( CREATE INDEX session_user_id_phpbb_sessions_index ON phpbb_sessions (session_user_id); CREATE INDEX session_id_ip_user_id_phpbb_sessions_index ON phpbb_sessions (session_id, session_ip, session_user_id); +/* -------------------------------------------------------- + Table structure for table phpbb_sessions_keys +-------------------------------------------------------- */ +CREATE TABLE phpbb_sessions_keys ( + key_id char(32) DEFAULT '0' NOT NULL, + user_id int4 DEFAULT '0' NOT NULL, + last_ip char(8) DEFAULT '0' NOT NULL, + last_login int4 DEFAULT '0' NOT NULL, + CONSTRAINT phpbb_sessions_keys_pkey PRIMARY KEY (key_id, user_id) +); +CREATE INDEX last_login_phpbb_sessions_keys_index ON phpbb_sessions_keys (last_login); /* -------------------------------------------------------- Table structure for table phpbb_smilies @@ -489,10 +500,10 @@ CREATE TABLE phpbb_users ( user_rank int4 DEFAULT '0', user_avatar varchar(100), user_avatar_type int2 DEFAULT '0' NOT NULL, - user_level int4 DEFAULT '1', + user_level int4 DEFAULT '0', user_lang varchar(255), user_timezone decimal(5) DEFAULT '0' NOT NULL, - user_dateformat varchar(14) DEFAULT 'd M Y H:m' NOT NULL, + user_dateformat varchar(14) DEFAULT 'd M Y H:i' NOT NULL, user_notify_pm int2 DEFAULT '0' NOT NULL, user_popup_pm int2 DEFAULT '0' NOT NULL, user_notify int2, diff --git a/phpBB/install/update_to_latest.php b/phpBB/install/update_to_latest.php index faad7dddec..bb8170271c 100644 --- a/phpBB/install/update_to_latest.php +++ b/phpBB/install/update_to_latest.php @@ -59,7 +59,7 @@ include($phpbb_root_path . 'includes/db.'.$phpEx); // // // -$updates_to_version = '.0.17'; +$updates_to_version = '.0.18'; // // // @@ -465,7 +465,7 @@ switch ($row['config_value']) AS SELECT group_id, group_name, group_type, group_description, group_moderator, group_single_user FROM " . GROUPS_TABLE; $sql[] = "DROP TABLE " . GROUPS_TABLE; - $sql[] = "CREATE TABLE phpbb_groups (group_id int DEFAULT nextval('" . GROUPS_TABLE . "_id_seq'::text) NOT NULL, group_name varchar(40) NOT NULL, group_type int2 DEFAULT '1' NOT NULL, group_description varchar(255) NOT NULL, group_moderator int4 DEFAULT '0' NOT NULL, group_single_user int2 DEFAULT '0' NOT NULL, CONSTRAINT phpbb_groups_pkey PRIMARY KEY (group_id))"; + $sql[] = "CREATE TABLE {$table_prefix}groups (group_id int DEFAULT nextval('" . GROUPS_TABLE . "_id_seq'::text) NOT NULL, group_name varchar(40) NOT NULL, group_type int2 DEFAULT '1' NOT NULL, group_description varchar(255) NOT NULL, group_moderator int4 DEFAULT '0' NOT NULL, group_single_user int2 DEFAULT '0' NOT NULL, CONSTRAINT {$table_prefix}groups_pkey PRIMARY KEY (group_id))"; $sql[] = "INSERT INTO " . GROUPS_TABLE . " (group_id, group_name, group_type, group_description, group_moderator, group_single_user) SELECT group_id, group_name, group_type, group_description, group_moderator, group_single_user FROM tmp_" . GROUPS_TABLE; @@ -511,7 +511,7 @@ switch ($row['config_value']) break; case 'postgresql': - $sql[] = 'CREATE TABLE ' . $table_prefix . 'confirm (confirm_id char(32) DEFAULT \'\' NOT NULL, session_id char(32) DEFAULT \'\' NOT NULL, code char(6) DEFAULT \'\' NOT NULL, CONSTRAINT phpbb_confirm_pkey PRIMARY KEY (session_id, confirm_id))'; + $sql[] = 'CREATE TABLE ' . $table_prefix . 'confirm (confirm_id char(32) DEFAULT \'\' NOT NULL, session_id char(32) DEFAULT \'\' NOT NULL, code char(6) DEFAULT \'\' NOT NULL, CONSTRAINT {$table_prefix}confirm_pkey PRIMARY KEY (session_id, confirm_id))'; break; } @@ -554,6 +554,36 @@ switch ($row['config_value']) break; } + case '.0.15': + case '.0.16': + case '.0.17': + // Add tables for session keys + switch (SQL_LAYER) + { + case 'mysql': + case 'mysql4': + $sql[] = 'CREATE TABLE ' . $table_prefix . 'sessions_keys (key_id varchar(32) DEFAULT \'0\' NOT NULL, user_id mediumint(8) DEFAULT \'0\' NOT NULL, last_ip varchar(8) DEFAULT \'0\' NOT NULL, last_login int(11) DEFAULT \'0\' NOT NULL, PRIMARY KEY (key_id, user_id), KEY last_login (last_login))'; + break; + + case 'mssql': + case 'mssql-odbc': + $sql[] = 'CREATE TABLE [' . $table_prefix . 'sessions_keys] ([key_id] [char] (32) NOT NULL , [user_id] [int] NOT NULL , [last_ip] [char] (8) NOT NULL , [last_login] [int] NOT NULL) ON [PRIMARY]'; + + $sql[] = 'CREATE INDEX [IX_' . $table_prefix . 'sessions_keys] ON [' . $table_prefix . 'sessions_keys]([key_id], [user_id]) ON [PRIMARY]'; + $sql[] = 'CREATE INDEX [IX_' . $table_prefix . 'sessions_keys] ON [' . $table_prefix . 'sessions_keys]([last_login]) ON [PRIMARY]'; + break; + + case 'msaccess': + $sql[] = 'CREATE TABLE ' . $table_prefix . 'sessions_keys (key_id char(32) NOT NULL, user_id int NOT NULL, last_ip char(8) NOT NULL, last_login int NOT NULL)'; + $sql[] = 'ALTER TABLE ' . $table_prefix . 'sessions_keys ADD PRIMARY KEY (key_id, user_id)'; + break; + + case 'postgresql': + $sql[] = 'CREATE TABLE ' . $table_prefix . 'sessions_keys (key_id char(32) DEFAULT \'0\' NOT NULL, user_id int4 DEFAULT \'0\' NOT NULL, last_ip char(8) DEFAULT \'0\' NOT NULL, last_login int4 DEFAULT \'0\' NOT NULL, CONSTRAINT ' . $table_prefix . 'sessions_keys_pkey PRIMARY KEY (key_id, user_id))'; + $sql[] = 'CREATE INDEX last_login_' . $table_prefix . 'sessions_keys_index ON ' . $table_prefix . 'sessions_keys (last_login)'; + break; + } + break; } @@ -954,10 +984,24 @@ switch ($row['config_value']) $sql = 'UPDATE ' . USERS_TABLE . ' SET user_allowhtml = 1 WHERE user_id = ' . ANONYMOUS; _sql($sql, $errored, $error_ary); + case '.0.15': + case '.0.16': + case '.0.17': + + $sql = 'UPDATE ' . USERS_TABLE . ' SET user_active = 0 WHERE user_id = ' . ANONYMOUS; + _sql($sql, $errored, $error_ary); + + $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value) + VALUES ('allow_autologin', '1')"; + _sql($sql, $errored, $error_ary); + + $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value) + VALUES ('max_autologin_time', '0')"; + _sql($sql, $errored, $error_ary); + // We reset those having autologin enabled and forcing the re-assignment of a session id $sql = 'DELETE FROM ' . SESSIONS_TABLE; _sql($sql, $errored, $error_ary); - break; default: diff --git a/phpBB/language/lang_english/lang_admin.php b/phpBB/language/lang_english/lang_admin.php index 009faeaa15..17436a3342 100644 --- a/phpBB/language/lang_english/lang_admin.php +++ b/phpBB/language/lang_english/lang_admin.php @@ -335,6 +335,12 @@ $lang['Session_length'] = 'Session length [ seconds ]'; $lang['Visual_confirm'] = 'Enable Visual Confirmation'; $lang['Visual_confirm_explain'] = 'Requires users enter a code defined by an image when registering.'; +// Autologin Keys - added 2.0.18 +$lang['Allow_autologin'] = 'Allow automatic logins'; +$lang['Allow_autologin_explain'] = 'Determines whether users are allowed to select to be automatically logged in when visiting the forum'; +$lang['Autologin_time'] = 'Automatic login key expiry'; +$lang['Autologin_time_explain'] = 'How long a autologin key is valid for in days if the user does not visit the board. Set to zero to disable expiry.'; + // // Forum Management // diff --git a/phpBB/login.php b/phpBB/login.php index ff4ced929d..4844be3c2e 100644 --- a/phpBB/login.php +++ b/phpBB/login.php @@ -131,6 +131,12 @@ if( isset($HTTP_POST_VARS['login']) || isset($HTTP_GET_VARS['login']) || isset($ } else if( ( isset($HTTP_GET_VARS['logout']) || isset($HTTP_POST_VARS['logout']) ) && $userdata['session_logged_in'] ) { + // session id check + if ($sid == '' || $sid != $userdata['session_id']) + { + message_die(GENERAL_ERROR, 'Invalid_session'); + } + if( $userdata['session_logged_in'] ) { session_end($userdata['session_id'], $userdata['user_id']); @@ -168,6 +174,8 @@ else 'body' => 'login_body.tpl') ); + $forward_page = ''; + if( isset($HTTP_POST_VARS['redirect']) || isset($HTTP_GET_VARS['redirect']) ) { $forward_to = $HTTP_SERVER_VARS['QUERY_STRING']; @@ -179,8 +187,6 @@ else if(count($forward_match) > 1) { - $forward_page = ''; - for($i = 1; $i < count($forward_match); $i++) { if( !ereg("sid=", $forward_match[$i]) ) @@ -200,10 +206,6 @@ else } } } - else - { - $forward_page = ''; - } $username = ( $userdata['user_id'] != ANONYMOUS ) ? $userdata['username'] : ''; diff --git a/phpBB/posting.php b/phpBB/posting.php index 636f192b8f..213c91fc3c 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -59,11 +59,13 @@ while( list($var, $param) = @each($params) ) } $refresh = $preview || $poll_add || $poll_edit || $poll_delete; +$orig_word = $replacement_word = array(); // // Set topic type // $topic_type = ( !empty($HTTP_POST_VARS['topictype']) ) ? intval($HTTP_POST_VARS['topictype']) : POST_NORMAL; +$topic_type = ( in_array($topic_type, array(POST_NORMAL, POST_STICKY, POST_ANNOUNCE)) ) ? $topic_type : POST_NORMAL; // // If the mode is set to topic review then output @@ -189,7 +191,7 @@ switch ( $mode ) message_die(GENERAL_MESSAGE, $lang['No_topic_id']); } - $sql = "SELECT f.*, t.topic_status, t.topic_title + $sql = "SELECT f.*, t.topic_status, t.topic_title, t.topic_type FROM " . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t WHERE t.topic_id = $topic_id AND f.forum_id = t.forum_id"; @@ -312,6 +314,10 @@ if ( $result = $db->sql_query($sql) ) { $topic_id = $post_info['topic_id']; } + if ( $mode == 'newtopic' ) + { + $post_data['topic_type'] = POST_NORMAL; + } $post_data['first_post'] = ( $mode == 'newtopic' ) ? true : 0; $post_data['last_post'] = false; diff --git a/phpBB/privmsg.php b/phpBB/privmsg.php index 5b5a967d5b..3ce65dffe9 100644 --- a/phpBB/privmsg.php +++ b/phpBB/privmsg.php @@ -295,7 +295,7 @@ else if ( $mode == 'read' ) if ( $sent_info = $db->sql_fetchrow($result) ) { - if ( $sent_info['sent_items'] >= $board_config['max_sentbox_privmsgs'] ) + if ($board_config['max_sentbox_privmsgs'] && $sent_info['sent_items'] >= $board_config['max_sentbox_privmsgs']) { $sql = "SELECT privmsgs_id FROM " . PRIVMSGS_TABLE . " WHERE privmsgs_type = " . PRIVMSGS_SENT_MAIL . " @@ -911,7 +911,7 @@ else if ( $save && $mark_list && $folder != 'savebox' && $folder != 'outbox' ) if ( $saved_info = $db->sql_fetchrow($result) ) { - if ( $saved_info['savebox_items'] >= $board_config['max_savebox_privmsgs'] ) + if ($board_config['max_savebox_privmsgs'] && $saved_info['savebox_items'] >= $board_config['max_savebox_privmsgs'] ) { $sql = "SELECT privmsgs_id FROM " . PRIVMSGS_TABLE . " WHERE ( ( privmsgs_to_userid = " . $userdata['user_id'] . " @@ -1138,6 +1138,27 @@ else if ( $submit || $refresh || $mode != '' ) // } + if ($submit && $mode == 'edit') + { + $sql = 'SELECT privmsgs_from_userid + FROM ' . PRIVMSGS_TABLE . ' + WHERE privmsgs_id = ' . (int) $privmsg_id . ' + AND privmsgs_from_userid = ' . $userdata['user_id']; + + if (!($result = $db->sql_query($sql))) + { + message_die(GENERAL_ERROR, "Could not obtain message details", "", __LINE__, __FILE__, $sql); + } + + if (!($row = $db->sql_fetchrow($result))) + { + message_die(GENERAL_MESSAGE, $lang['No_such_post']); + } + $db->sql_freeresult($result); + + unset($row); + } + if ( $submit ) { if ( !empty($HTTP_POST_VARS['username']) ) @@ -1154,7 +1175,11 @@ else if ( $submit || $refresh || $mode != '' ) $error_msg = $lang['No_such_user']; } - $to_userdata = $db->sql_fetchrow($result); + if (!($to_userdata = $db->sql_fetchrow($result))) + { + $error = TRUE; + $error_msg = $lang['No_such_user']; + } } else { @@ -1222,7 +1247,7 @@ else if ( $submit || $refresh || $mode != '' ) if ( $inbox_info = $db->sql_fetchrow($result) ) { - if ( $inbox_info['inbox_items'] >= $board_config['max_inbox_privmsgs'] ) + if ($board_config['max_inbox_privmsgs'] && $inbox_info['inbox_items'] >= $board_config['max_inbox_privmsgs']) { $sql = "SELECT privmsgs_id FROM " . PRIVMSGS_TABLE . " WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . " @@ -1424,8 +1449,7 @@ else if ( $submit || $refresh || $mode != '' ) $to_username = $row['username']; } } - - if ( $mode == 'edit' ) + else if ( $mode == 'edit' ) { $sql = "SELECT pm.*, pmt.privmsgs_bbcode_uid, pmt.privmsgs_text, u.username, u.user_id, u.user_sig FROM " . PRIVMSGS_TABLE . " pm, " . PRIVMSGS_TEXT_TABLE . " pmt, " . USERS_TABLE . " u @@ -1506,7 +1530,7 @@ else if ( $submit || $refresh || $mode != '' ) } else { - $privmsg_subject = $privmsg_message = ''; + $privmsg_subject = $privmsg_message = $to_username = ''; } } @@ -1799,7 +1823,6 @@ else if ( $submit || $refresh || $mode != '' ) 'S_BBCODE_CHECKED' => ( !$bbcode_on ) ? ' checked="checked"' : '', 'S_SMILIES_CHECKED' => ( !$smilies_on ) ? ' checked="checked"' : '', 'S_SIGNATURE_CHECKED' => ( $attach_sig ) ? ' checked="checked"' : '', - 'S_NAMES_SELECT' => $user_names_select, 'S_HIDDEN_FORM_FIELDS' => $s_hidden_fields, 'S_POST_ACTION' => append_sid("privmsg.$phpEx"), diff --git a/phpBB/templates/subSilver/admin/board_config_body.tpl b/phpBB/templates/subSilver/admin/board_config_body.tpl index d82a0b0b89..83b9bb320c 100644 --- a/phpBB/templates/subSilver/admin/board_config_body.tpl +++ b/phpBB/templates/subSilver/admin/board_config_body.tpl @@ -39,6 +39,14 @@ {L_VISUAL_CONFIRM}
{L_VISUAL_CONFIRM_EXPLAIN} {L_YES}   {L_NO} + + {L_ALLOW_AUTOLOGIN}
{L_ALLOW_AUTOLOGIN_EXPLAIN} + {L_YES}   {L_NO} + + + {L_AUTOLOGIN_TIME}
{L_AUTOLOGIN_TIME_EXPLAIN} + + {L_BOARD_EMAIL_FORM}
{L_BOARD_EMAIL_FORM_EXPLAIN} {L_ENABLED}   {L_DISABLED} diff --git a/phpBB/templates/subSilver/index_body.tpl b/phpBB/templates/subSilver/index_body.tpl index 84571b81b5..a6624b760c 100644 --- a/phpBB/templates/subSilver/index_body.tpl +++ b/phpBB/templates/subSilver/index_body.tpl @@ -81,8 +81,10 @@    {L_PASSWORD}: +      {L_AUTO_LOGIN} +     diff --git a/phpBB/templates/subSilver/login_body.tpl b/phpBB/templates/subSilver/login_body.tpl index 771a5372c5..6806cd6d6a 100644 --- a/phpBB/templates/subSilver/login_body.tpl +++ b/phpBB/templates/subSilver/login_body.tpl @@ -28,9 +28,11 @@ + {L_AUTO_LOGIN}: + {S_HIDDEN_FIELDS}