File: //usr/local/lsws/admin/html/lib/DInfo.php
<?php
class DInfo
{
const FLD_ConfType = 1;
const FLD_ConfErr = 2;
const FLD_View = 3;
const FLD_ViewName = 4;
const FLD_TopMsg = 5;
const FLD_ICONTITLE = 6;
const FLD_CtrlUrl = 10;
const FLD_MID = 11;
const FLD_PID = 12;
const FLD_TID = 13;
const FLD_REF = 14;
const FLD_ACT = 15;
const FLD_SORT = 16;
const FLD_TOKEN = 17;
const FLD_PgData = 18;
const FLD_ConfData = 19;
const FLD_ServData = 20;
// conftype
const CT_SERV = 'serv';
const CT_VH = 'vh_';
const CT_TP = 'tp_';
const CT_ADMIN = 'admin';
const CT_EX = 'special';
private $_confType;
private $_view; //_type (serv, sl, sl_, vh, vh_, tp, tp_, lb, lb_, admin, al, al_)
private $_viewName = null; // _name
private $_ctrlUrl = 'index.php#view/confMgr.php?';
private $_mid = 'serv'; // default
private $_pid = null;
private $_tid = null;
private $_ref = null;
private $_act;
private $_token;
private $_confErr;
private $_pageData;
private $_confData;
private $_servData; // for populate vh level derived options
private $_tabs;
private $_sort;
private $_topMsg;
private $_isPrintingLinkedTbl;
private $_allActions;
private static $_instance;
public static function singleton()
{
if (!isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
private function __construct()
{
}
public function ShowDebugInfo()
{
return "DINFO: conftype={$this->_confType} view={$this->_view} viewname={$this->_viewName} mid={$this->_mid} pid={$this->_pid} tid={$this->_tid} ref={$this->_ref} act={$this->_act}\n";
}
public function InitConf()
{
$has_pid = false;
$mid = UIBase::GrabGoodInput("request", 'm');
if ($mid != null) {
$this->_mid = $mid;
$pid = UIBase::GrabGoodInput("request", 'p');
if ($pid != null) {
$this->_pid = $pid;
$has_pid = true;
}
}
if (($pos = strpos($this->_mid, '_')) > 0) {
$this->_view = substr($this->_mid, 0, $pos + 1);
$this->_viewName = substr($this->_mid, $pos + 1);
if ($this->_pid == '' || $this->_view == 'sl' || $this->_view == 'sl_' || $this->_view == 'al' || $this->_view == 'al_' || $this->_pid == 'base' || $this->_pid == 'mbr') {
$this->_ref = $this->_viewName; // still in serv conf
}
} else {
$this->_view = $this->_mid;
}
$this->_confType = ( $this->_mid[0] == 'a' ) ? self::CT_ADMIN : self::CT_SERV;
$this->_tabs = DPageDef::GetInstance()->GetTabDef($this->_view);
if ($has_pid) {
if (!array_key_exists($this->_pid, $this->_tabs))
die("Invalid pid - {$this->_pid} \n");
}
else {
$this->_pid = key($this->_tabs); // default
}
if ($has_pid && !isset($_REQUEST['t0']) && isset($_REQUEST['t'])) {
$t = UIBase::GrabGoodInput('request', 't');
if ($t != null) {
$this->_tid = $t;
$t1 = UIBase::GrabGoodInputWithReset('request', 't1');
if ($t1 != null && ( $this->GetLast(self::FLD_TID) != $t1)) {
$this->_tid .= '`' . $t1;
}
if (($r = UIBase::GrabGoodInputWithReset('request', 'r')) != null) {
$this->_ref = $r;
}
if (($r1 = UIBase::GrabGoodInputWithReset('request', 'r1')) != null) {
$this->_ref .= '`' . $r1;
}
}
}
$this->_act = UIBase::GrabGoodInput("request", 'a');
if ($this->_act == null) {
$this->_act = 'v';
}
$tokenInput = UIBase::GrabGoodInput("request", 'tk');
$this->_token = $_SESSION['token'];
if ($this->_act != 'v' && $this->_token != $tokenInput) {
die('Illegal entry point!');
}
if ($this->_act == 'B') {
$this->TrimLastId();
$this->_act = 'v';
}
$this->_sort = UIBase::GrabGoodInput("request", 'sort');
$this->_allActions = [
'a' => [DMsg::UIStr('btn_add'), 'fa-plus'],
'v' => [DMsg::UIStr('btn_view'), 'fa-search-plus'],
'E' => [DMsg::UIStr('btn_edit'), 'fa-edit'],
's' => [DMsg::UIStr('btn_save'), 'fa-save'],
'B' => [DMsg::UIStr('btn_back'), 'fa-reply'], //'fa-level-up'
'n' => [DMsg::UIStr('btn_next'), 'fa-step-forward'],
'd' => [DMsg::UIStr('btn_delete'), 'fa-trash-o'],
'D' => [DMsg::UIStr('btn_delete'), 'fa-trash-o'],
'C' => [DMsg::UIStr('btn_cancel'), 'fa-angle-double-left'],
'i' => [DMsg::UIStr('btn_instantiate'), 'fa-cube'],
'I' => [DMsg::UIStr('btn_instantiate'), 'fa-cube'],
'X' => [DMsg::UIStr('btn_view'), 'fa-search-plus'],
];
}
public function Get($field)
{
switch ($field) {
case self::FLD_CtrlUrl:
return sprintf('%sm=%s&p=%s', $this->_ctrlUrl, urlencode($this->_mid), $this->_pid);
case self::FLD_View: return $this->_view;
case self::FLD_ViewName: return $this->_viewName;
case self::FLD_TopMsg: return $this->_topMsg;
case self::FLD_ConfType: return $this->_confType;
case self::FLD_ConfErr: return $this->_confErr;
case self::FLD_MID: return $this->_mid;
case self::FLD_PID: return $this->_pid;
case self::FLD_TID: return $this->_tid;
case self::FLD_REF: return $this->_ref;
case self::FLD_ACT: return $this->_act;
case self::FLD_PgData: return $this->_pageData;
case self::FLD_ConfData: return $this->_confData;
case self::FLD_TOKEN: return $this->_token;
case self::FLD_SORT: return $this->_sort;
case self::FLD_ICONTITLE:
switch ($this->_view) {
case 'serv':
return ['fa-globe', DMsg::UIStr('menu_serv')];
case 'sl':
return ['fa-chain', DMsg::UIStr('menu_sl')];
case 'sl_':
return ['fa-chain', DMsg::UIStr('menu_sl_') . ' ' . $this->_viewName];
case 'vh':
return ['fa-cubes', DMsg::UIStr('menu_vh')];
case 'vh_':
return ['fa-cube', DMsg::UIStr('menu_vh_') . ' ' . $this->_viewName];
case 'tp':
return ['fa-files-o', DMsg::UIStr('menu_tp')];
case 'tp_':
return ['fa-files-o', DMsg::UIStr('menu_tp_') . ' ' . $this->_viewName];
case 'admin':
return ['fa-gear', DMsg::UIStr('menu_webadmin')];
case 'al':
return ['fa-chain', DMsg::UIStr('menu_webadmin') . ' - ' . DMsg::UIStr('menu_sl')];
case 'al_':
return ['fa-chain', DMsg::UIStr('menu_webadmin') . ' - ' . DMsg::UIStr('menu_sl_') . ' ' . $this->_viewName];
}
break;
default: error_log("invalid DInfo field : $field\n");
}
}
public function Set($field, $value)
{
switch ($field) {
case self::FLD_ConfErr:
$this->_confErr = $value;
break;
case self::FLD_ACT:
$this->_act = $value;
break;
case self::FLD_PgData:
$this->_pageData = $value;
break;
case self::FLD_ConfData:
$this->_confData = $value;
break;
case self::FLD_ServData:
$this->_servData = $value;
break;
case self::FLD_REF:
$this->_ref = $value;
break;
case self::FLD_ViewName:
$this->_viewName = $value;
if ($value == null) { // by delete
$value = '';
} else {
$value = '_' . $value;
}
if (($pos = strpos($this->_mid, '_')) > 0) {
$this->_mid = substr($this->_mid, 0, $pos) . $value;
}
break;
case self::FLD_TopMsg:
$this->_topMsg[] = $value;
break;
default: die("not supported - $field");
}
}
public function SetPrintingLinked($printinglinked)
{
$this->_isPrintingLinkedTbl = $printinglinked;
}
public function InitUIProps($props)
{
$props->Set(UIProperty::FLD_FORM_HIDDENVARS, [
'a' => 'v',
'm' => $this->_mid,
'p' => $this->_pid,
't' => $this->_tid,
'r' => $this->_ref,
'tk' => $this->_token]);
if ($this->_servData != null) {
$props->Set(UIProperty::FLD_SERVER_NAME, $this->_servData->GetId());
}
$uri = $this->_ctrlUrl . 'm=' . urlencode($this->_mid);
$tabs = [];
$uri .= '&p=';
foreach ($this->_tabs as $pid => $tabName) {
if ($pid == $this->_pid) {
//$bread[$tabName] = $uri . $pid;
$name = '1' . $tabName;
} else {
$name = '0' . $tabName;
}
//$tabs[$name] = $uri . $pid;
$tabs[$name] = "javascript:lst_conf('v', '$pid','-','-')";
}
$props->Set(UIProperty::FLD_TABS, $tabs);
}
public function IsViewAction()
{
//$viewTags = 'vsDdBCiI';
$editTags = 'EaScn';
return ( strpos($editTags, $this->_act) === false );
}
public function GetActionData($actions, $editTid = '', $editRef = '', $addTid = '')
{
$actdata = [];
$chars = preg_split('//', $actions, -1, PREG_SPLIT_NO_EMPTY);
$cur_tid = $this->GetLast(self::FLD_TID);
foreach ($chars as $act) {
$name = $this->_allActions[$act][0];
$ico = $this->_allActions[$act][1];
if ($act == 'C') {
$act = 'B';
}
if ($act == 'B' && $this->_isPrintingLinkedTbl) {
continue; // do not print Back for linked view
}
if ($act == 's' || $act == 'n') {
$href = "javascript:lst_conf('$act','','','')";
} elseif ($act == 'X') {
//vhtop=>vh_... tptop=>tp_.... sltop=>sl_...
$href = $this->_ctrlUrl . 'm=' . urlencode($this->_view . '_' . $editRef);
$act = 'v';
} else {
if ($act == 'a') {
$edittid = $addTid;
$editref = '~';
} else {
$edittid = $editTid;
$editref = $editRef;
}
if ($edittid == '' || $edittid == $cur_tid) {
$t = $this->_tid;
} elseif ($cur_tid != null && $cur_tid != $edittid) {
$t = $this->_tid . '`' . $edittid;
} else {
$t = $edittid;
}
if ($editref == '') {
$r = $this->_ref;
} elseif ($this->_ref != null && $this->_ref != $editref) {
$r = $this->_ref . '`' . $editref;
} else {
$r = $editref;
}
if ($t) {
$t = addslashes($t);
}
if ($r) {
$r = addslashes($r);
}
$href = "javascript:lst_conf('$act', '', '$t', '$r')";
}
$actdata[$act] = ['label' => $name, 'href' => $href, 'ico' => $ico];
}
return $actdata;
}
public function TrimLastId()
{
if ($this->_tid && ($pos = strrpos($this->_tid, '`')) !== false) {
$this->_tid = substr($this->_tid, 0, $pos);
} else {
$this->_tid = null;
}
if ($this->_ref && ($pos = strrpos($this->_ref, '`')) !== false) {
$this->_ref = substr($this->_ref, 0, $pos);
} elseif ($this->_view == 'sl_' || $this->_view == 'al_' || $this->_pid == 'base' || $this->_pid == 'mbr') {
$this->_ref = $this->_viewName; // still in serv conf
} else {
$this->_ref = null;
}
}
public function GetLast($field)
{
$id = null;
if ($field == self::FLD_TID) {
$id = $this->_tid;
} elseif ($field == self::FLD_REF) {
$id = $this->_ref;
}
if ($id != null && ($pos = strrpos($id, '`')) !== false) {
if (strlen($id) > $pos + 1) {
$id = substr($id, $pos + 1);
} else {
$id = '';
}
}
return $id;
}
public function GetFirst($field)
{
$id = null;
if ($field == self::FLD_TID) {
$id = $this->_tid;
} elseif ($field == self::FLD_REF) {
$id = $this->_ref;
}
if ($id != null && ($pos = strpos($id, '`')) !== false) {
$id = substr($id, 0, $pos);
}
return $id;
}
public function GetParentRef()
{
if ($this->_ref && ($pos = strrpos($this->_ref, '`')) !== false) {
return substr($this->_ref, 0, $pos);
}
return '';
}
public function SwitchToSubTid($extracted)
{
if ($this->_tid && ($pos = strrpos($this->_tid, '`')) !== false) {
$tid0 = substr($this->_tid, 0, $pos + 1);
$tid = substr($this->_tid, $pos + 1);
} else {
$tid0 = '';
$tid = $this->_tid;
}
$tbl = DTblDef::getInstance()->GetTblDef($tid);
$subtbls = $tbl->Get(DTbl::FLD_SUBTBLS);
$newkey = $extracted->GetChildVal($subtbls[0]);
$subtid = '';
if ($newkey != null) {
if ($newkey == '0' || !isset($subtbls[$newkey])) {
$subtid = $subtbls[1];
} else {
$subtid = $subtbls[$newkey];
}
}
$this->_tid = $tid0 . $subtid;
}
public function GetDerivedSelOptions($tid, $loc, $node)
{
if (substr($loc, 0, 13) == 'extprocessor:') {
return $this->getDerivedSelOptions_extprocessor($tid, $loc, $node);
}
if (in_array($loc, ['virtualhost', 'listener', 'module'])) {
$names = $this->_servData->GetChildrenValues($loc);
} elseif ($loc == 'realm') {
if ($this->_view == DInfo::CT_TP) {
$loc = "virtualHostConfig:$loc";
}
$names = $this->_confData->GetChildrenValues($loc);
}
sort($names);
$o = [];
foreach ($names as $name) {
$o[$name] = $name;
}
return $o;
}
protected function getDerivedSelOptions_extprocessor($tid, $loc, $node)
{
$o = [];
// substr($loc, 0, 13) == 'extprocessor:')
$type = substr($loc, 13);
if ($type == '$$type') {
if ($node != null) {
$type = $node->GetChildVal('type');
}
if ($type == null) { // default
$type = 'fcgi';
}
}
if ($type == 'cgi') {
$o['cgi'] = 'CGI Daemon';
return $o;
}
if ($type == 'module') {
$modules = $this->_servData->GetChildrenValues('module');
if ($modules != null) {
foreach ($modules as $mn) {
$o[$mn] = $mn;
}
}
return $o;
}
$exps = [];
if (($servexps = $this->_servData->GetRootNode()->GetChildren('extprocessor')) != null) {
if (is_array($servexps)) {
foreach ($servexps as $exname => $ex) {
if ($ex->GetChildVal('type') == $type) {
$exps[] = $exname;
}
}
}
elseif ($servexps->GetChildVal('type') == $type) {
$exps[] = $servexps->Get(CNode::FLD_VAL);
}
}
if ($this->_view == DInfo::CT_SERV) {
foreach ($exps as $exname) {
$o[$exname] = $exname;
}
return $o;
}
foreach ($exps as $exname) {
$o[$exname] = '[' . DMsg::UIStr('note_serv_level') . "]: $exname";
}
$loc = ($this->_view == DInfo::CT_TP) ? 'virtualHostConfig:extprocessor' : 'extprocessor';
if (($vhexps = $this->_confData->GetRootNode()->GetChildren($loc)) != null) {
if (is_array($vhexps)) {
foreach ($vhexps as $exname => $ex) {
if ($ex->GetChildVal('type') == $type) {
$o[$exname] = '[' . DMsg::UIStr('note_vh_level') . "]: $exname";
}
}
}
elseif ($vhexps->GetChildVal('type') == $type) {
$exname = $vhexps->Get(CNode::FLD_VAL);
$o[$exname] = '[' . DMsg::UIStr('note_vh_level') . "]: $exname";
}
}
return $o;
}
public function GetVHRoot()
{
// type = 'SR', 'VR'
if ($this->_view == self::CT_VH) {
$vn = $this->_viewName;
if (($vh = $this->_servData->GetChildNodeById('virtualhost', $vn)) != null) {
$vhroot = PathTool::GetAbsFile($vh->GetChildVal('vhRoot'), 'SR', $vn);
return $vhroot;
}
}
return null;
}
}