Preliminary support for new first-party captcha on 4chan.
This commit is contained in:
parent
72f35dfba5
commit
cd68ba1443
58
src/Posting/Captcha.t.coffee
Normal file
58
src/Posting/Captcha.t.coffee
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
Captcha.t =
|
||||||
|
init: ->
|
||||||
|
return if d.cookie.indexOf('pass_enabled=1') >= 0
|
||||||
|
return if not (@isEnabled = !!$('#t-root') or !$.id('postForm'))
|
||||||
|
|
||||||
|
root = $.el 'div', className: 'captcha-root'
|
||||||
|
@nodes = {root}
|
||||||
|
|
||||||
|
$.addClass QR.nodes.el, 'has-captcha', 'captcha-t'
|
||||||
|
$.after QR.nodes.com.parentNode, root
|
||||||
|
|
||||||
|
moreNeeded: ->
|
||||||
|
return
|
||||||
|
|
||||||
|
setup: (focus) ->
|
||||||
|
return unless @isEnabled
|
||||||
|
|
||||||
|
if !@nodes.container
|
||||||
|
@nodes.container = $.el 'div', className: 'captcha-container'
|
||||||
|
$.prepend @nodes.root, @nodes.container
|
||||||
|
boardID = g.BOARD.ID
|
||||||
|
threadID = '' + QR.posts[0].thread
|
||||||
|
$.global ->
|
||||||
|
el = document.querySelector '#qr .captcha-container'
|
||||||
|
window.TCaptcha.init el, @boardID, +@threadID
|
||||||
|
window.TCaptcha.setErrorCb (err) ->
|
||||||
|
window.dispatchEvent new CustomEvent('CreateNotification', {detail: {
|
||||||
|
type: 'warning',
|
||||||
|
content: '' + err
|
||||||
|
}})
|
||||||
|
, {boardID, threadID}
|
||||||
|
|
||||||
|
if focus
|
||||||
|
$('#t-resp').focus()
|
||||||
|
|
||||||
|
destroy: ->
|
||||||
|
return unless @isEnabled and @nodes.container
|
||||||
|
$.global ->
|
||||||
|
window.TCaptcha.destroy()
|
||||||
|
$.rm @nodes.container
|
||||||
|
delete @nodes.container
|
||||||
|
|
||||||
|
getOne: ->
|
||||||
|
response = {}
|
||||||
|
if @nodes.container
|
||||||
|
for key in ['t-response', 't-challenge']
|
||||||
|
response[key] = $("[name='#{key}']", @nodes.container).value
|
||||||
|
if !response['t-response']
|
||||||
|
response = null
|
||||||
|
response
|
||||||
|
|
||||||
|
setUsed: ->
|
||||||
|
if @nodes.container
|
||||||
|
$.global ->
|
||||||
|
window.TCaptcha.clearChallenge()
|
||||||
|
|
||||||
|
occupied: ->
|
||||||
|
!!@nodes.container
|
||||||
@ -26,8 +26,6 @@ QR =
|
|||||||
|
|
||||||
@posts = []
|
@posts = []
|
||||||
|
|
||||||
@captcha = Captcha.v2
|
|
||||||
|
|
||||||
$.on d, '4chanXInitFinished', -> BoardConfig.ready QR.initReady
|
$.on d, '4chanXInitFinished', -> BoardConfig.ready QR.initReady
|
||||||
|
|
||||||
Callbacks.Post.push
|
Callbacks.Post.push
|
||||||
@ -50,6 +48,8 @@ QR =
|
|||||||
Header.addShortcut 'qr', sc, 540
|
Header.addShortcut 'qr', sc, 540
|
||||||
|
|
||||||
initReady: ->
|
initReady: ->
|
||||||
|
captchaVersion = if $('#t-root') then 't' else 'v2'
|
||||||
|
QR.captcha = Captcha[captchaVersion]
|
||||||
QR.postingIsEnabled = true
|
QR.postingIsEnabled = true
|
||||||
|
|
||||||
{config} = g.BOARD
|
{config} = g.BOARD
|
||||||
@ -684,8 +684,10 @@ QR =
|
|||||||
if g.BOARD.ID is 'r9k' and !post.com?.match(/[a-z-]/i)
|
if g.BOARD.ID is 'r9k' and !post.com?.match(/[a-z-]/i)
|
||||||
err or= 'Original comment required.'
|
err or= 'Original comment required.'
|
||||||
|
|
||||||
if QR.captcha.isEnabled and !(/\b_ct=/.test(d.cookie) and threadID) and !(err and !force)
|
if QR.captcha.isEnabled and !(QR.captcha is Captcha.v2 and /\b_ct=/.test(d.cookie) and threadID) and !(err and !force)
|
||||||
captcha = QR.captcha.getOne(!!threadID) or Captcha.cache.request(!!threadID)
|
captcha = QR.captcha.getOne(!!threadID)
|
||||||
|
if QR.captcha is Captcha.v2
|
||||||
|
captcha or= Captcha.cache.request(!!threadID)
|
||||||
unless captcha
|
unless captcha
|
||||||
err = 'No valid captcha.'
|
err = 'No valid captcha.'
|
||||||
QR.captcha.setup(!QR.cooldown.auto or d.activeElement is QR.nodes.status)
|
QR.captcha.setup(!QR.cooldown.auto or d.activeElement is QR.nodes.status)
|
||||||
@ -736,11 +738,15 @@ QR =
|
|||||||
cb = (response) ->
|
cb = (response) ->
|
||||||
if response?
|
if response?
|
||||||
QR.currentCaptcha = response
|
QR.currentCaptcha = response
|
||||||
if response.challenge?
|
if QR.captcha is Captcha.v2
|
||||||
options.form.append 'recaptcha_challenge_field', response.challenge
|
if response.challenge?
|
||||||
options.form.append 'recaptcha_response_field', response.response
|
options.form.append 'recaptcha_challenge_field', response.challenge
|
||||||
|
options.form.append 'recaptcha_response_field', response.response
|
||||||
|
else
|
||||||
|
options.form.append 'g-recaptcha-response', response.response
|
||||||
else
|
else
|
||||||
options.form.append 'g-recaptcha-response', response.response
|
for key, val of response
|
||||||
|
options.form.append key, val
|
||||||
QR.req = $.ajax "https://sys.#{location.hostname.split('.')[1]}.org/#{g.BOARD}/post", options
|
QR.req = $.ajax "https://sys.#{location.hostname.split('.')[1]}.org/#{g.BOARD}/post", options
|
||||||
QR.req.progress = '...'
|
QR.req.progress = '...'
|
||||||
|
|
||||||
@ -749,10 +755,11 @@ QR =
|
|||||||
QR.req =
|
QR.req =
|
||||||
progress: '...'
|
progress: '...'
|
||||||
abort: ->
|
abort: ->
|
||||||
Captcha.cache.abort()
|
if QR.captcha is Captcha.v2
|
||||||
|
Captcha.cache.abort()
|
||||||
cb = null
|
cb = null
|
||||||
captcha (response) ->
|
captcha (response) ->
|
||||||
if Captcha.cache.haveCookie()
|
if QR.captcha is Captcha.v2 and Captcha.cache.haveCookie()
|
||||||
cb?()
|
cb?()
|
||||||
Captcha.cache.save response if response
|
Captcha.cache.save response if response
|
||||||
else if response
|
else if response
|
||||||
@ -780,10 +787,11 @@ QR =
|
|||||||
$('a', err)?.target = '_blank' # duplicate image link
|
$('a', err)?.target = '_blank' # duplicate image link
|
||||||
else if (connErr = (!@response or @response.title isnt 'Post successful!'))
|
else if (connErr = (!@response or @response.title isnt 'Post successful!'))
|
||||||
err = QR.connectionError()
|
err = QR.connectionError()
|
||||||
Captcha.cache.save QR.currentCaptcha if QR.currentCaptcha
|
Captcha.cache.save QR.currentCaptcha if QR.captcha is Captcha.v2 and QR.currentCaptcha
|
||||||
else if @status isnt 200
|
else if @status isnt 200
|
||||||
err = "Error #{@statusText} (#{@status})"
|
err = "Error #{@statusText} (#{@status})"
|
||||||
|
|
||||||
|
QR.captcha.setUsed?() unless connErr
|
||||||
delete QR.currentCaptcha
|
delete QR.currentCaptcha
|
||||||
|
|
||||||
if err
|
if err
|
||||||
@ -901,7 +909,7 @@ QR =
|
|||||||
if (oldReq = QR.req) and !QR.req.isUploadFinished
|
if (oldReq = QR.req) and !QR.req.isUploadFinished
|
||||||
delete QR.req
|
delete QR.req
|
||||||
oldReq.abort()
|
oldReq.abort()
|
||||||
Captcha.cache.save QR.currentCaptcha if QR.currentCaptcha
|
Captcha.cache.save QR.currentCaptcha if QR.captcha is Captcha.v2 and QR.currentCaptcha
|
||||||
delete QR.currentCaptcha
|
delete QR.currentCaptcha
|
||||||
QR.posts[0].unlock()
|
QR.posts[0].unlock()
|
||||||
QR.cooldown.auto = false
|
QR.cooldown.auto = false
|
||||||
|
|||||||
@ -167,7 +167,8 @@ QR.post = class
|
|||||||
QR.characterCount()
|
QR.characterCount()
|
||||||
@nodes.span.textContent = @com
|
@nodes.span.textContent = @com
|
||||||
QR.captcha.moreNeeded()
|
QR.captcha.moreNeeded()
|
||||||
Captcha.cache.prerequest()
|
if QR.captcha is Captcha.v2
|
||||||
|
Captcha.cache.prerequest()
|
||||||
|
|
||||||
isOnlyQuotes: ->
|
isOnlyQuotes: ->
|
||||||
(@com or '').trim() is (@quotedText or '').trim()
|
(@com or '').trim() is (@quotedText or '').trim()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user