Seditio Source
Root |
./othercms/PHPFusion 9.10.20/includes/classes/PHPFusion/Installer/Infusions.php
<?php
/*-------------------------------------------------------+
| PHPFusion Content Management System
| Copyright (C) PHP Fusion Inc
| https://phpfusion.com/
+--------------------------------------------------------+
| Filename: Infusions.php
| Author: Core Development Team
+--------------------------------------------------------+
| This program is released as free software under the
| Affero GPL license. You can redistribute it and/or
| modify it under the terms of this license which you
| can read by viewing the included agpl.txt or online
| at www.gnu.org/licenses/agpl.html. Removal of this
| copyright header is strictly prohibited without
| written permission from the original author(s).
+--------------------------------------------------------*/
namespace PHPFusion\Installer;

/**
 * Class Infusions
 *
 * @package PHPFusion\Installer
 */
class Infusions {

    private static
$locale = [];
    private static
$instance = NULL;
    private static
$inf = [];

   
/**
     * Version 7 compatible infusions load constants.
     */
   
public static function loadConfiguration() {
       
/*
         * Non-core infusions_db.php inclusion.
         * These files are supposed to be infusion_db.php using Infusion SDK
         * Cannot contain and make it global because it contains dangerous APIs and remote executions.
         */
       
$inf_folder = makefilelist(INFUSIONS, '.|..|.htaccess|index.php|._DS_Store|.tmp', TRUE, 'folders');
        if (!empty(
$inf_folder)) {
            foreach (
$inf_folder as $folder) {
               
$inf_include = INFUSIONS.$folder."/infusion_db.php";
                if (
file_exists($inf_include)) {
                    include
$inf_include;
                }
            }
        }
    }

   
/**
     * Get Instance
     *
     * @return null|static
     */
   
public static function getInstance() {
        if (
self::$instance === NULL) {
           
self::$instance = new static();
        }
       
self::$locale = fusion_get_locale('', LOCALE.LOCALESET."admin/infusions.php");

        return
self::$instance;
    }

   
/**
     * Load Infusion according to Infusion Standard Developer Kit
     *
     * @param string $folder
     *
     * @return array
     */
   
public static function loadInfusion($folder) {
       
$infusion = [];
       
$inf_title = "";
       
$inf_description = "";
       
$inf_version = "";
       
$inf_developer = "";
       
$inf_email = "";
       
$inf_weburl = "";
       
$inf_folder = "";
       
$inf_image = "";
       
$inf_newtable = [];
       
$inf_insertdbrow = [];
       
$inf_updatedbrow = [];
       
$inf_droptable = [];
       
$inf_altertable = [];
       
$inf_deldbrow = [];
       
$inf_sitelink = [];
       
$inf_adminpanel = [];
       
$mlt_adminpanel = [];
       
$inf_mlt = [];
       
$mlt_insertdbrow = [];
       
$mlt_deldbrow = [];
       
$inf_delfiles = [];
       
$inf_newcol = [];
       
$inf_dropcol = [];
       
$db_prefix = DB_PREFIX;
       
$cookie_prefix = COOKIE_PREFIX;

        if (
is_dir(INFUSIONS.$folder) && file_exists(INFUSIONS.$folder."/infusion.php")) {

            include(
INFUSIONS.$folder."/infusion.php");

           
$inf_image_tmp = !empty($inf_image) && file_exists(ADMIN."images/".$inf_image) ? ADMIN."images/".$inf_image : ADMIN."images/infusion_panel.png";

            if (!empty(
$inf_image) && file_exists(INFUSIONS.$inf_folder."/".$inf_image)) {
               
$inf_image = INFUSIONS.$inf_folder."/".$inf_image;
            } else {
               
$inf_image = $inf_image_tmp;
            }

           
$infusion = [
               
'name'            => str_replace('_', ' ', $inf_title),
               
'title'           => $inf_title,
               
'description'     => $inf_description,
               
'version'         => $inf_version ?: 'beta',
               
'developer'       => $inf_developer ?: 'PHPFusion',
               
'email'           => $inf_email,
               
'url'             => $inf_weburl,
               
'image'           => !empty($inf_image) ? $inf_image : 'infusion_panel.png',
               
'folder'          => $inf_folder,
               
'newtable'        => $inf_newtable,
               
'newcol'          => $inf_newcol,
               
'dropcol'         => $inf_dropcol,
               
'droptable'       => $inf_droptable,
               
'altertable'      => $inf_altertable,
               
'deldbrow'        => $inf_deldbrow,
               
'sitelink'        => $inf_sitelink,
               
'adminpanel'      => $inf_adminpanel,
               
'mlt_adminpanel'  => $mlt_adminpanel,
               
'mlt'             => $inf_mlt,
               
'mlt_insertdbrow' => $mlt_insertdbrow,
               
'mlt_deldbrow'    => $mlt_deldbrow,
               
'delfiles'        => $inf_delfiles,
               
'insertdbrow'     => $inf_insertdbrow,
               
'updatedbrow'     => $inf_updatedbrow,
            ];

           
$result = dbquery("SELECT inf_version FROM ".DB_INFUSIONS." WHERE inf_folder=:inf_folder", [':inf_folder' => $folder]);

           
/*
             * Status Remarks
             * 2 - When upgrade is a must
             * 1 - Nothing to upgrade
             * 0 - Infusions not found.
             */
           
$infusion['status'] = dbrows($result) ? (version_compare($infusion['version'], dbresult($result, 0), ">") ? 2 : 1) : 0;
        }

        return
$infusion;
    }

   
/**
     * Load upgrade folder
     *
     * @param string $folder
     * @param string $upgrade_file_path
     *
     * @return array
     */
   
public static function loadUpgrade($folder, $upgrade_file_path) {
       
$infusion = [];
       
$inf_title = "";
       
$inf_description = "";
       
$inf_version = "";
       
$inf_developer = "";
       
$inf_email = "";
       
$inf_weburl = "";
       
$inf_folder = "";
       
$inf_image = "";
       
$inf_newtable = [];
       
$inf_altertable = [];
       
$inf_newcol = [];
       
$inf_updatedbrow = [];
       
$inf_sitelink = [];
       
$inf_adminpanel = [];
       
$mlt_adminpanel = [];
       
$inf_mlt = [];
       
$mlt_insertdbrow = [];
       
$inf_insertdbrow = [];
       
$inf_dropcol = [];
       
$inf_droptable = [];
       
$inf_delfiles = [];
       
$inf_deldbrow = [];
       
$mlt_deldbrow = [];
       
$db_prefix = DB_PREFIX;
       
$cookie_prefix = COOKIE_PREFIX;

        if (
is_dir($folder) && file_exists($upgrade_file_path)) {

            include
$upgrade_file_path;

           
$inf_image_tmp = !empty($inf_image) && file_exists(ADMIN."images/".$inf_image) ? ADMIN."images/".$inf_image : ADMIN."images/infusion_panel.png";
            if (!empty(
$inf_image) && file_exists(INFUSIONS.$inf_folder."/".$inf_image)) {
               
$inf_image = INFUSIONS.$inf_folder."/".$inf_image;
            } else {
               
$inf_image = $inf_image_tmp;
            }

           
$infusion = [
               
'name'            => str_replace('_', ' ', $inf_title),
               
'title'           => $inf_title,
               
'description'     => $inf_description,
               
'version'         => $inf_version ?: 'beta',
               
'developer'       => $inf_developer ?: 'PHPFusion',
               
'email'           => $inf_email,
               
'url'             => $inf_weburl,
               
'image'           => !empty($inf_image) ? $inf_image : 'infusion_panel.png',
               
'folder'          => $inf_folder,
               
'newtable'        => $inf_newtable,
               
'altertable'      => $inf_altertable,
               
'newcol'          => $inf_newcol,
               
'sitelink'        => $inf_sitelink,
               
'adminpanel'      => $inf_adminpanel,
               
'mlt_adminpanel'  => $mlt_adminpanel,
               
'mlt'             => $inf_mlt,
               
'insertdbrow'     => $inf_insertdbrow,
               
'updatedbrow'     => $inf_updatedbrow,
               
'mlt_insertdbrow' => $mlt_insertdbrow,
               
'deldbrow'        => $inf_deldbrow,
               
'mlt_deldbrow'    => $mlt_deldbrow,
               
'delfiles'        => $inf_delfiles,
               
'dropcol'         => $inf_dropcol,
               
'droptable'       => $inf_droptable,
            ];

           
$folder = str_replace(INFUSIONS, '', $folder);
           
$result = dbquery("SELECT inf_version FROM ".DB_INFUSIONS." WHERE inf_folder=:inf_folder", [':inf_folder' => $folder]);
           
$infusion['status'] = dbrows($result) ? (version_compare($infusion['version'], dbresult($result, 0), ">=") ? 2 : 1) : 0;
        }

        return
$infusion;
    }

   
/**
     * Execute Installation according to Infusion Standard Developer Kit
     *
     * @param $folder
     *
     * @return mixed|null
     *
     * @uses adminpanel_infuse
     * @uses dropcol_infuse
     * @uses sitelink_infuse
     * @uses mlt_insertdbrow_infuse
     * @uses mlt_adminpanel_infuse
     * @uses mlt_infuse
     * @uses altertable_infuse
     * @uses updatedbrow_infuse
     * @uses newtable_infuse
     * @uses newcol_infuse
     * @uses insertdbrow_infuse
     * @uses deldbrow_infuse
     */
   
public function infuse($folder) {
       
$error = FALSE;
        if ((
self::$inf = self::loadInfusion($folder))) {
           
$result = dbquery("SELECT inf_id, inf_version FROM ".DB_INFUSIONS." WHERE inf_folder=:folder", [':folder' => $folder]);
            if (
dbrows($result)) {

               
$data = dbarray($result);

                if (
self::$inf['version'] > $data['inf_version']) {

                   
$upgrade_folder_path = INFUSIONS.self::$inf['folder']."/upgrade/";

                    if (
file_exists($upgrade_folder_path)) {
                       
$upgrade_files = makefilelist($upgrade_folder_path, ".|..|index.php", TRUE);
                        if (!empty(
$upgrade_files) && is_array($upgrade_files)) {
                            foreach (
$upgrade_files as $upgrade_file) {
                               
/*
                                 * This will check file names (File name convention) against current infusion version
                                 * As we have multiple upgrade files - each will be called. As the query is not done in array
                                 * excepted for newcol method, please ensure you make checks before attaching the array into
                                 * the callback.
                                 *
                                 * The version of the CMS is irrelevant. Infusion can be upgraded as many times as the authors
                                 * make it available to be distributed. (i.e. they can say Version 1 is for Version 9 of the CMS)
                                 * in their own website, Version 2 is for Version 10 of the CMS etc. Apps and CMS are not tied
                                 * together in terms of version-ing, as PHPFusion does not track it as we do not maintain them.
                                 *
                                 * When developing upgrades, people should not just make insertions and declare without checking
                                 * if the table exist or column exist as renaming a non-existent table could not be performed.
                                 *
                                 */
                               
$filename = rtrim($upgrade_file, 'upgrade.inc');
                                if (
version_compare($filename, $data['inf_version'], ">")) {
                                    unset(
$upgrades);
                                   
$upgrades = self::loadUpgrade(INFUSIONS.$folder, $upgrade_folder_path.$upgrade_file);

                                    foreach (
$upgrades as $callback_method => $statement_type) {

                                       
$method = $callback_method."_infuse";
                                        if (
method_exists($this, $method)) {
                                           
$error = $this->$method($upgrades);
                                        }
                                        if (
$error) {
                                           
// Reports visually which method has error.
                                           
fusion_stop($callback_method);
                                           
addnotice('danger', self::$locale['403']);

                                            return
$error;
                                        }
                                    }
                                    if (
$error === FALSE) {
                                       
dbquery("UPDATE ".DB_INFUSIONS." SET inf_version=:version WHERE inf_id=:id", [
                                           
':version' => self::$inf['version'],
                                           
':id'      => $data['inf_id'],
                                        ]);
                                    }
                                }

                            }
                        }
                    }
                }

            } else {

                foreach (
self::$inf as $callback_method => $statement_type) {

                   
$method = $callback_method."_infuse";

                    if (
method_exists($this, $method)) {

                       
$error = $this->$method(self::$inf);
                    }

                    if (
$error) {
                       
addnotice('danger', self::$locale['403']);

                        return
$error;
                    }
                }

                if (
$error === FALSE) {
                    if (
dbcount("(inf_title)", DB_INFUSIONS, "inf_folder='".self::$inf['folder']."'")) {
                       
dbquery("DELETE FROM ".DB_INFUSIONS." WHERE inf_folder='".self::$inf['folder']."'");
                    }
                   
addnotice("success", sprintf(self::$locale['423'], self::$inf['title']));
                   
dbquery("INSERT INTO ".DB_INFUSIONS." (inf_title, inf_folder, inf_version) VALUES ('".self::$inf['title']."', '".self::$inf['folder']."', '".self::$inf['version']."')");
                }
            }
        }

       
/*if (fusion_safe()) {
            //redirect(FUSION_REQUEST);
        }*/

       
return NULL;
    }

   
/**
     * Defuse
     *
     * @param $folder
     */
   
public function defuse($folder) {

       
$result = dbquery("SELECT inf_folder FROM ".DB_INFUSIONS." WHERE inf_folder=:folder", [':folder' => $folder]);
       
$infData = dbarray($result);

       
$inf = self::loadInfusion($folder);

        if (
$inf['adminpanel'] && is_array($inf['adminpanel'])) {
            foreach (
$inf['adminpanel'] as $adminpanel) {
               
dbquery("DELETE FROM ".DB_ADMIN." WHERE admin_rights='".($adminpanel['rights'] ?: "IP")."' AND admin_link='".INFUSIONS.$inf['folder']."/".$adminpanel['panel']."' AND admin_page='5'");
               
$result = dbquery("SELECT user_id, user_rights FROM ".DB_USERS." WHERE user_level<=".USER_LEVEL_ADMIN);
                while (
$data = dbarray($result)) {
                   
$user_rights = explode(".", $data['user_rights']);
                    if (
in_array($adminpanel['rights'], $user_rights)) {
                       
$key = array_search($adminpanel['rights'], $user_rights);
                        unset(
$user_rights[$key]);
                    }
                   
dbquery("UPDATE ".DB_USERS." SET user_rights='".implode(".", $user_rights)."' WHERE user_id='".$data['user_id']."'");
                }
            }
        }

        foreach (
fusion_get_enabled_languages() as $current_language => $language_translations) {
            if (isset(
$inf['mlt_adminpanel'][$current_language])) {
                if (
$inf['mlt_adminpanel'] && is_array($inf['mlt_adminpanel'])) {
                    foreach (
$inf['mlt_adminpanel'][$current_language] as $adminpanel) {
                       
dbquery("DELETE FROM ".DB_ADMIN." WHERE admin_rights='".($adminpanel['rights'] ?: "IP")."' AND admin_link='".INFUSIONS.$inf['folder']."/".$adminpanel['panel']."' AND admin_page='5'");
                       
$result = dbquery("SELECT user_id, user_rights FROM ".DB_USERS." WHERE user_level<=".USER_LEVEL_ADMIN);
                        while (
$data = dbarray($result)) {
                           
$user_rights = explode(".", $data['user_rights']);
                            if (
in_array($adminpanel['rights'], $user_rights)) {
                               
$key = array_search($adminpanel['rights'], $user_rights);
                                unset(
$user_rights[$key]);
                            }
                           
dbquery("UPDATE ".DB_USERS." SET user_rights='".implode(".", $user_rights)."' WHERE user_id='".$data['user_id']."'");
                        }
                    }
                }
            }
        }

        if (
$inf['mlt'] && is_array($inf['mlt'])) {
            foreach (
$inf['mlt'] as $mlt) {
               
dbquery("DELETE FROM ".DB_LANGUAGE_TABLES." WHERE mlt_rights='".$mlt['rights']."'");
            }
        }

        if (
$inf['sitelink'] && is_array($inf['sitelink'])) {
            foreach (
$inf['sitelink'] as $sitelink) {
               
$result2 = dbquery("SELECT link_id, link_order FROM ".DB_SITE_LINKS." WHERE link_url='".str_replace("../", "",
                       
INFUSIONS).$inf['folder']."/".$sitelink['url']."'");
                if (
dbrows($result2)) {
                   
$data2 = dbarray($result2);
                   
dbquery("UPDATE ".DB_SITE_LINKS." SET link_order=link_order-1 WHERE link_order>'".$data2['link_order']."'");
                   
dbquery("DELETE FROM ".DB_SITE_LINKS." WHERE link_id='".$data2['link_id']."'");
                }
            }
        }

        if (isset(
$inf['deldbrow']) && is_array($inf['deldbrow'])) {
            foreach (
$inf['deldbrow'] as $deldbrow) {
               
dbquery("DELETE FROM ".$deldbrow);
            }
        }

        if (
$inf['mlt_deldbrow'] && is_array($inf['mlt_deldbrow'])) {
            foreach (
fusion_get_enabled_languages() as $current_language) {
                if (isset(
$inf['mlt_deldbrow'][$current_language])) {
                    foreach (
$inf['mlt_deldbrow'][$current_language] as $mlt_deldbrow) {
                       
dbquery("DELETE FROM ".$mlt_deldbrow);
                    }
                }
            }
        }

        if (!empty(
$inf['delfiles']) && is_array($inf['delfiles'])) {
            foreach (
$inf['delfiles'] as $folder) {
                if (
file_exists($folder) && is_dir($folder)) {
                   
$files = makefilelist($folder, ".|..|index.php", TRUE);
                    if (!empty(
$files)) {
                        foreach (
$files as $filename) {
                           
unlink($folder.$filename);
                        }
                    }
                }
            }
        }

        if (isset(
$inf['dropcol']) && is_array($inf['dropcol'])) {
            foreach (
$inf['dropcol'] as $dropCol) {
                if (
is_array($dropCol) && !empty($dropCol['table']) && !empty($dropCol['column'])) {
                   
$columns = fieldgenerator($dropCol['table']);
                    if (
in_array($dropCol['column'], $columns)) {
                       
dbquery("ALTER TABLE ".$dropCol['table']." DROP COLUMN ".$dropCol['column']);
                    }
                }
            }
        }
        if (
$inf['droptable'] && is_array($inf['droptable'])) {
            foreach (
$inf['droptable'] as $droptable) {
               
dbquery("DROP TABLE IF EXISTS ".$droptable);
            }
        }
       
dbquery("DELETE FROM ".DB_INFUSIONS." WHERE inf_folder=:folder", [
           
':folder' => $infData['inf_folder']
        ]);
       
addnotice("success", sprintf(self::$locale['424'], $inf['title']));
       
redirect(FUSION_REQUEST);
    }

   
/**
     * @param array $inf
     *
     * @return bool
     */
   
protected static function adminpanel_infuse($inf) {
       
$error = FALSE;

        if (
$inf['adminpanel'] && is_array($inf['adminpanel'])) {

            foreach (
$inf['adminpanel'] as $adminpanel) {
               
// auto recovery
               
if (!empty($adminpanel['rights'])) {
                   
dbquery("DELETE FROM ".DB_ADMIN." WHERE admin_rights='".$adminpanel['rights']."'");
                }

               
$link_prefix = (defined('ADMIN_PANEL') ? '' : '../').INFUSIONS.$inf['folder'].'/';
               
$inf_admin_image = ($adminpanel['image'] ?: "infusion_panel.png");

                if (empty(
$adminpanel['page'])) {
                   
$item_page = 5;
                } else {
                   
$item_page = isnum($adminpanel['page']) ? $adminpanel['page'] : 5;
                }

                if (!
dbcount("(admin_id)", DB_ADMIN, "admin_rights='".$adminpanel['rights']."'")) {
                   
$adminpanel += [
                       
'rights'   => '',
                       
'title'    => '',
                       
'panel'    => '',
                       
'language' => LANGUAGE
                   
];

                   
$insert_sql = "INSERT INTO ".DB_ADMIN." (admin_rights, admin_image, admin_title, admin_link, admin_page, admin_language) VALUES ('".$adminpanel['rights']."', '".$link_prefix.$inf_admin_image."', '".$adminpanel['title']."', '".$link_prefix.$adminpanel['panel']."', '".$item_page."', '".$adminpanel['language']."')";
                   
$result = dbquery($insert_sql);
                    if (
dbrows($result)) {
                       
$result = dbquery("SELECT user_id, user_rights FROM ".DB_USERS." WHERE user_level <=:admin AND ".in_group('user_rights', 'I', '.'), [':admin' => USER_LEVEL_ADMIN]);
                        while (
$data = dbarray($result)) {
                           
$user_rights = explode('.', $data['user_rights']);

                            if (!
in_array($adminpanel['rights'], $user_rights)) {
                               
dbquery("UPDATE ".DB_USERS." SET user_rights='".$data['user_rights'].".".$adminpanel['rights']."' WHERE user_id='".$data['user_id']."'");
                            }
                        }
                    }
                } else {
                   
$error = TRUE;
                }
            }
        }

        return
$error;
    }

   
/**
     * Drop column
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function dropcol_infuse($inf) {
       
$error = FALSE;
        if (isset(
$inf['dropcol']) && is_array($inf['dropcol'])) {
            foreach (
$inf['dropcol'] as $dropCol) {
                if (
is_array($dropCol) && !empty($dropCol['table']) && !empty($dropCol['column'])) {
                   
$columns = fieldgenerator($dropCol['table']);
                    if (
in_array($dropCol['column'], $columns)) {
                        if (!
dbquery("ALTER TABLE ".$dropCol['table']." DROP COLUMN ".$dropCol['column'])) {
                           
$error = TRUE;
                        }
                    }
                }
            }
        }

        return
$error;
    }

   
/**
     * Add Sitelinks
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function sitelink_infuse($inf) {
       
$error = FALSE;
        if (
$inf['sitelink'] && is_array($inf['sitelink'])) {
           
$last_id = 0;

            foreach (
$inf['sitelink'] as $sitelink) {

               
$link_order = dbresult(dbquery("SELECT MAX(link_order) FROM ".DB_SITE_LINKS), 0) + 1;

               
$sitelink += [
                   
"cat"        => 0,
                   
"title"      => "",
                   
"url"        => "",
                   
"icon"       => "",
                   
"visibility" => 0,
                   
"status"     => 1,
                   
"position"   => 3,
                   
"language"   => LANGUAGE
               
];

               
$link_url_path = "".str_replace("../", "", INFUSIONS).$inf['folder']."/";

                if (!empty(
$sitelink['cat']) && $sitelink['cat'] == "{last_id}" && !empty($last_id)) {

                   
$sitelink['cat'] = $last_id;

                   
$result = dbquery("INSERT INTO ".DB_SITE_LINKS."
                    (link_cat, link_name, link_url, link_icon, link_visibility, link_position, link_status, link_window, link_order, link_language)
                    VALUES ('"
.$sitelink['cat']."', '".$sitelink['title']."', '".$link_url_path.$sitelink['url']."', '".$sitelink['icon']."', '".$sitelink['visibility']."', '".$sitelink['position']."', '".$sitelink['status']."', '0', '".$link_order."', '".$sitelink['language']."')");

                } else {

                   
$result = dbquery("INSERT INTO ".DB_SITE_LINKS."
                    (link_cat, link_name, link_url, link_icon, link_visibility, link_position, link_status, link_window, link_order, link_language)
                    VALUES ('"
.$sitelink['cat']."', '".$sitelink['title']."', '".$link_url_path.$sitelink['url']."', '".$sitelink['icon']."', '".$sitelink['visibility']."', '".$sitelink['position']."', '".$sitelink['status']."', '0', '".$link_order."', '".$sitelink['language']."')");

                   
$last_id = dblastid();
                }

                if (!
$result) {
                   
$error = TRUE;
                }

            }
        }

        return
$error;
    }

   
/**
     *  Register Multilang rights
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function mlt_insertdbrow_infuse($inf) {
       
$error = FALSE;
        if (
$inf['mlt_insertdbrow'] && is_array($inf['mlt_insertdbrow'])) {
            foreach (
fusion_get_enabled_languages() as $current_language => $language_translations) {
                if (isset(
$inf['mlt_insertdbrow'][$current_language])) {
                   
$last_id = 0;
                    foreach (
$inf['mlt_insertdbrow'][$current_language] as $insertdbrow) {
                        if (
stristr($insertdbrow, "{last_id}") && !empty($last_id)) {
                           
$result = dbquery("INSERT INTO ".str_replace("{last_id}", $last_id, $insertdbrow));
                        } else {
                           
$result = dbquery("INSERT INTO ".$insertdbrow);
                           
$last_id = dblastid();
                        }
                        if (!
$result) {
                           
$error = TRUE;
                        }
                    }
                }
            }
        }

        return
$error;
    }

   
/**
     * Register Multilang Admin Pages
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function mlt_adminpanel_infuse($inf) {
       
$error = FALSE;
        if (
$inf['mlt_adminpanel'] && is_array($inf['mlt_adminpanel'])) {
            foreach (
fusion_get_enabled_languages() as $current_language => $language_translations) {
                if (isset(
$inf['mlt_adminpanel'][$current_language])) {
                    foreach (
$inf['mlt_adminpanel'][$current_language] as $adminpanel) {
                       
$link_prefix = (defined('ADMIN_PANEL') ? '' : '../').INFUSIONS.$inf['folder'].'/';
                       
$inf_admin_image = ($adminpanel['image'] ?: "infusion_panel.png");

                        if (empty(
$adminpanel['page'])) {
                           
$item_page = 5;
                        } else {
                           
$item_page = isnum($adminpanel['page']) ? $adminpanel['page'] : 5;
                        }

                       
$result = dbquery("INSERT INTO ".DB_ADMIN." (admin_rights, admin_image, admin_title, admin_link, admin_page, admin_language) VALUES ('".$adminpanel['rights']."', '".$link_prefix.$inf_admin_image."', '".$adminpanel['title']."', '".$link_prefix.$adminpanel['panel']."', '".$item_page."', '".$adminpanel['language']."')");

                       
$result2 = dbquery("SELECT user_id, user_rights FROM ".DB_USERS." WHERE user_level <=:admin AND ".in_group('user_rights', 'I', '.'), [':admin' => USER_LEVEL_ADMIN]);
                        while (
$data = dbarray($result2)) {
                           
$user_rights = explode('.', $data['user_rights']);

                            if (!
in_array($adminpanel['rights'], $user_rights)) {
                               
dbquery("UPDATE ".DB_USERS." SET user_rights='".$data['user_rights'].".".$adminpanel['rights']."' WHERE user_id='".$data['user_id']."'");
                            }
                        }

                        if (!
$result) {
                           
$error = TRUE;
                        }
                    }
                }
            }
        }

        return
$error;
    }

   
/**
     * Multilanguage Insert Rows
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function mlt_infuse($inf) {
       
$error = FALSE;
        if (
$inf['mlt'] && is_array($inf['mlt'])) {
            foreach (
$inf['mlt'] as $mlt) {
                if (
dbcount("(mlt_rights)", DB_LANGUAGE_TABLES, "mlt_rights = '".$mlt['rights']."'")) {
                   
dbquery("DELETE FROM ".DB_LANGUAGE_TABLES." WHERE mlt_rights='".$mlt['rights']."'");
                }
               
$result = dbquery("INSERT INTO ".DB_LANGUAGE_TABLES." (mlt_rights, mlt_title, mlt_status) VALUES ('".$mlt['rights']."', '".$mlt['title']."', '1')");
                if (!
$result) {
                   
$error = TRUE;
                }
            }
        }

        return
$error;
    }

   
/**
     * Change table structure
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function altertable_infuse($inf) {
       
$error = FALSE;
        if (
$inf['altertable'] && is_array($inf['altertable'])) {
            foreach (
$inf['altertable'] as $altertable) {
               
$statement = "ALTER TABLE ".$altertable;
               
$result = dbquery($statement);
                if (!
$result) {
                   
$error = TRUE;
                }
            }
        }

        return
$error;
    }

   
/**
     * Update Row Record
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function updatedbrow_infuse($inf) {
       
$error = FALSE;

        if (
$inf['updatedbrow'] && is_array($inf['updatedbrow'])) {
            foreach (
$inf['updatedbrow'] as $updatedbrow) {
               
$result = dbquery("UPDATE ".$updatedbrow);
                if (!
$result) {
                   
$error = TRUE;
                }
            }
        }

        return
$error;
    }

   
/**
     * Install New Table
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function newtable_infuse($inf) {
       
$error = FALSE;
        if (
$inf['newtable'] && is_array($inf['newtable'])) {
            foreach (
$inf['newtable'] as $newtable) {
               
$table_name = fusion_first_words($newtable, 1, '');
                if (!
db_exists($table_name)) {
                    if (
strpos($newtable, 'ENGINE=MyISAM;') == TRUE) {
                       
$db_collation = '';
                       
$newtable = str_replace('ENGINE=MyISAM;', 'ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;', $newtable);
                    } else if (
strpos($newtable, 'CHARSET=UTF8 COLLATE=utf8_unicode_ci') == TRUE) {
                       
$db_collation = '';
                       
$newtable = str_replace('CHARSET=UTF8 COLLATE=utf8_unicode_ci', 'CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci', $newtable);
                    } else {
                       
$db_collation = ' ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;';
                    }
                   
$result = dbquery("CREATE TABLE ".$newtable.$db_collation);
                    if (!
$result) {
                       
$error = TRUE;
                    }
                }
            }
        }

        return
$error;
    }

   
/**
     * Insert New Column
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function newcol_infuse($inf) {
       
$error = FALSE;
        static
$table_schema = [];
        if (!empty(
$inf['newcol']) && is_array($inf['newcol'])) {
            foreach (
$inf['newcol'] as $newCol) {
                if (
is_array($newCol) && !empty($newCol['table']) && !empty($newCol['column']) && !empty($newCol['column_type'])) {
                    if (empty(
$table_schema[$newCol['table']])) {
                       
$table_schema[$newCol['table']] = fieldgenerator($newCol['table']);
                    }
                   
$count = count($table_schema[$newCol['table']]);
                    if (!
in_array($newCol['column'], $table_schema[$newCol['table']])) {
                       
$result = dbquery("ALTER TABLE ".$newCol['table']." ADD ".$newCol['column']." ".$newCol['column_type']." AFTER ".$table_schema[$newCol['table']][$count - 1]);
                        if (!
$result) {
                           
$error = TRUE;
                        }
                    }
                }
            }
        }

        return
$error;
    }

   
/**
     * Insert Rows
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function insertdbrow_infuse($inf) {
       
$error = FALSE;
        if (
$inf['insertdbrow'] && is_array($inf['insertdbrow'])) {
           
$last_id = 0;
            foreach (
$inf['insertdbrow'] as $insertdbrow) {
                if (
stristr($insertdbrow, "{last_id}") && !empty($last_id)) {
                   
$result = dbquery("INSERT INTO ".str_replace("{last_id}", $last_id, $insertdbrow));
                } else {
                   
$result = dbquery("INSERT INTO ".$insertdbrow);
                   
$last_id = dblastid();
                }
                if (!
$result) {
                   
$error = TRUE;
                }
            }
        }

        return
$error;
    }

   
/**
     * Delete rows
     *
     * @param array $inf
     *
     * @return bool
     */
   
protected function deldbrow_infuse($inf) {
       
$error = FALSE;
        if (
$inf['deldbrow'] && is_array($inf['deldbrow']) && isset($inf['status']) && $inf['status'] > 0) {
            foreach (
$inf['deldbrow'] as $deldbrow) {
               
$result = dbquery("DELETE FROM ".$deldbrow);
                if (!
$result) {
                   
$error = TRUE;
                }
            }
        }

        return
$error;
    }

   
/**
     * Return list of infusions with available update
     *
     * @param bool $return_count Return only number
     *
     * @return array|int
     */
   
public static function updateChecker($return_count = TRUE) {
       
$infusion = [];
       
$inf_title = "";
       
$inf_description = "";
       
$inf_version = "";
       
$inf_developer = "";
       
$inf_email = "";
       
$inf_weburl = "";
       
$inf_folder = "";
       
$inf_image = "";
       
$inf_newtable = [];
       
$inf_insertdbrow = [];
       
$inf_updatedbrow = [];
       
$inf_droptable = [];
       
$inf_altertable = [];
       
$inf_deldbrow = [];
       
$inf_sitelink = [];
       
$inf_adminpanel = [];
       
$mlt_adminpanel = [];
       
$inf_mlt = [];
       
$mlt_insertdbrow = [];
       
$mlt_deldbrow = [];
       
$inf_delfiles = [];
       
$inf_newcol = [];
       
$inf_dropcol = [];
       
$db_prefix = DB_PREFIX;
       
$cookie_prefix = COOKIE_PREFIX;

       
$temp = makefilelist(INFUSIONS, '.|..|index.php', TRUE, 'folders');
       
$infusions = [];
       
$inf_version = '';

        foreach (
$temp as $folder) {
            if (
is_dir(INFUSIONS.$folder) && file_exists(INFUSIONS.$folder."/infusion.php")) {
                include(
INFUSIONS.$folder.'/infusion.php');
               
$infusions[$folder]['version'] = $inf_version ?: '0';
               
$infusions[$folder]['status'] = defined(strtoupper($folder).'_EXISTS') ? (version_compare($infusions[$folder]['version'], constant(strtoupper($folder).'_VERSION'), ">") ? 2 : 1) : 0;
            }
        }

        if (
$return_count) {
           
$count = [];
            if (
$infusions) {
                foreach (
$infusions as $inf) {
                    if (
$inf['status'] > 1) {
                       
$count[] = $inf;
                    }
                }
            }

            return
count($count);
        }

        return
$infusions;
    }
}