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 (33fef07a37c8c7520ff2c070f0f55aa660e32023) (5,475B) (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");
require_once($INC . "/wh/cloud.inc.php");
require_once($INC . "/wh/lambda.inc.php");
require_once($INC . "/wh/build.inc.php");

$rg_wh_functions = array(
	'wh_send' => 'rg_wh_send',
);
rg_event_register_functions($rg_wh_functions);

function rg_wh_send($db, $ev)
{
	rg_log_ml('wh_send: ev: ' . print_r($ev, TRUE));

	$ret = array();

	$x = $ev;
	$x['category'] = 'wh_http_send';
	$ret[] = $x;

	$x = $ev;
	$x['category'] = 'wh_lambda_send';
	$ret[] = $x;

	// we add a cloud/build event, only for pushes
	if (strcmp($ev['wh_event'], 'P') == 0) {
		$x = $ev;
		$x['category'] = 'wh_cloud_send';
		$ret[] = $x;

		$x = $ev;
		$x['category'] = 'wh_build_send';
		$ret[] = $x;
	}

	return $ret;
}

/*
 * 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;
	}
	if (!empty($errmsg)) {
		$rg['HTML:errmsg'] = rg_template_errmsg($errmsg);
		$ret .= rg_template('user/settings/wh/delete_err.html',
			$rg, TRUE /*xss*/);
	}

	$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');
		$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, $op, $paras)
{
	rg_prof_start('wh_add_high_level');
	rg_log_enter('wh_add_high_level op=' . $op);

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

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

	$rg['wh'] = array();

	if (strcmp($op, 'add') == 0) {
		$rg['wh']['htype'] = array_shift($paras);
		$rg['wh']['hsubtype'] = array_shift($paras);
		$rg['wh']['id'] = 0;

		if (!rg_wh_valid($rg['wh']['htype']))
			$rg['wh']['htype'] = '';

		if (empty($rg['wh']['htype'])) {
			$ret .= rg_wh_htypes($rg);
			$show_form = FALSE;
		}
	} else { // edit
		$rg['wh']['htype'] = rg_var_str('wh::htype');
		$rg['wh']['hsubtype'] = rg_var_str('wh::hsubtype');
		if (isset($paras[0]))
			$rg['wh']['id'] = intval($paras[0]);
		else
			$rg['wh']['id'] = 0;
	}

	$doit = rg_var_uint('doit');
	while ($doit == 1) {
		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;
	}

	$hints = array();
	if ($show_form) {
		if ($doit == 0) {
			if (strcmp($op, 'add') != 0) { // edit
				$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']];
				}
			}

			rg_wh_default_paras($rg);
		}

		rg_wh_add_form($db, $rg);

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

		$rg['HTML:errmsg'] = rg_template_errmsg($errmsg);
		$rg['rg_form_token'] = rg_token_get($db, $rg, 'wh_add');

		rg_log_ml('DEBUG: BEFORE FORM: wh[idata]: '
			. print_r($rg['wh']['idata'], TRUE));
		$ret .= rg_template('user/settings/wh/add_edit.html',
			$rg, TRUE /*xss*/);
	} else {
		$hints[]['HTML:hint'] = rg_template('user/settings/wh/hints.html',
			$rg, TRUE /*xss*/);
	}

	$ret .= rg_template_table("hints/list", $hints, $rg);

	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;

		$rg['HTML:menu_level2'] =
			rg_template('user/settings/wh/menu.html', $rg, TRUE /*xss*/);

		switch ($op) {
		case 'add':
		case 'edit':
			$ret .= rg_wh_add_high_level($db, $rg, $op, $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