Sfoglia il codice sorgente

Merge branch 'master' of https://github.com/unacms/una

AntonLV 1 anno fa
parent
commit
36b75c8d4c

+ 12 - 0
SECURITY.md

@@ -0,0 +1,12 @@
+# Security Policy
+
+## Supported Versions
+
+| Version | Supported          |
+| ------- | ------------------ |
+| 14.x    | :white_check_mark: |
+| < 14.0  | :x:                |
+
+## Reporting a Vulnerability
+
+Please, email us at team@unacms.com to report any security, privacy or performance issues.

+ 4 - 7
inc/classes/BxDolConnectionQuery.php

@@ -27,13 +27,10 @@ class BxDolConnectionQuery extends BxDolDb
 
     static public function getConnectionObject ($sObject)
     {
-        $oDb = BxDolDb::getInstance();
-        $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_connection` WHERE `object` = ?", $sObject);
-        $aObject = $oDb->getRow($sQuery);
-        if (!$aObject || !is_array($aObject))
-            return false;
-
-        return $aObject;
+        $a = BxDolDb::getInstance()->fromCache('sys_objects_connection', 'getAllWithKey', "SELECT * FROM `sys_objects_connection`", 'object');
+        if ($a && isset($a[$sObject]))
+            return $a[$sObject];
+        return false;
     }
 
     public function getCommonContentSQLParts ($sContentTable, $sContentField, $iInitiator1, $iInitiator2, $isMutual = false)

+ 1 - 1
inc/classes/BxDolEmbedQuery.php

@@ -15,7 +15,7 @@ class BxDolEmbedQuery extends BxDolFactoryObjectQuery
 {
     static public function getObject($sObject)
     {
-        return parent::getObjectFromTable($sObject, 'sys_objects_embeds');
+        return parent::getObjectFromTable($sObject, 'sys_objects_embeds', true);
     }
 
     static public function getObjects ()

+ 14 - 8
inc/classes/BxDolFactoryObjectQuery.php

@@ -20,16 +20,22 @@ class BxDolFactoryObjectQuery extends BxDolDb
         $this->_aObject = $aObject;
     }
 
-    static public function getObjectFromTable($sObject, $sTable)
+    static public function getObjectFromTable($sObject, $sTable, $bUseCache = false)
     {
         $oDb = BxDolDb::getInstance();
-
-        $sQuery = $oDb->prepare("SELECT * FROM `$sTable` WHERE `object` = ?", $sObject);
-
-        $aObject = $oDb->getRow($sQuery);
-        if(!$aObject || !is_array($aObject))
-            return false;
-
+        $aObject = false;
+        if ($bUseCache) {
+            $a = BxDolDb::getInstance()->fromCache($sTable, 'getAllWithKey', "SELECT * FROM `$sTable`", 'object');
+            if ($a && isset($a[$sObject]))
+                $aObject = $a[$sObject];
+        }
+        else {
+            $sQuery = $oDb->prepare("SELECT * FROM `$sTable` WHERE `object` = ?", $sObject);
+
+            $aObject = $oDb->getRow($sQuery);
+            if(!$aObject || !is_array($aObject))
+                $aObject = false;
+        }
         return $aObject;
     }
 

+ 4 - 3
inc/classes/BxDolFormQuery.php

@@ -217,10 +217,11 @@ class BxDolFormQuery extends BxDolDb
             $sUseValues = BX_DATA_VALUES_DEFAULT;
 
         $sQuery = $oDb->prepare("SELECT `Value`, `LKey`, `LKey2`, `Data` FROM `sys_form_pre_values` WHERE `Key` = ? ORDER BY `Order` ASC", $sKey);
-        if($sUseValues == BX_DATA_VALUES_ALL)
-            return $oDb->getAllWithKey($sQuery, 'Value');
+        if($sUseValues == BX_DATA_VALUES_ALL) {
+            return $oDb->fromCache('sys_form_pre_values_with_key_' . $sKey, 'getAllWithKey', $sQuery, 'Value');
+        }
 
-        $a = $oDb->getAll($sQuery);
+        $a = $oDb->fromCache('sys_form_pre_values_' . $sKey, 'getAll', $sQuery);
 
         $iMaxValue = 0;
         if ($isUseForSet)

+ 10 - 4
inc/classes/BxDolMenu.php

@@ -100,7 +100,7 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
     protected $_oQuery;
     protected $_oPermalinks;
     protected $_aMarkers = array();
-    protected $_bMultilevel = false;
+    protected $_isMultilevel = null;
 
     protected $_sSessionKeyCollapsed;
 
@@ -127,9 +127,7 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         $this->_sObject = isset($aObject['object']) ? $aObject['object'] : 'bx-menu-obj-' . time() . rand(0, PHP_INT_MAX);
         $this->_aObject = $aObject;
         $this->_oQuery = new BxDolMenuQuery($this->_aObject);
-        $this->_oPermalinks = BxDolPermalinks::getInstance();
-
-        $this->_bMultilevel = !empty($this->_aObject['set_name']) && $this->_oQuery->isSetMultilevel($this->_aObject['set_name']);
+        $this->_oPermalinks = BxDolPermalinks::getInstance();        
 
         $this->_sSessionKeyCollapsed = 'bx_menu_collapsed_';
 
@@ -492,6 +490,14 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         return true;
     }
     
+    protected function isMultilevel ()
+    {
+        if ($this->_isMultilevel !== null)
+            return $this->_isMultilevel;
+
+        $this->_isMultilevel = !empty($this->_aObject['set_name']) && $this->_oQuery->isSetMultilevel($this->_aObject['set_name']);
+    }
+
     protected function _getVisibilityClass($a)
     {
         $aHiddenOn = array(

+ 1 - 1
inc/classes/BxDolMenuQuery.php

@@ -183,7 +183,7 @@ class BxDolMenuQuery extends BxDolDb
 
     public function isSetMultilevel($sName)
     {
-        $sSql = $this->prepare("SELECT COUNT(*) FROM `sys_menu_items` WHERE `set_name`=? AND `parent_id`<>'0' LIMIT 1", $sName);
+        $sSql = $this->prepare("SELECT 1 FROM `sys_menu_items` WHERE `set_name` = ? AND `parent_id` != '0' LIMIT 1", $sName);
         return (int)$this->getOne($sSql) > 0;
     }
 }

+ 10 - 9
inc/classes/BxDolPageQuery.php

@@ -24,12 +24,12 @@ class BxDolPageQuery extends BxDolDb
     static public function getPageObject ($sObject)
     {
         $oDb = BxDolDb::getInstance();
-        $sQuery = $oDb->prepare("SELECT `o`.*, `l`.`template`, `l`.`cells_number` FROM `sys_objects_page` AS `o` INNER JOIN `sys_pages_layouts` AS `l` ON (`l`.`id` = `o`.`layout_id`) WHERE `o`.`object` = ?", $sObject);
-        $aObject = $oDb->getRow($sQuery);
-        if (!$aObject || !is_array($aObject))
-            return false;
 
-        return $aObject;
+        $a = $oDb->fromCache('sys_pages_objects_data', 'getAllWithKey', "SELECT `o`.*, `l`.`template`, `l`.`cells_number` FROM `sys_objects_page` AS `o` INNER JOIN `sys_pages_layouts` AS `l` ON (`l`.`id` = `o`.`layout_id`)", 'object');
+        if (isset($a[$sObject]))
+            return $a[$sObject];
+
+        return false;
     }
 
     static public function getPageObjectNameByURI($sURI, $sModule = false, $bSearchRedirects = false)
@@ -106,9 +106,10 @@ class BxDolPageQuery extends BxDolDb
 
     static public function getPageType($iId)
     {
-        return BxDolDb::getInstance()->getRow("SELECT * FROM `sys_pages_types` WHERE `id`=:id LIMIT 1", [
-            'id' => $iId
-        ]);
+        $aPageTypes = BxDolDb::getInstance()->fromCache('pages_types', 'getAllWithKey', "SELECT * FROM `sys_pages_types`", 'id');
+        if(isset($aPageTypes[$iId]))
+            return $aPageTypes[$iId];
+        return false;
     }
 
     static public function getPageTypes()
@@ -188,7 +189,7 @@ class BxDolPageQuery extends BxDolDb
     static public function getSeoUriRewrites()
     {
         $oDb = BxDolDb::getInstance();
-        return $oDb->fromMemory('sys_seo_uri_rewrites', 'getPairs', 'SELECT `uri_orig`, `uri_rewrite` FROM `sys_seo_uri_rewrites`', 'uri_orig', 'uri_rewrite');
+        return $oDb->fromCache('sys_seo_uri_rewrites', 'getPairs', 'SELECT `uri_orig`, `uri_rewrite` FROM `sys_seo_uri_rewrites`', 'uri_orig', 'uri_rewrite');
     }
 
     static public function getSeoLink($sModule, $sPageUri, $aCond = [])

+ 2 - 3
inc/classes/BxDolPaymentsQuery.php

@@ -19,9 +19,8 @@ class BxDolPaymentsQuery extends BxDolDb
 
     public function getObjects()
     {
-    	$sQuery = $this->prepare("SELECT * FROM `sys_objects_payments` WHERE 1");
-    	
-        $aObjects = $this->getAll($sQuery);
+    	$sQuery = "SELECT * FROM `sys_objects_payments` WHERE 1";
+        $aObjects = $this->fromCache('sys_objects_payments', 'getAll', $sQuery);
         if(empty($aObjects) || !is_array($aObjects))
             return array();
 

+ 4 - 8
inc/classes/BxDolPrivacyQuery.php

@@ -43,15 +43,11 @@ class BxDolPrivacyQuery extends BxDolDb
 
     static public function getPrivacyObject($sObject)
     {
-        $oDb = BxDolDb::getInstance();
+        $a = BxDolDb::getInstance()->fromCache('sys_objects_privacy', 'getAllWithKey', "SELECT * FROM `sys_objects_privacy`", 'object');
+        if ($a && isset($a[$sObject]))
+            return $a[$sObject];
 
-        $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_privacy` WHERE `object` = ?", $sObject);
-
-        $aObject = $oDb->getRow($sQuery);
-        if(!$aObject || !is_array($aObject))
-            return false;
-
-        return $aObject;
+        return false;
     }
 
     public function init($aObject = array())

