blob: 6454eb450b73d9f6c20650ee271c416ca05f7dbc [file] [log] [blame]
package main
import (
"bufio"
"crypto/tls"
"flag"
"fmt"
"os"
"github.com/emersion/go-sasl"
"github.com/emersion/go-smtp"
)
var config = flag.String("config", "/etc/maddy/config/smtp-servers.conf", "Path to the configuration file with downstream SMTP server addresses per line.")
func readConfig(path string) ([]string, error) {
inp, err := os.Open(path)
if err != nil {
return nil, err
}
defer inp.Close()
lines := bufio.NewScanner(inp)
ret := make([]string, 0)
for lines.Scan() {
ret = append(ret, lines.Text())
}
if err := lines.Err(); err != nil {
return nil, err
}
return ret, nil
}
func auth(server, username, password string) (bool, error) {
c, err := smtp.Dial(server)
if err != nil {
return false, err
}
if err := c.StartTLS(&tls.Config{InsecureSkipVerify: true}); err != nil {
return false, err
}
if err := c.Auth(sasl.NewPlainClient(username, username, password)); err != nil {
return false, err
}
return true, nil
}
func main() {
flag.Parse()
inp := bufio.NewReader(os.Stdin)
username, err := inp.ReadString('\n')
if err != nil {
fmt.Fprintln(os.Stderr, "Could not read username")
os.Exit(2)
}
username = username[:len(username)-1]
password, err := inp.ReadString('\n')
if err != nil {
fmt.Fprintln(os.Stderr, "Could not read password")
os.Exit(2)
}
password = password[:len(password)-1]
smtpServers, err := readConfig(*config)
if err != nil {
fmt.Println(err.Error())
os.Exit(2)
}
for _, s := range smtpServers {
if ok, _ := auth(s, username, password); ok {
os.Exit(0)
// } else if err != nil {
// fmt.Println(os.Stderr, err.Error())
// os.Exit(2)
}
}
os.Exit(1)
}