mirror of
https://github.com/sot-tech/mochi.git
synced 2026-05-14 04:08:36 -07:00
frontend: update to use non-object sanization
This commit is contained in:
@@ -1,61 +0,0 @@
|
||||
package bittorrent
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// ErrInvalidIP indicates an invalid IP for an Announce.
|
||||
var ErrInvalidIP = ClientError("invalid IP")
|
||||
|
||||
// RequestSanitizer is used to replace unreasonable values in requests parsed
|
||||
// from a frontend into sane values.
|
||||
type RequestSanitizer struct {
|
||||
MaxNumWant uint32 `yaml:"max_numwant"`
|
||||
DefaultNumWant uint32 `yaml:"default_numwant"`
|
||||
MaxScrapeInfoHashes uint32 `yaml:"max_scrape_infohashes"`
|
||||
}
|
||||
|
||||
// SanitizeAnnounce enforces a max and default NumWant and coerces the peer's
|
||||
// IP address into the proper format.
|
||||
func (rs *RequestSanitizer) SanitizeAnnounce(r *AnnounceRequest) error {
|
||||
if !r.NumWantProvided {
|
||||
r.NumWant = rs.DefaultNumWant
|
||||
} else if r.NumWant > rs.MaxNumWant {
|
||||
r.NumWant = rs.MaxNumWant
|
||||
}
|
||||
|
||||
if ip := r.Peer.IP.To4(); ip != nil {
|
||||
r.Peer.IP.IP = ip
|
||||
r.Peer.IP.AddressFamily = IPv4
|
||||
} else if len(r.Peer.IP.IP) == net.IPv6len { // implies r.Peer.IP.To4() == nil
|
||||
r.Peer.IP.AddressFamily = IPv6
|
||||
} else {
|
||||
return ErrInvalidIP
|
||||
}
|
||||
|
||||
log.Debug("sanitized announce", rs, r)
|
||||
return nil
|
||||
}
|
||||
|
||||
// SanitizeScrape enforces a max number of infohashes for a single scrape
|
||||
// request.
|
||||
func (rs *RequestSanitizer) SanitizeScrape(r *ScrapeRequest) error {
|
||||
if len(r.InfoHashes) > int(rs.MaxScrapeInfoHashes) {
|
||||
r.InfoHashes = r.InfoHashes[:rs.MaxScrapeInfoHashes]
|
||||
}
|
||||
|
||||
log.Debug("sanitized scrape", rs, r)
|
||||
return nil
|
||||
}
|
||||
|
||||
// LogFields renders the request sanitizer's configuration as a set of loggable
|
||||
// fields.
|
||||
func (rs *RequestSanitizer) LogFields() log.Fields {
|
||||
return log.Fields{
|
||||
"maxNumWant": rs.MaxNumWant,
|
||||
"defaultNumWant": rs.DefaultNumWant,
|
||||
"maxScrapeInfohashes": rs.MaxScrapeInfoHashes,
|
||||
}
|
||||
}
|
||||
48
bittorrent/sanitize.go
Normal file
48
bittorrent/sanitize.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package bittorrent
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/chihaya/chihaya/pkg/log"
|
||||
)
|
||||
|
||||
// ErrInvalidIP indicates an invalid IP for an Announce.
|
||||
var ErrInvalidIP = ClientError("invalid IP")
|
||||
|
||||
// SanitizeAnnounce enforces a max and default NumWant and coerces the peer's
|
||||
// IP address into the proper format.
|
||||
func SanitizeAnnounce(r *AnnounceRequest, maxNumWant, defaultNumWant uint32) error {
|
||||
if !r.NumWantProvided {
|
||||
r.NumWant = defaultNumWant
|
||||
} else if r.NumWant > maxNumWant {
|
||||
r.NumWant = maxNumWant
|
||||
}
|
||||
|
||||
if ip := r.Peer.IP.To4(); ip != nil {
|
||||
r.Peer.IP.IP = ip
|
||||
r.Peer.IP.AddressFamily = IPv4
|
||||
} else if len(r.Peer.IP.IP) == net.IPv6len { // implies r.Peer.IP.To4() == nil
|
||||
r.Peer.IP.AddressFamily = IPv6
|
||||
} else {
|
||||
return ErrInvalidIP
|
||||
}
|
||||
|
||||
log.Debug("sanitized announce", r, log.Fields{
|
||||
"maxNumWant": maxNumWant,
|
||||
"defaultNumWant": defaultNumWant,
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
// SanitizeScrape enforces a max number of infohashes for a single scrape
|
||||
// request.
|
||||
func SanitizeScrape(r *ScrapeRequest, maxScrapeInfoHashes uint32) error {
|
||||
if len(r.InfoHashes) > int(maxScrapeInfoHashes) {
|
||||
r.InfoHashes = r.InfoHashes[:maxScrapeInfoHashes]
|
||||
}
|
||||
|
||||
log.Debug("sanitized scrape", r, log.Fields{
|
||||
"maxScrapeInfoHashes": maxScrapeInfoHashes,
|
||||
})
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user