Skip to content

Commit

Permalink
update to HEAD
Browse files Browse the repository at this point in the history
  • Loading branch information
bangpound committed Oct 22, 2009
1 parent b334a33 commit 5587a53
Show file tree
Hide file tree
Showing 280 changed files with 11,915 additions and 2,583 deletions.
161 changes: 161 additions & 0 deletions authorize.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<?php
// $Id: authorize.php,v 1.2 2009/10/22 00:52:03 dries Exp $

/**
* @file
* Administrative script where the site owner (the user actually owning the
* files on the webserver) can authorize certain file-related operations to
* proceed with elevated privileges, for example to deploy and upgrade modules
* or themes. Users should not visit this page directly, but instead use an
* administrative user interface which knows how to redirect the user to this
* script as part of a multistep process. This script actually performs the
* selected operations without loading all of Drupal, to be able to more
* gracefully recover from errors. Access to the script is controlled by a
* global killswitch in settings.php ('allow_authorize_operations') and via
* the 'administer software updates' permission.
*
* @see system_run_authorized()
*/

/**
* Root directory of Drupal installation.
*/
define('DRUPAL_ROOT', getcwd());

/**
* Global flag to identify update.php and authorize.php runs, and so
* avoid various unwanted operations, such as hook_init() and
* hook_exit() invokes, css/js preprocessing and translation, and
* solve some theming issues. This flag is checked on several places
* in Drupal code (not just authorize.php).
*/
define('MAINTENANCE_MODE', 'update');

/**
* Render a 403 access denied page for authorize.php
*/
function authorize_access_denied_page() {
drupal_add_http_header('403 Forbidden');
watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);
drupal_set_title('Access denied');
return t('You are not allowed to access this page.');
}

/**
* Determine if the current user is allowed to run authorize.php.
*
* The killswitch in settings.php overrides all else, otherwise, the user must
* have access to the 'administer software updates' permission.
*
* @return
* TRUE if the current user can run authorize.php, otherwise FALSE.
*/
function authorize_access_allowed() {
return variable_get('allow_authorize_operations', TRUE) && user_access('administer software updates');
}

// *** Real work of the script begins here. ***

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once DRUPAL_ROOT . '/includes/session.inc';
require_once DRUPAL_ROOT . '/includes/common.inc';
require_once DRUPAL_ROOT . '/includes/file.inc';
require_once DRUPAL_ROOT . '/includes/module.inc';

// We prepare only a minimal bootstrap. This includes the database and
// variables, however, so we have access to the class autoloader registry.
drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);

// This must go after drupal_bootstrap(), which unsets globals!
global $conf;

// We have to enable the user and system modules, even to check access and
// display errors via the maintainence theme.
$module_list['system']['filename'] = 'modules/system/system.module';
$module_list['user']['filename'] = 'modules/user/user.module';
module_list(TRUE, FALSE, FALSE, $module_list);
drupal_load('module', 'system');
drupal_load('module', 'user');

// We also want to have the language system available, but we do *NOT* want to
// actually call drupal_bootstrap(DRUPAL_BOOTSTRAP_LANGUAGE), since that would
// also force us through the DRUPAL_BOOTSTRAP_PAGE_HEADER phase, which loads
// all the modules, and that's exactly what we're trying to avoid.
drupal_language_initialize();

// Initialize the maintenance theme for this administrative script.
drupal_maintenance_theme();

$output = '';
$show_messages = TRUE;

