From 20cd7c07ce2b6660cc3b635df284ba1a9404f3b8 Mon Sep 17 00:00:00 2001 From: Josh de Kock Date: Mon, 4 Apr 2016 14:07:35 +0100 Subject: [PATCH] middleware/client: make client middleware use StringStore and remove ClientStore Fixes #158 --- server/store/client_store.go | 49 --------------- server/store/memory/client_store.go | 60 ------------------- server/store/middleware/client/README.md | 12 ++-- server/store/middleware/client/blacklist.go | 6 +- server/store/middleware/client/whitelist.go | 13 +++- .../middleware/infohash/blacklist_test.go | 3 - server/store/store.go | 8 --- 7 files changed, 19 insertions(+), 132 deletions(-) delete mode 100644 server/store/client_store.go delete mode 100644 server/store/memory/client_store.go diff --git a/server/store/client_store.go b/server/store/client_store.go deleted file mode 100644 index 0976acf..0000000 --- a/server/store/client_store.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2016 The Chihaya Authors. All rights reserved. -// Use of this source code is governed by the BSD 2-Clause license, -// which can be found in the LICENSE file. - -package store - -import ( - "fmt" - "github.com/chihaya/chihaya" -) - -var clientStoreDrivers = make(map[string]ClientStoreDriver) - -// ClientStore represents an interface for manipulating clientIDs. -type ClientStore interface { - CreateClient(clientID string) error - FindClient(peerID chihaya.PeerID) (bool, error) - DeleteClient(clientID string) error -} - -// ClientStoreDriver represents an interface for creating a handle to the -// storage of swarms. -type ClientStoreDriver interface { - New(*DriverConfig) (ClientStore, error) -} - -// RegisterClientStoreDriver makes a driver available by the provided name. -// -// If this function is called twice with the same name or if the driver is nil, -// it panics. -func RegisterClientStoreDriver(name string, driver ClientStoreDriver) { - if driver == nil { - panic("store: could not register nil ClientStoreDriver") - } - if _, dup := clientStoreDrivers[name]; dup { - panic("store: could not register duplicate ClientStoreDriver: " + name) - } - clientStoreDrivers[name] = driver -} - -// OpenClientStore returns a ClientStore specified by a configuration. -func OpenClientStore(cfg *DriverConfig) (ClientStore, error) { - driver, ok := clientStoreDrivers[cfg.Name] - if !ok { - return nil, fmt.Errorf("store: unknown ClientStoreDriver %q (forgotten import?)", cfg) - } - - return driver.New(cfg) -} diff --git a/server/store/memory/client_store.go b/server/store/memory/client_store.go deleted file mode 100644 index b86e143..0000000 --- a/server/store/memory/client_store.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2016 The Chihaya Authors. All rights reserved. -// Use of this source code is governed by the BSD 2-Clause license, -// which can be found in the LICENSE file. - -package memory - -import ( - "sync" - - "github.com/chihaya/chihaya" - "github.com/chihaya/chihaya/pkg/clientid" - "github.com/chihaya/chihaya/server/store" -) - -func init() { - store.RegisterClientStoreDriver("memory", &clientStoreDriver{}) -} - -type clientStoreDriver struct{} - -func (d *clientStoreDriver) New(_ *store.DriverConfig) (store.ClientStore, error) { - return &clientStore{ - clientIDs: make(map[string]struct{}), - }, nil -} - -type clientStore struct { - clientIDs map[string]struct{} - sync.RWMutex -} - -var _ store.ClientStore = &clientStore{} - -func (s *clientStore) CreateClient(clientID string) error { - s.Lock() - defer s.Unlock() - - s.clientIDs[clientID] = struct{}{} - - return nil -} - -func (s *clientStore) FindClient(peerID chihaya.PeerID) (bool, error) { - clientID := clientid.New(string(peerID)) - s.RLock() - defer s.RUnlock() - - _, ok := s.clientIDs[clientID] - - return ok, nil -} - -func (s *clientStore) DeleteClient(clientID string) error { - s.Lock() - defer s.Unlock() - - delete(s.clientIDs, clientID) - - return nil -} diff --git a/server/store/middleware/client/README.md b/server/store/middleware/client/README.md index aecca9a..c33ac26 100644 --- a/server/store/middleware/client/README.md +++ b/server/store/middleware/client/README.md @@ -4,22 +4,22 @@ This package provides the announce middlewares `client_whitelist` and `client_bl ### `client_blacklist` -The `client_blacklist` middleware uses all clientIDs stored in the `ClientStore` to blacklist, i.e. block announces. +The `client_blacklist` middleware uses all clientIDs stored in the `StringStore` to blacklist, i.e. block announces. -The clientID part of the peerID of an announce is matched against the `ClientStore`, if it's contained within the `ClientStore`, the announce is aborted. +The clientID part of the peerID of an announce is matched against the `StringStore`, if it's contained within the `StringStore`, the announce is aborted. ### `client_whitelist` -The `client_whitelist` middleware uses all clientIDs stored in the `ClientStore` to whitelist, i.e. allow announces. +The `client_whitelist` middleware uses all clientIDs stored in the `StringStore` to whitelist, i.e. allow announces. -The clientID part of the peerID of an announce is matched against the `ClientStore`, if it's _not_ contained within the `ClientStore`, the announce is aborted. +The clientID part of the peerID of an announce is matched against the `StringStore`, if it's _not_ contained within the `StringStore`, the announce is aborted. ### Important things to notice Both middlewares operate on announce requests only. -Both middlewares use the same `ClientStore`. +Both middlewares use the same `StringStore`. It is therefore not advised to have both the `client_blacklist` and the `client_whitelist` middleware running. -(If you add clientID to the `ClientStore`, it will be used for blacklisting and whitelisting. +(If you add clientID to the `StringStore`, it will be used for blacklisting and whitelisting. If your store contains no clientIDs, no announces will be blocked by the blacklist, but all announces will be blocked by the whitelist. If your store contains all clientIDs, no announces will be blocked by the whitelist, but all announces will be blocked by the blacklist.) \ No newline at end of file diff --git a/server/store/middleware/client/blacklist.go b/server/store/middleware/client/blacklist.go index 4515916..a5bbfd5 100644 --- a/server/store/middleware/client/blacklist.go +++ b/server/store/middleware/client/blacklist.go @@ -6,6 +6,7 @@ package client import ( "github.com/chihaya/chihaya" + "github.com/chihaya/chihaya/pkg/clientid" "github.com/chihaya/chihaya/server/store" "github.com/chihaya/chihaya/tracker" ) @@ -19,11 +20,10 @@ func init() { var ErrBlockedClient = tracker.ClientError("disallowed client") // blacklistAnnounceClient provides a middleware that only allows Clients to -// announce that are not stored in a ClientStore. +// announce that are not stored in the StringStore. func blacklistAnnounceClient(next tracker.AnnounceHandler) tracker.AnnounceHandler { return func(cfg *chihaya.TrackerConfig, req *chihaya.AnnounceRequest, resp *chihaya.AnnounceResponse) error { - blacklisted, err := store.MustGetStore().FindClient(req.PeerID) - + blacklisted, err := store.MustGetStore().HasString(PrefixClient + clientid.New(string(req.PeerID))) if err != nil { return err } else if blacklisted { diff --git a/server/store/middleware/client/whitelist.go b/server/store/middleware/client/whitelist.go index 2c71978..51b48e5 100644 --- a/server/store/middleware/client/whitelist.go +++ b/server/store/middleware/client/whitelist.go @@ -6,6 +6,7 @@ package client import ( "github.com/chihaya/chihaya" + "github.com/chihaya/chihaya/pkg/clientid" "github.com/chihaya/chihaya/server/store" "github.com/chihaya/chihaya/tracker" ) @@ -14,12 +15,18 @@ func init() { tracker.RegisterAnnounceMiddleware("client_whitelist", whitelistAnnounceClient) } +// PrefixClient is the prefix to be used for client peer IDs. +const PrefixClient = "c-" + +// ErrNotWhitelistedClient is returned by an announce middleware if the +// announcing Client is not whitelisted. +var ErrNotWhitelistedClient = tracker.ClientError("client not whitelisted") + // whitelistAnnounceClient provides a middleware that only allows Clients to -// announce that are stored in a ClientStore. +// announce that are stored in the StringStore. func whitelistAnnounceClient(next tracker.AnnounceHandler) tracker.AnnounceHandler { return func(cfg *chihaya.TrackerConfig, req *chihaya.AnnounceRequest, resp *chihaya.AnnounceResponse) error { - whitelisted, err := store.MustGetStore().FindClient(req.PeerID) - + whitelisted, err := store.MustGetStore().HasString(PrefixClient + clientid.New(string(req.PeerID))) if err != nil { return err } else if !whitelisted { diff --git a/server/store/middleware/infohash/blacklist_test.go b/server/store/middleware/infohash/blacklist_test.go index d0cb719..d260072 100644 --- a/server/store/middleware/infohash/blacklist_test.go +++ b/server/store/middleware/infohash/blacklist_test.go @@ -27,9 +27,6 @@ func TestASetUp(t *testing.T) { StringStore: store.DriverConfig{ Name: "memory", }, - ClientStore: store.DriverConfig{ - Name: "memory", - }, IPStore: store.DriverConfig{ Name: "memory", }, diff --git a/server/store/store.go b/server/store/store.go index 9760921..b1f9cb9 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -30,11 +30,6 @@ func constructor(srvcfg *chihaya.ServerConfig, tkr *tracker.Tracker) (server.Ser return nil, errors.New("store: invalid store config: " + err.Error()) } - cs, err := OpenClientStore(&cfg.ClientStore) - if err != nil { - return nil, err - } - ps, err := OpenPeerStore(&cfg.PeerStore) if err != nil { return nil, err @@ -54,7 +49,6 @@ func constructor(srvcfg *chihaya.ServerConfig, tkr *tracker.Tracker) (server.Ser cfg: cfg, tkr: tkr, shutdown: make(chan struct{}), - ClientStore: cs, PeerStore: ps, IPStore: ips, StringStore: ss, @@ -69,7 +63,6 @@ type Config struct { ReadTimeout time.Duration `yaml:"read_timeout"` WriteTimeout time.Duration `yaml:"write_timeout"` GCAfter time.Duration `yaml:"gc_after"` - ClientStore DriverConfig `yaml:"client_store"` PeerStore DriverConfig `yaml:"peer_store"` IPStore DriverConfig `yaml:"ip_store"` StringStore DriverConfig `yaml:"string_store"` @@ -113,7 +106,6 @@ type Store struct { wg sync.WaitGroup PeerStore - ClientStore IPStore StringStore }