mirror of
https://github.com/librecaptcha/lc-core.git
synced 2025-04-16 00:48:08 -04:00
Added captcha and media http end points
Added convertImage method
This commit is contained in:
parent
6394fde5d2
commit
3c6bcad7bb
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user