if (authorize_access_allowed()) {
// Load both the Form API and Batch API.
require_once DRUPAL_ROOT . '/includes/form.inc';
require_once DRUPAL_ROOT . '/includes/batch.inc';
// Load the code that drives the authorize process.
require_once DRUPAL_ROOT . '/includes/authorize.inc';

// Initialize the URL path, but not via raising our bootstrap level.
drupal_path_initialize();

if (isset($_SESSION['authorize_operation']['page_title'])) {
drupal_set_title(check_plain($_SESSION['authorize_operation']['page_title']));
}
else {
drupal_set_title(t('Authorize file system changes'));
}

// See if we've run the operation and need to display a report.
if (isset($_SESSION['authorize_results']) && $results = $_SESSION['authorize_results']) {

// Clear the session out.
unset($_SESSION['authorize_results']);
unset($_SESSION['authorize_operation']);
unset($_SESSION['authorize_filetransfer_backends']);

if (!empty($results['page_title'])) {
drupal_set_title(check_plain($results['page_title']));
}
if (!empty($results['page_message'])) {
drupal_set_message($results['page_message']['message'], $results['page_message']['type']);
}

$output = theme('authorize_report', array('messages' => $results['messages']));

$links = array();
if (is_array($results['tasks'])) {
$links += $results['tasks'];
}

$links = array_merge($links, array(
l(t('Administration pages'), 'admin'),
l(t('Front page'), '<front>'),
));

$output .= theme('item_list', array('items' => $links));
}
// If a batch is running, let it run.
elseif (isset($_GET['batch'])) {
$output = _batch_page();
}
else {
if (empty($_SESSION['authorize_operation']) || empty($_SESSION['authorize_filetransfer_backends'])) {
$output = t('It appears you have reached this page in error.');
}
elseif (!$batch = batch_get()) {
// We have a batch to process, show the filetransfer form.
$output = drupal_render(drupal_get_form('authorize_filetransfer_form'));
}
}
// We defer the display of messages until all operations are done.
$show_messages = !(($batch = batch_get()) && isset($batch['running']));
}
else {
$output = authorize_access_denied_page();
}

if (!empty($output)) {
print theme('update_page', array('content' => $output, 'show_messages' => $show_messages));
}

