(tested) fix invalid parsing of multivalued and comma-separated addresses from HTTP header

This commit is contained in:
Lawrence, Rendall
2022-05-02 23:12:13 +03:00
parent 607f9da00a
commit cf2adad4c9
3 changed files with 59 additions and 11 deletions
+19 -9
View File
@@ -56,19 +56,29 @@ func (aa *RequestAddresses) Add(a RequestAddress) {
}
}
// Validate checks if array is not empty and every RequestAddress is valid,
// then sorts addresses with Sort
func (aa RequestAddresses) Validate() bool {
if len(aa) == 0 {
// Validate checks if array is not empty and at least one RequestAddress is valid,
// then make them unique and sorts with Less rule
func (aa *RequestAddresses) Validate() bool {
if len(*aa) == 0 {
return false
}
for _, a := range aa {
if !a.Validate() {
return false
uniqueAddresses := make(map[netip.Addr]bool, len(*aa))
for _, a := range *aa {
if a.Validate() {
if provided, found := uniqueAddresses[a.Addr]; !found || !provided && a.Provided {
uniqueAddresses[a.Addr] = a.Provided
}
}
}
if len(aa) > 1 {
sort.Sort(aa)
if len(uniqueAddresses) == 0 {
return false
}
*aa = make(RequestAddresses, 0, len(uniqueAddresses))
for a, p := range uniqueAddresses {
*aa = append(*aa, RequestAddress{a, p})
}
if len(*aa) > 1 {
sort.Sort(*aa)
}
return true
}
+31
View File
@@ -0,0 +1,31 @@
package bittorrent
import (
"net/netip"
"testing"
"github.com/stretchr/testify/require"
)
// TestRequestAddresses_Validate test fix issue RM#5617
func TestRequestAddresses_Validate(t *testing.T) {
ra := make(RequestAddresses, 0, 3)
ra = append(ra, RequestAddress{
Addr: netip.MustParseAddr("1.2.3.4"),
Provided: false,
})
ra = append(ra, RequestAddress{
Addr: netip.MustParseAddr("1.2.3.4"),
Provided: true,
})
ra = append(ra, RequestAddress{
Addr: netip.MustParseAddr("4.3.2.1"),
Provided: false,
})
ra = append(ra, RequestAddress{
Addr: netip.MustParseAddr("4.3.2.1"),
Provided: false,
})
require.True(t, ra.Validate())
require.Equal(t, 2, len(ra))
}
+9 -2
View File
@@ -4,6 +4,7 @@ import (
"errors"
"net/http"
"net/netip"
"strings"
"github.com/sot-tech/mochi/bittorrent"
"github.com/sot-tech/mochi/frontend"
@@ -149,8 +150,14 @@ func requestedIPs(r *http.Request, p bittorrent.Params, opts ParseOptions) (addr
}
}
if ipStr := r.Header.Get(opts.RealIPHeader); ipStr != "" && opts.RealIPHeader != "" {
addresses.Add(parseRequestAddress(ipStr, false))
if ipValues := r.Header.Values(opts.RealIPHeader); len(ipValues) > 0 && opts.RealIPHeader != "" {
for _, ipStr := range ipValues {
for _, ipStr := range strings.Split(ipStr, ",") {
if ipStr = strings.TrimSpace(ipStr); len(ipStr) > 0 {
addresses.Add(parseRequestAddress(ipStr, false))
}
}
}
} else {
addrPort, _ := netip.ParseAddrPort(r.RemoteAddr)
addresses.Add(bittorrent.RequestAddress{