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 / by_http.php (e0bf80e5615b368bd1bc29ee8de77085943c9632) (7,684B) (mode 100644) [raw]
<?php
error_reporting(E_ALL | E_STRICT);
ini_set("track_errors", "On");

$rg_cache_debug = FALSE;
$rg_util_debug = FALSE;
$rg_sql_debug = 100;
$test_normal = TRUE;

$INC = dirname(__FILE__) . "/../inc";
require_once(dirname(__FILE__) . "/config.php");
require_once($INC . "/init.inc.php");
require_once($INC . "/git.inc.php");
require_once("helpers.inc.php");
require_once("http.inc.php");

rg_log_set_file("by_http.log");

require_once("common.php");

$_testns = 'by_http';
$e_testns = escapeshellarg($_testns);
//TODO $git_push = 'git push --verbose --push-option _testns=' . $e_testns;
$git_push = 'git push --verbose';


prepare_http();

rg_test_create_user($db, $rg_ui);
rg_log('Created user ' . $rg_ui['uid']);

putenv('git_username=' . $rg_ui['username']);
putenv('git_password=' . $rg_ui['pass']);

rg_test_create_repo($db, $rg_ui, $repo);
rg_log('Created repo ' . $repo['repo_id']);
$repo2 = array('public' => 0);
rg_test_create_repo($db, $rg_ui, $repo2);
rg_log('Created repo2 ' . $repo2['repo_id']);
$r = test_login($test_url, $rg_ui);
if ($r === FALSE) {
	rg_log("Cannot login!");
	exit(1);
}


$commit_body = rg_id(32);
$a = rg_exec('rm -rf .by_http'
	. ' && mkdir .by_http'
	. ' && cd .by_http'
	. ' && git init'
	. ' && git remote add public_repo ' . escapeshellarg($repo['clone_url_http'])
	. ' && git remote add private_repo ' . escapeshellarg($repo2['clone_url_http'])
	. ' && git remote add private_repo_git ' . escapeshellarg($repo2['clone_url_git'])
	. ' && echo "a signature" > a'
	. ' && git add a'
	. ' && git commit -a -m "' . $commit_body . '"',
	'', FALSE, FALSE, FALSE);
if ($a['ok'] != 1) {
	rg_log("Something wrong generating the git repo: " . $a['stderr']);
	exit(1);
}


rg_log('');
rg_log_enter('Trying to push to public (empty user)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass_empty');
$r = rg_exec('cd .by_http'
	. ' && ' . $git_push . ' public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] == 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I can push with empty user!');
	exit(1);
}
if (!strstr($r['stderr'], 'Authentication failed')) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('The stderr does not contain \'Authentication failed\'!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to push to public (with guest)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass_guest');
$r = rg_exec('cd .by_http && ' . $git_push . ' public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot push without authentication (anonymous push)!');
	exit(1);
}
if (!strstr($r['stderr'], 'transformed into a merge request')) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('The stderr does not contain something about anonymous push!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to push to public (with user/pass)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && ' . $git_push . ' public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot push with authentication!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to fetch from public (with user/pass)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && git fetch --verbose public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot fetch with authentication!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to fetch from private (by git://)...');
$r = rg_exec('cd .by_http && git fetch --verbose private_repo_git master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] == 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I can fetch by git://!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to push to private (guest user)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass_guest');
$r = rg_exec('cd .by_http && ' . $git_push . ' private_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] == 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I can push without authentication (anonymous push)!');
	exit(1);
}
if (!strstr($r['stderr'], 'Authentication failed')) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('The error is not authentication failure (but ['
		. $r['stderr'] . '])!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to push to private (with user/pass)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && ' . $git_push . ' private_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot push with authentication!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to fetch from private (with user/pass)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && git fetch --verbose private_repo',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot fetch with authentication!');
	exit(1);
}
rg_log_exit();


$r = totp_enroll($db);
if ($r['ok'] !== 1)
        exit(1);
$key = $r['key'];
rg_log('key: ' . $key);


rg_log('');
rg_log_enter('Trying to push to public (with user/pass/login_token_missing)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && ' . $git_push . ' public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] !== 0) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I can push without passing login_token!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to fetch from public (with user/pass/login_token_missing)...');
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && git fetch --verbose public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] !== 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot fetch without passing login_token!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to push to public (with user/pass/login_token_ok)...');
putenv('RG_LOGIN_TOKEN=' . rg_totp_compute($key, (time() - 30) / 30, 6));
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && ' . $git_push . ' public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot push with authentication!');
	exit(1);
}
rg_log_exit();


rg_log('');
rg_log_enter('Trying to fetch from public (with user/pass/login_token_ok)...');
putenv('RG_LOGIN_TOKEN=' . rg_totp_compute($key, (time() - 0) / 30, 6));
putenv('GIT_ASKPASS=' . dirname(__FILE__) . '/ask_pass');
$r = rg_exec('cd .by_http && git fetch --verbose public_repo master',
	'', FALSE, FALSE, FALSE);
if ($r['ok'] != 1) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('Seems I cannot fetch with authentication!');
	exit(1);
}
putenv('RG_LOGIN_TOKEN=');
rg_log_exit();


rg_log('');
$commit = trim(file_get_contents('.by_http/.git/refs/heads/master'));
rg_log('master from .git: ' . $commit);
rg_log_enter('Checking on web that everything is OK...');
$data = array();
$headers = array();
$r = do_req($test_url . '/user/' . rawurlencode($rg_ui['username'])
	. '/' . rawurlencode($repo['name']) . '/source/log/commit/'
	. $commit, $data, $headers);
if ($r === FALSE) {
	rg_log('Cannot load master commit!');
	exit(1);
}
if (!strstr($r['body'], $commit_body)) {
	rg_log_ml('r: ' . print_r($r, TRUE));
	rg_log('I cannot find [' . $commit_body . '] inside the body!');
	exit(1);
}
rg_log_exit();


rg_log('OK!');
?>
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