coppertone 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +34 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +7 -0
  5. data/LICENSE +201 -0
  6. data/README.md +58 -0
  7. data/Rakefile +140 -0
  8. data/coppertone.gemspec +27 -0
  9. data/lib/coppertone/class_builder.rb +20 -0
  10. data/lib/coppertone/directive.rb +38 -0
  11. data/lib/coppertone/dns/error.rb +9 -0
  12. data/lib/coppertone/dns/mock_client.rb +106 -0
  13. data/lib/coppertone/dns/resolv_client.rb +110 -0
  14. data/lib/coppertone/dns.rb +3 -0
  15. data/lib/coppertone/domain_spec.rb +45 -0
  16. data/lib/coppertone/error.rb +29 -0
  17. data/lib/coppertone/ip_address_wrapper.rb +75 -0
  18. data/lib/coppertone/macro_context.rb +67 -0
  19. data/lib/coppertone/macro_string/macro_expand.rb +84 -0
  20. data/lib/coppertone/macro_string/macro_literal.rb +24 -0
  21. data/lib/coppertone/macro_string/macro_parser.rb +62 -0
  22. data/lib/coppertone/macro_string/macro_static_expand.rb +52 -0
  23. data/lib/coppertone/macro_string.rb +31 -0
  24. data/lib/coppertone/mechanism/a.rb +16 -0
  25. data/lib/coppertone/mechanism/all.rb +24 -0
  26. data/lib/coppertone/mechanism/cidr_parser.rb +14 -0
  27. data/lib/coppertone/mechanism/domain_spec_mechanism.rb +18 -0
  28. data/lib/coppertone/mechanism/domain_spec_optional.rb +46 -0
  29. data/lib/coppertone/mechanism/domain_spec_required.rb +37 -0
  30. data/lib/coppertone/mechanism/domain_spec_with_dual_cidr.rb +114 -0
  31. data/lib/coppertone/mechanism/exists.rb +14 -0
  32. data/lib/coppertone/mechanism/include.rb +18 -0
  33. data/lib/coppertone/mechanism/include_matcher.rb +34 -0
  34. data/lib/coppertone/mechanism/ip4.rb +13 -0
  35. data/lib/coppertone/mechanism/ip6.rb +13 -0
  36. data/lib/coppertone/mechanism/ip_mechanism.rb +48 -0
  37. data/lib/coppertone/mechanism/mx.rb +40 -0
  38. data/lib/coppertone/mechanism/ptr.rb +17 -0
  39. data/lib/coppertone/mechanism.rb +32 -0
  40. data/lib/coppertone/modifier/base.rb +24 -0
  41. data/lib/coppertone/modifier/exp.rb +34 -0
  42. data/lib/coppertone/modifier/redirect.rb +17 -0
  43. data/lib/coppertone/modifier/unknown.rb +16 -0
  44. data/lib/coppertone/modifier.rb +30 -0
  45. data/lib/coppertone/qualifier.rb +45 -0
  46. data/lib/coppertone/record.rb +86 -0
  47. data/lib/coppertone/record_evaluator.rb +63 -0
  48. data/lib/coppertone/record_finder.rb +34 -0
  49. data/lib/coppertone/request.rb +68 -0
  50. data/lib/coppertone/request_context.rb +67 -0
  51. data/lib/coppertone/request_count_limiter.rb +36 -0
  52. data/lib/coppertone/result.rb +50 -0
  53. data/lib/coppertone/sender_identity.rb +39 -0
  54. data/lib/coppertone/spf_service.rb +9 -0
  55. data/lib/coppertone/term.rb +13 -0
  56. data/lib/coppertone/utils/domain_utils.rb +59 -0
  57. data/lib/coppertone/utils/host_utils.rb +22 -0
  58. data/lib/coppertone/utils/ip_in_domain_checker.rb +53 -0
  59. data/lib/coppertone/utils/validated_domain_finder.rb +40 -0
  60. data/lib/coppertone/utils.rb +4 -0
  61. data/lib/coppertone/version.rb +3 -0
  62. data/lib/coppertone.rb +48 -0
  63. data/lib/resolv/dns/resource/in/spf.rb +15 -0
  64. data/spec/directive_spec.rb +41 -0
  65. data/spec/dns/resolv_client_spec.rb +307 -0
  66. data/spec/domain_spec_spec.rb +35 -0
  67. data/spec/ip_address_wrapper_spec.rb +67 -0
  68. data/spec/macro_context_spec.rb +69 -0
  69. data/spec/macro_string/macro_expand_spec.rb +79 -0
  70. data/spec/macro_string/macro_literal_spec.rb +27 -0
  71. data/spec/macro_string/macro_static_expand_spec.rb +67 -0
  72. data/spec/macro_string_spec.rb +20 -0
  73. data/spec/mechanism/a_spec.rb +198 -0
  74. data/spec/mechanism/all_spec.rb +22 -0
  75. data/spec/mechanism/exists_spec.rb +91 -0
  76. data/spec/mechanism/include_spec.rb +43 -0
  77. data/spec/mechanism/ip4_spec.rb +110 -0
  78. data/spec/mechanism/ip6_spec.rb +104 -0
  79. data/spec/mechanism/mx_spec.rb +51 -0
  80. data/spec/mechanism/ptr_spec.rb +43 -0
  81. data/spec/mechanism_spec.rb +4 -0
  82. data/spec/modifier_spec.rb +4 -0
  83. data/spec/open_spf/ALL_mechanism_syntax_spec.rb +38 -0
  84. data/spec/open_spf/A_mechanism_syntax_spec.rb +159 -0
  85. data/spec/open_spf/EXISTS_mechanism_syntax_spec.rb +46 -0
  86. data/spec/open_spf/IP4_mechanism_syntax_spec.rb +59 -0
  87. data/spec/open_spf/IP6_mechanism_syntax_spec.rb +60 -0
  88. data/spec/open_spf/Include_mechanism_semantics_and_syntax_spec.rb +56 -0
  89. data/spec/open_spf/Initial_processing_spec.rb +77 -0
  90. data/spec/open_spf/MX_mechanism_syntax_spec.rb +119 -0
  91. data/spec/open_spf/Macro_expansion_rules_spec.rb +154 -0
  92. data/spec/open_spf/PTR_mechanism_syntax_spec.rb +42 -0
  93. data/spec/open_spf/Processing_limits_spec.rb +72 -0
  94. data/spec/open_spf/Record_evaluation_spec.rb +75 -0
  95. data/spec/open_spf/Record_lookup_spec.rb +48 -0
  96. data/spec/open_spf/Selecting_records_spec.rb +61 -0
  97. data/spec/open_spf/Semantics_of_exp_and_other_modifiers_spec.rb +167 -0
  98. data/spec/open_spf/Test_cases_from_implementation_bugs_spec.rb +17 -0
  99. data/spec/qualifier_spec.rb +54 -0
  100. data/spec/record_evaluator_spec.rb +4 -0
  101. data/spec/record_finder_spec.rb +4 -0
  102. data/spec/record_spec.rb +100 -0
  103. data/spec/request_context_spec.rb +43 -0
  104. data/spec/request_count_limiter_spec.rb +28 -0
  105. data/spec/result_spec.rb +4 -0
  106. data/spec/rfc7208-tests.yml +2548 -0
  107. data/spec/sender_identity_spec.rb +69 -0
  108. data/spec/spec_helper.rb +8 -0
  109. data/spec/term_spec.rb +38 -0
  110. data/spec/utils/domain_utils_spec.rb +60 -0
  111. data/spec/utils/host_utils_spec.rb +32 -0
  112. data/spec/utils/ip_in_domain_checker_spec.rb +4 -0
  113. data/spec/utils/validated_domain_finder_spec.rb +4 -0
  114. metadata +306 -0
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coppertone::SenderIdentity do
4
+ it 'should parse an email address into localpart and domain' do
5
+ si = Coppertone::SenderIdentity.new('user@gmail.com')
6
+ expect(si.sender).to eq('user@gmail.com')
7
+ expect(si.localpart).to eq('user')
8
+ expect(si.domain).to eq('gmail.com')
9
+ end
10
+
11
+ it 'should default localpart to postmaster' do
12
+ si = Coppertone::SenderIdentity.new('yahoo.com')
13
+ expect(si.sender).to eq('yahoo.com')
14
+ expect(si.localpart).to eq('postmaster')
15
+ expect(si.domain).to eq('yahoo.com')
16
+ end
17
+
18
+ it 'should parse an email address into localpart and domain' do
19
+ si = Coppertone::SenderIdentity.new('user@gmail.com')
20
+ expect(si.sender).to eq('user@gmail.com')
21
+ expect(si.localpart).to eq('user')
22
+ expect(si.domain).to eq('gmail.com')
23
+ end
24
+
25
+ it 'should not raise an error if the sender is nil' do
26
+ si = Coppertone::SenderIdentity.new(nil)
27
+ expect(si.sender).to be_nil
28
+ expect(si.localpart).to eq('postmaster')
29
+ expect(si.domain).to be_nil
30
+ end
31
+
32
+ it 'should not raise an error if the sender is blank' do
33
+ si = Coppertone::SenderIdentity.new('')
34
+ expect(si.sender).to eq('')
35
+ expect(si.localpart).to eq('postmaster')
36
+ expect(si.domain).to eq('')
37
+ end
38
+
39
+ it 'should not raise an error if the sender has a too-long domain' do
40
+ localpart = 'lymeeater'
41
+ domain = 'A123456789012345678901234567890123456789'\
42
+ '012345678901234567890123.example.com'
43
+ sender = "#{localpart}@#{domain}"
44
+ si = Coppertone::SenderIdentity.new(sender)
45
+ expect(si.sender).to eq(sender)
46
+ expect(si.localpart).to eq(localpart)
47
+ expect(si.domain).to eq(domain)
48
+ end
49
+
50
+ it 'should not raise an error if the sender has a domain missing labels' do
51
+ localpart = 'lymeeater'
52
+ domain = 'A...example.com'
53
+ sender = "#{localpart}@#{domain}"
54
+ si = Coppertone::SenderIdentity.new(sender)
55
+ expect(si.sender).to eq(sender)
56
+ expect(si.localpart).to eq(localpart)
57
+ expect(si.domain).to eq(domain)
58
+ end
59
+
60
+ it 'should not raise an error if the sender has a domain literal' do
61
+ localpart = 'foo'
62
+ domain = '[1.2.3.5]'
63
+ sender = "#{localpart}@#{domain}"
64
+ si = Coppertone::SenderIdentity.new(sender)
65
+ expect(si.sender).to eq(sender)
66
+ expect(si.localpart).to eq(localpart)
67
+ expect(si.domain).to eq(domain)
68
+ end
69
+ end
@@ -0,0 +1,8 @@
1
+ require 'simplecov'
2
+ require 'codeclimate-test-reporter'
3
+ CodeClimate::TestReporter.start || SimpleCov.start
4
+
5
+ require 'coppertone'
6
+
7
+ # Support files
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
data/spec/term_spec.rb ADDED
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coppertone::Term do
4
+ context '#build' do
5
+ it 'should return nil for a nil argument' do
6
+ expect(Coppertone::Term.build_from_token(nil)).to be_nil
7
+ end
8
+
9
+ it 'should check Directive first' do
10
+ token = SecureRandom.hex(10)
11
+ term = double(:term)
12
+ expect(Coppertone::Directive)
13
+ .to receive(:matching_term).with(token).and_return(term)
14
+ expect(Coppertone::Modifier).not_to receive(:matching_term)
15
+ expect(Coppertone::Term.build_from_token(token)).to eq(term)
16
+ end
17
+
18
+ it 'should fallback to Modifier' do
19
+ token = SecureRandom.hex(10)
20
+ term = double(:term)
21
+ expect(Coppertone::Directive)
22
+ .to receive(:matching_term).with(token).and_return(nil)
23
+ expect(Coppertone::Modifier)
24
+ .to receive(:matching_term).with(token).and_return(term)
25
+ expect(Coppertone::Term.build_from_token(token)).to eq(term)
26
+ end
27
+
28
+ it 'should propagate errors' do
29
+ token = SecureRandom.hex(10)
30
+ expect(Coppertone::Directive)
31
+ .to receive(:matching_term).with(token)
32
+ .and_raise(Coppertone::Error)
33
+ expect do
34
+ Coppertone::Term.build_from_token(token)
35
+ end.to raise_error(Coppertone::Error)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,60 @@
1
+ # -- encoding : utf-8 --
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Coppertone::Utils::DomainUtils do
6
+ subject { Coppertone::Utils::DomainUtils }
7
+ context '#valid?' do
8
+ it 'should validate standard domains' do
9
+ expect(subject.valid?('gmail.com')).to eq(true)
10
+ expect(subject.valid?('fermion.mit.edu')).to eq(true)
11
+ expect(subject.valid?('abc.bit.ly')).to eq(true)
12
+ end
13
+
14
+ it 'should validate domains when they are dot-terminated' do
15
+ expect(subject.valid?('gmail.com.')).to eq(true)
16
+ expect(subject.valid?('fermion.mit.edu.')).to eq(true)
17
+ expect(subject.valid?('abc.bit.ly.')).to eq(true)
18
+ end
19
+
20
+ it 'should reject domains with less than two labels' do
21
+ expect(subject.valid?('')).to eq(false)
22
+ expect(subject.valid?('one')).to eq(false)
23
+ end
24
+
25
+ it 'should handle IDNA domains' do
26
+ expect(subject.valid?('清华大学.cn')).to eq(true)
27
+ expect(subject.valid?('ジェーピーニック.jp')).to eq(true)
28
+ end
29
+ end
30
+
31
+ context '#macro_expanded_domain' do
32
+ it 'returns nil for nil' do
33
+ expect(subject.macro_expanded_domain(nil)).to be_nil
34
+ end
35
+
36
+ it 'returns nil for a blank string' do
37
+ expect(subject.macro_expanded_domain('')).to be_nil
38
+ end
39
+
40
+ it 'returns the domain for an ASCII domain' do
41
+ expect(subject.macro_expanded_domain('fermion.mit.edu'))
42
+ .to eq('fermion.mit.edu')
43
+ end
44
+
45
+ it 'returns the ASCII domain for an IDNA domain' do
46
+ expect(subject.macro_expanded_domain('清华大学.cn'))
47
+ .to eq('xn--xkry9kk1bz66a.cn')
48
+ end
49
+
50
+ it 'truncates overlong domains' do
51
+ domain_candidate_labels = 50.times.map { "a-#{SecureRandom.hex(2)}" }
52
+ domain_candidate = domain_candidate_labels.join('.')
53
+ truncated_labels = domain_candidate_labels.drop(14)
54
+ truncated_domain = truncated_labels.join('.')
55
+
56
+ expect(subject.macro_expanded_domain(domain_candidate))
57
+ .to eq(truncated_domain)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coppertone::Utils::HostUtils do
4
+ context '#hostname' do
5
+ let(:raw_hostname) { SecureRandom.hex(10) }
6
+ let(:no_error_hostname) { SecureRandom.hex(10) }
7
+ let(:hostname_list) { [no_error_hostname, SecureRandom.hex(10)] }
8
+
9
+ before do
10
+ allow(Socket).to receive(:gethostname).and_return(raw_hostname)
11
+ Coppertone::Utils::HostUtils.clear_hostname
12
+ end
13
+
14
+ it 'should retrieve the hostname based on gethostbyname' do
15
+ allow(Socket).to receive(:gethostbyname)
16
+ .with(raw_hostname).and_return(hostname_list)
17
+ expect(Coppertone::Utils::HostUtils.hostname).to eq(no_error_hostname)
18
+ expect(Socket).not_to receive(:gethostname)
19
+ expect(Socket).not_to receive(:gethostbyname)
20
+ expect(Coppertone::Utils::HostUtils.hostname).to eq(no_error_hostname)
21
+ end
22
+
23
+ it 'should retrieve the hostname based on gethostname' do
24
+ expect(Socket).to receive(:gethostbyname)
25
+ .with(raw_hostname).and_raise(SocketError)
26
+ expect(Coppertone::Utils::HostUtils.hostname).to eq(raw_hostname)
27
+ expect(Socket).not_to receive(:gethostname)
28
+ expect(Socket).not_to receive(:gethostbyname)
29
+ expect(Coppertone::Utils::HostUtils.hostname).to eq(raw_hostname)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coppertone::Utils::IPInDomainChecker do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coppertone::Utils::ValidatedDomainFinder do
4
+ end
metadata ADDED
@@ -0,0 +1,306 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coppertone
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Peter M. Goldstein
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: addressable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
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'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Coppertone includes tools for parsing SPF DNS records, evaluating the
112
+ result of SPF checks for received emails, and creating appropriate email headers
113
+ from SPF results.
114
+ email:
115
+ - peter.m.goldstein@gmail.com
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".gitignore"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENSE
124
+ - README.md
125
+ - Rakefile
126
+ - coppertone.gemspec
127
+ - lib/coppertone.rb
128
+ - lib/coppertone/class_builder.rb
129
+ - lib/coppertone/directive.rb
130
+ - lib/coppertone/dns.rb
131
+ - lib/coppertone/dns/error.rb
132
+ - lib/coppertone/dns/mock_client.rb
133
+ - lib/coppertone/dns/resolv_client.rb
134
+ - lib/coppertone/domain_spec.rb
135
+ - lib/coppertone/error.rb
136
+ - lib/coppertone/ip_address_wrapper.rb
137
+ - lib/coppertone/macro_context.rb
138
+ - lib/coppertone/macro_string.rb
139
+ - lib/coppertone/macro_string/macro_expand.rb
140
+ - lib/coppertone/macro_string/macro_literal.rb
141
+ - lib/coppertone/macro_string/macro_parser.rb
142
+ - lib/coppertone/macro_string/macro_static_expand.rb
143
+ - lib/coppertone/mechanism.rb
144
+ - lib/coppertone/mechanism/a.rb
145
+ - lib/coppertone/mechanism/all.rb
146
+ - lib/coppertone/mechanism/cidr_parser.rb
147
+ - lib/coppertone/mechanism/domain_spec_mechanism.rb
148
+ - lib/coppertone/mechanism/domain_spec_optional.rb
149
+ - lib/coppertone/mechanism/domain_spec_required.rb
150
+ - lib/coppertone/mechanism/domain_spec_with_dual_cidr.rb
151
+ - lib/coppertone/mechanism/exists.rb
152
+ - lib/coppertone/mechanism/include.rb
153
+ - lib/coppertone/mechanism/include_matcher.rb
154
+ - lib/coppertone/mechanism/ip4.rb
155
+ - lib/coppertone/mechanism/ip6.rb
156
+ - lib/coppertone/mechanism/ip_mechanism.rb
157
+ - lib/coppertone/mechanism/mx.rb
158
+ - lib/coppertone/mechanism/ptr.rb
159
+ - lib/coppertone/modifier.rb
160
+ - lib/coppertone/modifier/base.rb
161
+ - lib/coppertone/modifier/exp.rb
162
+ - lib/coppertone/modifier/redirect.rb
163
+ - lib/coppertone/modifier/unknown.rb
164
+ - lib/coppertone/qualifier.rb
165
+ - lib/coppertone/record.rb
166
+ - lib/coppertone/record_evaluator.rb
167
+ - lib/coppertone/record_finder.rb
168
+ - lib/coppertone/request.rb
169
+ - lib/coppertone/request_context.rb
170
+ - lib/coppertone/request_count_limiter.rb
171
+ - lib/coppertone/result.rb
172
+ - lib/coppertone/sender_identity.rb
173
+ - lib/coppertone/spf_service.rb
174
+ - lib/coppertone/term.rb
175
+ - lib/coppertone/utils.rb
176
+ - lib/coppertone/utils/domain_utils.rb
177
+ - lib/coppertone/utils/host_utils.rb
178
+ - lib/coppertone/utils/ip_in_domain_checker.rb
179
+ - lib/coppertone/utils/validated_domain_finder.rb
180
+ - lib/coppertone/version.rb
181
+ - lib/resolv/dns/resource/in/spf.rb
182
+ - spec/directive_spec.rb
183
+ - spec/dns/resolv_client_spec.rb
184
+ - spec/domain_spec_spec.rb
185
+ - spec/ip_address_wrapper_spec.rb
186
+ - spec/macro_context_spec.rb
187
+ - spec/macro_string/macro_expand_spec.rb
188
+ - spec/macro_string/macro_literal_spec.rb
189
+ - spec/macro_string/macro_static_expand_spec.rb
190
+ - spec/macro_string_spec.rb
191
+ - spec/mechanism/a_spec.rb
192
+ - spec/mechanism/all_spec.rb
193
+ - spec/mechanism/exists_spec.rb
194
+ - spec/mechanism/include_spec.rb
195
+ - spec/mechanism/ip4_spec.rb
196
+ - spec/mechanism/ip6_spec.rb
197
+ - spec/mechanism/mx_spec.rb
198
+ - spec/mechanism/ptr_spec.rb
199
+ - spec/mechanism_spec.rb
200
+ - spec/modifier_spec.rb
201
+ - spec/open_spf/ALL_mechanism_syntax_spec.rb
202
+ - spec/open_spf/A_mechanism_syntax_spec.rb
203
+ - spec/open_spf/EXISTS_mechanism_syntax_spec.rb
204
+ - spec/open_spf/IP4_mechanism_syntax_spec.rb
205
+ - spec/open_spf/IP6_mechanism_syntax_spec.rb
206
+ - spec/open_spf/Include_mechanism_semantics_and_syntax_spec.rb
207
+ - spec/open_spf/Initial_processing_spec.rb
208
+ - spec/open_spf/MX_mechanism_syntax_spec.rb
209
+ - spec/open_spf/Macro_expansion_rules_spec.rb
210
+ - spec/open_spf/PTR_mechanism_syntax_spec.rb
211
+ - spec/open_spf/Processing_limits_spec.rb
212
+ - spec/open_spf/Record_evaluation_spec.rb
213
+ - spec/open_spf/Record_lookup_spec.rb
214
+ - spec/open_spf/Selecting_records_spec.rb
215
+ - spec/open_spf/Semantics_of_exp_and_other_modifiers_spec.rb
216
+ - spec/open_spf/Test_cases_from_implementation_bugs_spec.rb
217
+ - spec/qualifier_spec.rb
218
+ - spec/record_evaluator_spec.rb
219
+ - spec/record_finder_spec.rb
220
+ - spec/record_spec.rb
221
+ - spec/request_context_spec.rb
222
+ - spec/request_count_limiter_spec.rb
223
+ - spec/result_spec.rb
224
+ - spec/rfc7208-tests.yml
225
+ - spec/sender_identity_spec.rb
226
+ - spec/spec_helper.rb
227
+ - spec/term_spec.rb
228
+ - spec/utils/domain_utils_spec.rb
229
+ - spec/utils/host_utils_spec.rb
230
+ - spec/utils/ip_in_domain_checker_spec.rb
231
+ - spec/utils/validated_domain_finder_spec.rb
232
+ homepage: https://github.com/petergoldstein/coppertone
233
+ licenses:
234
+ - Apache
235
+ metadata: {}
236
+ post_install_message:
237
+ rdoc_options: []
238
+ require_paths:
239
+ - lib
240
+ required_ruby_version: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
245
+ required_rubygems_version: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ requirements: []
251
+ rubyforge_project:
252
+ rubygems_version: 2.4.1
253
+ signing_key:
254
+ specification_version: 4
255
+ summary: A Sender Policy Framework (SPF) toolkit
256
+ test_files:
257
+ - spec/directive_spec.rb
258
+ - spec/dns/resolv_client_spec.rb
259
+ - spec/domain_spec_spec.rb
260
+ - spec/ip_address_wrapper_spec.rb
261
+ - spec/macro_context_spec.rb
262
+ - spec/macro_string/macro_expand_spec.rb
263
+ - spec/macro_string/macro_literal_spec.rb
264
+ - spec/macro_string/macro_static_expand_spec.rb
265
+ - spec/macro_string_spec.rb
266
+ - spec/mechanism/a_spec.rb
267
+ - spec/mechanism/all_spec.rb
268
+ - spec/mechanism/exists_spec.rb
269
+ - spec/mechanism/include_spec.rb
270
+ - spec/mechanism/ip4_spec.rb
271
+ - spec/mechanism/ip6_spec.rb
272
+ - spec/mechanism/mx_spec.rb
273
+ - spec/mechanism/ptr_spec.rb
274
+ - spec/mechanism_spec.rb
275
+ - spec/modifier_spec.rb
276
+ - spec/open_spf/ALL_mechanism_syntax_spec.rb
277
+ - spec/open_spf/A_mechanism_syntax_spec.rb
278
+ - spec/open_spf/EXISTS_mechanism_syntax_spec.rb
279
+ - spec/open_spf/IP4_mechanism_syntax_spec.rb
280
+ - spec/open_spf/IP6_mechanism_syntax_spec.rb
281
+ - spec/open_spf/Include_mechanism_semantics_and_syntax_spec.rb
282
+ - spec/open_spf/Initial_processing_spec.rb
283
+ - spec/open_spf/MX_mechanism_syntax_spec.rb
284
+ - spec/open_spf/Macro_expansion_rules_spec.rb
285
+ - spec/open_spf/PTR_mechanism_syntax_spec.rb
286
+ - spec/open_spf/Processing_limits_spec.rb
287
+ - spec/open_spf/Record_evaluation_spec.rb
288
+ - spec/open_spf/Record_lookup_spec.rb
289
+ - spec/open_spf/Selecting_records_spec.rb
290
+ - spec/open_spf/Semantics_of_exp_and_other_modifiers_spec.rb
291
+ - spec/open_spf/Test_cases_from_implementation_bugs_spec.rb
292
+ - spec/qualifier_spec.rb
293
+ - spec/record_evaluator_spec.rb
294
+ - spec/record_finder_spec.rb
295
+ - spec/record_spec.rb
296
+ - spec/request_context_spec.rb
297
+ - spec/request_count_limiter_spec.rb
298
+ - spec/result_spec.rb
299
+ - spec/rfc7208-tests.yml
300
+ - spec/sender_identity_spec.rb
301
+ - spec/spec_helper.rb
302
+ - spec/term_spec.rb
303
+ - spec/utils/domain_utils_spec.rb
304
+ - spec/utils/host_utils_spec.rb
305
+ - spec/utils/ip_in_domain_checker_spec.rb
306
+ - spec/utils/validated_domain_finder_spec.rb