package com.tylerstonge.honeypot.ftp import java.net.InetSocketAddress import akka.actor.{Actor, Props} import akka.event.{Logging, LoggingAdapter} import akka.io.Tcp._ import akka.io.{IO, Tcp} import akka.util.ByteString class FtpListener extends Actor { val log: LoggingAdapter = Logging(context.system, this) IO(Tcp)(context.system) ! Bind(self, new InetSocketAddress("localhost", 2121)) override def receive: Receive = { case Bound(localAddress) => log.info("listening on {}", localAddress) case CommandFailed(_: Bind) => context.stop(self) case Connected(remote, local) => val handler = context.actorOf(Props[FtpHandler]) val connection = sender() connection ! Register(handler) connection ! Write(ByteString.apply("220 (vulnFTPd 2.0.1)\n")) } } class FtpHandler extends Actor { val log: LoggingAdapter = Logging(context.system, this) override def receive: Receive = { case Received(data) => { log.info(">> {}", data.utf8String) sender() ! Write(ByteString.apply(parse(data.utf8String))) } case PeerClosed => { log.info("closing connection") context.stop(self) } } def parse(msg: String): String = msg match { case "AUTH SSL" => "500 cmd not recognized\n" case "USER dropkick" => "200 come on in\n" case _ => "200 sure\n" } }