mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
chore: validate email addresses with dns
This commit is contained in:
parent
ef5b49ebd8
commit
a1444bca8c
@ -4,6 +4,7 @@ import (
|
|||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"fmt"
|
"fmt"
|
||||||
conf "github.com/muety/wakapi/config"
|
conf "github.com/muety/wakapi/config"
|
||||||
|
"github.com/muety/wakapi/utils"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -190,8 +191,9 @@ func ValidatePassword(password string) bool {
|
|||||||
return len(password) >= 6
|
return len(password) >= 6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ValidateEmail checks that, if an email address is given, it has proper syntax and (if not in dev mode) an MX record exists for the domain
|
||||||
func ValidateEmail(email string) bool {
|
func ValidateEmail(email string) bool {
|
||||||
return email == "" || mailRegex.Match([]byte(email))
|
return email == "" || (mailRegex.Match([]byte(email)) && (conf.Get().IsDev() || utils.CheckEmailMX(email)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func ValidateTimezone(tz string) bool {
|
func ValidateTimezone(tz string) bool {
|
||||||
|
@ -178,7 +178,7 @@ func (h *SettingsHandler) actionUpdateUser(w http.ResponseWriter, r *http.Reques
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !payload.IsValid() {
|
if !payload.IsValid() {
|
||||||
return http.StatusBadRequest, "", "invalid parameters"
|
return http.StatusBadRequest, "", "invalid parameters - perhaps invalid e-mail address?"
|
||||||
}
|
}
|
||||||
|
|
||||||
if payload.Email == "" && user.HasActiveSubscription() {
|
if payload.Email == "" && user.HasActiveSubscription() {
|
||||||
|
55
scripts/email_checker.go
Normal file
55
scripts/email_checker.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
// Usage example:
|
||||||
|
// cat emails.txt go run email_checker.go > result.txt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const MailPattern = "[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+"
|
||||||
|
|
||||||
|
var mailRegex *regexp.Regexp
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
mailRegex = regexp.MustCompile(MailPattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckEmailMX(email string) bool {
|
||||||
|
parts := strings.Split(email, "@")
|
||||||
|
if len(parts) != 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
records, err := net.LookupMX(parts[1])
|
||||||
|
return len(records) > 0 && err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ValidateEmail(email string) bool {
|
||||||
|
return mailRegex.Match([]byte(email)) && CheckEmailMX(email)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
for scanner.Scan() {
|
||||||
|
email := scanner.Text()
|
||||||
|
if email == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ValidateEmail(email) {
|
||||||
|
fmt.Printf("[+] %s\n", email)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("[-] %s\n", email)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
16
utils/dns.go
Normal file
16
utils/dns.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CheckEmailMX takes an e-mail address and verifies that an MX DNS record exists for its domain
|
||||||
|
func CheckEmailMX(email string) bool {
|
||||||
|
parts := strings.Split(email, "@")
|
||||||
|
if len(parts) != 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
records, err := net.LookupMX(parts[1])
|
||||||
|
return len(records) > 0 && err == nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user