feat: implement global autoresponder plugin

This commit is contained in:
Marek Miklewicz
2026-06-02 19:19:00 +02:00
commit 6f989af278
62 changed files with 2018 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
<?php
declare(strict_types=1);
final class DirectAdminUser
{
private string $username;
private string $skin;
private string $language;
private string $configDir;
public function __construct(string $username, string $skin = 'enhanced', string $language = 'en', string $configDir = Settings::CONFIG_DIR)
{
if (!preg_match('/^[A-Za-z0-9._-]+$/', $username)) {
throw new InvalidArgumentException('Invalid username');
}
$this->username = $username;
$this->skin = $skin !== '' ? $skin : 'enhanced';
$this->language = $language !== '' ? strtolower($language) : 'en';
$this->configDir = $configDir;
}
public static function fromEnvironment(Settings $settings): self
{
$username = getenv('USERNAME') ?: getenv('USER') ?: getenv('DA_USER') ?: '';
if ($username === '' && isset($_SERVER['USERNAME'])) {
$username = (string)$_SERVER['USERNAME'];
}
if ($username === '') {
throw new RuntimeException('Cannot determine DirectAdmin user');
}
$skin = getenv('SKIN') ?: (string)($_SERVER['SKIN'] ?? 'enhanced');
$lang = self::readLanguage($username) ?: $settings->defaultLanguage();
return new self($username, $skin, $lang);
}
public function username(): string
{
return $this->username;
}
public function skin(): string
{
return $this->skin;
}
public function language(): string
{
return $this->language;
}
public function hasPluginAccess(Settings $settings): bool
{
$override = $this->configDir . '/users/' . $this->username . '.conf';
if (is_file($override)) {
$data = Settings::load($override);
return $data->getBool('enabled', $settings->defaultEnable());
}
return $settings->defaultEnable();
}
private static function readLanguage(string $username): string
{
$path = '/usr/local/directadmin/data/users/' . $username . '/user.conf';
if (!is_file($path)) {
return '';
}
$lines = file($path, FILE_IGNORE_NEW_LINES);
if ($lines === false) {
return '';
}
foreach ($lines as $line) {
if (str_starts_with($line, 'language=')) {
return strtolower(trim(substr($line, 9)));
}
}
return '';
}
}