dmarc 0.4.0 → 0.5.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/ChangeLog.md +4 -0
- data/Gemfile +2 -0
- data/README.md +5 -5
- data/Rakefile +2 -1
- data/lib/dmarc/parser.rb +16 -2
- data/lib/dmarc/record.rb +4 -4
- data/lib/dmarc/uri.rb +105 -0
- data/lib/dmarc/version.rb +1 -1
- data/spec/parser_spec.rb +2 -2
- data/spec/uri_spec.rb +141 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0722fed71bbda69dbc298ae1219aefb479d398d5
|
4
|
+
data.tar.gz: c8478c89eb381f682c7ec0a96036222dc31b7623
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27faec135d37a31823e5c0df6e5e1bc42e42f8064434a110e36faac3b97863696948a7f69ae3c3f87d2c6f2753cc41ec940a1962bd11231a1093113392283929
|
7
|
+
data.tar.gz: eaeb4b38ef303231a5c52722c4f093d0f24d856d6f604c66f8639d81975311c68d4aa88fc5da3d00a54462d5ab37d2044e6d01f7f7c3cb16aeb06f8c1c737f36
|
data/ChangeLog.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,7 +12,7 @@ parser for DMARC records.
|
|
12
12
|
|
13
13
|
## Example
|
14
14
|
|
15
|
-
Parse a
|
15
|
+
Parse a DMARC record:
|
16
16
|
|
17
17
|
require 'dmarc'
|
18
18
|
|
@@ -43,18 +43,18 @@ Parse a SPF record:
|
|
43
43
|
# => 86400
|
44
44
|
|
45
45
|
record.rua
|
46
|
-
# => [#<URI::MailTo
|
46
|
+
# => [#<DMARC::Uri:0x0055ede60711e0 @uri=#<URI::MailTo mailto:d@rua.agari.com>, @size=nil, @unit=nil>]
|
47
47
|
|
48
48
|
record.ruf
|
49
|
-
# => [#<URI::MailTo
|
49
|
+
# => [#<DMARC::Uri:0x0055ede606f138 @uri=#<URI::MailTo mailto:d@ruf.agari.com>, @size=nil, @unit=nil>]
|
50
50
|
|
51
51
|
record.sp
|
52
52
|
# => :reject
|
53
53
|
|
54
|
-
Query the
|
54
|
+
Query the DMARC record for a domain:
|
55
55
|
|
56
56
|
record = DMARC::Record.query('twitter.com')
|
57
|
-
# => #<DMARC::Record:
|
57
|
+
# => #<DMARC::Record:0x0055ede6b808b0 @v=:DMARC1, @adkim=nil, @aspf=nil, @fo=["1"@79], @p=:reject, @pct=nil, @rf=nil, @ri=nil, @rua=[#<DMARC::Uri:0x0055ede6ba1c40 @uri=#<URI::MailTo mailto:d@rua.agari.com>, @size=nil, @unit=nil>], @ruf=[#<DMARC::Uri:0x0055ede6b8b760 @uri=#<URI::MailTo mailto:d@ruf.agari.com>, @size=nil, @unit=nil>], @sp=nil>
|
58
58
|
|
59
59
|
## Requirements
|
60
60
|
|
data/Rakefile
CHANGED
data/lib/dmarc/parser.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
require '
|
1
|
+
require 'dmarc/uri'
|
2
2
|
|
3
|
+
require 'parslet'
|
3
4
|
require 'uri'
|
4
5
|
|
5
6
|
module DMARC
|
@@ -183,7 +184,20 @@ module DMARC
|
|
183
184
|
rule(pct: simple(:pct)) { {pct: pct.to_i} }
|
184
185
|
rule(ri: simple(:ri)) { {ri: ri.to_i} }
|
185
186
|
|
186
|
-
rule(uri: simple(:uri))
|
187
|
+
rule(uri: simple(:uri), size: simple(:size), unit: simple(:unit)) do
|
188
|
+
Uri.new(
|
189
|
+
URI.parse(uri),
|
190
|
+
size.to_i,
|
191
|
+
unit.to_sym
|
192
|
+
)
|
193
|
+
end
|
194
|
+
rule(uri: simple(:uri), size: simple(:size)) do
|
195
|
+
Uri.new(
|
196
|
+
URI.parse(uri),
|
197
|
+
size.to_i
|
198
|
+
)
|
199
|
+
end
|
200
|
+
rule(uri: simple(:uri)) { Uri.new(URI.parse(uri)) }
|
187
201
|
rule(rua: subtree(:uris)) { {rua: Array(uris)} }
|
188
202
|
rule(ruf: subtree(:uris)) { {ruf: Array(uris)} }
|
189
203
|
|
data/lib/dmarc/record.rb
CHANGED
@@ -14,12 +14,12 @@ module DMARC
|
|
14
14
|
|
15
15
|
# `rua` field.
|
16
16
|
#
|
17
|
-
# @return [Array<
|
17
|
+
# @return [Array<Uri>]
|
18
18
|
attr_reader :rua
|
19
19
|
|
20
20
|
# `rua` field.
|
21
21
|
#
|
22
|
-
# @return [Array<
|
22
|
+
# @return [Array<Uri>]
|
23
23
|
attr_reader :ruf
|
24
24
|
|
25
25
|
# `sp` field.
|
@@ -52,9 +52,9 @@ module DMARC
|
|
52
52
|
#
|
53
53
|
# @option attributes [Integer] :ri (86400)
|
54
54
|
#
|
55
|
-
# @option attributes [Array<
|
55
|
+
# @option attributes [Array<Uri>] :rua
|
56
56
|
#
|
57
|
-
# @option attributes [Array<
|
57
|
+
# @option attributes [Array<Uri>] :ruf
|
58
58
|
#
|
59
59
|
# @option attributes [:none, :quarantine, :reject] :sp
|
60
60
|
#
|
data/lib/dmarc/uri.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
module DMARC
|
2
|
+
#
|
3
|
+
# Represents a DMARC URI.
|
4
|
+
#
|
5
|
+
# @see https://tools.ietf.org/html/rfc7489#section-6.2
|
6
|
+
#
|
7
|
+
# @since 0.5.0
|
8
|
+
#
|
9
|
+
class Uri
|
10
|
+
|
11
|
+
# The `mailto:` URI.
|
12
|
+
#
|
13
|
+
# @return [URI::MailTo]
|
14
|
+
attr_reader :uri
|
15
|
+
|
16
|
+
# The optional maximum-size.
|
17
|
+
#
|
18
|
+
# @return [Integer, nil]
|
19
|
+
attr_reader :size
|
20
|
+
|
21
|
+
# The optional unit.
|
22
|
+
#
|
23
|
+
# @return [:k, :m, :g, :t, nil]
|
24
|
+
attr_reader :unit
|
25
|
+
|
26
|
+
#
|
27
|
+
# Initializes the DMARC URI.
|
28
|
+
#
|
29
|
+
# @param [URI::MailTo] uri
|
30
|
+
# The `mailto:` URI.
|
31
|
+
#
|
32
|
+
# @param [Integer] size
|
33
|
+
# The optional maximum-size.
|
34
|
+
#
|
35
|
+
# @param [:k, :m, :g, :t] unit
|
36
|
+
# The optional size unit.
|
37
|
+
#
|
38
|
+
def initialize(uri,size=nil,unit=nil)
|
39
|
+
@uri = uri
|
40
|
+
|
41
|
+
@size = size
|
42
|
+
@unit = unit
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Determines if a maximum-size was set.
|
47
|
+
#
|
48
|
+
# @return [Boolean]
|
49
|
+
#
|
50
|
+
def size?
|
51
|
+
!@size.nil?
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Determines if a size unit was set.
|
56
|
+
#
|
57
|
+
# @return [Boolean]
|
58
|
+
#
|
59
|
+
def unit?
|
60
|
+
!@unit.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# Determines if the DMARC URI matches the other.
|
65
|
+
#
|
66
|
+
# @param [Object] other
|
67
|
+
# the other DMARC URI to compare against.
|
68
|
+
#
|
69
|
+
# @return [Boolean]
|
70
|
+
#
|
71
|
+
def ==(other)
|
72
|
+
(self.class == other.class) &&
|
73
|
+
(@uri == other.uri) &&
|
74
|
+
(@size == other.size) &&
|
75
|
+
(@unit == other.unit)
|
76
|
+
end
|
77
|
+
|
78
|
+
#
|
79
|
+
# Converts the DMARC URI back into a String.
|
80
|
+
#
|
81
|
+
# @return [String]
|
82
|
+
#
|
83
|
+
def to_s
|
84
|
+
str = @uri.to_s
|
85
|
+
|
86
|
+
if (@size || @unit)
|
87
|
+
str << "!"
|
88
|
+
str << "#{@size}" if @size
|
89
|
+
str << "#{@unit}" if @unit
|
90
|
+
end
|
91
|
+
|
92
|
+
return str
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
#
|
98
|
+
# Pass all missing methods to {#uri}.
|
99
|
+
#
|
100
|
+
def method_missing(name,*arguments,&block)
|
101
|
+
@uri.send(name,*arguments,&block)
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
data/lib/dmarc/version.rb
CHANGED
data/spec/parser_spec.rb
CHANGED
@@ -365,8 +365,8 @@ describe Parser do
|
|
365
365
|
expect(subject).to include(aspf: :r)
|
366
366
|
end
|
367
367
|
|
368
|
-
it "should convert {uri: ...} to
|
369
|
-
expect(subject).to include(rua: [URI("mailto:d@rua.agari.com")])
|
368
|
+
it "should convert {uri: ...} to Uri objects" do
|
369
|
+
expect(subject).to include(rua: [Uri.new(URI("mailto:d@rua.agari.com"))])
|
370
370
|
end
|
371
371
|
end
|
372
372
|
|
data/spec/uri_spec.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dmarc/uri'
|
3
|
+
|
4
|
+
describe DMARC::Uri do
|
5
|
+
let(:uri) { URI("mailto:d@ruf.agari.com") }
|
6
|
+
let(:size) { 10 }
|
7
|
+
let(:unit) { :m }
|
8
|
+
|
9
|
+
subject { described_class.new(uri,size,unit) }
|
10
|
+
|
11
|
+
describe "#initialize" do
|
12
|
+
it "should set the uri" do
|
13
|
+
expect(subject.uri).to be uri
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should set the size" do
|
17
|
+
expect(subject.size).to be size
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set the unit" do
|
21
|
+
expect(subject.unit).to be unit
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when size is omitted" do
|
25
|
+
subject { described_class.new(uri) }
|
26
|
+
|
27
|
+
it "should set size to nil" do
|
28
|
+
expect(subject.size).to be(nil)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should set unit to nil" do
|
32
|
+
expect(subject.unit).to be(nil)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when unit is omitted" do
|
37
|
+
subject { described_class.new(uri,size) }
|
38
|
+
|
39
|
+
it "should set size" do
|
40
|
+
expect(subject.size).to be(size)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should set unit to nil" do
|
44
|
+
expect(subject.unit).to be(nil)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#size?" do
|
50
|
+
context "when size is nil" do
|
51
|
+
subject { described_class.new(uri) }
|
52
|
+
|
53
|
+
it { expect(subject.size?).to be(false) }
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when size is set" do
|
57
|
+
subject { described_class.new(uri,size) }
|
58
|
+
|
59
|
+
it { expect(subject.size?).to be(true) }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#unit?" do
|
64
|
+
context "when unit is nil" do
|
65
|
+
subject { described_class.new(uri,size) }
|
66
|
+
|
67
|
+
it { expect(subject.unit?).to be(false) }
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when unit is set" do
|
71
|
+
subject { described_class.new(uri,size,unit) }
|
72
|
+
|
73
|
+
it { expect(subject.unit?).to be(true) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "#==" do
|
78
|
+
context "when other is a #{described_class}" do
|
79
|
+
context "and all fields match" do
|
80
|
+
let(:other) { described_class.new(uri.dup,size,unit) }
|
81
|
+
|
82
|
+
it { expect(subject == other).to be(true) }
|
83
|
+
end
|
84
|
+
|
85
|
+
context "but the uri is different" do
|
86
|
+
let(:other_uri) { URI("mailto:foo@example.com") }
|
87
|
+
let(:other) { described_class.new(other_uri,size,unit) }
|
88
|
+
|
89
|
+
it { expect(subject == other).to be(false) }
|
90
|
+
end
|
91
|
+
|
92
|
+
context "but the size is different" do
|
93
|
+
let(:other) { described_class.new(uri,42,unit) }
|
94
|
+
|
95
|
+
it { expect(subject == other).to be(false) }
|
96
|
+
end
|
97
|
+
|
98
|
+
context "but the unit is different" do
|
99
|
+
let(:other) { described_class.new(uri,size,:t) }
|
100
|
+
|
101
|
+
it { expect(subject == other).to be(false) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "when other is a different class" do
|
106
|
+
let(:other) { Object.new }
|
107
|
+
|
108
|
+
it { expect(subject == other).to be(false) }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#to_s" do
|
113
|
+
context "when only the uri is set" do
|
114
|
+
subject { described_class.new(uri) }
|
115
|
+
|
116
|
+
it "should return the uri" do
|
117
|
+
expect(subject.to_s).to be == uri.to_s
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "when uri and size are set" do
|
122
|
+
subject { described_class.new(uri,size) }
|
123
|
+
|
124
|
+
it "should return the uri!size" do
|
125
|
+
expect(subject.to_s).to be == "#{uri}!#{size}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context "when uri, size and unit are set" do
|
130
|
+
it "should return the uri!size" do
|
131
|
+
expect(subject.to_s).to be == "#{uri}!#{size}#{unit}"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "#method_missing" do
|
137
|
+
it "should pass through methods to uri" do
|
138
|
+
expect(subject.host).to be(uri.host)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dmarc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Davis Gallinghouse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|
@@ -61,12 +61,14 @@ files:
|
|
61
61
|
- lib/dmarc/exceptions.rb
|
62
62
|
- lib/dmarc/parser.rb
|
63
63
|
- lib/dmarc/record.rb
|
64
|
+
- lib/dmarc/uri.rb
|
64
65
|
- lib/dmarc/version.rb
|
65
66
|
- spec/data/alexa.csv
|
66
67
|
- spec/dmarc_spec.rb
|
67
68
|
- spec/parser_spec.rb
|
68
69
|
- spec/record_spec.rb
|
69
70
|
- spec/spec_helper.rb
|
71
|
+
- spec/uri_spec.rb
|
70
72
|
- tasks/alexa.rb
|
71
73
|
homepage: https://github.com/trailofbits/dmarc#readme
|
72
74
|
licenses:
|
@@ -98,4 +100,4 @@ test_files:
|
|
98
100
|
- spec/parser_spec.rb
|
99
101
|
- spec/record_spec.rb
|
100
102
|
- spec/spec_helper.rb
|
101
|
-
|
103
|
+
- spec/uri_spec.rb
|