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> / tests / helpers.inc.php (d57e7d5828a73b3e7641fae2c7f5a1d2a70ead33) (8,332B) (mode 100644) [raw]
<?php
// Some helper functions dealing with users/repos/bugs/etc.

/*
 * Creating a user
 */
$_user_id = 1;
$_testns = 'main';
function rg_test_create_user($db, &$rg_ui)
{
	global $_testns;
	global $_user_id;

	if (!is_array($rg_ui))
		$rg_ui = array();

	$username = $_testns . '-user-' . $_user_id . '<xss>';

	$new = array();
	$new['uid'] = 0;
	$new['organization'] = 0;
	$new['username'] = $username;
	$new['realname'] = 'realname-' . $_user_id . '<xss>';
	$new['email'] = 'email-' . $_user_id . '@embedromix.ro';
	$new['is_admin'] = 0;
	$new['rights'] = '';
	$new['session_time'] = 3600;
	$new['confirm_token'] = '';
	$new['confirmed'] = 0;
	$new['plan_id'] = 0;
	$new['pass'] = 'pass-' . $_user_id;
	$new['pass2'] = 'pass-' . $_user_id;
	$_user_id++;

	// Delete old user
	$sql = 'DELETE FROM users WHERE username = \'' . $new['username'] . '\'';
	$res = rg_sql_query($db, $sql);
	if ($res === FALSE) {
		rg_log("Cannot delete old user: " . rg_sql_error());
		exit(1);
	}
	rg_sql_free_result($res);

	rg_cache_unset('username_to_uid::' . $username, RG_SOCKET_NO_WAIT);

	$rg_ui = array_merge($new, $rg_ui);
	$r = rg_user_edit($db, $rg_ui);
	if ($r === FALSE) {
		rg_log("Cannot create user (" . rg_user_error() . ")!");
		exit(1);
	}
	$rg_ui['uid'] = $r;

	// delete associated bugs
	$sql = "SELECT * FROM repos WHERE uid = " . $rg_ui['uid'];
	$res = rg_sql_query($db, $sql);
	while (($row = rg_sql_fetch_array($res))) {
		$_t = array('bug_labels', 'bug_notes', 'bug_search', 'bugs',
			'merge_requests', 'watch_bug', 'watch_repo');
		foreach ($_t as $_table) {
			$sql = "DELETE FROM $_table WHERE repo_id = " . $row['repo_id'];
			$res2 = rg_sql_query($db, $sql);
			rg_sql_free_result($res2);
		}

		$sql = "DELETE FROM rights WHERE type = 'repo' AND obj_id = " . $row['repo_id'];
		$res2 = rg_sql_query($db, $sql);
		rg_sql_free_result($res2);
	}
	rg_sql_free_result($res);

	// delete associated repos
	$sql = "DELETE FROM repos WHERE uid = " . $rg_ui['uid'];
	$res = rg_sql_query($db, $sql);
	rg_sql_free_result($res);

	// Delete associated keys
	$sql = "DELETE FROM keys WHERE uid = " . $rg_ui['uid'];
	$res = rg_sql_query($db, $sql);
	rg_sql_free_result($res);

	// Delete given rights
	$sql = "DELETE FROM rights WHERE uid = " . $rg_ui['uid'];
	$res = rg_sql_query($db, $sql);
	rg_sql_free_result($res);

	// Delete login tokens
	$sql = "DELETE FROM login_tokens WHERE uid = " . $rg_ui['uid'];
	$res = rg_sql_query($db, $sql);
	rg_sql_free_result($res);

	// Delete login tokens ips
	$sql = "DELETE FROM login_tokens_ip WHERE uid = " . $rg_ui['uid'];
	$res = rg_sql_query($db, $sql);
	rg_sql_free_result($res);

	return TRUE;
}

/*
 * Creating a repo helper
 * You can enforce a repo-id by setting extra['repo_id'].
 */
$_repo_id = 1;
function rg_test_create_repo($db, $rg_ui, &$extra)
{
	global $_testns;
	global $_repo_id;

	if (!is_array($extra))
		$extra = array();

	$repo_id = isset($extra['repo_id']) ? $extra['repo_id'] : 0;

	rg_log("Creating a repo");
	$new = array();
	$new['master'] = 0;
	$new['name'] = $_testns . '-repo-' . $_repo_id . '<xss>';
	$new['max_commit_size'] = 0;
	$new['description'] = 'desc line1\ndesc line2' . '<xss>';
	$new['git_dir_done'] = 0;
	$new['public'] = 1;
	$new['license'] = 'GPL <xss>';
	$_repo_id++;

	rg_log("Deleting repo " . $repo_id . "/" . $new['name']);
	$sql = 'DELETE FROM repos WHERE repo_id = ' . $repo_id
		. ' OR name = \'' . $new['name'] . '\'';
	$res = rg_sql_query($db, $sql);
	if ($res === FALSE) {
		rg_log("Cannot delete old repo: " . rg_sql_error());
		exit(1);
	}
	rg_sql_free_result($res);

	$extra = array_merge($new, $extra);
	$extra['repo_id'] = 0;

	$r = rg_repo_edit($db, $rg_ui, $extra);
	if ($r === FALSE) {
	        rg_log("Cannot insert a repo (" . rg_repo_error() . ")!");
		exit(1);
	}

	if ($repo_id > 0) {
		$sql = "UPDATE repos SET repo_id = $repo_id"
			. " WHERE repo_id = " . $extra['repo_id'];
		$res = rg_sql_query($db, $sql);
		rg_sql_free_result($res);
		$new['repo_id'] = $repo_id;
		rg_cache_unset('repo_by_name::' . $rg_ui['uid'],
			RG_SOCKET_NO_WAIT);
	}

	rg_log('Waiting for the repo git dir to be created...');
	$key = 'repo_by_id' . '::' . $extra['repo_id'];
	$tries = 10;
	while ($tries-- > 0) {
		rg_cache_core_unset($key);

		$r = rg_cache_get($key);
		if ($r === FALSE) {
			rg_log('r is FALSE');
			sleep(1);
			continue;
		}

		//rg_log_ml('DEBUG: r: ' . print_r($r, TRUE));

		if ($r['git_dir_done'] == 1)
			break;

		sleep(1);
	}

	return TRUE;
}

