Forge
csharpdeeb25a2
1using CascadeIDE.Features.Forge.Models;
2using CascadeIDE.Services;
3
4namespace CascadeIDE.Features.Forge.Infrastructure;
5
6/// <summary>Forge Lens Bearer tokens (не коммитить). ADR 0158 §3.</summary>
7public static class ForgeLensSecretsStorage
8{
9 private static string GetPath() =>
10 Path.Combine(SettingsService.GetSettingsDirectory(), "forge-lens-secrets.toml");
11
12 public static ForgeLensSecrets Load()
13 {
14 try
15 {
16 var path = GetPath();
17 if (!File.Exists(path))
18 return new ForgeLensSecrets();
19 var toml = File.ReadAllText(path);
20 return CascadeTomlSerializer.Deserialize<ForgeLensSecrets>(toml) ?? new ForgeLensSecrets();
21 }
22 catch
23 {
24 return new ForgeLensSecrets();
25 }
26 }
27
28 public static void Save(ForgeLensSecrets secrets)
29 {
30 try
31 {
32 var toml = CascadeTomlSerializer.Serialize(secrets);
33 File.WriteAllText(GetPath(), toml);
34 }
35 catch
36 {
37 // best-effort
38 }
39 }
40
41 public static void SetToken(string baseUrl, string apiToken, string? tokenName = null)
42 {
43 var key = ForgeLensHostUrl.NormalizeKey(baseUrl);
44 var secrets = Load();
45 secrets.Hosts[key] = new ForgeLensHostSecrets
46 {
47 ApiToken = apiToken.Trim(),
48 TokenName = tokenName?.Trim() ?? "",
49 SavedAtUtc = DateTimeOffset.UtcNow.ToString("O"),
50 };
51 Save(secrets);
52 }
53
54 public static bool RemoveHost(string baseUrl)
55 {
56 var key = ForgeLensHostUrl.NormalizeKey(baseUrl);
57 var secrets = Load();
58 if (!secrets.Hosts.Remove(key))
59 return false;
60 Save(secrets);
61 return true;
62 }
63
64 public static string? TryGetToken(string baseUrl)
65 {
66 var key = ForgeLensHostUrl.NormalizeKey(baseUrl);
67 var secrets = Load();
68 return secrets.Hosts.TryGetValue(key, out var entry) && entry.HasApiToken
69 ? entry.ApiToken
70 : null;
71 }
72}
73
View only · write via MCP/CIDE