]> git.mxchange.org Git - friendica.git/commitdiff
Use addons config entries instead of the addon table
authorPhilipp <admin@philipp.info>
Tue, 3 Jan 2023 19:24:48 +0000 (20:24 +0100)
committerPhilipp <admin@philipp.info>
Wed, 4 Jan 2023 20:55:51 +0000 (21:55 +0100)
src/Core/Addon.php
src/Core/Config/Capability/IManageConfigValues.php
src/Core/Config/Model/Config.php
src/Core/L10n.php
static/settings.config.php
tests/src/Core/Config/Cache/CacheTest.php
tests/src/Core/Config/ConfigTest.php

index cea814f320878e5007d4cc173c85145bedc3c572..be3e70a540415754c5d912d7f4845ec5fd01821d 100644 (file)
@@ -21,7 +21,6 @@
 
 namespace Friendica\Core;
 
-use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Util\Strings;
@@ -85,15 +84,18 @@ class Addon
        public static function getAdminList()
        {
                $addons_admin = [];
-               $addonsAdminStmt = DBA::select('addon', ['name'], ['plugin_admin' => 1], ['order' => ['name']]);
-               while ($addon = DBA::fetch($addonsAdminStmt)) {
-                       $addons_admin[$addon['name']] = [
-                               'url' => 'admin/addons/' . $addon['name'],
-                               'name' => $addon['name'],
+               $addons = DI::config()->get('addons');
+               foreach ($addons as $name => $data) {
+                       if (empty($data['admin'])) {
+                               continue;
+                       }
+
+                       $addons_admin[$name] = [
+                               'url' => 'admin/addons/' . $name,
+                               'name' => $name,
                                'class' => 'addon'
                        ];
                }
-               DBA::close($addonsAdminStmt);
 
                return $addons_admin;
        }
@@ -113,8 +115,7 @@ class Addon
         */
        public static function loadAddons()
        {
-               $installed_addons = DBA::selectToArray('addon', ['name'], ['installed' => true]);
-               self::$addons = array_column($installed_addons, 'name');
+               self::$addons = array_keys(DI::config()->get('addons') ?? []);
        }
 
        /**
@@ -129,7 +130,7 @@ class Addon
                $addon = Strings::sanitizeFilePathItem($addon);
 
                Logger::debug("Addon {addon}: {action}", ['action' => 'uninstall', 'addon' => $addon]);
-               DBA::delete('addon', ['name' => $addon]);
+               DI::config()->delete('addons', $addon);
 
                @include_once('addon/' . $addon . '/' . $addon . '.php');
                if (function_exists($addon . '_uninstall')) {
@@ -168,12 +169,9 @@ class Addon
                        $func(DI::app());
                }
 
-               DBA::insert('addon', [
-                       'name' => $addon,
-                       'installed' => true,
-                       'timestamp' => $t,
-                       'plugin_admin' => function_exists($addon . '_addon_admin'),
-                       'hidden' => file_exists('addon/' . $addon . '/.hidden')
+               DI::config()->set('addons', $addon,[
+                       'last_update' => $t,
+                       'admin' => function_exists($addon . '_addon_admin'),
                ]);
 
                if (!self::isEnabled($addon)) {
@@ -190,20 +188,20 @@ class Addon
         */
        public static function reload()
        {
-               $addons = DBA::selectToArray('addon', [], ['installed' => true]);
+               $addons = DI::config()->get('addons');
 
-               foreach ($addons as $addon) {
-                       $addonname = Strings::sanitizeFilePathItem(trim($addon['name']));
+               foreach ($addons as $name => $data) {
+                       $addonname = Strings::sanitizeFilePathItem(trim($name));
                        $addon_file_path = 'addon/' . $addonname . '/' . $addonname . '.php';
-                       if (file_exists($addon_file_path) && $addon['timestamp'] == filemtime($addon_file_path)) {
+                       if (file_exists($addon_file_path) && $data['last_update'] == filemtime($addon_file_path)) {
                                // Addon unmodified, skipping
                                continue;
                        }
 
-                       Logger::debug("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $addon['name']]);
+                       Logger::debug("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $name]);
 
-                       self::uninstall($addon['name']);
-                       self::install($addon['name']);
+                       self::uninstall($name);
+                       self::install($name);
                }
        }
 
@@ -313,11 +311,9 @@ class Addon
        public static function getVisibleList(): array
        {
                $visible_addons = [];
-               $stmt = DBA::select('addon', ['name'], ['hidden' => false, 'installed' => true]);
-               if (DBA::isResult($stmt)) {
-                       foreach (DBA::toArray($stmt) as $addon) {
-                               $visible_addons[] = $addon['name'];
-                       }
+               $addons = DI::config()->get('addons');
+               foreach ($addons as $name => $data) {
+                       $visible_addons[] = $name;
                }
 
                return $visible_addons;
index 715887ddf3cee96670d896d47ac6e49b82c3e9d7..09e2cd9144fdd8863fae4d7a4bd0958d4f167ead 100644 (file)
@@ -47,8 +47,8 @@ interface IManageConfigValues
         *
         * Get a particular config value from the given category ($cat)
         *
-        * @param string  $cat        The category of the configuration value
-        * @param string  $key           The configuration key to query
+        * @param string  $cat           The category of the configuration value
+        * @param ?string $key           The configuration key to query (if null, the whole array at the category will get returned)
         * @param mixed   $default_value Deprecated, use `Config->get($cat, $key, null, $refresh) ?? $default_value` instead
         *
         * @return mixed Stored value or null if it does not exist
@@ -56,7 +56,7 @@ interface IManageConfigValues
         * @throws ConfigPersistenceException In case the persistence layer throws errors
         *
         */
-       public function get(string $cat, string $key, $default_value = null);
+       public function get(string $cat, string $key = null, $default_value = null);
 
        /**
         * Load all configuration values from a given cache and saves it back in the configuration node store
index 29ea6b12d3a222f7c4753d7d34fb7f43882d4382..593ab04070f032628f9041b8c545c9fba1aead0b 100644 (file)
@@ -102,7 +102,7 @@ class Config implements IManageConfigValues
        }
 
        /** {@inheritDoc} */
-       public function get(string $cat, string $key, $default_value = null)
+       public function get(string $cat, string $key = null, $default_value = null)
        {
                return $this->configCache->get($cat, $key) ?? $default_value;
        }
index 0a91677b5d80080c205381b32732c08e2888b2ec..3f74a408496299d3b1be0059a7c548ccd46efec3 100644 (file)
@@ -85,10 +85,15 @@ class L10n
         * @var Database
         */
        private $dba;
+       /**
+        * @var IManageConfigValues
+        */
+       private $config;
 
        public function __construct(IManageConfigValues $config, Database $dba, IHandleSessions $session, array $server, array $get)
        {
                $this->dba    = $dba;
+               $this->config = $config;
 
                $this->loadTranslationTable(L10n::detectLanguage($server, $get, $config->get('system', 'language', self::DEFAULT)));
                $this->setSessionVariable($session);
@@ -157,9 +162,9 @@ class L10n
                $a->strings = [];
 
                // load enabled addons strings
-               $addons = $this->dba->select('addon', ['name'], ['installed' => true]);
-               while ($p = $this->dba->fetch($addons)) {
-                       $name = Strings::sanitizeFilePathItem($p['name']);
+               $addons = array_keys($this->config->get('addons') ?? []);
+               foreach ($addons as $addon) {
+                       $name = Strings::sanitizeFilePathItem($addon);
                        if (file_exists(__DIR__ . "/../../addon/$name/lang/$lang/strings.php")) {
                                include __DIR__ . "/../../addon/$name/lang/$lang/strings.php";
                        }
index c7d4b6a9c21ac39e53d48924ec3e63139e0b24f2..04994bc73e1a3d1d82765ee8333bdc9fe8f81a56 100644 (file)
@@ -52,10 +52,6 @@ return [
                // Enter 0 for no time limit.
                'account_abandon_days' => 0,
 
-               // addon (Comma-separated list)
-               // Manual list of addons which are enabled on this system.
-               'addon' => '',
-
                // add_missing_posts (boolean)
                // Checks for missing entries in "post", "post-thread" or "post-thread-user" and creates them
                'add_missing_posts' => false,
index 2db6196b7b9fca5ed9ac8582b6a2450cf2bfa8cc..024c9c7e3e500122834a8acf11c3b86e18c9e141 100644 (file)
@@ -410,4 +410,133 @@ class CacheTest extends MockedTest
                // the newCache entry wasn't set, because we Diff
                self::assertNull($mergedCache->get('system', 'test_3'));
        }
+
+       public function dataTestCat()
+       {
+               return [
+                       'test_with_hashmap'     => [
+                               'data'      => [
+                                       'test_with_hashmap' => [
+                                               'notifyall' => [
+                                                       'last_update' => 1671051565,
+                                                       'admin'       => true,
+                                               ],
+                                               'blockbot'  => [
+                                                       'last_update' => 1658952852,
+                                                       'admin'       => true,
+                                               ],
+                                       ],
+                                       'config'            => [
+                                               'register_policy' => 2,
+                                               'register_text'   => '',
+                                               'sitename'        => 'Friendica Social Network23',
+                                               'hostname'        => 'friendica.local',
+                                               'private_addons'  => false,
+                                       ],
+                                       'system'            => [
+                                               'dbclean_expire_conversation' => 90,
+                                       ],
+                               ],
+                               'cat'       => 'test_with_hashmap',
+                               'assertion' => [
+                                       'notifyall' => [
+                                               'last_update' => 1671051565,
+                                               'admin'       => true,
+                                       ],
+                                       'blockbot'  => [
+                                               'last_update' => 1658952852,
+                                               'admin'       => true,
+                                       ],
+                               ],
+                       ],
+                       'test_with_keys'        => [
+                               'data'      => [
+                                       'test_with_keys' => [
+                                               [
+                                                       'last_update' => 1671051565,
+                                                       'admin'       => true,
+                                               ],
+                                               [
+                                                       'last_update' => 1658952852,
+                                                       'admin'       => true,
+                                               ],
+                                       ],
+                                       'config'            => [
+                                               'register_policy' => 2,
+                                               'register_text'   => '',
+                                               'sitename'        => 'Friendica Social Network23',
+                                               'hostname'        => 'friendica.local',
+                                               'private_addons'  => false,
+                                       ],
+                                       'system'            => [
+                                               'dbclean_expire_conversation' => 90,
+                                       ],
+                               ],
+                               'cat'       => 'test_with_keys',
+                               'assertion' => [
+                                       [
+                                               'last_update' => 1671051565,
+                                               'admin'       => true,
+                                       ],
+                                       [
+                                               'last_update' => 1658952852,
+                                               'admin'       => true,
+                                       ],
+                               ],
+                       ],
+                       'test_with_inner_array' => [
+                               'data'      => [
+                                       'test_with_inner_array' => [
+                                               'notifyall' => [
+                                                       'last_update' => 1671051565,
+                                                       'admin'       => [
+                                                               'yes' => true,
+                                                               'no'  => 1.5,
+                                                       ],
+                                               ],
+                                               'blogbot'   => [
+                                                       'last_update' => 1658952852,
+                                                       'admin'       => true,
+                                               ],
+                                       ],
+                                       'config'                => [
+                                               'register_policy' => 2,
+                                               'register_text'   => '',
+                                               'sitename'        => 'Friendica Social Network23',
+                                               'hostname'        => 'friendica.local',
+                                               'private_addons'  => false,
+                                       ],
+                                       'system'                => [
+                                               'dbclean_expire_conversation' => 90,
+                                       ],
+                               ],
+                               'cat'       => 'test_with_inner_array',
+                               'assertion' => [
+                                       'notifyall' => [
+                                               'last_update' => 1671051565,
+                                               'admin'       => [
+                                                       'yes' => true,
+                                                       'no'  => 1.5,
+                                               ],
+                                       ],
+                                       'blogbot'   => [
+                                               'last_update' => 1658952852,
+                                               'admin'       => true,
+                                       ],
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * Tests that the Cache can return a whole category at once
+        *
+        * @dataProvider dataTestCat
+        */
+       public function testGetCategory(array $data, string $category, array $assertion)
+       {
+               $cache = new Cache($data);
+
+               self::assertEquals($assertion, $cache->get($category));
+       }
 }
index c85cf3f7081ddb5a3b804eb3f6ab7a54ec223994..876a0b05b374865a46c8d4a1b224f714c60ec54c 100644 (file)
@@ -403,4 +403,133 @@ class ConfigTest extends MockedTest
                self::assertFalse($this->testedConfig->set('config', 'test', '123'));
                self::assertEquals('prio', $this->testedConfig->get('config', 'test', '', true));
        }
+
+
+       public function dataTestCat()
+       {
+               return [
+                       'test_with_hashmap'     => [
+                               'data'      => [
+                                       'test_with_hashmap' => [
+                                               'notifyall' => [
+                                                       'last_update' => 1671051565,
+                                                       'admin'       => true,
+                                               ],
+                                               'blockbot'  => [
+                                                       'last_update' => 1658952852,
+                                                       'admin'       => true,
+                                               ],
+                                       ],
+                                       'config'            => [
+                                               'register_policy' => 2,
+                                               'register_text'   => '',
+                                               'sitename'        => 'Friendica Social Network23',
+                                               'hostname'        => 'friendica.local',
+                                               'private_addons'  => false,
+                                       ],
+                                       'system'            => [
+                                               'dbclean_expire_conversation' => 90,
+                                       ],
+                               ],
+                               'cat'       => 'test_with_hashmap',
+                               'assertion' => [
+                                       'notifyall' => [
+                                               'last_update' => 1671051565,
+                                               'admin'       => true,
+                                       ],
+                                       'blockbot'  => [
+                                               'last_update' => 1658952852,
+                                               'admin'       => true,
+                                       ],
+                               ],
+                       ],
+                       'test_with_keys'        => [
+                               'data'      => [
+                                       'test_with_keys' => [
+                                               [
+                                                       'last_update' => 1671051565,
+                                                       'admin'       => true,
+                                               ],
+                                               [
+                                                       'last_update' => 1658952852,
+                                                       'admin'       => true,
+                                               ],
+                                       ],
+                                       'config'            => [
+                                               'register_policy' => 2,
+                                               'register_text'   => '',
+                                               'sitename'        => 'Friendica Social Network23',
+                                               'hostname'        => 'friendica.local',
+                                               'private_addons'  => false,
+                                       ],
+                                       'system'            => [
+                                               'dbclean_expire_conversation' => 90,
+                                       ],
+                               ],
+                               'cat'       => 'test_with_keys',
+                               'assertion' => [
+                                       [
+                                               'last_update' => 1671051565,
+                                               'admin'       => true,
+                                       ],
+                                       [
+                                               'last_update' => 1658952852,
+                                               'admin'       => true,
+                                       ],
+                               ],
+                       ],
+                       'test_with_inner_array' => [
+                               'data'      => [
+                                       'test_with_inner_array' => [
+                                               'notifyall' => [
+                                                       'last_update' => 1671051565,
+                                                       'admin'       => [
+                                                               'yes' => true,
+                                                               'no'  => 1.5,
+                                                       ],
+                                               ],
+                                               'blogbot'   => [
+                                                       'last_update' => 1658952852,
+                                                       'admin'       => true,
+                                               ],
+                                       ],
+                                       'config'                => [
+                                               'register_policy' => 2,
+                                               'register_text'   => '',
+                                               'sitename'        => 'Friendica Social Network23',
+                                               'hostname'        => 'friendica.local',
+                                               'private_addons'  => false,
+                                       ],
+                                       'system'                => [
+                                               'dbclean_expire_conversation' => 90,
+                                       ],
+                               ],
+                               'cat'       => 'test_with_inner_array',
+                               'assertion' => [
+                                       'notifyall' => [
+                                               'last_update' => 1671051565,
+                                               'admin'       => [
+                                                       'yes' => true,
+                                                       'no'  => 1.5,
+                                               ],
+                                       ],
+                                       'blogbot'   => [
+                                               'last_update' => 1658952852,
+                                               'admin'       => true,
+                                       ],
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider dataTestCat
+        */
+       public function testGetCategory(array $data, string $category, array $assertion)
+       {
+               $this->configCache = new Cache($data);
+               $config = new Config($this->configFileManager, $this->configCache);
+
+               self::assertEquals($assertion, $config->get($category));
+       }
 }