mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-13 20:11:19 -04:00
Add Bridge List Holder
This commit is contained in:
parent
3d4f294241
commit
0822c5f87b
1 changed files with 52 additions and 1 deletions
|
@ -1,6 +1,20 @@
|
||||||
package main
|
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 {
|
type bridgeListHolder struct {
|
||||||
bridgeInfo map[[20]byte]BridgeInfo
|
bridgeInfo map[[20]byte]BridgeInfo
|
||||||
|
@ -11,8 +25,45 @@ type BridgeListHolder interface {
|
||||||
GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error)
|
GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BridgeListHolderFileBased interface {
|
||||||
|
BridgeListHolder
|
||||||
|
LoadBridgeInfo(reader io.Reader) error
|
||||||
|
}
|
||||||
|
|
||||||
type BridgeInfo struct {
|
type BridgeInfo struct {
|
||||||
DisplayName string `json:"displayName"`
|
DisplayName string `json:"displayName"`
|
||||||
WebSocketAddress string `json:"webSocketAddress"`
|
WebSocketAddress string `json:"webSocketAddress"`
|
||||||
Fingerprint string `json:"fingerprint"`
|
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
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue