Files
global-autoresponder/exec/lib/DirectAdminUser.php
T
2026-07-04 15:16:50 +02:00

124 lines
3.7 KiB
PHP

<?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 = self::normalizeSkin($skin);
$this->language = $language !== '' ? strtolower($language) : 'en';
$this->configDir = $configDir;
}
public static function fromEnvironment(Settings $settings): self
{
$username = self::environmentValue(['USERNAME', 'DA_USER', 'USER']);
if ($username === '') {
throw new RuntimeException('Cannot determine DirectAdmin user');
}
$userConf = self::readUserConf($username);
$skin = self::environmentValue(['SKIN', 'SESSION_SKIN', 'SESSION_SELECTED_SKIN', 'DA_SKIN', 'USER_SKIN', 'THEME']);
if ($skin === '') {
$skin = (string)($userConf['skin'] ?? 'enhanced');
}
$lang = self::languageFromUserConf($userConf) ?: $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 normalizeSkin(string $skin): string
{
$normalizedSkin = strtolower(trim($skin));
if ($normalizedSkin === '') {
return 'enhanced';
}
if (str_contains($normalizedSkin, 'evolution')) {
return 'evolution';
}
return $normalizedSkin;
}
/**
* @param list<string> $keys
*/
private static function environmentValue(array $keys): string
{
foreach ($keys as $key) {
$value = getenv($key);
if ($value !== false && trim((string)$value) !== '') {
return trim((string)$value);
}
if (isset($_SERVER[$key]) && trim((string)$_SERVER[$key]) !== '') {
return trim((string)$_SERVER[$key]);
}
}
return '';
}
/**
* @return array<string,string>
*/
private static function readUserConf(string $username): array
{
$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 [];
}
$data = [];
foreach ($lines as $line) {
$line = trim($line);
if ($line === '' || str_starts_with($line, '#') || !str_contains($line, '=')) {
continue;
}
[$key, $value] = explode('=', $line, 2);
$data[trim($key)] = trim($value);
}
return $data;
}
/**
* @param array<string,string> $userConf
*/
private static function languageFromUserConf(array $userConf): string
{
return strtolower(trim((string)($userConf['language'] ?? $userConf['lang'] ?? '')));
}
}