validators 3.3.0 → 3.4.2

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +3 -18
  4. data/README.md +29 -24
  5. data/Rakefile +0 -1
  6. data/bin/sync-reserved-subdomains +96 -0
  7. data/data/reserved_subdomains.txt +4 -22
  8. data/lib/validators/disposable_domains.rb +18 -0
  9. data/lib/validators/disposable_emails.rb +7 -4
  10. data/lib/validators/ip.rb +6 -6
  11. data/lib/validators/locale/en.yml +5 -4
  12. data/lib/validators/locale/pt-BR.yml +7 -3
  13. data/lib/validators/tld.rb +7 -5
  14. data/lib/validators/validates_cnpj_format_of.rb +1 -2
  15. data/lib/validators/validates_cpf_format_of.rb +1 -2
  16. data/lib/validators/validates_datetime.rb +3 -2
  17. data/lib/validators/validates_email_format_of.rb +5 -5
  18. data/lib/validators/validates_ssh_private_key.rb +1 -3
  19. data/lib/validators/validates_ssh_public_key.rb +1 -3
  20. data/lib/validators/version.rb +2 -2
  21. data/lib/validators.rb +8 -1
  22. data/test/test_helper.rb +1 -2
  23. data/test/validators/disposable_email_test.rb +0 -2
  24. data/test/validators/validates_cnpj_format_of_test.rb +3 -3
  25. data/test/validators/validates_cpf_format_of_test.rb +3 -3
  26. data/test/validators/validates_email_format_of_test.rb +23 -0
  27. data/test/validators/validates_ssh_private_key/common_test.rb +3 -3
  28. data/test/validators/validates_ssh_public_key_test.rb +3 -3
  29. data/test/validators/validates_url_format_of/with_tld_validation_test.rb +18 -0
  30. data/test/validators/validates_url_format_of/without_tld_validation_test.rb +18 -0
  31. data/validators.gemspec +3 -1
  32. metadata +25 -46
  33. data/bin/sync-disposable-hostnames +0 -230
  34. data/bin/sync-tld +0 -20
  35. data/data/country_tlds.txt +0 -235
  36. data/data/disposable_domains.txt +0 -110996
  37. data/data/disposable_emails.txt +0 -38
  38. data/data/tld.txt +0 -1508
  39. data/lib/validators/disposable_hostnames.rb +0 -11
@@ -25,10 +25,8 @@ module ActiveModel
25
25
  # end
26
26
  #
27
27
  def validates_ssh_public_key(*attr_names)
28
- require "sshkey"
28
+ Validators.require_dependency! "sshkey"
29
29
  validates_with SshPublicKeyValidator, _merge_attributes(attr_names)
30
- rescue LoadError
31
- raise "sshkey is not part of the bundle. Add it to Gemfile."
32
30
  end
33
31
  end
34
32
  end
@@ -3,8 +3,8 @@
3
3
  module Validators
4
4
  module Version
5
5
  MAJOR = 3
6
- MINOR = 3
7
- PATCH = 0
6
+ MINOR = 4
7
+ PATCH = 2
8
8
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
9
9
  end
10
10
  end
data/lib/validators.rb CHANGED
@@ -7,7 +7,7 @@ module Validators
7
7
  require "validators/ip"
8
8
  require "validators/tld"
9
9
  require "validators/hostname"
10
- require "validators/disposable_hostnames"
10
+ require "validators/disposable_domains"
11
11
  require "validators/disposable_emails"
12
12
  require "validators/reserved_subdomains"
13
13
 
@@ -25,4 +25,11 @@ module Validators
25
25
  require "validators/validates_username"
26
26
 
27
27
  I18n.load_path += Dir[File.join(__dir__, "validators/locale/*.yml")]
28
+
29
+ def self.require_dependency!(dep)
30
+ require dep
31
+ rescue LoadError
32
+ raise "#{dep} is not part of the bundle. " \
33
+ "Add it to your project's Gemfile."
34
+ end
28
35
  end
data/test/test_helper.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  $VERBOSE = nil
4
4
 
5
5
  require "simplecov"
6
- SimpleCov.start
7
6
 
8
7
  SimpleCov.start do
9
8
  add_filter "test/support"
@@ -31,7 +30,7 @@ end
31
30
 
32
31
  Time.zone = "America/Sao_Paulo"
33
32
  TLDs = Validators::TLD.all.sample(10)
