diff options
Diffstat (limited to 'src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala')
-rw-r--r-- | src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala b/src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala index 8bdb190..840ce97 100644 --- a/src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala +++ b/src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala @@ -1,18 +1,20 @@ package com.tylerstonge.honeypot.ftp -import java.net.InetSocketAddress - -import akka.actor.Actor +import akka.actor.{Actor, ActorRef, Props} import akka.event.{Logging, LoggingAdapter} import akka.io.Tcp.{PeerClosed, Received, Write} import akka.util.ByteString -class FtpHandler extends Actor { +object FtpHandler { + def props(client: ActorRef): Props = Props(new FtpHandler(client)) +} + +class FtpHandler(client: ActorRef) extends Actor { val log: LoggingAdapter = Logging(context.system, this) override def receive: Receive = { - case Received(data) => sender() ! Write(ByteString.apply(parse(sanitize(data)))) + case Received(data) => client ! Write(ByteString.apply(parse(sanitize(data)))) case PeerClosed => log.info("peer closed connection") context.stop(self) @@ -28,18 +30,22 @@ class FtpHandler extends Actor { case "pwd" => "257 \"/\" is the current directory\n" case "quit" => "221 Goodbye.\n" case "pasv" => - context.actorOf(FtpFileReceiver.props(1287)) + log.info("entering passive mode") + context.actorOf(FtpFileReceiver.props(1287, client), name = "passive-connection") + Thread.sleep(256) "227 entering passive mode (127,0,0,1,5,7)\n" - case "port" => - context.actorOf(FtpFileRetriever.props(new InetSocketAddress(getHostname(msg(1)), getPort(msg(1))))) - "200 OK\n" case "stor" => - "200 OK \n" + log.info("stor: {}", msg(1)) + "150 File status okay; about to open data connection.\n" case _ => log.info("unsupported command received: {}", msg.mkString(" ")) "451 Requested action aborted. Local error in processing.\n" } + def sanitize(data: ByteString): Array[String] = { + data.utf8String.trim.toLowerCase().split(" ") + } + def getHostname(msg: String): String = { val split = msg.split(",") split.slice(0, 4).mkString(".") @@ -49,8 +55,4 @@ class FtpHandler extends Actor { val split = msg.split(",") split(4).toInt * 256 + split(5).toInt } - - def sanitize(data: ByteString): Array[String] = { - data.utf8String.trim.toLowerCase().split(" ") - } -} +}
\ No newline at end of file |