Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,26 @@ USER_ID=`id -u`
USER_GROUP=`id -g`

VERSION_PATH := go-email-validator@v0.0.0-20210126185018-3b48def577e4
MOUNT_PATH := `go env GOMODCACHE`/github.com/go-email-validator/

GITHUB_VENDOR := /github.com/go-email-validator/

MOUNT_PATH := `go env GOMODCACHE`$(GITHUB_VENDOR)
mount:
rm -fr $(MOUNT_PATH)$(VERSION_PATH)
mkdir -p $(MOUNT_PATH)$(VERSION_PATH)
sudo mount -Br ~/go/src/github.com/go-email-validator/go-email-validator/ $(MOUNT_PATH)$(VERSION_PATH)

GO_1_15_6 := /home/qz/go/go1.15.6
GO_1_15_6_PATH := $(GO_1_15_6)/src$(GITHUB_VENDOR)

mount.go.1.15.6: umount.go.1.15.6
rm -fr $(GO_1_15_6_PATH)
mkdir -p $(GO_1_15_6_PATH)
sudo mount -Br ~/go/src/github.com/go-email-validator/ $(GO_1_15_6_PATH)

umount.go.1.15.6:
sudo umount $(GO_1_15_6_PATH) -q | exit 0

go.build:
go build ./pkg/...

Expand Down Expand Up @@ -75,7 +89,7 @@ docker.push.latest:
docker push $(DOCKER_USER)/$(IMAGE):latest


HEROKU_APP_NAME=evapi
HEROKU_APP_NAME=ev-eu

heroku.docker: heroku.docker.web heroku.docker.tor

Expand Down
19 changes: 4 additions & 15 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,23 @@ require (
github.com/awslabs/aws-lambda-go-api-proxy v0.9.0
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b
github.com/dgraph-io/ristretto v0.0.3
github.com/eko/gocache v1.1.1
github.com/eko/gocache v1.2.0
github.com/emirpasic/gods v1.12.0
github.com/getkin/kin-openapi v0.36.0
github.com/go-email-validator/go-email-validator v0.0.0-20210207114938-eab6e55cd754
github.com/go-email-validator/go-email-validator v0.0.0-20210523140307-54e1e9a9c7ff
github.com/go-openapi/swag v0.19.13 // indirect
github.com/gobuffalo/envy v1.9.0 // indirect
github.com/gobuffalo/packr v1.30.1 // indirect
github.com/gobuffalo/packr/v2 v2.8.1 // indirect
github.com/gofiber/fiber/v2 v2.3.3
github.com/golang/mock v1.4.4
github.com/karrick/godirwalk v1.16.1 // indirect
github.com/golang/mock v1.5.0
github.com/klauspost/compress v1.11.7 // indirect
github.com/prometheus/procfs v0.3.0 // indirect
github.com/rakyll/statik v0.1.7
github.com/rogpeppe/go-internal v1.7.0 // indirect
github.com/sirupsen/logrus v1.7.0 // indirect
github.com/spf13/cobra v1.1.1
github.com/stretchr/testify v1.7.0
github.com/tevino/abool v1.2.0
github.com/tidwall/gjson v1.6.7
github.com/valyala/fasthttp v1.19.0 // indirect
github.com/vmihailenco/msgpack v4.0.4+incompatible
go.uber.org/zap v1.16.0
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect
golang.org/x/sys v0.0.0-20210123231150-1d476976d117 // indirect
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect
golang.org/x/net v0.0.0-20210521195947-fe42d452be8f // indirect
golang.org/x/tools v0.1.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
)
200 changes: 114 additions & 86 deletions go.sum

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions pkg/api/v1/presenter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/go-email-validator/go-email-validator/pkg/ev/evmail"
"github.com/go-email-validator/go-email-validator/pkg/ev/evsmtp"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/as_email_verifier"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/check_if_email_exist"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/converter"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/mailboxvalidator"
Expand Down Expand Up @@ -69,6 +70,11 @@ func NewMultiplePresentersDefault(checkerDTO evsmtp.CheckerDTO, opts Options) pr
}

