id; } public function getStatus() { return $this->status; } public function getObject_data() { return $this->object_data; } public function getPluginVersion() { return $this->pluginVersion; } public function getName() { return $this->name; } public function setId($id) { $this->id = $id; } public function setStatus($status) { $this->status = $status; } public function setObject_data($object_data) { $this->object_data = $object_data; } public function setName($name) { $name = preg_replace("/[^A-Za-z0-9 _-]/", '', $name); $this->name = $name; } public function getUuid() { return $this->uuid; } public function getDirName() { return $this->dirName; } public function setUuid($uuid) { $this->uuid = $uuid; $this->loadFromUUID($uuid); } public function setDirName($dirName) { $dirName = preg_replace("/[^A-Za-z0-9 _-]/", '', $dirName); $this->dirName = $dirName; } public function setPluginversion($pluginversion) { $this->pluginversion = $pluginversion; } public static function setCurrentVersionByUuid($uuid, $currentVersion) { _error_log("plugin::setCurrentVersionByUuid $uuid, $currentVersion"); $p = static::getPluginByUUID($uuid); if (!$p) { _error_log("plugin::setCurrentVersionByUuid error on get plugin"); return false; } //pluginversion isn't an object property so we must explicity update it using this function $sql = "update " . static::getTableName() . " set pluginversion='$currentVersion' where uuid='$uuid'"; $name = "plugin$uuid"; ObjectYPT::deleteCache($name); $res = sqlDal::writeSql($sql); } public static function getCurrentVersionByUuid($uuid) { $p = static::getPluginByUUID($uuid); if (!$p) { return false; } //pluginversion isn't an object property so we must explicity update it using this function $sql = "SELECT pluginversion FROM " . static::getTableName() . " WHERE uuid=? LIMIT 1 "; $res = sqlDAL::readSql($sql, "s", [$uuid]); $data = sqlDAL::fetchAssoc($res); sqlDAL::close($res); if (!empty($data)) { return $data['pluginversion']; } return false; } public static function getPluginByName($name) { global $global, $getPluginByName; if (empty($getPluginByName)) { $getPluginByName = []; } if (empty($getPluginByName[$name])) { $sql = "SELECT * FROM " . static::getTableName() . " WHERE name = ? LIMIT 1"; $res = sqlDAL::readSql($sql, "s", [$name], true); $data = sqlDAL::fetchAssoc($res); sqlDAL::close($res); if (!empty($data)) { $getPluginByName[$name] = $data; } else { $getPluginByName[$name] = false; } } return $getPluginByName[$name]; } public static function getPluginByUUID($uuid) { global $global, $getPluginByUUID, $pluginJustInstalled; $name = "plugin$uuid"; if (!isset($getPluginByUUID)) { $getPluginByUUID = []; } if (!isset($pluginJustInstalled)) { $pluginJustInstalled = []; } if (empty($getPluginByUUID[$uuid])) { $sql = "SELECT * FROM " . static::getTableName() . " WHERE uuid = ? LIMIT 1"; $res = sqlDAL::readSql($sql, "s", [$uuid]); $data = sqlDAL::fetchAssoc($res); sqlDAL::close($res); if (!empty($data)) { if (empty($data['pluginversion'])) { $data['pluginversion'] = "1.0"; } if (AVideoPlugin::isPluginOnByDefault($uuid)) { $data['status'] = 'active'; } $getPluginByUUID[$uuid] = $data; } else { $name = AVideoPlugin::getPluginsNameOnByDefaultFromUUID($uuid); if ($name !== false && empty($pluginJustInstalled[$uuid])) { $pluginJustInstalled[$uuid] = 1; _error_log("plugin::getPluginByUUID {$name} {$uuid} this plugin is On By Default we will install it ($sql)"); self::deleteByUUID($uuid); self::deleteByName($name); unset($getPluginByUUID[$uuid]); $getPluginByUUID[$uuid] = self::getOrCreatePluginByName($name, 'active'); } else { $getPluginByUUID[$uuid] = false; } } } return $getPluginByUUID[$uuid]; } public function loadFromUUID($uuid) { $uuid = preg_replace("/[^A-Za-z0-9 _-]/", '', $uuid); $this->uuid = $uuid; $row = static::getPluginByUUID($uuid); if (!empty($row)) { $this->load($row['id']); } } public static function isEnabledByName($name) { $row = static::getPluginByName($name); if ($row) { return $row['status'] == 'active' && AVideoPlugin::isPluginTablesInstalled($name, true); } return false; } public static function isEnabledByUUID($uuid) { $row = static::getPluginByUUID($uuid); if ($row) { return $row['status'] == 'active' && AVideoPlugin::isPluginTablesInstalled($row['name'], true); } return false; } public static function getAvailablePlugins($comparePluginVersion = false) { global $global, $getAvailablePlugins; $pluginsMarketplace = []; if ($comparePluginVersion) { $pluginsMarketplace = ObjectYPT::getSessionCache('getAvailablePlugins', 600); // 10 min cache if (empty($pluginsMarketplace)) { $pluginsMarketplace = _json_decode(url_get_contents("https://tutorials.avideo.com/info?version=1", "", 2)); if (!empty($pluginsMarketplace)) { ObjectYPT::setSessionCache('getAvailablePlugins', $pluginsMarketplace); } } } if (empty($getAvailablePlugins)) { $dir = $global['systemRootPath'] . "plugin"; $getAvailablePlugins = []; $cdir = scandir($dir); foreach ($cdir as $key => $value) { if (!in_array($value, [".", ".."])) { if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) { $p = AVideoPlugin::loadPlugin($value); if (!is_object($p) || $p->hidePlugin()) { if ($value !== "Statistics") { // avoid error while this plugin is not ready _error_log("Plugin Not Found: {$value}"); } continue; } $obj = new stdClass(); $obj->name = $p->getName(); $obj->dir = $value; $obj->uuid = $p->getUUID(); $obj->description = $p->getDescription(); $obj->installedPlugin = static::getPluginByUUID($obj->uuid); $obj->enabled = (!empty($obj->installedPlugin['status']) && $obj->installedPlugin['status'] === "active") ? true : false; $obj->id = (!empty($obj->installedPlugin['id'])) ? $obj->installedPlugin['id'] : 0; $obj->data_object = $p->getDataObject(); $obj->data_object_helper = $p->getDataObjectHelper(); $obj->databaseScript = !empty(static::getDatabaseFile($value)); $obj->pluginMenu = $p->getPluginMenu(); $obj->tags = $p->getTags(); $obj->pluginversion = $p->getPluginVersion(); $obj->pluginversionMarketPlace = (!empty($pluginsMarketplace->plugins->{$obj->uuid}) ? $pluginsMarketplace->plugins->{$obj->uuid}->pluginversion : 0); $obj->pluginversionCompare = (!empty($obj->pluginversionMarketPlace) ? version_compare($obj->pluginversion, $obj->pluginversionMarketPlace) : 0); $obj->permissions = $obj->enabled ? Permissions::getPluginPermissions($obj->id) : []; if (User::isAdmin()) { $obj->isPluginTablesInstalled = AVideoPlugin::isPluginTablesInstalled($obj->name, false); } if ($obj->pluginversionCompare < 0) { $obj->tags[] = "update"; } $getAvailablePlugins[] = $obj; } } } } return $getAvailablePlugins; } public static function getAvailablePluginsBasic() { global $global, $getAvailablePlugins; if (empty($getAvailablePlugins)) { $dir = $global['systemRootPath'] . "plugin"; $getAvailablePlugins = []; $cdir = scandir($dir); foreach ($cdir as $key => $value) { if (!in_array($value, [".", ".."])) { if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) { $p = AVideoPlugin::loadPlugin($value); if (!is_object($p) || $p->hidePlugin()) { if ($value !== "Statistics") { // avoid error while this plugin is not ready _error_log("Plugin Not Found: {$value}"); } continue; } $row = self::getPluginByUUID($p->getUUID()); $obj = new stdClass(); $obj->name = $p->getName(); $obj->pluginversion = $p->getPluginVersion(); $obj->status = $row['status']; $pinfoFile = $dir . DIRECTORY_SEPARATOR . $value . DIRECTORY_SEPARATOR . 'pinfo.json'; if (file_exists($pinfoFile)) { $obj->pinfo = json_decode(file_get_contents($pinfoFile)); } else { $obj->pinfo = false; } $getAvailablePlugins[$p->getUUID()] = $obj; } } } } return $getAvailablePlugins; } public static function getDatabaseFile($pluginName) { $filename = static::getDatabaseFileName($pluginName); if (!$filename) { return false; } return url_get_contents($filename); } public static function getDatabaseFileName($pluginName) { global $global; $pluginName = AVideoPlugin::fixName($pluginName); $dir = $global['systemRootPath'] . "plugin"; $filename = $dir . DIRECTORY_SEPARATOR . $pluginName . DIRECTORY_SEPARATOR . "install" . DIRECTORY_SEPARATOR . "install.sql"; if (!file_exists($filename)) { return false; } return $filename; } public static function getAllEnabled($try = 0) { global $global, $getAllEnabledRows; if (empty($getAllEnabledRows)) { $sql = "SELECT * FROM " . static::getTableName() . " WHERE status='active' "; $defaultEnabledUUIDs = AVideoPlugin::getPluginsOnByDefault(true); $defaultEnabledNames = AVideoPlugin::getPluginsOnByDefault(false); $sql .= " OR uuid IN ('" . implode("','", $defaultEnabledUUIDs) . "')"; $res = sqlDAL::readSql($sql); $fullData = sqlDAL::fetchAllAssoc($res); sqlDAL::close($res); $getAllEnabledRows = []; foreach ($fullData as $row) { $getAllEnabledRows[] = $row; if (($key = array_search($row['uuid'], $defaultEnabledUUIDs)) !== false) { unset($defaultEnabledUUIDs[$key], $defaultEnabledNames[$key]); } } $addedNewPlugin = false; foreach ($defaultEnabledUUIDs as $key => $value) { $obj = new Plugin(0); $obj->loadFromUUID($defaultEnabledUUIDs[$key]); $obj->setName($defaultEnabledNames[$key]); $obj->setDirName($defaultEnabledNames[$key]); $obj->setStatus("active"); if ($obj->save()) { $addedNewPlugin = true; } } if ($addedNewPlugin && empty($try)) { //ObjectYPT::deleteALLCache(); return self::getAllEnabled(1); } uasort($getAllEnabledRows, 'cmpPlugin'); } return $getAllEnabledRows; } public static function getAllDisabled() { global $global, $getAllDisabledRows; if (empty($getAllDisabledRows)) { $sql = "SELECT * FROM " . static::getTableName() . " WHERE status='inactive' "; $res = sqlDAL::readSql($sql); $fullData = sqlDAL::fetchAllAssoc($res); sqlDAL::close($res); $getAllDisabledRows = []; foreach ($fullData as $row) { $getAllDisabledRows[] = $row; } uasort($getAllDisabledRows, 'cmpPlugin'); } return $getAllDisabledRows; } public static function getEnabled($uuid) { global $global, $getEnabled; if (empty($getEnabled)) { $getEnabled = []; } if (in_array($uuid, AVideoPlugin::getPluginsOnByDefault())) { // make sure the OnByDefault plugins are enabled return self::getOrCreatePluginByName(AVideoPlugin::getPluginsNameOnByDefaultFromUUID($uuid)); } if (empty($getEnabled[$uuid])) { $getEnabled[$uuid] = []; $sql = "SELECT * FROM " . static::getTableName() . " WHERE status='active' AND uuid = '" . $uuid . "' ;"; $res = sqlDAL::readSql($sql); $pluginRows = sqlDAL::fetchAllAssoc($res); sqlDAL::close($res); if ($pluginRows !== false) { foreach ($pluginRows as $row) { $getEnabled[$uuid][] = $row; } } } return $getEnabled[$uuid]; } public static function deleteByUUID($uuid) { global $global; $uuid = $global['mysqli']->real_escape_string($uuid); if (!empty($uuid)) { _error_log("Plugin:deleteByUUID {$uuid}"); $sql = "DELETE FROM " . static::getTableName() . " "; $sql .= " WHERE uuid = ?"; $global['lastQuery'] = $sql; //_error_log("Delete Query: ".$sql); return sqlDAL::writeSql($sql, "s", [$uuid]); } return false; } public static function deleteByName($name) { global $global; $name = $global['mysqli']->real_escape_string($name); if (!empty($name)) { _error_log("Plugin:deleteByName {$name}"); $sql = "DELETE FROM " . static::getTableName() . " "; $sql .= " WHERE name = ?"; $global['lastQuery'] = $sql; //_error_log("Delete Query: ".$sql); return sqlDAL::writeSql($sql, "s", [$name]); } return false; } public static function getOrCreatePluginByName($name, $statusIfCreate = 'inactive') { global $global; if (self::getPluginByName($name) === false) { $pluginFile = $global['systemRootPath'] . "plugin/{$name}/{$name}.php"; if (file_exists($pluginFile)) { require_once $pluginFile; $code = "\$p = new {$name}();"; eval($code); $plugin = new Plugin(0); $plugin->setUuid($p->getUUID()); $plugin->setDirName($name); $plugin->setName($name); $plugin->setObject_data(json_encode($p->getDataObject())); $plugin->setStatus($statusIfCreate); $plugin->setPluginversion($p->getPluginVersion()); $plugin->save(); } } return self::getPluginByName($name); } public function save() { if (empty($this->uuid)) { return false; } global $global; $this->object_data = $global['mysqli']->real_escape_string($this->object_data); if (empty($this->object_data)) { $this->object_data = 'null'; } self::deletePluginCache($this->uuid); //ObjectYPT::deleteALLCache(); return parent::save(); } public static function deletePluginCache($uuid) { $name = "plugin{$uuid}"; ObjectYPT::deleteCache($name); ObjectYPT::deleteCache("plugin::getAllEnabled"); } public static function encryptIfNeed($object_data) { $isString = false; if (!is_object($object_data)) { $object_data = _json_decode($object_data); $isString = true; } if (!empty($object_data)) { foreach ($object_data as $key => $value) { if (!empty($value->type) && !empty($value->value) && is_string($value->type) && strtolower($value->type) === "encrypted") { if (!self::isEncrypted($value->value)) { $obj2 = new stdClass(); $obj2->dateEncrypted = time(); $obj2->value = $value->value; $object_data->$key->value = encryptString($obj2); } } } if ($isString) { $object_data = json_encode($object_data); } return $object_data; } else { return ''; } } public static function decryptIfNeed($object_data) { $isString = false; if (!is_object($object_data)) { $object_data = _json_decode($object_data); $isString = true; } if (!empty($object_data)) { foreach ($object_data as $key => $value) { if (!empty($value->type) && !empty($value->value) && strtolower($value->type) === "encrypted") { $isEncrypted = self::isEncrypted($value->value); if ($isEncrypted) { $object_data->$key->value = $isEncrypted; } } } if ($isString) { $object_data = json_encode($object_data); } return $object_data; } else { return ''; } } public static function isEncrypted($object_data_element_value) { if (!empty($object_data_element_value)) { $object_data_element_value_json = decryptString($object_data_element_value); $object_data_element_value_json = _json_decode($object_data_element_value_json); if (!empty($object_data_element_value_json) && !empty($object_data_element_value_json->dateEncrypted)) { return $object_data_element_value_json->value; } } return false; } } class PluginTags { public static $RECOMMENDED = ['success', 'Recommended', '', 'RECOMMENDED']; public static $SECURITY = ['warning', 'Security', '', 'SECURITY']; public static $LIVE = ['primary', 'Live', '', 'LIVE']; public static $MONETIZATION = ['primary', 'Monetization', '', 'MONETIZATION']; public static $ADS = ['primary', 'ADS', '', 'ADS']; public static $STORAGE = ['primary', 'Storage', '', 'STORAGE']; public static $GALLERY = ['primary', 'Gallery', '', 'GALLERY']; public static $NETFLIX = ['primary', 'Netflix', '', 'NETFLIX']; public static $LAYOUT = ['primary', 'Layout', '', 'LAYOUT']; public static $LOGIN = ['primary', 'Login', '', 'LOGIN']; public static $MOBILE = ['primary', 'Mobile', '', 'MOBILE']; public static $PLAYER = ['primary', 'Player', '', 'PLAYER']; public static $FREE = ['info', 'Free', '', 'FREE']; public static $PREMIUM = ['info', 'Premium', '', 'PREMIUM']; public static $DEPRECATED = ['danger', 'Deprecated', '', 'DEPRECATED']; }