34
- DISPOSABLE_DOMAINS = Validators::DisposableHostnames.all.sample(10)
33
+ DISPOSABLE_DOMAINS = Validators::DisposableDomains.all.sample(10)
35
34
  DISPOSABLE_EMAILS = Validators::DisposableEmails.all +
36
35
  Validators::DisposableEmails.all.sample(10).map {|email| build_email_with_filter(email) } +
37
36
  Validators::DisposableEmails.all.sample(10).map {|email| build_email_with_dots(email) } +
@@ -13,9 +13,7 @@ class DisposableEmailTest < Minitest::Test
13
13
  assert_includes user.errors[:email],
14
14
  I18n.t("activerecord.errors.messages.disposable_domain")
15
15
  end
16
- end
17
16
 
18
- DISPOSABLE_DOMAINS.each do |domain|
19
17
  test "rejects disposable e-mail with subdomain (custom.#{domain})" do
20
18
  User.validates_email_format_of :email
21
19
 
@@ -15,10 +15,10 @@ class ValidatesCnpjFormatOfTest < Minitest::Test
15
15
  end
16
16
  end
17
17
 
18
- test "fails when gem is not available" do
19
- assert_raises do
18
+ test "fails when cpf_cnpj is not available" do
19
+ assert_raises(StandardError, /cpf_cnpj is not part of the bundle/) do
20
20
  Class.new do
21
- expects(:require).with("cnpj").raises(LoadError)
21
+ Validators.expects(:require).with("cpf_cnpj").raises(LoadError, "-- cpf_cnpj")
22
22
 
23
23
  include ActiveModel::Model
24
24
  validates_cnpj_format_of :document
@@ -15,10 +15,10 @@ class ValidatesCpfFormatOfTest < Minitest::Test
15
15
  end
16
16
  end
17
17
 
18
- test "fails when gem is not available" do
19
- assert_raises do
18
+ test "fails when cpf_cnpj is not available" do
19
+ assert_raises(StandardError, /cpf_cnpj is not part of the bundle/) do
20
20
  Class.new do
21
- expects(:require).with("cpf").raises(LoadError)
21
+ Validators.expects(:require).with("cpf_cnpj").raises(LoadError, "-- cpf_cnpj")
22
22
 
23
23
  include ActiveModel::Model
24
24
  validates_cpf_format_of :document
@@ -9,6 +9,29 @@ class ValidatesEmailFormatOfTest < Minitest::Test
9
9
  Person.validates :email, email: true
10
10
  end
11
11
 
12
+ test "fails when email_data is not available" do
13
+ assert_raises(StandardError, /email_data is not part of the bundle/) do
14
+ Class.new do
15
+ Validators.expects(:require).with("root_domain")
16
+ Validators.expects(:require).with("email_data").raises(LoadError, "-- email_data")
17
+
18
+ include ActiveModel::Model
19
+ validates_email :email
20
+ end
21
+ end
22
+ end
23
+
24
+ test "fails when root_domain is not available" do
25
+ assert_raises(StandardError, /root_domain is not part of the bundle/) do
26
+ Class.new do
27
+ Validators.expects(:require).with("root_domain").raises(LoadError, "-- root_domain")
28
+
29
+ include ActiveModel::Model
30
+ validates_email :email
31
+ end
32
+ end
33
+ end
34
+
12
35
  VALID_EMAILS.each do |email|
13
36
  test "accepts #{email.inspect} as a valid email" do
14
37
  user = User.new(email: email, corporate_email: email)
@@ -15,10 +15,10 @@ class ValidatesSshPrivateKeyCommonTest < Minitest::Test
15
15
  end
16
16
  end
17
17
 
18
- test "fails when gem is not available" do
19
- assert_raises do
18
+ test "fails when sshkey is not available" do
19
+ assert_raises(StandardError, /sshkey is not part of the bundle/) do
20
20
  Class.new do
21
- expects(:require).with("sshkey").raises(LoadError)
21
+ Validators.expects(:require).with("sshkey").raises(LoadError.new("-- sshkey"))
22
22
 
23
23
  include ActiveModel::Model
24
24
  validates_ssh_private_key :key
@@ -15,10 +15,10 @@ class ValidatesSsshPublicKeyCommonTest < Minitest::Test
15
15
  end
16
16
  end
17
17
 
18
- test "fails when gem is not available" do
19
- assert_raises do
18
+ test "fails when sshkey is not available" do
19
+ assert_raises(StandardError, /sshkey is not part of the bundle/) do
20
20
  Class.new do