79 changes: 41 additions & 38 deletions includes/CVS/Entries
Original file line number Diff line number Diff line change
@@ -1,40 +1,43 @@
D/database////
D/filetransfer////
/browser.inc/1.3/Tue Sep 1 10:21:14 2009//
/entity.inc/1.1/Thu Aug 27 22:12:14 2009//
/file.mimetypes.inc/1.4/Tue Sep 1 10:21:16 2009//
/graph.inc/1.3/Thu Aug 27 22:12:14 2009//
/lock.inc/1.1/Thu Aug 27 22:12:14 2009//
/password.inc/1.6/Thu Aug 27 22:12:14 2009//
/path.inc/1.44/Thu Aug 27 22:12:14 2009//
/stream_wrappers.inc/1.6/Tue Sep 1 10:21:19 2009//
/token.inc/1.5/Thu Aug 27 22:12:14 2009//
/unicode.entities.inc/1.2/Thu Aug 27 22:12:14 2009//
/xmlrpc.inc/1.61/Thu Aug 27 22:12:14 2009//
/image.inc/1.38/Thu Sep 3 08:52:45 2009//
/mail.inc/1.25/Thu Sep 3 08:52:46 2009//
/cache-install.inc/1.5/Fri Oct 2 19:50:12 2009//
/cache.inc/1.40/Fri Oct 2 19:50:12 2009//
/session.inc/1.72/Fri Oct 2 19:50:12 2009//
/unicode.inc/1.40/Fri Oct 2 19:50:12 2009//
/actions.inc/1.33/Mon Oct 12 23:25:04 2009//
/batch.inc/1.41/Mon Oct 12 23:25:04 2009//
/bootstrap.inc/1.309/Mon Oct 12 23:25:04 2009//
/iso.inc/1.6/Mon Oct 12 23:25:04 2009//
/language.inc/1.20/Mon Oct 12 23:25:04 2009//
/menu.inc/1.352/Mon Oct 12 23:25:04 2009//
/module.inc/1.160/Mon Oct 12 23:25:04 2009//
/pager.inc/1.74/Mon Oct 12 23:25:04 2009//
/tablesort.inc/1.56/Mon Oct 12 23:25:04 2009//
/theme.maintenance.inc/1.42/Mon Oct 12 23:25:04 2009//
/registry.inc/1.25/Tue Oct 13 12:42:22 2009//
/update.inc/1.13/Tue Oct 13 12:42:22 2009//
/ajax.inc/1.14/Wed Oct 14 02:34:04 2009//
/common.inc/1.1017/Wed Oct 14 02:34:04 2009//
/date.inc/1.1/Tue Oct 13 21:34:14 2009//
/file.inc/1.196/Wed Oct 14 02:34:04 2009//
/form.inc/1.383/Wed Oct 14 02:34:04 2009//
/install.inc/1.115/Wed Oct 14 02:34:04 2009//
/locale.inc/1.232/Wed Oct 14 02:34:04 2009//
/xmlrpcs.inc/1.33/Wed Oct 14 02:34:04 2009//
/theme.inc/1.535/Wed Oct 14 23:34:21 2009//
/actions.inc/1.34/Thu Oct 22 14:25:06 2009//
/ajax.inc/1.16/Thu Oct 22 14:25:06 2009//
/archiver.inc/1.2/Fri Oct 16 13:18:30 2009//
/authorize.inc/1.2/Thu Oct 22 00:52:03 2009//
/batch.inc/1.42/Thu Oct 22 14:25:06 2009//
/bootstrap.inc/1.313/Thu Oct 22 14:25:06 2009//
/browser.inc/1.3/Thu Oct 22 14:22:19 2009//
/cache-install.inc/1.5/Thu Oct 22 14:22:19 2009//
/cache.inc/1.40/Thu Oct 22 14:22:19 2009//
/common.inc/1.1027/Thu Oct 22 14:25:06 2009//
/date.inc/1.1/Thu Oct 22 14:22:19 2009//
/entity.inc/1.2/Thu Oct 22 14:25:06 2009//
/file.inc/1.197/Thu Oct 22 14:25:06 2009//
/file.mimetypes.inc/1.4/Thu Oct 22 14:22:19 2009//
/form.inc/1.386/Thu Oct 22 14:25:07 2009//
/graph.inc/1.3/Thu Oct 22 14:22:19 2009//
/image.inc/1.38/Thu Oct 22 14:22:19 2009//
/install.inc/1.115/Thu Oct 22 14:22:19 2009//
/iso.inc/1.6/Thu Oct 22 14:22:19 2009//
/language.inc/1.22/Thu Oct 22 14:25:07 2009//
/locale.inc/1.233/Thu Oct 22 14:25:07 2009//
/lock.inc/1.1/Thu Oct 22 14:22:19 2009//
/mail.inc/1.26/Thu Oct 22 14:25:07 2009//
/menu.inc/1.357/Thu Oct 22 14:25:07 2009//
/module.inc/1.161/Thu Oct 22 14:25:07 2009//
/pager.inc/1.74/Thu Oct 22 14:22:19 2009//
/password.inc/1.6/Thu Oct 22 14:22:19 2009//
/path.inc/1.46/Thu Oct 22 14:25:07 2009//
/registry.inc/1.25/Thu Oct 22 14:22:19 2009//
/session.inc/1.72/Thu Oct 22 14:22:19 2009//
/stream_wrappers.inc/1.6/Thu Oct 22 14:22:19 2009//
/tablesort.inc/1.56/Thu Oct 22 14:22:19 2009//
/theme.inc/1.541/Thu Oct 22 14:25:07 2009//
/theme.maintenance.inc/1.43/Thu Oct 22 14:25:07 2009//
/token.inc/1.6/Thu Oct 22 14:25:07 2009//
/unicode.entities.inc/1.2/Thu Oct 22 14:22:19 2009//
/unicode.inc/1.40/Thu Oct 22 14:22:19 2009//
/update.inc/1.13/Thu Oct 22 14:22:19 2009//
/updater.inc/1.1/Thu Oct 15 21:19:31 2009//
/xmlrpc.inc/1.61/Thu Oct 22 14:22:19 2009//
/xmlrpcs.inc/1.33/Thu Oct 22 14:22:19 2009//
4 changes: 2 additions & 2 deletions includes/actions.inc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?php
// $Id: actions.inc,v 1.33 2009/10/10 17:29:16 webchick Exp $
// $Id: actions.inc,v 1.34 2009/10/18 06:56:23 webchick Exp $

