Skip to content

Commit aff0f3d

Browse files
committed
check FQDN
1 parent bb37aa2 commit aff0f3d

6 files changed

Lines changed: 34 additions & 19 deletions

File tree

announce.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ type AnnounceResponse struct {
1717
Complete int `bencode:"complete"`
1818
Incomplete int `bencode:"incomplete"`
1919
Peers []byte `bencode:"peers"`
20-
PeersIPv6 []byte `bencode:"peers_ipv6"`
20+
PeersIPv6 []byte `bencode:"peers6,omitempty"`
21+
ExternalIP []byte `bencode:"external ip,omitempty"`
2122
}
2223

2324
func announce(w http.ResponseWriter, r *http.Request) {
@@ -65,6 +66,7 @@ func announce(w http.ResponseWriter, r *http.Request) {
6566
Incomplete: numLeechers,
6667
Peers: peersIPv4,
6768
PeersIPv6: peersIPv6,
69+
ExternalIP: ip.To4(),
6870
}
6971
w.Header().Add("X-PrivTracker", fmt.Sprintf("s:%d l:%d", numSeeders, numLeechers))
7072
if err := bencode.Marshal(w, resp); err != nil {
@@ -81,12 +83,15 @@ func getRemoteIP(r *http.Request) net.IP {
8183
ip := net.ParseIP(addr)
8284
if ip.IsPrivate() {
8385
ips := strings.Split(r.Header.Get("X-Forwarded-For"), ",")
84-
if len(ips) > 0 {
85-
ipForwarded := net.ParseIP(strings.TrimSpace(ips[0]))
86-
if ipForwarded != nil {
86+
for _, maybeIP := range ips {
87+
ipForwarded := net.ParseIP(strings.TrimSpace(maybeIP))
88+
if !ipForwarded.IsPrivate() {
8789
ip = ipForwarded
90+
break
8891
}
8992
}
93+
if len(ips) > 0 {
94+
}
9095
}
9196
return ip
9297
}

announce_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"net/http"
45
"net/http/httptest"
56
"testing"
67
)
@@ -9,9 +10,12 @@ func BenchmarkAnnounce(b *testing.B) {
910
server := httptest.NewServer(router())
1011
client := server.Client()
1112
for i := 0; i < b.N; i++ {
12-
_, err := client.Get(server.URL + "/test/announce?port=1234")
13+
resp, err := client.Get(server.URL + "/test/announce?port=1234")
1314
if err != nil {
1415
b.Fatal(err)
1516
}
17+
if resp.StatusCode != http.StatusOK {
18+
b.Fatalf("unexpected status code: %d", resp.StatusCode)
19+
}
1620
}
1721
}

go.mod

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
module github.com/meehow/privtracker
22

3-
go 1.22
3+
go 1.24.0
44

55
require (
66
github.com/jackpal/bencode-go v1.0.2
7-
golang.org/x/crypto v0.32.0
8-
)
7+
golang.org/x/crypto v0.37.0
8+
golang.org/x/net v0.39.0
99

10-
require (
11-
golang.org/x/net v0.21.0 // indirect
12-
golang.org/x/text v0.21.0 // indirect
1310
)
11+
12+
require golang.org/x/text v0.24.0 // indirect

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
github.com/jackpal/bencode-go v1.0.2 h1:LcCNfZ344u0LpBPOZNjpCLps/wUOuN4r87Fy9+5yU8g=
22
github.com/jackpal/bencode-go v1.0.2/go.mod h1:6jI9mUjO3GQbZti3JizEfxTzRfWOM8oBBcwbwlTfceI=
3-
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
4-
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
5-
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
6-
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
7-
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
8-
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
3+
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
4+
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
5+
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
6+
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
7+
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
8+
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=

main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"path/filepath"
1111

1212
"golang.org/x/crypto/acme/autocert"
13+
"golang.org/x/net/publicsuffix"
1314
)
1415

1516
func main() {
@@ -20,7 +21,7 @@ func main() {
2021
handler := router(recoveryMiddleware, headersMiddleware, logRequestMiddleware)
2122
if port == "443" {
2223
go redirect80()
23-
fmt.Println("PrivTracker listening on https://0.0.0.0/")
24+
fmt.Println("PrivTracker listening on https://0.0.0.0/ (please use your FQDN to access this server)")
2425
log.Fatal(http.Serve(autocertListener(), handler))
2526
} else {
2627
fmt.Printf("PrivTracker listening on http://0.0.0.0:%s/\n", port)
@@ -59,6 +60,10 @@ func autocertListener() net.Listener {
5960

6061
func redirect(w http.ResponseWriter, r *http.Request) {
6162
url := fmt.Sprintf("https://%s/", r.Host)
63+
if _, icann := publicsuffix.PublicSuffix(r.Host); !icann {
64+
// fallback in case we can't get FQDN
65+
url = "https://privtracker.com/"
66+
}
6267
http.Redirect(w, r, url, http.StatusMovedPermanently)
6368
}
6469

middleware.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ func logRequestMiddleware(next http.Handler) http.Handler {
4040

4141
func headersMiddleware(next http.Handler) http.Handler {
4242
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
43-
w.Header().Set("Strict-Transport-Security", "max-age=31536000") // hsts
43+
if r.TLS != nil {
44+
w.Header().Set("Strict-Transport-Security", "max-age=31536000") // hsts
45+
}
4446
w.Header().Set("Server", "PrivTracker")
4547
next.ServeHTTP(w, r)
4648
})

0 commit comments

Comments
 (0)