Skip to content

Commit f5144dc

Browse files
Incremental sync support added using csc date filter so sync timing can run faster that default full sync periods
1 parent a8186c2 commit f5144dc

File tree

4 files changed

+82
-45
lines changed

4 files changed

+82
-45
lines changed

cscglobal-caplugin/CSCGlobalCAPlugin.cs

Lines changed: 72 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public CSCGlobalCAPlugin()
3737

3838
public bool EnableTemplateSync { get; set; }
3939

40+
public int SyncFilterDays { get; set; }
41+
4042
//done
4143
public void Initialize(IAnyCAPluginConfigProvider configProvider, ICertificateDataReader certificateDataReader)
4244
{
@@ -45,6 +47,16 @@ public void Initialize(IAnyCAPluginConfigProvider configProvider, ICertificateDa
4547
CscGlobalClient = new CscGlobalClient(configProvider);
4648
var templateSync = configProvider.CAConnectionData["TemplateSync"].ToString();
4749
if (templateSync.ToUpper() == "ON") EnableTemplateSync = true;
50+
51+
if (configProvider.CAConnectionData.ContainsKey(Constants.SyncFilterDays))
52+
{
53+
var syncFilterDaysStr = configProvider.CAConnectionData[Constants.SyncFilterDays]?.ToString();
54+
if (int.TryParse(syncFilterDaysStr, out var syncFilterDays))
55+
{
56+
SyncFilterDays = syncFilterDays;
57+
Logger.LogDebug($"SyncFilterDays configured to {SyncFilterDays} days");
58+
}
59+
}
4860
Logger.MethodExit(LogLevel.Debug);
4961
}
5062

@@ -98,49 +110,19 @@ public async Task Synchronize(BlockingCollection<AnyCAPluginCertificate> blockin
98110
{
99111
if (fullSync)
100112
{
101-
var certs = await CscGlobalClient.SubmitCertificateListRequestAsync();
102-
103-
foreach (var currentResponseItem in certs.Results)
104-
{
105-
cancelToken.ThrowIfCancellationRequested();
106-
Logger.LogTrace($"Took Certificate ID {currentResponseItem?.Uuid} from Queue");
107-
var certStatus = _requestManager.MapReturnStatus(currentResponseItem?.Status);
108-
109-
//Keyfactor sync only seems to work when there is a valid cert and I can only get Active valid certs from Csc Global
110-
if (certStatus == Convert.ToInt32(EndEntityStatus.GENERATED) ||
111-
certStatus == Convert.ToInt32(EndEntityStatus.REVOKED))
112-
{
113-
//One click renewal/reissue won't work for this implementation so there is an option to disable it by not syncing back template
114-
var productId = "CscGlobal";
115-
if (EnableTemplateSync) productId = currentResponseItem?.CertificateType;
116-
117-
var fileContent =
118-
PreparePemTextFromApi(
119-
currentResponseItem?.Certificate ?? string.Empty);
120-
121-
if (fileContent.Length > 0)
122-
{
123-
Logger.LogTrace($"File Content {fileContent}");
124-
var certData = fileContent.Replace("\r\n", string.Empty);
125-
var certString = GetEndEntityCertificate(certData);
126-
//var currentCert = new X509Certificate2(Encoding.ASCII.GetBytes(certString));
127-
if (certString.Length > 0)
128-
blockingBuffer.Add(new AnyCAPluginCertificate
129-
{
130-
CARequestID = $"{currentResponseItem?.Uuid}",
131-
Certificate = certString,
132-
//SubmissionDate = currentResponseItem?.OrderDate == null
133-
//? Convert.ToDateTime(currentCert.NotBefore)
134-
//: Convert.ToDateTime(currentResponseItem.OrderDate),
135-
Status = certStatus,
136-
ProductID = productId
137-
}, cancelToken);
138-
}
139-
}
140-
}
141-
142-
blockingBuffer.CompleteAdding();
113+
Logger.LogDebug("Performing full sync - no date filter applied");
114+
await SyncCertificates(blockingBuffer, cancelToken, null);
115+
}
116+
else
117+
{
118+
var filterDays = SyncFilterDays > 0 ? SyncFilterDays : 5;
119+
var filterDate = DateTime.Today.AddDays(filterDays);
120+
var dateFilter = filterDate.ToString("yyyy/MM/dd");
121+
Logger.LogDebug($"Performing incremental sync with expiration date filter: {dateFilter}");
122+
await SyncCertificates(blockingBuffer, cancelToken, dateFilter);
143123
}
124+
125+
blockingBuffer.CompleteAdding();
144126
}
145127
catch (Exception e)
146128
{
@@ -153,6 +135,47 @@ public async Task Synchronize(BlockingCollection<AnyCAPluginCertificate> blockin
153135
Logger.MethodExit(LogLevel.Debug);
154136
}
155137

138+
private async Task SyncCertificates(BlockingCollection<AnyCAPluginCertificate> blockingBuffer,
139+
CancellationToken cancelToken, string? dateFilter)
140+
{
141+
var certs = await CscGlobalClient.SubmitCertificateListRequestAsync(dateFilter);
142+
143+
foreach (var currentResponseItem in certs.Results)
144+
{
145+
cancelToken.ThrowIfCancellationRequested();
146+
Logger.LogTrace($"Took Certificate ID {currentResponseItem?.Uuid} from Queue");
147+
var certStatus = _requestManager.MapReturnStatus(currentResponseItem?.Status);
148+
149+
//Keyfactor sync only seems to work when there is a valid cert and I can only get Active valid certs from Csc Global
150+
if (certStatus == Convert.ToInt32(EndEntityStatus.GENERATED) ||
151+
certStatus == Convert.ToInt32(EndEntityStatus.REVOKED))
152+
{
153+
//One click renewal/reissue won't work for this implementation so there is an option to disable it by not syncing back template
154+
var productId = "CscGlobal";
155+
if (EnableTemplateSync) productId = currentResponseItem?.CertificateType;
156+
157+
var fileContent =
158+
PreparePemTextFromApi(
159+
currentResponseItem?.Certificate ?? string.Empty);
160+
161+
if (fileContent.Length > 0)
162+
{
163+
Logger.LogTrace($"File Content {fileContent}");
164+
var certData = fileContent.Replace("\r\n", string.Empty);
165+
var certString = GetEndEntityCertificate(certData);
166+
if (certString.Length > 0)
167+
blockingBuffer.Add(new AnyCAPluginCertificate
168+
{
169+
CARequestID = $"{currentResponseItem?.Uuid}",
170+
Certificate = certString,
171+
Status = certStatus,
172+
ProductID = productId
173+
}, cancelToken);
174+
}
175+
}
176+
}
177+
}
178+
156179
//done
157180
public async Task<int> Revoke(string caRequestID, string hexSerialNumber, uint revocationReason)
158181
{
@@ -371,6 +394,13 @@ public Dictionary<string, PropertyConfigInfo> GetCAConnectorAnnotations()
371394
Hidden = false,
372395
DefaultValue = "false",
373396
Type = "Bool"
397+
},
398+
[Constants.SyncFilterDays] = new()
399+
{
400+
Comments = "Number of days from today to filter certificates by expiration date during incremental sync.",
401+
Hidden = false,
402+
DefaultValue = "5",
403+
Type = "Number"
374404
}
375405
};
376406
}

cscglobal-caplugin/Client/CscGlobalClient.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,16 @@ public async Task<RevokeResponse> SubmitRevokeCertificateAsync(string uuId)
166166
}
167167
}
168168

