valid_email2 3.7.0 → 4.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'activemodel', '~> 7.0'
4
+
5
+ gemspec path: '../'
@@ -20,9 +20,10 @@ module ValidEmail2
20
20
  @prohibited_domain_characters_regex = val
21
21
  end
22
22
 
23
- def initialize(address)
23
+ def initialize(address, dns_timeout = 5)
24
24
  @parse_error = false
25
25
  @raw_address = address
26
+ @dns_timeout = dns_timeout
26
27
 
27
28
  begin
28
29
  @address = Mail::Address.new(address)
@@ -37,14 +38,12 @@ module ValidEmail2
37
38
  return @valid unless @valid.nil?
38
39
  return false if @parse_error
39
40
 
40
- @valid = address.domain &&
41
- address.address == @raw_address &&
42
- valid_domain? &&
43
- valid_address?
41
+ @valid = valid_domain? && valid_address?
44
42
  end
45
43
 
46
44
  def valid_domain?
47
45
  domain = address.domain
46
+ return false if domain.nil?
48
47
 
49
48
  domain !~ self.class.prohibited_domain_characters_regex &&
50
49
  domain.include?('.') &&
@@ -55,6 +54,8 @@ module ValidEmail2
55
54
  end
56
55
 
57
56
  def valid_address?
57
+ return false if address.address != @raw_address
58
+
58
59
  !address.local.include?('..') &&
59
60
  !address.local.end_with?('.') &&
60
61
  !address.local.start_with?('.')
@@ -132,12 +133,14 @@ module ValidEmail2
132
133
 
133
134
  def mx_servers
134
135
  @mx_servers ||= Resolv::DNS.open do |dns|
136
+ dns.timeouts = @dns_timeout
135
137
  dns.getresources(address.domain, Resolv::DNS::Resource::IN::MX)
136
138
  end
137
139
  end
138
140
 
139
141
  def mx_or_a_servers
140
142
  @mx_or_a_servers ||= Resolv::DNS.open do |dns|
143
+ dns.timeouts = @dns_timeout
141
144
  (mx_servers.any? && mx_servers) ||
142
145
  dns.getresources(address.domain, Resolv::DNS::Resource::IN::A)
143
146
  end
@@ -5,14 +5,14 @@ require "active_model/validations"
5
5
  module ValidEmail2
6
6
  class EmailValidator < ActiveModel::EachValidator
7
7
  def default_options
8
- { regex: true, disposable: false, mx: false, strict_mx: false, disallow_subaddressing: false, multiple: false }
8
+ { disposable: false, mx: false, strict_mx: false, disallow_subaddressing: false, multiple: false, dns_timeout: 5 }
9
9
  end
10
10
 
11
11
  def validate_each(record, attribute, value)
12
12
  return unless value.present?
13
13
  options = default_options.merge(self.options)
14
14
 
15
- addresses = sanitized_values(value).map { |v| ValidEmail2::Address.new(v) }
15
+ addresses = sanitized_values(value).map { |v| ValidEmail2::Address.new(v, options[:dns_timeout]) }
16
16
 
17
17
  error(record, attribute) && return unless addresses.all?(&:valid?)
18
18
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal:true
2
2
 
3
3
  module ValidEmail2
4
- VERSION = "3.7.0"
4
+ VERSION = "4.0.6"
5
5
  end
@@ -9,15 +9,20 @@ whitelisted_emails = %w(
9
9
  onet.pl poczta.onet.pl fastmail.fm hushmail.com
10
10
  hush.ai hush.com hushmail.me naver.com qq.com example.com
11
11
  yandex.net gmx.com gmx.es webdesignspecialist.com.au vp.com
12
+ onit.com asics.com freemail.hu 139.com mail2world.com slmail.me
12
13
  )
13
14
 
14
15
  existing_emails = File.open("config/disposable_email_domains.txt") { |f| f.read.split("\n") }
15
16
 
16
- url = "https://raw.githubusercontent.com/FGRibreau/mailchecker/master/list.txt"
17
- resp = Net::HTTP.get_response(URI.parse(url))
17
+ remote_emails = [
18
+ "https://raw.githubusercontent.com/FGRibreau/mailchecker/master/list.txt",
19
+ "https://raw.githubusercontent.com/disposable/disposable-email-domains/master/domains.txt",
20
+ ].flat_map do |url|
21
+ resp = Net::HTTP.get_response(URI.parse(url))
18
22
 
19
- remote_emails = resp.body.split("\n").flatten - whitelisted_emails
23
+ resp.body.split("\n").flatten
24
+ end
20
25
 
21
- result_emails = (existing_emails + remote_emails).map(&:strip).uniq.sort
26
+ result_emails = (existing_emails + remote_emails).map(&:strip).uniq.sort - whitelisted_emails
22
27
 
