<?php
error_reporting(E_ALL);
ini_set("track_errors", "On");
set_time_limit(30);
$peak0 = memory_get_peak_usage();
$rg = array();
require_once("/etc/rocketgit/config.php");
$INC = dirname(__FILE__) . "/../inc";
require_once($INC . "/init.inc.php");
require_once($INC . "/log.inc.php");
include_once($INC . "/sql.inc.php");
include_once($INC . "/struct.inc.php");
include_once($INC . "/user.inc.php");
include_once($INC . "/repo.inc.php");
include_once($INC . "/keys.inc.php");
include_once($INC . "/token.inc.php");
include_once($INC . "/prof.inc.php");
include_once($INC . "/mr.inc.php");
include_once($INC . "/bug.inc.php");
include_once($INC . "/fixes.inc.php");
include_once($INC . "/plan.inc.php");
include_once($INC . "/admin.inc.php");
include_once($INC . "/ver.php");
rg_prof_start("MAIN");
rg_log_set_file($rg_web_log_dir . "/main.log");
// database connection
rg_sql_app("rg-web");
$db = rg_sql_open($rg_sql);
// Store configuration into 'rg'
if (!isset($rg_account_email_confirm))
$rg_account_email_confirm = 1;
$rg['rg_account_email_confirm'] = $rg_account_email_confirm;
if (!isset($rg_account_allow_creation))
$rg_account_allow_creation = 0;
$rg['rg_account_allow_creation'] = $rg_account_allow_creation;
// Init variables
$THEME_URL = "/themes/" . $rg_theme;
$rg['rg_redirect_html'] = 0;
$rg['rg_theme_url'] = $THEME_URL;
$rg['login_ui'] = array();
$rg['target_ui'] = array("ok" => 1, "exists" => 0, "uid" => 0);
$rg['ri'] = array("repo_id" => 0, "uid" => 0);
$rg['bug'] = array("bug_id" => 0);
$rg['HTML:submenu1'] = "";
$rg['HTML:submenu2'] = "";
$rg['debug'] = rg_var_uint('rg_debug');
// We have variable 'vv' passed from webserver - build 'op' and rest of paras
$sparas = rg_var_str("vv");
rg_log("DEBUG: sparas=$sparas.");
$rg['url'] = "/op";
$paras = explode("/", trim($sparas, "/"));
$_t = empty($paras) ? "" : $paras[0];
if (strcmp($_t, "op") == 0) {
array_shift($paras);
$_op = empty($paras) ? "" : array_shift($paras);
} else {
$_op = "";
}
$rg['doit'] = rg_var_uint("doit");
$rg['sid'] = rg_var_cookie_re("sid", "/[^A-Za-z0-9]/");
$rg['token'] = rg_var_re("token", "/[^A-Za-z0-9]/");
$user = ""; $repo = ""; $organization = 0; // TODO: those are really used?
//rg_log_ml("rg: " . print_r($rg, TRUE));
$rg['ua'] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
$rg['ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "";
if (strncasecmp($rg['ip'], "::ffff:", 7) == 0)
$rg['ip'] = substr($rg['ip'], 7);
rg_log("DEBUG: _REQUEST: " . rg_array2string($_REQUEST));
rg_log("DEBUG: _COOKIE: " . rg_array2string($_COOKIE));
rg_log($rg['ip'] . " ver=$rocketgit_version");
$service = isset($_REQUEST['service']) ? $_REQUEST['service'] : "";
rg_log("service=$service");
$good = 0;
$tries = 10;
while ($tries > 0) {
$r = rg_sql_struct_update_needed($db);
if ($r === 0) {
$r = rg_fixes_needed($db);
if ($r === 0) {
$good = 1;
break;
}
}
rg_log("Schema/fixes is not up-to-date! Sleep 1 second...");
$tries--;
sleep(1);
}
if ($good == 0) {
// TODO: we must let it go to dispatcher instead of redirecting = another connection
$url = rg_re_url("fatal");
rg_fatal_web("Internal error", $url);
}
if (strcmp($service, "git-upload-packXXX") == 0) {
rg_log("We have a fetch by http!");
// TODO: settimelimit to a resonable value
putenv("GIT_HTTP_EXPORT_ALL=1");
$run = "/usr/libexec/git-core/git-http-backend";
rg_log("Running $run...");
passthru($run, $ret);
rg_log("returned $ret");
exit(0);
}
rg_user_login_by_sid($db, $rg);
rg_log("After login_by_sid, login_ui=" . rg_array2string($rg['login_ui']));
// If user provided an old/expired sid, we generate a new one, pre-login
if (($rg['login_ui']['uid'] == 0) && (strncmp($rg['sid'], "X", 1) != 0))
$rg['sid'] = "";
if (empty($rg['sid'])) {
$rg['sid'] = rg_user_set_session_cookie($db, 0 /*uid*/, 600, FALSE);
rg_log("User has no sid, generate one [" . $rg['sid'] . "]");
}
$body = "";
// Some variables from the database
$rg['first_install_text'] = "?";
$r = rg_state_get($db, "first_install");
if ($r === FALSE) {
// Probably we cannot connect to database/cache
$body .= rg_template('admin/db_error.html', TRUE /*xss*/);
} else if ($r === '') {
$body .= rg_init($db, $rg);
} else {
$rg['first_install_text'] = gmdate("Y-m-d", $r);
rg_log("Dispatching to [$_op]");
include($INC . "/dispatch/dispatch.php");
}
if ($rg['login_ui']['uid'] > 0) {
$rg['login_ui']['homepage'] = rg_re_userpage($rg['login_ui']);
$rg['logout_token'] = rg_token_get($db, $rg, 'logout');
} else {
$rg['login_ui']['username'] = "";
$rg['login_ui']['homepage'] = "";
$rg['logout_token'] = "";
}
$rg['HTML:rg_body'] = $body;
$_c = rg_template("index.html", $rg, TRUE /* xss */);
header('Cache-Control: private, no-cache');
// Caching
$proto = rg_var_str('SERVER_PROTOCOL');
if (strcmp($proto, 'HTTP/1.1') == 0) {
$we_have = sha1($_c);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']))
$client_have = $_SERVER['HTTP_IF_NONE_MATCH'];
else
$client_have = '';
if (strcmp($client_have, $we_have) == 0) {
rg_log('CACHE: Client has the right version');
header('HTTP/1.1 304 Not modified');
} else {
header('ETag: ' . $we_have);
echo $_c;
}
} else {
rg_log('WARN: Un-handled protocol ' . $proto);
echo $_c;
}
rg_prof_end("MAIN");
rg_prof_log();
rg_log("DONE!");
?>