21
- expects(:require).with("sshkey").raises(LoadError)
21
+ Validators.expects(:require).with("sshkey").raises(LoadError, "-- sshkey")
22
22
 
23
23
  include ActiveModel::Model
24
24
  validates_ssh_public_key :key
@@ -14,4 +14,22 @@ class ValidatesurlFormatUrlWithTldValidationTest < Minitest::Test
14
14
  assert user.valid?
15
15
  end
16
16
  end
17
+
18
+ test "rejects invalid TLD (alternative syntax)" do
19
+ user_model = Class.new do
20
+ include ActiveModel::Validations
21
+ attr_accessor :site_url
22
+
23
+ def self.name
24
+ "User"
25
+ end
26
+
27
+ validates :site_url, url: {tld: true}
28
+ end
29
+
30
+ user = user_model.new
31
+ user.site_url = "https://example.xy"
32
+
33
+ refute user.valid?
34
+ end
17
35
  end
@@ -47,4 +47,22 @@ class ValidatesurlFormatUrlWithoutTldValidationTest < Minitest::Test
47
47
  user = User.new(url: "")
48
48
  refute user.valid?
49
49
  end
50
+
51
+ test "accepts invalid TLD (alternative syntax)" do
52
+ user_model = Class.new do
53
+ include ActiveModel::Validations
54
+ attr_accessor :site_url
55
+
56
+ def self.name
57
+ "User"
58
+ end
59
+
60
+ validates :site_url, url: {tld: false}
61
+ end
62
+
63
+ user = user_model.new
64
+ user.site_url = "https://example.xy"
65
+
66
+ assert user.valid?
67
+ end
50
68
  end
data/validators.gemspec CHANGED
@@ -12,9 +12,10 @@ Gem::Specification.new do |s|
12
12
  s.summary = "Add some nice ActiveModel/ActiveRecord validators."
13
13
  s.description = s.summary
14
14
  s.license = "MIT"
15
+ s.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
16
+ s.metadata = {"rubygems_mfa_required" => "true"}
15
17
 
16
18
  s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
19
  s.executables = `git ls-files -- bin/*`
19
20
  .split("\n")
20
21
  .map {|f| File.basename(f) }
@@ -23,6 +24,7 @@ Gem::Specification.new do |s|
23
24
  s.add_development_dependency "activerecord"
24
25
  s.add_development_dependency "aitch"
25
26
  s.add_development_dependency "cpf_cnpj"
27
+ s.add_development_dependency "email_data"
26
28
  s.add_development_dependency "minitest-utils"
27
29
  s.add_development_dependency "mocha"
28
30
  s.add_development_dependency "nokogiri"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validators
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-22 00:00:00.000000000 Z
11
+ date: 2022-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: email_data
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: minitest-utils
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -266,28 +280,23 @@ description: Add some nice ActiveModel/ActiveRecord validators.
266
280
  email:
267
281
  - fnando.vieira@gmail.com
268
282
  executables:
269
- - sync-disposable-hostnames
270
- - sync-tld
283
+ - sync-reserved-subdomains
271
284
  extensions: []
272
285
  extra_rdoc_files: []
273
286
  files:
287
+ - ".github/FUNDING.yml"
274
288
  - ".gitignore"
275
289
  - ".rubocop.yml"
276
290
  - ".travis.yml"
277
291
  - Gemfile
278
292
  - README.md
279
293
  - Rakefile
280
- - bin/sync-disposable-hostnames
281
- - bin/sync-tld
282
- - data/country_tlds.txt
283
- - data/disposable_domains.txt
284
- - data/disposable_emails.txt
294
+ - bin/sync-reserved-subdomains
285
295
  - data/reserved_subdomains.txt
286
- - data/tld.txt
287
296
  - lib/validators.rb
288
297
  - lib/validators/constants.rb
298
+ - lib/validators/disposable_domains.rb
289
299
  - lib/validators/disposable_emails.rb
290
- - lib/validators/disposable_hostnames.rb
291
300
  - lib/validators/hostname.rb
292
301
  - lib/validators/ip.rb
293
302
  - lib/validators/locale/en.yml
@@ -342,7 +351,8 @@ files:
342
351
  homepage: http://rubygems.org/gems/validators
343
352
  licenses:
344
353
  - MIT
345
- metadata: {}
354
+ metadata:
355
+ rubygems_mfa_required: 'true'
346
356
  post_install_message:
347
357
  rdoc_options: []
348
358
  require_paths:
@@ -351,46 +361,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
351
361
  requirements:
