Skip to content

Commit ec0682e

Browse files
Implement per instance credential delete, dns zone lookup
1 parent fc0bb0d commit ec0682e

File tree

12 files changed

+137
-75
lines changed

12 files changed

+137
-75
lines changed

src/Certify.Core/Management/CertifyManager/CertifyManager.Account.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
@@ -417,7 +417,7 @@ public async Task<ActionResult> RemoveAccount(string storageKey, bool includeAcc
417417
{
418418
_serviceLog?.Information($"Deleting account {storageKey}: " + account.AccountURI);
419419

420-
var resultOk = await _credentialsManager.Delete(_itemManager, storageKey);
420+
var result = await _credentialsManager.Delete(_itemManager, storageKey);
421421

422422
// invalidate accounts cache
423423
lock (_accountsLock)
@@ -426,7 +426,7 @@ public async Task<ActionResult> RemoveAccount(string storageKey, bool includeAcc
426426
}
427427

428428
// attempt acme account deactivation
429-
if (resultOk && includeAccountDeactivation && acmeProvider != null)
429+
if (result.IsSuccess && includeAccountDeactivation && acmeProvider != null)
430430
{
431431
try
432432
{
@@ -443,7 +443,7 @@ public async Task<ActionResult> RemoveAccount(string storageKey, bool includeAcc
443443
}
444444
}
445445

446-
return new ActionResult("RemoveAccount", resultOk);
446+
return new ActionResult("RemoveAccount", result.IsSuccess);
447447
}
448448
else
449449
{

src/Certify.Core/Management/CertifyManager/CertifyManager.ManagementHub.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,16 @@ private async Task<InstanceCommandResult> _managementServerClient_OnGetCommandRe
191191
{
192192
var args = JsonSerializer.Deserialize<KeyValuePair<string, string>[]>(arg.Value);
193193
var itemArg = args.FirstOrDefault(a => a.Key == "storageKey");
194-
var storedCredential = JsonSerializer.Deserialize<StoredCredential>(itemArg.Value);
195194
val = await _credentialsManager.Delete(_itemManager, itemArg.Value);
196195
}
196+
else if (arg.CommandType == ManagementHubCommands.GetDnsZones)
197+
{
198+
var args = JsonSerializer.Deserialize<KeyValuePair<string, string>[]>(arg.Value);
199+
var providerTypeArg = args.FirstOrDefault(a => a.Key == "providerTypeId");
200+
var credentialsIdArg = args.FirstOrDefault(a => a.Key == "credentialsId");
201+
202+
val = await GetDnsProviderZones(providerTypeArg.Value, credentialsIdArg.Value);
203+
}
197204
else if (arg.CommandType == ManagementHubCommands.Reconnect)
198205
{
199206
await _managementServerClient.Disconnect();

src/Certify.Models/API/Management/ManagementHubMessages.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class ManagementHubCommands
3131
public const string UpdateStoredCredential = "UpdateStoredCredential";
3232
public const string DeleteStoredCredential = "DeleteStoredCredential";
3333

34+
public const string GetDnsZones = "GetDnsZones";
35+
3436
public const string Reconnect = "Reconnect";
3537
}
3638

src/Certify.Models/Providers/ICredentialsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public interface ICredentialsManager
1212
bool Init(string connectionString, ILog log);
1313
Task<bool> IsInitialised();
1414

15-
Task<bool> Delete(IManagedItemStore itemStore, string storageKey);
15+
Task<ActionResult> Delete(IManagedItemStore itemStore, string storageKey);
1616
Task<List<StoredCredential>> GetCredentials(string type = null, string storageKey = null);
1717
Task<StoredCredential> GetCredential(string storageKey);
1818
Task<string> GetUnlockedCredential(string storageKey);

src/Certify.Server/Certify.Server.Api.Public.Client/Certify.API.Public.cs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,23 +2771,32 @@ public virtual async System.Threading.Tasks.Task<ActionResult> RemoveAcmeAccount
27712771
}
27722772

27732773
/// <summary>
2774-
/// Fetch list of DNS zones for a given DNS provider and credential
2774+
/// Get List of Zones with the current DNS provider and credential [Generated by Certify.SourceGenerators]
27752775
/// </summary>
27762776
/// <returns>OK</returns>
27772777
/// <exception cref="ApiException">A server side error occurred.</exception>
2778-
public virtual System.Threading.Tasks.Task<System.Collections.Generic.ICollection<DnsZone>> GetDnsZonesAsync(string providerTypeId, string credentialsId)
2778+
public virtual System.Threading.Tasks.Task<System.Collections.Generic.ICollection<DnsZone>> GetDnsZonesAsync(string instanceId, string providerTypeId, string credentialsId)
27792779
{
2780-
return GetDnsZonesAsync(providerTypeId, credentialsId, System.Threading.CancellationToken.None);
2780+
return GetDnsZonesAsync(instanceId, providerTypeId, credentialsId, System.Threading.CancellationToken.None);
27812781
}
27822782

27832783
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
27842784
/// <summary>
2785-
/// Fetch list of DNS zones for a given DNS provider and credential
2785+
/// Get List of Zones with the current DNS provider and credential [Generated by Certify.SourceGenerators]
27862786
/// </summary>
27872787
/// <returns>OK</returns>
27882788
/// <exception cref="ApiException">A server side error occurred.</exception>
2789-
public virtual async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<DnsZone>> GetDnsZonesAsync(string providerTypeId, string credentialsId, System.Threading.CancellationToken cancellationToken)
2789+
public virtual async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<DnsZone>> GetDnsZonesAsync(string instanceId, string providerTypeId, string credentialsId, System.Threading.CancellationToken cancellationToken)
27902790
{
2791+
if (instanceId == null)
2792+
throw new System.ArgumentNullException("instanceId");
2793+
2794+
if (providerTypeId == null)
2795+
throw new System.ArgumentNullException("providerTypeId");
2796+
2797+
if (credentialsId == null)
2798+
throw new System.ArgumentNullException("credentialsId");
2799+
27912800
var client_ = _httpClient;
27922801
var disposeClient_ = false;
27932802
try
@@ -2799,18 +2808,13 @@ public virtual async System.Threading.Tasks.Task<ActionResult> RemoveAcmeAccount
27992808

28002809
var urlBuilder_ = new System.Text.StringBuilder();
28012810
if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl);
2802-
// Operation Path: "internal/v1/challengeprovider/dnszones"
2803-
urlBuilder_.Append("internal/v1/challengeprovider/dnszones");
2804-
urlBuilder_.Append('?');
2805-
if (providerTypeId != null)
2806-
{
2807-
urlBuilder_.Append(System.Uri.EscapeDataString("providerTypeId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(providerTypeId, System.Globalization.CultureInfo.InvariantCulture))).Append('&');
2808-
}
2809-
if (credentialsId != null)
2810-
{
2811-
urlBuilder_.Append(System.Uri.EscapeDataString("credentialsId")).Append('=').Append(System.Uri.EscapeDataString(ConvertToString(credentialsId, System.Globalization.CultureInfo.InvariantCulture))).Append('&');
2812-
}
2813-
urlBuilder_.Length--;
2811+
// Operation Path: "internal/v1/challengeprovider/challengeprovider/dnszones/{instanceId}/{providerTypeId}/{credentialsId}"
2812+
urlBuilder_.Append("internal/v1/challengeprovider/challengeprovider/dnszones/");
2813+
urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(instanceId, System.Globalization.CultureInfo.InvariantCulture)));
2814+
urlBuilder_.Append('/');
2815+
urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(providerTypeId, System.Globalization.CultureInfo.InvariantCulture)));
2816+
urlBuilder_.Append('/');
2817+
urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(credentialsId, System.Globalization.CultureInfo.InvariantCulture)));
28142818

