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> / inc / webhooks.inc.php (cdd66a3a8bf65424ffdcbcce280946a564179716) (4,974B) (mode 100644) [raw]
<?php
require_once($INC . "/util.inc.php");
require_once($INC . "/log.inc.php");
require_once($INC . "/sql.inc.php");
require_once($INC . "/prof.inc.php");
require_once($INC . "/wh/http.inc.php");

/*
 * High level function to list the webhooks
 */
function rg_wh_list_high_level($db, $rg, $paras)
{
	rg_prof_start('wh_list_high_level');
	rg_log_enter('wh_list_high_level');

	$ret = '';

	$errmsg = array();

	$delete = rg_var_uint('delete');
	while ($delete == 1) {
		if (!rg_valid_referer()) {
			$errmsg[] = 'invalid referer; try again';
			break;
		}

		if (!rg_token_valid($db, $rg, 'wh_list', FALSE)) {
			$errmsg[] = 'invalid token; try again.';
			break;
		}

		$list = rg_var_str("delete_list");
		$r = rg_wh_remove($db, $rg['login_ui']['uid'], $list);
		if ($r['ok'] !== 1) {
			$errmsg[] = 'cannot delete: ' . rg_wh_error();
			break;
		}

		$ret .= rg_template('user/settings/wh/delete_ok.html',
			$rg, TRUE /*xss*/);
		break;
	}

	$r = rg_wh_list($db, $rg['login_ui']['uid']);
	if ($r['ok'] !== 1) {
		$rg['errmsg'] = rg_wh_error();
		$ret .= rg_template('user/settings/wh/list_err.html',
			$rg, TRUE /*xss*/);
	} else {
		rg_wh_cosmetic($r['list']);
		//rg_log_ml('DEBUG: wh_list_high_level: r[list]: '
		//	. print_r($r['list'], TRUE));
		$rg['rg_form_token'] = rg_token_get($db, $rg, 'wh_list');
		$rg['HTML:errmsg'] = rg_template_errmsg($errmsg);
		$ret .= rg_template_table('user/settings/wh/list',
			$r['list'], $rg);
	}

	rg_log_exit();
	rg_prof_end('wh_list_high_level');
	return $ret;
}

/*
 * High level function to add/edit a web hook
 */
function rg_wh_add_high_level($db, $rg, $paras)
{
	rg_prof_start('wh_add_high_level');
	rg_log_enter('wh_add_high_level');

	rg_log('DEBUG: paras:' . rg_array2string($paras));

	$ret = '';
	$errmsg = array();
	$show_form = TRUE;

	$rg['wh'] = array();
	$rg['wh']['htype'] = rg_var_str('wh::htype');
	// We need the id in any case
	if (isset($paras[0])) {
		$rg['wh']['id'] = intval($paras[0]);
	} else {
		$rg['wh']['id'] = rg_var_str('wh::id');

		if (empty($rg['wh']['htype'])) {
			$ret .= rg_wh_htypes($rg);
			$show_form = FALSE;
		}

	}

	$add = rg_var_uint('add');
	while ($add == 1) {
		$rg['wh']['repo_id'] = rg_var_uint('wh::repo_id');
		$rg['wh']['itime'] = time();
		$rg['wh']['events'] = rg_var_a2s('wh::events'); // TODO
		$rg['wh']['url'] = rg_var_str('wh::url');
		$rg['wh']['add_ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
		$rg['wh']['description'] = rg_var_str('wh::description');
		$rg['wh']['opaque'] = rg_var_str('wh::opaque');
		$rg['wh']['key'] = rg_var_str('wh::key');
		rg_wh_fill_vars($rg);

		$r = rg_wh_validate_vars($rg, $errmsg);
		if ($r !== TRUE)
			break;

		if (!rg_valid_referer()) {
			$errmsg[] = 'invalid referer; try again';
			break;
		}

		if (!rg_token_valid($db, $rg, 'wh_add', FALSE)) {
			$errmsg[] = 'invalid token; try again.';
			break;
		}

		$r = rg_wh_add($db, $rg['login_ui']['uid'], $rg['wh']);
		if ($r['ok'] !== 1) {
			$errmsg[] = rg_wh_error();
			break;
		}

		$ret .= rg_template('user/settings/wh/edit_ok.html',
			$rg, TRUE /*xss*/);

		$show_form = FALSE;
		break;
	}

	if ($show_form) {
		// defaults
		if ($add == 0) {
			// TODO: if edit, load data based on id
			if ($rg['wh']['id'] > 0) {
				$r = rg_wh_list($db, $rg['login_ui']['uid']);
				if ($r['ok'] != 1) {
					$errmsg[] = 'cannot load webhook info; try again later';
				} else if (!isset($r['list'][$rg['wh']['id']])) {
					$errmsg[] = 'invalid webhook id';
				} else {
					$rg['wh'] = $r['list'][$rg['wh']['id']];
				}
			} else {
				// here is clear an add
				$rg['wh']['id'] = 0;
				$rg['wh']['events'] = '';
				$rg['wh']['url'] = '';
				$rg['wh']['description'] = '';
				$rg['wh']['opaque'] = '';
				$rg['wh']['key'] = '';
				rg_wh_default_paras($rg);
			}
		}

		rg_wh_add_form($rg);

		$hints = array();
		$hints[]['HTML:hint'] = rg_template('user/settings/wh/hints.html',
			$rg, TRUE /*xss*/);
		rg_wh_fill_hints($rg, $hints);
		$rg['HTML:hints'] = rg_template_table("hints/list", $hints, $rg);


		$rg['HTML:errmsg'] = rg_template_errmsg($errmsg);
		$rg['HTML:check_events'] = rg_wh_check_events($rg['wh']['events']);
		$rg['rg_form_token'] = rg_token_get($db, $rg, 'wh_add');
		$ret .= rg_template('user/settings/wh/add_edit.html',
			$rg, TRUE /*xss*/);
	}

	rg_log_exit();
	rg_prof_end('wh_add_high_level');
	return $ret;
}

/*
 * Main HL function for webhooks
 */
function rg_wh_high_level($db, $rg, $paras)
{
	rg_prof_start('wh_high_level');
	rg_log_enter('wh_high_level');

	$ret = '';
	while (1) {
		$op = empty($paras) ? 'list' : array_shift($paras);
		$rg['menu']['wh'][$op] = 1;

		$ret .= rg_template('user/settings/wh/menu.html',
			$rg, TRUE /*xss*/);

		switch ($op) {
		case 'add':
		case 'edit':
			$ret .= rg_wh_add_high_level($db, $rg, $paras);
			break;

		default:
			$ret .= rg_wh_list_high_level($db, $rg, $paras);
			break;
		}

		break;
	}

	rg_log_exit();
	rg_prof_end('wh_high_level');
	return $ret;
}

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