79 lines
2.6 KiB
CoffeeScript
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}
|