mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-13 20:11:19 -04:00
better checks on receiveOffer (#11)
This commit is contained in:
parent
b1e76420bd
commit
490b8b33b7
3 changed files with 30 additions and 25 deletions
|
@ -51,7 +51,9 @@ class ProxyPair
|
||||||
@client = channel
|
@client = channel
|
||||||
|
|
||||||
receiveWebRTCOffer: (offer) ->
|
receiveWebRTCOffer: (offer) ->
|
||||||
console.assert 'offer' == offer.type
|
if 'offer' != offer.type
|
||||||
|
log 'Invalid SDP received -- was not an offer.'
|
||||||
|
return false
|
||||||
try
|
try
|
||||||
err = @pc.setRemoteDescription offer
|
err = @pc.setRemoteDescription offer
|
||||||
catch e
|
catch e
|
||||||
|
|
|
@ -50,12 +50,11 @@ CONFIRMATION_MESSAGE = "You're currently serving a Tor user via Snowflake."
|
||||||
# Minimum viable snowflake for now - just 1 client.
|
# Minimum viable snowflake for now - just 1 client.
|
||||||
class Snowflake
|
class Snowflake
|
||||||
|
|
||||||
relayAddr: null
|
relayAddr: null
|
||||||
proxyPairs: []
|
proxyPairs: []
|
||||||
|
rateLimit: null
|
||||||
rateLimit: null
|
state: MODE.INIT
|
||||||
state: MODE.INIT
|
retries: 0
|
||||||
retries: 0
|
|
||||||
|
|
||||||
constructor: (@broker, @ui) ->
|
constructor: (@broker, @ui) ->
|
||||||
rateLimitBytes = undefined
|
rateLimitBytes = undefined
|
||||||
|
@ -108,16 +107,8 @@ class Snowflake
|
||||||
log 'No more available ProxyPair slots.'
|
log 'No more available ProxyPair slots.'
|
||||||
countdown(err, DEFAULT_BROKER_POLL_INTERVAL / 1000)
|
countdown(err, DEFAULT_BROKER_POLL_INTERVAL / 1000)
|
||||||
return
|
return
|
||||||
log 'Polling for ' + pair.id
|
|
||||||
recv = @broker.getClientOffer pair.id
|
recv = @broker.getClientOffer pair.id
|
||||||
recv.then (desc) =>
|
recv.then (desc) => @receiveOffer pair, desc
|
||||||
offer = JSON.parse desc
|
|
||||||
dbg 'Received:\n\n' + offer.sdp + '\n'
|
|
||||||
console.log desc
|
|
||||||
sdp = new RTCSessionDescription offer
|
|
||||||
# @receiveOffer offer
|
|
||||||
if pair.receiveWebRTCOffer sdp
|
|
||||||
@sendAnswer pair if 'offer' == sdp.type
|
|
||||||
, (err) ->
|
, (err) ->
|
||||||
countdown(err, DEFAULT_BROKER_POLL_INTERVAL / 1000)
|
countdown(err, DEFAULT_BROKER_POLL_INTERVAL / 1000)
|
||||||
@retries++
|
@retries++
|
||||||
|
@ -129,12 +120,16 @@ class Snowflake
|
||||||
return @proxyPairs.find (pp, i, arr) -> return !pp.active
|
return @proxyPairs.find (pp, i, arr) -> return !pp.active
|
||||||
|
|
||||||
# Receive an SDP offer from some client assigned by the Broker,
|
# Receive an SDP offer from some client assigned by the Broker,
|
||||||
# TODO: remove
|
# |pair| - an available ProxyPair.
|
||||||
receiveOffer: (desc) =>
|
receiveOffer: (pair, desc) =>
|
||||||
sdp = new RTCSessionDescription desc
|
console.assert !pair.active
|
||||||
pair = @nextAvailableProxyPair()
|
try
|
||||||
if pair.receiveWebRTCOffer sdp
|
offer = JSON.parse desc
|
||||||
@sendAnswer pair if 'offer' == sdp.type
|
dbg 'Received:\n\n' + offer.sdp + '\n'
|
||||||
|
sdp = new RTCSessionDescription offer
|
||||||
|
@sendAnswer pair if pair.receiveWebRTCOffer sdp
|
||||||
|
catch e
|
||||||
|
log 'ERROR: Unable to receive Offer: ' + e
|
||||||
|
|
||||||
sendAnswer: (pair) ->
|
sendAnswer: (pair) ->
|
||||||
next = (sdp) ->
|
next = (sdp) ->
|
||||||
|
|
|
@ -47,14 +47,22 @@ describe 'Snowflake', ->
|
||||||
expect(s.retries).toBe 1
|
expect(s.retries).toBe 1
|
||||||
expect(s.broker.getClientOffer).toHaveBeenCalled()
|
expect(s.broker.getClientOffer).toHaveBeenCalled()
|
||||||
|
|
||||||
it 'receives SDP offer', ->
|
it 'receives SDP offer and sends answer', ->
|
||||||
s = new Snowflake(new FakeBroker(), fakeUI)
|
s = new Snowflake(new FakeBroker(), fakeUI)
|
||||||
s.proxyPairs[0] = { receiveWebRTCOffer: -> }
|
pair = { receiveWebRTCOffer: -> }
|
||||||
spyOn(s.proxyPairs[0], 'receiveWebRTCOffer').and.returnValue true
|
spyOn(pair, 'receiveWebRTCOffer').and.returnValue true
|
||||||
spyOn(s, 'sendAnswer')
|
spyOn(s, 'sendAnswer')
|
||||||
s.receiveOffer { 'type': 'offer', 'sdp': 'foo' }
|
s.receiveOffer pair, '{"type":"offer","sdp":"foo"}'
|
||||||
expect(s.sendAnswer).toHaveBeenCalled()
|
expect(s.sendAnswer).toHaveBeenCalled()
|
||||||
|
|
||||||
|
it 'does not send answer when receiving invalid offer', ->
|
||||||
|
s = new Snowflake(new FakeBroker(), fakeUI)
|
||||||
|
pair = { receiveWebRTCOffer: -> }
|
||||||
|
spyOn(pair, 'receiveWebRTCOffer').and.returnValue false
|
||||||
|
spyOn(s, 'sendAnswer')
|
||||||
|
s.receiveOffer pair, '{"type":"not a good offer","sdp":"foo"}'
|
||||||
|
expect(s.sendAnswer).not.toHaveBeenCalled()
|
||||||
|
|
||||||
it 'can make a proxypair', ->
|
it 'can make a proxypair', ->
|
||||||
s = new Snowflake(new FakeBroker(), fakeUI)
|
s = new Snowflake(new FakeBroker(), fakeUI)
|
||||||
s.makeProxyPair()
|
s.makeProxyPair()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue