Add new Hcs.Broker to communicate with ГИС ЖКХ via CryptoPro LibCore

This commit is contained in:
2025-09-28 15:45:15 +09:00
parent 904988780a
commit 2b49320014
171 changed files with 185618 additions and 0 deletions

107
Hcs.Broker/Client.cs Normal file
View File

@ -0,0 +1,107 @@
using CryptoPro.Security.Cryptography.X509Certificates;
using Hcs.Broker.Api;
using Hcs.Broker.Internal;
using Hcs.Broker.Logger;
using Hcs.Broker.MessageCapturer;
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; set; }
public void SetSigningCertificate(string serialNumber)
{
using var store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var cert = store.Certificates.Find(X509FindType.FindBySerialNumber, serialNumber, true)[0];
Certificate = cert ?? throw new ArgumentNullException("Certificate not found");
}
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);
}
}
}