. * * @category StatusNet * @package StatusNet * @author Brenda Wallace * @author Brion Vibber * @author Christopher Vollick * @author CiaranG * @author Craig Andrews * @author Evan Prodromou * @author Gina Haeussge * @author James Walker * @author Jeffery To * @author Mike Cochrane * @author Robin Millette * @author Sarven Capadisli * @author Tom Adams * @author Zach Copley * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org * * @license GNU Affero General Public License http://www.gnu.org/licenses/ */ define('INSTALLDIR', dirname(__FILE__)); define('GNUSOCIAL', true); define('STATUSNET', true); define('LACONICA', true); // compatibility function getPath($req) { if ((common_config('site', 'fancy') || !array_key_exists('PATH_INFO', $_SERVER)) && array_key_exists('p', $req) ) { return $req['p']; } else if (array_key_exists('PATH_INFO', $_SERVER)) { $path = $_SERVER['PATH_INFO']; $script = $_SERVER['SCRIPT_NAME']; if (substr($path, 0, mb_strlen($script)) == $script) { return substr($path, mb_strlen($script)); } else { return $path; } } else { return null; } } /** * logs and then displays error messages * * @return void */ function handleError($error) { try { if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) { return; } $logmsg = "PEAR error: " . $error->getMessage(); if ($error instanceof PEAR_Exception && common_config('site', 'logdebug')) { $logmsg .= " : ". $error->toText(); } // DB queries often end up with a lot of newlines; merge to a single line // for easier grepability... $logmsg = str_replace("\n", " ", $logmsg); common_log(LOG_ERR, $logmsg); // @fixme backtrace output should be consistent with exception handling if (common_config('site', 'logdebug')) { $bt = $error->getTrace(); foreach ($bt as $n => $line) { common_log(LOG_ERR, formatBacktraceLine($n, $line)); } } if ($error instanceof DB_DataObject_Error || $error instanceof DB_Error || ($error instanceof PEAR_Exception && $error->getCode() == -24) ) { //If we run into a DB error, assume we can't connect to the DB at all //so set the current user to null, so we don't try to access the DB //while rendering the error page. global $_cur; $_cur = null; $msg = sprintf( _( 'The database for %s isn\'t responding correctly, '. 'so the site won\'t work properly. '. 'The site admins probably know about the problem, '. 'but you can contact them at %s to make sure. '. 'Otherwise, wait a few minutes and try again.' ), common_config('site', 'name'), common_config('site', 'email') ); } else { $msg = _( 'An important error occured, probably related to email setup. '. 'Check logfiles for more info..' ); } $dac = new DBErrorAction($msg, 500); $dac->showPage(); } catch (Exception $e) { echo _('An error occurred.'); } exit(-1); } set_exception_handler('handleError'); require_once INSTALLDIR . '/lib/common.php'; /** * Format a backtrace line for debug output roughly like debug_print_backtrace() does. * Exceptions already have this built in, but PEAR error objects just give us the array. * * @param int $n line number * @param array $line per-frame array item from debug_backtrace() * @return string */ function formatBacktraceLine($n, $line) { $out = "#$n "; if (isset($line['class'])) $out .= $line['class']; if (isset($line['type'])) $out .= $line['type']; if (isset($line['function'])) $out .= $line['function']; $out .= '('; if (isset($line['args'])) { $args = array(); foreach ($line['args'] as $arg) { // debug_print_backtrace seems to use var_export // but this gets *very* verbose! $args[] = gettype($arg); } $out .= implode(',', $args); } $out .= ')'; $out .= ' called at ['; if (isset($line['file'])) $out .= $line['file']; if (isset($line['line'])) $out .= ':' . $line['line']; $out .= ']'; return $out; } function setupRW() { global $config; static $alwaysRW = array('session', 'remember_me'); // We ensure that these tables always are used // on the master DB $config['db']['database_rw'] = $config['db']['database']; $config['db']['ini_rw'] = INSTALLDIR.'/classes/statusnet.ini'; foreach ($alwaysRW as $table) { $config['db']['table_'.$table] = 'rw'; } } function checkMirror($action_obj, $args) { global $config; if (common_config('db', 'mirror') && $action_obj->isReadOnly($args)) { if (is_array(common_config('db', 'mirror'))) { // "load balancing", ha ha $arr = common_config('db', 'mirror'); $k = array_rand($arr); $mirror = $arr[$k]; } else { $mirror = common_config('db', 'mirror'); } // everyone else uses the mirror $config['db']['database'] = $mirror; } } function isLoginAction($action) { static $loginActions = array('login', 'recoverpassword', 'api', 'doc', 'register', 'publicxrds', 'otp', 'opensearch', 'rsd'); $login = null; if (Event::handle('LoginAction', array($action, &$login))) { $login = in_array($action, $loginActions); } return $login; }