dkim 0.1.0 → 1.1.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.
@@ -0,0 +1,112 @@
1
+
2
+ require 'test_helper'
3
+
4
+ module Dkim
5
+ class SignedMailTest < Minitest::Test
6
+ def setup
7
+ @mail = EXAMPLEEMAIL.dup
8
+ end
9
+
10
+ def test_defaults
11
+ signed_mail = SignedMail.new(@mail, :time => Time.at(1234567890))
12
+ dkim_header = signed_mail.dkim_header.list
13
+
14
+ assert_equal 'rsa-sha256', dkim_header['a']
15
+ assert_equal 'brisbane', dkim_header['s']
16
+ assert_equal 'example.com', dkim_header['d']
17
+ assert_equal 'relaxed/relaxed', dkim_header['c']
18
+ assert_equal 'dns/txt', dkim_header['q']
19
+ assert_equal 'from:to:subject:date:message-id', dkim_header['h']
20
+
21
+ # bh value from RFC 6376
22
+ assert_equal '2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=', dkim_header['bh']
23
+ assert_equal 'dQOeSpGJTfSbX4hPGGsy4ipcNAzC/33K7XaEXkjBneJJhv6MczHkJNsfmXeYESNIh5WVTuvE5IbnDPBVFrL+b3GKiLiyp/vlKO2NJViX4dLnKT/GdxjJh06ljZcYjUA+PorHvMwdu+cDsCffN8A7IhfVdsFruQr3vFPD0JyJ9XU=', dkim_header['b']
24
+ end
25
+
26
+ def test_overrides
27
+ options = {
28
+ :domain => 'example.org',
29
+ :selector => 'sidney',
30
+ :time => Time.now,
31
+ :signing_algorithm => 'rsa-sha1',
32
+ :header_canonicalization => 'simple',
33
+ :body_canonicalization => 'simple',
34
+ :time => Time.at(1234567890)
35
+ }
36
+ signed_mail = SignedMail.new(@mail, options)
37
+ dkim_header = signed_mail.dkim_header.list
38
+
39
+ assert_equal 'rsa-sha1', dkim_header['a']
40
+ assert_equal 'sidney', dkim_header['s']
41
+ assert_equal 'example.org', dkim_header['d']
42
+ assert_equal 'simple/simple', dkim_header['c']
43
+ assert_equal 'dns/txt', dkim_header['q']
44
+ assert_equal "from:to:subject:date:message-id", dkim_header['h']
45
+ assert_equal 'yk6W9pJJilr5MMgeEdSd7J3IaJI=', dkim_header['bh']
46
+ assert_equal 't+dk4yxTI2ByZxxRzkwhZhM4WzTZjGWHiWnS2t4pg7oT7fAIlMrfihJ/CIvGmYqYv4lbq4LStHqHx9TmEgxrkjLevHtuqhxkN55xJ2vA2QzTzFi2fMDZ4fFqWy4QtvlLjBAhevG+LXpmjPYec1cyeMlHlPAthq5+RNi6NHErJiM=', dkim_header['b']
47
+ end
48
+
49
+ def test_expire
50
+ options = {
51
+ :time => Time.at(1234567890),
52
+ :expire => Time.at(1234567990)
53
+ }
54
+ signed_mail = SignedMail.new(@mail, options)
55
+ dkim_header = signed_mail.dkim_header.list
56
+
57
+ assert_equal 1234567990, dkim_header['x']
58
+ assert_equal '2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=', dkim_header['bh']
59
+ assert_equal 'dn2Y5rSXQNRBy904vwpvri6xcmlrwKDmDX4XtBgyABQw9jLTulgD/G61TeyqinwgaHiatQaYt4pnpzYQGMaCCg7MepkkpZAR4IggAnHo/qB4JRx5OYBslKCCwpeb70YOPdukVopEnaCoUfkCGJ5vvu3xXG1N+ajKWqYiZ0n4z+o=', dkim_header['b']
60
+ end
61
+
62
+ def test_identity
63
+ options = {
64
+ :domain => 'example.org',
65
+ :selector => 'sidney',
66
+ :identity => '@example.org',
67
+ :time => Time.at(1234567890)
68
+ }
69
+ signed_mail = SignedMail.new(@mail, options)
70
+ dkim_header = signed_mail.dkim_header.list
71
+
72
+ assert_equal '@example.org', dkim_header['i']
73
+ assert_equal '2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=', dkim_header['bh']
74
+ assert_equal 'dCiulbJTD+GCCItMij1IU/RO0+q73afdjmrCWV5Qu7BIT5Kbp5Oi3jqCzj/v8Juks2/L6GBSXZia3aZprNVZX0szt8RnwC9NJx9WhcjN2RPz4Zf5F1jJivCN+PtaIWA3i3Ki/DR1q+RuNPgs7T1KKMo3Ih5uHubZIsMwRzbQBc0=', dkim_header['b']
75
+ end
76
+
77
+ def test_empty_body_hashes
78
+ @mail = @mail.split("\n\n").first + "\n\n"
79
+
80
+ # the following are from RFC 6376 section 3.4.3 and 3.4.4
81
+ [
82
+ # [bh, options]
83
+ ['uoq1oCgLlTqpdDX/iUbLy7J1Wic=', {:body_canonicalization => 'simple', :signing_algorithm => 'rsa-sha1' }],
84
+ ['frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=', {:body_canonicalization => 'simple', :signing_algorithm => 'rsa-sha256'}],
85
+ ['2jmj7l5rSw0yVb/vlWAYkK/YBwk=', {:body_canonicalization => 'relaxed', :signing_algorithm => 'rsa-sha1' }],
86
+ ['47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=', {:body_canonicalization => 'relaxed', :signing_algorithm => 'rsa-sha256'}],
87
+ ].each do |body_hash, options|
88
+ signed_mail = SignedMail.new(@mail, options)
89
+ dkim_header = signed_mail.dkim_header.list
90
+
91
+ assert_equal body_hash, dkim_header['bh']
92
+ end
93
+ end
94
+
95
+ def test_multiple_instances_of_header
96
+ @mail = <<-eos
97
+ Received: <A>
98
+ Received: <B>
99
+ Received: <C>
100
+
101
+ eos
102
+
103
+ signed_mail = SignedMail.new(@mail, :header_canonicalization => 'simple', :signable_headers => Dkim::DefaultHeaders + ['Received'])
104
+
105
+ assert_equal "received:received:received", signed_mail.dkim_header['h']
106
+
107
+ headers = signed_mail.canonical_header
108
+ assert_equal "Received: <C>\r\nReceived: <B>\r\nReceived: <A>\r\n", headers.to_s
109
+ end
110
+ end
111
+ end
112
+
@@ -0,0 +1,28 @@
1
+
2
+ require 'test_helper'
3
+
4
+ module Dkim
5
+ class TagValueListTest < Minitest::Test
6
+ def test_replacement
7
+ @list = TagValueList.new
8
+
9
+ @list['a'] = '1'
10
+ @list['b'] = '2'
11
+ @list['c'] = '3'
12
+ assert_equal 'a=1; b=2; c=3', @list.to_s
13
+
14
+ @list['b'] = '4'
15
+ assert_equal 'a=1; b=4; c=3', @list.to_s
16
+ end
17
+ def test_correct_format
18
+ @list = TagValueList.new
19
+
20
+ @list['b'] = '2'
21
+ @list['a'] = '1'
22
+ @list['c'] = '!@#$%^'
23
+
24
+ assert_equal 'b=2; a=1; c=!@#$%^', @list.to_s
25
+ end
26
+ end
27
+ end
28
+
data/test/test_helper.rb CHANGED
@@ -1,9 +1,11 @@
1
1
 
