From 140a7381624e9a4fd839b913068b3af7388e54a7 Mon Sep 17 00:00:00 2001 From: Justin Li <jli.justinli@gmail.com> Date: Fri, 13 Dec 2013 11:19:22 -0500 Subject: [PATCH] Fix edge cases for peer ID parsing Fixes #27 --- server/announce.go | 2 +- server/server.go | 13 ++++++++---- server/server_test.go | 37 +++++++++++----------------------- storage/tracker/mock/driver.go | 1 - 4 files changed, 22 insertions(+), 31 deletions(-) diff --git a/server/announce.go b/server/announce.go index 59dc5c7..ca39aeb 100644 --- a/server/announce.go +++ b/server/announce.go @@ -205,7 +205,7 @@ func (s Server) serveAnnounce(w http.ResponseWriter, r *http.Request) { } else { // If they're leeching, prioritize giving them seeders count += writeSeeders(w, user, torrent, numWant, compact) - count += writeLeechers(w, user, torrent, numWant - count, compact) + count += writeLeechers(w, user, torrent, numWant-count, compact) } if compact && peerCount != count { diff --git a/server/server.go b/server/server.go index af869c6..281c61b 100644 --- a/server/server.go +++ b/server/server.go @@ -127,10 +127,15 @@ func validateUser(conn tracker.Conn, dir string) (*storage.User, error) { // Takes a peer_id and returns a ClientID func parsePeerID(peerID string) (clientID string) { - if peerID[0] == '-' { - clientID = peerID[1:7] - } else { - clientID = peerID[0:6] + length := len(peerID) + if length >= 6 { + if peerID[0] == '-' { + if length >= 7 { + clientID = peerID[1:7] + } + } else { + clientID = peerID[0:6] + } } return } diff --git a/server/server_test.go b/server/server_test.go index e239355..bd1b845 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -14,7 +14,7 @@ type PeerClientPair struct { } var ( - AzTestClients = []PeerClientPair{ + TestClients = []PeerClientPair{ {"-AZ3034-6wfG2wk6wWLc", "AZ3034"}, {"-AZ3042-6ozMq5q6Q3NX", "AZ3042"}, {"-BS5820-oy4La2MWGEFj", "BS5820"}, @@ -33,15 +33,11 @@ var ( {"-A~0010-a9mn9DFkj39J", "A~0010"}, {"-UT2300-MNu93JKnm930", "UT2300"}, {"-UT2300-KT4310KT4301", "UT2300"}, - } - ShadowTestClients = []PeerClientPair{ {"T03A0----f089kjsdf6e", "T03A0-"}, {"S58B-----nKl34GoNb75", "S58B--"}, {"M4-4-0--9aa757Efd5Bl", "M4-4-0"}, - } - OtherTestClients = []PeerClientPair{ {"AZ2500BTeYUzyabAfo6U", "AZ2500"}, // BitTyrant {"exbc0JdSklm834kj9Udf", "exbc0J"}, // Old BitComet {"FUTB0L84j542mVc84jkd", "FUTB0L"}, // Alt BitComet @@ -53,29 +49,20 @@ var ( {"Q1-10-0-Yoiumn39BDfO", "Q1-10-"}, // Queen Bee Alt {"346------SDFknl33408", "346---"}, // TorreTopia {"QVOD0054ABFFEDCCDEDB", "QVOD00"}, // Qvod + + {"", ""}, + {"-", ""}, + {"12345", ""}, + {"-12345", ""}, + {"123456", "123456"}, + {"-123456", "123456"}, } ) -func TestParseAZClientID(t *testing.T) { - for _, pair := range AzTestClients { - if pair.clientId != parsePeerID(pair.peerId) { - t.Error("PeerID incorrectly parsed", pair) - } - } -} - -func TestParseShadowClientID(t *testing.T) { - for _, pair := range ShadowTestClients { - if pair.clientId != parsePeerID(pair.peerId) { - t.Error("PeerID incorrectly parsed", pair) - } - } -} - -func TestParseOtherClientID(t *testing.T) { - for _, pair := range OtherTestClients { - if pair.clientId != parsePeerID(pair.peerId) { - t.Error("PeerID incorrectly parsed", pair) +func TestParseClientID(t *testing.T) { + for _, pair := range TestClients { + if parsedId := parsePeerID(pair.peerId); parsedId != pair.clientId { + t.Error("Incorrectly parsed peer ID", pair.peerId, "as", parsedId) } } } diff --git a/storage/tracker/mock/driver.go b/storage/tracker/mock/driver.go index c67fc17..14ba131 100644 --- a/storage/tracker/mock/driver.go +++ b/storage/tracker/mock/driver.go @@ -26,4 +26,3 @@ func (d *driver) New(conf *config.DataStore) tracker.Pool { func init() { tracker.Register("mock", &driver{}) } -