diff --git a/mxrouter.go b/mxrouter.go index dec7b1b..7eebcc8 100644 --- a/mxrouter.go +++ b/mxrouter.go @@ -13,12 +13,12 @@ package main import ( + "flag" "fmt" "log" "log/syslog" "net" "os" - "flag" "strings" "sync" @@ -27,11 +27,11 @@ import ( ) const ( - version = "0.8" + version = "0.9.1" ) var ( - logstream *syslog.Writer + logstream *syslog.Writer mutex sync.Mutex debug *bool listen *string @@ -39,9 +39,12 @@ var ( ldapBaseDN *string ldapUser *string ldapPass *string + defDomain *string ) func handleConnection(connClt net.Conn, conLdap *ldap.Conn) { + var s string + var mxdom string buf := make([]byte, 1024) defer connClt.Close() @@ -75,7 +78,11 @@ func handleConnection(connClt net.Conn, conLdap *ldap.Conn) { mxslic := strings.Split(mxs[0].Host, ".") // les MXs terminent par '.', on le retire - mxdom := strings.Join(mxslic[len(mxslic)-3:len(mxslic)-1], ".") + if mxs[0].Host[len(mxs[0].Host)-1] == '.' { + mxdom = strings.Join(mxslic[len(mxslic)-3:len(mxslic)-1], ".") + } else { + mxdom = strings.Join(mxslic[len(mxslic)-2:len(mxslic)], ".") + } filter := fmt.Sprintf("(dc=%s)", ldap.EscapeFilter(mxdom)) searchReq := ldap.NewSearchRequest(*ldapBaseDN, ldap.ScopeWholeSubtree, 0, 0, 0, @@ -104,7 +111,12 @@ func handleConnection(connClt net.Conn, conLdap *ldap.Conn) { if *debug { logstream.Debug("Got result, returning " + result.Entries[0].Attributes[0].Values[0]) } - s := strings.Replace(fmt.Sprintf("FILTER relay:[%s]", result.Entries[0].Attributes[0].Values[0]), " ", "%20", -1) + // Check if result is a FQDN, if not append defDomain + if strings.Contains(string(result.Entries[0].Attributes[0].Values[0]), ".") { + s = strings.Replace(fmt.Sprintf("FILTER relay:[%s]", result.Entries[0].Attributes[0].Values[0]), " ", "%20", -1) + } else { + s = strings.Replace(fmt.Sprintf("FILTER relay:[%s]", fmt.Sprintf("%s.%s", result.Entries[0].Attributes[0].Values[0], *defDomain)), " ", "%20", -1) + } connClt.Write([]byte(fmt.Sprintf("200 %s\n", s))) } else { if *debug { @@ -147,14 +159,15 @@ func run() { func main() { var e error - fs := flag.NewFlagSet("mxrouter", flag.ExitOnError) - listen = fs.String("listen-addr", "127.0.0.1:8080", "listen address for server (also via LISTEN env var)") - debug = fs.Bool("debug", false, "log debug information (also via DEBUG env var)") - ldapURL = fs.String("ldap", "", "LDAP Server URL (also via LDAP env var)") - ldapBaseDN = fs.String("ldapDN", "", "LDAP base DN (also via LDAPDN env var)") - ldapUser = fs.String("ldapUser", "", "LDAP user DN (also via LDAPUSER env var)") - ldapPass = fs.String("ldapPass", "", "LDAP user password (also via LDAPPASS env var)") - _ = fs.String("config", "", "config file (optional)") + fs := flag.NewFlagSet("mxrouter", flag.ExitOnError) + listen = fs.String("listen-addr", "127.0.0.1:8080", "listen address for server (also via LISTEN env var)") + debug = fs.Bool("debug", false, "log debug information (also via DEBUG env var)") + ldapURL = fs.String("ldap", "", "LDAP Server URL (also via LDAP env var)") + ldapBaseDN = fs.String("ldapDN", "", "LDAP base DN (also via LDAPDN env var)") + ldapUser = fs.String("ldapUser", "", "LDAP user DN (also via LDAPUSER env var)") + ldapPass = fs.String("ldapPass", "", "LDAP user password (also via LDAPPASS env var)") + defDomain = fs.String("domain", "", "Domain to add to relay name if not a FQDN (also via DOMAIN env var)") + _ = fs.String("config", "", "config file (optional)") // Surcharge de la fonction Usage() fs.Usage = func() { @@ -164,7 +177,7 @@ func main() { } ff.Parse(fs, os.Args[1:], ff.WithEnvVarNoPrefix(), ff.WithConfigFileFlag("config"), ff.WithConfigFileParser(ff.PlainParser)) - if len(*ldapURL) == 0 || len(*ldapBaseDN) == 0 || len (*ldapUser) == 0 || len(*ldapPass) == 0 { + if len(*ldapURL) == 0 || len(*ldapBaseDN) == 0 || len(*ldapUser) == 0 || len(*ldapPass) == 0 { fs.Usage() return }