Send the HELO hostname to the HeloChecker.
This commit is contained in:
parent
46b3a7668e
commit
97b38af3b4
5 changed files with 15 additions and 10 deletions
3
.hgignore
Normal file
3
.hgignore
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
syntax: glob
|
||||||
|
|
||||||
|
*.orig
|
|
@ -19,7 +19,7 @@ func ExampleServer() {
|
||||||
|
|
||||||
Addr: "0.0.0.0:10025",
|
Addr: "0.0.0.0:10025",
|
||||||
|
|
||||||
HeloChecker: func(peer smtpd.Peer) error {
|
HeloChecker: func(peer smtpd.Peer, name string) error {
|
||||||
if !strings.HasPrefix(peer.Addr.String(), "42.42.42.42:") {
|
if !strings.HasPrefix(peer.Addr.String(), "42.42.42.42:") {
|
||||||
return errors.New("Denied")
|
return errors.New("Denied")
|
||||||
}
|
}
|
||||||
|
|
11
protocol.go
11
protocol.go
|
@ -98,16 +98,15 @@ func (session *session) handleHELO(cmd command) {
|
||||||
session.envelope = nil
|
session.envelope = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
session.peer.HeloName = cmd.fields[1]
|
|
||||||
|
|
||||||
if session.server.HeloChecker != nil {
|
if session.server.HeloChecker != nil {
|
||||||
err := session.server.HeloChecker(session.peer)
|
err := session.server.HeloChecker(session.peer, cmd.fields[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.error(err)
|
session.error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.peer.HeloName = cmd.fields[1]
|
||||||
session.reply(250, "Go ahead")
|
session.reply(250, "Go ahead")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -126,16 +125,16 @@ func (session *session) handleEHLO(cmd command) {
|
||||||
session.envelope = nil
|
session.envelope = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
session.peer.HeloName = cmd.fields[1]
|
|
||||||
|
|
||||||
if session.server.HeloChecker != nil {
|
if session.server.HeloChecker != nil {
|
||||||
err := session.server.HeloChecker(session.peer)
|
err := session.server.HeloChecker(session.peer, cmd.fields[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.error(err)
|
session.error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.peer.HeloName = cmd.fields[1]
|
||||||
|
|
||||||
extensions := session.extensions()
|
extensions := session.extensions()
|
||||||
|
|
||||||
if len(extensions) > 1 {
|
if len(extensions) > 1 {
|
||||||
|
|
2
smtpd.go
2
smtpd.go
|
@ -34,7 +34,7 @@ type Server struct {
|
||||||
// If an error is returned, it will be reported in the SMTP session.
|
// If an error is returned, it will be reported in the SMTP session.
|
||||||
// Use the Error struct for access to error codes.
|
// Use the Error struct for access to error codes.
|
||||||
ConnectionChecker func(peer Peer) error // Called upon new connection.
|
ConnectionChecker func(peer Peer) error // Called upon new connection.
|
||||||
HeloChecker func(peer Peer) error // Called after HELO/EHLO.
|
HeloChecker func(peer Peer, name string) error // Called after HELO/EHLO.
|
||||||
SenderChecker func(peer Peer, addr string) error // Called after MAIL FROM.
|
SenderChecker func(peer Peer, addr string) error // Called after MAIL FROM.
|
||||||
RecipientChecker func(peer Peer, addr string) error // Called after each RCPT TO.
|
RecipientChecker func(peer Peer, addr string) error // Called after each RCPT TO.
|
||||||
|
|
||||||
|
|
|
@ -378,7 +378,10 @@ func TestHELOCheck(t *testing.T) {
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
server := &smtpd.Server{
|
server := &smtpd.Server{
|
||||||
HeloChecker: func(peer smtpd.Peer) error {
|
HeloChecker: func(peer smtpd.Peer, name string) error {
|
||||||
|
if name != "foobar.local" {
|
||||||
|
t.Fatal("Wrong HELO name")
|
||||||
|
}
|
||||||
return smtpd.Error{Code: 552, Message: "Denied"}
|
return smtpd.Error{Code: 552, Message: "Denied"}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -392,7 +395,7 @@ func TestHELOCheck(t *testing.T) {
|
||||||
t.Fatalf("Dial failed: %v", err)
|
t.Fatalf("Dial failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.Hello("localhost"); err == nil {
|
if err := c.Hello("foobar.local"); err == nil {
|
||||||
t.Fatal("Unexpected HELO success")
|
t.Fatal("Unexpected HELO success")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue