index.php 4.27 KB
Newer Older
Evan Prodromou's avatar
Evan Prodromou committed
1
<?php
2
/**
Evan Prodromou's avatar
Evan Prodromou committed
3 4
 * Laconica - a distributed open-source microblogging tool
 * Copyright (C) 2008, Controlez-Vous, Inc.
Evan Prodromou's avatar
Evan Prodromou committed
5
 *
Evan Prodromou's avatar
Evan Prodromou committed
6 7 8 9
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
Evan Prodromou's avatar
Evan Prodromou committed
10
 *
Evan Prodromou's avatar
Evan Prodromou committed
11 12 13 14
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
Evan Prodromou's avatar
Evan Prodromou committed
15
 *
Evan Prodromou's avatar
Evan Prodromou committed
16 17 18
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
Evan Prodromou's avatar
Evan Prodromou committed
19 20

define('INSTALLDIR', dirname(__FILE__));
Evan Prodromou's avatar
Evan Prodromou committed
21
define('LACONICA', true);
Evan Prodromou's avatar
Evan Prodromou committed
22

23
require_once INSTALLDIR . '/lib/common.php';
Evan Prodromou's avatar
Evan Prodromou committed
24

25 26 27
$user = null;
$action = null;

28 29
function getPath($req)
{
30 31 32 33 34 35 36 37
    if (common_config('site', 'fancy')) {
        return $req['p'];
    } else if ($_SERVER['PATH_INFO']) {
        return $_SERVER['PATH_INFO'];
    } else {
        return $req['p'];
    }
}
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
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);
}
54

55 56
function main()
{
57
    global $user, $action;
58

59 60 61 62
    // For database errors

    PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');

63
    // XXX: we need a little more structure in this script
64

65
    // get and cache current user
66

67
    $user = common_current_user();
Evan Prodromou's avatar
Evan Prodromou committed
68

69
    // initialize language env
Evan Prodromou's avatar
Evan Prodromou committed
70

71
    common_init_language();
Evan Prodromou's avatar
Evan Prodromou committed
72

73 74
    $path = getPath($_REQUEST);

Evan Prodromou's avatar
Evan Prodromou committed
75
    $r = Router::get();
76

77
    $args = $r->map($path);
Evan Prodromou's avatar
Evan Prodromou committed
78

79 80 81 82 83
    if (!$args) {
        $cac = new ClientErrorAction(_('Unknown page'), 404);
        $cac->showPage();
        return;
    }
84

85
    $args = array_merge($args, $_REQUEST);
86

87
    $action = $args['action'];
88

89 90 91
    if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) {
        common_redirect(common_local_url('public'));
        return;
92
    }
93

94 95 96 97 98 99 100 101 102 103 104 105 106 107
    // 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'))) {
        common_redirect(common_local_url('login'));
        return;
    }

    $action_class = ucfirst($action).'Action';

    if (!class_exists($action_class)) {
        $cac = new ClientErrorAction(_('Unknown action'), 404);
108
        $cac->showPage();
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
    } 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']);

                $mirror = $config['db']['mirror'][$k];
            } else {
                $mirror = $config['db']['mirror'];
            }
            $config['db']['database'] = $mirror;
        }

        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();
        }
140
    }
141
}
142

143 144
main();

145 146 147 148
// XXX: cleanup exit() calls or add an exit handler so
// this always gets called

Event::handle('CleanupPlugin');