We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

index.php 4.35 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
function handleError($error)
{
41 42 43 44
    if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) {
        return;
    }

45 46 47 48 49 50 51 52 53 54 55 56 57
    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);
}
58

59 60
function main()
{
61
    global $user, $action;
62

63 64 65 66
    // For database errors

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

67
    // XXX: we need a little more structure in this script
68

69
    // get and cache current user
70

71
    $user = common_current_user();
Evan Prodromou's avatar
Evan Prodromou committed
72

73
    // initialize language env
Evan Prodromou's avatar
Evan Prodromou committed
74

75
    common_init_language();
Evan Prodromou's avatar
Evan Prodromou committed
76

77 78
    $path = getPath($_REQUEST);

Evan Prodromou's avatar
Evan Prodromou committed
79
    $r = Router::get();
80

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

83 84 85 86 87
    if (!$args) {
        $cac = new ClientErrorAction(_('Unknown page'), 404);
        $cac->showPage();
        return;
    }
88

89
    $args = array_merge($args, $_REQUEST);
90

91
    $action = $args['action'];
92

93 94 95
    if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) {
        common_redirect(common_local_url('public'));
        return;
96
    }
97

98 99 100 101 102 103 104 105 106 107 108 109 110 111
    // 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);
112
        $cac->showPage();
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 140 141 142 143
    } 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();
        }
144
    }
145
}
146

147 148
main();

149 150 151 152
// XXX: cleanup exit() calls or add an exit handler so
// this always gets called

Event::handle('CleanupPlugin');