Protected map, better check for RCPT
parent
c101731bcd
commit
71a9b231e3
|
@ -5,6 +5,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// The Backend implements SMTP server methods.
|
// The Backend implements SMTP server methods.
|
||||||
|
@ -17,6 +18,8 @@ type Backend struct {
|
||||||
|
|
||||||
var SmtpBackend *Backend
|
var SmtpBackend *Backend
|
||||||
|
|
||||||
|
var mutex = &sync.Mutex{}
|
||||||
|
|
||||||
// Load Valid Recipients
|
// Load Valid Recipients
|
||||||
func (bkd *Backend) LoadValidRecipients() error {
|
func (bkd *Backend) LoadValidRecipients() error {
|
||||||
bkd.MaxRecipients = 0
|
bkd.MaxRecipients = 0
|
||||||
|
@ -41,9 +44,13 @@ func (bkd *Backend) LoadValidRecipients() error {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks if Mail is a valid recipient
|
// Checks if Mail is a valid local recipient
|
||||||
func (bkd *Backend) CheckValidRcpt(to string) bool {
|
func (bkd *Backend) CheckValidRcpt(to string) bool {
|
||||||
|
|
||||||
|
defer mutex.Unlock()
|
||||||
|
|
||||||
|
mutex.Lock()
|
||||||
|
|
||||||
_, isValid := bkd.ValidRecipientsMap[to]
|
_, isValid := bkd.ValidRecipientsMap[to]
|
||||||
|
|
||||||
return isValid
|
return isValid
|
||||||
|
|
5
go.mod
5
go.mod
|
@ -2,7 +2,4 @@ module zangtumb
|
||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
require (
|
require github.com/amalfra/maildir v0.0.7
|
||||||
github.com/amalfra/maildir v0.0.7
|
|
||||||
github.com/emersion/go-smtp v0.12.1 // indirect
|
|
||||||
)
|
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -1,6 +1,2 @@
|
||||||
github.com/amalfra/maildir v0.0.7 h1:quK6vVGmjqP1zbeo9g7jtx37htGoYrKKlSpcDcplD04=
|
github.com/amalfra/maildir v0.0.7 h1:quK6vVGmjqP1zbeo9g7jtx37htGoYrKKlSpcDcplD04=
|
||||||
github.com/amalfra/maildir v0.0.7/go.mod h1:+ynYowCpUHTWebUhg3Sb6Jp2dq+SUSWLTSLIf7Vy+ak=
|
github.com/amalfra/maildir v0.0.7/go.mod h1:+ynYowCpUHTWebUhg3Sb6Jp2dq+SUSWLTSLIf7Vy+ak=
|
||||||
github.com/emersion/go-sasl v0.0.0-20190817083125-240c8404624e h1:ba7YsgX5OV8FjGi5ZWml8Jng6oBrJAb3ahqWMJ5Ce8Q=
|
|
||||||
github.com/emersion/go-sasl v0.0.0-20190817083125-240c8404624e/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k=
|
|
||||||
github.com/emersion/go-smtp v0.12.1 h1:1R8BDqrR2HhlGwgFYcOi+BVTvK1bMjAB65QcVpJ5sNA=
|
|
||||||
github.com/emersion/go-smtp v0.12.1/go.mod h1:SD9V/xa4ndMw77lR3Mf7htkp8RBNYuPh9UeuBs9tpUQ=
|
|
||||||
|
|
23
handler.go
23
handler.go
|
@ -4,8 +4,14 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
ZangSmtpServer.HandlerRcpt = handlerRcpt
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func mailHandler(origin net.Addr, from string, to []string, data []byte) {
|
func mailHandler(origin net.Addr, from string, to []string, data []byte) {
|
||||||
SmtpSession := new(Session)
|
SmtpSession := new(Session)
|
||||||
|
|
||||||
|
@ -28,3 +34,20 @@ func mailHandler(origin net.Addr, from string, to []string, data []byte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func handlerRcpt(remoteAddr net.Addr, from string, to string) bool {
|
||||||
|
|
||||||
|
log.Println("CHECK #2 Rcpt to:", to)
|
||||||
|
if !SmtpBackend.CheckValidRcpt(to) {
|
||||||
|
log.Printf("%s [ %s -> $s ] %s BAD!!!!", "YU NO MAIL!!! WE NU RELAY!!! ", from, to, remoteAddr.String() )
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
|
return false
|
||||||
|
}else{
|
||||||
|
log.Printf("%s [ %s -> $s ] %s GOOD!!!!", "WE DO!!!", from, to, remoteAddr.String() )
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
|
||||||
|
|
||||||
|
}
|
10
session.go
10
session.go
|
@ -1,13 +1,13 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/amalfra/maildir"
|
"github.com/amalfra/maildir"
|
||||||
)
|
)
|
||||||
|
@ -22,11 +22,7 @@ type Session struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Session) Rcpt(to string) error {
|
func (s *Session) Rcpt(to string) error {
|
||||||
log.Println("Rcpt to:", to)
|
log.Println("CHECK #1 Rcpt to:", to)
|
||||||
if !SmtpBackend.CheckValidRcpt(to) {
|
|
||||||
time.Sleep(10 * time.Second)
|
|
||||||
return errors.New("YU NO MAIL!!! WE NU RELAY")
|
|
||||||
}
|
|
||||||
s.RcptTo = to
|
s.RcptTo = to
|
||||||
if strings.Contains(to, "@") {
|
if strings.Contains(to, "@") {
|
||||||
rcptArray := strings.Split(to, "@")
|
rcptArray := strings.Split(to, "@")
|
||||||
|
|
Loading…
Reference in New Issue