/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Infrastructure/Configuration/EnvLoader.cs
117 строк
3 KB
IBS\NAfanasev
Add project files.
01 июл 2026, 14:54
01 июл 2026, 14:54
8414644
Код
Авторство
О чём код?
using System.Text; namespace PdfEncoder.Infrastructure.Configuration; /// <summary> /// Загрузчик переменных окружения из .env файла в корне репозитория. /// </summary> public static class EnvLoader { private static readonly HashSet<string> SensitiveKeySuffixes = [ "ApiKey", "Password", "Secret" ]; /// <summary> /// Загружает переменные из .env в <see cref="Environment"/> без перезаписи уже заданных значений. /// </summary> /// <param name="envFilePath">Путь к .env; если null — поиск от текущей директории вверх.</param> /// <returns>True, если файл найден и прочитан.</returns> public static bool Load(string? envFilePath = null) { var path = envFilePath ?? FindEnvFilePath(); if (path is null || !File.Exists(path)) { return false; } foreach (var rawLine in File.ReadAllLines(path, Encoding.UTF8)) { var line = rawLine.Trim(); if (line.Length == 0 || line.StartsWith('#')) { continue; } var separatorIndex = line.IndexOf('='); if (separatorIndex <= 0) { continue; } var key = line[..separatorIndex].Trim(); var value = Unquote(line[(separatorIndex + 1)..].Trim()); if (string.IsNullOrWhiteSpace(key)) { continue; } if (Environment.GetEnvironmentVariable(key) is not null) { continue; } Environment.SetEnvironmentVariable(key, value); } return true; } /// <summary> /// Ищет .env рядом с корнем репозитория (global.json или PdfEncoder.slnx). /// </summary> public static string? FindEnvFilePath() { var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); while (directory is not null) { var envPath = Path.Combine(directory.FullName, ".env"); if (File.Exists(envPath)) { return envPath; } if (File.Exists(Path.Combine(directory.FullName, "global.json")) || File.Exists(Path.Combine(directory.FullName, "PdfEncoder.slnx"))) { return File.Exists(envPath) ? envPath : Path.Combine(directory.FullName, ".env"); } directory = directory.Parent; } return null; } /// <summary> /// Проверяет, является ли ключ секретным (для фильтрации логов). /// </summary> public static bool IsSensitiveKey(string key) { foreach (var suffix in SensitiveKeySuffixes) { if (key.EndsWith(suffix, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } private static string Unquote(string value) { if (value.Length >= 2 && ((value.StartsWith('"') && value.EndsWith('"')) || (value.StartsWith('\'') && value.EndsWith('\'')))) { return value[1..^1]; } return value; } }