352
362
  - - ">="
353
363
  - !ruby/object:Gem::Version
354
- version: '0'
364
+ version: 2.5.0
355
365
  required_rubygems_version: !ruby/object:Gem::Requirement
356
366
  requirements:
357
367
  - - ">="
358
368
  - !ruby/object:Gem::Version
359
369
  version: '0'
360
370
  requirements: []
361
- rubygems_version: 3.1.2
371
+ rubygems_version: 3.3.7
362
372
  signing_key:
363
373
  specification_version: 4
364
374
  summary: Add some nice ActiveModel/ActiveRecord validators.
365
- test_files:
366
- - test/schema.rb
367
- - test/support/dates.rb
368
- - test/support/emails.rb
369
- - test/support/hostnames.rb
370
- - test/support/ips.rb
371
- - test/support/models.rb
372
- - test/support/urls.rb
373
- - test/test_helper.rb
374
- - test/validators/disposable_email_test.rb
375
- - test/validators/ip_test.rb
376
- - test/validators/validates_cnpj_format_of_test.rb
377
- - test/validators/validates_cpf_format_of_test.rb
378
- - test/validators/validates_datetime/after_option_test.rb
379
- - test/validators/validates_datetime/before_option_test.rb
380
- - test/validators/validates_datetime/defaults_test.rb
381
- - test/validators/validates_email_format_of_test.rb
382
- - test/validators/validates_hostname_format_of/with_tld_validation_test.rb
383
- - test/validators/validates_hostname_format_of/without_tld_validation_test.rb
384
- - test/validators/validates_ip_address/ipv4_test.rb
385
- - test/validators/validates_ip_address/ipv6_test.rb
386
- - test/validators/validates_ip_address_test.rb
387
- - test/validators/validates_ownership_of_test.rb
388
- - test/validators/validates_ssh_private_key/bits_test.rb
389
- - test/validators/validates_ssh_private_key/common_test.rb
390
- - test/validators/validates_ssh_private_key/dsa_test.rb
391
- - test/validators/validates_ssh_private_key/rsa_test.rb
392
- - test/validators/validates_ssh_public_key_test.rb
393
- - test/validators/validates_subdomain_test.rb
394
- - test/validators/validates_url_format_of/with_tld_validation_test.rb
395
- - test/validators/validates_url_format_of/without_tld_validation_test.rb
396
- - test/validators/validates_username_test.rb
375
+ test_files: []
@@ -1,230 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require_relative "helpers"
5
-
6
- def ten_minute_mail
7
- path = "disposable/10minutemail.txt"
8
- url = "https://10minutemail.com/session/address"
9
-
10
- 20.times do
11
- refresh_list(url: url, path: path) do |response|
12
- _account, host = response.data.fetch("address").split("@")
13
-
14
- [host]
15
- end
16
-
17
- sleep random_timeout
18
- end
19
- end
20
-
21
- def temp_mail
22
- path = "disposable/tempmail.txt"
23
- url = "https://api4.temp-mail.org/request/domains/format/json"
24
-
25
- refresh_list(url: url, path: path) do |response|
26
- response.data.map {|domain| domain.tr("@", "") }
27
- end
28
- end
29
-
30
- def temp_mail_address
31
- path = "disposable/tempmailaddress.txt"
32
- url = "https://www.tempmailaddress.com/index/index"
33
-
34
- refresh_list(url: url, path: path) do |response|
35
- data = JSON.parse(
36
- response.body.gsub(/[^-,:\w@.{}"]/, ""),
37
- symbolize_names: true
38
- )
39
- [data[:email].split("@").last]
40
- end
41
- end
42
-
43
- def tempmail_io
44
- path = "disposable/tempmail_io.txt"
45
- url = "https://api.internal.temp-mail.io/api/v2/domains"
46
-
47
- refresh_list(url: url, path: path) do |response|
48
- response.data["domains"]
49
- end
50
- end
51
-
52
- def gmailnator
53
- emails = []
54
-
55
- 5.times do
56
- url = "https://gmailnator.com/bulk-emails"
57
- default_headers = {"user-agent" => USER_AGENT.sample}
58
-
59
- response = Aitch.get(url: url, headers: default_headers)
60
-
61
- throw "Received #{response.status} when getting CSRF token" unless response.ok?
62
-
63
- cookie_header = response.headers["set-cookie"]
64
- attr = response.data.css("#csrf_token").first
65
- csrf_token = attr[:value]
66
- csrf_field = attr[:name]
67
-
68
- response = Aitch.post(
69
- url: url,
70
- params: {email_list: "1000", email: [3], csrf_field => csrf_token},
71
- headers: default_headers.merge({"cookie" => cookie_header})
72
- )
73
-
74
- throw "Received #{response.status} when fetching list" unless response.ok?
75
-
76
- emails += response.data.css("#email-list-message a").map do |node|
77
- mailbox, domain = node.text.gsub(/\+[^@]+/, "").split("@")
78
- mailbox = mailbox.gsub(/\./m, "")
79
- "#{mailbox}@#{domain}"
80
- end
81
-
82
- sleep random_timeout
83
- end
84
-
85
- append_to_file("disposable/gmailnator.txt", emails)
86
- end
87
-
88
- def domain_scraping(name, url, selector)
89
- timeout(10) do
90
- puts "=> Scraping #{url}"
91
-
92
- selector, value_selector = selector.split("::")
93
- path = "disposable/#{name}.txt"
94
- host_regex = /@?(.*?(\.[^.]+)+)/
95
-
96
- refresh_list(url: url, path: path) do |response|
97
- new_domains = response
98
- .data
99
- .css(selector)
100
- .map {|element| process_scraping(element, value_selector) }
101
-
102
- new_domains = new_domains
103
- .map(&:squish)
104
- .reject(&:empty?)
105
- .map {|domain| domain[host_regex, 1]&.squish&.tr("@", "") }
106
- .reject(&:nil?)
107
- .reject(&:empty?)
108
- .map {|domain| domain.gsub(/\s*\((.*?)\)/, "") }
109
-
110
- raise "No #{name} hosts found" if new_domains.empty?
111
-
112
- new_domains
113
- end
114
- end
115
- rescue StandardError => error
116
- puts "=> [ERROR] Unable to scrape #{url}; #{error.class}: #{error.message}"
117
- []
118
- end
119
-
120
- def process_scraping(element, value_selector)
121
- value = nil
122
-
123
- case value_selector
124
- when "text()"
125
- value = element.text
126
- when /^attr\((.*?)\)/
127
- value = element[Regexp.last_match(1)]
128
- else
129
- element.attributes.each do |_name, attr|
130
- attr = attr.value.to_s
131
- value = attr if attr =~ host_regex
132
- end
133
- end
134
-
135
- raise "no value found: #{element} (value_selector: #{value_selector})" unless value
136
-
137
- value
138
- end
139
-
140
- def load_github_url(url)
141
- puts "=> Fetching #{url}"
142
-
143
- basename = URI.parse(url).path[%r{/([^/]+/[^/]+)}, 1].tr("/", "_").tr("-", "_")
144
- path = "disposable/#{basename}.txt"
145
- domains = load_file(path)
146
-
147
- ext = File.extname(url)
148
-
149
- domains += case ext
150
- when ".json"
151
- JSON.parse(http_request(:get, url).body)
152
- when ".txt"
153
- http_request(:get, url).body.lines.map(&:chomp)
154
- else
155
- raise "Unknown extension"
156
- end
157
-
158
- append_to_file(path, domains)
159
- domains
160
- rescue StandardError => error
161
- puts "=> Unable to load #{url}; #{error.class}: #{error.message}"
162
- []
163
- end
164
-
165
- threads = []
166
-
167
- threads << thread { load_github_url("https://raw.githubusercontent.com/ivolo/disposable-email-domains/master/index.json") }
168
- threads << thread { load_github_url("https://raw.githubusercontent.com/andreis/disposable-email-domains/master/domains.json") }
169
- threads << thread { load_github_url("https://raw.githubusercontent.com/FGRibreau/mailchecker/master/list.txt") }
170
- threads << thread { load_github_url("https://raw.githubusercontent.com/willwhite/freemail/master/data/disposable.txt") }
171
- threads << thread { load_github_url("https://raw.githubusercontent.com/maxmalysh/disposable-emails/master/disposable_emails/data/domains.txt") }
172
- threads << thread { load_github_url("https://raw.githubusercontent.com/jespernissen/disposable-maildomain-list/master/disposable-maildomain-list.txt") }
173
- threads << thread { load_github_url("https://raw.githubusercontent.com/wesbos/burner-email-providers/master/emails.txt") }
174
- threads << thread { load_github_url("https://gist.github.com/fnando/dafe542cac13f831bbf5521a55248116/raw/disposable.txt") }
175
- threads << thread { ten_minute_mail }
176
- threads << thread { temp_mail }
177
- threads << thread { temp_mail_address }
178
- threads << thread { tempmail_io }
179
- threads << thread { load_file("disposable/disposable_manually_added.txt") }
180
- threads << thread { domain_scraping("guerrillamail", "https://www.guerrillamail.com/", "select option::attr(value)") }
181
- threads << thread { domain_scraping("moakt", "https://www.moakt.com", "select option::attr(value)") }
182
- threads << thread { domain_scraping("tempr", "https://tempr.email/", "select[name=DomainId] option::text()") }
183
- threads << thread { domain_scraping("yepmail", "https://yepmail.co/", "select[name=domain] option::text()") }
184
- threads << thread { domain_scraping("fake_email_generator", "https://fakemailgenerator.net", "[data-mailhost]::attr(data-mailhost)") }
185
- threads << thread { domain_scraping("tempemails", "https://www.tempemails.net/", "select[name=domain] option::attr(value)") }
186
- threads << thread { domain_scraping("clipmails", "https://clipmails.com/", "select[name=domain] option::attr(value)") }
187
- threads << thread { domain_scraping("1secmail", "https://www.1secmail.com/", "select[id=domain] option::attr(value)") }
188
- threads << thread { domain_scraping("emailfake", "https://generator.email", ".tt-suggestion p::text()") }
189
- threads << thread { domain_scraping("emailfake", "https://emailfake.com/", ".tt-suggestion p::text()") }
190
- threads << thread { domain_scraping("emailfake", "https://email-fake.com/", ".tt-suggestion p::text()") }
191
- threads << thread { domain_scraping("receivemail", "https://www.receivemail.org/", "select[name=domain] option::text()") }
192
- threads << thread { domain_scraping("itemp", "https://itemp.email", "select[name=domain] option::text()") }
193
- threads << thread { domain_scraping("cs", "https://www.cs.email", "select[id=gm-host-select] option::text()") }
194
- threads << thread { domain_scraping("tempmail", "https://tempmail.io/settings/", "select[id=domain] option::text()") }
195
- threads << thread { domain_scraping("tempemail", "https://tempemail.co", "select[name=email_domain] option::text()") }
196
- threads << thread { domain_scraping("tmail", "https://mytemp-email.com/", "a.domain-selector::text()") }
197
-
198
- threads.each_slice(5) do |slice|
199
- slice.each(&:join)
200
- end
201
-
202
- threads.clear
203
-
204
- domains = []
205
-
206
- puts "=> Loading disposable_domains.txt"
207
- domains += File.read("#{__dir__}/../data/disposable_domains.txt").lines.map(&:chomp)
208
-
209
- puts "=> Loading disposable/*.txt"
210
- Dir["./data/disposable/**/*.txt"].map do |file|
211
- file = File.expand_path(file)
212
- domains += File.read(file).lines.map(&:chomp).flatten.compact
213
- end
214
-
215
- ignore_domains = %w[gmail.com hotmail.com]
216
-
217
- puts "=> Normalize domains (count: #{domains.size})"
218
- domains = domains
219
- .uniq
220
- .map {|domain| RootDomain.call(domain.split("@").last.downcase) }
221
- .compact
222
- .uniq
223
- .reject {|domain| ignore_domains.include?(domain) }
224
-
225
- puts "=> Saving domains (count: #{domains.size})"
226
- save_file("disposable_domains.txt", domains)
227
-
228
- emails = gmailnator
229
- puts "=> Saving email proxies (count: #{emails.size})"
230
- save_file("disposable_emails.txt", emails)
data/bin/sync-tld DELETED
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require_relative "helpers"
5
-
6
- tlds = http_request(:get, "https://data.iana.org/TLD/tlds-alpha-by-domain.txt").body.lines
7
- tlds.shift # remove update notice
8
-
9
- tlds.map!(&:downcase)
10
- tlds.map!(&:strip)
11
- tlds.map! {|tld| SimpleIDN.to_ascii(tld) }
12
-
13
- save_file("tld.txt", tlds)
14
-
15
- country_tlds = JSON.parse(http_request(:get, "https://github.com/samayo/country-json/raw/master/src/country-by-domain-tld.json").body, symbolize_names: true)
16
- country_tlds = country_tlds
17
- .reject {|info| info[:tld].nil? }
18
- .map {|info| info[:tld].gsub(/^\./, "") }
19
-
20
- save_file("country_tlds.txt", country_tlds)