Commit 73c2d64a authored by Abdullah Yassin's avatar Abdullah Yassin Committed by Rajab Natshah
Browse files

Issue #3270834: Switch to use the Module Installer Factory with custom...

Issue #3270834: Switch to use the Module Installer Factory with custom install: for the Varbase Security module
parent 71a604a5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
    "cweagans/composer-patches": "~1.0",
    "drupal/core": "~9.0",
    "vardot/entity-definition-update-manager": "~1.0",
    "vardot/module-installer-factory": "~1.0",
    "drupal/config_update": "~1.0",
    "drupal/config_ignore": "~2.0",
    "drupal/config_inspector": "~1.0",
+7 −82
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ use Drupal\Core\Config\InstallStorage;
use Drupal\Core\Config\StorageInterface;
use Drupal\Core\Config\FileStorage;
use Vardot\Entity\EntityDefinitionUpdateManager;
use Vardot\Installer\ModuleInstallerFactory;

/**
 * Implements hook_install().
@@ -19,56 +20,16 @@ function varbase_security_install() {
  $module_name = 'varbase_security';
  $module_path = Drupal::service('module_handler')->getModule('varbase_security')->getPath();

  // Processer for install: in [$module_name].info.yml file.
  // Processer for install: in [$module_name].info.yml file using ModuleInstallerFactory.
  // ---------------------------------------------------------------------------.
  $module_info_file = $module_path . '/' . $module_name . '.info.yml';
  if (file_exists($module_info_file)) {
    $module_info_data = (array) Yaml::parse(file_get_contents($module_info_file));
    if (isset($module_info_data['install'])
      && is_array($module_info_data['install'])) {

      foreach ($module_info_data['install'] as $module) {
        if (!\Drupal::moduleHandler()->moduleExists($module)) {
          \Drupal::service('module_installer')->install([$module], TRUE);
        }
      }

      _varbase_security_set_module_weight_after_installation($module_info_file);
    }
  }
  ModuleInstallerFactory::installList($module_name);

  // Install optional configs.
  $optional_install_path = $module_path . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY;
  if (is_dir($optional_install_path)) {
    $config_installer = \Drupal::service('config.installer');
    $config_installer->installDefaultConfig('module', $module_name);

    // Create field storage configs first in active config.
    $storage_config_files = \Drupal::service('file_system')->scanDirectory($optional_install_path, '/^field.storage.*\\.(yml)$/i');
    if (isset($storage_config_files) && is_array($storage_config_files)) {
      foreach ($storage_config_files as $storage_config_file) {
        $storage_config_file_content = file_get_contents(DRUPAL_ROOT . '/' . $storage_config_file->uri);
        $storage_config_file_data = (array) Yaml::parse($storage_config_file_content);
        $config_factory = \Drupal::configFactory()->getEditable($storage_config_file->name);
        $config_factory->setData($storage_config_file_data)->save(TRUE);
      }
    }

    // Install any optional config the module provides.
    $storage = new FileStorage($optional_install_path, StorageInterface::DEFAULT_COLLECTION);
    $config_installer->installOptionalConfig($storage, '');

    // Have the .settings.yml configs into the active config.
    $settings_config_files = \Drupal::service('file_system')->scanDirectory($optional_install_path, '/^.*(settings.yml)$/i');
    if (isset($settings_config_files) && is_array($settings_config_files)) {
      foreach ($settings_config_files as $settings_config_file) {
        $settings_config_file_content = file_get_contents(DRUPAL_ROOT . '/' . $settings_config_file->uri);
        $settings_config_file_data = (array) Yaml::parse($settings_config_file_content);
        $config_factory = \Drupal::configFactory()->getEditable($settings_config_file->name);
        $config_factory->setData($settings_config_file_data)->save(TRUE);
      }
    }
  }
  ModuleInstallerFactory::importConfigsFromScanedDirectory($module_name, '/^field.storage.*\\.(yml)$/i');
  ModuleInstallerFactory::importConfigsFromScanedDirectory($module_name, '/^.*(settings.yml)$/i');

  // ---------------------------------------------------------------------------
  // Entity updates to clear up any mismatched entity and/or field definitions
  // And Fix changes were detected in the entity type and field definitions.
@@ -91,42 +52,6 @@ function varbase_security_install() {

}

/**
 * Get set module waht after installation.
 *
 * @param string $file_name
 *   The file name and path the varbase_security.info.yml.
 */
function _varbase_security_set_module_weight_after_installation(string $file_name) {
  // Get all modules from core.extension.
  $installed_modules = (array) \Drupal::service('config.factory')->getEditable('core.extension')->get('module');
  // Get weight of varbase security.
  $varbase_security_weight = $installed_modules['varbase_security'];
  // Get all modules installed by varbase security.
  $varbase_security_modules = (array) Yaml::parse(file_get_contents($file_name))['install'];
  // Empty array to put all modules weight [modules installed].
  $varase_security_modules_weight = [];

  foreach ($installed_modules as $module => $weight) {
    foreach ($varbase_security_modules as $vs_module_key => $vs_module_name) {
      if ($module === $vs_module_name) {
        $varase_security_modules_weight += [$module => $weight];
      }
    }
  }

  // Get max weight of modules installed by varbase_security.
  $max_wight = max($varase_security_modules_weight);

  // Set varbase_security weight to be grater than higher one by 1 if it's
  // less than or equal to max.
  if ($varbase_security_weight <= $max_wight) {
    module_set_weight('varbase_security', $max_wight + 1);
  }

  module_set_weight('varbase_security', $max_wight + 1);
}

/**
 * Add Flood Control module for login attempt limiting.
 *
@@ -223,7 +148,7 @@ function varbase_security_update_90004() {
    $module_info_data = (array) Yaml::parse(file_get_contents($module_info_file));
    if (isset($module_info_data['install'])
      && is_array($module_info_data['install'])) {
      _varbase_security_set_module_weight_after_installation($module_info_file);
      ModuleInstallerFactory::setModuleWeightAfterInstallation('varbase_security');
    }
  }