Support banning torrents
This commit is contained in:
parent
fb2b626175
commit
362dfecbf2
65
client.go
65
client.go
@ -137,6 +137,7 @@ type Client struct {
|
|||||||
dHT *dht.Server
|
dHT *dht.Server
|
||||||
disableUTP bool
|
disableUTP bool
|
||||||
ipBlockList *iplist.IPList
|
ipBlockList *iplist.IPList
|
||||||
|
bannedTorrents map[InfoHash]struct{}
|
||||||
|
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
event sync.Cond
|
event sync.Cond
|
||||||
@ -287,11 +288,15 @@ func (cl *Client) TorrentReadAt(ih InfoHash, off int64, p []byte) (n int, err er
|
|||||||
return t.Data.ReadAt(p, off)
|
return t.Data.ReadAt(p, off)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cl *Client) configDir() string {
|
||||||
|
return filepath.Join(os.Getenv("HOME"), ".config/torrent")
|
||||||
|
}
|
||||||
|
|
||||||
func (cl *Client) setEnvBlocklist() (err error) {
|
func (cl *Client) setEnvBlocklist() (err error) {
|
||||||
filename := os.Getenv("TORRENT_BLOCKLIST_FILE")
|
filename := os.Getenv("TORRENT_BLOCKLIST_FILE")
|
||||||
defaultBlocklist := filename == ""
|
defaultBlocklist := filename == ""
|
||||||
if defaultBlocklist {
|
if defaultBlocklist {
|
||||||
filename = filepath.Join(os.Getenv("HOME"), ".config/torrent/blocklist")
|
filename = filepath.Join(cl.configDir(), "blocklist")
|
||||||
}
|
}
|
||||||
f, err := os.Open(filename)
|
f, err := os.Open(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -323,6 +328,39 @@ func (cl *Client) setEnvBlocklist() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cl *Client) initBannedTorrents() error {
|
||||||
|
f, err := os.Open(filepath.Join(cl.configDir(), "banned_infohashes"))
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("error opening banned infohashes file: %s", err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
scanner := bufio.NewScanner(f)
|
||||||
|
cl.bannedTorrents = make(map[InfoHash]struct{})
|
||||||
|
for scanner.Scan() {
|
||||||
|
var ihs string
|
||||||
|
n, err := fmt.Sscanf(scanner.Text(), "%x", &ihs)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error reading infohash: %s", err)
|
||||||
|
}
|
||||||
|
if n != 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(ihs) != 20 {
|
||||||
|
return errors.New("bad infohash")
|
||||||
|
}
|
||||||
|
var ih InfoHash
|
||||||
|
CopyExact(&ih, ihs)
|
||||||
|
cl.bannedTorrents[ih] = struct{}{}
|
||||||
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
return fmt.Errorf("error scanning file: %s", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewClient(cfg *Config) (cl *Client, err error) {
|
func NewClient(cfg *Config) (cl *Client, err error) {
|
||||||
if cfg == nil {
|
if cfg == nil {
|
||||||
cfg = &Config{}
|
cfg = &Config{}
|
||||||
@ -348,6 +386,11 @@ func NewClient(cfg *Config) (cl *Client, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = cl.initBannedTorrents(); err != nil {
|
||||||
|
err = fmt.Errorf("error initing banned torrents: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.PeerID != "" {
|
if cfg.PeerID != "" {
|
||||||
CopyExact(&cl.peerID, cfg.PeerID)
|
CopyExact(&cl.peerID, cfg.PeerID)
|
||||||
} else {
|
} else {
|
||||||
@ -1316,6 +1359,26 @@ func (me *Client) AddPeers(infoHash InfoHash, peers []Peer) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cl *Client) torrentFileCachePath(ih InfoHash) string {
|
||||||
|
return filepath.Join(cl.configDir(), "torrents", ih.HexString()+".torrent")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cl *Client) saveTorrentFile(t *torrent) error {
|
||||||
|
path := cl.torrentFileCachePath(t.InfoHash)
|
||||||
|
os.MkdirAll(filepath.Dir(path), 0777)
|
||||||
|
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error opening file: %s", err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
e := bencode.NewEncoder(f)
|
||||||
|
err = e.Encode(t.MetaInfo())
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error marshalling metainfo: %s", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (cl *Client) setMetaData(t *torrent, md metainfo.Info, bytes []byte) (err error) {
|
func (cl *Client) setMetaData(t *torrent, md metainfo.Info, bytes []byte) (err error) {
|
||||||
err = t.setMetadata(md, cl.dataDir, bytes)
|
err = t.setMetadata(md, cl.dataDir, bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user