Files
hcs/Hcs.Broker/Client.cs
2025-09-28 16:43:36 +09:00

119 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using CryptoPro.Security.Cryptography.X509Certificates;
using Hcs.Broker.Api;
using Hcs.Broker.Internal;
using Hcs.Broker.Logger;
using Hcs.Broker.MessageCapturer;
using System.Security;
using System.Security.Cryptography.X509Certificates;
namespace Hcs.Broker
{
/// <summary>
/// Клиент для вызова всех реализованных функций интеграции с ГИС ЖКХ
/// </summary>
public class Client
{
/// <summary>
/// Идентификатор поставщика данных ГИС ЖКХ
/// </summary>
public string OrgPPAGUID { get; set; }
/// <summary>
/// Исполнитель/сотрудник ГИС ЖКХ, от которого будут регистрироваться ответы
/// </summary>
public string ExecutorGUID { get; set; }
/// <summary>
/// Признак, указывающий на то, что используется ли внешний туннель (stunnel)
/// </summary>
public bool UseTunnel { get; set; }
/// <summary>
/// Если true, то запросы будут выполняться на промышленном стенде, иначе - на тестовом
/// </summary>
public bool IsPPAK { get; set; }
/// <summary>
/// Роль
/// </summary>
public OrganizationRole Role { get; set; }
/// <summary>
/// Устанавливаемый пользователем приемник отладочных сообщений
/// </summary>
public ILogger Logger { get; set; }
/// <summary>
/// Устанавливаемый пользователем механизм перехвата содержимого отправляемых
/// и принимаемых пакетов
/// </summary>
public IMessageCapturer MessageCapturer { get; set; }
public BillsApi Bills => new(this);
public DeviceMeteringApi DeviceMetering => new(this);
public HouseManagementApi HouseManagement => new(this);
public NsiApi Nsi => new(this);
public NsiCommonApi NsiCommon => new(this);
public OrgRegistryCommonApi OrgRegistryCommon => new(this);
public PaymentsApi Payments => new(this);
/// <summary>
/// Сертификат клиента для применения при формировании запросов
/// </summary>
internal CpX509Certificate2 Certificate { get; private set; }
internal SecureString CertificatePin { get; private set; }
public void SetSigningCertificate(string serialNumber, string? pin = null)
{
using var store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var cert = store.Certificates.Find(X509FindType.FindBySerialNumber, serialNumber, false)[0];
Certificate = cert ?? throw new ArgumentNullException("Certificate not found");
pin ??= Constants.DEFAULT_CERTIFICATE_PIN;
CertificatePin = new SecureString();
foreach (var character in pin)
{
CertificatePin.AppendChar(character);
}
}
internal string ComposeEndpointUri(string endpointName)
{
if (UseTunnel)
{
return $"http://{Constants.URI_TUNNEL}/{endpointName}";
}
return IsPPAK
? $"https://{Constants.URI_PPAK}/{endpointName}"
: $"https://{Constants.URI_SIT_02}/{endpointName}";
}
/// <summary>
/// Пробует вывести сообщение в установленный приемник отладочных сообщений
/// </summary>
internal void TryLog(string message)
{
Logger?.WriteLine(message);
}
/// <summary>
/// Пробует отправить тело сообщения в установленный перехватчик
/// </summary>
internal void TryCaptureMessage(bool sent, string messageBody)
{
MessageCapturer?.CaptureMessage(sent, messageBody);
}
}
}