[tor-commits] [snowflake/master] better checks on receiveOffer (#11)

arlo at torproject.org arlo at torproject.org
Fri Mar 18 17:48:36 UTC 2016


commit 490b8b33b78e318267088d79e362a44d88cc8228
Author: Serene Han <keroserene+git at gmail.com>
Date:   Tue Mar 15 20:13:39 2016 -0700

    better checks on receiveOffer (#11)
---
 proxy/proxypair.coffee           |  4 +++-
 proxy/snowflake.coffee           | 35 +++++++++++++++--------------------
 proxy/spec/snowflake.spec.coffee | 16 ++++++++++++----
 3 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/proxy/proxypair.coffee b/proxy/proxypair.coffee
index 3a3fb01..3ed6c6c 100644
--- a/proxy/proxypair.coffee
+++ b/proxy/proxypair.coffee
@@ -51,7 +51,9 @@ class ProxyPair
       @client = channel
 
   receiveWebRTCOffer: (offer) ->
-    console.assert 'offer' == offer.type
+    if 'offer' != offer.type
+      log 'Invalid SDP received -- was not an offer.'
+      return false
     try
       err = @pc.setRemoteDescription offer
     catch e
diff --git a/proxy/snowflake.coffee b/proxy/snowflake.coffee
index 7cc01c9..4f38029 100644
--- a/proxy/snowflake.coffee
+++ b/proxy/snowflake.coffee
@@ -50,12 +50,11 @@ CONFIRMATION_MESSAGE = "You're currently serving a Tor user via Snowflake."
 # Minimum viable snowflake for now - just 1 client.
 class Snowflake
 
-  relayAddr: null
+  relayAddr:  null
   proxyPairs: []
-
-  rateLimit: null
-  state: MODE.INIT
-  retries: 0
+  rateLimit:  null
+  state:      MODE.INIT
+  retries:    0
 
   constructor: (@broker, @ui) ->
     rateLimitBytes = undefined
@@ -108,16 +107,8 @@ class Snowflake
         log 'No more available ProxyPair slots.'
         countdown(err, DEFAULT_BROKER_POLL_INTERVAL / 1000)
         return
-      log 'Polling for ' + pair.id
       recv = @broker.getClientOffer pair.id
-      recv.then (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
+      recv.then (desc) => @receiveOffer pair, desc
       , (err) ->
         countdown(err, DEFAULT_BROKER_POLL_INTERVAL / 1000)
       @retries++
@@ -129,12 +120,16 @@ class Snowflake
     return @proxyPairs.find (pp, i, arr) -> return !pp.active
 
   # Receive an SDP offer from some client assigned by the Broker,
-  # TODO: remove
-  receiveOffer: (desc) =>
-    sdp = new RTCSessionDescription desc
-    pair = @nextAvailableProxyPair()
-    if pair.receiveWebRTCOffer sdp
-      @sendAnswer pair if 'offer' == sdp.type
+  # |pair| - an available ProxyPair.
+  receiveOffer: (pair, desc) =>
+    console.assert !pair.active
+    try
+      offer = JSON.parse desc
+      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) ->
     next = (sdp) ->
diff --git a/proxy/spec/snowflake.spec.coffee b/proxy/spec/snowflake.spec.coffee
index ca7661b..417b6e6 100644
--- a/proxy/spec/snowflake.spec.coffee
+++ b/proxy/spec/snowflake.spec.coffee
@@ -47,14 +47,22 @@ describe 'Snowflake', ->
     expect(s.retries).toBe 1
     expect(s.broker.getClientOffer).toHaveBeenCalled()
 
-  it 'receives SDP offer', ->
+  it 'receives SDP offer and sends answer', ->
     s = new Snowflake(new FakeBroker(), fakeUI)
-    s.proxyPairs[0] = { receiveWebRTCOffer: -> }
-    spyOn(s.proxyPairs[0], 'receiveWebRTCOffer').and.returnValue true
+    pair = { receiveWebRTCOffer: -> }
+    spyOn(pair, 'receiveWebRTCOffer').and.returnValue true
     spyOn(s, 'sendAnswer')
-    s.receiveOffer { 'type': 'offer', 'sdp': 'foo' }
+    s.receiveOffer pair, '{"type":"offer","sdp":"foo"}'
     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', ->
     s = new Snowflake(new FakeBroker(), fakeUI)
     s.makeProxyPair()





More information about the tor-commits mailing list