xaizek / rocketgit (License: AGPLv3+) (since 2018-12-09)
Light and fast Git hosting solution suitable to serve both as a hub or as a personal code storage with its tickets, pull requests, API and much more.
<root> / root / index.php (90dadfc78f391472af23947b193d80d804a6daa8) (4,631B) (mode 100644) [raw]
<?php
error_reporting(E_ALL);
ini_set("track_errors", "On");
set_time_limit(30);

$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_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'] = "";

// 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');
} 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);
} else {
	$rg['login_ui']['username'] = "";
	$rg['login_ui']['homepage'] = "";
	$rg['logout_token'] = "";
}


$rg['HTML:rg_body'] = $body;
echo rg_template("index.html", $rg);

rg_prof_end("MAIN");
rg_prof_log();
rg_log("DONE!");
?>
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master