2
- require 'test/unit'
2
+ $LOAD_PATH << File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'minitest/autorun'
3
5
  require 'dkim'
4
6
 
5
7
  class String
6
- # Parse the format used in rfc4871
8
+ # Parse the format used in RFC 6376
7
9
  #
8
10
  # In the following examples, actual whitespace is used only for
9
11
  # clarity. The actual input and output text is designated using
@@ -23,7 +25,37 @@ class String
23
25
  end
24
26
  end
25
27
 
26
- # examples used in rfc
27
- Dkim::domain = 'example.com'
28
+ # examples used in RFC 6376
29
+ EXAMPLEEMAIL = %{
30
+ From: Joe SixPack <IIVyTowbcT@www.brandonchecketts.com>
31
+ To: Suzie Q <suzie@shopping.example.net>
32
+ Subject: Is dinner ready?
33
+ Date: Fri, 11 Jul 2003 21:00:37 -0700 (PDT)
34
+ Message-ID: <20030712040037.46341.5F8J@football.example.com>
35
+
36
+ Hi.
28
37
 
38
+ We lost the game. Are you hungry yet?
39
+
40
+ Joe.}.gsub(/\A\n/,'')
41
+
42
+ Dkim::domain = 'example.com'
43
+ Dkim::selector = 'brisbane'
44
+ Dkim::private_key = %{
45
+ -----BEGIN RSA PRIVATE KEY-----
46
+ MIICXwIBAAKBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYtIxN2SnFC
47
+ jxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v/RtdC2UzJ1lWT947qR+Rcac2gb
48
+ to/NMqJ0fzfVjH4OuKhitdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB
49
+ AoGBALmn+XwWk7akvkUlqb+dOxyLB9i5VBVfje89Teolwc9YJT36BGN/l4e0l6QX
50
+ /1//6DWUTB3KI6wFcm7TWJcxbS0tcKZX7FsJvUz1SbQnkS54DJck1EZO/BLa5ckJ
51
+ gAYIaqlA9C0ZwM6i58lLlPadX/rtHb7pWzeNcZHjKrjM461ZAkEA+itss2nRlmyO
52
+ n1/5yDyCluST4dQfO8kAB3toSEVc7DeFeDhnC1mZdjASZNvdHS4gbLIA1hUGEF9m
53
+ 3hKsGUMMPwJBAPW5v/U+AWTADFCS22t72NUurgzeAbzb1HWMqO4y4+9Hpjk5wvL/
54
+ eVYizyuce3/fGke7aRYw/ADKygMJdW8H/OcCQQDz5OQb4j2QDpPZc0Nc4QlbvMsj
55
+ 7p7otWRO5xRa6SzXqqV3+F0VpqvDmshEBkoCydaYwc2o6WQ5EBmExeV8124XAkEA
56
+ qZzGsIxVP+sEVRWZmW6KNFSdVUpk3qzK0Tz/WjQMe5z0UunY9Ax9/4PVhp/j61bf
57
+ eAYXunajbBSOLlx4D+TunwJBANkPI5S9iylsbLs6NkaMHV6k5ioHBBmgCak95JGX
58
+ GMot/L2x0IYyMLAz6oLWh2hm7zwtb0CgOrPo1ke44hFYnfc=
59
+ -----END RSA PRIVATE KEY-----
60
+ }
29
61
 
