Files
wp-multisite-waas/dependencies/amphp/windows-registry/lib/WindowsRegistry.php
2024-11-30 18:24:12 -07:00

69 lines
2.5 KiB
PHP

<?php
namespace WP_Ultimo\Dependencies\Amp\WindowsRegistry;
use WP_Ultimo\Dependencies\Amp\ByteStream;
use WP_Ultimo\Dependencies\Amp\Process\Process;
use WP_Ultimo\Dependencies\Amp\Promise;
use function WP_Ultimo\Dependencies\Amp\call;
class WindowsRegistry
{
public function read(string $key) : Promise
{
return call(function () use($key) {
$key = \strtr($key, '/', "\\");
$parts = \explode("\\", $key);
$value = \array_pop($parts);
$key = \implode("\\", $parts);
$lines = (yield $this->query($key));
$lines = \array_filter($lines, function ($line) {
return '' !== $line && $line[0] === ' ';
});
$values = \array_map(function ($line) {
return \preg_split("(\\s+)", \ltrim($line), 3);
}, $lines);
$foundValue = null;
foreach ($values as $v) {
if ($v[0] === $value) {
if (\count($v) >= 3) {
return $v[2];
}
$foundValue = $v;
}
}
if ($foundValue) {
throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' was found, but could not be read correctly, got " . \var_export($foundValue, \true));
}
throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' not found.");
});
}
public function listKeys(string $key) : Promise
{
return call(function () use($key) {
$lines = (yield $this->query($key));
$lines = \array_filter($lines, function ($line) {
return '' !== $line && $line[0] !== ' ';
});
return $lines;
});
}
private function query(string $key) : Promise
{
return call(function () use($key) {
if (0 !== \stripos(\PHP_OS, 'WIN')) {
throw new \Error('Not running on Windows.');
}
$key = \strtr($key, '/', "\\");
$cmd = \sprintf('reg query %s', \escapeshellarg($key));
$process = new Process($cmd);
(yield $process->start());
$stdout = (yield ByteStream\buffer($process->getStdout()));
$code = (yield $process->join());
if ($code !== 0) {
throw new KeyNotFoundException("Windows registry key '{$key}' not found.");
}
return \explode("\n", \str_replace("\r", '', $stdout));
});
}
}