Commit 4b128848 authored by Bojan Bogdanovic's avatar Bojan Bogdanovic
Browse files

Issue #3269822: Migrate roles (used as scopes) to the new "Scope" entity

parent da882d5b
Loading
Loading
Loading
Loading
Loading
+80 −36
Original line number Diff line number Diff line
@@ -9,8 +9,9 @@ use Drupal\Core\Config\FileStorage;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\simple_oauth\Entity\Oauth2ScopeEntityAdapter;
use Drupal\simple_oauth\Plugin\Oauth2GrantManager;
use Drupal\simple_oauth\Entity\Oauth2Scope;
use Drupal\simple_oauth\Oauth2ScopeInterface;

/**
 * Define the default batch size.
@@ -131,23 +132,10 @@ function simple_oauth_update_8601() {
    ->save();
}

/**
 * Enable all grant types for existing consumers.
 */
function simple_oauth_update_8602() {
  $consumers = \Drupal::entityTypeManager()->getStorage('consumer')->loadMultiple();
  $grant_types = array_keys(Oauth2GrantManager::getAvailablePluginsAsOptions());
  foreach ($consumers as $consumer) {
    $consumer
      ->set('grant_types', $grant_types)
      ->save();
  }
}

/**
 * Install new config entity type "oauth2_scope".
 */
function simple_oauth_update_8603() {
function simple_oauth_update_8602() {
  $type_manager = \Drupal::entityTypeManager();
  $type_manager->clearCachedDefinitions();
  $entity_type = $type_manager->getDefinition('oauth2_scope');
@@ -157,7 +145,7 @@ function simple_oauth_update_8603() {
/**
 * Install/update/delete BaseFields for the consumer entity.
 */
function simple_oauth_update_8604() {
function simple_oauth_update_8603() {
  $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $entity_type_id = 'consumer';
  $provider = 'simple_oauth';
@@ -211,6 +199,18 @@ function simple_oauth_update_8604() {
  // Update fields.
  $update_field_definitions['confidential'] = $entity_definition_update_manager->getFieldStorageDefinition('confidential', $entity_type_id);
  $update_field_definitions['confidential']->setTranslatable(FALSE);
  $database = \Drupal::database();
  $redirect_values = $database->select('consumer_field_data', 'c')
    ->fields('c', ['id', 'redirect'])
    ->isNotNull('c.redirect')
    ->execute()
    ->fetchAllKeyed();

  // Remove data from the storage.
  $database->update('consumer_field_data')
    ->fields(['redirect' => NULL])
    ->execute();

  $update_field_definitions['redirect'] = $entity_definition_update_manager->getFieldStorageDefinition('redirect', $entity_type_id);
  $update_field_definitions['redirect']
    ->setLabel(new TranslatableMarkup('Redirect URIs'))
@@ -218,6 +218,7 @@ function simple_oauth_update_8604() {
    ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
    ->setRequired(TRUE)
    ->addConstraint('Oauth2RedirectUri');

  $update_field_definitions['pkce'] = $entity_definition_update_manager->getFieldStorageDefinition('pkce', $entity_type_id);
  $update_field_definitions['pkce']->setTranslatable(FALSE);

@@ -225,8 +226,69 @@ function simple_oauth_update_8604() {
    $entity_definition_update_manager->updateFieldStorageDefinition($field_definition);
  }

  // Remove field.
  $roles_field_definition = $entity_definition_update_manager->getFieldStorageDefinition('roles', $entity_type_id);
  // Migrate redirect values.
  $insert_query = $database->insert('consumer__redirect')
    ->fields(['bundle', 'deleted', 'entity_id', 'revision_id', 'langcode', 'delta', 'redirect_value']);
  foreach ($redirect_values as $id => $redirect_value) {
    $insert_query->values(['consumer', 0, $id, $id, 'en', 0, $redirect_value]);
  }
  $insert_query->execute();
}

/**
 * Migrate roles used as scope and migrate settings to the consumer.
 */
function simple_oauth_update_8604() {
  $scopes = [];
  $consumers = \Drupal::entityTypeManager()->getStorage('consumer')->loadMultiple();
  $grant_types = array_keys(Oauth2GrantManager::getAvailablePluginsAsOptions());
  $config = \Drupal::configFactory()->get('simple_oauth.settings');

  $database = \Drupal::database();
  $roles_ids = $database->select('consumer__roles', 'r')
    ->fields('r', ['entity_id', 'roles_target_id'])
    ->execute()
    ->fetchAllKeyed();

  foreach ($consumers as $consumer) {
    $scopes_to_reference = [];
    foreach ($roles_ids as $entity_id => $role_id) {
      if ($entity_id !== (int) $consumer->id()) {
        continue;
      }
      /** @var \Drupal\user\RoleInterface $role */
      $role = \Drupal::entityTypeManager()->getStorage('user_role')->load($role_id);
      if (!isset($scopes[$role->id()])) {
        $scope = Oauth2Scope::create([
          'name' => $role->id(),
          'description' => $role->label(),
          'grant_types' => [
            'authorization_code' => ['status' => TRUE],
            'client_credentials' => ['status' => TRUE],
            'refresh_token' => ['status' => TRUE],
          ],
          'granularity' => Oauth2ScopeInterface::GRANULARITY_ROLE,
          'role' => $role->id(),
        ]);
        $scope->save();
        $scopes[$role->id()] = $scope;
      }

      $scopes_to_reference[] = $scopes[$role->id()]->id();
    }

    $consumer
      ->set('scopes', $scopes_to_reference)
      ->set('grant_types', $grant_types)
      ->set('remember_approval', (bool) $config->get('remember_clients'))
      ->set('access_token_expiration', $config->get('access_token_expiration'))
      ->set('refresh_token_expiration', $config->get('refresh_token_expiration'))
      ->save();
  }

  // Remove roles field.
  $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $roles_field_definition = $entity_definition_update_manager->getFieldStorageDefinition('roles', 'consumer');
  $entity_definition_update_manager->uninstallFieldStorageDefinition($roles_field_definition);
}

@@ -252,21 +314,3 @@ function simple_oauth_update_8605() {
    ->setTranslatable(FALSE);
  $entity_definition_update_manager->installFieldStorageDefinition($field_name, $entity_type_id, $provider, $field_definition);
}

/**
 * Migrate OAuth2 settings to the consumer entity.
 */
function simple_oauth_update_8606() {
  $config = \Drupal::configFactory()->get('simple_oauth.settings');
  $remember_clients = (bool) $config->get('remember_clients');
  $access_token_expiration = $config->get('access_token_expiration');
  $refresh_token_expiration = $config->get('refresh_token_expiration');
  $consumer_storage = \Drupal::entityTypeManager()->getStorage('consumer');

  foreach ($consumer_storage->loadMultiple() as $consumer) {
    $consumer->set('remember_approval', $remember_clients);
    $consumer->set('access_token_expiration', $access_token_expiration);
    $consumer->set('refresh_token_expiration', $refresh_token_expiration);
    $consumer->save();
  }
}