summaryrefslogtreecommitdiff
path: root/src/main/scala/com/tylerstonge/honeypot/ftp/FtpFileReceiver.scala
blob: 74ca5948db6defedeaa1135f6ff141f749e78304 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tylerstonge.honeypot.ftp

import java.net.InetSocketAddress
import java.nio.file.{Files, OpenOption, Paths, StandardOpenOption}

import akka.actor.{Actor, Props}
import akka.event.{Logging, LoggingAdapter}
import akka.io.Tcp._
import akka.io.{IO, Tcp}
import akka.util.{ByteString, ByteStringBuilder}


object FtpFileReceiver {
  def props(port: Int): Props = Props(new FtpFileReceiver(port))
}

class FtpFileReceiver(port: Int) extends Actor {

  val log: LoggingAdapter = Logging(context.system, this)
  IO(Tcp)(context.system) ! Bind(self, new InetSocketAddress("localhost", port))
  val fileData: ByteStringBuilder = ByteString.newBuilder

  override def receive: Receive = {
    case Bound(localAddress) =>
      log.info("listening on {}", localAddress)
    case CommandFailed(_: Bind) => context.stop(self)
    case Connected(_, _) =>
      log.info("peer connected")
      context.become {
        case Received(data) =>
          fileData.addAll(data)
        case PeerClosed =>
          log.info("peer closed connection, writing file to disk")
          val out = Files.newByteChannel(Paths.get("testfile.txt"), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)
          out.write(fileData.result().toByteBuffer)
          out.close()
          context.stop(self)
      }
  }
}