7 Commits

Author SHA1 Message Date
ai aae34c04f4 добавить заголовок seen для mirror-to 2023-03-05 14:20:01 +03:00
ai d0f6547da9 добавить заголовки для mirror-to 2023-03-05 12:42:54 +03:00
ai 1987653574 добавить заголовки 2023-03-05 12:35:03 +03:00
ai eb9d4943e8 fix format string 2023-02-25 21:22:24 +03:00
ai 5bcfec0eaa fix format string 2023-02-25 21:02:57 +03:00
ai aa8f9a4987 константы вместо переменных 2023-02-23 22:59:24 +03:00
ai 6f9ef2c770 исправлено описание 2023-02-23 22:32:14 +03:00
3 changed files with 58 additions and 10 deletions
+2 -2
View File
@@ -2,8 +2,8 @@
export GOPATH="${HOME}/src/rspamd-cgp"
# если на целевой ОС не совпадает glibc, то собираем без зависимостей
# результирующий файл, скорее всего, получится медленнее и большего размера
# если на целевой ОС не совпадает glibc, то собираем без зависимостей.
# результирующий файл, возможно, получится медленнее и большего размера.
export CGO_ENABLED=0
if [ "$1" == "fmt" ]; then
+54 -6
View File
@@ -146,30 +146,39 @@ func Message(filename string) (from string, rcpts []string, auth string, ip stri
return
}
func MirrorTo(seq int, to []string, headers []string, mirrorDiscard bool) {
hdrs := replaceSpecChars(strings.Join(headers, "\n"))
func MirrorTo(seq int, qid int, to []string, headers []string, body []byte, mirrorDiscard bool) {
if protocol >= 4 {
if len(to) > 0 {
seenHdr, err := makeSeen(body)
if err != nil {
Failure(seq, qid, err)
return
}
headers = append(headers, seenHdr)
hdrs := replaceSpecChars(strings.Join(headers, "\n"))
mirrorTo := []string{}
for _, m := range to {
mirrorTo = append(mirrorTo, fmt.Sprintf("MIRRORTO \"%s\"", m))
}
if mirrorDiscard {
Putline("%d %s DISCARD\n", seq, strings.Join(mirrorTo, " "))
Putline("%d ADDHEADER \"%s\" %s DISCARD\n", seq, hdrs, strings.Join(mirrorTo, " "))
} else {
Putline("%d %s ADDHEADER \"%s\" OK\n", seq, strings.Join(mirrorTo, " "), hdrs)
Putline("%d ADDHEADER \"%s\" %s OK\n", seq, hdrs, strings.Join(mirrorTo, " "))
}
} else {
hdrs := replaceSpecChars(strings.Join(headers, "\n"))
Putline("%d ADDHEADER \"%s\" OK\n", seq, hdrs)
}
} else {
hdrs := replaceSpecChars(strings.Join(headers, "\n"))
Putline("%d ADDHEADER \"%s\"\n", seq, hdrs)
}
}
@@ -221,6 +230,13 @@ func RewriteSubject(seq int, headers []string, subject string, qid int, from str
}
}
for _, hdr = range headers {
_, err = fh.WriteString(hdr)
if err != nil {
goto fin
}
}
m = bufio.NewReader(bytes.NewReader(body))
for {
@@ -411,7 +427,7 @@ func isSeen(m *bufio.Reader) (seen bool, err error) {
}
if hdr == "\n" {
// конец заголовка
// конец RFC5322 заголовка
break
}
@@ -435,6 +451,38 @@ func isSeen(m *bufio.Reader) (seen bool, err error) {
return
}
func makeSeen(body []byte) (seenhdr string, err error) {
var hdr string
m := bufio.NewReader(bytes.NewReader(body))
for {
hdr, err = getHeader(m)
if err == io.EOF {
err = nil
if len(hdr) == 0 {
break
}
}
if err != nil {
return
}
if hdr == "\n" {
break
}
if strings.HasPrefix(hdr, recvHdr) {
seenhdr = fmt.Sprintf("%s %x", seenHdr, sha256.Sum224([]byte(nospace(hdr))))
break
}
}
return
}
func nospace(s string) string {
var b strings.Builder
+2 -2
View File
@@ -16,7 +16,7 @@ import (
"git.vsu.ru/ai/rspamd-cgp/config"
)
var (
const (
headerJunkG string = "X-Junk-Score: [XX]"
headerJunkA string = "X-Junk-Score: [XXXX]"
headerJunkR string = "X-Junk-Score: [XXXXXXXXXX]"
@@ -152,7 +152,7 @@ func Scan(seq int, filename string) {
cgp.Discard(seq)
case "quarantine":
cgp.MirrorTo(seq, mirrorTo, append(headers, headerJunkR), mirrorDiscard)
cgp.MirrorTo(seq, qid, mirrorTo, append(headers, headerJunkR), body, mirrorDiscard)
case "reject":
cgp.AddHeader(seq, append(headers, headerJunkR))