You are here

public function ClientForm::form in OAuth2 Server 8

Same name and namespace in other branches
  1. 2.0.x src/Form/ClientForm.php \Drupal\oauth2_server\Form\ClientForm::form()

Gets the actual form array to be built.

Overrides EntityForm::form

See also

\Drupal\Core\Entity\EntityForm::processForm()

\Drupal\Core\Entity\EntityForm::afterBuild()

File

src/Form/ClientForm.php, line 65

Class

ClientForm
Class Client Form.

Namespace

Drupal\oauth2_server\Form

Code

public function form(array $form, FormStateInterface $form_state) {
  $client = $this->entity;
  $server = $form_state
    ->get('oauth2_server');
  if (!$server) {
    throw new \Exception('OAuth2 server was not set');
  }
  $form['#tree'] = TRUE;
  $form['server_id'] = [
    '#type' => 'value',
    '#value' => $server
      ->id(),
  ];
  $form['name'] = [
    '#title' => $this
      ->t('Label'),
    '#type' => 'textfield',
    '#default_value' => $client->name,
    '#description' => $this
      ->t('The human-readable name of this client.'),
    '#required' => TRUE,
    '#weight' => -50,
  ];
  $form['client_id'] = [
    '#title' => $this
      ->t('Client ID'),
    '#type' => 'machine_name',
    '#default_value' => $client
      ->id(),
    '#required' => TRUE,
    '#weight' => -40,
    '#machine_name' => [
      'exists' => [
        $this,
        'exists',
      ],
    ],
  ];
  $form['require_client_secret'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Require a client secret'),
    '#default_value' => !empty($client
      ->isNew()) || !empty($client->client_secret),
    '#weight' => -35,
  ];
  $grant_types = array_filter($client->settings['override_grant_types'] ? $client->settings['grant_types'] : $server->settings['grant_types']);
  $jwt_bearer_enabled = isset($grant_types['urn:ietf:params:oauth:grant-type:jwt-bearer']);
  $form['client_secret'] = [
    '#title' => $this
      ->t('Client secret'),
    '#type' => 'password',
    '#weight' => -30,
    // Hide this field if only JWT bearer is enabled, since it doesn't use it.
    '#access' => count($grant_types) != 1 || !$jwt_bearer_enabled,
    '#states' => [
      'required' => [
        'input[name="require_client_secret"]' => [
          'checked' => TRUE,
        ],
      ],
      'visible' => [
        'input[name="require_client_secret"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  if (!empty($client->client_secret)) {
    $form['client_secret']['#description'] = $this
      ->t('Leave this blank, and leave "Require a client secret" checked, to use the previously saved secret.');
    unset($form['client_secret']['#states']['required']);
  }
  $form['public_key'] = [
    '#title' => $this
      ->t('Public key'),
    '#type' => 'textarea',
    '#default_value' => $client->public_key,
    '#required' => TRUE,
    '#description' => $this
      ->t('Used to decode the JWT when the %JWT grant type is used.', [
      '%JWT' => $this
        ->t('JWT bearer'),
    ]),
    '#weight' => -20,
    // Show the field if JWT bearer is enabled, other grant types don't use
    // it.
    '#access' => $jwt_bearer_enabled,
  ];
  $form['redirect_uri'] = [
    '#title' => $this
      ->t('Redirect URIs'),
    '#type' => 'textarea',
    '#default_value' => $client->redirect_uri,
    '#description' => $this
      ->t('The absolute URIs to validate against. Enter one value per line.'),
    '#required' => TRUE,
    '#weight' => -10,
  ];
  $form['automatic_authorization'] = [
    '#title' => $this
      ->t('Automatically authorize this client'),
    '#type' => 'checkbox',
    '#default_value' => $client->automatic_authorization,
    '#description' => $this
      ->t('This will cause the authorization form to be skipped. <b>Warning:</b> Give to trusted clients only!'),
    '#weight' => 39,
  ];
  $form['settings'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('Advanced settings'),
    '#collapsible' => TRUE,
    '#weight' => 40,
  ];
  $form['settings']['override_grant_types'] = [
    '#title' => $this
      ->t('Override available grant types'),
    '#type' => 'checkbox',
    '#default_value' => !empty($client->settings['override_grant_types']),
  ];
  $form['settings']['allow_implicit'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Allow the implicit flow'),
    '#description' => $this
      ->t('Allows clients to receive an access token without the need for an authorization request token.'),
    '#default_value' => !empty($client->settings['allow_implicit']),
    '#states' => [
      'visible' => [
        '#edit-settings-override-grant-types' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];

  // Prepare a list of available grant types.
  $grant_types = Utility::getGrantTypes();
  $grant_type_options = [];
  foreach ($grant_types as $type => $grant_type) {
    $grant_type_options[$type] = $grant_type['name'];
  }
  $form['settings']['grant_types'] = [
    '#type' => 'checkboxes',
    '#title' => $this
      ->t('Enabled grant types'),
    '#options' => $grant_type_options,
    '#default_value' => $client->settings['grant_types'],
    '#states' => [
      'visible' => [
        '#edit-settings-override-grant-types' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];

  // Add any grant type specific settings.
  foreach ($grant_types as $type => $grant_type) {

    // Merge-in any provided defaults.
    if (isset($grant_type['default settings'])) {
      $client->settings += $grant_type['default settings'];
    }

    // Add the form elements.
    if (isset($grant_type['settings callback'])) {
      $dom_ids = [];
      $dom_ids[] = 'edit-settings-override-grant-types';
      $dom_ids[] = 'edit-settings-grant-types-' . str_replace('_', '-', $type);
      $form['settings'] += $grant_type['settings callback']($client->settings, $dom_ids);
    }
  }
  return parent::form($form, $form_state);
}