/*
 * Helper for creating and uploading a ssh key
 * Returns the key.
 */
function rg_test_upload_ssh_key($db, $rg_ui, $key_name, $good_sid)
{
	global $test_url;

	rg_log("Generating a SSH key [$key_name]");
	@unlink("keys/" . $key_name); @unlink("keys/" . $key_name . ".pub");
	$out = shell_exec("ssh-keygen -t rsa -N '' -C \"Key for RocketGit\""
		. " -f keys/" . $key_name . " </dev/null");
	if (!file_exists("keys/" . $key_name . ".pub")) {
		rg_log("Could not generate ssh key: " . $out);
		exit(1);
	}

	$key = file_get_contents("keys/" . $key_name . ".pub");

	rg_log("Loading ssh key form...");
	$data = array();
	$headers = array("Cookie: sid=" . $good_sid);
	$r = do_req($test_url . "/op/settings/keys?t=ssh2", $data, $headers);
	if ($r === FALSE) {
		rg_log("Cannot load form!");
		exit(1);
	}
	if (empty($r['tokens']['keys'])) {
		rg_log_ml('r: ' . print_r($r, TRUE));
	        rg_log('token not found!');
	        exit(1);
	}

	rg_log("Uploading the key...");
	$data = array('add' => 1, 'token' => $r['tokens']['keys'], 'key' => $key);
	$headers = array('Cookie: sid=' . $good_sid);
	$r = do_req($test_url . '/op/settings/keys?t=upload_ssh_key', $data, $headers);
	if ($r === FALSE) {
		rg_log_ml('r: ' . print_r($r, TRUE));
		rg_log_ml("Cannot upload key!");
		exit(1);
	}

	rg_log("Waiting for key to be added to the authorized_keys file");
	while (1) {
		$c = file_get_contents("/home/rocketgit/.ssh/authorized_keys");
		if (strstr($c, $key))
			break;

		sleep(1);
	}

	rg_log("Uploading done");

	return $key;
}

/*
 * Helper for generating scratch codes
 * Returns the scratch codes.
 */
function rg_test_sc_generate($db, $rg_ui, $good_sid)
{
	global $test_url;

	rg_log("Loading generate scratch codes form...");
	$data = array();
	$headers = array("Cookie: sid=" . $good_sid);
	$r = do_req($test_url . "/op/settings/totp/sc", $data, $headers);
	if ($r === FALSE) {
		rg_log("Cannot load form!");
		exit(1);
	}
	if (empty($r['tokens']['sc'])) {
		rg_log_ml('r: ' . print_r($r, TRUE));
	        rg_log('token not found!');
	        exit(1);
	}

	rg_log("Generating scratch codes...");
	$data = array('generate' => 1, 'token' => $r['tokens']['sc']);
	$headers = array('Cookie: sid=' . $good_sid);
	$r = do_req($test_url . '/op/settings/totp/sc', $data, $headers);
	if ($r === FALSE) {
		rg_log_ml('r: ' . print_r($r, TRUE));
		rg_log_ml('Cannot generate scratch codes!');
		exit(1);
	}

	rg_log("Generation done");

	$t = explode('<div class="secret_token">', $r['body']);
	$t = explode('</div>', $t[1]);
	$t = explode("\n", $t[0]);
	$sc = explode(' ', trim($t[1]));

	rg_log_ml('DEBUG: sc: ' . print_r($sc, TRUE));

	return $sc;
}

/*
 * Helper for adding a webhook
 */
function rg_test_wh_add_edit($db, $rg_ui, $good_sid, $htype, $extra)
{
	global $test_url;

	rg_log("Loading webhook add form...");
	$data = array('wh::htype' => $htype);
	$headers = array("Cookie: sid=" . $good_sid);

	if (!isset($extra['wh::id']))
		$extra['wh::id'] = 0;

	if ($extra['wh::id'] == 0)
		$url = 'add';
	else
		$url = 'edit/' . $extra['wh::id'];
	$r = do_req($test_url . "/op/settings/wh/" . $url, $data, $headers);
	if ($r === FALSE) {
		rg_log("Cannot load form!");
		exit(1);
	}
	if (empty($r['tokens']['wh_add'])) {
		rg_log_ml('r: ' . print_r($r, TRUE));
	        rg_log_ml('Token not found!');
	        exit(1);
	}

	rg_log("Adding webhook...");
	$data = array('add' => 1, 'token' => $r['tokens']['wh_add']);
	$data = array_merge($data, $extra);
	$headers = array('Cookie: sid=' . $good_sid);
	$r = do_req($test_url . '/op/settings/wh/' . $url, $data, $headers);
	if ($r === FALSE) {
		rg_log_ml('r: ' . print_r($r, TRUE));
		rg_log_ml('Cannot add webhook!');
		exit(1);
	}

	if (!strstr($r['body'], 'with success')) {
		rg_log_ml('r[body]: ' . print_r($r['body'], TRUE));
		rg_log('Cannot add webhook (no \'with success\' message)!');
		exit(1);
	}
}

?>
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