415 lines
13 KiB
PHP
415 lines
13 KiB
PHP
<?php
|
|
namespace fox;
|
|
|
|
|
|
/**
|
|
*
|
|
* Class fox\moduleInfo
|
|
*
|
|
* @copyright MX STAR LLC 2021
|
|
* @version 4.0.0
|
|
* @author Pavel Dmitriev
|
|
* @license GPLv3
|
|
*
|
|
*/
|
|
|
|
|
|
class moduleInfo extends baseClass implements externalCallable
|
|
{
|
|
|
|
protected $id;
|
|
|
|
public string $name = "";
|
|
|
|
public string $namespace = "";
|
|
|
|
public string $instanceOf = "";
|
|
|
|
public string $title = "";
|
|
|
|
public array $features = [];
|
|
|
|
public array $themes=[];
|
|
|
|
public bool $enabled = true;
|
|
|
|
public string $modVersion = "1.0.0";
|
|
|
|
public ?string $modBuild=null;
|
|
|
|
public string $modPriority = "9999";
|
|
|
|
public time $installDate;
|
|
|
|
public time $updateDate;
|
|
|
|
public bool $singleInstanceOnly = true;
|
|
|
|
public bool $isTemplate = false;
|
|
|
|
public bool $authRequired = true;
|
|
|
|
protected $__template=null;
|
|
|
|
public array $ACLRules = [];
|
|
|
|
public array $menuItem = [];
|
|
|
|
public $globalAccessKey = "isRoot";
|
|
|
|
public array $languages = [];
|
|
public array $configKeys=[];
|
|
|
|
public static $sqlTable = "tblModules";
|
|
|
|
public static $sqlIdx = "id";
|
|
|
|
public static $allowDeleteFromDB = true;
|
|
|
|
public static $sqlColumns = [
|
|
"enabled" => [
|
|
"type" => "INT",
|
|
"index" => "INDEX"
|
|
],
|
|
"modBuild"=> [
|
|
"type"=>"VARCHAR(255)",
|
|
],
|
|
"singleInstanceOnly" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"isTemplate" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"authRequired" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"ACLRules" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"menuItem" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"globalAccessKey" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"authRequired" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"namespace" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"languages" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"template" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"configKeys" => [
|
|
"type" => "SKIP"
|
|
],
|
|
"themes" => [
|
|
"type" => "SKIP"
|
|
]
|
|
];
|
|
|
|
|
|
protected static $excludeProps=[];
|
|
|
|
protected function fillFromRow($row)
|
|
{
|
|
|
|
$rv=parent::fillFromRow($row);
|
|
|
|
if (!$this->isTemplate && $this->template) {
|
|
$this->ACLRules = (array) $this->template->ACLRules;
|
|
$this->menuItem = (array) $this->template->menuItem;
|
|
$this->globalAccessKey = $this->template->globalAccessKey;
|
|
$this->authRequired = $this->template->authRequired;
|
|
$this->namespace = $this->template->namespace;
|
|
$this->languages = $this->template->languages;
|
|
$this->configKeys= $this->template->configKeys;
|
|
$this->themes=$this->template->themes;
|
|
}
|
|
return $rv;
|
|
}
|
|
|
|
|
|
|
|
public function __get($key) {
|
|
|
|
switch ($key) {
|
|
case "template":
|
|
if (empty($this->__template)) {
|
|
$allMods=modules::list();
|
|
if (array_key_exists($this->instanceOf, $allMods)) {
|
|
$this->__template=$allMods[$this->instanceOf];
|
|
}
|
|
}
|
|
return $this->__template;
|
|
default:
|
|
return parent::__get($key);
|
|
}
|
|
}
|
|
|
|
public function __set($key, $val) {
|
|
switch ($key) {
|
|
case "template":
|
|
if ($val instanceof moduleInfo) {
|
|
$this->__template=$val;
|
|
} else {
|
|
throw new foxException("Invalid type");
|
|
}
|
|
break;
|
|
default:
|
|
return parent::__set($key, $val);
|
|
}
|
|
}
|
|
|
|
public function __xConstruct()
|
|
{
|
|
$this->installDate = new time();
|
|
$this->updateDate = new time();
|
|
}
|
|
|
|
public function save()
|
|
{
|
|
if ($this->installDate->isNull()) {
|
|
$this->installDate = new time(time());
|
|
}
|
|
if ($this->updateDate->isNull()) {
|
|
$this->updateDate = new time(time());
|
|
}
|
|
if ($this->isTemplate && empty($this->instanceOf)) {
|
|
$this->instanceOf = $this->name;
|
|
}
|
|
|
|
parent::save();
|
|
$this->flushCache();
|
|
}
|
|
|
|
public function delete()
|
|
{
|
|
parent::delete();
|
|
$this->flushCache();
|
|
}
|
|
|
|
protected function flushCache()
|
|
{
|
|
$cache = new cache();
|
|
$cache->set("modules", null);
|
|
}
|
|
|
|
public static function getAll()
|
|
{
|
|
$cache = new cache();
|
|
$mods = $cache->get("modules");
|
|
if ($mods !== null) {
|
|
$rv = [];
|
|
foreach ($mods as $mod) {
|
|
$rv[$mod->name] = new self((array) $mod);
|
|
}
|
|
return $rv;
|
|
}
|
|
|
|
$mods = modules::list();
|
|
$m = new static();
|
|
$sql = $m->getSql();
|
|
$res = $sql->quickExec($m->__sqlSelectTemplate." order by `modPriority`");
|
|
$rv = [];
|
|
while ($row = mysqli_fetch_assoc($res)) {
|
|
if (array_key_exists($row["instanceOf"], $mods)) {
|
|
$x = new static($row);
|
|
|
|
$rv[$row["name"]] = $x;
|
|
|
|
}
|
|
}
|
|
$cache->set("modules", $rv);
|
|
return $rv;
|
|
}
|
|
|
|
public static function getByInstance(string $modInstanceName) : moduleInfo {
|
|
$modsInstalled = moduleInfo::getAll();
|
|
if (! array_key_exists($modInstanceName, $modsInstalled)) {
|
|
throw new foxException("Module not installed", 404);
|
|
}
|
|
|
|
return $modsInstalled[$modInstanceName];
|
|
}
|
|
|
|
public static function getByFeature(string $feature) {
|
|
$rv=[];
|
|
foreach(moduleInfo::getAll() as $mod) {
|
|
if (array_search($feature, $mod->features) !==false) {
|
|
$rv[]=$mod;
|
|
}
|
|
}
|
|
|
|
return $rv;
|
|
}
|
|
|
|
public function getInstances()
|
|
{
|
|
if (! $this->isTemplate) {
|
|
return null;
|
|
}
|
|
|
|
$this->checkSql();
|
|
$res = $this->sql->quickExec($this->__sqlSelectTemplate . " where `i`.`instanceOf` = '" . $this->name . "'");
|
|
|
|
$rv = [];
|
|
while ($row = mysqli_fetch_assoc($res)) {
|
|
$rv[] = new self($row);
|
|
}
|
|
return $rv;
|
|
}
|
|
|
|
public static function load(string $modName)
|
|
{}
|
|
|
|
public function newClass() {
|
|
$ref=$this->namespace.'\module';
|
|
return new $ref();
|
|
}
|
|
|
|
public function export() {
|
|
$rv=parent::export();
|
|
if ($this->isTemplate) {
|
|
$rv["instances"]=$this->getInstances();
|
|
$rv["instancesCount"]=count($rv["instances"]);
|
|
}
|
|
|
|
return $rv;
|
|
}
|
|
|
|
public static function APICall(request $request) {
|
|
if (! $request->user->checkAccess("adminModulesInstall", "core")) {
|
|
throw new foxException("Forbidden", 403);
|
|
}
|
|
|
|
switch ($request->method) {
|
|
case "GET":
|
|
if (! $request->user->checkAccess("adminModulesInstall", "core")) {
|
|
throw new foxException("Forbidden", 403);
|
|
}
|
|
|
|
$modInstanceName = common::clearInput($request->function, "0-9a-zA-Z._-");
|
|
$modsInstalled = static::getAll();
|
|
if (! array_key_exists($modInstanceName, $modsInstalled)) {
|
|
throw new foxException("Module not installed", 404);
|
|
}
|
|
|
|
$mod=$modsInstalled[$modInstanceName];
|
|
if (empty($request->parameters[0])) {
|
|
return $mod;
|
|
}
|
|
|
|
switch ($request->parameters[0]) {
|
|
case "features":
|
|
$rv=[];
|
|
foreach($mod->template->features as $fx) {
|
|
$rv[$fx]=(array_search($fx, $mod->features)===false)?false:true;
|
|
}
|
|
return $rv;
|
|
break;
|
|
|
|
case "config":
|
|
$rv=[
|
|
"values"=>config::getAll($mod->name),
|
|
"keys"=>$mod->configKeys,
|
|
];
|
|
return $rv;
|
|
break;
|
|
default:
|
|
throw new foxException("Method not allowed",405);
|
|
|
|
}
|
|
break;
|
|
|
|
case "DELETE":
|
|
if (! $request->user->checkAccess("adminModulesInstall", "core")) {
|
|
throw new foxException("Forbidden", 403);
|
|
}
|
|
|
|
$modInstanceName = common::clearInput($request->function, "0-9a-zA-Z._-");
|
|
$modsInstalled = static::getAll();
|
|
if (! array_key_exists($modInstanceName, $modsInstalled)) {
|
|
throw new foxException("Module not installed", 404);
|
|
}
|
|
|
|
$mod = $modsInstalled[$modInstanceName];
|
|
|
|
if (empty($request->parameters[0])) {
|
|
$mod->delete();
|
|
static::log($request->instance,__FUNCTION__, "Module ".$mod->name." deleted",$request->user);
|
|
foxRequestResult::throw(200, "Deleted");
|
|
}
|
|
|
|
switch ($request->parameters[0]) {
|
|
case "features":
|
|
$idx = array_search(common::clearInput($request->requestBody->feature),$mod->features);
|
|
if ($idx !==false) {
|
|
unset($mod->features[$idx]);
|
|
$mod->features=array_values($mod->features);
|
|
$mod->save();
|
|
static::log($request->instance,__FUNCTION__, "feature ".common::clearInput($request->requestBody->feature)." deleted from module ".$mod->name,$request->user);
|
|
foxRequestResult::throw(200, "Deleted");
|
|
}
|
|
break;
|
|
|
|
case "config":
|
|
config::del(common::clearInput($request->requestBody->key), $mod->name);
|
|
static::log($request->instance,__FUNCTION__, "config key ".common::clearInput($request->requestBody->key)." deleted from module ".$mod->name,$request->user);
|
|
foxRequestResult::throw(200, "Deleted");
|
|
break;
|
|
default:
|
|
throw new foxException("Method not allowed",405);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "PUT":
|
|
if (! $request->user->checkAccess("adminModulesInstall", "core")) {
|
|
throw new foxException("Forbidden", 403);
|
|
}
|
|
|
|
$modInstanceName = common::clearInput($request->function, "0-9a-zA-Z._-");
|
|
$modsInstalled = static::getAll();
|
|
if (! array_key_exists($modInstanceName, $modsInstalled)) {
|
|
throw new foxException("Module not installed", 404);
|
|
}
|
|
|
|
$mod = $modsInstalled[$modInstanceName];
|
|
|
|
switch ($request->parameters[0]) {
|
|
case "features":
|
|
$idx = array_search(common::clearInput($request->requestBody->feature),$mod->features);
|
|
if ($idx ===false && array_search(common::clearInput($request->requestBody->feature),$mod->template->features) !== false) {
|
|
$mod->features[]=common::clearInput($request->requestBody->feature);
|
|
$mod->features=array_values($mod->features);
|
|
$mod->save();
|
|
static::log($request->instance,__FUNCTION__, "feature ".common::clearInput($request->requestBody->feature)." set for module ".$mod->name,$request->user,"module",$mod->id,null,logEntry::sevInfo);
|
|
foxRequestResult::throw(201, "Created");
|
|
}
|
|
foxRequestResult::throw(201, "Created");
|
|
break;
|
|
|
|
case "config":
|
|
config::set(common::clearInput($request->requestBody->key), $request->requestBody->value, $mod->name);
|
|
static::log($request->instance,__FUNCTION__, "config key ".common::clearInput($request->requestBody->key)." set for module ".$mod->name,$request->user,"module",$mod->id,null,logEntry::sevInfo);
|
|
foxRequestResult::throw(201, "Created");
|
|
break;
|
|
default:
|
|
throw new foxException("Method not allowed",405);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
throw new foxException("Method not allowed",405);
|
|
}
|
|
}
|
|
}
|
|
?>
|