<?php
/*
Bluetrait 2.0 Plugin Support
Michael Dale Copyright 2008
*/
if (!defined('BT_ROOT')) exit;
$bt_installed_plugins = bt_get_config('plugin_data');
$bt_plugin_dir = BT_ROOT . BT_CONTENT . '/bt-plugins/';
$bt_tasks = array();
$bt_content_filters = array();
function bt_load_plugins() {
global $bt_installed_plugins, $bt_plugin_dir;
if (is_array($bt_installed_plugins)) {
foreach($bt_installed_plugins as $x) {
$x = bt_sanitize_plugin_name($x);
if (file_exists("$bt_plugin_dir$x.plugin.php")) {
include("$bt_plugin_dir$x.plugin.php");
}
else {
bt_disable_plugin($x);
}
}
}
}
function bt_plugin_loaded($plugin_name) {
global $bt_installed_plugins;
if (!empty($plugin_name) && is_array($bt_installed_plugins)) {
if (in_array($plugin_name, $bt_installed_plugins)) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
//enable a plugin
function bt_enable_plugin($plugin_name) {
global $bt_installed_plugins;
$plugin_name = bt_sanitize_plugin_name($plugin_name);
if (!empty($plugin_name)) {
if (!in_array($plugin_name, $bt_installed_plugins)) {
bt_run_section('enable_plugin_' . $plugin_name);
$bt_installed_plugins[] = $plugin_name;
trigger_error('Plugin enabled: "' . $plugin_name . '"', E_USER_NOTICE);
bt_set_config('plugin_data', $bt_installed_plugins);
}
}
}
//disable a plugin
function bt_disable_plugin($plugin_name) {
global $bt_installed_plugins;
if (in_array($plugin_name, $bt_installed_plugins)) {
bt_run_section('disable_plugin_' . $plugin_name);
$key = array_search($plugin_name, $bt_installed_plugins);
unset($bt_installed_plugins[$key]);
$bt_installed_plugins = array_values($bt_installed_plugins);
trigger_error('Plugin disabled: "' . $plugin_name . '"', E_USER_NOTICE);
bt_set_config('plugin_data', $bt_installed_plugins);
}
}
function bt_disable_all() {
$bt_installed_plugins;
foreach ($bt_installed_plugins as $index => $value) {
bt_run_section('disable_plugin_' . $value);
}
$installed_plugins = array();
trigger_error("Plugins Disabled", E_USER_NOTICE);
bt_set_config('plugin_data', $installed_plugins);
}
function bt_any_enabled() {
global $bt_installed_plugins;
if (empty($bt_installed_plugins)) {
return false;
}
else {
return true;
}
}
function bt_add_task($plugin_name, $section, $function, $priority = 10, $arguments = 1) {
global $bt_tasks;
//need to fix this for objects
if (is_object($function[0])) bt_die('Objects can not currently be used for tasks.');
$bt_tasks[$section][$priority][$function] = array($plugin_name, $arguments);
return true;
}
function bt_has_task($section) {
global $bt_tasks;
if (isset($bt_tasks[$section])) {
return true;
}
else {
return false;
}
}
function bt_remove_task($section, $function, $priority = 10) {
global $bt_tasks;
unset($bt_tasks[$section][$priority][$function]);
return true;
}
function bt_add_content_filter($plugin_name, $section, $function, $priority = 10, $arguments = 1) {
global $bt_content_filters;
//need to fix this for objects
if (is_object($function[0])) bt_die('Objects can not currently be used for tasks.');
$bt_content_filters[$section][$priority][$function] = array($plugin_name, $arguments);
return;
}
function bt_has_content_filter($section) {
global $bt_content_filters;
if (isset($bt_content_filters[$section])) {
return true;
}
else {
return false;
}
}
function bt_remove_content_filter($section, $function, $priority = 10) {
global $bt_content_filters;
unset($bt_content_filters[$section][$priority][$function]);
return;
}
//pass by reference
function bt_run_section_ref($section, &$args = '') {
global $bt_tasks;
//echo $section . '<br />';
if (!isset($bt_tasks[$section])) return false;
//sorts based on priority, 1 being the highest (first run)
ksort($bt_tasks[$section], SORT_NUMERIC);
//call_user_func_array requires an array
$arguments = array(&$args);
foreach($bt_tasks[$section] as $priority => $functions) {
foreach($bt_tasks[$section][$priority] as $function => $task_details) {
if (!function_exists($function)) {
trigger_error('Plugin "'. bt_htmlentities($task_details[0]) .'" called undefined function "' . bt_htmlentities($function) . '" in section "' . bt_htmlentities($section) . '".', E_USER_ERROR);
continue;
}
call_user_func_array($function, $arguments);
}
}
return true;
}
function bt_run_section($section, $args = '') {
return bt_run_section_ref($section, $args);
}
/*
*/
function bt_run_content_filter($section, $content = '') {
global $bt_content_filters;
//echo $section . '<br />';
if (!isset($bt_content_filters[$section])) return $content;
//sorts based on priority, 1 being the highest (first run)
ksort($bt_content_filters[$section], SORT_NUMERIC);
foreach($bt_content_filters[$section] as $priority => $functions) {
foreach($bt_content_filters[$section][$priority] as $function => $task_details) {
if (!function_exists($function)) {
trigger_error('Plugin "'. bt_htmlentities($task_details[0]) .'" called undefined function "' . bt_htmlentities($function) . '" in section "' . bt_htmlentities($section) . '".', E_USER_ERROR);
continue;
}
$content = call_user_func($function, $content);
}
}
return $content;
}
function bt_get_all_plugins() {
global $bt_plugin_dir, $bt_general_plugin_warning;
$plugin_info = array();
$plugin_info_temp = array();
$bt_general_plugin_warning = FALSE;
if (is_dir($bt_plugin_dir)) {
$plugin_folders[] = '';
$folder = opendir($bt_plugin_dir);
while (false !== ($dir_array = readdir($folder))) {
if ($dir_array != '.' && $dir_array != '..') {
if(is_dir($bt_plugin_dir . $dir_array)) {
if (bt_sanitize_plugin_name($dir_array) == $dir_array) {
$plugin_folders[] = $dir_array . '/';
}
}
}
}
closedir($folder);
}
foreach($plugin_folders as $plugin_folder) {
$plugin_folder_full = $bt_plugin_dir . $plugin_folder;
if (is_dir($plugin_folder_full)) {
$folder = opendir($plugin_folder_full);
while (false !== ($file_array = readdir($folder))) {
if ($file_array != '.' && $file_array != '..') {
if(filetype($plugin_folder_full . $file_array) == 'file') {
if(preg_match("/^([a-z0-9_\/]+).plugin.php$/", $file_array, $matches) > 0){
$plugin_info[$matches[1]] =
array (
'plugin_file_name' => $plugin_folder . $matches[1],
'plugin_name' => $matches[1],
'plugin_description' => 'Meta File Missing Or Corrupt',
'plugin_update_checker_url' => '',
'plugin_author' => '',
'plugin_author_website' => '',
'plugin_website' => '',
'plugin_version' => ''
);
if (file_exists($plugin_folder_full . $matches[1] . '.meta.plugin.php')) {
include_once($plugin_folder_full . $matches[1] . '.meta.plugin.php');
if (class_exists($matches[1])) {
$plugin_info_temp[$matches[1]] = new $matches[1];
if (method_exists($plugin_info_temp[$matches[1]], 'meta_data')) {
$plugin_info[$matches[1]] = $plugin_info_temp[$matches[1]]->meta_data();
$plugin_info[$matches[1]]['plugin_file_name'] = $plugin_folder . $matches[1];
}
else {
}
}
else {
$bt_general_plugin_warning = TRUE;
trigger_error('The meta file for plugin "' . bt_htmlentities($matches[1]) . '" does not contain the "' . bt_htmlentities($matches[1]) . '" class.', E_USER_WARNING);
}
}
else {
$bt_general_plugin_warning = TRUE;
trigger_error('The meta file for plugin "' . bt_htmlentities($matches[1]) . '" cannot be found.<br />It should be in the plugins folder called "' . bt_htmlentities($matches[1] . '.meta.plugin.php') . '" but is not.', E_USER_WARNING);
}
}
}
}
}
closedir($folder);
}
}
ksort($plugin_info);
return $plugin_info;
}
function bt_sanitize_plugin_name($plugin_name) {
$plugin_name = strtolower($plugin_name);
$plugin_name = preg_replace('([^0-9a-z_\/])', '', $plugin_name);
return $plugin_name;
}
//function from WordPress
function bt_plugin_basename($file) {
$file = str_replace('\\','/',$file); // sanitize for Win32 installs
$file = preg_replace('|/+|','/', $file); // remove any duplicate slash
$file = preg_replace('|^.*' . BT_CONTENT . '/bt-plugins' . '/|','',$file); // get relative path from plugins dir
return $file;
}
function bt_plugin_base_url($file) {
$file = bt_plugin_basename($file);
$file = str_replace('.plugin.php','',$file);
return $file;
}
//check if a plugin is out of date
function bt_plugin_out_of_date($plugin_name, $plugin_version) {
static $plugin_update_data_array;
if (!isset($plugin_update_data_array)) {
$plugin_update_data_array = bt_get_config('plugin_update_data');
}
$plugin_name = bt_sanitize_plugin_name($plugin_name);
if (isset($plugin_update_data_array[$plugin_name])) {
try {
$plugin_update_data = $plugin_update_data_array[$plugin_name];
$current_version = explode('-', $plugin_version);
$current_version = $current_version[0];
$xml = new SimpleXMLElement($plugin_update_data);
if (version_compare($current_version, $xml->version, '<')) {
//new version
$array['version'] = $xml->version;
$array['release_notes'] = $xml->release_notes;
$array['download'] = $xml->download;
return $array;
}
else {
return false;
}
}
catch (Exception $e) {
trigger_error('Unable to read update information for plugin "'.bt_htmlentities($plugin_name).'"', E_USER_ERROR);
}
}
else {
return false;
}
}
?> |