23
- File.open("config/disposable_email_domains.txt", "w") {|f| f.write result_emails.join("\n") }
28
+ File.open("config/disposable_email_domains.txt", "w") { |f| f.write result_emails.join("\n") }
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe ValidEmail2::Address do
6
+ describe "#valid?" do
7
+ it "is valid" do
8
+ address = described_class.new("foo@bar123.com")
9
+ expect(address.valid?).to be true
10
+ end
11
+
12
+ it "is invalid if email is nil" do
13
+ address = described_class.new(nil)
14
+ expect(address.valid?).to be false
15
+ end
16
+
17
+ it "is invalid if email is empty" do
18
+ address = described_class.new(" ")
19
+ expect(address.valid?).to be false
20
+ end
21
+
22
+ it "is invalid if domain is missing" do
23
+ address = described_class.new("foo")
24
+ expect(address.valid?).to be false
25
+ end
26
+
27
+ it "is invalid if email cannot be parsed" do
28
+ address = described_class.new("<>")
29
+ expect(address.valid?).to be false
30
+ end
31
+
32
+ it "is invalid if email contains emoticons" do
33
+ address = described_class.new("foo🙈@gmail.com")
34
+ expect(address.valid?).to be false
35
+ end
36
+ end
37
+ end
data/valid_email2.gemspec CHANGED
@@ -21,9 +21,10 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = ">= 1.9.3"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 2.0"
24
- spec.add_development_dependency "rake", "~> 12.3.3"
25
- spec.add_development_dependency "rspec", "~> 3.5.0"
24
+ spec.add_development_dependency "rake", "~> 12.3"
25
+ spec.add_development_dependency "rspec", "~> 3.5"
26
26
  spec.add_development_dependency "rspec-benchmark", "~> 0.6"
27
+ spec.add_development_dependency "net-smtp"
27
28
  spec.add_development_dependency "pry"
28
29
  spec.add_runtime_dependency "mail", "~> 2.5"
29
30
  spec.add_runtime_dependency "activemodel", ">= 3.2"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: valid_email2
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.0
4
+ version: 4.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micke Lisinge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-26 00:00:00.000000000 Z
11
+ date: 2023-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 12.3.3
33
+ version: '12.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 12.3.3
40
+ version: '12.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 3.5.0
47
+ version: '3.5'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 3.5.0
54
+ version: '3.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec-benchmark
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: net-smtp
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -116,8 +130,8 @@ executables: []
116
130
  extensions: []
117
131
  extra_rdoc_files: []
118
132
  files:
133
+ - ".github/workflows/ci.yaml"
119
134
  - ".gitignore"
120
- - ".travis.yml"
121
135
  - CHANGELOG.md
122
136
  - Gemfile
123
137
  - LICENSE.txt
@@ -129,11 +143,13 @@ files:
129
143
  - gemfiles/activemodel4.gemfile
130
144
  - gemfiles/activemodel5.gemfile
131
145
  - gemfiles/activemodel6.gemfile
146
+ - gemfiles/activemodel7.gemfile
132
147
  - lib/valid_email2.rb
133
148
  - lib/valid_email2/address.rb
134
149
  - lib/valid_email2/email_validator.rb
135
150
  - lib/valid_email2/version.rb
136
151
  - pull_mailchecker_emails.rb
152
+ - spec/address_spec.rb
137
153
  - spec/benchmark_spec.rb
138
154
  - spec/spec_helper.rb
139
155
  - spec/valid_email2_spec.rb
@@ -157,12 +173,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
173
  - !ruby/object:Gem::Version
158
174
  version: '0'
159
175
  requirements: []
160
- rubygems_version: 3.2.3
176
+ rubygems_version: 3.4.1
161
177
  signing_key:
162
178
  specification_version: 4
163
179
  summary: ActiveModel validation for email. Including MX lookup and disposable email
164
180
  blacklist
165
181
  test_files:
182
+ - spec/address_spec.rb
166
183
  - spec/benchmark_spec.rb
167
184
  - spec/spec_helper.rb
168
185
  - spec/valid_email2_spec.rb
data/.travis.yml DELETED
@@ -1,21 +0,0 @@
1
- language: ruby
2
-
3
- sudo: false
4
-
5
- rvm:
6
- - 3.0
7
- - 2.7
8
- - 2.6
9
- - 2.5
10
-
11
- gemfile:
12
- - gemfiles/activemodel5.gemfile
13
- - gemfiles/activemodel6.gemfile
14
-
15
- jobs:
16
- exclude:
17
- - rvm: 3.0
18
- gemfile: gemfiles/activemodel5.gemfile
19
-
20
- before_install:
21
- - gem install bundler