mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-14 05:11:19 -04:00
improvement(broker): don't reject unrestricted client if there are no restricted proxies
I.e. match it with an unrestricted proxy (if there is one).
The old behavior exists since the inception of the restricted vs
unrestricted feature, i.e. 0052c0e10c
This commit is contained in:
parent
5cdf52c813
commit
4ff36e3f07
2 changed files with 33 additions and 12 deletions
|
@ -234,22 +234,19 @@ func (i *IPC) ClientOffers(arg messages.Arg, response *[]byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *IPC) matchSnowflake(natType string) *Snowflake {
|
func (i *IPC) matchSnowflake(natType string) *Snowflake {
|
||||||
// Only hand out known restricted snowflakes to unrestricted clients
|
|
||||||
var snowflakeHeap *SnowflakeHeap
|
|
||||||
if natType == NATUnrestricted {
|
|
||||||
snowflakeHeap = i.ctx.restrictedSnowflakes
|
|
||||||
} else {
|
|
||||||
snowflakeHeap = i.ctx.snowflakes
|
|
||||||
}
|
|
||||||
|
|
||||||
i.ctx.snowflakeLock.Lock()
|
i.ctx.snowflakeLock.Lock()
|
||||||
defer i.ctx.snowflakeLock.Unlock()
|
defer i.ctx.snowflakeLock.Unlock()
|
||||||
|
|
||||||
if snowflakeHeap.Len() > 0 {
|
// Proiritize known restricted snowflakes for unrestricted clients
|
||||||
return heap.Pop(snowflakeHeap).(*Snowflake)
|
if natType == NATUnrestricted && i.ctx.restrictedSnowflakes.Len() > 0 {
|
||||||
} else {
|
return heap.Pop(i.ctx.restrictedSnowflakes).(*Snowflake)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if i.ctx.snowflakes.Len() > 0 {
|
||||||
|
return heap.Pop(i.ctx.snowflakes).(*Snowflake)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *IPC) ProxyAnswers(arg messages.Arg, response *[]byte) error {
|
func (i *IPC) ProxyAnswers(arg messages.Arg, response *[]byte) error {
|
||||||
|
|
|
@ -167,6 +167,30 @@ func TestBroker(t *testing.T) {
|
||||||
So(w.Code, ShouldEqual, http.StatusOK)
|
So(w.Code, ShouldEqual, http.StatusOK)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Convey("with unrestricted proxy to unrestricted client if there are no restricted proxies", func() {
|
||||||
|
snowflake := ctx.AddSnowflake("test", "", NATUnrestricted, 0)
|
||||||
|
offerData, err := createClientOffer(sdp, NATUnrestricted, "")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
r, err := http.NewRequest("POST", "snowflake.broker/client", offerData)
|
||||||
|
|
||||||
|
done := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
clientOffers(i, w, r)
|
||||||
|
done <- true
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-snowflake.offerChannel:
|
||||||
|
case <-time.After(250 * time.Millisecond):
|
||||||
|
So(false, ShouldBeTrue)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
snowflake.answerChannel <- "test answer"
|
||||||
|
|
||||||
|
<-done
|
||||||
|
So(w.Body.String(), ShouldEqual, `{"answer":"test answer"}`)
|
||||||
|
})
|
||||||
|
|
||||||
Convey("Times out when no proxy responds.", func() {
|
Convey("Times out when no proxy responds.", func() {
|
||||||
if testing.Short() {
|
if testing.Short() {
|
||||||
return
|
return
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue