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 { /// public class Client : IClient { /// public string OrgPPAGUID { get; set; } /// public string ExecutorGUID { get; set; } /// public bool UseTunnel { get; set; } /// public bool IsPPAK { get; set; } /// public OrganizationRole Role { get; set; } /// public ILogger Logger { get; set; } /// public IMessageCapturer MessageCapturer { get; set; } public IBillsApi Bills => new BillsApi(this); public IDeviceMeteringApi DeviceMetering => new DeviceMeteringApi(this); public IHouseManagementApi HouseManagement => new HouseManagementApi(this); public INsiApi Nsi => new NsiApi(this); public INsiCommonApi NsiCommon => new NsiCommonApi(this); public IOrgRegistryCommonApi OrgRegistryCommon => new OrgRegistryCommonApi(this); public IPaymentsApi Payments => new PaymentsApi(this); /// /// Сертификат клиента для применения при формировании запросов /// 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}"; } /// /// Пробует вывести сообщение в установленный приемник отладочных сообщений /// internal void TryLog(string message) { Logger?.WriteLine(message); } /// /// Пробует отправить тело сообщения в установленный перехватчик /// internal void TryCaptureMessage(bool sent, string messageBody) { MessageCapturer?.CaptureMessage(sent, messageBody); } } }