gurgitate-mail 1.10.0 → 1.10.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/gurgitate-mail +0 -0
- data/lib/gurgitate-mail.rb +107 -15
- data/lib/gurgitate/deliver/maildir.rb +4 -4
- data/lib/gurgitate/deliver/mbox.rb +5 -5
- data/lib/gurgitate/deliver/mh.rb +15 -15
- data/lib/gurgitate/headers.rb +10 -7
- data/lib/gurgitate/mail_headers.rb +166 -0
- data/lib/gurgitate/mailmessage.rb +56 -27
- data/lib/gurgitate/message.rb +113 -0
- data/test/gurgitate-test.rb +7 -1
- data/test/runtests.rb +16 -7
- data/test/test_configuration.rb +6 -0
- data/test/test_deliver.rb +6 -0
- data/test/test_delivery.rb +6 -0
- data/test/test_execute_rules.rb +43 -0
- data/test/test_gurgitate_delivery.rb +52 -57
- data/test/test_header.rb +19 -7
- data/test/test_headers.rb +60 -84
- data/test/test_headers_creating_from_hash.rb +18 -0
- data/test/test_headers_meddling_with_headers.rb +57 -0
- data/test/test_mail_headers.rb +429 -0
- data/test/test_mail_headers_meddling_with_headers.rb +60 -0
- data/test/test_process.rb +2 -1
- data/test/test_rules.rb +9 -1
- data/test/test_writing.rb +1 -2
- metadata +60 -44
data/test/test_header.rb
CHANGED
@@ -1,10 +1,5 @@
|
|
1
|
-
#!/opt/bin/ruby -w
|
2
|
-
|
3
|
-
#------------------------------------------------------------------------
|
4
|
-
#
|
5
|
-
#------------------------------------------------------------------------
|
6
|
-
|
7
1
|
builddir = File.join(File.dirname(__FILE__),"..")
|
2
|
+
|
8
3
|
unless $:[0] == builddir
|
9
4
|
$:.unshift builddir
|
10
5
|
end
|
@@ -14,7 +9,6 @@ require 'test/unit/ui/console/testrunner'
|
|
14
9
|
require 'stringio'
|
15
10
|
|
16
11
|
class TC_Header < Test::Unit::TestCase
|
17
|
-
|
18
12
|
def setup
|
19
13
|
require 'gurgitate-mail'
|
20
14
|
end
|
@@ -43,6 +37,17 @@ class TC_Header < Test::Unit::TestCase
|
|
43
37
|
end
|
44
38
|
end
|
45
39
|
|
40
|
+
def test_illegal_header
|
41
|
+
assert_raises Gurgitate::IllegalHeader do
|
42
|
+
h=Gurgitate::Header.new("not actually a header")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_header_name_and_values_separate
|
47
|
+
h=Gurgitate::Header.new("From", "test@example.com")
|
48
|
+
assert_equal h.name, "From", "Preparsed header is not From"
|
49
|
+
assert_equal h.contents, "test@example.com", "Preparsed header has wrong contents"
|
50
|
+
end
|
46
51
|
|
47
52
|
# This is an illegal header that turns up in spam sometimes.
|
48
53
|
# Crashing when you get spam is bad.
|
@@ -152,5 +157,12 @@ class TC_Header < Test::Unit::TestCase
|
|
152
157
|
assert_equal(0,h.matches(/fromheader/),"Matches regex that would match input")
|
153
158
|
assert_equal(nil,h.matches(/notininput/),"Does not match regex that would not match input")
|
154
159
|
end
|
160
|
+
|
161
|
+
def test_string_match
|
162
|
+
h=Gurgitate::Header.new("From: fromheader@example.com")
|
163
|
+
assert_equal 0, h.matches("fromheader"), "doesn't match string properly"
|
164
|
+
assert_equal nil, h.matches("notininput"),
|
165
|
+
"matches something it shouldn't"
|
166
|
+
end
|
155
167
|
end
|
156
168
|
|
data/test/test_headers.rb
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
#!/opt/bin/ruby -w
|
2
|
-
|
3
|
-
#------------------------------------------------------------------------
|
4
|
-
#
|
5
|
-
#------------------------------------------------------------------------
|
6
|
-
|
7
1
|
require 'test/unit'
|
8
2
|
require 'test/unit/ui/console/testrunner'
|
9
3
|
require 'stringio'
|
@@ -15,16 +9,15 @@ end
|
|
15
9
|
|
16
10
|
class TC_Headers < Test::Unit::TestCase
|
17
11
|
def setup
|
18
|
-
|
12
|
+
$:.unshift File.dirname(__FILE__)
|
13
|
+
require "gurgitate/headers"
|
19
14
|
end
|
20
15
|
|
21
16
|
def test_single_header
|
22
17
|
h=Gurgitate::Headers.new(<<'EOF'
|
23
|
-
From fromline@example.com Sat Sep 27 12:20:25 PDT 2003
|
24
18
|
From: fromheader@example.com
|
25
19
|
EOF
|
26
20
|
)
|
27
|
-
assert_equal("fromline@example.com",h.from)
|
28
21
|
assert_equal(1,h["From"].length)
|
29
22
|
assert_equal("From",h["From"][0].name)
|
30
23
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
@@ -36,14 +29,14 @@ From fromline Sat Sep 27 12:20:25 PDT 2003
|
|
36
29
|
From: fromheader@example.com
|
37
30
|
EOF
|
38
31
|
)
|
39
|
-
assert_equal("fromline",h.from)
|
32
|
+
assert_equal("fromline", h.from)
|
40
33
|
assert_equal(1,h["From"].length)
|
41
34
|
assert_equal("From",h["From"][0].name)
|
42
35
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
43
36
|
assert_equal nil, h["To"]
|
44
37
|
end
|
45
38
|
|
46
|
-
def
|
39
|
+
def basic_header_test
|
47
40
|
h = Gurgitate::Headers.new(<<'EOF', "sender@example.com", "recipient@example.com")
|
48
41
|
From: fromheader@example.com
|
49
42
|
To: toheader@example.com
|
@@ -53,27 +46,28 @@ EOF
|
|
53
46
|
assert_equal("From", h["From"][0].name)
|
54
47
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
55
48
|
|
56
|
-
h
|
57
|
-
|
58
|
-
assert_equal("changedheader@example.com",h["From"][0].contents)
|
49
|
+
yield h
|
59
50
|
end
|
60
51
|
|
61
|
-
def
|
62
|
-
|
63
|
-
From
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
assert_equal("From", h["From"][0].name)
|
69
|
-
assert_equal("fromheader@example.com",h["From"][0].contents)
|
52
|
+
def test_changing_headers
|
53
|
+
basic_header_test do |h|
|
54
|
+
h["From"].sub! "fromheader", "changedheader"
|
55
|
+
|
56
|
+
assert_equal("changedheader@example.com",h["From"][0].contents)
|
57
|
+
end
|
58
|
+
end
|
70
59
|
|
71
|
-
new_header = h["From"].sub "fromheader", "changedheader"
|
72
60
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
61
|
+
def test_altered_headers
|
62
|
+
basic_header_test do |h|
|
63
|
+
new_header = h["From"].sub "fromheader", "changedheader"
|
64
|
+
|
65
|
+
assert Gurgitate::HeaderBag === new_header
|
66
|
+
assert_equal("changedheader@example.com",
|
67
|
+
new_header[0].contents, "sub didn't change contents")
|
68
|
+
assert_equal("fromheader@example.com",h["From"][0].contents,
|
69
|
+
"sub is changing in-place")
|
70
|
+
end
|
77
71
|
end
|
78
72
|
|
79
73
|
def test_matches
|
@@ -96,7 +90,7 @@ From Sat Sep 27 12:20:25 PDT 2003
|
|
96
90
|
From: fromheader@example.com
|
97
91
|
EOF
|
98
92
|
)
|
99
|
-
assert_equal("",h.from)
|
93
|
+
assert_equal("", h.from)
|
100
94
|
assert_equal(1,h["From"].length)
|
101
95
|
assert_equal("From",h["From"][0].name)
|
102
96
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
@@ -107,7 +101,6 @@ EOF
|
|
107
101
|
From: fromheader@example.com
|
108
102
|
EOF
|
109
103
|
)
|
110
|
-
assert_equal('fromheader@example.com',h.from)
|
111
104
|
assert_equal(1,h["From"].length)
|
112
105
|
assert_equal("From",h["From"][0].name)
|
113
106
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
@@ -117,22 +110,13 @@ EOF
|
|
117
110
|
h = Gurgitate::Headers.new(<<'EOF', "sender@example.com", "recipient@example.com")
|
118
111
|
From: fromheader@example.com
|
119
112
|
To: toheader@example.com
|
120
|
-
Subject: Subject
|
113
|
+
Subject: Subject line
|
121
114
|
EOF
|
122
115
|
assert_equal('sender@example.com', h.from)
|
123
116
|
assert_equal('recipient@example.com', h.to)
|
124
117
|
end
|
125
|
-
|
126
118
|
|
127
|
-
def
|
128
|
-
h=Gurgitate::Headers.new(<<'EOF'
|
129
|
-
From fromline@example.com Sat Sep 27 12:20:25 PDT 2003
|
130
|
-
From: fromheader@example.com
|
131
|
-
To: toheader@example.com
|
132
|
-
Subject: Subject line
|
133
|
-
EOF
|
134
|
-
)
|
135
|
-
assert_equal(h.from,"fromline@example.com")
|
119
|
+
def standard_headers_tests h
|
136
120
|
assert_equal(1,h["From"].length)
|
137
121
|
assert_equal("From",h["From"][0].name)
|
138
122
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
@@ -144,6 +128,17 @@ EOF
|
|
144
128
|
assert_equal("Subject line",h["Subject"][0].contents)
|
145
129
|
end
|
146
130
|
|
131
|
+
def multiple_headers_test
|
132
|
+
h=Gurgitate::Headers.new(<<'EOF'
|
133
|
+
From: fromheader@example.com
|
134
|
+
To: toheader@example.com
|
135
|
+
Subject: Subject line
|
136
|
+
EOF
|
137
|
+
)
|
138
|
+
assert_equal('fromheader@example.com',h.from)
|
139
|
+
standard_headers_tests h
|
140
|
+
end
|
141
|
+
|
147
142
|
def test_missing_fromline
|
148
143
|
h=Gurgitate::Headers.new(<<'EOF'
|
149
144
|
From: fromheader@example.com
|
@@ -152,12 +147,16 @@ Subject: Subject line
|
|
152
147
|
EOF
|
153
148
|
)
|
154
149
|
assert_equal('fromheader@example.com',h.from)
|
150
|
+
standard_headers_tests h
|
151
|
+
end
|
152
|
+
|
153
|
+
def multiline_default_tests h
|
154
|
+
assert_equal(h.from,"fromline@example.com")
|
155
155
|
assert_equal(1,h["From"].length)
|
156
156
|
assert_equal("From",h["From"][0].name)
|
157
157
|
assert_equal("fromheader@example.com",h["From"][0].contents)
|
158
158
|
assert_equal(1,h["To"].length)
|
159
159
|
assert_equal("To",h["To"][0].name)
|
160
|
-
assert_equal("toheader@example.com",h["To"][0].contents)
|
161
160
|
assert_equal(1,h["Subject"].length)
|
162
161
|
assert_equal("Subject",h["Subject"][0].name)
|
163
162
|
assert_equal("Subject line",h["Subject"][0].contents)
|
@@ -172,16 +171,9 @@ To: toheader@example.com,
|
|
172
171
|
Subject: Subject line
|
173
172
|
EOF
|
174
173
|
)
|
175
|
-
|
176
|
-
|
177
|
-
assert_equal("From",h["From"][0].name)
|
178
|
-
assert_equal("fromheader@example.com",h["From"][0].contents)
|
179
|
-
assert_equal(1,h["To"].length)
|
180
|
-
assert_equal("To",h["To"][0].name)
|
174
|
+
multiline_default_tests h
|
175
|
+
|
181
176
|
assert_equal("toheader@example.com,\n nexttoheader@example.com",h["To"][0].contents)
|
182
|
-
assert_equal(1,h["Subject"].length)
|
183
|
-
assert_equal("Subject",h["Subject"][0].name)
|
184
|
-
assert_equal("Subject line",h["Subject"][0].contents)
|
185
177
|
end
|
186
178
|
|
187
179
|
def test_multiline_headers_with_extra_colons
|
@@ -193,16 +185,9 @@ To: toheader@example.com,
|
|
193
185
|
Subject: Subject line
|
194
186
|
EOF
|
195
187
|
)
|
196
|
-
|
197
|
-
|
198
|
-
assert_equal("From",h["From"][0].name)
|
199
|
-
assert_equal("fromheader@example.com",h["From"][0].contents)
|
200
|
-
assert_equal(1,h["To"].length)
|
201
|
-
assert_equal("To",h["To"][0].name)
|
188
|
+
multiline_default_tests h
|
189
|
+
|
202
190
|
assert_equal("toheader@example.com,\n nexttoheader@example.com (The test: header)",h["To"][0].contents)
|
203
|
-
assert_equal(1,h["Subject"].length)
|
204
|
-
assert_equal("Subject",h["Subject"][0].name)
|
205
|
-
assert_equal("Subject line",h["Subject"][0].contents)
|
206
191
|
end
|
207
192
|
|
208
193
|
def test_multiline_headers_with_various_levels_of_indentation
|
@@ -216,16 +201,8 @@ To: toheader@example.com,
|
|
216
201
|
Subject: Subject line
|
217
202
|
EOF
|
218
203
|
)
|
219
|
-
|
220
|
-
assert_equal(1,h["From"].length)
|
221
|
-
assert_equal("From",h["From"][0].name)
|
222
|
-
assert_equal("fromheader@example.com",h["From"][0].contents)
|
223
|
-
assert_equal(1,h["To"].length)
|
224
|
-
assert_equal("To",h["To"][0].name)
|
204
|
+
multiline_default_tests h
|
225
205
|
assert_equal("toheader@example.com,\n nexttoheader@example.com,\n thirdtoheader@example.com,\n fourthtoheader@example.com",h["To"][0].contents)
|
226
|
-
assert_equal(1,h["Subject"].length)
|
227
|
-
assert_equal("Subject",h["Subject"][0].name)
|
228
|
-
assert_equal("Subject line",h["Subject"][0].contents)
|
229
206
|
end
|
230
207
|
|
231
208
|
def test_a_header_that_actually_crashed_gurgitate
|
@@ -298,7 +275,7 @@ List-Help: <mailto:nifty-request@mail.neurotica.com?subject=help>
|
|
298
275
|
List-Id: Nifty <nifty.mail.neurotica.com>
|
299
276
|
Original-recipient: rfc822;dagbrown@shaw.ca
|
300
277
|
EOF
|
301
|
-
|
278
|
+
)
|
302
279
|
assert_equal(h.from,"nifty-bounces@neurotica.com")
|
303
280
|
assert_equal(1,h["From"].length)
|
304
281
|
assert_equal("From",h["From"][0].name)
|
@@ -325,7 +302,7 @@ EOF
|
|
325
302
|
assert_equal("IAP password",h["Subject"][0].contents)
|
326
303
|
end
|
327
304
|
|
328
|
-
def
|
305
|
+
def test_fromheader_no_hostname # illegal from header?
|
329
306
|
m=<<'EOF'
|
330
307
|
From HEYITBLEWUP Sat Mar 27 16:02:12 PST 2004
|
331
308
|
Received: from ohno.mrbill.net (ohno.mrbill.net [207.200.6.75])
|
@@ -348,13 +325,19 @@ EOF
|
|
348
325
|
assert_equal(1,h["From"].length)
|
349
326
|
end
|
350
327
|
|
351
|
-
def
|
328
|
+
def editing_template
|
352
329
|
m = <<'EOF'
|
353
330
|
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
354
331
|
From: fromline@example.com
|
355
332
|
To: toline@example.com
|
356
333
|
Subject: Subject line
|
357
334
|
EOF
|
335
|
+
return m.clone
|
336
|
+
end
|
337
|
+
|
338
|
+
def test_editing_header
|
339
|
+
m = editing_template
|
340
|
+
|
358
341
|
h=Gurgitate::Headers.new(m)
|
359
342
|
h["From"]="anotherfromline@example.com"
|
360
343
|
assert_equal("anotherfromline@example.com",h["From"][0].contents,
|
@@ -364,12 +347,8 @@ EOF
|
|
364
347
|
end
|
365
348
|
|
366
349
|
def test_editing_from
|
367
|
-
m =
|
368
|
-
|
369
|
-
From: fromline@example.com
|
370
|
-
To: toline@example.com
|
371
|
-
Subject: Subject line
|
372
|
-
EOF
|
350
|
+
m = editing_template
|
351
|
+
|
373
352
|
h=Gurgitate::Headers.new(m)
|
374
353
|
t=Time.new.to_s
|
375
354
|
h.from="anotherfromline@example.com"
|
@@ -380,12 +359,8 @@ EOF
|
|
380
359
|
end
|
381
360
|
|
382
361
|
def test_match_multiple_headers
|
383
|
-
m =
|
384
|
-
|
385
|
-
From: fromline@example.com
|
386
|
-
To: toline@example.com
|
387
|
-
Subject: Subject line
|
388
|
-
EOF
|
362
|
+
m = editing_template
|
363
|
+
|
389
364
|
h=Gurgitate::Headers.new(m)
|
390
365
|
assert_equal(true,h["From","To"] =~ /fromline@example.com/,
|
391
366
|
"headers contains fromline")
|
@@ -482,3 +457,4 @@ EOF
|
|
482
457
|
end
|
483
458
|
end
|
484
459
|
|
460
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
builddir = File.join(File.dirname(__FILE__),"..")
|
2
|
+
|
3
|
+
unless $:[0] == builddir
|
4
|
+
$:.unshift builddir
|
5
|
+
end
|
6
|
+
|
7
|
+
require "test/test_headers_meddling_with_headers"
|
8
|
+
|
9
|
+
class TC_Headers_creating_from_hash < TC_Headers_meddling_with_headers
|
10
|
+
def setup
|
11
|
+
$:.unshift File.dirname(__FILE__)
|
12
|
+
require "gurgitate/headers"
|
13
|
+
|
14
|
+
@headers = Gurgitate::Headers.new :from => "fromline@example.com",
|
15
|
+
:to => "toline@example.com",
|
16
|
+
:subject => "Subject line"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/unit/ui/console/testrunner'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
builddir = File.join(File.dirname(__FILE__),"..")
|
6
|
+
|
7
|
+
unless $:[0] == builddir
|
8
|
+
$:.unshift builddir
|
9
|
+
end
|
10
|
+
|
11
|
+
class TC_Headers_meddling_with_headers < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
$:.unshift File.dirname(__FILE__)
|
14
|
+
require "gurgitate/headers"
|
15
|
+
|
16
|
+
@message = <<'EOF'
|
17
|
+
From: fromline@example.com
|
18
|
+
To: toline@example.com
|
19
|
+
Subject: Subject Line
|
20
|
+
EOF
|
21
|
+
|
22
|
+
@headers = Gurgitate::Headers.new @message
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_match
|
26
|
+
assert @headers.match("From", /example.com/)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_nomatch
|
30
|
+
assert !@headers.match("From", /lart.ca/)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_match_regex
|
34
|
+
result = nil
|
35
|
+
assert_nothing_raised do
|
36
|
+
result = @headers.match "From", /example.com/
|
37
|
+
end
|
38
|
+
assert result
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_match_string
|
42
|
+
result = nil
|
43
|
+
|
44
|
+
assert_nothing_raised do
|
45
|
+
assert result = @headers.match("From", "example.com")
|
46
|
+
end
|
47
|
+
|
48
|
+
assert result
|
49
|
+
result = nil
|
50
|
+
|
51
|
+
assert_nothing_raised do
|
52
|
+
result = @headers.match("From", "e.ample.com")
|
53
|
+
end
|
54
|
+
|
55
|
+
assert !result
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,429 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/unit/ui/console/testrunner'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
builddir = File.join(File.dirname(__FILE__),"..")
|
6
|
+
|
7
|
+
unless $:[0] == builddir
|
8
|
+
$:.unshift builddir
|
9
|
+
end
|
10
|
+
|
11
|
+
class TC_Mail_headers < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
require 'gurgitate/mail_headers'
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_single_header
|
17
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
18
|
+
From fromline@example.com Sat Sep 27 12:20:25 PDT 2003
|
19
|
+
From: fromheader@example.com
|
20
|
+
EOF
|
21
|
+
)
|
22
|
+
assert_equal("fromline@example.com",h.from)
|
23
|
+
assert_equal(1,h["From"].length)
|
24
|
+
assert_equal("From",h["From"][0].name)
|
25
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_fromline_simple_username
|
29
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
30
|
+
From fromline Sat Sep 27 12:20:25 PDT 2003
|
31
|
+
From: fromheader@example.com
|
32
|
+
EOF
|
33
|
+
)
|
34
|
+
assert_equal("fromline",h.from)
|
35
|
+
assert_equal(1,h["From"].length)
|
36
|
+
assert_equal("From",h["From"][0].name)
|
37
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
38
|
+
assert_equal nil, h["To"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_changing_headers
|
42
|
+
h = Gurgitate::MailHeaders.new(<<'EOF', "sender@example.com", "recipient@example.com")
|
43
|
+
From: fromheader@example.com
|
44
|
+
To: toheader@example.com
|
45
|
+
Subject: Subject
|
46
|
+
EOF
|
47
|
+
assert_equal(1,h["From"].length)
|
48
|
+
assert_equal("From", h["From"][0].name)
|
49
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
50
|
+
|
51
|
+
h["From"].sub! "fromheader", "changedheader"
|
52
|
+
|
53
|
+
assert_equal("changedheader@example.com",h["From"][0].contents)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_altered_headers
|
57
|
+
h = Gurgitate::MailHeaders.new(<<'EOF', "sender@example.com", "recipient@example.com")
|
58
|
+
From: fromheader@example.com
|
59
|
+
To: toheader@example.com
|
60
|
+
Subject: Subject
|
61
|
+
EOF
|
62
|
+
assert_equal(1,h["From"].length)
|
63
|
+
assert_equal("From", h["From"][0].name)
|
64
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
65
|
+
|
66
|
+
new_header = h["From"].sub "fromheader", "changedheader"
|
67
|
+
|
68
|
+
assert Gurgitate::HeaderBag === new_header
|
69
|
+
assert_equal("changedheader@example.com",
|
70
|
+
new_header[0].contents)
|
71
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_matches
|
75
|
+
h = Gurgitate::MailHeaders.new(<<'EOF', "sender@example.com", "recipient@example.com")
|
76
|
+
From: fromheader@example.com
|
77
|
+
To: toheader@example.com
|
78
|
+
Subject: Subject
|
79
|
+
EOF
|
80
|
+
assert h.matches(["From", "To"], /example.com/)
|
81
|
+
assert !h.matches(["From", "To"], /example.net/)
|
82
|
+
|
83
|
+
assert h.matches("From", /example.com/)
|
84
|
+
assert !h.matches("From", /example.net/)
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def test_fromline_no_username
|
89
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
90
|
+
From Sat Sep 27 12:20:25 PDT 2003
|
91
|
+
From: fromheader@example.com
|
92
|
+
EOF
|
93
|
+
)
|
94
|
+
assert_equal("",h.from)
|
95
|
+
assert_equal(1,h["From"].length)
|
96
|
+
assert_equal("From",h["From"][0].name)
|
97
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_missing_toline
|
101
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
102
|
+
From: fromheader@example.com
|
103
|
+
EOF
|
104
|
+
)
|
105
|
+
assert_equal('fromheader@example.com',h.from)
|
106
|
+
assert_equal(1,h["From"].length)
|
107
|
+
assert_equal("From",h["From"][0].name)
|
108
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_sender_and_recipient
|
112
|
+
h = Gurgitate::MailHeaders.new(<<'EOF', "sender@example.com", "recipient@example.com")
|
113
|
+
From: fromheader@example.com
|
114
|
+
To: toheader@example.com
|
115
|
+
Subject: Subject
|
116
|
+
EOF
|
117
|
+
assert_equal('sender@example.com', h.from)
|
118
|
+
assert_equal('recipient@example.com', h.to)
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
def test_multiple_headers
|
123
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
124
|
+
From fromline@example.com Sat Sep 27 12:20:25 PDT 2003
|
125
|
+
From: fromheader@example.com
|
126
|
+
To: toheader@example.com
|
127
|
+
Subject: Subject line
|
128
|
+
EOF
|
129
|
+
)
|
130
|
+
assert_equal(h.from,"fromline@example.com")
|
131
|
+
assert_equal(1,h["From"].length)
|
132
|
+
assert_equal("From",h["From"][0].name)
|
133
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
134
|
+
assert_equal(1,h["To"].length)
|
135
|
+
assert_equal("To",h["To"][0].name)
|
136
|
+
assert_equal("toheader@example.com",h["To"][0].contents)
|
137
|
+
assert_equal(1,h["Subject"].length)
|
138
|
+
assert_equal("Subject",h["Subject"][0].name)
|
139
|
+
assert_equal("Subject line",h["Subject"][0].contents)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_missing_fromline
|
143
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
144
|
+
From: fromheader@example.com
|
145
|
+
To: toheader@example.com
|
146
|
+
Subject: Subject line
|
147
|
+
EOF
|
148
|
+
)
|
149
|
+
assert_equal('fromheader@example.com',h.from)
|
150
|
+
assert_equal(1,h["From"].length)
|
151
|
+
assert_equal("From",h["From"][0].name)
|
152
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
153
|
+
assert_equal(1,h["To"].length)
|
154
|
+
assert_equal("To",h["To"][0].name)
|
155
|
+
assert_equal("toheader@example.com",h["To"][0].contents)
|
156
|
+
assert_equal(1,h["Subject"].length)
|
157
|
+
assert_equal("Subject",h["Subject"][0].name)
|
158
|
+
assert_equal("Subject line",h["Subject"][0].contents)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_multiline_headers
|
162
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
163
|
+
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
164
|
+
From: fromheader@example.com
|
165
|
+
To: toheader@example.com,
|
166
|
+
nexttoheader@example.com
|
167
|
+
Subject: Subject line
|
168
|
+
EOF
|
169
|
+
)
|
170
|
+
assert_equal(h.from,"fromline@example.com")
|
171
|
+
assert_equal(1,h["From"].length)
|
172
|
+
assert_equal("From",h["From"][0].name)
|
173
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
174
|
+
assert_equal(1,h["To"].length)
|
175
|
+
assert_equal("To",h["To"][0].name)
|
176
|
+
assert_equal("toheader@example.com,\n nexttoheader@example.com",h["To"][0].contents)
|
177
|
+
assert_equal(1,h["Subject"].length)
|
178
|
+
assert_equal("Subject",h["Subject"][0].name)
|
179
|
+
assert_equal("Subject line",h["Subject"][0].contents)
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_multiline_headers_with_extra_colons
|
183
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
184
|
+
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
185
|
+
From: fromheader@example.com
|
186
|
+
To: toheader@example.com,
|
187
|
+
nexttoheader@example.com (The test: header)
|
188
|
+
Subject: Subject line
|
189
|
+
EOF
|
190
|
+
)
|
191
|
+
assert_equal(h.from,"fromline@example.com")
|
192
|
+
assert_equal(1,h["From"].length)
|
193
|
+
assert_equal("From",h["From"][0].name)
|
194
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
195
|
+
assert_equal(1,h["To"].length)
|
196
|
+
assert_equal("To",h["To"][0].name)
|
197
|
+
assert_equal("toheader@example.com,\n nexttoheader@example.com (The test: header)",h["To"][0].contents)
|
198
|
+
assert_equal(1,h["Subject"].length)
|
199
|
+
assert_equal("Subject",h["Subject"][0].name)
|
200
|
+
assert_equal("Subject line",h["Subject"][0].contents)
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_multiline_headers_with_various_levels_of_indentation
|
204
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
205
|
+
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
206
|
+
From: fromheader@example.com
|
207
|
+
To: toheader@example.com,
|
208
|
+
nexttoheader@example.com,
|
209
|
+
thirdtoheader@example.com,
|
210
|
+
fourthtoheader@example.com
|
211
|
+
Subject: Subject line
|
212
|
+
EOF
|
213
|
+
)
|
214
|
+
assert_equal(h.from,"fromline@example.com")
|
215
|
+
assert_equal(1,h["From"].length)
|
216
|
+
assert_equal("From",h["From"][0].name)
|
217
|
+
assert_equal("fromheader@example.com",h["From"][0].contents)
|
218
|
+
assert_equal(1,h["To"].length)
|
219
|
+
assert_equal("To",h["To"][0].name)
|
220
|
+
assert_equal("toheader@example.com,\n nexttoheader@example.com,\n thirdtoheader@example.com,\n fourthtoheader@example.com",h["To"][0].contents)
|
221
|
+
assert_equal(1,h["Subject"].length)
|
222
|
+
assert_equal("Subject",h["Subject"][0].name)
|
223
|
+
assert_equal("Subject line",h["Subject"][0].contents)
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_a_header_that_actually_crashed_gurgitate
|
227
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
228
|
+
Return-path: <nifty-bounces@neurotica.com>
|
229
|
+
Received: from pd8mr3no.prod.shaw.ca
|
230
|
+
(pd8mr3no-qfe2.prod.shaw.ca [10.0.144.160]) by l-daemon
|
231
|
+
(iPlanet Messaging Server 5.2 HotFix 1.16 (built May 14 2003))
|
232
|
+
with ESMTP id <0HO6002FDGPREL@l-daemon> for dagbrown@shaw.ca; Tue,
|
233
|
+
11 Nov 2003 00:56:15 -0700 (MST)
|
234
|
+
Received: from pd7mi4no.prod.shaw.ca ([10.0.149.117])
|
235
|
+
by l-daemon (iPlanet Messaging Server 5.2 HotFix 1.18 (built Jul 28 2003))
|
236
|
+
with ESMTP id <0HO60055LGPR40@l-daemon> for dagbrown@shaw.ca
|
237
|
+
(ORCPT dagbrown@shaw.ca); Tue, 11 Nov 2003 00:56:15 -0700 (MST)
|
238
|
+
Received: from venom.easydns.com (smtp.easyDNS.com [216.220.40.247])
|
239
|
+
by l-daemon (iPlanet Messaging Server 5.2 HotFix 1.18 (built Jul 28 2003))
|
240
|
+
with ESMTP id <0HO60079HGPR79@l-daemon> for dagbrown@shaw.ca; Tue,
|
241
|
+
11 Nov 2003 00:56:15 -0700 (MST)
|
242
|
+
Received: from ohno.mrbill.net (ohno.mrbill.net [207.200.6.75])
|
243
|
+
by venom.easydns.com (Postfix) with ESMTP id D6493722BB for
|
244
|
+
<dagbrown@lart.ca>; Tue, 11 Nov 2003 02:53:50 -0500 (EST)
|
245
|
+
Received: by ohno.mrbill.net (Postfix) id ED0AD53380; Tue,
|
246
|
+
11 Nov 2003 01:56:13 -0600 (CST)
|
247
|
+
Received: from mail.neurotica.com (neurotica.com [207.100.203.161])
|
248
|
+
by ohno.mrbill.net (Postfix) with ESMTP id 5CD465337F for
|
249
|
+
<dagbrown@dagbrown.com>; Tue, 11 Nov 2003 01:56:13 -0600 (CST)
|
250
|
+
Received: from mail.neurotica.com (localhost [127.0.0.1])
|
251
|
+
by mail.neurotica.com (Postfix) with ESMTP id CDAA2364C; Tue,
|
252
|
+
11 Nov 2003 02:56:03 -0500 (EST)
|
253
|
+
Received: from smtpzilla5.xs4all.nl (smtpzilla5.xs4all.nl [194.109.127.141])
|
254
|
+
by mail.neurotica.com (Postfix) with ESMTP id B6A22361E for
|
255
|
+
<nifty@neurotica.com>; Tue, 11 Nov 2003 02:56:00 -0500 (EST)
|
256
|
+
Received: from xs1.xs4all.nl (xs1.xs4all.nl [194.109.21.2])
|
257
|
+
by smtpzilla5.xs4all.nl (8.12.9/8.12.9) with ESMTP id hAB7u5ZZ042116 for
|
258
|
+
<nifty@neurotica.com>; Tue, 11 Nov 2003 08:56:05 +0100 (CET)
|
259
|
+
Received: from xs1.xs4all.nl (wstan@localhost.xs4all.nl [127.0.0.1])
|
260
|
+
by xs1.xs4all.nl (8.12.10/8.12.9) with ESMTP id hAB7u5xE048677 for
|
261
|
+
<nifty@neurotica.com>; Tue,
|
262
|
+
11 Nov 2003 08:56:05 +0100 (CET envelope-from wstan@xs4all.nl)
|
263
|
+
Received: (from wstan@localhost) by xs1.xs4all.nl (8.12.10/8.12.9/Submit)
|
264
|
+
id hAB7u4sZ048676 for nifty@neurotica.com; Tue,
|
265
|
+
11 Nov 2003 08:56:04 +0100 (CET envelope-from wstan)
|
266
|
+
Date: Tue, 11 Nov 2003 08:56:04 +0100
|
267
|
+
From: William Staniewicz <wstan@xs4all.nl>
|
268
|
+
Subject: Re: [nifty] Ping...
|
269
|
+
In-reply-to: <9636B78C-140B-11D8-9EE6-003065D0C184@nimitzbrood.com>
|
270
|
+
Sender: nifty-bounces@neurotica.com
|
271
|
+
To: Nifty <nifty@neurotica.com>
|
272
|
+
Cc:
|
273
|
+
Errors-to: nifty-bounces@neurotica.com
|
274
|
+
Reply-to: Nifty <nifty@neurotica.com>
|
275
|
+
Message-id: <20031111075604.GE79497@xs4all.nl>
|
276
|
+
MIME-version: 1.0
|
277
|
+
Content-type: text/plain; charset=us-ascii
|
278
|
+
Content-disposition: inline
|
279
|
+
Precedence: list
|
280
|
+
X-BeenThere: nifty@mail.neurotica.com
|
281
|
+
Delivered-to: dagbrown@mrbill.net
|
282
|
+
Delivered-to: nifty@neurotica.com
|
283
|
+
User-Agent: Mutt/1.4.1i
|
284
|
+
X-Original-To: nifty@neurotica.com
|
285
|
+
References: <9636B78C-140B-11D8-9EE6-003065D0C184@nimitzbrood.com>
|
286
|
+
X-Mailman-Version: 2.1.2
|
287
|
+
List-Post: <mailto:nifty@mail.neurotica.com>
|
288
|
+
List-Subscribe: <http://mail.neurotica.com:8080/mailman/listinfo/nifty>,
|
289
|
+
<mailto:nifty-request@mail.neurotica.com?subject=subscribe>
|
290
|
+
List-Unsubscribe: <http://mail.neurotica.com:8080/mailman/listinfo/nifty>,
|
291
|
+
<mailto:nifty-request@mail.neurotica.com?subject=unsubscribe>
|
292
|
+
List-Help: <mailto:nifty-request@mail.neurotica.com?subject=help>
|
293
|
+
List-Id: Nifty <nifty.mail.neurotica.com>
|
294
|
+
Original-recipient: rfc822;dagbrown@shaw.ca
|
295
|
+
EOF
|
296
|
+
)
|
297
|
+
assert_equal(h.from,"nifty-bounces@neurotica.com")
|
298
|
+
assert_equal(1,h["From"].length)
|
299
|
+
assert_equal("From",h["From"][0].name)
|
300
|
+
assert_equal("William Staniewicz <wstan@xs4all.nl>",h["From"][0].contents)
|
301
|
+
assert_equal(1,h["To"].length)
|
302
|
+
assert_equal("To",h["To"][0].name)
|
303
|
+
assert_equal('Nifty <nifty@neurotica.com>',h["To"][0].contents)
|
304
|
+
|
305
|
+
assert_equal(1,h["Subject"].length)
|
306
|
+
assert_equal("Subject",h["Subject"][0].name)
|
307
|
+
assert_equal("Re: [nifty] Ping...",h["Subject"][0].contents)
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_another_crashy_set_of_headers
|
311
|
+
h=Gurgitate::MailHeaders.new(<<'EOF'
|
312
|
+
From HEYITBLEWUP Fri Nov 21 14:41:08 PST 2003
|
313
|
+
Received: from unknown (harley.radius [192.168.0.123]) by yoda.radius with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2653.13)
|
314
|
+
id LYN7YZKG; Wed, 9 Jul 2003 14:36:40 -0700
|
315
|
+
Subject: IAP password
|
316
|
+
EOF
|
317
|
+
)
|
318
|
+
assert_equal(h.from,"HEYITBLEWUP")
|
319
|
+
assert_equal(nil,h["From"])
|
320
|
+
assert_equal("IAP password",h["Subject"][0].contents)
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_fromline_no_hostname # illegal from line
|
324
|
+
m=<<'EOF'
|
325
|
+
From HEYITBLEWUP Sat Mar 27 16:02:12 PST 2004
|
326
|
+
Received: from ohno.mrbill.net (ohno.mrbill.net [207.200.6.75])
|
327
|
+
by lart.ca (Postfix) with ESMTP id A485F104CA9
|
328
|
+
for <dagbrown@lart.ca>; Sat, 27 Mar 2004 15:58:06 -0800 (PST)
|
329
|
+
Received: by ohno.mrbill.net (Postfix)
|
330
|
+
id 0D3423A289; Sat, 27 Mar 2004 17:58:42 -0600 (CST)
|
331
|
+
Delivered-To: dagbrown@mrbill.net
|
332
|
+
Received: from 66-168-59-126.jvl.wi.charter.com (66-168-59-126.jvl.wi.charter.com [66.168.59.126])
|
333
|
+
by ohno.mrbill.net (Postfix) with SMTP id 948BD3A288
|
334
|
+
for <dagbrown@dagbrown.com>; Sat, 27 Mar 2004 17:58:41 -0600 (CST)
|
335
|
+
X-Message-Info: HOCBSQX
|
336
|
+
Message-Id: <20040327235841.948BD3A288@ohno.mrbill.net>
|
337
|
+
Date: Sat, 27 Mar 2004 17:58:41 -0600 (CST)
|
338
|
+
From: ""@
|
339
|
+
To: undisclosed-recipients: ;
|
340
|
+
EOF
|
341
|
+
h=Gurgitate::MailHeaders.new(m)
|
342
|
+
assert_equal(%{""@},h["From"][0].contents)
|
343
|
+
assert_equal(1,h["From"].length)
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_editing_header
|
347
|
+
m = <<'EOF'
|
348
|
+
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
349
|
+
From: fromline@example.com
|
350
|
+
To: toline@example.com
|
351
|
+
Subject: Subject line
|
352
|
+
EOF
|
353
|
+
h=Gurgitate::MailHeaders.new(m)
|
354
|
+
h["From"]="anotherfromline@example.com"
|
355
|
+
assert_equal("anotherfromline@example.com",h["From"][0].contents,
|
356
|
+
"From line correctly changed")
|
357
|
+
assert_match(/^From: anotherfromline@example.com$/,h.to_s,
|
358
|
+
"From line correctly turns up in finished product")
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_editing_from
|
362
|
+
m = <<'EOF'
|
363
|
+
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
364
|
+
From: fromline@example.com
|
365
|
+
To: toline@example.com
|
366
|
+
Subject: Subject line
|
367
|
+
EOF
|
368
|
+
h=Gurgitate::MailHeaders.new(m)
|
369
|
+
t=Time.new.to_s
|
370
|
+
h.from="anotherfromline@example.com"
|
371
|
+
assert_equal("anotherfromline@example.com",h.from,
|
372
|
+
"Envelope from correctly changed")
|
373
|
+
assert_match(/^From anotherfromline@example.com #{Regexp.escape(t)}/,
|
374
|
+
h.to_mbox, "Envelope from changed in finished product")
|
375
|
+
end
|
376
|
+
|
377
|
+
def test_match_multiple_headers
|
378
|
+
m = <<'EOF'
|
379
|
+
From fromline@example.com Sat Oct 25 12:58:31 PDT 2003
|
380
|
+
From: fromline@example.com
|
381
|
+
To: toline@example.com
|
382
|
+
Subject: Subject line
|
383
|
+
EOF
|
384
|
+
h=Gurgitate::MailHeaders.new(m)
|
385
|
+
assert_equal(true,h["From","To"] =~ /fromline@example.com/,
|
386
|
+
"headers contains fromline")
|
387
|
+
assert_equal(true,h["From","To"] =~ /toline@example.com/,
|
388
|
+
"headers contains toline")
|
389
|
+
assert_equal(false,h["From","To"] =~ /nonexistent@example.com/,
|
390
|
+
"headers do not contain nonexistent value")
|
391
|
+
assert(!(h["Rabbit"] =~ /nonexistent/),
|
392
|
+
"Asking for a nonexistent header")
|
393
|
+
end
|
394
|
+
|
395
|
+
def test_broken_spam
|
396
|
+
m=<<'EOF'
|
397
|
+
Return-Path: kirstenparsonsry@yahoo.com
|
398
|
+
Delivery-Date: Fri May 21 19:42:02 PDT
|
399
|
+
Return-Path: kirstenparsonsry@yahoo.com
|
400
|
+
Delivery-Date: Fri May 21 17:39:51 2004
|
401
|
+
Return-Path: <kirstenparsonsry@yahoo.com>
|
402
|
+
X-Original-To: dagbrown@lart.ca
|
403
|
+
Delivered-To: dagbrown@lart.ca
|
404
|
+
Received: from anest.co.jp (c-24-1-221-189.client.comcast.net [24.1.221.189])
|
405
|
+
by lart.ca (Postfix) with ESMTP id 05B7F5704
|
406
|
+
for <dagbrown@lart.ca>; Fri, 21 May 2004 17:39:51 -0700 (PDT)
|
407
|
+
Message-ID: <NKELFLPJDPLDHJCMGFHDFEKLLNAA.kirstenparsonsry@yahoo.com>
|
408
|
+
From: "Kirsten Parsons" <kirstenparsonsry@yahoo.com>
|
409
|
+
To: dagbrown@lart.ca
|
410
|
+
Subject: Congrats!
|
411
|
+
Date: Fri, 21 May 2004 20:56:27 +0000
|
412
|
+
MIME-Version: 1.0
|
413
|
+
Content-Type: text/plain
|
414
|
+
Content-Transfer-Encoding: base64
|
415
|
+
EOF
|
416
|
+
h=Gurgitate::MailHeaders.new(m)
|
417
|
+
|
418
|
+
assert_equal(Gurgitate::Header.new("To","dagbrown@lart.ca").contents,
|
419
|
+
h["To"][0].contents,"To header is as expected")
|
420
|
+
|
421
|
+
assert_equal(false,h["To","Cc"] =~ /\blunar@lunar-linux.org\b/i,
|
422
|
+
"There should be no Lunar Linux mailing list here")
|
423
|
+
|
424
|
+
assert_equal(false,h["To"] =~ /\blunar@lunar-linux.org\b/i,
|
425
|
+
"There should be no Lunar Linux mailing list in To line")
|
426
|
+
assert(!(h["Cc"] =~ /\blunar@lunar-linux.org\b/i),
|
427
|
+
"There should be no Lunar Linux mailing list in Cc line")
|
428
|
+
end
|
429
|
+
end
|