/** * Perform a check of all beaconids. * Notifies update_check plugin hooks when checking so that they can add their beaconids to the list. * @return array An array of update beacon information for components that have updates * @throws \Exception */ public static function check() { try { // get a local version of the instance to save typing $instance = self::instance(); // load beacons self::register_beacons(); // setup the remote request $request = new RemoteRequest(self::UPDATE_URL, 'POST'); // add all the beacon versions as parameters $request->set_params(Utils::array_map_field($instance->beacons, 'version')); // we're not desperate enough to wait too long $request->set_timeout(5); // execute the request $result = $request->execute(); // grab the body of the response, which has our xml in it $update_data = $request->get_response_body(); // i don't know why we hold the XML in a class variable, but we'll keep doing that in this rewrite $instance->update = new \SimpleXMLElement($update_data); foreach ($instance->update as $beacon) { $beacon_id = (string) $beacon['id']; $beacon_url = (string) $beacon['url']; $beacon_type = isset($beacon['type']) ? (string) $beacon['type'] : 'addon'; // do we have this beacon? if not, don't process it // even though we POST all our beacons to the update script right now, it still hands back the whole list if (empty($instance->beacons[$beacon_id])) { continue; } // add the beacon's basic info $instance->beacons[$beacon_id]['id'] = $beacon_id; $instance->beacons[$beacon_id]['url'] = $beacon_url; $instance->beacons[$beacon_id]['type'] = $beacon_type; foreach ($beacon->update as $update) { // pick out and cast all the values from the XML $u = array('severity' => (string) $update['severity'], 'version' => (string) $update['version'], 'date' => isset($update['date']) ? (string) $update['date'] : '', 'url' => isset($update['url']) ? (string) $update['url'] : '', 'text' => (string) $update); // if the remote update info version is newer... we want all newer versions if (version_compare($u['version'], $instance->beacons[$beacon_id]['version']) > 0) { // if this version is more recent than all the other versions if (!isset($instance->beacons[$beacon_id]['latest_version']) || version_compare($u['version'], $instance->beacons[$beacon_id]['latest_version']) > 0) { // set this as the latest version $instance->beacons[$beacon_id]['latest_version'] = $u['version']; } // add the version to the list $instance->beacons[$beacon_id]['updates'][$u['version']] = $u; } } } // return an array of beacons that have updates return array_filter($instance->beacons, Method::create('\\Habari\\Update', 'filter_unchanged')); } catch (\Exception $e) { // catches any RemoteRequest errors or XML parsing problems, etc. // bubble up throw $e; } }
public function get_form() { $users = Users::get_all(); $users = Utils::array_map_field($users, 'username', 'id'); $form = new FormUI('sudo'); $form->append(new FormControlSelect('userlist', 'null:null', 'Become User:'******'submit', 'Submit')); $form->set_option('form_action', URL::get('sudo')); $form->onsubmit = 'return dosudo.setuser();'; return $form; }
/** * Add pre-defined rules to an array of rules only if rules with their names don't already exist * * @param array $rules An array of RewriteRule objects * @return array An array of rules with the system rules potentially added */ public static function add_system_rules($rules) { $default_rules = array(array('name' => 'display_home', 'parse_regex' => '#^(?:page/(?P<page>0|1))?/?$#', 'build_str' => '(page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_home', 'priority' => 1000, 'description' => 'Homepage (index) display'), array('name' => 'display_entries', 'parse_regex' => '#^(?:page/(?P<page>[2-9]|[1-9][0-9]+))/?$#', 'build_str' => '(page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_entries', 'priority' => 999, 'description' => 'Display multiple entries'), array('name' => 'display_entries_by_date', 'parse_regex' => '#^(?P<year>[1,2]{1}[\\d]{3})(?:/(?P<month>[\\d]{2}))?(?:/(?P<day>[\\d]{2}))?(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => '{$year}(/{$month})(/{$day})(/page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_date', 'priority' => 2, 'description' => 'Displays posts for a specific date.'), array('name' => 'display_entries_by_tag', 'parse_regex' => '#^tag/(?P<tag>[^/]*)(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => 'tag/{$tag}(/page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_tag', 'priority' => 5, 'description' => 'Return posts matching specified tag.', 'parameters' => serialize(array('require_match' => array('Tag', 'rewrite_tag_exists')))), array('name' => 'display_entry', 'parse_regex' => '#^(?P<slug>[^/]+)(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => '{$slug}(/page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_post', 'priority' => 100, 'description' => 'Return entry matching specified slug', 'parameters' => serialize(array('require_match' => array('Posts', 'rewrite_match_type'), 'content_type' => 'entry', 'request_types' => array('display_post')))), array('name' => 'display_page', 'parse_regex' => '#^(?P<slug>[^/]+)(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => '{$slug}(/page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_post', 'priority' => 100, 'description' => 'Return page matching specified slug', 'parameters' => serialize(array('require_match' => array('Posts', 'rewrite_match_type'), 'content_type' => 'page', 'request_types' => array('display_post')))), array('name' => 'display_search', 'parse_regex' => '#^search(?:/(?P<criteria>[^/]+))?(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => 'search(/{$criteria})(/page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'search', 'priority' => 8, 'description' => 'Searches posts'), array('name' => 'display_404', 'parse_regex' => '/^.*$/', 'build_str' => '', 'handler' => 'UserThemeHandler', 'action' => 'display_404', 'priority' => 9999, 'description' => 'Displays an error page when a URL is not matched.'), array('name' => 'display_post', 'parse_regex' => '#^(?P<slug>[^/]+)(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => '{$slug}(/page/{$page})', 'handler' => 'UserThemeHandler', 'action' => 'display_post', 'priority' => 9998, 'description' => 'Fallback to return post matching specified slug if no content_type match'), array('name' => 'submit_feedback', 'parse_regex' => '#^(?P<id>[0-9]+)/feedback/?$#i', 'build_str' => '{$id}/feedback', 'handler' => 'FeedbackHandler', 'action' => 'add_comment', 'priority' => 8, 'description' => 'Adds a comment to a post'), array('name' => 'display_dashboard', 'parse_regex' => '#^admin/?$#', 'build_str' => 'admin', 'handler' => 'AdminDashboardHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Display the admin dashboard'), array('name' => 'display_publish', 'parse_regex' => '#^admin/(?P<page>publish)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminPostsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage publishing posts'), array('name' => 'display_posts', 'parse_regex' => '#^admin/(?P<page>posts)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminPostsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage posts'), array('name' => 'delete_post', 'parse_regex' => '#^admin/(?P<page>delete_post)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminPostsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Delete a post'), array('name' => 'user_profile', 'parse_regex' => '#^admin/(?P<page>user)/(?P<user>[^/]+)/?$#', 'build_str' => 'admin/{$page}/{$user}', 'handler' => 'AdminUsersHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'The profile page for a specific user'), array('name' => 'display_users', 'parse_regex' => '#^admin/(?P<page>users)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminUsersHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage users'), array('name' => 'own_user_profile', 'parse_regex' => '#^admin/(?P<page>user)/?$#', 'build_str' => 'admin/{$page}/{$user}', 'handler' => 'AdminUsersHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'The profile page for a specific user'), array('name' => 'display_themes', 'parse_regex' => '#^admin/(?P<page>themes)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminThemesHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage themes'), array('name' => 'activate_theme', 'parse_regex' => '#^admin/(?P<page>activate_theme)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminThemesHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Activate a theme'), array('name' => 'preview_theme', 'parse_regex' => '#^admin/(?P<page>preview_theme)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminThemesHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Preview a theme'), array('name' => 'configure_block', 'parse_regex' => '#^admin/(?P<page>configure_block)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminThemesHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Configure a block in an iframe'), array('name' => 'display_plugins', 'parse_regex' => '#^admin/(?P<page>plugins)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminPluginsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage plugins'), array('name' => 'plugin_toggle', 'parse_regex' => '#^admin/(?P<page>plugin_toggle)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminPluginsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Activate or deactivate a plugin'), array('name' => 'display_options', 'parse_regex' => '#^admin/(?P<page>options)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminOptionsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'The options page for the blog'), array('name' => 'display_comments', 'parse_regex' => '#^admin/(?P<page>comments)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminCommentsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage comments'), array('name' => 'edit_comment', 'parse_regex' => '#^admin/(?P<page>comment)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminCommentsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Edit a comment'), array('name' => 'display_groups', 'parse_regex' => '#^admin/(?P<page>groups)/?$#', 'build_str' => 'admin/{$page}', 'handler' => 'AdminGroupsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage groups'), array('name' => 'display_group', 'parse_regex' => '#^admin/(?P<page>group)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminGroupsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage a group'), array('name' => 'display_tags', 'parse_regex' => '#^admin/(?P<page>tags)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminTagsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage tags'), array('name' => 'display_logs', 'parse_regex' => '#^admin/(?P<page>logs)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminLogsHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage logs'), array('name' => 'display_import', 'parse_regex' => '#^admin/(?P<page>import)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminimportHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Manage importing content'), array('name' => 'get_locale', 'parse_regex' => '#^admin/(?P<page>locale)/?$#i', 'build_str' => 'admin/{$page}', 'handler' => 'AdminLocaleHandler', 'action' => 'admin', 'priority' => 4, 'description' => 'Fetch the locale data as javascript'), array('name' => 'admin', 'parse_regex' => '#^admin(?:/?$|/(?P<page>[^/]*))/?$#i', 'build_str' => 'admin/({$page})', 'handler' => 'AdminHandler', 'action' => 'admin', 'priority' => 6, 'description' => 'An admin action'), array('name' => 'admin_ajax_dashboard', 'parse_regex' => '#^admin_ajax/(?P<context>dashboard)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminDashboardHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for the admin dashboard'), array('name' => 'admin_ajax_posts', 'parse_regex' => '#^admin_ajax/(?P<context>posts)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminPostsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for the managing posts'), array('name' => 'admin_ajax_update_posts', 'parse_regex' => '#^admin_ajax/(?P<context>update_posts)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminPostsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for the updating posts'), array('name' => 'admin_ajax_media', 'parse_regex' => '#^admin_ajax/(?P<context>media)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminPostsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling from media silos'), array('name' => 'admin_ajax_media_panel', 'parse_regex' => '#^admin_ajax/(?P<context>media_panel)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminPostsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling from media panels'), array('name' => 'admin_ajax_media_upload', 'parse_regex' => '#^admin_ajax/(?P<context>media_upload)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminPostsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling from media panel uploads'), array('name' => 'admin_ajax_add_block', 'parse_regex' => '#^admin_ajax/(?P<context>add_block)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminThemesHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for adding a block'), array('name' => 'admin_ajax_delete_block', 'parse_regex' => '#^admin_ajax/(?P<context>delete_block)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminThemesHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for deleting a block'), array('name' => 'admin_ajax_save_areas', 'parse_regex' => '#^admin_ajax/(?P<context>save_areas)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminThemesHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for saving areas'), array('name' => 'admin_ajax_comments', 'parse_regex' => '#^admin_ajax/(?P<context>comments)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminCommentsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for managing comments'), array('name' => 'admin_ajax_update_comment', 'parse_regex' => '#^admin_ajax/(?P<context>update_comment)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminCommentsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for updating a comment'), array('name' => 'admin_ajax_groups', 'parse_regex' => '#^admin_ajax/(?P<context>groups)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminGroupsHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for managing groups'), array('name' => 'admin_ajax_update_groups', 'parse_regex' => '#^admin_ajax/(?P<context>update_groups)/?$#', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminGroupsHandler', 'action' => 'admin_ajax', 'priority' => 4, 'description' => 'Authenticated ajax handler for updating a group'), array('name' => 'admin_ajax_tags', 'parse_regex' => '#^admin_ajax/(?P<context>tags)/?$#', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminTagsHandler', 'action' => 'admin_ajax', 'priority' => 4, 'description' => 'Authenticated ajax handler for managing tags'), array('name' => 'admin_ajax_get_tags', 'parse_regex' => '#^admin_ajax/(?P<context>get_tags)/?$#', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminTagsHandler', 'action' => 'admin_ajax', 'priority' => 4, 'description' => 'Authenticated ajax handler for retrieving tags'), array('name' => 'admin_ajax_logs', 'parse_regex' => '#^admin_ajax/(?P<context>logs)/?$#', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminLogsHandler', 'action' => 'admin_ajax', 'priority' => 4, 'description' => 'Authenticated ajax handler for managing logs'), array('name' => 'admin_ajax_delete_logs', 'parse_regex' => '#^admin_ajax/(?P<context>delete_logs)/?$#', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminLogsHandler', 'action' => 'admin_ajax', 'priority' => 4, 'description' => 'Authenticated ajax handler for deleting logs'), array('name' => 'admin_ajax', 'parse_regex' => '#^admin_ajax/(?P<context>[^/]+)/?$#i', 'build_str' => 'admin_ajax/{$context}', 'handler' => 'AdminHandler', 'action' => 'admin_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling for the admin'), array('name' => 'auth', 'parse_regex' => '#^auth/(?P<page>[^/]*)$#i', 'build_str' => 'auth/{$page}', 'handler' => 'UserHandler', 'action' => '{$page}', 'priority' => 7, 'description' => 'A user action or display, for instance the login screen'), array('name' => 'user', 'parse_regex' => '#^user/(?P<page>[^/]*)$#i', 'build_str' => 'user/{$page}', 'handler' => 'UserHandler', 'action' => '{$page}', 'priority' => 7, 'description' => 'A user action or display, for instance the login screen'), array('name' => 'ajax', 'parse_regex' => '#^ajax/(?P<context>[^/]+)/?$#i', 'build_str' => 'ajax/{$context}', 'handler' => 'AjaxHandler', 'action' => 'ajax', 'priority' => 8, 'description' => 'Ajax handling'), array('name' => 'auth_ajax', 'parse_regex' => '#^auth_ajax/(?P<context>[^/]+)/?$#i', 'build_str' => 'auth_ajax/{$context}', 'handler' => 'AjaxHandler', 'action' => 'auth_ajax', 'priority' => 8, 'description' => 'Authenticated ajax handling'), array('name' => 'rsd', 'parse_regex' => '/^rsd$/i', 'build_str' => 'rsd', 'handler' => 'AtomHandler', 'action' => 'rsd', 'priority' => 1, 'description' => 'RSD output'), array('name' => 'atom_entry', 'parse_regex' => '#^(?P<slug>[^/]+)/atom/?$#i', 'build_str' => '{$slug}/atom', 'handler' => 'AtomHandler', 'action' => 'entry', 'priority' => 8, 'description' => 'Atom Publishing Protocol'), array('name' => 'atom_feed', 'parse_regex' => '#^atom/(?P<index>[^/]+)(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => 'atom/{$index}(/page/{$page})', 'handler' => 'AtomHandler', 'action' => 'collection', 'priority' => 8, 'description' => 'Atom collection'), array('name' => 'atom_feed_comments', 'parse_regex' => '#^atom/comments(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => 'atom/comments(/page/{$page})', 'handler' => 'AtomHandler', 'action' => 'comments', 'priority' => 7, 'description' => 'Entries comments'), array('name' => 'atom_feed_tag', 'parse_regex' => '#^tag/(?P<tag>[^/]+)/atom(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => 'tag/{$tag}/atom(/page/{$page})', 'handler' => 'AtomHandler', 'action' => 'tag_collection', 'priority' => 8, 'description' => 'Atom Tag Collection', 'parameters' => serialize(array('require_match' => array('Tag', 'rewrite_tag_exists')))), array('name' => 'atom_feed_entry_comments', 'parse_regex' => '#^(?P<slug>[^/]+)/atom/comments(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => '{$slug}/atom/comments(/page/{$page})', 'handler' => 'AtomHandler', 'action' => 'entry_comments', 'priority' => 8, 'description' => 'Entry comments'), array('name' => 'atom_feed_page_comments', 'parse_regex' => '#^(?P<slug>[^/]+)/atom/comments(?:/page/(?P<page>\\d+))?/?$#i', 'build_str' => '{$slug}/atom/comments(/page/{$page})', 'handler' => 'AtomHandler', 'action' => 'entry_comments', 'priority' => 8, 'description' => 'Page comments'), array('name' => 'atompub_servicedocument', 'parse_regex' => '/^atom$/i', 'build_str' => 'atom', 'handler' => 'AtomHandler', 'action' => 'introspection', 'priority' => 1, 'description' => 'Atom introspection'), array('name' => 'cron', 'parse_regex' => '#^cron/(?P<time>[0-9.]+)/?$#i', 'build_str' => 'cron/{$time}', 'handler' => 'CronTab', 'action' => 'poll_cron', 'priority' => 1, 'description' => 'Asyncronous cron processing'), array('name' => 'xmlrpc', 'parse_regex' => '#^xmlrpc/?$#i', 'build_str' => 'xmlrpc', 'handler' => 'XMLRPCServer', 'action' => 'xmlrpc_call', 'priority' => 8, 'description' => 'Handle incoming XMLRPC requests.')); $default_rules = Plugins::filter('default_rewrite_rules', $default_rules); $default_rules_properties = array('is_active' => 1, 'rule_class' => RewriteRule::RULE_SYSTEM); $rule_names = array_flip(Utils::array_map_field($rules, 'name')); foreach ($default_rules as $default_rule) { if (!isset($rule_names[$default_rule['name']])) { $rule_properties = array_merge($default_rule, $default_rules_properties); $rules[] = new RewriteRule($rule_properties); } } return $rules; }
/** * Handles GET requests for the theme listing */ public function get_themes() { $all_themes = Themes::get_all_data(); $theme_names = Utils::array_map_field($all_themes, 'name'); $available_updates = Options::get('updates_available', array()); foreach ($all_themes as $name => $theme) { // only themes with a guid can be checked for updates if (isset($theme['info']->guid)) { if (isset($available_updates[(string) $theme['info']->guid])) { // @todo this doesn't use the URL and is therefore worthless $all_themes[$name]['info']->update = $available_updates[(string) $theme['info']->guid]['latest_version']; } } // If this theme requires a parent to be present and it's not, send an error if (isset($theme['info']->parent) && !in_array((string) $theme['info']->parent, $theme_names)) { $all_themes[$name]['req_parent'] = $theme['info']->parent; } } $this->theme->all_themes = $all_themes; $this->theme->active_theme = Themes::get_active_data(true); $this->theme->active_theme_dir = $this->theme->active_theme['path']; // If the active theme is configurable, allow it to configure $this->theme->active_theme_name = $this->theme->active_theme['info']->name; $this->theme->configurable = Plugins::filter('theme_config', false, $this->active_theme); $this->theme->assign('configure', Controller::get_var('configure')); $this->theme->areas = $this->get_areas(0); $this->theme->previewed = Themes::get_theme_dir(false); $this->theme->help = isset($this->theme->active_theme['info']->help) ? $this->theme->active_theme['info']->help : false; $this->theme->help_active = Controller::get_var('help') == $this->theme->active_theme['dir']; $this->prepare_block_list(); $blocks_areas_t = DB::get_results('SELECT b.*, ba.scope_id, ba.area, ba.display_order FROM {blocks} b INNER JOIN {blocks_areas} ba ON ba.block_id = b.id ORDER BY ba.scope_id ASC, ba.area ASC, ba.display_order ASC', array()); $blocks_areas = array(); foreach ($blocks_areas_t as $block) { if (!isset($blocks_areas[$block->scope_id])) { $blocks_areas[$block->scope_id] = array(); } $blocks_areas[$block->scope_id][$block->area][$block->display_order] = $block; } $this->theme->blocks_areas = $blocks_areas; $scopes = DB::get_results('SELECT * FROM {scopes} ORDER BY name ASC;'); $scopes = Plugins::filter('get_scopes', $scopes); $this->theme->scopes = $scopes; $this->theme->scopeid = 0; $this->theme->theme_loader = Plugins::filter('theme_loader', '', $this->theme); $this->theme->display('themes'); }
/** * Given an array of arrays, return an array that contains the value of a particular common field * Example: * $a = array( * array('foo'=>1, 'bar'=>2), * array('foo'=>3, 'bar'=>4), * ); * $b = Utils::array_map_field($a, 'foo'); // $b = array(1, 3); * * @param \Countable $array An array of arrays or objects with similar keys or properties * @param string $field The name of a common field within each array/object * @param string $key Optional field to use as the key in the result array * @return array An array of the values of the specified field within each array/object */ public static function array_map_field($array, $field, $key = null) { if (count($array) == 0) { return $array; } if (is_null($key)) { if ($array instanceof \ArrayObject) { $array = $array->getArrayCopy(); } return array_map(function ($element) use($field) { return is_array($element) ? $element[$field] : (is_object($element) ? $element->{$field} : null); }, $array); } else { return array_combine(Utils::array_map_field($array, $key), Utils::array_map_field($array, $field)); } }
/** * Returns total query execution time in seconds * * @return float Query execution time in seconds, with fractions. */ public function theme_query_time() { return array_sum(Utils::array_map_field(DB::get_profiles(), 'total_time')); }
/** * Handles GET requests of a user page. */ public function get_user() { $edit_user = User::identify(); $permission = false; // Check if the user is editing their own profile $self = $this->handler_vars['user'] == '' || User::get_by_name($this->handler_vars['user']) == $edit_user; if ($self) { if ($edit_user->can('manage_self') || $edit_user->can('manage_users')) { $permission = true; } $who = _t("You"); $possessive = _t("Your User Information"); } else { if ($edit_user->can('manage_users')) { $permission = true; } $edit_user = User::get_by_name($this->handler_vars['user']); $who = $edit_user->username; $possessive = _t("%s's User Information", array($who)); } if (!$permission) { Session::error(_t('Access to that page has been denied by the administrator.')); $this->get_blank(); return; } // Get author list $author_list = Users::get_all(); $authors[0] = _t('nobody'); foreach ($author_list as $author) { $authors[$author->id] = $author->displayname; } unset($authors[$edit_user->id]); // We can't reassign posts to ourself $this->theme->authors = $authors; $this->theme->edit_user = $edit_user; $this->theme->who = $who; $this->theme->possessive = $possessive; // Redirect to the users management page if we're trying to edit a non-existent user if (!$edit_user) { Session::error(_t('No such user!')); Utils::redirect(URL::get('admin', 'page=users')); } $this->theme->edit_user = $edit_user; $field_sections = array('user_info' => $possessive, 'change_password' => _t('Change Password'), 'regional_settings' => _t('Regional Settings'), 'dashboard' => _t('Dashboard')); $form = new FormUI('User Options'); // Create a tracker for who we are dealing with $form->append('hidden', 'edit_user', 'edit_user'); $form->edit_user->value = $edit_user->id; // Generate sections foreach ($field_sections as $key => $name) { $fieldset = $form->append('wrapper', $key, $name); $fieldset->class = 'container settings'; $fieldset->append('static', $key, '<h2>' . htmlentities($name, ENT_COMPAT, 'UTF-8') . '</h2>'); } // User Info $displayname = $form->user_info->append('text', 'displayname', 'null:null', _t('Display Name'), 'optionscontrol_text'); $displayname->class[] = 'important item clear'; $displayname->value = $edit_user->displayname; $username = $form->user_info->append('text', 'username', 'null:null', _t('User Name'), 'optionscontrol_text'); $username->class[] = 'item clear'; $username->value = $edit_user->username; $username->add_validator('validate_username', $edit_user->username); $email = $form->user_info->append('text', 'email', 'null:null', _t('Email'), 'optionscontrol_text'); $email->class[] = 'item clear'; $email->value = $edit_user->email; $email->add_validator('validate_email'); $imageurl = $form->user_info->append('text', 'imageurl', 'null:null', _t('Portrait URL'), 'optionscontrol_text'); $imageurl->class[] = 'item clear'; $imageurl->value = $edit_user->info->imageurl; // Change Password $password1 = $form->change_password->append('text', 'password1', 'null:null', _t('New Password'), 'optionscontrol_text'); $password1->class[] = 'item clear'; $password1->type = 'password'; $password1->value = ''; $password1->autocomplete = 'off'; $password2 = $form->change_password->append('text', 'password2', 'null:null', _t('New Password Again'), 'optionscontrol_text'); $password2->class[] = 'item clear'; $password2->type = 'password'; $password2->value = ''; $password2->autocomplete = 'off'; $delete = $this->handler_vars->filter_keys('delete'); // don't validate password match if action is delete if (!isset($delete['delete'])) { $password2->add_validator('validate_same', $password1, _t('Passwords must match.')); } // Regional settings $timezones = DateTimeZone::listIdentifiers(); $timezones = array_merge(array_combine(array_values($timezones), array_values($timezones))); $locale_tz = $form->regional_settings->append('select', 'locale_tz', 'null:null', _t('Timezone')); $locale_tz->class[] = 'item clear'; $locale_tz->value = $edit_user->info->locale_tz; $locale_tz->options = $timezones; $locale_tz->multiple = false; $locale_tz->template = 'optionscontrol_select'; $locale_date_format = $form->regional_settings->append('text', 'locale_date_format', 'null:null', _t('Date Format'), 'optionscontrol_text'); $locale_date_format->class[] = 'item clear'; $locale_date_format->value = $edit_user->info->locale_date_format; if (isset($edit_user->info->locale_date_format) && $edit_user->info->locale_date_format != '') { $current = HabariDateTime::date_create()->get($edit_user->info->locale_date_format); } else { $current = HabariDateTime::date_create()->date; } $locale_date_format->helptext = _t('See <a href="%s">php.net/date</a> for details. Current format: %s', array('http://php.net/date', $current)); $locale_time_format = $form->regional_settings->append('text', 'locale_time_format', 'null:null', _t('Time Format'), 'optionscontrol_text'); $locale_time_format->class[] = 'item clear'; $locale_time_format->value = $edit_user->info->locale_time_format; if (isset($edit_user->info->locale_time_format) && $edit_user->info->locale_time_format != '') { $current = HabariDateTime::date_create()->get($edit_user->info->locale_time_format); } else { $current = HabariDateTime::date_create()->time; } $locale_time_format->helptext = _t('See <a href="%s">php.net/date</a> for details. Current format: %s', array('http://php.net/date', $current)); $spam_count = $form->dashboard->append('checkbox', 'dashboard_hide_spam_count', 'null:null', _t('Hide Spam Count'), 'optionscontrol_checkbox'); $spam_count->class[] = 'item clear'; $spam_count->helptext = _t('Hide the number of SPAM comments on your dashboard.'); $spam_count->value = $edit_user->info->dashboard_hide_spam_count; // Groups if (User::identify()->can('manage_groups')) { $fieldset = $form->append('wrapper', 'groups', _t('Groups')); $fieldset->class = 'container settings'; $fieldset->append('static', 'groups', '<h2>' . htmlentities(_t('Groups'), ENT_COMPAT, 'UTF-8') . '</h2>'); $form->groups->append('checkboxes', 'user_group_membership', 'null:null', _t('Groups'), Utils::array_map_field(UserGroups::get_all(), 'name', 'id')); $form->user_group_membership->value = $edit_user->groups; } // Controls $controls = $form->append('wrapper', 'page_controls'); $controls->class = 'container controls transparent'; $submit = $controls->append('submit', 'apply', _t('Apply'), 'optionscontrol_submit'); $submit->class[] = 'pct30'; $controls->append('static', 'reassign', '<span class="pct35 reassigntext">' . _t('Reassign posts to: %s', array(Utils::html_select('reassign', $authors))) . '</span><span class="minor pct5 conjunction">' . _t('and') . '</span><span class="pct30"><input type="submit" name="delete" value="' . _t('Delete') . '" class="delete button"></span>'); $form->on_success(array($this, 'form_user_success')); // Let plugins alter this form Plugins::act('form_user', $form, $edit_user); $this->theme->form = $form->get(); $this->theme->admin_page = $self ? _t('My Profile') : _t('User'); $this->theme->display('user'); }
/** * @return array The data array */ public function get_menu_type_ids() { static $menu_item_ids = null; if (empty($menu_item_ids)) { $menu_item_types = $this->get_menu_type_data(); $menu_item_types = Utils::array_map_field($menu_item_types, 'type_id'); $menu_item_types = array_flip($menu_item_ids); } return $menu_item_ids; }
/** * Ensure that a theme meets requirements for activation/preview * @static * @param string $theme_dir the directory of the theme * @return bool True if the theme meets all requirements */ public static function validate_theme($theme_dir) { $all_themes = Themes::get_all_data(); // @todo Make this a closure in php 5.3 $theme_names = Utils::array_map_field($all_themes, 'name'); $theme_data = $all_themes[$theme_dir]; $ok = true; if (isset($theme_data['info']->parent) && !in_array((string) $theme_data['info']->parent, $theme_names)) { Session::error(_t('This theme requires the parent theme named "%s" to be present prior to activation.', array($theme_data['info']->parent))); $ok = false; } if (isset($theme_data['info']->requires)) { $provided = Plugins::provided(); foreach ($theme_data['info']->requires->feature as $requirement) { if (!isset($provided[(string) $requirement])) { Session::error(_t('This theme requires the feature "<a href="%2$s">%1$s</a>" to be present prior to activation.', array((string) $requirement, $requirement['url']))); $ok = false; } } } return $ok; }
/** * Detects whether the plugins that exist have changed since they were last * activated. * @return boolean true if the plugins have changed, false if not. */ public static function changed_since_last_activation() { $old_plugins = Options::get('plugins_present'); // If the plugin list was never stored, then they've changed. if (!is_array($old_plugins)) { return true; } // add base path onto stored path foreach ($old_plugins as $old_plugin) { $old_plugin = HABARI_PATH . $old_plugin; } // If the file list is not identical, then they've changed. $new_plugin_files = Plugins::list_all(); $old_plugin_files = Utils::array_map_field($old_plugins, 'file'); if (count(array_intersect($new_plugin_files, $old_plugin_files)) != count($new_plugin_files)) { return true; } // If the files are not identical, then they've changed. $old_plugin_checksums = Utils::array_map_field($old_plugins, 'checksum'); $new_plugin_checksums = array_map('md5_file', $new_plugin_files); if (count(array_intersect($old_plugin_checksums, $new_plugin_checksums)) != count($new_plugin_checksums)) { return true; } return false; }
/** * Returns a shortened version of whatever is passed in. * @param string $value A string to shorten * @param integer $count Maximum words to display [100] * @param integer $max_paragraphs Maximum paragraphs to display [1] * @return string The string, shortened */ public static function summarize($text, $count = 100, $max_paragraphs = 1) { $ellipsis = '…'; $showmore = false; $ht = new HtmlTokenizer($text, false); $set = $ht->parse(); $stack = array(); $para = 0; $token = $set->current(); $summary = new HTMLTokenSet(); $set->rewind(); $remaining_words = $count; // $bail lets the loop end naturally and close all open elements without adding new ones. $bail = false; for ($token = $set->current(); $set->valid(); $token = $set->next()) { if (!$bail && $token['type'] == HTMLTokenizer::NODE_TYPE_ELEMENT_OPEN) { $stack[] = $token; } if (!$bail) { switch ($token['type']) { case HTMLTokenizer::NODE_TYPE_TEXT: $words = preg_split('/(\\s+)/u', $token['value'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); // word count is doubled because spaces between words are captured as their own array elements via PREG_SPLIT_DELIM_CAPTURE $words = array_slice($words, 0, $remaining_words * 2); $remaining_words -= count($words) / 2; $token['value'] = implode('', $words); if ($remaining_words <= 0) { $token['value'] .= $ellipsis; $summary[] = $token; $bail = true; } else { $summary[] = $token; } break; case HTMLTokenizer::NODE_TYPE_ELEMENT_CLOSE: // don't handle this case here break; default: $summary[] = $token; break; } } if ($token['type'] == HTMLTokenizer::NODE_TYPE_ELEMENT_CLOSE) { if (count($stack) > 0 && in_array($token['name'], Utils::array_map_field($stack, 'name'))) { do { $end = array_pop($stack); $end['type'] = HTMLTokenizer::NODE_TYPE_ELEMENT_CLOSE; $end['attrs'] = null; $end['value'] = null; $summary[] = $end; } while (($bail || $end['name'] != $token['name']) && count($stack) > 0); } else { $end['name'] = $token['name']; $end['type'] = HTMLTokenizer::NODE_TYPE_ELEMENT_CLOSE; $end['attrs'] = null; $end['value'] = null; } if (count($stack) == 0) { $para++; } if ($bail || $para >= $max_paragraphs) { break; } } } return (string) $summary; }
public function __construct() { $self = $this; FormUI::register('add_user', function (FormUI $form, $name) use($self) { $form->set_settings(array('use_session_errors' => true)); $form->append(FormControlText::create('username')->set_properties(array('class' => 'columns three', 'placeholder' => _t('Username')))->add_validator('validate_username')->add_validator('validate_required')); $form->append(FormControlText::create('email')->set_properties(array('class' => 'columns four', 'placeholder' => _t('E-Mail')))->add_validator('validate_email')->add_validator('validate_required')); $password = FormControlPassword::create('password')->set_properties(array('class' => 'columns three', 'placeholder' => _t('Password')))->add_validator('validate_required'); $form->append($password); $form->append(FormControlPassword::create('password_again')->set_properties(array('class' => 'columns three', 'placeholder' => _t('Password Again')))->add_validator('validate_same', $password)); $form->append(FormControlSubmit::create('newuser')->set_caption('Add User')); $form->add_validator(array($self, 'validate_add_user')); $form->on_success(array($self, 'do_add_user')); }); FormUI::register('delete_users', function (FormUI $form, $name) use($self) { $form->set_settings(array('use_session_errors' => true)); $form->append(FormControlAggregate::create('deletion_queue')->set_selector('.select_user')->label('Select All')); $author_list = Users::get_all(); $authors[0] = _t('nobody'); foreach ($author_list as $author) { $authors[$author->id] = $author->displayname; } $form->append(FormControlSelect::create('reassign')->set_options($authors)); $form->append(FormControlSubmit::create('delete_selected')->set_caption(_t('Delete Selected'))); $form->add_validator(array($self, 'validate_delete_users')); $form->on_success(array($self, 'do_delete_users')); }); FormUI::register('edit_user', function (FormUI $form, $name, $form_type, $data) use($self) { $form->set_settings(array('use_session_errors' => true)); $edit_user = $data['edit_user']; $field_sections = array('user_info' => _t('User Information'), 'change_password' => _t('Change Password'), 'regional_settings' => _t('Regional Settings'), 'dashboard' => _t('Dashboard')); // Create a tracker for who we are dealing with $form->append(FormControlData::create('edit_user')->set_value($edit_user->id)); // Generate sections foreach ($field_sections as $key => $name) { $fieldset = $form->append('wrapper', $key, $name); $fieldset->add_class('container main settings'); $fieldset->append(FormControlStatic::create($key)->set_static('<h2 class="lead">' . htmlentities($name, ENT_COMPAT, 'UTF-8') . '</h2>')); } // User Info $displayname = FormControlText::create('displayname')->set_value($edit_user->displayname); $form->user_info->append(FormControlLabel::wrap(_t('Display Name'), $displayname)); $username = FormControlText::create('username')->add_validator('validate_username', $edit_user->username)->set_value($edit_user->username); $form->user_info->append(FormControlLabel::wrap(_t('User Name'), $username)); $email = FormControlText::create('email')->add_validator('validate_email')->set_value($edit_user->email); $form->user_info->append(FormControlLabel::wrap(_t('Email'), $email)); $imageurl = FormControlText::create('imageurl')->set_value($edit_user->info->imageurl); $form->user_info->append(FormControlLabel::wrap(_t('Portrait URL'), $imageurl)); // Change Password $password1 = FormControlPassword::create('password1', null, array('autocomplete' => 'off'))->set_value(''); $form->change_password->append(FormControlLabel::wrap(_t('New Password'), $password1)); $password2 = FormControlPassword::create('password2', null, array('autocomplete' => 'off'))->set_value(''); $form->change_password->append(FormControlLabel::wrap(_t('New Password Again'), $password2)); $delete = $self->handler_vars->filter_keys('delete'); // don't validate password match if action is delete if (!isset($delete['delete'])) { $password2->add_validator('validate_same', $password1, _t('Passwords must match.')); } // Regional settings $timezones = \DateTimeZone::listIdentifiers(); $timezones = array_merge(array_combine(array_values($timezones), array_values($timezones))); $locale_tz = FormControlSelect::create('locale_tz', null, array('multiple' => false))->set_options($timezones)->set_value($edit_user->info->locale_tz); $form->regional_settings->append(FormControlLabel::wrap(_t('Timezone'), $locale_tz)); $locale_date_format = FormControlText::create('locale_date_format')->set_value($edit_user->info->locale_date_format); $form->regional_settings->append(FormControlLabel::wrap(_t('Date Format'), $locale_date_format)); $edit_user_info = $edit_user->info; if (isset($edit_user_info->locale_date_format) && $edit_user_info->locale_date_format != '') { $current = DateTime::create()->get($edit_user_info->locale_date_format); } else { $current = DateTime::create()->date; } $locale_date_format->set_helptext(_t('See <a href="%s">php.net/date</a> for details. Current format: %s', array('http://php.net/date', $current))); $locale_time_format = FormControlText::create('locale_time_format')->set_value($edit_user_info->locale_time_format); $form->regional_settings->append(FormControlLabel::wrap(_t('Time Format'), $locale_time_format)); if (isset($edit_user_info->locale_time_format) && $edit_user_info->locale_time_format != '') { $current = DateTime::create()->get($edit_user_info->locale_time_format); } else { $current = DateTime::create()->time; } $locale_time_format->set_helptext(_t('See <a href="%s">php.net/date</a> for details. Current format: %s', array('http://php.net/date', $current))); $locales = array_merge(array('' => _t('System default') . ' (' . Options::get('locale', 'en-us') . ')'), array_combine(Locale::list_all(), Locale::list_all())); $locale_lang = FormcontrolSelect::create('locale_lang', null, array('multiple' => false))->set_options($locales)->set_value($edit_user_info->locale_lang); $form->regional_settings->append(FormControlLabel::wrap(_t(' Language'), $locale_lang)); $spam_count = FormControlCheckbox::create('dashboard_hide_spam_count')->set_helptext(_t('Hide the number of SPAM comments on your dashboard.'))->set_value($edit_user_info->dashboard_hide_spam_count); $form->dashboard->append(FormControlLabel::wrap(_t('Hide Spam Count'), $spam_count)); // Groups if (User::identify()->can('manage_groups')) { $fieldset = $form->append(FormControlWrapper::create('groups')); $fieldset->add_class('container main settings'); $fieldset->append(FormControlStatic::create('groups_title')->set_static('<h2 class="lead">' . htmlentities(_t('Groups'), ENT_COMPAT, 'UTF-8') . '</h2>')); $fieldset->append(FormControlCheckboxes::create('user_group_membership')->set_options(Utils::array_map_field(UserGroups::get_all(), 'name', 'id'))->set_value($edit_user->groups)); } // Controls $controls = $form->append(FormControlWrapper::create('page_controls')->add_class('container controls transparent')); $apply = $controls->append(FormControlSubmit::create('apply')->set_caption(_t('Apply'))); // Get author list $author_list = Users::get_all(); $authors[0] = _t('nobody'); foreach ($author_list as $author) { $authors[$author->id] = $author->displayname; } unset($authors[$edit_user->id]); // We can't reassign this user's posts to themselves if we're deleting them $reassign = FormControlSelect::create('reassign')->set_options($authors); $reassign_label = FormControlLabel::wrap(_t('Reassign posts to:'), $reassign)->set_settings(array('wrap' => '<span class="reassigntext">%s</span>')); $controls->append($reassign_label); $controls->append(FormControlStatic::create('conjunction')->set_static(_t('and'))->set_settings(array('wrap' => '<span class="conjunction">%s</span>'))); $delete = $controls->append(FormControlSubmit::create('delete')->set_caption(_t('Delete'))->set_settings(array('wrap' => '<span>%s</span>'))->add_class('button')); $delete->on_success(array($self, 'edit_user_delete')); $delete->add_validator(array($self, 'validate_delete_user')); $apply->on_success(array($self, 'edit_user_apply')); $apply->add_validator(array($self, 'validate_edit_user')); }); parent::__construct(); }