Re-install/recovery assistance

Started by kaladorn, June 07, 2009, 05:54:58 AM

Previous topic - Next topic

kaladorn

I've had an SMF board running for quite a while and it has been great - zero maintenance. I run it on a hosted service - I have access to the DB, and files, but rarely need to touch them. The server is a shared server from a hosting company. I had a domain name for my forum of the form "http://mysubdomain.webhostcompany.com [nofollow]". I was running SMF 1.1.4 (thinking of upgrading to 2.0 but wasn't sure what path I'd need to take to get there, but that's a project for after fixing the current problem!).

Then, I got their website builder tool to construct me a website to go with it. I installed it in a subdirectory off the main www directory. (I figured it was safest to give the new site its own place to live). That worked fine! You accessed it by visiting "http://mysubdomain.webhostingcompany.com/websitedirectory". [nofollow]

Inevitably, because the website builder software never remembers my target publication directory, I hit 'publish' into the root rather than /websitedirectory. And my SMF forum disappeared! When you went to "http://mysubdomain.com/ [nofollow]" you suddenly got the website main rather than the SMF forum.

I had a momentary heart attack. Then I checked in the MySQL tools and the DB was still there. I looked in the file manager and I *think* most or maybe almost all of SMF is still there.

I *think* that all that happened was that Site Builder's publish whacked the index file. There was a new index.php which clearly referenced the navigator scripts and provided some of the html for the main website builder page.

So my question is: How do I recover my forum and get it back so that typing "http://mysubdomain.webhostingcompany.com/ [nofollow]" leads to the SMF board?

I think this might be as simple as correcting whatever was done to the index.php. There was an index.php.bak (and an index.php~ as well, but it seemed to refer to 1.0.7 SMF in it) and that index.php.bak begins as follows:

<?php
/**********************************************************************************
* index.php                                                                       *
***********************************************************************************
* SMF: Simple Machines Forum                                                      *
* Open-Source Project Inspired by Zef Hemel ([email protected])                    *
* =============================================================================== *
* Software Version:           SMF 1.1.4                                           *
* Software by:                Simple Machines (http://www.simplemachines.org)     *
* Copyright 2006-2007 by:     Simple Machines LLC (http://www.simplemachines.org) *
*           2001-2006 by:     Lewis Media (http://www.lewismedia.com)             *
* Support, News, Updates at:  http://www.simplemachines.org                       *
***********************************************************************************
* This program is free software; you may redistribute it and/or modify it under   *
* the terms of the provided license as published by Simple Machines LLC.          *
*                                                                                 *
* This program is distributed in the hope that it is and will be useful, but      *
* WITHOUT ANY WARRANTIES; without even any implied warranty of MERCHANTABILITY    *
* or FITNESS FOR A PARTICULAR PURPOSE.                                            *
*                                                                                 *
* See the "license.txt" file for details of the Simple Machines license.          *
* The latest version can always be found at http://www.simplemachines.org.        *
**********************************************************************************/


/* This, as you have probably guessed, is the crux on which SMF functions.
Everything should start here, so all the setup and security is done
properly.  The most interesting part of this file is the action array in
the smf_main() function.  It is formatted as so:

'action-in-url' => array('Source-File.php', 'FunctionToCall'),

Then, you can access the FunctionToCall() function from Source-File.php
with the URL index.php?action=action-in-url.  Relatively simple, no?
*/

$forum_version = 'SMF 1.1.4';

// Get everything started up...
define('SMF', 1);
@
set_magic_quotes_runtime(0);
error_reporting(E_ALL);
$time_start = microtime();


I'm hoping this is just a copy made when the website publish whacked the existing index.php.

Are there any risks of blowing my SMF board to pieces and stomping on them if I rename this bak file to php.index and give it a try? The state I'm in is bad, but I do *not* want to make things worse. I don't know what might be risks or concerns in doing this - is there anything in the .bak file to look for as danger signs or to confirm this would be the right course to recover?

Thanks in advance for any insights/suggestions/ideas of how to move forward. SMF has been so trouble free for me (well, except when the web host forced me to upgrade versions and my favourite add-on, Tabular, was no longer supported) that I haven't had to get to know much about it. So anyone who does know more about it seems like a genius to me!

Thomas B
Ottawa, ON, Canada


Tristan Perry

As long as that's not the full index.php.back file (since it's not complete), then renaming it back to index.php should work fine.

