View source
<?php
namespace Drupal\key\Plugin\KeyType;
use Drupal\Core\Form\FormStateInterface;
use Drupal\key\Plugin\KeyTypeBase;
use Drupal\key\Plugin\KeyPluginFormInterface;
class EncryptionKeyType extends KeyTypeBase implements KeyPluginFormInterface {
public function defaultConfiguration() {
return [
'key_size' => 128,
];
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$key_size_options = [
'128' => 128,
'256' => 256,
];
$key_size = $this
->getConfiguration()['key_size'];
$key_size_other_value = '';
if (!in_array($key_size, $key_size_options)) {
$key_size_other_value = $key_size;
$key_size = 'other';
}
$form['key_size'] = [
'#type' => 'select',
'#title' => $this
->t('Key size'),
'#description' => $this
->t('The size of the key in bits, with 8 bits per byte.'),
'#options' => $key_size_options + [
'other' => $this
->t('Other'),
],
'#default_value' => $key_size,
'#required' => TRUE,
];
$form['key_size_other_value'] = [
'#type' => 'textfield',
'#title' => $this
->t('Key size (other value)'),
'#title_display' => 'invisible',
'#description' => $this
->t('Enter a custom key size in bits.'),
'#default_value' => $key_size_other_value,
'#maxlength' => 20,
'#size' => 20,
'#states' => [
'visible' => [
'select[name="key_type_settings[key_size]"]' => [
'value' => 'other',
],
],
'required' => [
'select[name="key_type_settings[key_size]"]' => [
'value' => 'other',
],
],
],
];
return $form;
}
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
$key_size = $form_state
->getValue('key_size');
if ($key_size == 'other') {
$form_state
->setValue('key_size', $form_state
->getValue('key_size_other_value'));
}
$form_state
->unsetValue('key_size_other_value');
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this
->setConfiguration($form_state
->getValues());
}
public static function generateKeyValue(array $configuration) {
if (!empty($configuration['key_size'])) {
$bytes = $configuration['key_size'] / 8;
}
else {
$bytes = 32;
}
$random_key = random_bytes($bytes);
return $random_key;
}
public function validateKeyValue(array $form, FormStateInterface $form_state, $key_value) {
if (!$form_state
->getValue('key_size')) {
return;
}
$bytes = $form_state
->getValue('key_size') / 8;
if (strlen($key_value) != $bytes) {
$form_state
->setErrorByName('key_size', $this
->t('The selected key size does not match the actual size of the key.'));
}
}
}