Remove hardcoded secrets; source credentials from configuration
The Telegram bot token was a const in AddChannels(), and the Mistral API key was baked into the embedded Provider.Mistral.toml resource. - Wire AddChannels() through the existing (previously unused) AddTelegramOptions(), which binds "Channels:Telegram" and validates on start. TelegramOptions is resolved from IOptions<> so TelegramAdapter and TelegramChannel are unchanged. - Ship the embedded provider defaults with an empty ApiKey. Ollama's placeholder is now a non-secret literal. - Re-apply AddEnvironmentVariables() last in AddLunaConfiguration() so env vars override the TOML sources; without this the embedded defaults would shadow injected credentials. Credentials are now supplied via Providers__Mistral__ApiKey and Channels__Telegram__BotToken, or via ~/.luna/providers/*.toml overrides. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,25 +1,27 @@
|
|||||||
using Luna.Channels.Abstractions;
|
using Luna.Channels.Abstractions;
|
||||||
using Luna.Channels.Telegram;
|
using Luna.Channels.Telegram;
|
||||||
using Luna.Configuration;
|
using Luna.Configuration;
|
||||||
|
using Luna.Configuration.Extensions;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
using Telegram.Bot;
|
using Telegram.Bot;
|
||||||
|
|
||||||
namespace Luna.Channels.Extensions;
|
namespace Luna.Channels.Extensions;
|
||||||
|
|
||||||
public static class ServiceCollectionExtensions
|
public static class ServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
private const string TelegramBotToken = "REDACTED-TELEGRAM-BOT-TOKEN";
|
|
||||||
|
|
||||||
extension(IServiceCollection services)
|
extension(IServiceCollection services)
|
||||||
{
|
{
|
||||||
public IServiceCollection AddChannels()
|
public IServiceCollection AddChannels()
|
||||||
{
|
{
|
||||||
services.AddSingleton<IChannelManager, ChannelManager>();
|
services.AddSingleton<IChannelManager, ChannelManager>();
|
||||||
|
|
||||||
// Telegram
|
// Telegram — BotToken is bound from configuration ("Channels:Telegram"),
|
||||||
var telegramOptions = new TelegramOptions { BotToken = TelegramBotToken };
|
// supplied via the Channels__Telegram__BotToken environment variable.
|
||||||
services.AddSingleton(telegramOptions);
|
services.AddTelegramOptions();
|
||||||
services.AddSingleton<ITelegramBotClient>(_ => new TelegramBotClient(TelegramBotToken));
|
services.AddSingleton(provider => provider.GetRequiredService<IOptions<TelegramOptions>>().Value);
|
||||||
|
services.AddSingleton<ITelegramBotClient>(provider =>
|
||||||
|
new TelegramBotClient(provider.GetRequiredService<TelegramOptions>().BotToken));
|
||||||
services.AddHostedService<TelegramAdapter>();
|
services.AddHostedService<TelegramAdapter>();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
|
|||||||
@@ -34,6 +34,11 @@ public static class ConfigurationBuilderExtensions
|
|||||||
builder.Add(new ProviderOptionsConfigurationSource(searchPath));
|
builder.Add(new ProviderOptionsConfigurationSource(searchPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-applied last so environment variables take precedence over the TOML
|
||||||
|
// sources above. This is how secrets (API keys, bot tokens) are supplied —
|
||||||
|
// the embedded defaults ship with empty credentials.
|
||||||
|
builder.AddEnvironmentVariables();
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.5" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.5" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.5" />
|
||||||
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="10.0.5" />
|
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="10.0.5" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.5" />
|
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.5" />
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
ApiKey = "REDACTED-MISTRAL-API-KEY"
|
ApiKey = ""
|
||||||
ApiUrl = "https://api.mistral.ai/v1/"
|
ApiUrl = "https://api.mistral.ai/v1/"
|
||||||
Models = ["mistral-small-latest"]
|
Models = ["mistral-small-latest"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
ApiKey = "apfelkuchen"
|
ApiKey = "ollama"
|
||||||
ApiUrl = "http://localhost:11434/"
|
ApiUrl = "http://localhost:11434/"
|
||||||
Models = ["mistral-nemo:12b"]
|
Models = ["mistral-nemo:12b"]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user