metadata CHANGED
@@ -1,16 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dkim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - John Hawthorn
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-12-10 00:00:00.000000000 Z
13
- dependencies: []
11
+ date: 2021-12-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mail
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: appraisal
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'
14
69
  description: gem for adding DKIM signatures to email messages
15
70
  email:
16
71
  - john.hawthorn@gmail.com
@@ -19,49 +74,71 @@ executables:
19
74
  extensions: []
20
75
  extra_rdoc_files: []
21
76
  files:
22
- - .gitignore
77
+ - ".github/workflows/test.yml"
78
+ - ".gitignore"
79
+ - Appraisals
23
80
  - CHANGELOG.md
24
81
  - Gemfile
25
82
  - README.md
26
83
  - Rakefile
27
84
  - bin/dkimsign.rb
28
85
  - dkim.gemspec
86
+ - gemfiles/mail_2.6.gemfile
87
+ - gemfiles/mail_2.7.gemfile
29
88
  - lib/dkim.rb
30
89
  - lib/dkim/body.rb
31
90
  - lib/dkim/canonicalizable.rb
91
+ - lib/dkim/canonicalized_headers.rb
32
92
  - lib/dkim/dkim_header.rb
93
+ - lib/dkim/encodings.rb
94
+ - lib/dkim/encodings/base64.rb
95
+ - lib/dkim/encodings/dkim_quoted_printable.rb
96
+ - lib/dkim/encodings/plain_text.rb
33
97
  - lib/dkim/header.rb
34
- - lib/dkim/header_list.rb
35
98
  - lib/dkim/interceptor.rb
99
+ - lib/dkim/options.rb
36
100
  - lib/dkim/signed_mail.rb
101
+ - lib/dkim/tag_value_list.rb
37
102
  - lib/dkim/version.rb
38
103
  - lib/mail/dkim_field.rb
39
- - test/canonicalization_test.rb
104
+ - test/dkim/canonicalization_test.rb
105
+ - test/dkim/canonicalized_headers_test.rb
106
+ - test/dkim/dkim_header_test.rb
107
+ - test/dkim/encodings_test.rb
108
+ - test/dkim/interceptor_test.rb
109
+ - test/dkim/options_test.rb
110
+ - test/dkim/signed_mail_test.rb
111
+ - test/dkim/tag_value_list_test.rb
40
112
  - test/test_helper.rb
41
113
  homepage: https://github.com/jhawthorn/dkim
42
114
  licenses: []
43
- post_install_message:
115
+ metadata: {}
116
+ post_install_message:
44
117
  rdoc_options: []
45
118
  require_paths:
46
119
  - lib
47
120
  required_ruby_version: !ruby/object:Gem::Requirement
48
- none: false
49
121
  requirements:
50
- - - ! '>='
122
+ - - ">="
51
123
  - !ruby/object:Gem::Version
52
124
  version: '0'
53
125
  required_rubygems_version: !ruby/object:Gem::Requirement