/**
* @file
Expand Down Expand Up @@ -324,7 +324,7 @@ function actions_save($function, $type, $params, $label, $aid = NULL) {
// aid is the callback for singleton actions so we need to keep a separate
// table for numeric aids.
if (!$aid) {
$aid = db_insert('actions_aid')->useDefaults(array('aid'))->execute();
$aid = db_next_id();
}

db_merge('actions')
Expand Down
80 changes: 55 additions & 25 deletions includes/ajax.inc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?php
// $Id: ajax.inc,v 1.14 2009/10/13 21:16:42 dries Exp $
// $Id: ajax.inc,v 1.16 2009/10/18 05:14:39 webchick Exp $

/**
* @file
Expand Down Expand Up @@ -142,7 +142,7 @@ function ajax_render($commands = array(), $header = TRUE) {
// them the first command.
$scripts = drupal_add_js(NULL, NULL);
if (!empty($scripts['settings'])) {
array_unshift($commands, ajax_command_settings($scripts['settings']['data']));
array_unshift($commands, ajax_command_settings(call_user_func_array('array_merge_recursive', $scripts['settings']['data'])));
}

// Allow modules to alter any AJAX response.
Expand All @@ -156,7 +156,7 @@ function ajax_render($commands = array(), $header = TRUE) {
// http://malsup.com/jquery/form/#code-samples
print '<textarea>' . drupal_json_encode($commands) . '</textarea>';
}
else if ($header) {
elseif ($header) {
drupal_json_output($commands);
}
else {
Expand Down Expand Up @@ -291,30 +291,60 @@ function ajax_form_callback() {
$callback = $triggering_element['#ajax']['callback'];
}
if (!empty($callback) && function_exists($callback)) {
$html = $callback($form, $form_state);

// If the returned value is a string, assume it is HTML, add the status
// messages, and create a command object to return automatically. We want
// the status messages inside the new wrapper, so that they get replaced
// on subsequent AJAX calls for the same wrapper.
if (is_string($html)) {
$commands = array();
$commands[] = ajax_command_replace(NULL, $html);
$commands[] = ajax_command_prepend(NULL, theme('status_messages'));
}
// Otherwise, $html is supposed to be an array of commands, suitable for
// Drupal.ajax, so we pass it on as is. In this situation, the callback is
// doing something fancy, so let it decide how to handle status messages
// without second guessing it.
else {
$commands = $html;
}
return $callback($form, $form_state);
}
}

ajax_render($commands);
/**
* Package and send the result of a page callback to the browser as an AJAX response.
*
* @param $page_callback_result
* The result of a page callback. Can be one of:
* - NULL: to indicate no content.
* - An integer menu status constant: to indicate an error condition.
* - A string of HTML content.
* - A renderable array of content.
*/
function ajax_deliver($page_callback_result) {
$commands = array();
if (!isset($page_callback_result)) {
// Simply delivering an empty commands array is sufficient. This results
// in the AJAX request being completed, but nothing being done to the page.
}
elseif (is_int($page_callback_result)) {
switch ($page_callback_result) {
case MENU_NOT_FOUND:
$commands[] = ajax_command_alert(t('The requested page could not be found.'));
break;

case MENU_ACCESS_DENIED:
$commands[] = ajax_command_alert(t('You are not authorized to access this page.'));
break;

// Return a 'do nothing' command if there was no callback.
ajax_render(array());
case MENU_SITE_OFFLINE:
$commands[] = ajax_command_alert(filter_xss_admin(variable_get('maintenance_mode_message',
t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal'))))));
break;
}
}
elseif (is_array($page_callback_result) && isset($page_callback_result['#type']) && ($page_callback_result['#type'] == 'ajax_commands')) {
// Complex AJAX callbacks can return a result that contains a specific
// set of commands to send to the browser.
if (isset($page_callback_result['#ajax_commands'])) {
$commands = $page_callback_result['#ajax_commands'];
}
}
else {
// Like normal page callbacks, simple AJAX callbacks can return html
// content, as a string or renderable array, to replace what was previously
// there in the wrapper. In this case, in addition to the content, we want
// to add the status messages, but inside the new wrapper, so that they get
// replaced on subsequent AJAX calls for the same wrapper.
$html = is_string($page_callback_result) ? $page_callback_result : drupal_render($page_callback_result);
$commands[] = ajax_command_replace(NULL, $html);
$commands[] = ajax_command_prepend(NULL, theme('status_messages'));
}
ajax_render($commands);
}

/**
Expand Down Expand Up @@ -743,7 +773,7 @@ function ajax_command_css($selector, $argument) {
function ajax_command_settings($argument) {
return array(
'command' => 'settings',
'argument' => $argument,
'settings' => $argument,
);
}

Expand Down
Loading

0 comments on commit 5587a53

Please sign in to comment.