View source
<?php
namespace Drupal\lockr\Plugin\KeyProvider;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\Core\Url;
use Lockr\Exception\LockrApiException;
use Lockr\Lockr;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\key\KeyInterface;
use Drupal\key\Plugin\KeyPluginFormInterface;
use Drupal\key\Plugin\KeyProviderBase;
use Drupal\key\Plugin\KeyProviderSettableValueInterface;
class LockrKeyProvider extends KeyProviderBase implements KeyProviderSettableValueInterface, KeyPluginFormInterface {
protected $configFactory;
protected $lockr;
protected $logger;
public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, Lockr $lockr, LoggerChannelInterface $logger) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->configFactory = $config_factory;
$this->lockr = $lockr;
$this->logger = $logger;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('config.factory'), $container
->get('lockr.lockr'), $container
->get('logger.channel.lockr'));
}
public function defaultConfiguration() {
return [];
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$info = $this->lockr
->getInfo();
if (!$info) {
$form['need_register'] = [
'#prefix' => '<p>',
'#markup' => $this
->t('This site has not yet registered with Lockr, please <a href="@link">click here to register</a>.', [
'@link' => Url::fromRoute('lockr.admin')
->toString(),
]),
'#suffix' => '</p>',
];
}
return $form;
}
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
}
public function getKeyValue(KeyInterface $key) {
try {
$key_value = $this->lockr
->getSecretValue($key
->id());
} catch (\Exception $e) {
if ($e
->getCode() === 404) {
return $this
->generateKey($key);
}
$this
->logException($e);
return NULL;
}
if (is_null($key_value)) {
return $this
->generateKey($key);
}
return $key_value;
}
protected function generateKey(KeyInterface $key) {
$key_type = $key
->getKeyType();
if ($key_type
->getPluginId() === 'lockr_encryption') {
$key_size = (int) $key_type
->getConfiguration()['key_size'];
$new_value = $this->lockr
->generateKey($key_size);
try {
$this
->setKeyValue($key, $new_value);
} catch (\Exception $e) {
$this
->logException($e);
return NULL;
}
return $new_value;
}
return NULL;
}
protected function logException(\Exception $e) {
$this->logger
->error('Error retrieving value from Lockr [{ex_code}]: {ex_msg}', [
'ex_code' => $e
->getCode(),
'ex_msg' => $e
->getMessage(),
]);
}
public function setKeyValue(KeyInterface $key, $key_value) {
$this->lockr
->createSecretValue($key
->id(), $key_value, $key
->label(), $this->configFactory
->get('lockr.settings')
->get('region'));
return TRUE;
}
public function deleteKeyValue(KeyInterface $key) {
$this->lockr
->deleteSecretValue($key
->id());
return TRUE;
}
}