X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=index.php;h=a73983b5956f3545540dde949b333b4c83180ebf;hb=2934099fbd17281ed00055af654aa5b813d535a2;hp=e62d9469ab553924bc9d02aa24c5492bbf8b1a46;hpb=c6070200fe35a5746fac2f0b6d7665d1b598feb8;p=quix0rs-gnu-social.git diff --git a/index.php b/index.php index e62d9469ab..a73983b595 100644 --- a/index.php +++ b/index.php @@ -1,7 +1,7 @@ getCode() == DB_DATAOBJECT_ERROR_NODATA) { + return; + } -$user = common_current_user(); + $logmsg = "PEAR error: " . $error->getMessage(); + if(common_config('site', 'logdebug')) { + $logmsg .= " : ". $error->getDebugInfo(); + } + common_log(LOG_ERR, $logmsg); + if(common_config('site', 'logdebug')) { + $bt = $error->getBacktrace(); + foreach ($bt as $line) { + common_log(LOG_ERR, $line); + } + } + if ($error instanceof DB_DataObject_Error || + $error instanceof DB_Error) { + $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..'); + } -// initialize language env + $dac = new DBErrorAction($msg, 500); + $dac->showPage(); + exit(-1); +} -common_init_language(); +function checkMirror($action_obj) +{ + global $config; -$action = $_REQUEST['action']; + static $alwaysRW = array('session', 'remember_me'); -if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { - common_redirect(common_local_url('public')); -} + 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'); + } + + // We ensure that these tables always are used + // on the master DB -// If the site is private, and they're not on one of the "public" -// parts of the site, redirect to login + $config['db']['database_rw'] = $config['db']['database']; + $config['db']['ini_rw'] = INSTALLDIR.'/classes/laconica.ini'; -if (!$user && common_config('site', 'private') && - !in_array($action, array('login', 'openidlogin', 'finishopenidlogin', - 'recoverpassword', 'api', 'doc', 'register'))) { - common_redirect(common_local_url('login')); + foreach ($alwaysRW as $table) { + $config['db']['table_'.$table] = 'rw'; + } + + // everyone else uses the mirror + + $config['db']['database'] = $mirror; + } } -$action_class = ucfirst($action).'Action'; +function main() +{ + // quick check for fancy URL auto-detection support in installer. + if (isset($_SERVER['REDIRECT_URL']) && (preg_replace("/^\/$/","",(dirname($_SERVER['REQUEST_URI']))) . '/check-fancy') === $_SERVER['REDIRECT_URL']) { + die("Fancy URL support detection succeeded. We suggest you enable this to get fancy (pretty) URLs."); + } + global $user, $action; -if (!class_exists($action_class)) { - $cac = new ClientErrorAction(_('Unknown action'), 404); - $cac->showPage(); -} else { - $action_obj = new $action_class(); + Snapshot::check(); - // XXX: find somewhere for this little block to live + if (!_have_config()) { + $msg = sprintf(_("No configuration file found. Try running ". + "the installation program first.")); + $sac = new ServerErrorAction($msg); + $sac->showPage(); + return; + } - if ($config['db']['mirror'] && $action_obj->isReadOnly()) { - if (is_array($config['db']['mirror'])) { - // "load balancing", ha ha - $k = array_rand($config['db']['mirror']); + // For database errors - $mirror = $config['db']['mirror'][$k]; - } else { - $mirror = $config['db']['mirror']; - } - $config['db']['database'] = $mirror; + PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError'); + + // XXX: we need a little more structure in this script + + // get and cache current user + + $user = common_current_user(); + + // initialize language env + + common_init_language(); + + $path = getPath($_REQUEST); + + $r = Router::get(); + + $args = $r->map($path); + + if (!$args) { + $cac = new ClientErrorAction(_('Unknown page'), 404); + $cac->showPage(); + return; } - try { - if ($action_obj->prepare($_REQUEST)) { - $action_obj->handle($_REQUEST); - } - } catch (ClientException $cex) { - $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode()); + $args = array_merge($args, $_REQUEST); + + Event::handle('ArgsInitialize', array(&$args)); + + $action = $args['action']; + + if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { + common_redirect(common_local_url('public')); + return; + } + + // If the site is private, and they're not on one of the "public" + // parts of the site, redirect to login + + if (!$user && common_config('site', 'private') && + !in_array($action, array('login', 'openidlogin', 'finishopenidlogin', + 'recoverpassword', 'api', 'doc', 'register')) && + !preg_match('/rss$/', $action)) { + common_redirect(common_local_url('login')); + return; + } + + $action_class = ucfirst($action).'Action'; + + if (!class_exists($action_class)) { + $cac = new ClientErrorAction(_('Unknown action'), 404); $cac->showPage(); - } catch (ServerException $sex) { // snort snort guffaw - $sac = new ServerErrorAction($sex->getMessage(), $sex->getCode()); - $sac->showPage(); - } catch (Exception $ex) { - $sac = new ServerErrorAction($ex->getMessage()); - $sac->showPage(); + } else { + $action_obj = new $action_class(); + + checkMirror($action_obj); + + try { + if ($action_obj->prepare($args)) { + $action_obj->handle($args); + } + } catch (ClientException $cex) { + $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode()); + $cac->showPage(); + } catch (ServerException $sex) { // snort snort guffaw + $sac = new ServerErrorAction($sex->getMessage(), $sex->getCode()); + $sac->showPage(); + } catch (Exception $ex) { + $sac = new ServerErrorAction($ex->getMessage()); + $sac->showPage(); + } } } +main(); + // XXX: cleanup exit() calls or add an exit handler so // this always gets called