Implement IMAP email-to-ticket gateway

This commit is contained in:
macktic committed 2026-10-10 16:22:56 +01:00
1 parent b7e5884457
commit 6f25869345
33 files changed
+5619 -5

No files matched your search

+44
View File
@@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace Box\Mod\Mailgateway;
class RuntimeConfig
{
public static function get(string $key): mixed
{
static $settings = null;
$settings ??= self::load(__DIR__ . '/config.php');
return $settings[$key] ?? throw new \RuntimeException('Unknown Mail Gateway operational setting: ' . $key);
}
public static function load(string $path): array
{
$settings = require $path;
if (!is_array($settings)) {
throw new \RuntimeException('Mail Gateway config.php must return an array');
}
foreach (['poll_interval_seconds', 'messages_per_mailbox', 'poll_budget_seconds',
'imap_timeout_seconds', 'max_message_bytes', 'max_ticket_body_bytes',
'notification_cooldown_seconds', 'composer_timeout_seconds'] as $key) {
if (!isset($settings[$key]) || !is_int($settings[$key]) || $settings[$key] < 1) {
throw new \RuntimeException('Mail Gateway config.php requires a positive integer for ' . $key);
}
}
if ($settings['max_ticket_body_bytes'] > 65535) {
throw new \RuntimeException('Mail Gateway ticket body limit cannot exceed 65535 bytes');
}
foreach (['php_cli_paths', 'composer_paths'] as $key) {
if (!isset($settings[$key]) || !is_array($settings[$key]) || $settings[$key] === []) {
throw new \RuntimeException('Mail Gateway config.php requires executable paths for ' . $key);
}
foreach ($settings[$key] as $value) {
if (!is_string($value) || !str_starts_with($value, '/') || str_contains($value, "\0")) {
throw new \RuntimeException('Mail Gateway executable paths must be absolute paths');
}
}
}
return $settings;
}
}