665 lines
20 KiB
PHP

<?php
use WebFX\System;
use WebFX\Module;
use WebFX\ModulePage;
use WebFX\Controls\ButtonGroup;
use WebFX\Controls\ButtonGroupButton;
use Objectify\Tenant\MasterPages\WebPage;
use Objectify\Tenant\Pages\LoginPage;
use Objectify\Tenant\Pages\MainPage;
use Objectify\Tenant\Pages\ModuleMainPage;
use Objectify\Tenant\Pages\ModuleManagementPage;
use Objectify\Tenant\Pages\TenantPropertiesPage;
use Objectify\Tenant\Pages\TenantManagementPage;
use Objectify\Tenant\Pages\TenantModuleManagementPage;
use Objectify\Tenant\Pages\TenantObjectManagementPage;
use Objectify\Tenant\Pages\TenantObjectInstanceBrowsePage;
use Objectify\Tenant\Pages\DataCenterMainPage;
use Objectify\Tenant\Pages\DataCenterManagementPage;
use Objectify\Tenant\Pages\TenantObjectMethodManagementPage;
use Objectify\Tenant\Pages\ConfirmOperationPage;
use Objectify\Objects\DataCenter;
use Objectify\Objects\DataType;
use Objectify\Objects\PaymentPlan;
use Objectify\Objects\Tenant;
use Objectify\Objects\TenantObject;
use Objectify\Objects\TenantObjectMethod;
use Objectify\Objects\TenantObjectInstanceMethod;
use Objectify\Objects\TenantObjectInstanceProperty;
use Objectify\Objects\TenantStatus;
use Objectify\Objects\TenantType;
use Objectify\Objects\TenantObjectMethodParameterValue;
function IsConfigured()
{
if (!(
isset(System::$Configuration["Database.ServerName"]) &&
isset(System::$Configuration["Database.DatabaseName"]) &&
isset(System::$Configuration["Database.UserName"]) &&
isset(System::$Configuration["Database.Password"]) &&
isset(System::$Configuration["Database.TablePrefix"])
))
{
return false;
}
global $MySQL;
$query = "SHOW TABLES LIKE '" . System::$Configuration["Database.TablePrefix"] . "Tenants'";
$result = $MySQL->query($query);
if ($result->num_rows < 1) return false;
return true;
}
function CheckCredentials($admun, $admpw)
{
return ($admun == System::GetConfigurationValue("Administration.UserName") && $admpw == System::GetConfigurationValue("Administration.Password"));
}
function IsAdministrator()
{
if (!isset($_SESSION["admun"]) || !isset($_SESSION["admpw"])) return false;
$admun = $_SESSION["admun"];
$admpw = $_SESSION["admpw"];
return CheckCredentials($admun, $admpw);
}
System::$BeforeLaunchEventHandler = function($path)
{
if (!IsConfigured() && (!($path[0] == "setup")))
{
System::Redirect("~/setup");
return true;
}
if (!IsAdministrator() && (!($path[0] == "account" && $path[1] == "login.page")) && (!($path[0] == "setup")) && (!($path[0] == "favicon.ico")))
{
$path1 = implode("/", $path);
$_SESSION["LoginRedirectURL"] = "~/" . $path1;
System::Redirect("~/account/login.page");
return true;
}
return true;
};
System::$Modules[] = new Module("net.Objectify.TenantManager.Default", array
(
new ModulePage("", function($path)
{
$page = new WebPage();
$page->BeginContent();
$btng = new ButtonGroup("btng1");
$btng->Items[] = new ButtonGroupButton("btnDataCenters", "Data Centers", null, "~/Images/Buttons/DataCenters.png", "~/datacenter");
$btng->Items[] = new ButtonGroupButton("btnDataTypes", "Data Types", null, "~/Images/Buttons/DataTypes.png", "~/datatype");
$btng->Items[] = new ButtonGroupButton("btnTenantTypes", "Tenant Types", null, "~/Images/Buttons/TenantTypes.png", "~/tenanttype");
$btng->Items[] = new ButtonGroupButton("btnTenants", "Tenants", null, "~/Images/Buttons/Tenants.png", "~/tenant");
$btng->Items[] = new ButtonGroupButton("btnModules", "Modules", null, "~/Images/Buttons/Modules.png", "~/module");
$btng->Render();
$page->EndContent();
}),
new ModulePage("debug", function($path)
{
global $MySQL;
$page = new WebPage();
$page->BeginContent();
if (is_numeric($path[0]))
{
if ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["action"] == "delete")
{
$query = "DELETE FROM " . System::GetConfigurationValue("Database.TablePrefix") . "DebugMessages WHERE message_ID = " . $path[0];
$result = $MySQL->query($query);
System::Redirect("~/debug");
}
else
{
$query = "SELECT * FROM " . System::$Configuration["Database.TablePrefix"] . "DebugMessages WHERE message_ID = " . $path[0];
$result = $MySQL->query($query);
$values = $result->fetch_assoc();
echo("<h1>Error Details</h1>");
echo("<p>" . $values["message_Content"] . "</p>");
echo("<h2>Parameters</h2>");
echo("<table class=\"ListView\">");
$query1 = "SELECT * FROM " . System::$Configuration["Database.TablePrefix"] . "DebugMessageParameters WHERE mp_MessageID = " . $values["message_ID"];
$result1 = $MySQL->query($query1);
$count1 = $result1->num_rows;
echo("<tr>");
echo("<th>Name</th>");
echo("<th>Value</th>");
echo("</tr>");
for ($j = 0; $j < $count1; $j++)
{
$values1 = $result1->fetch_assoc();
echo("<tr>");
echo("<td>");
echo($values1["mp_Name"]);
echo("</td>");
echo("<td>");
echo($values1["mp_Value"]);
echo("</td>");
echo("</tr>");
}
echo("</table>");
echo("<h2>Backtrace</h2>");
echo("<table class=\"ListView\">");
$query1 = "SELECT * FROM " . System::$Configuration["Database.TablePrefix"] . "DebugMessageBacktraces WHERE bt_MessageID = " . $values["message_ID"];
$result1 = $MySQL->query($query1);
$count1 = $result1->num_rows;
echo("<tr>");
echo("<th>File name</th>");
echo("<th>Line number</th>");
echo("</tr>");
for ($j = 0; $j < $count1; $j++)
{
$values1 = $result1->fetch_assoc();
echo("<tr>");
echo("<td>");
echo($values1["bt_FileName"]);
echo("</td>");
echo("<td>");
echo($values1["bt_LineNumber"]);
echo("</td>");
echo("</tr>");
}
echo("</table>");
echo("<div class=\"Buttons\">");
echo("<form method=\"post\">");
echo("<input type=\"hidden\" name=\"action\" value=\"delete\" />");
echo("<input type=\"submit\" value=\"Delete Message\" />");
echo("<a class=\"Button\" href=\"" . System::ExpandRelativePath("~/debug") . "\">Back to Messages</a>");
echo("</form>");
echo("</div>");
}
}
else
{
if ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["action"] == "delete")
{
$query = "DELETE FROM " . System::GetConfigurationValue("Database.TablePrefix") . "DebugMessages";
$result = $MySQL->query($query);
System::Redirect("~/debug");
}
else
{
echo("<form method=\"post\">");
echo("<input type=\"hidden\" name=\"action\" value=\"delete\" />");
echo("<input type=\"submit\" value=\"Clear Messages\" />");
echo("</form>");
echo("<table class=\"ListView\">");
echo("<tr>");
echo("<th>Tenant</th>");
echo("<th>Severity</th>");
echo("<th>Message</th>");
echo("<th>Timestamp</th>");
echo("<th>IP Address</th>");
echo("</tr>");
$query = "SELECT * FROM " . System::$Configuration["Database.TablePrefix"] . "DebugMessages";
$result = $MySQL->query($query);
$count = $result->num_rows;
for ($i = 0; $i < $count; $i++)
{
$values = $result->fetch_assoc();
echo("<tr>");
echo("<td>");
$tenant = Tenant::GetByID($values["message_TenantID"]);
if ($tenant != null)
{
echo("<a href=\"" . System::ExpandRelativePath("~/tenant/manage/" . $tenant->URL . "/") . "\">" . $tenant->URL . "</a>");
}
echo("</td>");
echo("<td>");
switch ($values["message_SeverityID"])
{
}
echo("</td>");
echo("<td>");
echo("<a href=\"" . System::ExpandRelativePath("~/debug/" . $values["message_ID"]) . "\">");
echo($values["message_Content"]);
echo("</a>");
echo("</td>");
echo("<td>");
echo($values["message_Timestamp"]);
echo("</td>");
echo("<td>");
echo($values["message_IPAddress"]);
echo("</td>");
echo("</tr>");
}
echo("</table>");
}
}
$page->EndContent();
return true;
}),
new ModulePage("account", array
(
new ModulePage("login.page", function($path)
{
$page = new LoginPage();
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if (isset($_POST["user_LoginID"]) && isset($_POST["user_Password"]))
{
$admun = $_POST["user_LoginID"];
$admpw = $_POST["user_Password"];
if (CheckCredentials($admun, $admpw))
{
$_SESSION["admun"] = $admun;
$_SESSION["admpw"] = $admpw;
if (isset($_SESSION["LoginRedirectURL"]))
{
System::Redirect($_SESSION["LoginRedirectURL"]);
}
else
{
System::Redirect("~/");
}
return true;
}
else
{
$page->InvalidCredentials = true;
}
}
}
$page->Render();
return true;
}),
new ModulePage("logout.page", function($path)
{
$_SESSION["admun"] = null;
$_SESSION["admpw"] = null;
System::Redirect("~/");
return true;
})
)),
new ModulePage("tenant", array
(
new ModulePage("", function($path)
{
$page = new MainPage();
$page->Render();
return true;
}),
new ModulePage("create", function($path)
{
if ($_SERVER["REQUEST_METHOD"] === "POST")
{
$tenant_URL = $_POST["tenant_URL"];
$tenant_Description = $_POST["tenant_Description"];
$tenant_DataCenters = array();
foreach ($_POST as $key => $value)
{
if (substr($key, 0, strlen("tenant_DataCenter_")) == "tenant_DataCenter_")
{
$id = substr($key, strlen("tenant_DataCenter_") + 1);
$tenant_DataCenters[] = DataCenter::GetByID($id);
}
}
$tenant_Status = ($_POST["tenant_Status"] == 1 ? TenantStatus::Enabled : TenantStatus::Disabled);
$tenant_Type = TenantType::GetByID($_POST["tenant_TypeID"]);
$tenant_PaymentPlan = PaymentPlan::GetByID($_POST["tenant_PaymentPlanID"]);
$tenant_BeginTimestamp = ($_POST["tenant_BeginTimestampValid"] == "1" ? null : $_POST["tenant_BeginTimestamp"]);
$tenant_EndTimestamp = ($_POST["tenant_EndTimestampValid"] == "1" ? null : $_POST["tenant_EndTimestamp"]);
$retval = Tenant::Create($tenant_URL, $tenant_Description, $tenant_Status, $tenant_Type, $tenant_PaymentPlan, $tenant_BeginTimestamp, $tenant_EndTimestamp, $tenant_DataCenters);
if ($retval == null)
{
global $MySQL;
echo($MySQL->error . " (" . $MySQL->errno . ")");
}
else
{
System::Redirect("~/tenant");
}
}
else
{
$page = new TenantPropertiesPage();
$page->Render();
return true;
}
}),
new ModulePage("modify", function($path)
{
if ($_SERVER["REQUEST_METHOD"] === "POST")
{
$tenant_URL = $_POST["tenant_URL"];
$tenant = Tenant::GetByURL($path[0]);
$tenant->URL = $_POST["tenant_URL"];
$tenant->Description = $_POST["tenant_Description"];
$tenant->Status = ($_POST["tenant_Status"] == 1 ? TenantStatus::Enabled : TenantStatus::Disabled);
$tenant->Type = TenantType::GetByID($_POST["tenant_TypeID"]);
$tenant->PaymentPlan = PaymentPlan::GetByID($_POST["tenant_PaymentPlanID"]);
$tenant->BeginTimestamp = ($_POST["tenant_BeginTimestampValid"] == "1" ? null : $_POST["tenant_BeginTimestamp"]);
$tenant->EndTimestamp = ($_POST["tenant_EndTimestampValid"] == "1" ? null : $_POST["tenant_EndTimestamp"]);
$retval = $tenant->Update();
if (!$retval)
{
global $MySQL;
echo($MySQL->error . " (" . $MySQL->errno . ")");
}
else
{
System::Redirect("~/tenant");
}
return true;
}
else
{
$page = new TenantPropertiesPage();
$page->Tenant = Tenant::GetByURL($path[0]);
$page->Render();
return true;
}
}),
new ModulePage("clone", function($path)
{
if ($_SERVER["REQUEST_METHOD"] === "POST")
{
$tenant_URL = $_POST["tenant_URL"];
$tenant_Description = $_POST["tenant_Description"];
$tenant_Status = ($_POST["tenant_Status"] == 1 ? TenantStatus::Enabled : TenantStatus::Disabled);
$tenant_Type = TenantType::GetByID($_POST["tenant_TypeID"]);
$tenant_PaymentPlan = PaymentPlan::GetByID($_POST["tenant_PaymentPlanID"]);
$tenant_BeginTimestamp = ($_POST["tenant_BeginTimestampValid"] == "1" ? null : $_POST["tenant_BeginTimestamp"]);
$tenant_EndTimestamp = ($_POST["tenant_EndTimestampValid"] == "1" ? null : $_POST["tenant_EndTimestamp"]);
$retval = Tenant::Create($tenant_URL, $tenant_Description, $tenant_Status, $tenant_Type, $tenant_PaymentPlan, $tenant_BeginTimestamp, $tenant_EndTimestamp);
if ($retval == null)
{
global $MySQL;
echo($MySQL->error . " (" . $MySQL->errno . ")");
}
else
{
System::Redirect("~/tenant");
}
}
else
{
$page = new TenantPropertiesPage();
$page->Tenant = Tenant::GetByURL($path[0]);
$page->Render();
return true;
}
}),
new ModulePage("delete", function($path)
{
if ($_SERVER["REQUEST_METHOD"] === "POST")
{
if ($_POST["Confirm"] == "1")
{
$tenant = Tenant::GetByURL($path[0]);
if ($tenant->Delete())
{
System::Redirect("~/tenant");
}
else
{
global $MySQL;
echo($MySQL->error . " (" . $MySQL->errno . ")");
}
}
}
else
{
$page = new ConfirmOperationPage();
$page->ReturnButtonURL = "~/tenant";
$page->Message = "Are you sure you want to delete the tenant '" . $path[0] . "'? This action cannot be undone, and will destroy any and all data associated with that tenant.";
$page->Render();
return true;
}
}),
new ModulePage("manage", function($path)
{
if ($path[1] == "")
{
$tenant = Tenant::GetByURL($path[0]);
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$properties = $tenant->GetProperties();
foreach ($properties as $property)
{
$tenant->SetPropertyValue($property, $_POST["Property_" . $property->ID]);
}
System::Redirect("~/tenant/manage/" . $path[0]);
return true;
}
else
{
$page = new TenantManagementPage();
$page->Tenant = $tenant;
$page->Render();
return true;
}
}
else
{
switch ($path[1])
{
case "modules":
{
$page = new TenantModuleManagementPage();
$page->Tenant = Tenant::GetByURL($path[0]);
$page->Module = \Objectify\Objects\Module::GetByID($path[2]);
$page->Render();
break;
}
case "objects":
{
if ($path[2] == "")
{
// $page = new TenantObjectBrowsePage();
// $page->CurrentTenant = Tenant::GetByURL($path[0]);
// $page->Render();
}
else
{
switch ($path[3])
{
case "instances":
{
switch ($path[4])
{
case "":
{
$tenant = Tenant::GetByURL($path[0]);
$object = TenantObject::GetByID($path[2]);
$page = new TenantObjectInstanceBrowsePage();
$page->CurrentTenant = $tenant;
$page->CurrentObject = $object;
$page->Render();
break;
}
}
}
case "methods":
{
switch ($path[4])
{
case "static":
{
$tenant = Tenant::GetByURL($path[0]);
$object = TenantObject::GetByID($path[2]);
$method = TenantObjectMethod::GetByID($path[5]);
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$method->CodeBlob = $_POST["method_CodeBlob"];
$method->Update();
System::Redirect("~/tenant/manage/" . $tenant->URL . "/objects/" . $object->ID);
return true;
}
$page = new TenantObjectMethodManagementPage();
$page->CurrentTenant = $tenant;
$page->CurrentObject = $object;
$page->CurrentMethod = $method;
$page->Render();
break;
}
case "instance":
{
$page = new TenantObjectMethodManagementPage();
$page->CurrentTenant = Tenant::GetByURL($path[0]);
$page->CurrentObject = TenantObject::GetByID($path[2]);
$page->CurrentMethod = TenantObjectInstanceMethod::GetByID($path[5]);
$page->Render();
break;
}
}
break;
}
case "":
{
$tenant = Tenant::GetByURL($path[0]);
$object = TenantObject::GetByID($path[2]);
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$count = $_POST["InstanceProperty_NewPropertyCount"];
for ($i = $count; $i > 0; $i--)
{
$name = $_POST["InstanceProperty_" . $i . "_Name"];
$dataType = DataType::GetByID($_POST["InstanceProperty_" . $i . "_DataTypeID"]);
$defaultValue = $_POST["InstanceProperty_" . $i . "_DefaultValue"];
$object->CreateInstanceProperty(new TenantObjectInstanceProperty($name, $dataType, $defaultValue));
}
System::Redirect("~/tenant/manage/" . $tenant->URL . "/objects/" . $object->ID);
return true;
}
else
{
$page = new TenantObjectManagementPage();
$page->CurrentTenant = $tenant;
$page->CurrentObject = $object;
$page->Render();
}
break;
}
}
}
break;
}
}
}
return true;
}),
new ModulePage("launch", function($path)
{
$tenant = Tenant::GetByURL($path[0]);
header("Location: http://" . $tenant->DataCenters->Items[0]->HostName . "/" . $tenant->URL);
})
)),
new ModulePage("module", array
(
new ModulePage("", function($path)
{
$page = new ModuleMainPage();
$page->Render();
return true;
}),
new ModulePage("modify", function($path)
{
$module = \Objectify\Objects\Module::GetByID($path[0], true);
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$module->Title = $_POST["module_Title"];
$module->Description = $_POST["module_Description"];
$module->Update();
System::Redirect("~/module/modify/" . $path[0]);
}
else
{
$page = new ModuleManagementPage();
$page->Module = $module;
$page->Render();
}
return true;
})
)),
new ModulePage("datacenter", array
(
new ModulePage("", function($path)
{
$page = new DataCenterMainPage();
$page->Render();
return true;
}),
new ModulePage("create", function($path)
{
$datacenter = new DataCenter();
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$datacenter->Title = $_POST["datacenter_Title"];
$datacenter->Description = $_POST["datacenter_Description"];
$datacenter->HostName = $_POST["datacenter_HostName"];
$datacenter->Update();
System::Redirect("~/datacenter");
}
else
{
$page = new DataCenterManagementPage();
$page->DataCenter = null;
$page->Render();
}
return true;
}),
new ModulePage("modify", function($path)
{
$datacenter = DataCenter::GetByID($path[0]);
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$datacenter->Title = $_POST["datacenter_Title"];
$datacenter->Description = $_POST["datacenter_Description"];
$datacenter->HostName = $_POST["datacenter_HostName"];
$datacenter->Update();
System::Redirect("~/datacenter/modify/" . $path[0]);
}
else
{
$page = new DataCenterManagementPage();
$page->DataCenter = $datacenter;
$page->Render();
}
return true;
})
))
));
?>