librecaptcha/src/main/scala/lc/core/captchaProviders.scala

64 lines
2.2 KiB
Scala

package lc.core
import lc.captchas._
import lc.captchas.interfaces.ChallengeProvider
import lc.captchas.interfaces.Challenge
import scala.collection.mutable.Map
import lc.misc.HelperFunctions
class CaptchaProviders(config: Config) {
private val providers = Map(
"FilterChallenge" -> new FilterChallenge,
// "FontFunCaptcha" -> new FontFunCaptcha,
"PoppingCharactersCaptcha" -> new PoppingCharactersCaptcha,
"ShadowTextCaptcha" -> new ShadowTextCaptcha,
"RainDropsCaptcha" -> new RainDropsCP,
"DebugCaptcha" -> new DebugCaptcha
// "LabelCaptcha" -> new LabelCaptcha
)
def generateChallengeSamples(): Map[String, Challenge] = {
providers.map { case (key, provider) =>
(key, provider.returnChallenge())
}
}
private val captchaConfig = config.captchaConfig
def getProviderById(id: String): ChallengeProvider = {
return providers(id)
}
private def filterProviderByParam(param: Parameters): Iterable[(String, String)] = {
val configFilter = for {
configValue <- captchaConfig
if configValue.allowedLevels.contains(param.level)
if configValue.allowedMedia.contains(param.media)
if configValue.allowedInputType.contains(param.input_type)
} yield (configValue.name, configValue.config)
val providerFilter = for {
providerValue <- configFilter
providerConfigMap = providers(providerValue._1).supportedParameters()
if providerConfigMap.get(ParametersEnum.SUPPORTEDLEVEL.toString).contains(param.level)
if providerConfigMap.get(ParametersEnum.SUPPORTEDMEDIA.toString).contains(param.media)
if providerConfigMap.get(ParametersEnum.SUPPORTEDINPUTTYPE.toString).contains(param.input_type)
} yield (providerValue._1, providerValue._2)
providerFilter
}
def getProvider(param: Parameters): Option[ChallengeProvider] = {
val providerConfig = filterProviderByParam(param).toList
if (providerConfig.length > 0) {
val randomIndex = HelperFunctions.randomNumber(providerConfig.length)
val providerIndex = providerConfig(randomIndex)._1
val selectedProvider = providers(providerIndex)
selectedProvider.configure(providerConfig(randomIndex)._2)
Some(selectedProvider)
} else {
None
}
}
}