+ 1 - 1
modules/base/profile/classes/BxBaseModProfileDb.php

@@ -21,7 +21,7 @@ class BxBaseModProfileDb extends BxBaseModGeneralDb
 
     public function getContentInfoById ($iContentId)
     {
-        $aInfo = $this->getRow("SELECT `c`.*, `p`.`account_id`, `p`.`id` AS `profile_id`, `a`.`email` AS `profile_email`, `a`.`active` AS `profile_last_active`, `a`.`ip` AS `profile_ip`, `p`.`status` AS `profile_status` FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` AS `c` INNER JOIN `sys_profiles` AS `p` ON (`p`.`content_id` = `c`.`id` AND `p`.`type` = :type) INNER JOIN `sys_accounts` AS `a` ON (`p`.`account_id` = `a`.`id`) WHERE `c`.`id` = :id", [
+        $aInfo = $this->fromMemory("profile_content_info_" . $this->_oConfig->getName() . $iContentId, 'getRow', "SELECT `c`.*, `p`.`account_id`, `p`.`id` AS `profile_id`, `a`.`email` AS `profile_email`, `a`.`active` AS `profile_last_active`, `a`.`ip` AS `profile_ip`, `p`.`status` AS `profile_status` FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` AS `c` INNER JOIN `sys_profiles` AS `p` ON (`p`.`content_id` = `c`.`id` AND `p`.`type` = :type) INNER JOIN `sys_accounts` AS `a` ON (`p`.`account_id` = `a`.`id`) WHERE `c`.`id` = :id", [
             'type' => $this->_oConfig->getName(),
             'id' => $iContentId
         ]);

+ 2 - 0
modules/boonex/english/data/langs/system/en.xml

@@ -1657,6 +1657,8 @@
     <string name="_adm_stg_cpt_option_sys_email_attachable_email_templates"><![CDATA[Attachable email templates list]]></string>
     <string name="_adm_stg_cpt_option_sys_db_cache_enable"><![CDATA[Enable DB cache]]></string>
     <string name="_adm_stg_cpt_option_sys_db_cache_engine"><![CDATA[DB cache engine (other than File option may require custom server setup)]]></string>
+    <string name="_adm_stg_cpt_option_sys_content_cache_enable"><![CDATA[Enable content cache]]></string>
+    <string name="_adm_stg_cpt_option_sys_content_cache_engine"><![CDATA[DContent cache engine (other than File option may require custom server setup)]]></string>
     <string name="_adm_stg_cpt_option_sys_default_payment"><![CDATA[Payment module]]></string>
     <string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[Default HTML editor]]></string>
     <string name="_adm_stg_cpt_option_sys_player_default"><![CDATA[Default Player]]></string>

+ 2 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -1632,6 +1632,8 @@
     <string name="_adm_stg_cpt_option_sys_email_attachable_email_templates"><![CDATA[Список присоединяемых email темплейтов]]></string>
     <string name="_adm_stg_cpt_option_sys_db_cache_enable"><![CDATA[Задействовать кэш БД]]></string>
     <string name="_adm_stg_cpt_option_sys_db_cache_engine"><![CDATA[Кэш-движок для БД (значение, отличное от File, может потребовать дополнительной настройки сервера)]]></string>
+    <string name="_adm_stg_cpt_option_sys_content_cache_enable"><![CDATA[Задействовать кэш содержимого страниц]]></string>
+    <string name="_adm_stg_cpt_option_sys_content_cache_engine"><![CDATA[Кэш-движок для содержимого страниц (значение, отличное от File, может потребовать дополнительной настройки сервера)]]></string>
     <string name="_adm_stg_cpt_option_sys_default_payment"><![CDATA[Модуль оплаты]]></string>
     <string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[HTML редактор по умолчанию]]></string>
     <string name="_adm_stg_cpt_option_sys_player_default"><![CDATA[Плеер по умолчанию]]></string>

+ 2 - 2
modules/boonex/timeline/classes/BxTimelineMenuFeeds.php

@@ -24,7 +24,7 @@ class BxTimelineMenuFeeds extends BxTemplMenu
 
         parent::__construct($aObject, $this->_oModule->_oTemplate);
 
-        $this->_bMultilevel = true;
+        $this->_isMultilevel = true;
         $this->_bDisplayAddons = true;
     }
 
