better checks on receiveOffer (#11)

This commit is contained in:
Serene Han 2016-03-15 20:13:39 -07:00
parent b1e76420bd
commit 490b8b33b7
3 changed files with 30 additions and 25 deletions

View file

@ -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

View file

@ -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) ->

View file

@ -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()