169-
public async Task<CertificateListResponse> SubmitCertificateListRequestAsync()
169+
public async Task<CertificateListResponse> SubmitCertificateListRequestAsync(string? dateFilter = null)
170170
{
171171
Logger.MethodEntry(LogLevel.Debug);
172-
var resp = RestClient.GetAsync("/dbs/api/v2/tls/certificate?filter=status=in=(ACTIVE,REVOKED)").Result;
172+
var filterQuery = "filter=status=in=(ACTIVE,REVOKED)";
173+
if (!string.IsNullOrEmpty(dateFilter))
174+
{
175+
filterQuery += $";expirationDate=ge={dateFilter}";
176+
}
177+
Logger.LogTrace($"Certificate list filter query: {filterQuery}");
178+
var resp = RestClient.GetAsync($"/dbs/api/v2/tls/certificate?{filterQuery}").Result;
173179

174180
if (!resp.IsSuccessStatusCode)
175181
{

cscglobal-caplugin/Constants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class Constants
1414
public static string BearerToken = "BearerToken";
1515
public static string DefaultPageSize = "DefaultPageSize";
1616
public static string TemplateSync = "TemplateSync";
17+
public static string SyncFilterDays = "SyncFilterDays";
1718
}
1819

1920
public class ProductIDs

cscglobal-caplugin/Interfaces/ICscGlobalClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Task<ReissueResponse> SubmitReissueAsync(
2424

2525
Task<List<GetCustomField>> SubmitGetCustomFields();
2626

27-
Task<CertificateListResponse> SubmitCertificateListRequestAsync();
27+
Task<CertificateListResponse> SubmitCertificateListRequestAsync(string? dateFilter = null);
2828

2929
Task<RevokeResponse> SubmitRevokeCertificateAsync(string uuId);
3030
}

0 commit comments

Comments
 (0)