truemail 1.5.1 → 1.8.0
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.
- checksums.yaml +4 -4
- data/.reek.yml +1 -0
- data/CHANGELOG.md +214 -0
- data/Gemfile.lock +31 -50
- data/README.md +162 -16
- data/lib/truemail.rb +3 -4
- data/lib/truemail/audit/base.rb +8 -0
- data/lib/truemail/audit/dns.rb +26 -0
- data/lib/truemail/audit/ip.rb +28 -0
- data/lib/truemail/audit/ptr.rb +7 -35
- data/lib/truemail/auditor.rb +2 -2
- data/lib/truemail/configuration.rb +2 -3
- data/lib/truemail/core.rb +24 -22
- data/lib/truemail/log/serializer/base.rb +1 -0
- data/lib/truemail/validate/mx.rb +1 -0
- data/lib/truemail/validator.rb +4 -0
- data/lib/truemail/version.rb +1 -1
- data/truemail.gemspec +7 -7
- metadata +23 -27
data/lib/truemail.rb
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative 'truemail/core'
|
4
4
|
|
5
5
|
module Truemail
|
6
6
|
INCOMPLETE_CONFIG = 'verifier_email is required parameter'
|
7
7
|
NOT_CONFIGURED = 'use Truemail.configure before or pass custom configuration'
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def configuration
|
10
|
+
def configuration(&block)
|
11
11
|
@configuration ||= begin
|
12
12
|
return unless block_given?
|
13
|
-
configuration = Truemail::Configuration.new
|
14
|
-
yield(configuration)
|
13
|
+
configuration = Truemail::Configuration.new(&block)
|
15
14
|
raise_unless(configuration.complete?, Truemail::INCOMPLETE_CONFIG)
|
16
15
|
configuration
|
17
16
|
end
|
data/lib/truemail/audit/base.rb
CHANGED
@@ -3,12 +3,20 @@
|
|
3
3
|
module Truemail
|
4
4
|
module Audit
|
5
5
|
class Base < Truemail::Worker
|
6
|
+
require 'net/http'
|
7
|
+
require 'ipaddr'
|
8
|
+
require 'resolv'
|
9
|
+
|
6
10
|
private
|
7
11
|
|
8
12
|
def add_warning(message)
|
9
13
|
result.warnings[self.class.name.split('::').last.downcase.to_sym] = message
|
10
14
|
end
|
11
15
|
|
16
|
+
def current_host_ip
|
17
|
+
result.current_host_ip
|
18
|
+
end
|
19
|
+
|
12
20
|
def configuration
|
13
21
|
result.configuration
|
14
22
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Truemail
|
4
|
+
module Audit
|
5
|
+
class Dns < Truemail::Audit::Base
|
6
|
+
VERIFIER_DOMAIN_NOT_REFER = 'a record of verifier domain not refers to current host ip address'
|
7
|
+
|
8
|
+
def run
|
9
|
+
return if verifier_domain_refer_to_current_host_ip?
|
10
|
+
add_warning(Truemail::Audit::Dns::VERIFIER_DOMAIN_NOT_REFER)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def a_record
|
16
|
+
Truemail::Wrapper.call(configuration: configuration) do
|
17
|
+
Resolv::DNS.new.getaddress(verifier_domain).to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def verifier_domain_refer_to_current_host_ip?
|
22
|
+
a_record.eql?(current_host_ip)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Truemail
|
4
|
+
module Audit
|
5
|
+
class Ip < Truemail::Audit::Base
|
6
|
+
GET_MY_IP_URL = 'https://api.ipify.org'
|
7
|
+
IPIFY_ERROR = 'impossible to detect current host address via third party service'
|
8
|
+
|
9
|
+
def run
|
10
|
+
return add_warning(Truemail::Audit::Ip::IPIFY_ERROR) unless detect_current_host_ip
|
11
|
+
Truemail::Audit::Dns.check(result)
|
12
|
+
Truemail::Audit::Ptr.check(result)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def detect_ip_via_ipify
|
18
|
+
Net::HTTP.get(URI(Truemail::Audit::Ip::GET_MY_IP_URL))
|
19
|
+
end
|
20
|
+
|
21
|
+
def detect_current_host_ip
|
22
|
+
result.current_host_ip = Truemail::Wrapper.call(configuration: configuration) do
|
23
|
+
detect_ip_via_ipify
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/truemail/audit/ptr.rb
CHANGED
@@ -3,37 +3,19 @@
|
|
3
3
|
module Truemail
|
4
4
|
module Audit
|
5
5
|
class Ptr < Truemail::Audit::Base
|
6
|
-
|
7
|
-
require 'resolv'
|
8
|
-
|
9
|
-
GET_MY_IP_URL = 'https://api.ipify.org'
|
10
|
-
IPIFY_ERROR = 'impossible to detect current host address via third party service'
|
11
|
-
PTR_NOT_FOUND = 'ptr record for current host address was not found'
|
6
|
+
PTR_NOT_FOUND = 'ptr record for current host ip address was not found'
|
12
7
|
PTR_NOT_REFER = 'ptr record does not reference to current verifier domain'
|
13
|
-
VERIFIER_DOMAIN_NOT_REFER = 'a record of verifier domain not refers to current host address'
|
14
8
|
|
15
9
|
def run
|
16
|
-
return
|
17
|
-
return if
|
18
|
-
|
19
|
-
return if verifier_domain_refer_to_current_host_address?
|
20
|
-
add_warning(Truemail::Audit::Ptr::VERIFIER_DOMAIN_NOT_REFER)
|
10
|
+
return add_warning(Truemail::Audit::Ptr::PTR_NOT_FOUND) if ptr_records.empty?
|
11
|
+
return if ptr_refer_to_verifier_domain?
|
12
|
+
add_warning(Truemail::Audit::Ptr::PTR_NOT_REFER)
|
21
13
|
end
|
22
14
|
|
23
15
|
private
|
24
16
|
|
25
|
-
def detect_ip_via_ipify
|
26
|
-
Net::HTTP.get(URI(Truemail::Audit::Ptr::GET_MY_IP_URL))
|
27
|
-
end
|
28
|
-
|
29
|
-
def current_host_address
|
30
|
-
@current_host_address ||= Truemail::Wrapper.call(configuration: configuration) do
|
31
|
-
IPAddr.new(detect_ip_via_ipify)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
17
|
def current_host_reverse_lookup
|
36
|
-
|
18
|
+
IPAddr.new(current_host_ip).reverse
|
37
19
|
end
|
38
20
|
|
39
21
|
def ptr_records
|
@@ -44,18 +26,8 @@ module Truemail
|
|
44
26
|
end || []
|
45
27
|
end
|
46
28
|
|
47
|
-
def
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
def a_record
|
52
|
-
Truemail::Wrapper.call(configuration: configuration) do
|
53
|
-
Resolv::DNS.new.getaddress(verifier_domain).to_s
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def verifier_domain_refer_to_current_host_address?
|
58
|
-
a_record.eql?(current_host_address.to_s)
|
29
|
+
def ptr_refer_to_verifier_domain?
|
30
|
+
ptr_records.include?(verifier_domain)
|
59
31
|
end
|
60
32
|
end
|
61
33
|
end
|
data/lib/truemail/auditor.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Truemail
|
4
4
|
class Auditor
|
5
|
-
Result = Struct.new(:warnings, :configuration, keyword_init: true) do
|
5
|
+
Result = Struct.new(:current_host_ip, :warnings, :configuration, keyword_init: true) do
|
6
6
|
def initialize(warnings: {}, **args)
|
7
7
|
super
|
8
8
|
end
|
@@ -15,7 +15,7 @@ module Truemail
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def run
|
18
|
-
Truemail::Audit::
|
18
|
+
Truemail::Audit::Ip.check(result)
|
19
19
|
self
|
20
20
|
end
|
21
21
|
end
|
@@ -20,9 +20,7 @@ module Truemail
|
|
20
20
|
:blacklisted_domains,
|
21
21
|
:logger
|
22
22
|
|
23
|
-
attr_accessor :whitelist_validation, :smtp_safe_check
|
24
|
-
|
25
|
-
alias retry_count connection_attempts
|
23
|
+
attr_accessor :whitelist_validation, :not_rfc_mx_lookup_flow, :smtp_safe_check
|
26
24
|
|
27
25
|
def initialize(&block)
|
28
26
|
instance_initializer.each do |instace_variable, value|
|
@@ -101,6 +99,7 @@ module Truemail
|
|
101
99
|
whitelisted_domains: [],
|
102
100
|
whitelist_validation: false,
|
103
101
|
blacklisted_domains: [],
|
102
|
+
not_rfc_mx_lookup_flow: false,
|
104
103
|
smtp_safe_check: false
|
105
104
|
}
|
106
105
|
end
|
data/lib/truemail/core.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Truemail
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
require_relative '../truemail/version'
|
5
|
+
require_relative '../truemail/configuration'
|
6
|
+
require_relative '../truemail/worker'
|
7
|
+
require_relative '../truemail/wrapper'
|
8
|
+
require_relative '../truemail/auditor'
|
9
|
+
require_relative '../truemail/validator'
|
10
|
+
require_relative '../truemail/logger'
|
11
11
|
|
12
12
|
ConfigurationError = Class.new(StandardError)
|
13
13
|
|
14
14
|
ArgumentError = Class.new(StandardError) do
|
15
|
-
def initialize(
|
16
|
-
super("#{
|
15
|
+
def initialize(arg_value, arg_name)
|
16
|
+
super("#{arg_value} is not a valid #{arg_name}")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -37,24 +37,26 @@ module Truemail
|
|
37
37
|
end
|
38
38
|
|
39
39
|
module Audit
|
40
|
-
|
41
|
-
|
40
|
+
require_relative '../truemail/audit/base'
|
41
|
+
require_relative '../truemail/audit/ip'
|
42
|
+
require_relative '../truemail/audit/dns'
|
43
|
+
require_relative '../truemail/audit/ptr'
|
42
44
|
end
|
43
45
|
|
44
46
|
module Validate
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
47
|
+
require_relative '../truemail/validate/base'
|
48
|
+
require_relative '../truemail/validate/domain_list_match'
|
49
|
+
require_relative '../truemail/validate/regex'
|
50
|
+
require_relative '../truemail/validate/mx'
|
51
|
+
require_relative '../truemail/validate/smtp'
|
52
|
+
require_relative '../truemail/validate/smtp/response'
|
53
|
+
require_relative '../truemail/validate/smtp/request'
|
52
54
|
end
|
53
55
|
|
54
56
|
module Log
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
57
|
+
require_relative '../truemail/log/event'
|
58
|
+
require_relative '../truemail/log/serializer/base'
|
59
|
+
require_relative '../truemail/log/serializer/text'
|
60
|
+
require_relative '../truemail/log/serializer/json'
|
59
61
|
end
|
60
62
|
end
|
@@ -67,6 +67,7 @@ module Truemail
|
|
67
67
|
whitelist_validation: validation_configuration.whitelist_validation,
|
68
68
|
whitelisted_domains: whitelisted_domains,
|
69
69
|
blacklisted_domains: blacklisted_domains,
|
70
|
+
not_rfc_mx_lookup_flow: validation_configuration.not_rfc_mx_lookup_flow,
|
70
71
|
smtp_safe_check: validation_configuration.smtp_safe_check,
|
71
72
|
email_pattern: email_pattern,
|
72
73
|
smtp_error_body_pattern: smtp_error_body_pattern
|
data/lib/truemail/validate/mx.rb
CHANGED
data/lib/truemail/validator.rb
CHANGED
data/lib/truemail/version.rb
CHANGED
data/truemail.gemspec
CHANGED
@@ -27,17 +27,17 @@ Gem::Specification.new do |spec|
|
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
29
29
|
spec.add_development_dependency 'bundler-audit', '~> 0.6.1'
|
30
|
-
spec.add_development_dependency 'fasterer', '~> 0.8.
|
31
|
-
spec.add_development_dependency 'ffaker', '~> 2.
|
30
|
+
spec.add_development_dependency 'fasterer', '~> 0.8.3'
|
31
|
+
spec.add_development_dependency 'ffaker', '~> 2.14'
|
32
32
|
spec.add_development_dependency 'json_matchers', '~> 0.11.1'
|
33
|
-
spec.add_development_dependency 'overcommit', '~> 0.
|
34
|
-
spec.add_development_dependency 'pry-byebug', '~> 3.
|
33
|
+
spec.add_development_dependency 'overcommit', '~> 0.53.0'
|
34
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.9'
|
35
35
|
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
|
36
|
-
spec.add_development_dependency 'reek', '~>
|
36
|
+
spec.add_development_dependency 'reek', '~> 6.0'
|
37
37
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
38
38
|
spec.add_development_dependency 'rubocop', '~> 0.79.0'
|
39
39
|
spec.add_development_dependency 'rubocop-performance', '~> 1.5', '>= 1.5.2'
|
40
|
-
spec.add_development_dependency 'rubocop-rspec', '~> 1.
|
40
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.39'
|
41
41
|
spec.add_development_dependency 'simplecov', '~> 0.17.1'
|
42
|
-
spec.add_development_dependency 'truemail-rspec', '~> 0.1.
|
42
|
+
spec.add_development_dependency 'truemail-rspec', '~> 0.1.2'
|
43
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: truemail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladislav Trotsenko
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simpleidn
|
@@ -58,28 +58,28 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.8.
|
61
|
+
version: 0.8.3
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.8.
|
68
|
+
version: 0.8.3
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: ffaker
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '2.
|
75
|
+
version: '2.14'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '2.
|
82
|
+
version: '2.14'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: json_matchers
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,28 +100,28 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
103
|
+
version: 0.53.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: 0.53.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: pry-byebug
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '3.
|
117
|
+
version: '3.9'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '3.
|
124
|
+
version: '3.9'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rake
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,14 +148,14 @@ dependencies:
|
|
148
148
|
requirements:
|
149
149
|
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: '
|
151
|
+
version: '6.0'
|
152
152
|
type: :development
|
153
153
|
prerelease: false
|
154
154
|
version_requirements: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version: '
|
158
|
+
version: '6.0'
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
160
|
name: rspec
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,20 +210,14 @@ dependencies:
|
|
210
210
|
requirements:
|
211
211
|
- - "~>"
|
212
212
|
- !ruby/object:Gem::Version
|
213
|
-
version: '1.
|
214
|
-
- - ">="
|
215
|
-
- !ruby/object:Gem::Version
|
216
|
-
version: 1.37.1
|
213
|
+
version: '1.39'
|
217
214
|
type: :development
|
218
215
|
prerelease: false
|
219
216
|
version_requirements: !ruby/object:Gem::Requirement
|
220
217
|
requirements:
|
221
218
|
- - "~>"
|
222
219
|
- !ruby/object:Gem::Version
|
223
|
-
version: '1.
|
224
|
-
- - ">="
|
225
|
-
- !ruby/object:Gem::Version
|
226
|
-
version: 1.37.1
|
220
|
+
version: '1.39'
|
227
221
|
- !ruby/object:Gem::Dependency
|
228
222
|
name: simplecov
|
229
223
|
requirement: !ruby/object:Gem::Requirement
|
@@ -244,14 +238,14 @@ dependencies:
|
|
244
238
|
requirements:
|
245
239
|
- - "~>"
|
246
240
|
- !ruby/object:Gem::Version
|
247
|
-
version: 0.1.
|
241
|
+
version: 0.1.2
|
248
242
|
type: :development
|
249
243
|
prerelease: false
|
250
244
|
version_requirements: !ruby/object:Gem::Requirement
|
251
245
|
requirements:
|
252
246
|
- - "~>"
|
253
247
|
- !ruby/object:Gem::Version
|
254
|
-
version: 0.1.
|
248
|
+
version: 0.1.2
|
255
249
|
description: Configurable framework agnostic plain Ruby email validator. Verify email
|
256
250
|
via Regex, DNS and SMTP.
|
257
251
|
email:
|
@@ -283,6 +277,8 @@ files:
|
|
283
277
|
- bin/setup
|
284
278
|
- lib/truemail.rb
|
285
279
|
- lib/truemail/audit/base.rb
|
280
|
+
- lib/truemail/audit/dns.rb
|
281
|
+
- lib/truemail/audit/ip.rb
|
286
282
|
- lib/truemail/audit/ptr.rb
|
287
283
|
- lib/truemail/auditor.rb
|
288
284
|
- lib/truemail/configuration.rb
|
@@ -308,7 +304,7 @@ homepage: https://github.com/rubygarage/truemail
|
|
308
304
|
licenses:
|
309
305
|
- MIT
|
310
306
|
metadata: {}
|
311
|
-
post_install_message:
|
307
|
+
post_install_message:
|
312
308
|
rdoc_options: []
|
313
309
|
require_paths:
|
314
310
|
- lib
|
@@ -323,9 +319,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
323
319
|
- !ruby/object:Gem::Version
|
324
320
|
version: '0'
|
325
321
|
requirements: []
|
326
|
-
rubyforge_project:
|
327
|
-
rubygems_version: 2.7.
|
328
|
-
signing_key:
|
322
|
+
rubyforge_project:
|
323
|
+
rubygems_version: 2.7.3
|
324
|
+
signing_key:
|
329
325
|
specification_version: 4
|
330
326
|
summary: truemail
|
331
327
|
test_files: []
|