package auth import ( "errors" "fmt" "log" "net/http" "os" "regexp" "github.com/thebaer/burner/validate" ) // Serve starts an HTTP server that handles auth requests from nginx. func Serve(port int) error { if port <= 0 { return errors.New("auth server: Invalid port number.") } serverPort = port mailInfo := log.New(os.Stdout, "", log.Ldate|log.Ltime) mailInfo.Printf("Starting mail auth server on :%d", serverPort) http.HandleFunc("/auth", authHandler) http.ListenAndServe(fmt.Sprintf("127.0.0.1:%d", serverPort), nil) return nil } var ( // Port that the auth server will run on. serverPort int // Regular expression for matching / finding a valid To address. smtpEmailReg = regexp.MustCompile("<(.+)>") ) // authHandler works with nginx to determine whether or not a receipient email // address is valid. If it is, running mail server's information is passed // back. func authHandler(w http.ResponseWriter, r *http.Request) { toHeader := r.Header.Get("Auth-SMTP-To") if toHeader == "" { w.Header().Set("Auth-Status", "Unrecognized receipient.") w.Header().Set("Auth-Error-Code", "550") return } to := smtpEmailReg.FindStringSubmatch(toHeader)[1] if to == "" { w.Header().Set("Auth-Status", "Unrecognized receipient.") w.Header().Set("Auth-Error-Code", "550") return } if err := validate.Email(to); err != nil { // Email address validation failed w.Header().Set("Auth-Status", err.Error()) w.Header().Set("Auth-Error-Code", "550") return } // Email passed validation, send back mail server information w.Header().Set("Auth-Status", "OK") w.Header().Set("Auth-Server", "127.0.0.1") w.Header().Set("Auth-Port", fmt.Sprintf("%d", serverPort)) }