return presentation.NewValidationPresenter(map[converter.Name]presentation.Interface{
as_email_verifier.Name: presentation.NewPresenter(
evmail.FromString,
as_email_verifier.NewDepValidator(smtpValidator),
as_email_verifier.NewDepConverterDefault(),
),
check_if_email_exist.Name: presentation.NewPresenter(
evmail.FromString,
check_if_email_exist.NewDepValidator(smtpValidator),
Expand Down
7 changes: 7 additions & 0 deletions pkg/presentation/as_email_verifier/adapter/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module github.com/go-email-validator/go-ev-presenters/pkg/presentation/as_email_verifier/adapter

go 1.15

require (
github.com/AfterShip/email-verifier v1.0.3
)
45 changes: 45 additions & 0 deletions pkg/presentation/as_email_verifier/adapter/result.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package adapter

import (
emailverifier "github.com/AfterShip/email-verifier"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/as_email_verifier"
)

func ResultAdaption(presentation as_email_verifier.DepPresentation) emailverifier.Result {
var smtp *emailverifier.SMTP

if presentation.SMTP == nil {
smtp = &emailverifier.SMTP{
HostExists: presentation.SMTP.HostExists,
FullInbox: presentation.SMTP.FullInbox,
CatchAll: presentation.SMTP.CatchAll,
Deliverable: presentation.SMTP.Deliverable,
Disabled: presentation.SMTP.Disabled,
}
}

var gravatar *emailverifier.Gravatar
if presentation.Gravatar == nil {
gravatar = &emailverifier.Gravatar{
HasGravatar: presentation.Gravatar.HasGravatar,
GravatarUrl: presentation.Gravatar.GravatarUrl,
}
}

return emailverifier.Result{
Email: presentation.Email,
Disposable: presentation.Disposable,
Reachable: presentation.Reachable.String(),
RoleAccount: presentation.RoleAccount,
Free: presentation.Free,
Syntax: &emailverifier.Syntax{
Username: presentation.Syntax.Username,
Domain: presentation.Syntax.Domain,
Valid: presentation.Syntax.Valid,
},
HasMxRecords: presentation.HasMxRecords,
SMTP: smtp,
Gravatar: gravatar,
Suggestion: presentation.Suggestion,
}
}
57 changes: 57 additions & 0 deletions pkg/presentation/as_email_verifier/cmd/dep_test_generator/gen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package main

import (
"encoding/json"
emailverifier "github.com/AfterShip/email-verifier"
"github.com/emirpasic/gods/sets/hashset"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/converter"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/presentation_test"
"log"
"os"
)

// TODO DRY for gen fixtures
func main() {
var err error
emails := converter.EmailsForTests()
deps := make([]interface{}, len(emails))

verifier := emailverifier.NewVerifier().
EnableGravatarCheck().
EnableSMTPCheck()
// .EnableDomainSuggest()

incorrectGravatar := hashset.New(
"amazedfuckporno@gmail.com",
"theofanis.giot2is@12pm.gr",
"asdasd@tradepro.net",
"credit@mail.ru",
"admin@gmail.com",
)

for i, email := range emails {
verifyResult, _ := verifier.Verify(email)

if incorrectGravatar.Contains(email) {
verifyResult.Gravatar.HasGravatar = false
verifyResult.Gravatar.GravatarUrl = ""
}

deps[i] = verifyResult
}

f, err := os.Create(presentation_test.DefaultDepFixtureFile)
die(err)
defer f.Close()

bytes, err := json.MarshalIndent(deps, "", " ")
die(err)
_, err = f.Write(bytes)
die(err)
}

func die(err error) {
if err != nil {
log.Fatal(err)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module github.com/go-email-validator/go-ev-presenters/pkg/presentation/as_email_verifier/cmd/dep_test_generator

go 1.15

require (
github.com/AfterShip/email-verifier v1.0.3
github.com/emirpasic/gods v1.12.0
github.com/go-email-validator/go-ev-presenters v0.0.0-20210516144511-b255aab093f8
)
134 changes: 134 additions & 0 deletions pkg/presentation/as_email_verifier/dep.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package as_email_verifier

import (
"github.com/go-email-validator/go-email-validator/pkg/ev"
"github.com/go-email-validator/go-email-validator/pkg/ev/evmail"
"github.com/go-email-validator/go-ev-presenters/pkg/presentation/converter"
"regexp"
)

const (
Name converter.Name = "AfterShipEmailVerifier"

EmailRegexString = "^(?:(?:(?:(?:[a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(?:\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|(?:(?:\\x22)(?:(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(?:\\x20|\\x09)+)?(?:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(\\x20|\\x09)+)?(?:\\x22))))@(?:(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
)

type DepPresentation struct {
Email string `json:"email"`
Reachable Reachable `json:"reachable"`
Syntax *SyntaxPresentation `json:"syntax"`
SMTP *SmtpPresentation `json:"smtp"`
Gravatar *GravatarPresentation `json:"gravatar"`
Suggestion string `json:"suggestion"`
Disposable bool `json:"disposable"`
RoleAccount bool `json:"role_account"`
Free bool `json:"free"`
HasMxRecords bool `json:"has_mx_records"`
}

type DepConverter struct {
converter converter.CompositeConverter
calculateReachable FuncReachable
}

func NewDepConverterDefault() DepConverter {
return NewDepConverter(
converter.NewCompositeConverter(converter.MapConverters{
ev.SMTPValidatorName: converter.NewSMTPConverter(),
ev.SyntaxValidatorName: SyntaxConverter{},
ev.GravatarValidatorName: GravatarConverter{},
}),
CalculateReachable,
)
}

func NewDepConverter(converter converter.CompositeConverter, calculateReachable FuncReachable) DepConverter {
return DepConverter{converter, calculateReachable}
}

func (DepConverter) Can(_ evmail.Address, result ev.ValidationResult, _ converter.Options) bool {
return result.ValidatorName() == ev.DepValidatorName
}

func (s DepConverter) Convert(email evmail.Address, resultInterface ev.ValidationResult, opts converter.Options) interface{} {
depResult := resultInterface.(ev.DepValidationResult)
validationResults := depResult.GetResults()

var syntax *SyntaxPresentation
var smtp *SmtpPresentation
var gravatar *GravatarPresentation
mxResult := validationResults[ev.MXValidatorName].(ev.MXValidationResult)
for _, validatorResult := range depResult.GetResults() {
if !s.converter.Can(email, validatorResult, opts) {
continue
}

switch v := s.converter.Convert(email, validatorResult, opts).(type) {
case *SyntaxPresentation:
syntax = v
case converter.SmtpPresentation:
smtp = &SmtpPresentation{
HostExists: v.CanConnectSmtp,
FullInbox: v.HasFullInbox,
CatchAll: v.IsCatchAll,
Deliverable: !v.IsCatchAll && v.IsDeliverable,
Disabled: v.IsDisabled,
}
case *GravatarPresentation:
gravatar = v
}
}

depPresentation := DepPresentation{
Email: email.String(),
Reachable: ReachableUnknown,
Syntax: syntax,
}

if syntax == nil || !syntax.Valid {
return depPresentation
}

depPresentation.Free = !validationResults[ev.FreeValidatorName].IsValid()
depPresentation.RoleAccount = !validationResults[ev.RoleValidatorName].IsValid()
depPresentation.Disposable = !validationResults[ev.DisposableValidatorName].IsValid()

if depPresentation.Disposable {
return depPresentation
}

if !mxResult.IsValid() {
return depPresentation
}

depPresentation.HasMxRecords = len(mxResult.MX()) > 0

if smtp == nil || !smtp.HostExists {
return depPresentation
}

depPresentation.SMTP = smtp
depPresentation.Reachable = s.calculateReachable(depPresentation)

if gravatar != nil {
depPresentation.Gravatar = gravatar
}

return depPresentation
}

func NewDepValidator(smtpValidator ev.Validator) ev.Validator {
builder := ev.NewDepBuilder(nil)
if smtpValidator == nil {
smtpValidator = builder.Get(ev.SMTPValidatorName)
}

return ev.NewDepBuilder(nil).Set(
ev.SyntaxValidatorName,
ev.NewSyntaxRegexValidator(regexp.MustCompile(EmailRegexString)),
).
Set(ev.GravatarValidatorName, ev.NewGravatarValidator()).
Set(ev.SMTPValidatorName, smtpValidator).
Set(ev.FreeValidatorName, ev.FreeDefaultValidator()).
Build()
}
Loading