/** * @param \Drufony\Bridge\Event\GetCallableForPhase $event */ public function onBootstrapFull(GetCallableForPhase $event) { $event->setCallable(function () { require_once DRUPAL_ROOT . '/includes/common.inc'; require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc'); require_once DRUPAL_ROOT . '/includes/theme.inc'; require_once DRUPAL_ROOT . '/includes/pager.inc'; require_once DRUPAL_ROOT . '/' . variable_get('menu_inc', 'includes/menu.inc'); require_once DRUPAL_ROOT . '/includes/tablesort.inc'; require_once DRUPAL_ROOT . '/includes/file.inc'; require_once DRUPAL_ROOT . '/includes/unicode.inc'; require_once DRUPAL_ROOT . '/includes/image.inc'; require_once DRUPAL_ROOT . '/includes/form.inc'; require_once DRUPAL_ROOT . '/includes/mail.inc'; require_once DRUPAL_ROOT . '/includes/actions.inc'; require_once DRUPAL_ROOT . '/includes/ajax.inc'; require_once DRUPAL_ROOT . '/includes/token.inc'; require_once DRUPAL_ROOT . '/includes/errors.inc'; // Detect string handling method unicode_check(); // Undo magic quotes fix_gpc_magic(); // Load all enabled modules module_load_all(); // Make sure all stream wrappers are registered. file_get_stream_wrappers(); // Ensure mt_rand is reseeded, to prevent random values from one page load // being exploited to predict random values in subsequent page loads. $seed = unpack("L", drupal_random_bytes(4)); mt_srand($seed[1]); $test_info =& $GLOBALS['drupal_test_info']; if (!empty($test_info['in_child_site'])) { // Running inside the simpletest child site, log fatal errors to test // specific file directory. ini_set('log_errors', 1); ini_set('error_log', 'public://error.log'); } // Initialize $_GET['q'] prior to invoking hook_init(). drupal_path_initialize(); // Remaining function calls from this phase of bootstrap must happen after // the user is authenticated because they initialize the theme and call // menu_get_item(). }); }
/** * Loads the requested module and executes the requested callback. * * @return * The callback function's return value or one of the JS_* constants. */ function js_execute_callback() { $args = explode('/', $_GET['q']); // If i18n is enabled and therefore the js module should boot // to DRUPAL_BOOTSTRAP_LANGUAGE. $i18n = FALSE; // Validate if there is a language prefix in the path. if (!empty($args[0]) && !empty($args[1]) && $args[1] == 'js_callback') { // Language string detected, strip off the language code. $language_code = array_shift($args); // Enable language detection to make sure i18n is enabled. $i18n = TRUE; } // Strip first argument 'js_callback'. if (!empty($args[0]) && $args[0] == 'js_callback') { array_shift($args); } // Determine module to load. $module = check_plain(array_shift($args)); if (!$module || !drupal_load('module', $module)) { return JS_MENU_ACCESS_DENIED; } // Get info hook function name. $function = $module . '_js'; if (!function_exists($function)) { return JS_MENU_NOT_FOUND; } // Get valid callbacks. $valid_callbacks = $function(); // Get the callback. $callback = check_plain(array_shift($args)); // Validate the callback. if (!isset($valid_callbacks[$callback])) { return JS_MENU_NOT_FOUND; } // If the callback function is located in another file, load that file now. if (isset($valid_callbacks[$callback]['file']) && ($filepath = drupal_get_path('module', $module) . '/' . $valid_callbacks[$callback]['file']) && file_exists($filepath)) { require_once $filepath; } // Validate the existance of the defined callback. if (!function_exists($valid_callbacks[$callback]['callback'])) { return JS_MENU_NOT_FOUND; } // Bootstrap to required level. $full_boostrap = FALSE; if (!empty($valid_callbacks[$callback]['bootstrap'])) { drupal_bootstrap($valid_callbacks[$callback]['bootstrap']); $full_boostrap = $valid_callbacks[$callback]['bootstrap'] == DRUPAL_BOOTSTRAP_FULL; } // Validate if the callback uses i18n. if (isset($valid_callbacks[$callback]['i18n'])) { $i18n = $valid_callbacks[$callback]['i18n']; } if (!$full_boostrap) { // The following mimics the behavior of _drupal_bootstrap_full(). // The difference is that not all modules and includes are loaded. // @see _drupal_bootstrap_full(). // If i18n is enabled, boot to the language phase and make // sure the required modules are enabled. if ($i18n) { // First boot to the variables to make sure drupal_multilingual() works. drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES); // As the variables bootstrap phase loads all core modules, we have to // add the user module and the path include as a dependencies because they // are required by some core modules. if (empty($valid_callbacks[$callback]['dependencies'])) { $valid_callbacks[$callback]['dependencies'] = array(); } if (empty($valid_callbacks[$callback]['includes'])) { $valid_callbacks[$callback]['includes'] = array(); } if (!in_array('user', $valid_callbacks[$callback]['dependencies'])) { $valid_callbacks[$callback]['dependencies'][] = 'user'; } if (!in_array('path', $valid_callbacks[$callback]['includes'])) { $valid_callbacks[$callback]['includes'][] = 'path'; } // Then check if it's a multilingual site. If so, boot to the language // phase. if (drupal_multilingual()) { drupal_bootstrap(DRUPAL_BOOTSTRAP_LANGUAGE); } } // Load required include files based on the callback. if (isset($valid_callbacks[$callback]['includes']) && is_array($valid_callbacks[$callback]['includes'])) { foreach ($valid_callbacks[$callback]['includes'] as $include) { if (file_exists("./includes/{$include}.inc")) { require_once "./includes/{$include}.inc"; } } } // Detect string handling method. unicode_check(); // Undo magic quotes. fix_gpc_magic(); // Make sure all stream wrappers are registered. file_get_stream_wrappers(); // Load required modules. $modules = array($module => 0); if (isset($valid_callbacks[$callback]['dependencies']) && is_array($valid_callbacks[$callback]['dependencies'])) { foreach ($valid_callbacks[$callback]['dependencies'] as $dependency) { if (!drupal_load('module', $dependency)) { // Do a boot up till SESSION to be sure the drupal_set_message() // function works. drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); // Create an error message with information for the user to be able // to fix the dependency. $error = t('The dependency :dependency for the callback :callback in :module is not installed.', array(':dependency' => $dependency, ':callback' => $callback, ':module' => $module)); // Let the user know what's wrong and throw an exception to stop the // callback. drupal_set_message($error, 'error'); throw new Exception($error); } $modules[$dependency] = 0; } } // Reset module list. module_list(FALSE, TRUE, FALSE, $modules); // Ensure the language variable is set, if not it might cause problems (e.g. // entity info). global $language; if (!isset($language)) { $language = language_default(); } // If access arguments are passed, boot to SESSION and validate if the user // has access to this callback. if (!empty($valid_callbacks[$callback]['access arguments']) || !empty($valid_callbacks[$callback]['access callback'])) { drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); // If no callback is provided, default to user_access. if (!isset($valid_callbacks[$callback]['access callback'])) { $valid_callbacks[$callback]['access callback'] = 'user_access'; } if ($valid_callbacks[$callback]['access callback'] == 'user_access') { // Ensure the user module is available. drupal_load('module', 'user'); } if (!call_user_func_array($valid_callbacks[$callback]['access callback'], !empty($valid_callbacks[$callback]['access arguments']) ? $valid_callbacks[$callback]['access arguments'] : array())) { return JS_MENU_ACCESS_DENIED; } } // Invoke implementations of hook_init() if the callback doesn't indicate it // should be skipped. if (!isset($valid_callbacks[$callback]['skip_hook_init']) || $valid_callbacks[$callback]['skip_hook_init'] == FALSE) { module_invoke_all('init'); } } // If there are page arguments defined add them to the callback call. if (isset($valid_callbacks[$callback]['page arguments'])) { // Get the original args again and strip first arguments 'js_callback' and 'module'. $args = array_slice(explode('/', $_GET['q']), 2); // Overwrite the arguments $args = array_intersect_key($args, array_flip($valid_callbacks[$callback]['page arguments'])); } // Invoke callback function. return call_user_func_array($valid_callbacks[$callback]['callback'], $args); }
/** * @param array $values */ public function __construct(array $values = array()) { // If this bootstrap object is used in a service, bootstrap.inc may // not have been included yet. If the file is not included, the // Drupal bootstrap constants are not available. require_once $values['DRUPAL_ROOT'] . '/includes/bootstrap.inc'; parent::__construct($values); /** * Sets up the script environment and loads settings.php. * * @see _drupal_bootstrap_configuration() */ $this[DRUPAL_BOOTSTRAP_CONFIGURATION] = $this->share(function () { // Start a page timer: timer_start('page'); // Initialize the configuration, including variables from settings.php. // drupal_settings_initialize(); global $base_url, $base_path, $base_root; // Export these settings.php variables to the global namespace. global $databases, $cookie_domain, $conf, $installed_profile, $update_free_access, $db_url, $db_prefix, $drupal_hash_salt, $is_https, $base_secure_url, $base_insecure_url; $conf = array(); if (file_exists(DRUPAL_ROOT . '/' . conf_path() . '/settings.php')) { include_once DRUPAL_ROOT . '/' . conf_path() . '/settings.php'; } $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on'; if (isset($base_url)) { // Parse fixed base URL from settings.php. $parts = parse_url($base_url); if (!isset($parts['path'])) { $parts['path'] = ''; } $base_path = $parts['path'] . '/'; // Build $base_root (everything until first slash after "scheme://"). $base_root = substr($base_url, 0, strlen($base_url) - strlen($parts['path'])); } else { // Create base URL. $http_protocol = $is_https ? 'https' : 'http'; $base_root = $http_protocol . '://' . $_SERVER['HTTP_HOST']; $base_url = $base_root; // $_SERVER['SCRIPT_NAME'] can, in contrast to $_SERVER['PHP_SELF'], not // be modified by a visitor. if ($dir = rtrim(dirname($_SERVER['SCRIPT_NAME']), '\\/')) { $base_path = $dir; $base_url .= $base_path; $base_path .= '/'; } else { $base_path = '/'; } } $base_secure_url = str_replace('http://', 'https://', $base_url); $base_insecure_url = str_replace('https://', 'http://', $base_url); // We do not mess with cookie or session settings in Drupal at all. }); // DRUPAL_BOOTSTRAP_PAGE_CACHE only loads the cache handler. $this[DRUPAL_BOOTSTRAP_PAGE_CACHE] = $this->share(function () { // Allow specifying special cache handlers in settings.php, like // using memcached or files for storing cache information. require_once DRUPAL_ROOT . '/includes/cache.inc'; foreach (variable_get('cache_backends', array()) as $include) { require_once DRUPAL_ROOT . '/' . $include; } }); // DRUPAL_BOOTSTRAP_DATABASE - in parent class. $this[DRUPAL_BOOTSTRAP_VARIABLES] = $this->share($this->extend(DRUPAL_BOOTSTRAP_VARIABLES, function () { if (isset($GLOBALS['service_container']) && is_a($GLOBALS['service_container'], 'Symfony\\Component\\DependencyInjection\\ContainerInterface')) { /** @var \Symfony\Component\DependencyInjection\ContainerInterface $container */ $container = $GLOBALS['service_container']; $GLOBALS['conf']['session_inc'] = $container->getParameter('bangpound_drupal.conf.session_inc'); $GLOBALS['conf']['mail_system']['default-system'] = $container->getParameter('bangpound_drupal.conf.mail_system.default_system'); } })); // DRUPAL_BOOTSTRAP_SESSION - in base class. $this[DRUPAL_BOOTSTRAP_PAGE_HEADER] = $this->share(function () { bootstrap_invoke_all('boot'); }); // DRUPAL_BOOTSTRAP_LANGUAGE $this[DRUPAL_BOOTSTRAP_FULL] = $this->share(function () { require_once DRUPAL_ROOT . '/includes/common.inc'; require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc'); require_once DRUPAL_ROOT . '/includes/theme.inc'; require_once DRUPAL_ROOT . '/includes/pager.inc'; require_once DRUPAL_ROOT . '/' . variable_get('menu_inc', 'includes/menu.inc'); require_once DRUPAL_ROOT . '/includes/tablesort.inc'; require_once DRUPAL_ROOT . '/includes/file.inc'; require_once DRUPAL_ROOT . '/includes/unicode.inc'; require_once DRUPAL_ROOT . '/includes/image.inc'; require_once DRUPAL_ROOT . '/includes/form.inc'; require_once DRUPAL_ROOT . '/includes/mail.inc'; require_once DRUPAL_ROOT . '/includes/actions.inc'; require_once DRUPAL_ROOT . '/includes/ajax.inc'; require_once DRUPAL_ROOT . '/includes/token.inc'; require_once DRUPAL_ROOT . '/includes/errors.inc'; // Detect string handling method unicode_check(); // Undo magic quotes fix_gpc_magic(); // Load all enabled modules module_load_all(); // Make sure all stream wrappers are registered. file_get_stream_wrappers(); // Ensure mt_rand is reseeded, to prevent random values from one page load // being exploited to predict random values in subsequent page loads. $seed = unpack("L", drupal_random_bytes(4)); mt_srand($seed[1]); $test_info =& $GLOBALS['drupal_test_info']; if (!empty($test_info['in_child_site'])) { // Running inside the simpletest child site, log fatal errors to test // specific file directory. ini_set('log_errors', 1); ini_set('error_log', 'public://error.log'); } // Initialize $_GET['q'] prior to invoking hook_init(). drupal_path_initialize(); // Remaining function calls from this phase of bootstrap must happen after // the user is authenticated because they initialize the theme and call // menu_get_item(). }); }