diff --git a/nameshield-caplugin/API/RequestCertificate.cs b/nameshield-caplugin/API/RequestCertificate.cs index 3825962..fc23e82 100644 --- a/nameshield-caplugin/API/RequestCertificate.cs +++ b/nameshield-caplugin/API/RequestCertificate.cs @@ -28,6 +28,8 @@ public CertificateRequest() data.relationships.product.data = new RelationshipData(); data.relationships.organization = new CertRequestRel(); data.relationships.organization.data = new RelationshipData(); + data.relationships.certificate = new CertRequestRel(); + data.relationships.certificate.data = new RelationshipData(); } public string GetOrderData() @@ -81,6 +83,9 @@ public class CertificateRequestRelationships [JsonPropertyName("organization")] [JsonProperty("organization")] public CertRequestRel organization { get; set; } + [JsonPropertyName("certificate")] + [JsonProperty("certificate")] + public CertRequestRel certificate { get; set; } } public class CertRequestRel diff --git a/nameshield-caplugin/NameshieldCAPlugin.cs b/nameshield-caplugin/NameshieldCAPlugin.cs index d33cfd2..4cbcdb0 100644 --- a/nameshield-caplugin/NameshieldCAPlugin.cs +++ b/nameshield-caplugin/NameshieldCAPlugin.cs @@ -127,7 +127,7 @@ public async Task Enroll(string csr, string subject, Dictionar CertificateRequest request = new CertificateRequest(); request.data.type = "order"; - request.data.attributes.action = orderAction; + request.data.attributes.csr = csr; request.data.attributes.duration = lifetime; request.data.relationships.product.data.type = "product"; @@ -135,6 +135,39 @@ public async Task Enroll(string csr, string subject, Dictionar request.data.relationships.organization.data.type = "organization"; request.data.relationships.organization.data.id = orgId; + string orderAction = "create"; + // Determine if we should do a renew or a reissue + if (enrollmentType == EnrollmentType.RenewOrReissue) + { + string priorCertSnString = productInfo.ProductParameters["PriorCertSN"]; + var priorCertReqID = await _certificateDataReader.GetRequestIDBySerialNumber(priorCertSnString); + if (string.IsNullOrEmpty(priorCertReqID)) + { + throw new Exception($"Cannot find prior certificate with serial number {priorCertSnString}."); + } + + string orderId = priorCertReqID.Split('-')[0]; + + var orderResponse = Task.Run(async () => await client.GetOrderDetails(orderId)).Result; + if (orderResponse.Order.Attributes.CanRenewAt != null) + { + DateTime canRenewDT = DateTime.Parse(orderResponse.Order.Attributes.CanRenewAt); + if (canRenewDT < DateTime.UtcNow) + { + orderAction = "renew"; + } + else + { + orderAction = "reissue"; + } + } + + request.data.relationships.certificate.data.type = "certificate"; + request.data.relationships.certificate.data.id = priorCertReqID.Split('-')[1]; + } + + request.data.attributes.action = orderAction; + var response = Task.Run(async () => await client.RequestCertificate(request)).Result; var status = response.Order.Attributes.Status;