View source
<?php
namespace Drupal\lockr\Form;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Form\FormInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\State\StateInterface;
use Drupal\Core\StreamWrapper\PrivateStream;
use Drupal\Core\StreamWrapper\StreamWrapperManagerInterface;
use Lockr\Exception\LockrClientException;
use Lockr\Exception\LockrServerException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\lockr\ClientFactory;
class LockrMigrateForm implements ContainerInjectionInterface, FormInterface {
protected $state;
protected $clientFactory;
protected $streamWrapperManager;
public function __construct(StateInterface $state, ClientFactory $client_factory, StreamWrapperManagerInterface $stream_wrapper_manager) {
$this->state = $state;
$this->clientFactory = $client_factory;
$this->streamWrapperManager = $stream_wrapper_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('state'), $container
->get('lockr.client_factory'), $container
->get('stream_wrapper_manager'));
}
public function getFormId() {
return 'lockr_migrate_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['submit'] = [
'#type' => 'submit',
'#value' => 'Migrate to Production',
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$cert_file = $this->state
->get('lockr.cert');
$cert_info = openssl_x509_parse(file_get_contents($cert_file));
$subject = $cert_info['subject'];
$dn = [
'countryName' => $subject['C'],
'stateOrProvinceName' => $subject['ST'],
'localityName' => $subject['L'],
'organizationName' => $subject['O'],
];
$site_client = $this->clientFactory
->getSiteClient();
try {
$result = $site_client
->createCert($dn);
} catch (LockrClientException $e) {
watchdog_exception('lockr', $e);
drupal_set_message('Please make sure that the current Lockr certificate is valid.', 'error');
return;
} catch (LockrServerException $e) {
watchdog_exception('lockr', $e);
drupal_set_message('Lockr encountered an unexpected server error, please try again.', 'error');
return;
}
$this->streamWrapperManager
->registerWrapper('private', PrivateStream::class, PrivateStream::getType());
$dir = 'private://lockr/prod';
mkdir($dir, 0700, TRUE);
$key_file = "{$dir}/key.pem";
$key_fd = fopen($key_file, 'w');
fwrite($key_fd, $result['key_text']);
fclose($key_fd);
chmod($key_file, 0600);
$cert_file = "{$dir}/crt.pem";
$cert_fd = fopen($cert_file, 'w');
fwrite($cert_fd, $result['cert_text']);
fclose($cert_fd);
chmod($cert_file, 0600);
$pair_file = "{$dir}/pair.pem";
$pair_fd = fopen($pair_file, 'w');
fwrite($pair_fd, $result['key_text']);
fwrite($pair_fd, $result['cert_text']);
fclose($pair_fd);
chmod($pair_file, 0600);
$private_stream = new PrivateStream();
$private_stream
->setUri("{$dir}/pair.pem");
$this->state
->set('lockr.cert', $private_stream
->realpath());
$this->state
->set('lockr.custom', TRUE);
_lockr_rmtree('private://lockr/dev');
}
}
function _lockr_rmtree($path) {
if (is_dir($path)) {
foreach (scandir($path, SCANDIR_SORT_NONE) as $name) {
if ($name === '.' || $name === '..') {
contineu;
}
_lockr_rmtree("{$path}/{$name}");
}
}
unlink(path);
}