Added captcha and media http end points

Added convertImage method
This commit is contained in:
Rahul Rudragoudar 2018-12-17 13:36:36 +05:30
parent 6394fde5d2
commit 3c6bcad7bb

View File

@ -3,6 +3,16 @@ package lc
import com.sksamuel.scrimage._ import com.sksamuel.scrimage._
import java.sql._ import java.sql._
import java.io._ import java.io._
import httpserver._
import javax.imageio._
import java.awt.image._
import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonDSL._
import java.util.Base64
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.{read, write}
import scala.Array
trait ChallengeProvider { trait ChallengeProvider {
val id: String val id: String
@ -15,28 +25,43 @@ class Captcha {
val con: Connection = DriverManager.getConnection("jdbc:h2:./captcha", "sa", "") val con: Connection = DriverManager.getConnection("jdbc:h2:./captcha", "sa", "")
val stmt: Statement = con.createStatement() val stmt: Statement = con.createStatement()
stmt.execute("CREATE TABLE IF NOT EXISTS challenge(token varchar, id varchar, secret varchar, image blob)") stmt.execute("CREATE TABLE IF NOT EXISTS challenge(token varchar, id varchar, secret varchar, image blob)")
val insertPstmt: PreparedStatement = con.prepareStatement("INSERT INTO challenge(token, id, secret) VALUES (?, ?, ?)") val insertPstmt: PreparedStatement = con.prepareStatement("INSERT INTO challenge(token, id, secret, image) VALUES (?, ?, ?, ?)")
val selectPstmt: PreparedStatement = con.prepareStatement("SELECT secret FROM challenge WHERE token = ?") val selectPstmt: PreparedStatement = con.prepareStatement("SELECT secret FROM challenge WHERE token = ?")
val imagePstmt: PreparedStatement = con.prepareStatement("SELECT image FROM challenge WHERE token = ?")
def getCaptcha(): Boolean = { def getCaptcha(id: Id): Array[Byte] = {
val provider = new FilterChallenge imagePstmt.setString(1, id.id)
val (token, image) = this.getChallenge(provider) val rs: ResultSet = imagePstmt.executeQuery()
image.output(new File("Captcha.png")) rs.next()
println(s"Token: ${token}") val blob = rs.getBlob("image")
println("Enter your answer: ") var image :Array[Byte] = null
val answer = scala.io.StdIn.readLine() if(blob != null)
this.getAnswer(token, answer, provider) image = blob.getBytes(1, blob.length().toInt)
image
} }
def getChallenge(provider: ChallengeProvider): (String, Image) = { def convertImage(image: Image): ByteArrayInputStream = {
val output = new ByteArrayOutputStream()
image.output(new File("Captcha.png"))
val img = ImageIO.read(new File("Captcha.png"))
ImageIO.write(img,"png",output)
val byte_array = output.toByteArray()
val blob = new ByteArrayInputStream(byte_array)
blob
}
def getChallenge(param: Parameters): Id = {
val provider = new FilterChallenge
val (image, secret) = provider.returnChallenge() val (image, secret) = provider.returnChallenge()
val blob = convertImage(image)
val token = scala.util.Random.nextInt(10000).toString val token = scala.util.Random.nextInt(10000).toString
val id = Id(token)
insertPstmt.setString(1, token) insertPstmt.setString(1, token)
insertPstmt.setString(2, provider.id) insertPstmt.setString(2, provider.id)
insertPstmt.setString(3, secret) insertPstmt.setString(3, secret)
//TODO: insert image into database insertPstmt.setBlob(4, blob)
insertPstmt.executeUpdate() insertPstmt.executeUpdate()
(token, image) id
} }
def getAnswer(token: String, answer: String, provider: ChallengeProvider): Boolean = { def getAnswer(token: String, answer: String, provider: ChallengeProvider): Boolean = {
@ -64,13 +89,41 @@ class Captcha {
} }
} }
case class Size(height: Int, width: Int)
case class Parameters(level: String, media: String, input_type: String, size: Option[Size])
case class Id(id: String)
object LCFramework{ object LCFramework{
def main(args: scala.Array[String]) { def main(args: scala.Array[String]) {
val port = 8888
val captcha = new Captcha val captcha = new Captcha
val result = captcha.getCaptcha() val server = new HTTPServer(port)
println(result) val host = server.getVirtualHost(null)
captcha.display()
captcha.closeConnection() implicit val formats = DefaultFormats
host.addContext("/v1/captcha",(req, resp) => {
val body = req.getJson()
val json = parse(body)
val param = json.extract[Parameters]
val id = captcha.getChallenge(param)
resp.getHeaders().add("Content-Type","application/json")
resp.send(200, write(id))
0
})
host.addContext("/v1/media",(req, resp) => {
val body = req.getJson()
val json = parse(body)
val id = json.extract[Id]
val image = captcha.getCaptcha(id)
println(image.toString())
println(image)
resp.getHeaders().add("Content-Type","image/png")
resp.send(200, image)
0
})
server.start()
} }
} }