using Azaion.CommonSecurity.DTO; using Azaion.CommonSecurity.DTO.Commands; using MessagePack; using NetMQ; using NetMQ.Sockets; namespace Azaion.CommonSecurity.Services; public interface IResourceLoader { Task Load(string fileName, CancellationToken cancellationToken = default); } public class PythonResourceLoader : IResourceLoader { private readonly PushSocket _pushSocket = new(); private readonly PullSocket _pullSocket = new(); public PythonResourceLoader(ApiCredentials credentials) { //Run python by credentials _pushSocket.Connect($"tcp://{SecurityConstants.SOCKET_HOST}:{SecurityConstants.SOCKET_SEND_PORT}"); _pullSocket.Connect($"tcp://{SecurityConstants.SOCKET_HOST}:{SecurityConstants.SOCKET_RECEIVE_PORT}"); } public async Task Load(string fileName, CancellationToken cancellationToken = default) { try { var b = MessagePackSerializer.Serialize(new FileCommand { CommandType = CommandType.Load, Filename = fileName }); _pushSocket.SendFrame(b); var bytes = _pullSocket.ReceiveFrameBytes(out bool more); return new MemoryStream(bytes); } catch (Exception ex) { throw new Exception($"Failed to load fil0e '{fileName}': {ex.Message}", ex); } } } public class ResourceLoader(AzaionApiClient api, ApiCredentials credentials) : IResourceLoader { public async Task Load(string fileName, CancellationToken cancellationToken = default) { var hardwareService = new HardwareService(); var hardwareInfo = hardwareService.GetHardware(); var encryptedStream = Task.Run(() => api.GetResource(fileName, credentials.Password, hardwareInfo), cancellationToken).Result; var key = Security.MakeEncryptionKey(credentials.Email, credentials.Password, hardwareInfo.Hash); var stream = new MemoryStream(); await encryptedStream.DecryptTo(stream, key, cancellationToken); stream.Seek(0, SeekOrigin.Begin); return stream; } }