Replace reference to "github.com/eaigner/dkim" which no longer exists

This commit is contained in:
Eric Billingsley 2021-09-29 11:44:40 -07:00
parent b5f17a69f6
commit 24056bf10d
3 changed files with 66 additions and 31 deletions

View file

@ -3,40 +3,38 @@ package main
import ( import (
"bytes" "bytes"
"crypto"
"crypto/x509"
"encoding/pem"
"flag" "flag"
"io/ioutil" "io/ioutil"
"log" "log"
"net/smtp" "net/smtp"
"github.com/chrj/smtpd" "github.com/chrj/smtpd"
"github.com/eaigner/dkim" "github.com/emersion/go-msgauth/dkim"
) )
var ( var (
welcomeMsg = flag.String("welcome", "DKIM-proxy ESMTP ready.", "Welcome message for SMTP session") welcomeMsg = flag.String("welcome", "DKIM-proxy ESMTP ready.", "Welcome message for SMTP session")
inAddr = flag.String("inaddr", "localhost:10025", "Address to listen for incoming SMTP on") inAddr = flag.String("inaddr", "localhost:10025", "Address to listen for incoming SMTP on")
outAddr = flag.String("outaddr", "localhost:25", "Address to deliver outgoing SMTP on") outAddr = flag.String("outaddr", "localhost:25", "Address to deliver outgoing SMTP on")
privKeyFile = flag.String("key", "", "Private key file.") privKeyFile = flag.String("key", "", "PEM encoded RSA private key file.")
dkimS = flag.String("s", "default", "DKIM selector") dkimS = flag.String("s", "default", "DKIM selector")
dkimD = flag.String("d", "", "DKIM domain") dkimD = flag.String("d", "", "DKIM domain")
dkimConf dkim.Conf dkimOptions *dkim.SignOptions
privKey []byte
) )
func handler(peer smtpd.Peer, env smtpd.Envelope) error { func handler(peer smtpd.Peer, env smtpd.Envelope) error {
d, err := dkim.New(dkimConf, privKey) out := bytes.NewBuffer(nil)
if err != nil { in := bytes.NewBuffer(bytes.Replace(env.Data, []byte("\n"), []byte("\r\n"), -1))
log.Printf("DKIM error: %v", err)
return smtpd.Error{450, "Internal server error"}
}
// The dkim package expects \r\n newlines, so replace to that // The dkim package expects \r\n newlines, so replace to that
data, err := d.Sign(bytes.Replace(env.Data, []byte("\n"), []byte("\r\n"), -1)) err := dkim.Sign(out, in, dkimOptions)
if err != nil { if err != nil {
log.Printf("DKIM signing error: %v", err) log.Printf("DKIM signing error: %v", err)
return smtpd.Error{450, "Internal server error"} return smtpd.Error{Code: 450, Message: "Internal server error"}
} }
return smtp.SendMail( return smtp.SendMail(
@ -44,30 +42,35 @@ func handler(peer smtpd.Peer, env smtpd.Envelope) error {
nil, nil,
env.Sender, env.Sender,
env.Recipients, env.Recipients,
data, out.Bytes(),
) )
} }
func getSigner() crypto.Signer {
privKey, err := ioutil.ReadFile(*privKeyFile)
if err != nil {
log.Fatalf("Couldn't read private key: %v", err)
}
pemBlock, _ := pem.Decode(privKey)
if pemBlock == nil {
log.Fatalf("Couldn't decode private key: %v", err)
}
rsa, err := x509.ParsePKCS1PrivateKey(pemBlock.Bytes)
if err != nil {
log.Fatalf("Couldn't parse as RSA private key: %v", err)
}
return rsa
}
func main() { func main() {
flag.Parse() flag.Parse()
var err error dkimOptions = &dkim.SignOptions{
Domain: *dkimD,
dkimConf, err = dkim.NewConf(*dkimD, *dkimS) Selector: *dkimS,
if err != nil { Signer: getSigner(),
log.Fatalf("DKIM configuration error: %v", err)
}
privKey, err = ioutil.ReadFile(*privKeyFile)
if err != nil {
log.Fatalf("Couldn't read private key: %v", err)
}
_, err = dkim.New(dkimConf, privKey)
if err != nil {
log.Fatalf("DKIM error: %v", err)
} }
server := &smtpd.Server{ server := &smtpd.Server{

5
go.mod
View file

@ -2,4 +2,7 @@ module github.com/chrj/smtpd
go 1.14 go 1.14
require github.com/eaigner/dkim v0.0.0-20150301120808-6fe4a7ee9cfb require (
github.com/emersion/go-msgauth v0.6.5
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
)

33
go.sum
View file

@ -1,2 +1,31 @@
github.com/eaigner/dkim v0.0.0-20150301120808-6fe4a7ee9cfb h1:17kQ+7S0aEyRhZd9KCAofvKlL1N1/w+zUZKaxpLFpM0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/eaigner/dkim v0.0.0-20150301120808-6fe4a7ee9cfb/go.mod h1:FSCIHbrqk7D01Mj8y/jW+NS1uoCerr+ad+IckTHTFf4= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/emersion/go-message v0.11.2/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
github.com/emersion/go-message v0.14.1/go.mod h1:N1JWdZQ2WRUalmdHAX308CWBq747VJ8oUorFI3VCBwU=
github.com/emersion/go-milter v0.3.2/go.mod h1:ablHK0pbLB83kMFBznp/Rj8aV+Kc3jw8cxzzmCNLIOY=
github.com/emersion/go-msgauth v0.6.5 h1:UaXBtrjYBM3SWw9BBODeSp0uYtScx3CuIF7/RQfkeWo=
github.com/emersion/go-msgauth v0.6.5/go.mod h1:/jbQISFJgtT12T8akRs20l+wI4HcyN/kWy7VRdHEAmA=
github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5-0.20201125200606-c27b9fd57aec/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=