diff --git a/exec/lib/DirectAdminVacationApi.php b/exec/lib/DirectAdminVacationApi.php index 7b8adbb..b9af4d0 100644 --- a/exec/lib/DirectAdminVacationApi.php +++ b/exec/lib/DirectAdminVacationApi.php @@ -5,14 +5,19 @@ class DirectAdminVacationApi { /** @var callable|null */ private $request; - private string $daBinary = '/usr/local/bin/da'; + private string $daBinary = '/usr/local/directadmin/directadmin'; - public function __construct(string $daBinary = '/usr/local/bin/da', ?callable $request = null) + public function __construct(string $daBinary = '/usr/local/directadmin/directadmin', ?callable $request = null) { $this->daBinary = $daBinary; $this->request = $request; } + public function directAdminBinary(): string + { + return $this->daBinary; + } + /** @param array $rule @return array */ public function buildSavePayload(string $email, array $rule, bool $exists = true): array { @@ -133,7 +138,7 @@ class DirectAdminVacationApi private function apiUrl(string $owner): string { - $output = $this->run([$this->daBinary, 'api-url', '--user=' . $owner], ''); + $output = $this->run([$this->resolveDirectAdminBinary(), 'api-url', '--user=' . $owner], ''); $url = trim($output); if ($url === '' || !preg_match('#^https?://#', $url)) { throw new RuntimeException('Cannot determine DirectAdmin API URL for user'); @@ -141,9 +146,27 @@ class DirectAdminVacationApi return $url; } + private function resolveDirectAdminBinary(): string + { + $candidates = array_values(array_unique([ + $this->daBinary, + '/usr/local/directadmin/directadmin', + '/usr/bin/da', + ])); + foreach ($candidates as $candidate) { + if ($candidate !== '' && is_executable($candidate)) { + return $candidate; + } + } + throw new RuntimeException('DirectAdmin binary is not executable. Checked: ' . implode(', ', $candidates)); + } + /** @param string[] $args */ private function run(array $args, string $stdin): string { + if (($args[0] ?? '') !== '' && str_contains($args[0], '/') && !is_executable($args[0])) { + throw new RuntimeException('DirectAdmin API command is not executable: ' . $args[0]); + } $process = proc_open($args, [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $pipes); if (!is_resource($process)) { throw new RuntimeException('Cannot start DirectAdmin API command'); diff --git a/plugin.conf b/plugin.conf index 769a382..d98456b 100644 --- a/plugin.conf +++ b/plugin.conf @@ -2,7 +2,7 @@ name=global-autoresponder id=global-autoresponder type=user author=HITME.PL -version=1.0.11 +version=1.1.1 active=no installed=no user_run_as=root diff --git a/tests/directadmin_vacation_api_test.php b/tests/directadmin_vacation_api_test.php index 1671c1a..6ec980d 100644 --- a/tests/directadmin_vacation_api_test.php +++ b/tests/directadmin_vacation_api_test.php @@ -3,6 +3,11 @@ declare(strict_types=1); require_once PLUGIN_ROOT . '/exec/lib/DirectAdminVacationApi.php'; +test('directadmin vacation api default binary follows documented directadmin path', function (): void { + $api = new DirectAdminVacationApi(); + assert_same('/usr/local/directadmin/directadmin', $api->directAdminBinary()); +}); + test('directadmin vacation api builds scoped payload for one mailbox', function (): void { $api = new DirectAdminVacationApi('/usr/local/directadmin/directadmin'); $payload = $api->buildSavePayload('info@example.com', [