summaryrefslogtreecommitdiff
path: root/src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala')
-rw-r--r--src/main/scala/com/tylerstonge/honeypot/ftp/FtpHandler.scala32
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