Represent Bridge Fingerprint As String

This commit is contained in:
Shelikhoo 2022-05-17 15:53:15 +01:00
parent dd61e2be0f
commit f789dce6d2
No known key found for this signature in database
GPG key ID: C4D5E79D22B25316
7 changed files with 69 additions and 21 deletions

View file

@ -2,27 +2,26 @@ package main
import (
"bufio"
"encoding/hex"
"encoding/json"
"errors"
"git.torproject.org/pluggable-transports/snowflake.git/v2/common/bridgefingerprint"
"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
bridgeInfo map[bridgefingerprint.Fingerprint]BridgeInfo
accessBridgeInfo sync.RWMutex
}
type BridgeListHolder interface {
GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error)
GetBridgeInfo(bridgefingerprint.Fingerprint) (BridgeInfo, error)
}
type BridgeListHolderFileBased interface {
@ -36,7 +35,7 @@ type BridgeInfo struct {
Fingerprint string `json:"fingerprint"`
}
func (h *bridgeListHolder) GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, error) {
func (h *bridgeListHolder) GetBridgeInfo(fingerprint bridgefingerprint.Fingerprint) (BridgeInfo, error) {
h.accessBridgeInfo.RLock()
defer h.accessBridgeInfo.RUnlock()
if bridgeInfo, ok := h.bridgeInfo[fingerprint]; ok {
@ -46,7 +45,7 @@ func (h *bridgeListHolder) GetBridgeInfo(fingerprint [20]byte) (BridgeInfo, erro
}
func (h *bridgeListHolder) LoadBridgeInfo(reader io.Reader) error {
bridgeInfoMap := map[[20]byte]BridgeInfo{}
bridgeInfoMap := map[bridgefingerprint.Fingerprint]BridgeInfo{}
inputScanner := bufio.NewScanner(reader)
for inputScanner.Scan() {
inputLine := inputScanner.Bytes()
@ -54,13 +53,14 @@ func (h *bridgeListHolder) LoadBridgeInfo(reader io.Reader) error {
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 {
var bridgeFingerprint bridgefingerprint.Fingerprint
var err error
if bridgeFingerprint, err = bridgefingerprint.FingerprintFromHexString(bridgeInfo.Fingerprint); err != nil {
return err
} else if n != 20 {
return ErrBridgeFingerprintInvalid
}
bridgeInfoMap[bridgeHash] = bridgeInfo
bridgeInfoMap[bridgeFingerprint] = bridgeInfo
}
h.accessBridgeInfo.Lock()
defer h.accessBridgeInfo.Unlock()