@@ -106,7 +106,7 @@ class BxTimelineMenuFeeds extends BxTemplMenu
             'js_object' => $this->_sJsObject,
             'style_prefix' => $this->_sStylePrefix,
             'bx_if:show_toggle' => [
-                'condition' => $this->_bMultilevel && !empty($a['subitems']),
+                'condition' => $this->isMultilevel() && !empty($a['subitems']),
                 'content' => [
                     'js_object' => $this->_sJsObject,
                     'style_prefix' => $this->_sStylePrefix,

+ 1 - 0
studio/template/scripts/BxBaseStudioBuilderPage.php

@@ -2086,6 +2086,7 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
 
     protected function onPageChanged($oForm, $aPage)
     {
+        $this->oDb->cleanCache('sys_pages_objects_data');
         $this->oDb->cleanCache('sys_pages_uri_object_map');
         $this->oDb->cleanCache('sys_pages_urirewrite_object_map');
     }

+ 23 - 6
studio/template/scripts/BxBaseStudioFormsPreValues.php

@@ -190,11 +190,12 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
             }
 
             $iId = (int)$oForm->insert($aAdd);
-            if($iId != 0)
+            if($iId != 0) {
+                $this->onDataListChanged($oForm->getCleanValue('Key'));
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
-            else
+            } else {
                 $aRes = array('msg' => _t('_adm_form_err_pre_values_create'));
-
+            }
             echoJson($aRes);
         }
         else {
@@ -377,11 +378,12 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
                 }
             }
 
-            if($oForm->update($aValue['id'], $aAdd) !== false)
+            if($oForm->update($aValue['id'], $aAdd) !== false) {
+                $this->onDataListChanged($this->sList);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $aValue['id']);
-            else
+            } else {
                 $aRes = array('msg' => _t('_adm_form_err_pre_values_edit'));
-
+            }
             echoJson($aRes);
         } 
         else {
@@ -396,6 +398,13 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
         }
     }
 
+    public function performActionReorder()
+    {        
+        $mixed = parent::performActionReorder();
+        $this->onDataListChanged($this->sList);
+        return $mixed;
+    }
+
     public function performActionDelete()
     {
         $sAction = 'delete';
@@ -419,6 +428,8 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
             if((int)$this->_delete($iId) <= 0)
                 continue;
 
+            $this->onDataListChanged($this->sList);
+
             $oLanguage->deleteLanguageString($aValue['lkey']);
             $oLanguage->deleteLanguageString($aValue['lkey2']);
 
@@ -562,6 +573,12 @@ class BxBaseStudioFormsPreValues extends BxDolStudioFormsPreValues
     {
         return is_numeric($mixedValue) && (int)$mixedValue >= 1 && (int)$mixedValue <= BX_DOL_STUDIO_FIELD_PRE_VALUE_INT_MAX;
     }
+
+    protected function onDataListChanged($sKey)
+    {
+        $this->oDb->cleanCache('sys_form_pre_values_with_key_' . $sKey);
+        $this->oDb->cleanCache('sys_form_pre_values_' . $sKey);
+    }
 }
 
 /** @} */

+ 2 - 2
template/scripts/BxBaseMenu.php

@@ -275,7 +275,7 @@ class BxBaseMenu extends BxDolMenu
      */
     protected function getMenuItemsRaw ()
     {
-        if($this->_bMultilevel)
+        if($this->isMultilevel())
             return $this->_oQuery->getMenuItemsHierarchy();
         else 
             return $this->_oQuery->getMenuItems();
@@ -423,7 +423,7 @@ class BxBaseMenu extends BxDolMenu
         );
 
         $aTmplVarsSubitems = array('subitems' => '');
-        $bTmplVarsSubitems = $this->_bMultilevel && !empty($a['subitems']);
+        $bTmplVarsSubitems = $this->isMultilevel() && !empty($a['subitems']);
         if($bTmplVarsSubitems) {
             $sClassCollpsed = 'bx-mi-collapsed';
             if(($iCollapsed = $this->getUserChoiceCollapsedSubmenu($a)) !== false)

+ 1 - 1
template/scripts/BxBaseMenuProfileFollowings.php

@@ -22,7 +22,7 @@ class BxBaseMenuProfileFollowings extends BxTemplMenu
     {
         parent::__construct ($aObject, $oTemplate);
 
-        $this->_bMultilevel = true;
+        $this->_isMultilevel = true;
         $this->_bDisplayAddons = true;
 
         $this->_sConnection = 'sys_profiles_subscriptions';