using VoidCat.Services.Strike;
namespace VoidCat.Model
{
///
/// System settings
///
public class VoidSettings
{
///
/// Maintenance flag
///
public bool MaintenanceMode { get; init; } = false;
///
/// Base site url, used for redirect urls
///
public Uri SiteUrl { get; init; }
///
/// Data directory to store files in
///
public string DataDirectory { get; init; } = "./data";
///
/// Size in bytes to split uploads into chunks
///
public ulong? UploadSegmentSize { get; init; }
///
/// Max file size for upload
///
public ulong? MaxFileSize { get; init; }
///
/// Tor configuration
///
public TorSettings? TorSettings { get; init; }
///
/// JWT settings for login token signing
///
public JwtSettings JwtSettings { get; init; } = new()
{
Issuer = "void_cat_internal",
Key = "default_key_void_cat_host"
};
///
/// Redis database connection string
///
public string? Redis { get; init; }
///
/// Strike payment service api settings
///
public StrikeApiSettings? Strike { get; init; }
///
/// Email server settings
///
public SmtpSettings? Smtp { get; init; }
///
/// CORS origins
///
public List CorsOrigins { get; init; } = new();
///
/// Cloud file storage settings
///
public CloudStorageSettings? CloudStorage { get; init; }
///
/// Virus scanner settings
///
public VirusScannerSettings? VirusScanner { get; init; }
///
/// Request header to unmask in the logs, otherwise all are masked
///
public IEnumerable? RequestHeadersLog { get; init; }
///
/// hCaptcha settings
///
public CaptchaSettings? CaptchaSettings { get; init; }
///
/// Postgres database connection string
///
public string? Postgres { get; init; }
///
/// Prometheus server for querying metrics
///
public PrometheusSettings? Prometheus { get; init; }
///
/// Select where to store metadata, if not set "local-disk" will be used
///
public string MetadataStore { get; init; } = "local-disk";
///
/// Select which store to use for files storage, if not set "local-disk" will be used
///
public string DefaultFileStore { get; init; } = "local-disk";
///
/// Plausible Analytics endpoint url
///
public PlausibleSettings? PlausibleAnalytics { get; init; }
///
/// Discord application settings
///
public OAuthDetails? Discord { get; init; }
///
/// Google application settings
///
public OAuthDetails? Google { get; init; }
///
/// A list of trackers to attach to torrent files
///
public List TorrentTrackers { get; init; } = new()
{
"wss://tracker.btorrent.xyz",
"wss://tracker.openwebtorrent.com",
"udp://tracker.opentrackr.org:1337/announce",
"udp://tracker.openbittorrent.com:6969/announce",
"http://tracker.openbittorrent.com:80/announce"
};
///
/// Lightning node configuration for LNProxy services
///
public LndConfig? LndConfig { get; init; }
///
/// Blocked origin hostnames
///
public List BlockedOrigins { get; init; } = new();
}
public sealed class TorSettings
{
public Uri TorControl { get; init; }
public string PrivateKey { get; init; }
public string ControlPassword { get; init; }
}
public sealed class JwtSettings
{
public string Issuer { get; init; }
public string Key { get; init; }
}
public sealed class SmtpSettings
{
public Uri? Server { get; init; }
public string? Username { get; init; }
public string? Password { get; init; }
}
public sealed class CloudStorageSettings
{
public S3BlobConfig[]? S3 { get; init; }
}
public sealed class S3BlobConfig
{
public string Name { get; init; } = null!;
public string? AccessKey { get; init; }
public string? SecretKey { get; init; }
public Uri? ServiceUrl { get; init; }
public string? Region { get; init; }
public string? BucketName { get; init; } = "void-cat";
public bool Direct { get; init; }
public bool SendChecksum { get; init; } = true;
public bool DisablePayloadSigning { get; init; }
}
public sealed class VirusScannerSettings
{
public ClamAVSettings? ClamAV { get; init; }
public VirusTotalConfig? VirusTotal { get; init; }
}
public sealed class ClamAVSettings
{
public Uri? Endpoint { get; init; }
public long? MaxStreamSize { get; init; }
}
public sealed class VirusTotalConfig
{
public string? ApiKey { get; init; }
}
public sealed class CaptchaSettings
{
public string? SiteKey { get; init; }
public string? Secret { get; init; }
}
public sealed class PrometheusSettings
{
public Uri? Url { get; init; }
public string? EgressQuery { get; init; }
}
public sealed class PlausibleSettings
{
public Uri? Endpoint { get; init; }
public string? Domain { get; init; }
}
public sealed class OAuthDetails
{
public string? ClientId { get; init; }
public string? ClientSecret { get; init; }
}
public sealed class LndConfig
{
public string Network { get; init; } = "regtest";
public Uri Endpoint { get; init; }
public string CertPath { get; init; } = null!;
public string MacaroonPath { get; init; } = null!;
}
}