aboutsummaryrefslogtreecommitdiff
path: root/engine/lib
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib')
-rw-r--r--engine/lib/actions.php13
-rw-r--r--engine/lib/admin.php251
-rw-r--r--engine/lib/plugins.php80
-rw-r--r--engine/lib/sessions.php7
4 files changed, 269 insertions, 82 deletions
diff --git a/engine/lib/actions.php b/engine/lib/actions.php
index 7e8e43f40..304179828 100644
--- a/engine/lib/actions.php
+++ b/engine/lib/actions.php
@@ -236,5 +236,18 @@ function get_site_secret() {
return $secret;
}
+/**
+ * Check if an action is registered and its file exists.
+ *
+ * @param string $action
+ * @return BOOL
+ * @since 1.8
+ */
+function elgg_action_exist($action) {
+ global $CONFIG;
+
+ return (isset($CONFIG->actions[$action]) && file_exists($CONFIG->actions[$action]['file']));
+}
+
// Register some actions ***************************************************
register_elgg_event_handler("init","system","actions_init");
diff --git a/engine/lib/admin.php b/engine/lib/admin.php
index 8d9ffeba0..73e891332 100644
--- a/engine/lib/admin.php
+++ b/engine/lib/admin.php
@@ -28,53 +28,108 @@
* @param string $view The view to extend, by default this is 'admin/main'.
* @param int $priority Optional priority to govern the appearance in the list.
*/
-function extend_elgg_admin_page( $new_admin_view, $view = 'admin/main', $priority = 500) {
- return elgg_extend_view($view, $new_admin_view, $priority);
+function extend_elgg_admin_page($new_admin_view, $view = 'admin/main', $priority = 500) {
+ elgg_deprecated_notice('extend_elgg_admin_page() does nothing now. Extend admin views manually. See http://docs.elgg.org/', 1.8);
+ //return elgg_extend_view($view, $new_admin_view, $priority);
}
/**
- * Initialise the admin page.
+ * Add an admin area section or child section (aka tab).
+ *
+ * Used in conjuction with http://elgg.org/admin/section/child_section style
+ * page handler.
+ *
+ * @param string $section_id Globally unique section id.
+ * @param string $section_title Human readable section title.
+ * @param string $parent_id If a child section, the parent section id. Cannot have grandchildren.
*/
-function admin_init() {
- // Add plugin main menu option (last)
- extend_elgg_admin_page('admin/main_opt/statistics', 'admin/main');
- extend_elgg_admin_page('admin/main_opt/site', 'admin/main');
- extend_elgg_admin_page('admin/main_opt/user', 'admin/main');
- extend_elgg_admin_page('admin/main_opt/plugins', 'admin/main', 999); // Always last
-
- register_action('admin/user/ban', false, "", true);
- register_action('admin/user/unban', false, "", true);
- register_action('admin/user/delete', false, "", true);
- register_action('admin/user/resetpassword', false, "", true);
- register_action('admin/user/makeadmin', false, "", true);
- register_action('admin/user/removeadmin', false, "", true);
- register_action('admin/site/update_basic', false, "", true);
- register_action('admin/menu_items', false, "", true);
-
-
- // Page handler
- register_page_handler('admin', 'admin_settings_page_handler');
+function elgg_add_admin_section($section_id, $section_title, $parent_id = NULL) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->admin_sections)) {
+ $CONFIG->admin_sections = array();
+ }
+
+ // have to support adding a child section to a missing parent
+ // because of plugin order problems. A plugin can extend
+ // an admin section added by different plugin lower in the load priority.
+ if ($parent_id) {
+ if (!isset($CONFIG->admin_sections[$parent_id])) {
+ $CONFIG->admin_sections[$parent_id] = array('children' => array());
+ }
+
+ if (!isset($CONFIG->admin_sections[$parent_id][$section_id])) {
+ $CONFIG->admin_sections[$parent_id]['children'][$section_id] = array('title' => $section_title);
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else {
+ // children can be defined before parents
+ if (!isset($CONFIG->admin_sections[$section_id])) {
+ $CONFIG->admin_sections[$section_id] = array(
+ 'title' => $section_title,
+ 'children' => array()
+ );
+ return TRUE;
+ } else {
+ // allow to define this since children can be defined before the parent.
+ $CONFIG->admin_sections[$section_id] = array(
+ 'title' => $section_title
+ );
+ }
+ }
}
/**
- * Add submenu items for admin page.
- *
- * @return unknown_type
+ * Initialise the admin page.
*/
-function admin_pagesetup() {
- if (get_context() == 'admin') {
- global $CONFIG;
-
- add_submenu_item(elgg_echo('admin:statistics'), $CONFIG->wwwroot . 'pg/admin/statistics/');
- add_submenu_item(elgg_echo('admin:site'), $CONFIG->wwwroot . 'pg/admin/site/');
- add_submenu_item(elgg_echo('admin:user'), $CONFIG->wwwroot . 'pg/admin/user/');
- add_submenu_item(elgg_echo('admin:plugins'), $CONFIG->wwwroot . 'pg/admin/plugins/');
- add_submenu_item(elgg_echo('admin:menu_items'), $CONFIG->wwwroot . 'pg/admin/menu_items/');
- }
+function admin_init() {
+ register_action('admin/user/ban', FALSE, "", TRUE);
+ register_action('admin/user/unban', FALSE, "", TRUE);
+ register_action('admin/user/delete', FALSE, "", TRUE);
+ register_action('admin/user/resetpassword', FALSE, "", TRUE);
+ register_action('admin/user/makeadmin', FALSE, "", TRUE);
+ register_action('admin/user/removeadmin', FALSE, "", TRUE);
+
+ register_action('admin/site/update_basic', FALSE, "", TRUE);
+ register_action('admin/site/update_advanced', FALSE, "", TRUE);
+
+ register_action('admin/menu_items', FALSE, "", TRUE);
+
+ register_action('admin/plugins/simple_update_states', FALSE, '', TRUE);
+
+
+ // admin area overview and basic site settings
+ elgg_add_admin_section('overview', elgg_echo('admin:overview'));
+ elgg_add_admin_section('site', elgg_echo('admin:site'));
+ elgg_add_admin_section('basic', elgg_echo('admin:site:basic'), 'site');
+ elgg_add_admin_section('advanced', elgg_echo('admin:site:advanced'), 'site');
+
+ // appearance
+ elgg_add_admin_section('appearance', elgg_echo('admin:appearance'));
+ //elgg_add_admin_section('basic', elgg_echo('admin:appearance'), 'appearance');
+ elgg_add_admin_section('menu_items', elgg_echo('admin:menu_items'), 'appearance');
+
+ // users
+ elgg_add_admin_section('users', elgg_echo('admin:users'));
+ elgg_add_admin_section('online', elgg_echo('admin:users:online'), 'users');
+ elgg_add_admin_section('add', elgg_echo('admin:users:add'), 'users');
+ elgg_add_admin_section('find', elgg_echo('admin:users:find'), 'users');
+
+ // plugins
+ elgg_add_admin_section('plugins', elgg_echo('admin:plugins'));
+ elgg_add_admin_section('simple', elgg_echo('admin:plugins:simple'), 'plugins');
+ elgg_add_admin_section('advanced', elgg_echo('admin:plugins:advanced'), 'plugins');
+
+ // handled in the admin sidemenu so we don't have to generate this on every page load.
+ //elgg_add_admin_section('plugin_settings', elgg_echo('admin:plugin_settings'));
+
+ register_page_handler('admin', 'admin_settings_page_handler');
}
/**
- * Handle admin pages.
+ * Handle admin pages. Expects corresponding views as admin/section/subsection
*
* @param $page
* @return unknown_type
@@ -82,72 +137,124 @@ function admin_pagesetup() {
function admin_settings_page_handler($page) {
global $CONFIG;
- $path = $CONFIG->path . "admin/index.php";
+ admin_gatekeeper();
- if ($page[0]) {
- switch ($page[0]) {
- case 'user' : $path = $CONFIG->path . "admin/user.php"; break;
- case 'statistics' : $path = $CONFIG->path . "admin/statistics.php"; break;
- case 'plugins' : $path = $CONFIG->path . "admin/plugins.php"; break;
- case 'site' : $path = $CONFIG->path . "admin/site.php"; break;
- case 'menu_items' : $path = $CONFIG->path . 'admin/menu_items.php'; break;
- }
+ // default to overview
+ if (!isset($page[0]) || empty($page[0])) {
+ $page = array('overview');
}
- if ($page[1]) {
- set_input('username', $page[1]);
+ // was going to fix this in the page_handler() function but
+ // it's commented to explicitly return a string if there's a trailing /
+ if (empty($page[count($page)-1])) {
+ array_pop($page);
}
- include($path);
+ $vars = array('page' => $page);
+
+ // special page for plugin settings since we create the form for them
+ if ($page[0] == 'plugin_settings' && isset($page[1]) && elgg_view_exists("settings/{$page[1]}/edit")) {
+ $view = '/admin/components/plugin_settings';
+ $vars['plugin'] = $page[1];
+ $vars['entity'] = find_plugin_settings($page[1]);
+ $title = elgg_echo("admin:plugin_settings:{$page[1]}");
+ } else {
+ $view = 'admin/' . implode('/', $page);
+ $title = elgg_echo('admin:' . implode(':', $page));
+ }
+
+ // allow a place to store helper views outside of the web-accessible views
+ if ($page[0] == 'components' || !($content = elgg_view($view, $vars))) {
+ $title = elgg_echo('admin:unknown_section');
+ $content = elgg_echo('admin:unknown_section');
+ }
+
+ $body = elgg_view('admin/components/admin_page_layout', array('content' => $content, 'page' => $page));
+ page_draw($title, $body);
}
/**
- * Write a persistent message to the administrator's notification window.
+ * Write a persistent message to the admin view.
+ * Useful to alert the admin to take a certain action.
+ * The id is a unique ID that can be cleared once the admin
+ * completes the action.
*
- * Currently this writes a message to the admin store, we may want to come up with another way at some point.
+ * eg: add_admin_notice('twitter_service_no_api',
+ * 'Before your users can use Twitter services on this site, you must set up
+ * the Twitter API key in the <a href="link">Twitter Services Settings</a>');
*
- * @param string $subject Subject of the message
+ * @param string $id A unique ID that your plugin can remember
* @param string $message Body of the message
*/
-function send_admin_message($subject, $message) {
- $subject = sanitise_string($subject);
- $message = sanitise_string($message);
-
- if (($subject) && ($message)) {
- $admin_message = new ElggObject();
- $admin_message->subtype = 'admin_message';
- $admin_message->access_id = ACCESS_PUBLIC;
- $admin_message->title = $subject;
- $admin_message->description = $message;
-
- return $admin_message->save();
+function elgg_add_admin_notice($id, $message) {
+ if ($id && $message) {
+ $admin_notice = new ElggObject();
+ $admin_notice->subtype = 'admin_notice';
+ // admins can see ACCESS_PRIVATE but no one else can.
+ $admin_notice->access_id = ACCESS_PRIVATE;
+ $admin_notice->admin_notice_id = $id;
+ $admin_notice->description = $message;
+
+ return $admin_notice->save();
}
return false;
}
+
+/**
+ * Remove an admin notice by ID.
+ *
+ * eg In actions/twitter_service/save_settings:
+ * if (is_valid_twitter_api_key()) {
+ * delete_admin_notice('twitter_services_no_api');
+ * }
+ *
+ * @param string $id The unique ID assigned in add_admin_notice()
+ */
+function elgg_delete_admin_notice($id) {
+ if (!$id) {
+ return FALSE;
+ }
+ $result = TRUE;
+ if ($notices = elgg_get_entities_from_metadata(array('metadata_name' => 'admin_notice_id', 'metadata_value' => $id))) {
+ // in case a bad plugin adds many, let it remove them all at once.
+ foreach ($notices as $notice) {
+ $result = ($result && $notice->delete());
+ }
+ return $result;
+ }
+ return FALSE;
+}
+
/**
* List all admin messages.
*
* @param int $limit Limit
*/
-function list_admin_messages($limit = 10) {
- return elgg_list_entities(array(
+function elgg_get_admin_notices($limit = 10) {
+ return elgg_get_entities_from_metadata(array(
'type' => 'object',
- 'subtype' => 'admin_message',
+ 'subtype' => 'admin_notice',
'limit' => $limit
));
}
/**
- * Remove an admin message.
- *
- * @param int $guid The
+ * Check if an admin notice is currently active.
+ * @param string $id The unique ID used to register the notice.
*/
-function clear_admin_message($guid) {
- return delete_entity($guid);
+function elgg_admin_notice_exists($id) {
+ $notice = elgg_get_entities_from_metadata(array(
+ 'type' => 'object',
+ 'subtype' => 'admin_notice',
+ 'metadata_name_value_pair' => array('name' => 'admin_notice_id', 'value' => $id)
+ ));
+
+ return ($notice) ? TRUE : FALSE;
}
-/// Register init functions
+
+// Register init functions
register_elgg_event_handler('init', 'system', 'admin_init');
register_elgg_event_handler('pagesetup', 'system', 'admin_pagesetup');
diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php
index 0e62914e2..b365585c8 100644
--- a/engine/lib/plugins.php
+++ b/engine/lib/plugins.php
@@ -354,6 +354,11 @@ function load_plugin_manifest($plugin) {
}
}
+ // handle plugins that don't define a name
+ if (!isset($elements['name'])) {
+ $elements['name'] = ucwords($plugin);
+ }
+
return $elements;
}
@@ -677,6 +682,10 @@ function enable_plugin($plugin, $site_guid = 0) {
throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $site_guid, "ElggSite"));
}
+ if (!$plugin_info = load_plugin_manifest($plugin)) {
+ return FALSE;
+ }
+
// getMetadata() doesn't return an array if only one plugin is enabled
if ($enabled = $site->enabled_plugins) {
if (!is_array($enabled)) {
@@ -689,8 +698,42 @@ function enable_plugin($plugin, $site_guid = 0) {
$enabled[] = $plugin;
$enabled = array_unique($enabled);
- $return = $site->setMetaData('enabled_plugins', $enabled);
- $ENABLED_PLUGINS_CACHE = $enabled;
+ if ($return = $site->setMetaData('enabled_plugins', $enabled)) {
+
+ // for other plugins that want to hook into this.
+ if ($return && !trigger_elgg_event('enable', 'plugin', array('plugin' => $plugin, 'manifest' => $plugin_info))) {
+ $return = FALSE;
+ }
+
+ // for this plugin's on_enable
+ if ($return && isset($plugin_info['on_enable'])) {
+ // pull in the actual plugin's start so the on_enable function is callabe
+ // NB: this will not run re-run the init hooks!
+ $start = "{$CONFIG->pluginspath}$plugin/start.php";
+ if (!file_exists($start) || !include($start)) {
+ $return = FALSE;
+ }
+
+ // need language files for the messages
+ $translations = "{$CONFIG->pluginspath}$plugin/languages/";
+ register_translations($translations);
+ if (!is_callable($plugin_info['on_enable'])) {
+ $return = FALSE;
+ } else {
+ $on_enable = call_user_func($plugin_info['on_enable']);
+ // allow null to mean "I don't care" like other subsystems
+ $return = ($on_disable === FALSE) ? FALSE : TRUE;
+ }
+ }
+
+ // disable the plugin if the on_enable or trigger results failed
+ if (!$return) {
+ array_pop($enabled);
+ $site->setMetaData('enabled_plugins', $enabled);
+ }
+
+ $ENABLED_PLUGINS_CACHE = $enabled;
+ }
return $return;
}
@@ -721,6 +764,10 @@ function disable_plugin($plugin, $site_guid = 0) {
throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $site_guid, "ElggSite"));
}
+ if (!$plugin_info = load_plugin_manifest($plugin)) {
+ return FALSE;
+ }
+
// getMetadata() doesn't return an array if only one plugin is enabled
if ($enabled = $site->enabled_plugins) {
if (!is_array($enabled)) {
@@ -730,6 +777,8 @@ function disable_plugin($plugin, $site_guid = 0) {
$enabled = array();
}
+ $old_enabled = $enabled;
+
// remove the disabled plugin from the array
if (FALSE !== $i = array_search($plugin, $enabled)) {
unset($enabled[$i]);
@@ -738,7 +787,32 @@ function disable_plugin($plugin, $site_guid = 0) {
// if we're unsetting all the plugins, this will return an empty array.
// it will fail with FALSE, though.
$return = (FALSE === $site->enabled_plugins = $enabled) ? FALSE : TRUE;
- $ENABLED_PLUGINS_CACHE = $enabled;
+
+ if ($return) {
+ // for other plugins that want to hook into this.
+ if ($return && !trigger_elgg_event('disable', 'plugin', array('plugin' => $plugin, 'manifest' => $plugin_info))) {
+ $return = FALSE;
+ }
+
+ // for this plugin's on_disable
+ if ($return && isset($plugin_info['on_disable'])) {
+ if (!is_callable($plugin_info['on_disable'])) {
+ $return = FALSE;
+ } else {
+ $on_disable = call_user_func($plugin_info['on_disable']);
+ // allow null to mean "I don't care" like other subsystems
+ $return = ($on_disable === FALSE) ? FALSE : TRUE;
+ }
+ }
+
+ // disable the plugin if the on_enable or trigger results failed
+ if (!$return) {
+ $site->enabled_plugins = $old_enabled;
+ $ENABLED_PLUGINS_CACHE = $old_enabled;
+ } else {
+ $ENABLED_PLUGINS_CACHE = $enabled;
+ }
+ }
return $return;
}
diff --git a/engine/lib/sessions.php b/engine/lib/sessions.php
index f4b1fc69b..b5b68ebe0 100644
--- a/engine/lib/sessions.php
+++ b/engine/lib/sessions.php
@@ -417,13 +417,6 @@ function login(ElggUser $user, $persistent = false) {
set_last_login($_SESSION['guid']);
reset_login_failure_count($user->guid); // Reset any previous failed login attempts
- // Set admin shortcut flag if this is an admin
-// if (isadminloggedin()) {
-// //@todo REMOVE THIS.
-// global $is_admin;
-// $is_admin = true;
-// }
-
return true;
}