Skip to content

Commit e445b19

Browse files
authored
Merge pull request #43 from shaohme/master
new attempt at rspamd http over unix socket.
2 parents c8db5cb + 2cee6d3 commit e445b19

File tree

2 files changed

+61
-19
lines changed

2 files changed

+61
-19
lines changed

filter-rspamd.go

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -316,24 +316,34 @@ func rspamdTempFail(s *session, token string, log string) {
316316

317317
func rspamdQuery(s *session, token string) {
318318
var client *http.Client
319+
var req *http.Request
319320

320321
r := strings.NewReader(strings.Join(s.tx.message, "\n"))
321322

322323
if len(unixSocketPath) > 0 {
323-
client = &http.Client{
324-
Transport: &http.Transport{
325-
DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
326-
return net.Dial("unix", unixSocketPath)
327-
},
328-
},
324+
tr := new(http.Transport)
325+
tr.DisableCompression = true
326+
tr.Dial = nil
327+
tr.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) {
328+
var u_addr *net.UnixAddr
329+
var err error
330+
network := "unix"
331+
u_addr, err = net.ResolveUnixAddr(network, unixSocketPath)
332+
if err != nil {
333+
rspamdTempFail(s, token, fmt.Sprintf("failed to resolve unix path '%s': %v\n", unixSocketPath, err))
334+
return nil, err
335+
} else {
336+
return net.DialUnix(network, nil, u_addr)
337+
}
329338
}
339+
client = &http.Client{Transport: tr}
330340
} else {
331341
client = &http.Client{}
332342
}
333-
334-
req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkv2", *rspamdURL), r)
343+
var err error
344+
req, err = http.NewRequest("POST", fmt.Sprintf("%s/checkv2", *rspamdURL), r)
335345
if err != nil {
336-
rspamdTempFail(s, token, "failed to initialize HTTP request")
346+
rspamdTempFail(s, token, fmt.Sprintf("failed to initialize HTTP request. err: '%s'", err))
337347
return
338348
}
339349

@@ -370,15 +380,15 @@ func rspamdQuery(s *session, token string) {
370380

371381
resp, err := client.Do(req)
372382
if err != nil {
373-
rspamdTempFail(s, token, "failed to receive a response from daemon")
383+
rspamdTempFail(s, token, fmt.Sprintf("failed to receive a response from daemon. err: '%s'", err))
374384
return
375385
}
376386

377387
defer resp.Body.Close()
378388

379389
rr := &rspamd{}
380390
if err := json.NewDecoder(resp.Body).Decode(rr); err != nil {
381-
rspamdTempFail(s, token, "failed to decode JSON response")
391+
rspamdTempFail(s, token, fmt.Sprintf("failed to decode JSON response, err: '%s'", err))
382392
return
383393
}
384394

@@ -563,6 +573,7 @@ func trigger(actions map[string]func(*session, []string), atoms []string) {
563573
func skipConfig(scanner *bufio.Scanner) {
564574
for {
565575
if !scanner.Scan() {
576+
log.Print("no more lines to scan for skipping. exiting...")
566577
os.Exit(0)
567578
}
568579
line := scanner.Text()
@@ -578,20 +589,48 @@ func main() {
578589

579590
flag.Parse()
580591

581-
if strings.HasPrefix(*rspamdURL, "/") {
592+
if err := PledgePromises("stdio rpath inet dns unix unveil"); err != nil {
593+
log.Fatalf("pledge promise err: %s", err)
594+
}
595+
596+
if err := Unveil("/etc/resolv.conf", "r"); err != nil {
597+
log.Fatalf("unveil resolv err: %s", err)
598+
}
599+
600+
if err := Unveil("/etc/hosts", "r"); err != nil {
601+
log.Fatalf("unveil hosts err: %s", err)
602+
}
603+
604+
if !strings.HasPrefix(*rspamdURL, "http") {
582605
unixSocketPath = *rspamdURL
583606
*rspamdURL = "http://localhost"
607+
608+
if err := Unveil(unixSocketPath, "rw"); err != nil {
609+
log.Fatalf("unveil '%s' err: %s", unixSocketPath, err)
610+
}
611+
612+
if _, err := os.Stat(unixSocketPath); err != nil {
613+
log.Fatalf("unix socket stat '%s' err: '%s'", unixSocketPath, err)
614+
}
615+
616+
c, err := net.Dial("unix", unixSocketPath)
617+
if err != nil {
618+
log.Fatalf("unix socket connect '%s' err: '%s'", unixSocketPath, err)
619+
}
620+
c.Close()
584621
}
585622

586-
PledgePromises("stdio rpath inet dns unix unveil")
587-
Unveil("/etc/resolv.conf", "r")
588-
Unveil("/etc/hosts", "r")
589-
UnveilBlock()
623+
if err := UnveilBlock(); err != nil {
624+
log.Fatalf("unveil block err: %s", err)
625+
}
590626

627+
log.Println("reading line scanner")
591628
scanner := bufio.NewScanner(os.Stdin)
592629

630+
log.Println("reading lines until ready")
593631
skipConfig(scanner)
594632

633+
log.Println("responding desired filters")
595634
filterInit()
596635

597636
outputChannel = make(chan string)
@@ -601,15 +640,18 @@ func main() {
601640
}
602641
}()
603642

643+
atom_len := 6
644+
604645
for {
605646
if !scanner.Scan() {
647+
log.Print("no more lines to scan. exiting...")
606648
os.Exit(0)
607649
}
608650

609651
line := scanner.Text()
610652
atoms := strings.Split(line, "|")
611-
if len(atoms) < 6 {
612-
log.Fatalf("missing atoms: %s", line)
653+
if len(atoms) < atom_len {
654+
log.Fatalf("missing atoms. expected %d. got %d: %s", atom_len, len(atoms), line)
613655
}
614656

615657
version = atoms[1]

pledge.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ func Unveil(path string, flags string) error {
1212

1313
func UnveilBlock() error {
1414
return nil
15-
}
15+
}

0 commit comments

Comments
 (0)