EXTENSIONS_DIR.'/disabled', 'enterprise' => ENTERPRISE_DIR.'/'.EXTENSIONS_DIR.'/disabled', ]; foreach ($dirs as $type => $dir) { $handle = false; if (file_exists($dir)) { $handle = @opendir($dir); } if (empty($handle)) { continue; } $ignores = [ '.', '..', ]; $file = readdir($handle); while ($file !== false) { if (in_array($file, $ignores)) { $file = readdir($handle); continue; } $filepath = realpath($dir.'/'.$file); if (! is_readable($filepath) || is_dir($filepath) || ! preg_match('/.*\.php$/', $filepath)) { $file = readdir($handle); continue; } // $content = file_get_contents($filepath); $content = ''; $data = []; $data['operation_menu'] = false; if (preg_match("//", $content)) { $data['operation_menu'] = true; } $data['godmode_menu'] = false; if (preg_match('/<\?php(\n|.)*extensions_add_godmode_menu_option(\n|.)*\?>/', $content)) { $data['godmode_menu'] = true; } $data['operation_function'] = false; if (preg_match('/<\?php(\n|.)*extensions_add_main_function(\n|.)*\?>/', $content)) { $data['operation_function'] = true; } $data['login_function'] = false; if (preg_match('/<\?php(\n|.)*extensions_add_login_function(\n|.)*\?>/', $content)) { $data['login_function'] = true; } $data['extension_ope_tab'] = false; if (preg_match('/<\?php(\n|.)*extensions_add_opemode_tab_agent(\n|.)*\?>/', $content)) { $data['extension_ope_tab'] = true; } $data['extension_god_tab'] = false; if (preg_match('/<\?php(\n|.)*extensions_add_godmode_tab_agent(\n|.)*\?>/', $content)) { $data['extension_god_tab'] = true; } $data['godmode_function'] = false; if (preg_match('/<\?php(\n|.)*extensions_add_godmode_function(\n|.)*\?>/', $content)) { $data['godmode_function'] = true; } $data['enterprise'] = false; if ($type == 'enterprise') { $data['enterprise'] = true; } $data['enabled'] = false; $extensions[$file] = $data; $file = readdir($handle); } } return $extensions; } /** * Get info of all extensions (enabled/disabled) */ function extensions_get_extension_info() { global $config; $return = []; foreach ($config['extensions'] as $extension) { $data = []; $data['godmode_function'] = false; if (!empty($extension['godmode_function'])) { $data['godmode_function'] = true; } $data['godmode_menu'] = false; if (!empty($extension['godmode_menu'])) { $data['godmode_menu'] = true; } $data['operation_function'] = false; if (!empty($extension['main_function'])) { $data['operation_function'] = true; } $data['operation_menu'] = false; if (!empty($extension['operation_menu'])) { $data['operation_menu'] = true; } $data['login_function'] = false; if (!empty($extension['login_function'])) { $data['login_function'] = true; } $data['extension_ope_tab'] = false; if (!empty($extension['extension_ope_tab'])) { $data['extension_ope_tab'] = true; } $data['extension_god_tab'] = false; if (!empty($extension['extension_god_tab'])) { $data['extension_god_tab'] = true; } $data['enterprise'] = (bool) $extension['enterprise']; $data['enabled'] = true; $return[$extension['file']] = $data; } $return = ($return + extensions_get_disabled_extensions()); return $return; } /** * Load all extensions * * @param array $extensions */ function extensions_load_extensions($process_login) { global $config; global $extension_file; foreach ($config['extensions'] as $extension) { $extension_file = $extension['file']; $path_extension = realpath($extension['dir'].'/'.$extension_file); // -------------------------------------------------------------- // // PHP BUG // // #66518 need some exceptions for php's include or require // // https://bugs.php.net/bug.php?id=66518 // -------------------------------------------------------------- // ~ if ($process_login) { // ~ //Check the syntax for avoid PHP errors // ~ $output = null; // ~ $return_var = null; // ~ exec('php -l ' . $path_extension, $output, $return_code); // ~ if ($return_code !== 0) { // ~ // There is a error. // ~ // ~ set_pandora_error_for_header( // ~ __('There are some errors in the PHP file of extension %s .', $extension_file)); // ~ } // ~ else { // ~ require_once($path_extension); // ~ } // ~ } // ~ else { try { include_once $path_extension; } // PHP 7 catch (Throwable $e) { } // PHP 5 catch (Exception $e) { } // ~ } } } /** * This function adds a link to the extension with the given name in Operation menu. * * @param string name Name of the extension in the Operation menu * @param string fatherId Id of the parent menu item for the current extension * @param string subfatherId Id of the parent submenu item for the current extension * @param string icon Path to the icon image (18x18 px). If this parameter is blank then predefined icon will be used */ function extensions_add_operation_menu_option($name, $fatherId=null, $icon=null, $version='N/A', $subfatherId=null, $acl='AR') { global $config; global $extension_file; /* $config['extension_file'] is set in extensions_load_extensions(), since that function must be called before any function the extension call, we are sure it will be set. */ $option_menu['name'] = $name; $option_menu['acl'] = $acl; $extension = &$config['extensions'][$extension_file]; $option_menu['sec2'] = $extension['dir'].'/'.mb_substr(($extension_file ?? ''), 0, -4); $option_menu['fatherId'] = $fatherId; $option_menu['subfatherId'] = $subfatherId; $option_menu['icon'] = $icon; $option_menu['version'] = $version; $extension['operation_menu'] = $option_menu; } /** * This function adds a link to the extension with the given name in Godmode menu. * * @param string name Name of the extension in the Godmode menu * @param string acl User ACL level required to see this extension in the godmode menu * @param string fatherId Id of the parent menu item for the current extension * @param string subfatherId Id of the parent submenu item for the current extension * @param string icon Path to the icon image (18x18 px). If this parameter is blank then predefined icon will be used */ function extensions_add_godmode_menu_option($name, $acl, $fatherId=null, $icon=null, $version='N/A', $subfatherId=null) { global $config; global $extension_file; /* $config['extension_file'] is set in extensions_load_extensions(), since that function must be called before any function the extension call, we are sure it will be set. */ $option_menu['acl'] = $acl; $option_menu['name'] = $name; $extension = &$config['extensions'][$extension_file]; $option_menu['sec2'] = $extension['dir'].'/'.mb_substr($extension_file, 0, -4); $option_menu['fatherId'] = $fatherId; $option_menu['subfatherId'] = $subfatherId; $option_menu['icon'] = $icon; $option_menu['version'] = $version; $extension['godmode_menu'] = $option_menu; } /** * Add in the header tabs in Godmode agent menu the extension tab. * * @param tabId Id of the extension tab * @param tabName Name of the extension tab * @param tabIcon Path to the image icon * @param tabFunction Name of the function to execute when this extension is called */ function extensions_add_godmode_tab_agent($tabId, $tabName, $tabIcon, $tabFunction, $version='N/A', $acl='AW') { global $config; global $extension_file; $extension = &$config['extensions'][$extension_file]; $extension['extension_god_tab'] = []; $extension['extension_god_tab']['id'] = $tabId; $extension['extension_god_tab']['name'] = $tabName; $extension['extension_god_tab']['icon'] = $tabIcon; $extension['extension_god_tab']['function'] = $tabFunction; $extension['extension_god_tab']['version'] = $version; $extension['extension_ope_tab']['acl'] = $acl; } /** * Add in the header tabs in Operation agent menu the extension tab. * * @param tabId Id of the extension tab * @param tabName Name of the extension tab * @param tabIcon Path to the image icon * @param tabFunction Name of the function to execute when this extension is called */ function extensions_add_opemode_tab_agent($tabId, $tabName, $tabIcon, $tabFunction, $version='N/A', $acl='AR') { global $config; global $extension_file; $extension = &$config['extensions'][$extension_file]; $extension['extension_ope_tab'] = []; $extension['extension_ope_tab']['id'] = $tabId; $extension['extension_ope_tab']['name'] = $tabName; $extension['extension_ope_tab']['icon'] = $tabIcon; $extension['extension_ope_tab']['function'] = $tabFunction; $extension['extension_ope_tab']['version'] = $version; $extension['extension_ope_tab']['acl'] = $acl; } /** * Add the function to call when user clicks on the Operation menu link * * @param string $function_name Callback function name */ function extensions_add_main_function($function_name) { global $config; global $extension_file; $extension = &$config['extensions'][$extension_file]; $extension['main_function'] = $function_name; } /** * Add the function to call when user clicks on the Godmode menu link * * @param string $function_name Callback function name */ function extensions_add_godmode_function($function_name) { global $config; global $extension_file; $extension = &$config['extensions'][$extension_file]; $extension['godmode_function'] = $function_name; } /** * Adds extension function when user login on Pandora console * * @param string $function_name Callback function name */ function extensions_add_login_function($function_name) { global $config; global $extension_file; $extension = &$config['extensions'][$extension_file]; $extension['login_function'] = $function_name; } /** * Adds extension function when translation string * * @param string $function_name Callback function name */ function extensions_add_translation_string_function($translate_function_name) { global $config; global $extension_file; $extension = &$config['extensions'][$extension_file]; $extension['translate_function'] = $translate_function_name; }