54
- none: false
55
126
  requirements:
56
- - - ! '>='
127
+ - - ">="
57
128
  - !ruby/object:Gem::Version
58
129
  version: '0'
59
130
  requirements: []
60
- rubyforge_project: dkim
61
- rubygems_version: 1.8.10
62
- signing_key:
63
- specification_version: 3
131
+ rubygems_version: 3.1.4
132
+ signing_key:
133
+ specification_version: 4
64
134
  summary: DKIM library in ruby
65
135
  test_files:
66
- - test/canonicalization_test.rb
136
+ - test/dkim/canonicalization_test.rb
137
+ - test/dkim/canonicalized_headers_test.rb
138
+ - test/dkim/dkim_header_test.rb
139
+ - test/dkim/encodings_test.rb
140
+ - test/dkim/interceptor_test.rb
141
+ - test/dkim/options_test.rb
142
+ - test/dkim/signed_mail_test.rb
143
+ - test/dkim/tag_value_list_test.rb
67
144
  - test/test_helper.rb
@@ -1,19 +0,0 @@
1
- module Dkim
2
- class HeaderList
3
- include Enumerable
4
- def initialize headers
5
- @headers = headers.split(/\r?\n(?!([ \t]))/).map do |header|
6
- key, value = header.split(':', 2)
7
- Header.new(key, value)
8
- end
9
- end
10
- def [](key)
11
- @headers.detect do |header|
12
- header.relaxed_key == key
13
- end
14
- end
15
- def each(&block)
16
- @headers.each(&block)
17
- end
18
- end
19
- end
@@ -1,78 +0,0 @@
1
-
2
- require 'test_helper'
3
-
4
- class CanonicalizationTest < Test::Unit::TestCase
5
- # from section 3.4.6 of rfc4871
6
- def setup
7
- @input = <<-eos.rfc_format
8
- A: <SP> X <CRLF>
9
- B <SP> : <SP> Y <HTAB><CRLF>
10
- <HTAB> Z <SP><SP><CRLF>
11
- <CRLF>
12
- <SP> C <SP><CRLF>
13
- D <SP><HTAB><SP> E <CRLF>
14
- <CRLF>
15
- <CRLF>
16
- eos
17
- @mail = Dkim::SignedMail.new(@input)
18
- @mail.signable_headers = ['A', 'B']
19
- end
20
- def test_relaxed_header
21
- @mail.header_canonicalization = 'relaxed'
22
- expected_header = <<-eos.rfc_format
23
- a:X <CRLF>
24
- b:Y <SP> Z <CRLF>
25
- eos
26
- assert_equal expected_header, @mail.canonical_header
27
- end
28
- def test_relaxed_body
29
- @mail.body_canonicalization = 'relaxed'
30
- expected_body = <<-eos.rfc_format
31
- <SP> C <CRLF>
32
- D <SP> E <CRLF>
33
- eos
34
- assert_equal expected_body, @mail.canonical_body
35
- end
36
-
37
- def test_simple_header
38
- @mail.header_canonicalization = 'simple'
39
- expected_header = <<-eos.rfc_format
40
- A: <SP> X <CRLF>
41
- B <SP> : <SP> Y <HTAB><CRLF>
42
- <HTAB> Z <SP><SP><CRLF>
43
- eos
44
- assert_equal expected_header, @mail.canonical_header
45
- end
46
- def test_simple_body
47
- @mail.body_canonicalization = 'simple'
48
- expected_body = <<-eos.rfc_format
49
- <SP> C <SP><CRLF>
50
- D <SP><HTAB><SP> E <CRLF>
51
- eos
52
- assert_equal expected_body, @mail.canonical_body
53
- end
54
-
55
- # from errata: empty bodies
56
- def test_simple_empty_body
57
- @mail = Dkim::SignedMail.new("test: test\r\n\r\n")
58
- @mail.body_canonicalization = 'simple'
59
-
60
- assert_equal "\r\n", @mail.canonical_body
61
- end
62
-
63
- def test_relaxed_empty_body
64
- @mail = Dkim::SignedMail.new("test: test\r\n\r\n")
65
- @mail.body_canonicalization = 'relaxed'
66
-
67
- assert_equal "", @mail.canonical_body
68
- end
69
-
70
- def test_relaxed_errata_1384
71
- body = "testing<crlf><sp><sp><cr><lf><cr><lf>".rfc_format
72
- @mail = Dkim::SignedMail.new("test: test\r\n\r\n#{body}")
73
- @mail.body_canonicalization = 'relaxed'
74
-
75
- assert_equal "testing\r\n", @mail.canonical_body
76
- end
77
- end
78
-