124 lines
4.4 KiB
C#
124 lines
4.4 KiB
C#
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 Client()
|
||
{
|
||
AppContext.SetSwitch("Switch.CryptoPro.DotNet.AllowExperimental", true);
|
||
}
|
||
|
||
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);
|
||
}
|
||
}
|
||
}
|