I would guess that all that happened here is that the index.php file got over-written, but everything else is still the same. For restoring the SMF index.php file should fix things up.

Just to check, is your Settings.php file still there? (Don't show the code here for obvious reasons, however does it have the database name, username and password in it)?

If so then I'd be pretty sure that you just need to rename the old index.php file and it should fix it.

kaladorn

Thanks for the help! Perhaps I can trouble you a brief bit further...

Settings.php seems to be there and it seems to contain the DB connect params and things like my custom maintenance mode message and so forth.

Now, your first sentence... could you expand on that a bit? The file I quoted the first part of may in fact be (as it has that filename "index.php.back") the 'full' version you are talking about.

If so, is that a bad thing? Is the normal index.php somehow different from this? If it is, how would I go about recreating the normal index.php - perhaps chopping things out of this backup file? Or does the normal index.php that brings up the forum look fairly different? Never having seen it while it was intact, I can't judge...

I'll reproduce it here mostly because I don't see anything uniquely security looking in it....

index.php.bak

Quote<?php
/**********************************************************************************
* index.php                                                                       *
***********************************************************************************
* SMF: Simple Machines Forum                                                      *
* Open-Source Project Inspired by Zef Hemel ([email protected])                    *
* =============================================================================== *
* Software Version:           SMF 1.1.4                                           *
* Software by:                Simple Machines (http://www.simplemachines.org)     *
* Copyright 2006-2007 by:     Simple Machines LLC (http://www.simplemachines.org) *
*           2001-2006 by:     Lewis Media (http://www.lewismedia.com [nofollow])             *
* Support, News, Updates at:  http://www.simplemachines.org                       *
***********************************************************************************
* This program is free software; you may redistribute it and/or modify it under   *
* the terms of the provided license as published by Simple Machines LLC.          *
*                                                                                 *
* This program is distributed in the hope that it is and will be useful, but      *
* WITHOUT ANY WARRANTIES; without even any implied warranty of MERCHANTABILITY    *
* or FITNESS FOR A PARTICULAR PURPOSE.                                            *
*                                                                                 *
* See the "license.txt" file for details of the Simple Machines license.          *
* The latest version can always be found at http://www.simplemachines.org.        *
**********************************************************************************/


/*   This, as you have probably guessed, is the crux on which SMF functions.
   Everything should start here, so all the setup and security is done
   properly.  The most interesting part of this file is the action array in
   the smf_main() function.  It is formatted as so:

      'action-in-url' => array('Source-File.php', 'FunctionToCall'),

   Then, you can access the FunctionToCall() function from Source-File.php
   with the URL index.php?action=action-in-url.  Relatively simple, no?
*/

$forum_version = 'SMF 1.1.4';

// Get everything started up...
define('SMF', 1);
@set_magic_quotes_runtime(0);
error_reporting(E_ALL);
$time_start = microtime();

// Load the settings...
require_once(dirname(__FILE__) . '/Settings.php');

// And important includes.
require_once($sourcedir . '/QueryString.php');
require_once($sourcedir . '/Subs.php');
require_once($sourcedir . '/Errors.php');
require_once($sourcedir . '/Load.php');
require_once($sourcedir . '/Security.php');

// Using an old version of PHP?
if (@version_compare(PHP_VERSION, '4.2.3') != 1)
   require_once($sourcedir . '/Subs-Compat.php');

// If $maintenance is set specifically to 2, then we're upgrading or something.
if (!empty($maintenance) && $maintenance == 2)
   db_fatal_error();

// Connect to the MySQL database.
if (empty($db_persist))
   $db_connection = @mysql_connect($db_server, $db_user, $db_passwd);
else
   $db_connection = @mysql_pconnect($db_server, $db_user, $db_passwd);

// Show an error if the connection couldn't be made.
if (!$db_connection || !@mysql_select_db($db_name, $db_connection))
   db_fatal_error();

// Load the settings from the settings table, and perform operations like optimizing.
reloadSettings();
// Clean the request variables, add slashes, etc.
cleanRequest();
$context = array();

// Determine if this is using WAP, WAP2, or imode.  Technically, we should check that wap comes before application/xhtml or text/html, but this doesn't work in practice as much as it should.
if (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'application/vnd.wap.xhtml+xml') !== false)
   $_REQUEST['wap2'] = 1;
elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'text/vnd.wap.wml') !== false)
{
   if (strpos($_SERVER['HTTP_USER_AGENT'], 'DoCoMo/') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'portalmmm/') !== false)
      $_REQUEST['imode'] = 1;
   else
      $_REQUEST['wap'] = 1;
}

if (!defined('WIRELESS'))
   define('WIRELESS', isset($_REQUEST['wap']) || isset($_REQUEST['wap2']) || isset($_REQUEST['imode']));

// Some settings and headers are different for wireless protocols.
if (WIRELESS)
{
   define('WIRELESS_PROTOCOL', isset($_REQUEST['wap']) ? 'wap' : (isset($_REQUEST['wap2']) ? 'wap2' : (isset($_REQUEST['imode']) ? 'imode' : '')));

   // Some cellphones can't handle output compression...
   $modSettings['enableCompressedOutput'] = '0';
   // !!! Do we want these hard coded?
   $modSettings['defaultMaxMessages'] = 5;
   $modSettings['defaultMaxTopics'] = 9;

   // Wireless protocol header.
   if (WIRELESS_PROTOCOL == 'wap')
      header('Content-Type: text/vnd.wap.wml');
}

// Check if compressed output is enabled, supported, and not already being done.
if (!empty($modSettings['enableCompressedOutput']) && !headers_sent() && ob_get_length() == 0)
{
   // If zlib is being used, turn off output compression.
   if (@ini_get('zlib.output_compression') == '1' || @ini_get('output_handler') == 'ob_gzhandler' || @version_compare(PHP_VERSION, '4.2.0') == -1)
      $modSettings['enableCompressedOutput'] = '0';
   else
      ob_start('ob_gzhandler');
}
// This makes it so headers can be sent!
if (empty($modSettings['enableCompressedOutput']))
   ob_start();

// Register an error handler.
set_error_handler('error_handler');

// Start the session. (assuming it hasn't already been.)
loadSession();

// What function shall we execute? (done like this for memory's sake.)
call_user_func(smf_main());

// Call obExit specially; we're coming from the main area ;).
obExit(null, null, true);

