X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=index.php;h=4db0e7555bed2be542e79197fe499903091a1a3d;hb=b5cc7e4aabeddd08a27e02b2249ce86f92f96fac;hp=dac5a8071a17be2227e0e9b49b3205df25bcaa6c;hpb=5466f6a6d0950331a4cb54e09b44ea4524751fb4;p=quix0rs-gnu-social.git diff --git a/index.php b/index.php index dac5a8071a..4db0e7555b 100644 --- a/index.php +++ b/index.php @@ -22,66 +22,127 @@ define('LACONICA', true); require_once INSTALLDIR . '/lib/common.php'; -// get and cache current user +$user = null; +$action = null; + +function getPath($req) +{ + if (common_config('site', 'fancy')) { + return $req['p']; + } else if ($_SERVER['PATH_INFO']) { + return $_SERVER['PATH_INFO']; + } else { + return $req['p']; + } +} + +function handleError($error) +{ + common_log(LOG_ERR, "PEAR error: " . $error->getMessage()); + $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')); + + $dac = new DBErrorAction($msg, 500); + $dac->showPage(); + exit(-1); +} -$user = common_current_user(); +function main() +{ + global $user, $action; -// initialize language env + // For database errors -common_init_language(); + PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError'); -$action = $_REQUEST['action']; + // XXX: we need a little more structure in this script -if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { - common_redirect(common_local_url('public')); -} + // get and cache current user -// If the site is private, and they're not on one of the "public" -// parts of the site, redirect to login + $user = common_current_user(); -if (!$user && common_config('site', 'private') && - !in_array($action, array('login', 'openidlogin', 'finishopenidlogin', - 'recoverpassword', 'api', 'doc', 'register'))) { - common_redirect(common_local_url('login')); -} + // 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; + } + + $args = array_merge($args, $_REQUEST); + + $action = $args['action']; -$actionfile = INSTALLDIR."/actions/$action.php"; + if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { + common_redirect(common_local_url('public')); + return; + } -if (!file_exists($actionfile)) { - $cac = new ClientErrorAction(_('Unknown action'), 404); - $cac->showPage(); -} else { + // If the site is private, and they're not on one of the "public" + // parts of the site, redirect to login - include_once $actionfile; + if (!$user && common_config('site', 'private') && + !in_array($action, array('login', 'openidlogin', 'finishopenidlogin', + 'recoverpassword', 'api', 'doc', 'register'))) { + common_redirect(common_local_url('login')); + return; + } $action_class = ucfirst($action).'Action'; - $action_obj = new $action_class(); + if (!class_exists($action_class)) { + $cac = new ClientErrorAction(_('Unknown action'), 404); + $cac->showPage(); + } else { + $action_obj = new $action_class(); + + // XXX: find somewhere for this little block to live - if ($config['db']['mirror'] && $action_obj->isReadOnly()) { - if (is_array($config['db']['mirror'])) { - // "load balancing", ha ha - $k = array_rand($config['db']['mirror']); + if ($config['db']['mirror'] && $action_obj->isReadOnly()) { + if (is_array($config['db']['mirror'])) { + // "load balancing", ha ha + $k = array_rand($config['db']['mirror']); - $mirror = $config['db']['mirror'][$k]; - } else { - $mirror = $config['db']['mirror']; + $mirror = $config['db']['mirror'][$k]; + } else { + $mirror = $config['db']['mirror']; + } + $config['db']['database'] = $mirror; } - $config['db']['database'] = $mirror; - } - try { - if ($action_obj->prepare($_REQUEST)) { - $action_obj->handle($_REQUEST); + 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(); } - } 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 + +Event::handle('CleanupPlugin');