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 $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 */ 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 $userConf */ private static function languageFromUserConf(array $userConf): string { return strtolower(trim((string)($userConf['language'] ?? $userConf['lang'] ?? ''))); } }