[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [pluggable-transports/snowflake] 02/31: Add Bridge List Holder
This is an automated email from the git hooks/post-receive script.
shelikhoo pushed a commit to branch main
in repository pluggable-transports/snowflake.
commit 0822c5f87b29aee159645af25d7c97c61f539315
Author: Shelikhoo <xiaokangwang@xxxxxxxxxxx>
AuthorDate: Tue Mar 29 13:29:48 2022 +0100
Add Bridge List Holder
---
broker/bridge-list.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/broker/bridge-list.go b/broker/bridge-list.go
index 3913a2e..e77db65 100644
--- a/broker/bridge-list.go
+++ b/broker/bridge-list.go
@@ -1,6 +1,20 @@
package main
-import "sync"
+import (
+ "bufio"
+ "encoding/hex"
+ "encoding/json"
+ "errors"
+ "io"
+ "sync"
+)
+
+var ErrBridgeNotFound = errors.New("bridge not found")
+var ErrBridgeFingerprintInvalid = errors.New("bridge fingerprint invalid")
+
+func NewBridgeListHolder() BridgeListHolderFileBased {
+ return &bridgeListHolder{}
+}
type bridgeListHolder struct {
bridgeInfo map[[20]byte]BridgeInfo
@@ -11,8 +25,45 @@ type BridgeListHolder interface {
GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error)
}
+type BridgeListHolderFileBased interface {
+ BridgeListHolder
+ LoadBridgeInfo(reader io.Reader) error
+}
+
type BridgeInfo struct {
DisplayName string `json:"displayName"`
WebSocketAddress string `json:"webSocketAddress"`
Fingerprint string `json:"fingerprint"`
}
+
+func (h *bridgeListHolder) GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error) {
+ h.accessBridgeInfo.RLock()
+ defer h.accessBridgeInfo.RUnlock()
+ if bridgeInfo, ok := h.bridgeInfo[fingerprint]; ok {
+ return bridgeInfo, nil
+ }
+ return BridgeInfo{}, ErrBridgeNotFound
+}
+
+func (h *bridgeListHolder) LoadBridgeInfo(reader io.Reader) error {
+ bridgeInfoMap := map[[20]byte]BridgeInfo{}
+ inputScanner := bufio.NewScanner(reader)
+ for inputScanner.Scan() {
+ inputLine := inputScanner.Bytes()
+ bridgeInfo := BridgeInfo{}
+ if err := json.Unmarshal(inputLine, &bridgeInfo); err != nil {
+ return err
+ }
+ var bridgeHash [20]byte
+ if n, err := hex.Decode(bridgeHash[:], []byte(bridgeInfo.Fingerprint)); err != nil {
+ return err
+ } else if n != 20 {
+ return ErrBridgeFingerprintInvalid
+ }
+ bridgeInfoMap[bridgeHash] = bridgeInfo
+ }
+ h.accessBridgeInfo.Lock()
+ defer h.accessBridgeInfo.Unlock()
+ h.bridgeInfo = bridgeInfoMap
+ return nil
+}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits