aboutsummaryrefslogtreecommitdiff
path: root/broker
diff options
context:
space:
mode:
authorShelikhoo <xiaokangwang@outlook.com>2022-04-11 14:24:49 +0100
committerShelikhoo <xiaokangwang@outlook.com>2022-06-16 13:57:34 +0100
commit5d7a3766d6f8af0a3adc24b19aaa30747b49c847 (patch)
tree2fc5ddaaada9d04586d1e3bc546889c9da0c0349 /broker
parentd5a87c3c02ea673d397e3cb8f945f2f0f0e05a76 (diff)
downloadsnowflake-5d7a3766d6f8af0a3adc24b19aaa30747b49c847.tar.gz
snowflake-5d7a3766d6f8af0a3adc24b19aaa30747b49c847.zip
Add Relay Info Forwarding for Snowflake
Diffstat (limited to 'broker')
-rw-r--r--broker/broker.go15
-rw-r--r--broker/ipc.go12
2 files changed, 26 insertions, 1 deletions
diff --git a/broker/broker.go b/broker/broker.go
index 10129d7..692cea4 100644
--- a/broker/broker.go
+++ b/broker/broker.go
@@ -36,6 +36,13 @@ type BrokerContext struct {
snowflakeLock sync.Mutex
proxyPolls chan *ProxyPoll
metrics *Metrics
+
+ bridgeList BridgeListHolderFileBased
+ allowedRelayPattern string
+}
+
+func (ctx *BrokerContext) GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error) {
+ return ctx.bridgeList.GetBridgeInfo(fingerprint)
}
func NewBrokerContext(metricsLogger *log.Logger) *BrokerContext {
@@ -139,6 +146,14 @@ func (ctx *BrokerContext) AddSnowflake(id string, proxyType string, natType stri
return snowflake
}
+func (ctx *BrokerContext) InstallBridgeListProfile(reader io.Reader, relayPattern string) error {
+ if err := ctx.bridgeList.LoadBridgeInfo(reader); err != nil {
+ return err
+ }
+ ctx.allowedRelayPattern = relayPattern
+ return nil
+}
+
// Client offer contains an SDP, bridge fingerprint and the NAT type of the client
type ClientOffer struct {
natType string
diff --git a/broker/ipc.go b/broker/ipc.go
index e11a33c..e559c2a 100644
--- a/broker/ipc.go
+++ b/broker/ipc.go
@@ -102,7 +102,13 @@ func (i *IPC) ProxyPolls(arg messages.Arg, response *[]byte) error {
}
i.ctx.metrics.promMetrics.ProxyPollTotal.With(prometheus.Labels{"nat": natType, "status": "matched"}).Inc()
- b, err = messages.EncodePollResponse(string(offer.sdp), true, offer.natType)
+ var relayURL string
+ if info, err := i.ctx.bridgeList.GetBridgeInfo(offer.fingerprint); err != nil {
+ return err
+ } else {
+ relayURL = info.WebSocketAddress
+ }
+ b, err = messages.EncodePollResponseWithRelayURL(string(offer.sdp), true, offer.natType, relayURL)
if err != nil {
return messages.ErrInternal
}
@@ -141,6 +147,10 @@ func (i *IPC) ClientOffers(arg messages.Arg, response *[]byte) error {
}
copy(offer.fingerprint[:], fingerprint)
+ if _, err := i.ctx.GetBridgeInfo(offer.fingerprint); err != nil {
+ return err
+ }
+
// Only hand out known restricted snowflakes to unrestricted clients
var snowflakeHeap *SnowflakeHeap
if offer.natType == NATUnrestricted {