<?php
require_once(__DIR__ . '/util2.inc.php');
require_once(__DIR__ . '/log.inc.php');
require_once(__DIR__ . '/sql.inc.php');
require_once(__DIR__ . '/prof.inc.php');
require_once(__DIR__ . '/wh/http.inc.php');
require_once(__DIR__ . '/wh/cloud.inc.php');
require_once(__DIR__ . '/wh/lambda.inc.php');
require_once(__DIR__ . '/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_enter('wh_send');
rg_log_debug('ev: ' . rg_array2string_short($ev));
$ret = array();
do {
$ui_login = rg_ui_login();
if ($ui_login['confirmed'] == 0) {
rg_log('User has not confirmed her e-mail; exit');
rg_log_debug('ui_login: ' . print_r($ui_login, TRUE));
break;
}
$ev['source'] = 'wh_send';
$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)
break;
$x = $ev;
$x['category'] = 'wh_cloud_send';
$ret[] = $x;
$x = $ev;
$x['category'] = 'wh_build_send';
$ret[] = $x;
} while (0);
rg_log_exit();
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();
$ui_login = rg_ui_login();
$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, $ui_login['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, $ui_login['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_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'] = empty($paras) ? '' : array_shift($paras);
$rg['wh']['hsubtype'] = empty($paras) ? '' : 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;
}
$ui_login = rg_ui_login();
$r = rg_wh_add($db, $ui_login['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
$ui_login = rg_ui_login();
$r = rg_wh_list($db, $ui_login['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_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;
}