28152819
PrepareRequest(client_, request_, urlBuilder_);
28162820

src/Certify.Server/Certify.Server.Api.Public/Controllers/internal/ChallengeProviderController.cs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Certify.Client;
22
using Certify.Models.Providers;
3+
using Certify.Server.Api.Public.Services;
34
using Microsoft.AspNetCore.Authentication.JwtBearer;
45
using Microsoft.AspNetCore.Authorization;
56
using Microsoft.AspNetCore.Mvc;
@@ -17,16 +18,17 @@ public partial class ChallengeProviderController : ApiControllerBase
1718
private readonly ILogger<ChallengeProviderController> _logger;
1819

1920
private readonly ICertifyInternalApiClient _client;
20-
21+
private readonly ManagementAPI _mgmtAPI;
2122
/// <summary>
2223
/// Constructor
2324
/// </summary>
2425
/// <param name="logger"></param>
2526
/// <param name="client"></param>
26-
public ChallengeProviderController(ILogger<ChallengeProviderController> logger, ICertifyInternalApiClient client)
27+
public ChallengeProviderController(ILogger<ChallengeProviderController> logger, ICertifyInternalApiClient client, ManagementAPI mgmtAPI)
2728
{
2829
_logger = logger;
2930
_client = client;
31+
_mgmtAPI = mgmtAPI;
3032
}
3133

