<?php require_once($INC . "/util.inc.php"); require_once($INC . "/log.inc.php"); require_once($INC . "/sql.inc.php"); require_once($INC . "/events.inc.php"); require_once($INC . "/cache.inc.php"); $rg_plan_error = ""; function rg_plan_set_error($str) { global $rg_plan_error; $rg_plan_error = $str; rg_log($str); } function rg_plan_error() { global $rg_plan_error; return $rg_plan_error; } /* * Validates plan name */ function rg_plan_ok($name) { if (empty($name)) return FALSE; return TRUE; } /* * Add/edit a plan * If uid > 0 - edit, else, add */ function rg_plan_edit($db, $d) { rg_prof_start("plan_edit"); rg_log_enter("plan_edit: d: " . rg_array2string($d)); $ret = FALSE; while (1) { if (rg_plan_ok($d['name']) !== TRUE) break; if ($d['id'] == 0) { // add $sql = "INSERT INTO plans (name, description, disk_mb" . ", users, bw, speed, position" . ", max_public_repos, max_private_repos)" . " VALUES (@@name@@, @@description@@" . ", @@disk_mb@@, @@users@@, @@bw@@" . ", @@speed@@, @@position@@" . ", @@max_public_repos@@, @@max_private_repos@@)" . " RETURNING id"; } else { // edit $sql = "UPDATE plans" . " SET name = @@name@@" . ", description = @@description@@" . ", disk_mb = @@disk_mb@@" . ", users = @@users@@" . ", bw = @@bw@@" . ", speed = @@speed@@" . ", position = @@position@@" . ", max_public_repos = @@max_public_repos@@" . ", max_private_repos = @@max_private_repos@@" . " WHERE id = @@id@@" . " RETURNING id"; } $res = rg_sql_query_params($db, $sql, $d); if ($res === FALSE) { rg_plan_set_error('cannot insert/update plan'); break; } $row = rg_sql_fetch_array($res); rg_sql_free_result($res); $d['id'] = $row['id']; // invalidate cache rg_cache_unset('plan::list', RG_SOCKET_NO_WAIT); $ret = $row['id']; break; } rg_log_exit(); rg_prof_end("plan_edit"); return $ret; } /* * Delete plans; list is array("<id>" => "<junk>, ...) */ function rg_plan_remove($db, $list) { rg_prof_start("plan_remove"); rg_log_enter("plan_remove: list=" . rg_array2string($list)); $ret = FALSE; while (1) { $my_list = array(); foreach ($list as $id => $junk) $my_list[] = sprintf("%u", $id); $sql_list = implode(", ", $my_list); $sql = "DELETE FROM plans WHERE id IN (" . $sql_list . ")"; $res = rg_sql_query($db, $sql); if ($res === FALSE) { rg_plan_set_error('cannot remove plans'); break; } rg_sql_free_result($res); // invalidate cache rg_cache_unset('plan::list', RG_SOCKET_NO_WAIT); $ret = TRUE; break; } rg_log_exit(); rg_prof_end("plan_remove"); return $ret; } /* * */ function rg_plan_cosmetic(&$row) { $_a = rg_xss_safe(trim($row['description'])); $row['HTML:description_nlbr'] = nl2br($_a); $row['exists'] = 1; } /* * */ function rg_plan_cosmetic_list(&$a) { foreach ($a as $id => &$row) rg_plan_cosmetic($row); } /* * Return the list of plans */ function rg_plan_list($db) { rg_prof_start("plan_list"); rg_log_enter("plan_list"); $ret = FALSE; while (1) { $ret = rg_cache_get("plan::list"); if ($ret !== FALSE) { rg_plan_cosmetic_list($ret); break; } $sql = "SELECT * FROM plans ORDER BY position"; $res = rg_sql_query($db, $sql); if ($res === FALSE) { rg_plan_set_error('cannot get plan list'); break; } $ret = array(); while (($row = rg_sql_fetch_array($res))) { $id = $row['id']; $ret[$id] = $row; } rg_sql_free_result($res); rg_cache_set("plan::list", $ret, RG_SOCKET_NO_WAIT); rg_plan_cosmetic_list($ret); break; } rg_log_exit(); rg_prof_end("plan_list"); return $ret; } /* * Returns info about a plan (by id) */ function rg_plan_info($db, $id) { rg_prof_start("plan_info"); rg_log_enter("plan_info: id=$id"); $ret = array(); $ret['ok'] = 0; $ret['exists'] = 0; while (1) { $list = rg_plan_list($db); if ($list === FALSE) break; $ret['ok'] = 1; $id = sprintf("%u", $id); if (!isset($list[$id])) break; $ret = array_merge($ret, $list[$id]); break; } rg_log_exit(); rg_prof_end("plan_info"); return $ret; } /* * Returns a select list * @name - the variable name */ function rg_plan_select($db, $name, $plan_id) { $list = rg_plan_list($db); if ($list === FALSE) return rg_warning("Could not load plans."); $ret = "<select name=\"" . $name . "\" id=\"plan_id\">\n"; foreach ($list as $row) { $add = ""; if ($row['id'] == $plan_id) $add = " selected"; $ret .= "<option value=\"" . rg_xss_safe($row['id']) . "\"" . $add . ">" . rg_xss_safe($row['name']) . "</option>\n"; } $ret .= "</select>\n"; return $ret; } /* * High-level function for rg_plan_list */ function rg_plan_list_high_level($db, $rg) { rg_log_enter('plan_high_list'); $ret = ''; $del_errmsg = array(); $delete = rg_var_uint('delete'); while ($delete == 1) { if (!rg_valid_referer()) { $del_errmsg[] = 'invalid referer; try again'; break; } if (!rg_token_valid($db, $rg, 'plan_list', FALSE)) { $del_errmsg[] = 'invalid token; try again.'; break; } $list = rg_var_str('delete_list'); $r = rg_plan_remove($db, $list); if ($r !== TRUE) { $rg['errmsg'] = rg_plan_error(); $del_errmsg[] = rg_template( 'admin/plans/delete_err.html', $rg, TRUE /*xss*/); break; } break; } $errmsg = array(); $list = rg_plan_list($db); if ($list === FALSE) { $rg['errmsg'] = rg_plan_error(); // TODO: really? no array append?! return rg_template('admin/plans/list_err.html', $rg, TRUE /*xss*/); } else { $rg['rg_form_token'] = rg_token_get($db, $rg, 'plan_list'); $rg['HTML:del_errmsg'] = rg_template_errmsg($del_errmsg); $ret .= rg_template_table("admin/plans/list", $list, $rg); } rg_log_exit(); return $ret; } /* * High-level function for rg_plan_edit. */ function rg_plan_edit_high_level($db, &$rg) { rg_log("plan_edit_high_level rg:" . rg_array2string($rg)); if (isset($rg['pi']['id'])) $id = $rg['pi']['id']; else $id = 0; $ret = ""; $pi = array(); if ($rg['doit'] == 0) { if ($id > 0) { $pi = rg_plan_info($db, $id); if ($pi['exists'] != 1) { $ret .= rg_warning("Invalid plan."); return $ret; } } else { // Defaults $pi['id'] = 0; $pi['name'] = ""; $pi['description'] = ""; $pi['disk_mb'] = "0"; $pi['users'] = "0"; $pi['bw'] = "0"; $pi['speed'] = "0"; $pi['position'] = "100"; $pi['max_public_repos'] = "0"; $pi['max_private_repos'] = "0"; } } $errmsg = array(); $load_form = TRUE; while (1) { if ($rg['doit'] != 1) break; $pi = array(); if ($id > 0) $pi['id'] = $id; else $pi['id'] = rg_var_uint("pi::id"); $pi['name'] = rg_var_str("pi::name"); $pi['description'] = trim(rg_var_str("pi::description")); $pi['disk_mb'] = rg_var_uint("pi::disk_mb"); $pi['users'] = rg_var_uint("pi::users"); $pi['bw'] = rg_var_uint("pi::bw"); $pi['speed'] = rg_var_uint("pi::speed"); $pi['position'] = rg_var_uint("pi::position"); $pi['max_public_repos'] = rg_var_uint("pi::max_public_repos"); $pi['max_private_repos'] = rg_var_uint("pi::max_private_repos"); if (!rg_valid_referer()) { $errmsg[] = "invalid referer; try again"; break; } if (!rg_token_valid($db, $rg, 'plan_edit_hl', FALSE)) { $errmsg[] = "invalid token; try again"; break; } $r = rg_plan_edit($db, $pi); if ($r === FALSE) { $errmsg[] = "cannot add/edit plan: " . rg_plan_error(); break; } $ret .= rg_template("admin/plans/add_ok.html", $rg, TRUE /* xss */); $load_form = FALSE; break; } if ($load_form) { $rg['pi'] = $pi; $rg['HTML:errmsg'] = rg_template_errmsg($errmsg); $rg['rg_form_token'] = rg_token_get($db, $rg, 'plan_edit_hl'); $ret .= rg_template("admin/plans/add_edit.html", $rg, TRUE /* xss */); } return $ret; } ?>