-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpostArticle.go
115 lines (102 loc) · 3.49 KB
/
postArticle.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"path/filepath"
"regexp"
"strings"
"time"
"github.com/Tensai75/nntp"
"github.com/Tensai75/nzbparser"
)
func articlePoster() {
for {
select {
case <-ctx.Done():
return // Error somewhere, terminate
default: // Default is must to avoid blocking
chunk, ok := <-outputChunksChan
if !ok {
return
}
select {
case <-ctx.Done():
return // Error somewhere, terminate
default: // Default is must to avoid blocking
func() {
defer chunksWG.Done()
var (
segment nzbparser.NzbSegment
article nntp.Article
partType string
partNumber uint64
totalDownloadSize uint64
nxgHeader string
err error
)
if filepath.Ext(chunk.Filename) == ".par2" {
partType = "par2"
totalDownloadSize = totalParSize
partNumber = parPartCounter.inc()
} else {
partType = "data"
totalDownloadSize = totalDataSize
partNumber = dataPartCounter.inc()
}
segment.Number = int(chunk.PartNumber)
md5Hash := GetSHA256Hash(fmt.Sprintf("%v:%v:%v", chunk.Nzb.Comment, partType, partNumber))
segment.Id = md5Hash[:40] + "@" + md5Hash[40:61] + "." + md5Hash[61:]
article.Header = make(map[string][]string)
subject := ""
poster := ""
if conf.Obfuscate {
subject = GetSHA256Hash(md5Hash)
} else {
if conf.MakeRar && conf.ObfuscateRar {
filenameReplace := regexp.MustCompile(`^[^.]*(.*)$`)
filename := filenameReplace.ReplaceAllString(chunk.Filename, nzb.Comment+"$1")
subject = fmt.Sprintf("[%v/%v] \"%s\" yEnc (%v/%v)", chunk.FileNumber, chunk.TotalFiles, filename, chunk.PartNumber, chunk.TotalParts)
} else {
subject = fmt.Sprintf("[%v/%v] %v - \"%s\" yEnc (%v/%v)", chunk.FileNumber, chunk.TotalFiles, nzb.Comment, chunk.Filename, chunk.PartNumber, chunk.TotalParts)
}
}
if conf.Obfuscate && conf.ObfuscatePoster {
posterHash := GetSHA256Hash(subject)
poster = posterHash[10:25] + "@" + posterHash[30:45] + "." + posterHash[50:53]
} else {
poster = conf.Poster
}
//x-nxg header
if nxgHeader, err = encrypt(fmt.Sprintf("%v:%v:%v:%v:%v", chunk.FileNumber, chunk.TotalFiles, chunk.Filename, partType, totalDownloadSize), nzb.Comment); err != nil {
Log.Warn("Unable to encrypt NxG header: %v", err)
}
article.Header["Subject"] = append(article.Header["Subject"], subject)
article.Header["Date"] = append(article.Header["Date"], time.Now().Format(time.RFC1123))
article.Header["From"] = append(article.Header["From"], poster)
article.Header["Message-ID"] = append(article.Header["Message-ID"], "<"+segment.Id+">")
article.Header["Path"] = append(article.Header["Path"], "")
article.Header["Newsgroups"] = append(article.Header["Groups"], strings.Join(chunk.Nzb.Files[chunk.FileNumber-1].Groups, ","))
article.Header["X-Nxg"] = append(article.Header["X-Nxg"], nxgHeader)
article.Body = &chunk.Part
segment.Bytes = chunk.Part.Len()
for _, header := range article.Header {
segment.Bytes += len(header[0])
}
chunksWG.Add(1)
articlesChan <- Article{
Segment: &segment,
Nzb: chunk.Nzb,
Article: article,
FileNo: chunk.FileNumber,
}
}()
}
}
}
}
func GetSHA256Hash(text string) string {
hasher := sha256.New()
hasher.Write([]byte(text))
return hex.EncodeToString(hasher.Sum(nil))
}