3234
/// <summary>
@@ -42,20 +44,5 @@ public async Task<IActionResult> GetChallengeProviders()
4244
var list = await _client.GetChallengeAPIList();
4345
return new OkObjectResult(list);
4446
}
45-
46-
/// <summary>
47-
/// Fetch list of DNS zones for a given DNS provider and credential
48-
/// </summary>
49-
/// <param name="providerTypeId"></param>
50-
/// <param name="credentialsId"></param>
51-
/// <returns></returns>
52-
[HttpGet]
53-
[Route("dnszones")]
54-
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
55-
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<DnsZone>))]
56-
public async Task<List<DnsZone>> GetDnsZones(string providerTypeId, string credentialsId)
57-
{
58-
return await _client.GetDnsProviderZones(providerTypeId, credentialsId);
59-
}
6047
}
6148
}

src/Certify.Server/Certify.Server.Api.Public/Controllers/internal/HubController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public async Task<IActionResult> GetHubManagedItems(string? instanceId, string?
7070
InstanceId = remote.InstanceId,
7171
InstanceTitle = instances.FirstOrDefault(i => i.InstanceId == remote.InstanceId)?.Title,
7272
Id = i.Id ?? "",
73-
Title = $"[remote] {i.Name}" ?? "",
73+
Title = $"{i.Name}" ?? "",
7474
PrimaryIdentifier = i.GetCertificateIdentifiers().FirstOrDefault(p => p.Value == i.RequestConfig.PrimaryDomain) ?? i.GetCertificateIdentifiers().FirstOrDefault(),
7575
Identifiers = i.GetCertificateIdentifiers(),
7676
DateRenewed = i.DateRenewed,

src/Certify.Server/Certify.Server.Api.Public/Services/ManagementAPI.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,28 @@ public async Task<StatusSummary> GetManagedCertificateSummary(AuthContext? curre
221221
}
222222
}
223223

