filter_rspamd.go
author Sunil Nimmagadda <sunil@nimmagadda.net>
Fri, 26 Jul 2019 12:15:53 +0500
changeset 4 9fc3f303d39a
parent 3 0b7061027b64
permissions -rw-r--r--
Return TempFail on errors. gilles@ pointed out that a TempFail suffices in case of HTTP POST failure to rspamd instead of bringing down the daemon.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     1
// Copyright (c) 2019 Sunil Nimmagadda <sunil@nimmagadda.net>
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     2
//
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     3
// Permission to use, copy, modify, and distribute this software for any
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     4
// purpose with or without fee is hereby granted, provided that the above
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     5
// copyright notice and this permission notice appear in all copies.
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     6
//
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     7
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     8
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     9
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    10
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    11
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    12
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    13
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    14
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    15
package main
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    16
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    17
import (
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    18
	"bufio"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    19
	"encoding/json"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    20
	"fmt"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    21
	"log"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    22
	"net/http"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    23
	"net/mail"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    24
	"os"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    25
	"strings"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    26
)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    27
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    28
const rspamdURL = "http://localhost:11333/checkv2"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    29
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    30
var stdout *log.Logger
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    31
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    32
type session struct {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    33
	ch      <-chan string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    34
	control map[string]string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    35
	id      string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    36
	payload *strings.Builder
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    37
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    38
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    39
type rspamdResponse struct {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    40
	Score         float32
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    41
	RequiredScore float32 `json:"required_score"`
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    42
	Subject       string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    43
	Action        string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    44
	DKIMSig       string `json:"dkim-signature"`
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    45
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    46
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    47
func linkConnect(s *session, args []string) {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    48
	rdns, laddr := args[6], args[8]
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    49
	s.control["Pass"] = "all"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    50
	p := strings.Split(laddr, ":")
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    51
	if p[0] != "local" {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    52
		s.control["Ip"] = p[0]
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    53
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    54
	if rdns != "" {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    55
		s.control["Hostname"] = rdns
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    56
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    57
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    58
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    59
func linkIdentify(s *session, args []string) {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    60
	s.control["Helo"] = args[6]
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    61
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    62
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    63
func txBegin(s *session, args []string) {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    64
	s.control["Queue-Id"] = args[6]
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    65
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    66
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    67
func txMail(s *session, args []string) {
2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 1
diff changeset
    68
	mailFrom, status := args[7], args[8]
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    69
	if status == "ok" {
2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 1
diff changeset
    70
		s.control["From"] = mailFrom
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    71
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    72
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    73
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    74
func txRcpt(s *session, args []string) {
2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 1
diff changeset
    75
	rcptTo, status := args[7], args[8]
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    76
	if status == "ok" {
2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 1
diff changeset
    77
		s.control["Rcpt"] = rcptTo
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    78
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    79
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    80
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    81
func txData(s *session, args []string) {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    82
	status := args[7]
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    83
	if status == "ok" {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    84
		s.control = nil
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    85
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    86
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    87
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    88
func txCleanup(s *session, args []string) {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    89
	s.control = nil
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    90
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    91
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    92
func filterCommit(s *session, args []string) {
1
8a09170cd1e0 Adapt https://marc.info/?l=openbsd-cvs&m=154752781911243&w=2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
    93
	token := args[6]
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    94
	reason := <-s.ch
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    95
	if reason != "" {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    96
		stdout.Printf("filter-result|%s|%s|reject|%s\n",
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    97
			token, s.id, reason)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    98
		return
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    99
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   100
	stdout.Printf("filter-result|%s|%s|proceed\n", token, s.id)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   101
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   102
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   103
func filterDataLine(s *session, args []string) {
1
8a09170cd1e0 Adapt https://marc.info/?l=openbsd-cvs&m=154752781911243&w=2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   104
	token, line := args[6], args[7]
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   105
	if line != "." {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   106
		s.payload.WriteString(line)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   107
		s.payload.WriteString("\n")
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   108
		return
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   109
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   110
	s.ch = dataOutput(s.control, token, s.id, s.payload.String())
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   111
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   112
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   113
func rspamdPost(hdrs map[string]string, data string) (*rspamdResponse, error) {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   114
	r := strings.NewReader(data)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   115
	client := &http.Client{}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   116
	req, err := http.NewRequest("POST", rspamdURL, r)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   117
	if err != nil {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   118
		return nil, err
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   119
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   120
	for k, v := range hdrs {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   121
		req.Header.Add(k, v)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   122
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   123
	resp, err := client.Do(req)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   124
	if err != nil {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   125
		return nil, err
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   126
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   127
	defer resp.Body.Close()
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   128
	rr := &rspamdResponse{}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   129
	if err := json.NewDecoder(resp.Body).Decode(rr); err != nil {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   130
		return nil, err
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   131
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   132
	return rr, nil
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   133
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   134
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   135
func dataOutput(headers map[string]string,
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   136
	token, id, data string) <-chan string {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   137
	ch := make(chan string)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   138
	go func() {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   139
		resp, err := rspamdPost(headers, data)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   140
		if err != nil {
4
9fc3f303d39a Return TempFail on errors.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 3
diff changeset
   141
			ch <- "421 Temporary failure"
9fc3f303d39a Return TempFail on errors.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 3
diff changeset
   142
			return
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   143
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   144
		log.Printf("%v\n", resp)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   145
		m, err := mail.ReadMessage(strings.NewReader(data))
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   146
		if err != nil {
4
9fc3f303d39a Return TempFail on errors.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 3
diff changeset
   147
			ch <- "421 Temporary failure"
9fc3f303d39a Return TempFail on errors.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 3
diff changeset
   148
			return
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   149
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   150
		rejectReason := ""
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   151
		switch resp.Action {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   152
		case "add header":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   153
			m.Header["X-Spam"] = []string{"yes"}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   154
			m.Header["X-Spam-Score"] = []string{
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   155
				fmt.Sprintf("%v / %v",
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   156
					resp.Score, resp.RequiredScore)}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   157
		case "rewrite subject":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   158
			m.Header["Subject"] = []string{resp.Subject}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   159
		case "reject":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   160
			rejectReason = "550 message rejected"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   161
		case "greylist":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   162
			rejectReason = "421 greylisted"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   163
		case "soft reject":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   164
			rejectReason = "451 try again later"
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   165
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   166
		// Write DKIM-Signature header first if present
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   167
		if resp.DKIMSig != "" {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   168
			stdout.Printf("filter-dataline|%s|%s|%s: %s\n",
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   169
				token, id, "DKIM-Signature", resp.DKIMSig)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   170
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   171
		// preserve order?
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   172
		for k, v := range m.Header {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   173
			stdout.Printf("filter-dataline|%s|%s|%s: %s\n",
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   174
				token, id, k, strings.Join(v, ","))
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   175
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   176
		// Blank line seperates headers and body
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   177
		stdout.Printf("filter-dataline|%s|%s|\n", token, id)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   178
		s := bufio.NewScanner(m.Body)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   179
		for s.Scan() {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   180
			stdout.Printf("filter-dataline|%s|%s|%s\n",
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   181
				token, id, s.Text())
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   182
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   183
		stdout.Printf("filter-dataline|%s|%s|%s\n", token, id, ".")
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   184
		ch <- rejectReason
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   185
	}()
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   186
	return ch
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   187
}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   188
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   189
func main() {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   190
	log.SetFlags(0)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   191
	log.SetPrefix("filter_rspamd: ")
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   192
	stdout = log.New(os.Stdout, "", 0)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   193
	registry := map[string]struct {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   194
		kind string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   195
		fn   func(*session, []string)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   196
	}{
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   197
		"link-connect":    {"report", linkConnect},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   198
		"link-disconnect": {"report", nil},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   199
		"link-identify":   {"report", linkIdentify},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   200
		"tx-begin":        {"report", txBegin},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   201
		"tx-data":         {"report", txData},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   202
		"tx-mail":         {"report", txMail},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   203
		"tx-rcpt":         {"report", txRcpt},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   204
		"tx-commit":       {"report", txCleanup},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   205
		"tx-rollback":     {"report", txCleanup},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   206
		"commit":          {"filter", filterCommit},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   207
		"data-line":       {"filter", filterDataLine},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   208
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   209
	for k, v := range registry {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   210
		fmt.Printf("register|%s|smtp-in|%s\n", v.kind, k)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   211
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   212
	fmt.Println("register|ready")
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   213
	sessions := map[string]*session{}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   214
	var event, id string
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   215
	stdin := bufio.NewScanner(os.Stdin)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   216
	for stdin.Scan() {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   217
		fields := strings.Split(stdin.Text(), "|")
1
8a09170cd1e0 Adapt https://marc.info/?l=openbsd-cvs&m=154752781911243&w=2
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 0
diff changeset
   218
		event, id = fields[4], fields[5]
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   219
		switch event {
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   220
		case "link-disconnect":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   221
			delete(sessions, id)
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   222
		case "link-connect":
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   223
			sessions[id] = &session{
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   224
				control: map[string]string{},
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   225
				id:      id,
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   226
				payload: &strings.Builder{}}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   227
			fallthrough
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   228
		default:
3
0b7061027b64 Check if session is still valid.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 2
diff changeset
   229
			if sessions[id] != nil {
0b7061027b64 Check if session is still valid.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 2
diff changeset
   230
				registry[event].fn(sessions[id], fields)
0b7061027b64 Check if session is still valid.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 2
diff changeset
   231
			}
0
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   232
		}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   233
	}
7671ae88de2a Initial import.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   234
}