select random captchas

Signed-off-by: hrj <harshad.rj@gmail.com>
This commit is contained in:
hrj 2022-02-28 00:00:40 +05:30
parent d2a4a92463
commit e44a1df22e
2 changed files with 33 additions and 1 deletions

View File

@ -105,16 +105,35 @@ class CaptchaManager(config: Config, captchaProviders: CaptchaProviders) {
}
}
private def getCount(param: Parameters): Option[Int] = {
val countPstmt = Statements.tlStmts.get.countPstmt
countPstmt.setString(1, param.level)
countPstmt.setString(2, param.media)
countPstmt.setString(3, param.input_type)
val rs = countPstmt.executeQuery()
if (rs.next()) {
Some(rs.getInt("count"))
} else {
None
}
}
private def getToken(param: Parameters): Option[Int] = {
val count = getCount(param).getOrElse(0)
if (count == 0) {
None
} else {
val tokenPstmt = Statements.tlStmts.get.tokenPstmt
tokenPstmt.setString(1, param.level)
tokenPstmt.setString(2, param.media)
tokenPstmt.setString(3, param.input_type)
tokenPstmt.setInt(4, count)
val rs = tokenPstmt.executeQuery()
if (rs.next()) {
Some(rs.getInt("token"))
} else {
None
}
}
}

View File

@ -70,6 +70,17 @@ class Statements(dbConn: DBConn, maxAttempts: Int) {
"WHERE token = ?;"
)
val countPstmt: PreparedStatement = dbConn.con.prepareStatement(
s"""
SELECT count(*) as count
FROM challenge
WHERE attempted < $maxAttempts AND
contentLevel = ? AND
contentType = ? AND
contentInput = ?
"""
)
val tokenPstmt: PreparedStatement = dbConn.con.prepareStatement(
s"""
SELECT token, attempted
@ -78,7 +89,9 @@ class Statements(dbConn: DBConn, maxAttempts: Int) {
contentLevel = ? AND
contentType = ? AND
contentInput = ?
ORDER BY attempted ASC LIMIT 1"""
LIMIT 1
OFFSET FLOOR(RAND()*?)
"""
)
val deleteAnswerPstmt: PreparedStatement = dbConn.con.prepareStatement(