Skip to content
Snippets Groups Projects
Select Git revision
  • issue-752
  • develop
  • master default
  • issue-677
  • issue-677-original-with-migrate
  • issue-716
  • issue-654
  • issue-732
  • issue-737
  • issue-735
  • issue-707
  • issue-706
  • issue-705
  • issue-703
  • issue-696
  • issue-690
  • issue-675
  • issue-670
  • issue-635
  • issue-404
  • 7.19
  • 2012-04-18
  • 2012-04-03
  • 2012-04-02
  • 2012-03-01
  • 2012-02-07
  • 20120207
  • 2012-01-13
  • 2012-01-12
  • 2011-12-16
  • 2011-12-05
  • 2011-11-17
  • 2011-11-14
  • 2011-11-08.2
  • 2011-11-08
  • 2011-11-01
  • 2011-10-27
  • 2011-10-06
  • 2011-10-03
  • 2011-09-19
40 results

authorize.php

Blame
  • Forked from UNL Information Services / UNL-CMS
    6 commits behind, 5 commits ahead of the upstream repository.
    authorize.php 6.45 KiB
    <?php
    
    /**
     * @file
     * Administrative script for running authorized file operations.
     *
     * Using this script, 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.
     *
     * There are helper functions for setting up an operation to run via this
     * system in modules/system/system.module. For more information, see:
     * @link authorize Authorized operation helper functions @endlink
     */
    
    /**
     * Defines the root directory of the Drupal installation.
     */
    define('DRUPAL_ROOT', getcwd());
    
    /**
     * Global flag to identify update.php and authorize.php runs.
     *
     * Identifies update.php and authorize.php runs, avoiding unwanted operations
     * such as hook_init() and hook_exit() invokes, css/js preprocessing and
     * translation, and solves some theming issues. The flag is checked in other
     * places in Drupal code (not just authorize.php).
     */
    define('MAINTENANCE_MODE', 'update');
    
    /**
     * Renders a 403 access denied page for authorize.php.
     */
    function authorize_access_denied_page() {
      drupal_add_http_header('Status', '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.');
    }
    
    /**
     * Determines 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, and FALSE if not.
     */
    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/common.inc';
    require_once DRUPAL_ROOT . '/includes/file.inc';
    require_once DRUPAL_ROOT . '/includes/module.inc';
    require_once DRUPAL_ROOT . '/includes/ajax.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 maintenance 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';
    
      // For the sake of Batch API and a few other low-level functions, we need to
      // initialize the URL path into $_GET['q']. However, we do not want to raise
      // our bootstrap level, nor do we want to call drupal_initialize_path(),
      // since that is assuming that modules are loaded and invoking hooks.
      // However, all we really care is if we're in the middle of a batch, in which
      // case $_GET['q'] will already be set, we just initialize it to an empty
      // string if it's not already defined.
      if (!isset($_GET['q'])) {
        $_GET['q'] = '';
      }
    
      if (isset($_SESSION['authorize_operation']['page_title'])) {
        drupal_set_title($_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_info']);
    
        if (!empty($results['page_title'])) {
          drupal_set_title($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'];
        }
        else {
          $links = array_merge($links, array(
            l(t('Administration pages'), 'admin'),
            l(t('Front page'), '<front>'),
          ));
        }
    
        $output .= theme('item_list', array('items' => $links, 'title' => t('Next steps')));
      }
      // 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_info'])) {
          $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.
          $elements = drupal_get_form('authorize_filetransfer_form');
          $output = drupal_render($elements);
        }
      }
      // 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));
    }