// The main controlling function.
function smf_main()
{
   global $modSettings, $settings, $user_info, $board, $topic, $maintenance, $sourcedir;

   // Special case: session keep-alive.
   if (isset($_GET['action']) && $_GET['action'] == 'keepalive')
      die;

   // Load the user's cookie (or set as guest) and load their settings.
   loadUserSettings();

   // Load the current board's information.
   loadBoard();

   // Load the current theme.  (note that ?theme=1 will also work, may be used for guest theming.)
   loadTheme();

   // Check if the user should be disallowed access.
   is_not_banned();

   // Load the current user's permissions.
   loadPermissions();

   // Do some logging, unless this is an attachment, avatar, theme option or XML feed.
   if (empty($_REQUEST['action']) || !in_array($_REQUEST['action'], array('dlattach', 'jsoption', '.xml')))
   {
      // Log this user as online.
      writeLog();

      // Track forum statistics and hits...?
      if (!empty($modSettings['hitStats']))
         trackStats(array('hits' => '+'));
   }

   // Is the forum in maintenance mode? (doesn't apply to administrators.)
   if (!empty($maintenance) && !allowedTo('admin_forum'))
   {
      // You can only login.... otherwise, you're getting the "maintenance mode" display.
      if (isset($_REQUEST['action']) && ($_REQUEST['action'] == 'login2' || $_REQUEST['action'] == 'logout'))
      {
         require_once($sourcedir . '/LogInOut.php');
         return $_REQUEST['action'] == 'login2' ? 'Login2' : 'Logout';
      }
      // Don't even try it, sonny.
      else
      {
         require_once($sourcedir . '/Subs-Auth.php');
         return 'InMaintenance';
      }
   }
   // If guest access is off, a guest can only do one of the very few following actions.
   elseif (empty($modSettings['allow_guestAccess']) && $user_info['is_guest'] && (!isset($_REQUEST['action']) || !in_array($_REQUEST['action'], array('login', 'login2', 'register', 'register2', 'reminder', 'activate', 'smstats', 'help', '.xml', 'verificationcode'))))
   {
      require_once($sourcedir . '/Subs-Auth.php');
      return 'KickGuest';
   }
   elseif (empty($_REQUEST['action']))
   {
      // Action and board are both empty... BoardIndex!
      if (empty($board) && empty($topic))
      {
         require_once($sourcedir . '/BoardIndex.php');
         return 'BoardIndex';
      }
      // Topic is empty, and action is empty.... MessageIndex!
      elseif (empty($topic))
      {
         require_once($sourcedir . '/MessageIndex.php');
         return 'MessageIndex';
      }
      // Board is not empty... topic is not empty... action is empty.. Display!
      else
      {
         require_once($sourcedir . '/Display.php');
         return 'Display';
      }
   }

   // Here's the monstrous $_REQUEST['action'] array - $_REQUEST['action'] => array($file, $function).
   $actionArray = array(
      'activate' => array('Register.php', 'Activate'),
      'admin' => array('Admin.php', 'Admin'),
      'announce' => array('Post.php', 'AnnounceTopic'),
      'ban' => array('ManageBans.php', 'Ban'),
      'boardrecount' => array('Admin.php', 'AdminBoardRecount'),
      'buddy' => array('Subs-Members.php', 'BuddyListToggle'),
      'calendar' => array('Calendar.php', 'CalendarMain'),
      'cleanperms' => array('Admin.php', 'CleanupPermissions'),
      'collapse' => array('Subs-Boards.php', 'CollapseCategory'),
      'convertentities' => array('Admin.php', 'ConvertEntities'),
      'convertutf8' => array('Admin.php', 'ConvertUtf8'),
      'coppa' => array('Register.php', 'CoppaForm'),
      'deletemsg' => array('RemoveTopic.php', 'DeleteMessage'),
      'detailedversion' => array('Admin.php', 'VersionDetail'),
      'display' => array('Display.php', 'Display'),
      'dlattach' => array('Display.php', 'Download'),
      'dumpdb' => array('DumpDatabase.php', 'DumpDatabase2'),
      'editpoll' => array('Poll.php', 'EditPoll'),
      'editpoll2' => array('Poll.php', 'EditPoll2'),
      'featuresettings' => array('ModSettings.php', 'ModifyFeatureSettings'),
      'featuresettings2' => array('ModSettings.php', 'ModifyFeatureSettings2'),
      'findmember' => array('Subs-Auth.php', 'JSMembers'),
      'help' => array('Help.php', 'ShowHelp'),
      'helpadmin' => array('Help.php', 'ShowAdminHelp'),
      'im' => array('PersonalMessage.php', 'MessageMain'),
      'jsoption' => array('Themes.php', 'SetJavaScript'),
      'jsmodify' => array('Post.php', 'JavaScriptModify'),
      'lock' => array('LockTopic.php', 'LockTopic'),
      'lockVoting' => array('Poll.php', 'LockVoting'),
      'login' => array('LogInOut.php', 'Login'),
      'login2' => array('LogInOut.php', 'Login2'),
      'logout' => array('LogInOut.php', 'Logout'),
      'maintain' => array('Admin.php', 'Maintenance'),
      'manageattachments' => array('ManageAttachments.php', 'ManageAttachments'),
      'manageboards' => array('ManageBoards.php', 'ManageBoards'),
      'managecalendar' => array('ManageCalendar.php', 'ManageCalendar'),
      'managesearch' => array('ManageSearch.php', 'ManageSearch'),
      'markasread' => array('Subs-Boards.php', 'MarkRead'),
      'membergroups' => array('ManageMembergroups.php', 'ModifyMembergroups'),
      'mergetopics' => array('SplitTopics.php', 'MergeTopics'),
      'mlist' => array('Memberlist.php', 'Memberlist'),
      'modifycat' => array('ManageBoards.php', 'ModifyCat'),
      'modifykarma' => array('Karma.php', 'ModifyKarma'),
      'modlog' => array('Modlog.php', 'ViewModlog'),
      'movetopic' => array('MoveTopic.php', 'MoveTopic'),
      'movetopic2' => array('MoveTopic.php', 'MoveTopic2'),
      'news' => array('ManageNews.php', 'ManageNews'),
      'notify' => array('Notify.php', 'Notify'),
      'notifyboard' => array('Notify.php', 'BoardNotify'),
      'optimizetables' => array('Admin.php', 'OptimizeTables'),
      'packageget' => array('PackageGet.php', 'PackageGet'),
      'packages' => array('Packages.php', 'Packages'),
      'permissions' => array('ManagePermissions.php', 'ModifyPermissions'),
      'pgdownload' => array('PackageGet.php', 'PackageGet'),
      'pm' => array('PersonalMessage.php', 'MessageMain'),
      'post' => array('Post.php', 'Post'),
      'post2' => array('Post.php', 'Post2'),
      'postsettings' => array('ManagePosts.php', 'ManagePostSettings'),
      'printpage' => array('Printpage.php', 'PrintTopic'),
      'profile' => array('Profile.php', 'ModifyProfile'),
      'profile2' => array('Profile.php', 'ModifyProfile2'),
      'quotefast' => array('Post.php', 'QuoteFast'),
      'quickmod' => array('Subs-Boards.php', 'QuickModeration'),
      'quickmod2' => array('Subs-Boards.php', 'QuickModeration2'),
      'recent' => array('Recent.php', 'RecentPosts'),
      'regcenter' => array('ManageRegistration.php', 'RegCenter'),
      'register' => array('Register.php', 'Register'),
      'register2' => array('Register.php', 'Register2'),
      'reminder' => array('Reminder.php', 'RemindMe'),
      'removetopic2' => array('RemoveTopic.php', 'RemoveTopic2'),
      'removeoldtopics2' => array('RemoveTopic.php', 'RemoveOldTopics2'),
      'removepoll' => array('Poll.php', 'RemovePoll'),
      'repairboards' => array('RepairBoards.php', 'RepairBoards'),
      'reporttm' => array('SendTopic.php', 'ReportToModerator'),
      'reports' => array('Reports.php', 'ReportsMain'),
      'requestmembers' => array('Subs-Auth.php', 'RequestMembers'),
      'search' => array('Search.php', 'PlushSearch1'),
      'search2' => array('Search.php', 'PlushSearch2'),
      'sendtopic' => array('SendTopic.php', 'SendTopic'),
      'serversettings' => array('ManageServer.php', 'ModifySettings'),
      'serversettings2' => array('ManageServer.php', 'ModifySettings2'),
      'smileys' => array('ManageSmileys.php', 'ManageSmileys'),
      'smstats' => array('Stats.php', 'SMStats'),
      'spellcheck' => array('Subs-Post.php', 'SpellCheck'),
      'splittopics' => array('SplitTopics.php', 'SplitTopics'),
      'stats' => array('Stats.php', 'DisplayStats'),
      'sticky' => array('LockTopic.php', 'Sticky'),
      'theme' => array('Themes.php', 'ThemesMain'),
      'trackip' => array('Profile.php', 'trackIP'),
      'about:mozilla'; => array('Karma.php', 'BookOfUnknown'),
      'about:unknown'; => array('Karma.php', 'BookOfUnknown'),
      'unread' => array('Recent.php', 'UnreadTopics'),
      'unreadreplies' => array('Recent.php', 'UnreadTopics'),
      'viewErrorLog' => array('ManageErrors.php', 'ViewErrorLog'),
      'viewmembers' => array('ManageMembers.php', 'ViewMembers'),
      'viewprofile' => array('Profile.php', 'ModifyProfile'),
      'verificationcode' => array('Register.php', 'VerificationCode'),
      'vote' => array('Poll.php', 'Vote'),
      'viewquery' => array('ViewQuery.php', 'ViewQuery'),
      'who' => array('Who.php', 'Who'),
      '.xml' => array('News.php', 'ShowXmlFeed'),
   );

   // Get the function and file to include - if it's not there, do the board index.
   if (!isset($_REQUEST['action']) || !isset($actionArray[$_REQUEST['action']]))
   {
      // Catch the action with the theme?
      if (!empty($settings['catch_action']))
      {
         require_once($sourcedir . '/Themes.php');
         return 'WrapAction';
      }

      // Fall through to the board index then...
      require_once($sourcedir . '/BoardIndex.php');
      return 'BoardIndex';
   }

   // Otherwise, it was set - so let's go to that action.
   require_once($sourcedir . '/' . $actionArray[$_REQUEST['action']][0]);
   return $actionArray[$_REQUEST['action']][1];
}

?>

JimM

You should be just fine in renaming the index.php.bak back to index.php.  The first post where you placed part of the index.php file inside code tags was not complete and I think that was Tristan Perry's concern.
Jim "JimM" Moore
Former Support Specialist

kaladorn

Quote from: JimM on June 08, 2009, 10:56:22 PM
You should be just fine in renaming the index.php.bak back to index.php.  The first post where you placed part of the index.php file inside code tags was not complete and I think that was Tristan Perry's concern.

Problem all fixed now. Thank you once again for the competent, timely advice. You're a good bunch of folks and I appreciate the help.

Tom

Advertisement: