You are here

openid_connect.install in OpenID Connect / OAuth client 2.x

Same filename and directory in other branches
  1. 8 openid_connect.install
  2. 7 openid_connect.install

Install, update and uninstall functions for the OpenID Connect module.

File

openid_connect.install
View source
<?php

/**
 * @file
 * Install, update and uninstall functions for the OpenID Connect module.
 */

/* @noinspection PhpUnnecessaryFullyQualifiedNameInspection */

/* @noinspection PhpUnused */
use Drupal\Core\Config\Entity\ConfigEntityType;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Utility\UpdateException;

/**
 * Add default config for Facebook and LinkedIn provider.
 */
function openid_connect_update_8101() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory
    ->getEditable('openid_connect.settings.facebook');
  $config
    ->set('enabled', FALSE);
  $config
    ->set('settings', [
    'client_id' => '',
    'client_secret' => '',
    'api_version' => '',
  ]);
  $config
    ->save(TRUE);
  $config = $config_factory
    ->getEditable('openid_connect.settings.linkedin');
  $config
    ->set('enabled', FALSE);
  $config
    ->set('settings', [
    'client_id' => '',
    'client_secret' => '',
  ]);
  $config
    ->save(TRUE);
}

/**
 * Add default config for GitHub provider.
 */
function openid_connect_update_8102() {
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings.github');
  $config
    ->set('enabled', FALSE);
  $config
    ->set('settings', [
    'client_id' => '',
    'client_secret' => '',
  ]);
  $config
    ->save(TRUE);
}

/**
 * Update the active config with the registration override value.
 */
function openid_connect_update_8103() {
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings');
  $config
    ->set('override_registration_settings', FALSE);
  $config
    ->save(TRUE);
}

/**
 * Update the active config with the connect existing users value.
 */
function openid_connect_update_8104() {
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings');
  $config
    ->set('connect_existing_users', FALSE);
  $config
    ->save(TRUE);
}

/**
 * Delete duplicate entries in the openid_connect_authmap table.
 */
function openid_connect_update_8105() {
  $database = \Drupal::database();

  // Get the IDs for the duplicate entries.
  $query = $database
    ->select('openid_connect_authmap', 'a1')
    ->fields('a1', [
    'aid',
  ]);
  $query
    ->innerJoin('openid_connect_authmap', 'a2', 'a1.uid = a2.uid AND a1.client_name = a2.client_name AND a1.sub = a2.sub');
  $query
    ->where('a1.aid > a2.aid');
  $aids = $query
    ->distinct()
    ->execute()
    ->fetchAllAssoc('aid');
  if (!empty($aids)) {

    // If duplicates exist, delete them.
    $database
      ->delete('openid_connect_authmap')
      ->condition('aid', array_keys($aids), 'IN')
      ->execute();
  }
}

/**
 * Add default config for Okta provider.
 */
function openid_connect_update_8106() {
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings.okta');
  $config
    ->set('enabled', FALSE);
  $config
    ->set('settings', [
    'client_id' => '',
    'client_secret' => '',
    'okta_domain' => '',
  ]);
  $config
    ->save(TRUE);
}

/**
 * Installs the new config entity type openid_connect_client.
 */
function openid_connect_update_8199() {
  $changeList = \Drupal::entityDefinitionUpdateManager()
    ->getChangeList();
  if (!array_key_exists('openid_connect_client', $changeList)) {
    return 'Skipped. The new config entity type openid_connect_client is already installed.';
  }
  try {
    \Drupal::entityDefinitionUpdateManager()
      ->installEntityType(new ConfigEntityType([
      'id' => 'openid_connect_client',
      'label' => new TranslatableMarkup('OpenID Connect client'),
      'admin_permission' => "administer openid connect clients",
      'handlers' => [
        'list_builder' => 'Drupal\\openid_connect\\Controller\\OpenIDConnectClientListBuilder',
        'form' => [
          'add' => 'Drupal\\openid_connect\\Form\\OpenIDConnectClientAddForm',
          'edit' => 'Drupal\\openid_connect\\Form\\OpenIDConnectClientEditForm',
          'delete' => 'Drupal\\openid_connect\\Form\\OpenIDConnectClientDeleteForm',
        ],
      ],
      'config_prefix' => 'client',
      'entity_keys' => [
        'id' => 'id',
        'label' => 'label',
        'status' => 'status',
      ],
      'links' => [
        "edit-form" => "/admin/config/people/openid-connect/{openid_connect_client}/edit",
        "delete-form" => "/admin/config/people/openid-connect/{openid_connect_client}/delete",
        "enable" => "/admin/config/people/openid-connect/{openid_connect_client}/enable",
        "disable" => "/admin/config/people/openid-connect/{openid_connect_client}/disable",
        "collection" => "/admin/config/people/openid-connect",
      ],
      'config_export' => [
        'id',
        'label',
        'plugin',
        'settings',
      ],
    ]));
  } catch (\Exception $exception) {
    throw new UpdateException($exception
      ->getMessage());
  }
  return 'Installed the new config entity type openid_connect_client.';
}

/**
 * Convert client configuration objects to configuration entities.
 */
function openid_connect_update_8200() {
  $definitions = \Drupal::service('plugin.manager.openid_connect_client')
    ->getDefinitions();
  $entity_storage = \Drupal::entityTypeManager()
    ->getStorage('openid_connect_client');
  foreach ($definitions as $plugin) {
    $configuration = \Drupal::configFactory()
      ->getEditable('openid_connect.settings.' . $plugin['id']);

    // Only convert configuration where the client id or secret are not empty.
    $settings = $configuration
      ->get('settings');
    if (!empty($settings['client_id']) || !empty($settings['client_secret'])) {

      // Create new configuration entity.
      $entity_storage
        ->create([
        'status' => $configuration
          ->get('enabled'),
        'id' => $plugin['id'],
        'label' => $plugin['label']
          ->getUntranslatedString(),
        'plugin' => $plugin['id'],
        'settings' => $settings,
      ])
        ->save();
    }

    // Delete old configuration object.
    $configuration
      ->delete();
  }
}

/**
 * Update the active config for installations using generic client.
 */
function openid_connect_update_8201() {

  /** @var \Drupal\openid_connect\OpenIDConnectClientEntityInterface[] $clients */
  $clients = \Drupal::entityTypeManager()
    ->getStorage('openid_connect_client')
    ->loadByProperties([
    'plugin' => 'generic',
  ]);
  foreach ($clients as $client) {
    $client
      ->getPlugin()
      ->setConfiguration([
      'issuer_url' => '',
    ]);
    $client
      ->save();
  }
}

/**
 * Add redirect_login to module settings.
 */
function openid_connect_update_8202() {
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings');
  $config
    ->set('redirect_login', 'user');
  $config
    ->save(TRUE);
}

/**
 * Enable externalauth.
 */
function openid_connect_update_8203() {
  \Drupal::service('module_installer')
    ->install([
    'externalauth',
  ]);
}

/**
 * Move all 'openid_connect_authmap' data to 'authmap'.
 */
function openid_connect_update_8204() {
  $database = \Drupal::database();

  // Get all records and move them to the authmap table.
  $query = $database
    ->select('openid_connect_authmap', 'a')
    ->fields('a');
  $authmap_records = $query
    ->execute()
    ->fetchAllAssoc('aid');
  foreach ($authmap_records as $authmap_record) {
    $database
      ->merge('authmap')
      ->keys([
      'uid' => $authmap_record->uid,
      'provider' => 'openid_connect.' . $authmap_record->client_name,
    ])
      ->fields([
      'authname' => $authmap_record->sub,
      'data' => 'N;',
    ])
      ->execute();
  }
}

/**
 * Drop the 'openid_connect_authmap' table.
 */
function openid_connect_update_8205() {
  \Drupal::database()
    ->schema()
    ->dropTable('openid_connect_authmap');
}

/**
 * Installs the new config entity type openid_connect_client.
 */
function openid_connect_update_8206() {
  return openid_connect_update_8199();
}

/**
 * Update generic plugins with End Session endpoint and logout redirect URL.
 */
function openid_connect_update_8207() {
  $clients = \Drupal::entityTypeManager()
    ->getStorage('openid_connect_client')
    ->loadByProperties([
    'plugin' => 'generic',
  ]);
  foreach ($clients as $client) {
    $config = $client
      ->getPlugin()
      ->getConfiguration();
    if (empty($config['end_session_endpoint'])) {
      $client
        ->getPlugin()
        ->setConfiguration([
        'end_session_endpoint' => '',
      ]);
      $client
        ->save();
    }
  }
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings');
  $config
    ->set('redirect_logout', '');
  $config
    ->save(TRUE);
}

/**
 * Update generic plugins with scopes.
 */
function openid_connect_update_8208() {
  $clients = \Drupal::entityTypeManager()
    ->getStorage('openid_connect_client')
    ->loadByProperties([
    'plugin' => 'generic',
  ]);
  foreach ($clients as $client) {
    $config = $client
      ->getPlugin()
      ->getConfiguration();
    if (empty($config['scopes'])) {
      $client
        ->getPlugin()
        ->setConfiguration([
        'scopes' => [
          'openid',
          'email',
        ],
      ]);
      $client
        ->save();
    }
  }
}

/**
 * Set default value for end_session_enabled setting.
 */
function openid_connect_update_8209() {
  $config = \Drupal::configFactory()
    ->getEditable('openid_connect.settings');
  $config
    ->set('end_session_enabled', TRUE);
  $config
    ->save(TRUE);
}

/**
 * Update okta plugins with scopes.
 */
function openid_connect_update_8210() {
  $clients = \Drupal::entityTypeManager()
    ->getStorage('openid_connect_client')
    ->loadByProperties([
    'plugin' => 'okta',
  ]);
  foreach ($clients as $client) {
    $config = $client
      ->getPlugin()
      ->getConfiguration();
    if (empty($config['scopes'])) {
      $client
        ->getPlugin()
        ->setConfiguration([
        'scopes' => [
          'openid',
          'email',
        ],
      ]);
      $client
        ->save();
    }
  }
}

Functions

Namesort descending Description
openid_connect_update_8101 Add default config for Facebook and LinkedIn provider.
openid_connect_update_8102 Add default config for GitHub provider.
openid_connect_update_8103 Update the active config with the registration override value.
openid_connect_update_8104 Update the active config with the connect existing users value.
openid_connect_update_8105 Delete duplicate entries in the openid_connect_authmap table.
openid_connect_update_8106 Add default config for Okta provider.
openid_connect_update_8199 Installs the new config entity type openid_connect_client.
openid_connect_update_8200 Convert client configuration objects to configuration entities.
openid_connect_update_8201 Update the active config for installations using generic client.
openid_connect_update_8202 Add redirect_login to module settings.
openid_connect_update_8203 Enable externalauth.
openid_connect_update_8204 Move all 'openid_connect_authmap' data to 'authmap'.
openid_connect_update_8205 Drop the 'openid_connect_authmap' table.
openid_connect_update_8206 Installs the new config entity type openid_connect_client.
openid_connect_update_8207 Update generic plugins with End Session endpoint and logout redirect URL.
openid_connect_update_8208 Update generic plugins with scopes.
openid_connect_update_8209 Set default value for end_session_enabled setting.
openid_connect_update_8210 Update okta plugins with scopes.