4chan-x/src/Posting/Captcha.service.coffee

79 lines
2.6 KiB
CoffeeScript

Captcha.service =
init: ->
$.on d, 'LoadCaptcha', @loadCaptcha.bind(@)
$.on d, 'AbortCaptcha SaveCaptcha', @abortCaptcha.bind(@)
$.on d, 'RequestCaptcha', @requestCaptcha.bind(@)
isEnabled: ->
Conf['captchaServiceDomain'] and /\S/.test(Conf['captchaServiceDomain'])
loadCaptcha: (e) ->
return unless @isEnabled()
e.preventDefault() if !@pending or @aborted
abortCaptcha: ->
@aborted = true if @pending
requestCaptcha: (e) ->
return unless @isEnabled()
return if e.defaultPrevented
if @pending and @aborted
@aborted = false
return
return if @pending
@pending = true
@aborted = false
e.preventDefault()
CrossOrigin.permission @requestCaptcha2.bind(@), @noCaptcha.bind(@, 'Permission denied'), ["#{Conf['captchaServiceDomain']}/*"]
requestCaptcha2: ->
key = Conf['captchaServiceKey'][Conf['captchaServiceDomain']]
return @noCaptcha 'API key not set' unless key and /\S/.test(key)
url = "#{Conf['captchaServiceDomain']}/in.php?key=#{encodeURIComponent key}&method=userrecaptcha&googlekey=<%= meta.recaptchaKey %>&pageurl=https://boards.4channel.org/v/"
@req = CrossOrigin.ajax url,
responseType: 'text'
onloadend: =>
response = @req.response or ''
parts = response.split('|')
if parts[0] is 'OK'
@requestID = parts[1]
@interval = setInterval @poll.bind(@), 5 * $.SECOND
else
@noCaptcha()
poll: ->
key = Conf['captchaServiceKey'][Conf['captchaServiceDomain']]
return @noCaptcha 'API key not set' unless key and /\S/.test(key)
url = "#{Conf['captchaServiceDomain']}/res.php?key=#{encodeURIComponent key}&action=get&id=#{encodeURIComponent @requestID}"
@req = CrossOrigin.ajax url,
responseType: 'text'
onloadend: =>
return unless @req.status
response = @req.response or ''
parts = response.split('|')
if parts[0] is 'CAPCHA_NOT_READY'
# pass
else if parts[0] is 'OK'
clearInterval @interval
@saveCaptcha parts[1]
else
clearInterval @interval
@noCaptcha()
noCaptcha: (error) ->
@pending = false
return if @aborted
error or= if @req.status is 200
@req.response
else if @req.status
"#{@req.statusText} (#{@req.status})"
else
'Connection Error'
error = "Failed to retrieve captcha: #{error}"
$.event 'NoCaptcha', {error}
saveCaptcha: (response) ->
@pending = false
timeout = Date.now() + Captcha.v2.lifetime
$.event 'SaveCaptcha', {response, timeout}