224+
public async Task<ICollection<Models.Providers.DnsZone>?> GetDnsZones(string instanceId, string providerTypeId, string credentialsId, AuthContext? currentAuthContext)
225+
{
226+
var args = new KeyValuePair<string, string>[] {
227+
new("instanceId", instanceId),
228+
new("providerTypeId", providerTypeId),
229+
new("credentialsId", credentialsId)
230+
};
231+
232+
var cmd = new InstanceCommandRequest(ManagementHubCommands.GetDnsZones, args);
233+
234+
var result = await GetCommandResult(instanceId, cmd);
235+
236+
if (result?.Value != null)
237+
{
238+
return JsonSerializer.Deserialize<ICollection<Models.Providers.DnsZone>>(result.Value);
239+
}
240+
else
241+
{
242+
return null;
243+
}
244+
}
245+
224246
public async Task<ICollection<Models.Config.StoredCredential>?> GetStoredCredentials(string instanceId, AuthContext? currentAuthContext)
225247
{
226248
var args = new KeyValuePair<string, string>[] {
@@ -262,7 +284,7 @@ public async Task<StatusSummary> GetManagedCertificateSummary(AuthContext? curre
262284
}
263285
}
264286

265-
public async Task<bool> DeleteStoredCredential(string instanceId, string storageKey, AuthContext authContext)
287+
public async Task<ActionResult?> DeleteStoredCredential(string instanceId, string storageKey, AuthContext authContext)
266288
{
267289
// delete stored credential via management hub
268290

@@ -275,7 +297,14 @@ public async Task<bool> DeleteStoredCredential(string instanceId, string storage
275297

276298
var result = await GetCommandResult(instanceId, cmd);
277299

278-
return result?.ObjectValue as bool? ?? false;
300+
if (result?.Value != null)
301+
{
302+
return JsonSerializer.Deserialize<ActionResult>(result.Value);
303+
}
304+
else
305+
{
306+
return null;
307+
}
279308
}
280309

281310
public async Task<LogItem[]> GetItemLog(string instanceId, string managedCertId, int maxLines, AuthContext? currentAuthContext)

src/Certify.Server/Certify.Server.Core/Certify.Server.Core/Controllers/CredentialsController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Certify.Management;
1+
using Certify.Management;
22
using Certify.Models.Config;
33
using Microsoft.AspNetCore.Mvc;
44

@@ -33,7 +33,7 @@ public async Task<StoredCredential> UpdateCredentials(StoredCredential credentia
3333
}
3434

3535
[HttpDelete, Route("{storageKey}")]
36-
public async Task<bool> DeleteCredential(string storageKey)
36+
public async Task<Models.Config.ActionResult> DeleteCredential(string storageKey)
3737
{
3838
DebugLog();
3939

src/Certify.Service/Controllers/CredentialsController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Collections.Generic;
1+
using System.Collections.Generic;
22
using System.Threading.Tasks;
33
using System.Web.Http;
44
using Certify.Management;
@@ -34,7 +34,7 @@ public async Task<StoredCredential> UpdateCredentials(StoredCredential credentia
3434
}
3535

3636
[HttpDelete, Route("{storageKey}")]
37-
public async Task<bool> DeleteCredential(string storageKey)
37+
public async Task<Models.Config.ActionResult> DeleteCredential(string storageKey)
3838
{
3939
DebugLog();
4040

src/Certify.SourceGenerators/ApiMethods.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,31 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Net.Http;
5+
26
using SourceGenerator;
37

48
namespace Certify.SourceGenerators
59
{
610
internal class ApiMethods
711
{
12+
public static string HttpGet = "HttpGet";
13+
public static string HttpPost = "HttpPost";
14+
public static string HttpDelete = "HttpDelete";
15+
16+
public static string GetFormattedTypeName(Type type)
17+
{
18+
if (type.IsGenericType)
19+
{
20+
var genericArguments = type.GetGenericArguments()
21+
.Select(x => x.FullName)
22+
.Aggregate((x1, x2) => $"{x1}, {x2}");
23+
return $"{type.FullName.Substring(0, type.FullName.IndexOf("`"))}"
24+
+ $"<{genericArguments}>";
25+
}
26+
27+
return type.FullName;
28+
}
829
public static List<GeneratedAPI> GetApiDefinitions()
930
{
1031
// declaring an API definition here is then used by the source generators to:
@@ -189,7 +210,7 @@ public static List<GeneratedAPI> GetApiDefinitions()
189210
PublicAPIRoute = "credentials/{instanceId}",
190211
ServiceAPIRoute = "credentials",
191212
ReturnType = "ICollection<Models.Config.StoredCredential>",
192-
UseManagementAPI = true,
213+
UseManagementAPI = true,
193214
Params =new Dictionary<string, string>{ { "instanceId", "string" } }
194215
},
195216
new GeneratedAPI {
@@ -213,6 +234,21 @@ public static List<GeneratedAPI> GetApiDefinitions()
213234
ReturnType = "Models.Config.ActionResult",
214235
UseManagementAPI = true,
215236
Params =new Dictionary<string, string>{ { "instanceId", "string" },{ "storageKey", "string" } }
237+
},
238+
new GeneratedAPI {
239+
OperationName = "GetDnsZones",
240+
OperationMethod = HttpGet,
241+
Comment = "Get List of Zones with the current DNS provider and credential",
242+
PublicAPIController = "ChallengeProvider",
243+
PublicAPIRoute = "challengeprovider/dnszones/{instanceId}/{providerTypeId}/{credentialsId}",
244+
ServiceAPIRoute = "managedcertificates/dnszones/{providerTypeId}/{credentialsId}",
245+
ReturnType = "ICollection<Certify.Models.Providers.DnsZone>",
246+
UseManagementAPI = true,
247+
Params =new Dictionary<string, string>{
248+
{ "instanceId", "string" } ,
249+
{ "providerTypeId", "string" },
250+
{ "credentialsId", "string" }
251+
}
216252
},
217253
new GeneratedAPI {
218254
OperationName = "PerformExport",

0 commit comments

Comments
 (0)