package main import ( "log" "net" "reflect" "strings" ) func (vD VirtualDomain) DomainExists() bool { query := Db.Where("name = ?", vD.Name).Find(&vD) if query.Error != nil { log.Println("Info: Query error.", query.Error) return false } if vD.Name == "" { return false } return true } func (vD VirtualDomain) CreateDomain() bool { if !Db.NewRecord(vD) { log.Println("Info: Creating new record failed.", vD.Name) return false } query := Db.Create(&vD) if query.Error != nil { log.Println("Info: Query error.", query.Error) return false } return true } // TODO: Needs better handling with multiple IPs. func (vD VirtualDomain) ValidateDomain(ref string) bool { log.Println("Info: Validating " + vD.Name) if vD.Name == "" { return false } addr, err := net.LookupIP(vD.Name) if err != nil { log.Println("Info: ", vD.Name+" "+err.Error()) return false } if len(addr) == 0 { return false } serverIP, err := net.LookupIP(ref) if err != nil { log.Println("Info: ", ref+" "+err.Error()) return false } return reflect.DeepEqual(serverIP, addr) } func (vD VirtualDomain) ValidateDomainMX(ref string) bool { log.Println("Info: Validating MX " + vD.Name) var isValid bool = false // Has the domain an MX entry pointing to this server? if vD.Name == "" { log.Println("Info: Empty domain.") return false } // All the MX entries for the desired domain. mx, err := net.LookupMX(vD.Name) if err != nil { log.Println("Info: Lookup error " + vD.Name + " " + err.Error()) return false } // Our IPs. serverIPs, err := net.LookupIP(ref) if err != nil { log.Println("Info: Lookup error for server " + ref + " " + err.Error()) return false } // We loop over MX entries, each one has a host field. for _, v := range mx { // Each host field may have multiple IPs. mxIPs, err := net.LookupIP(v.Host) if err != nil { log.Println("Info: ", err) } // Our server has probably more than one IP as well... for _, serverIP := range serverIPs { // ... thus we need to compare all of them. for _, mxIP := range mxIPs { if string(serverIP) == string(mxIP) { isValid = true } } } } return isValid } // Returns the last fragment from a string splitted by '@'. func GetDomain(email string) string { fragments := strings.Split(email, "@") return fragments[len(fragments)-1] } func (vD VirtualDomain) GetPrimaryKey() int64 { Db.Find(&vD) return vD.Id }