diff --git a/src/SectigoCAProxy/Client/SectigoApiClient.cs b/src/SectigoCAProxy/Client/SectigoApiClient.cs index 104c3fb..dc87115 100644 --- a/src/SectigoCAProxy/Client/SectigoApiClient.cs +++ b/src/SectigoCAProxy/Client/SectigoApiClient.cs @@ -4,6 +4,8 @@ // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions // and limitations under the License. +using Common.Logging.Factory; + using CSS.Common.Logging; using Keyfactor.AnyGateway.Sectigo.API; @@ -32,7 +34,9 @@ public SectigoApiClient(HttpClient httpClient) public async Task GetCertificate(int sslId) { - var response = await RestClient.GetAsync($"api/ssl/v1/{sslId}"); + string uri = $"api/ssl/v1/{sslId}"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); return await ProcessResponse(response); } @@ -137,8 +141,9 @@ public async Task CertificateListProducer(BlockingCollection certs, public async Task> PageCertificates(int position = 0, int size = 25, string filter = "") { string filterQueryString = String.IsNullOrEmpty(filter) ? string.Empty : $"&{filter}"; - Logger.Trace($"API Request: api/ssl/v1?position={position}&size={size}{filterQueryString}".TrimEnd()); - var response = await RestClient.GetAsync($"api/ssl/v1?position={position}&size={size}{filterQueryString}".TrimEnd()); + string uri = $"api/ssl/v1?position={position}&size={size}{filterQueryString}".TrimEnd(); + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); return await ProcessResponse>(response); } @@ -149,9 +154,13 @@ public async Task RevokeSslCertificateById(int sslId, int revcode, string reasonCode = revcode, reason = revreason }; - var response = await RestClient.PostAsJsonAsync($"api/ssl/v1/revoke/{sslId}", data); + string uri = $"api/ssl/v1/revoke/{sslId}"; + string parameters = JsonConvert.SerializeObject(data, Formatting.Indented); + Logger.Trace($"API Request: POST {uri}\nParameters: {parameters}"); + var response = await RestClient.PostAsJsonAsync(uri, data); if (response.IsSuccessStatusCode) { + Logger.Trace($"API Response: Revocation successful"); return true; } var failedResp = ProcessResponse(response).Result; @@ -160,12 +169,9 @@ public async Task RevokeSslCertificateById(int sslId, int revcode, string public async Task ListOrganizations() { - var response = await RestClient.GetAsync("api/organization/v1"); - if (response.IsSuccessStatusCode) - { - string responseContent = await response.Content.ReadAsStringAsync(); - Logger.Trace($"Raw Response: {responseContent}"); - } + string uri = $"api/organization/v1"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); var orgsResponse = await ProcessResponse>(response); return new ListOrganizationsResponse { Organizations = orgsResponse }; @@ -173,12 +179,9 @@ public async Task ListOrganizations() public async Task GetOrganizationDetails(int orgId) { - var response = await RestClient.GetAsync($"api/organization/v1/{orgId}"); - if (response.IsSuccessStatusCode) - { - string responseContent = await response.Content.ReadAsStringAsync(); - Logger.Trace($"Raw Response: {responseContent}"); - } + string uri = $"api/organization/v1/{orgId}"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); var orgDetailsResponse = await ProcessResponse(response); return orgDetailsResponse; @@ -201,7 +204,9 @@ public async Task ListPersons(int orgId) public async Task ListCustomFields() { - var response = await RestClient.GetAsync("api/ssl/v1/customFields"); + string uri = $"api/ssl/v1/customFields"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); return new ListCustomFieldsResponse { CustomFields = await ProcessResponse>(response) }; } @@ -212,14 +217,17 @@ public async Task ListSslProfiles(int? orgId = null) { urlSuffix = $"?organizationId={orgId}"; } - - var response = await RestClient.GetAsync($"api/ssl/v1/types{urlSuffix}"); + string uri = $"api/ssl/v1/types{urlSuffix}"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); return new ListSslProfilesResponse { SslProfiles = await ProcessResponse>(response) }; } public async Task> PagePerons(int orgId, int position = 0, int size = 25) { - var response = await RestClient.GetAsync($"api/person/v1?position={position}&size={size}&organizationId={orgId}"); + string uri = $"api/person/v1?position={position}&size={size}&organizationId={orgId}"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); return await ProcessResponse>(response); } @@ -227,7 +235,10 @@ public async Task Enroll(EnrollRequest request) { try { - var response = await RestClient.PostAsJsonAsync("api/ssl/v1/enroll", request); + string uri = $"api/ssl/v1/enroll"; + string parameters = JsonConvert.SerializeObject(request, Formatting.Indented); + Logger.Trace($"API Request: POST {uri}\nParameters: {parameters}"); + var response = await RestClient.PostAsJsonAsync(uri, request); var enrollResponse = await ProcessResponse(response); return enrollResponse.sslId; @@ -250,7 +261,9 @@ public async Task Renew(int sslId) { try { - var response = await RestClient.PostAsJsonAsync($"api/ssl/v1/renewById/{sslId}", ""); + string uri = $"api/ssl/v1/renewById/{sslId}"; + Logger.Trace($"API Request: POST {uri}"); + var response = await RestClient.PostAsJsonAsync(uri, ""); var renewResponse = await ProcessResponse(response); return renewResponse.sslId; @@ -271,11 +284,14 @@ public async Task Renew(int sslId) public async Task PickupCertificate(int sslId, string subject) { - var response = await RestClient.GetAsync($"api/ssl/v1/collect/{sslId}/x509CO"); + string uri = $"api/ssl/v1/collect/{sslId}/x509CO"; + Logger.Trace($"API Request: GET {uri}"); + var response = await RestClient.GetAsync(uri); - Logger.Trace($"Picking up certificate, response: {response.StatusCode}"); + if (response.IsSuccessStatusCode && response.Content.Headers.ContentLength > 0) { + Logger.Trace($"Picking up certificate"); string pemChain = await response.Content.ReadAsStringAsync(); Logger.Trace($"Pickup return value: {pemChain}"); @@ -289,7 +305,10 @@ public async Task PickupCertificate(int sslId, string subject) public async Task Reissue(ReissueRequest request, int sslId) { - var response = await RestClient.PostAsJsonAsync($"api/ssl/v1/replace/{sslId}", request); + string uri = $"api/ssl/v1/replace/{sslId}"; + string parameters = JsonConvert.SerializeObject(request, Formatting.Indented); + Logger.Trace($"API Request: POST {uri}\nParameters: {parameters}"); + var response = await RestClient.PostAsJsonAsync(uri, request); response.EnsureSuccessStatusCode(); } @@ -297,20 +316,22 @@ public async Task Reissue(ReissueRequest request, int sslId) private static Func hexify = (ss => ss.Length <= 2 ? ss : ss.Substring(0, 2) + ":" + hexify(ss.Substring(2))); - private static async Task ProcessResponse(HttpResponseMessage response) + private async Task ProcessResponse(HttpResponseMessage response) { + string responseContent = await response.Content.ReadAsStringAsync(); + Logger.Trace($"API Response Status: {response.StatusCode}\nContent: {responseContent}"); if (response.IsSuccessStatusCode) { - string responseContent = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(responseContent); } else { - var error = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); + var error = JsonConvert.DeserializeObject(responseContent); throw new SectigoApiException($"{error.Code} | {error.Description}") { ErrorCode = error.Code, Description = error.Description }; } } + private static string GetCertificateType(CertificateType type) { return Enum.GetName(typeof(CertificateType), type)?.ToLower();