tmail 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +5 -0
- data/NOTES +84 -0
- data/README +6 -1
- data/ext/Makefile +20 -0
- data/ext/{tmail/base64 → mailscanner/tmail}/MANIFEST +1 -1
- data/ext/mailscanner/tmail/depend +1 -0
- data/ext/mailscanner/tmail/extconf.rb +24 -0
- data/ext/{tmail/scanner_c/scanner_c.c → mailscanner/tmail/mailscanner.c} +8 -7
- data/lib/tmail/base64.rb +29 -52
- data/lib/tmail/encode.rb +37 -38
- data/lib/tmail/interface.rb +632 -49
- data/lib/tmail/main.rb +4 -0
- data/lib/tmail/net.rb +0 -35
- data/lib/tmail/quoting.rb +8 -8
- data/lib/tmail/scanner.rb +10 -6
- data/lib/tmail/scanner_r.rb +3 -5
- data/lib/tmail/version.rb +2 -2
- data/log/ChangeLog.txt +1131 -0
- data/log/History.txt +40 -0
- data/log/Todo.txt +32 -0
- data/meta/MANIFEST +118 -0
- data/meta/ROLLRC +3 -0
- data/meta/icli.yaml +2 -2
- data/meta/{tmail-1.1.1.roll → project.yaml} +3 -7
- data/sample/bench_base64.rb +48 -0
- data/{bat → script}/changelog +0 -0
- data/script/clobber/distclean +8 -0
- data/{bat → script}/clobber/package +0 -0
- data/script/compile +32 -0
- data/{bat → script}/config.yaml +2 -2
- data/{bat → script}/prepare +4 -2
- data/{bat → script}/publish +0 -0
- data/{bat → script}/release +0 -0
- data/{bat → script}/setup +0 -0
- data/{bat → script}/stats +0 -0
- data/{bat → script}/tag +0 -0
- data/script/test +36 -0
- data/test/fixtures/raw_email_reply +32 -0
- data/test/fixtures/raw_email_with_bad_date +48 -0
- data/test/test_address.rb +1 -3
- data/test/test_attachments.rb +1 -2
- data/test/test_base64.rb +3 -2
- data/test/test_encode.rb +1 -0
- data/test/test_header.rb +2 -3
- data/test/test_helper.rb +8 -2
- data/test/test_mail.rb +45 -16
- data/test/test_mbox.rb +1 -1
- data/test/test_port.rb +1 -1
- data/test/test_scanner.rb +1 -1
- data/test/test_utils.rb +1 -2
- metadata +82 -76
- data/bat/compile +0 -42
- data/bat/rdoc +0 -42
- data/bat/test +0 -25
- data/ext/tmail/Makefile +0 -25
- data/ext/tmail/base64/base64.c +0 -264
- data/ext/tmail/base64/depend +0 -1
- data/ext/tmail/base64/extconf.rb +0 -38
- data/ext/tmail/scanner_c/MANIFEST +0 -4
- data/ext/tmail/scanner_c/depend +0 -1
- data/ext/tmail/scanner_c/extconf.rb +0 -38
- data/lib/tmail/tmail.rb +0 -1
data/bat/compile
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ratch
|
2
|
-
|
3
|
-
# compile extensions
|
4
|
-
|
5
|
-
main :compile => [:compile_base64, :compile_scanner_c] do
|
6
|
-
end
|
7
|
-
|
8
|
-
task :compile_base64 do
|
9
|
-
file = nil
|
10
|
-
cd('ext/tmail/base64') do
|
11
|
-
ruby "extconf.rb"
|
12
|
-
make
|
13
|
-
file = glob("base64.#{dlext}").first
|
14
|
-
file = File.expand_path(file) if file
|
15
|
-
end
|
16
|
-
if file
|
17
|
-
mkdir_p("lib/tmail/#{arch}")
|
18
|
-
mv(file, "lib/tmail/#{arch}/")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
task :compile_scanner_c do
|
23
|
-
file = nil
|
24
|
-
cd("ext/tmail/scanner_c") do
|
25
|
-
ruby "extconf.rb"
|
26
|
-
make
|
27
|
-
file = glob("scanner_c.#{dlext}").first
|
28
|
-
file = File.expand_path(file) if file
|
29
|
-
end
|
30
|
-
if file
|
31
|
-
mkdir_p("lib/tmail/#{arch}")
|
32
|
-
mv(file, "lib/tmail/#{arch}/")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def dlext
|
37
|
-
Config::CONFIG['DLEXT']
|
38
|
-
end
|
39
|
-
|
40
|
-
def arch
|
41
|
-
Config::CONFIG['arch']
|
42
|
-
end
|
data/bat/rdoc
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ratch
|
2
|
-
|
3
|
-
# generate rdocs
|
4
|
-
#
|
5
|
-
# Generate Rdoc documentation. Settings are
|
6
|
-
# the same as the rdoc command's options.
|
7
|
-
|
8
|
-
main :rdoc do
|
9
|
-
# Load rdoc configuration.
|
10
|
-
|
11
|
-
config = configuration['rdoc']
|
12
|
-
|
13
|
-
config['op'] = config.delete('output') if config['output']
|
14
|
-
|
15
|
-
config = {
|
16
|
-
'template' => 'html',
|
17
|
-
'op' => 'doc/rdoc',
|
18
|
-
'merge' => true,
|
19
|
-
'inline-source' => true,
|
20
|
-
'exclude' => %w{MANIFEST, Manifest.txt},
|
21
|
-
'include' => %w{[A-Z]* lib ext}
|
22
|
-
}.update(config)
|
23
|
-
|
24
|
-
output = config['op']
|
25
|
-
|
26
|
-
# Check for parent directory.
|
27
|
-
# (Helps to ensure we're in the right place.)
|
28
|
-
|
29
|
-
dir!(File.dirname(output))
|
30
|
-
|
31
|
-
# Prepare command arguments.
|
32
|
-
|
33
|
-
vector = config.command_vector('include')
|
34
|
-
|
35
|
-
# Remove old rdocs, if any.
|
36
|
-
|
37
|
-
rm_r(output) if File.exist?(output)
|
38
|
-
|
39
|
-
# Document.
|
40
|
-
|
41
|
-
rdoc(*vector)
|
42
|
-
end
|
data/bat/test
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ratch
|
2
|
-
|
3
|
-
# Run unit tests
|
4
|
-
|
5
|
-
live = ARGV.delete('--live')
|
6
|
-
|
7
|
-
unless live
|
8
|
-
$LOAD_PATH.unshift(File.expand_path('lib'))
|
9
|
-
end
|
10
|
-
|
11
|
-
main :test do
|
12
|
-
if find = argv[0]
|
13
|
-
unless file?(find)
|
14
|
-
find = File.join(find, '**', 'test_*.rb')
|
15
|
-
end
|
16
|
-
else
|
17
|
-
find = 'test/**/test_*.rb'
|
18
|
-
end
|
19
|
-
|
20
|
-
Dir.glob(find).each do |file|
|
21
|
-
next if dir?(file)
|
22
|
-
load file
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
data/ext/tmail/Makefile
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# ext/tmail/Makefile
|
3
|
-
#
|
4
|
-
|
5
|
-
.PHONY: scanner_c base64 clean distclean
|
6
|
-
|
7
|
-
all: scanner_c base64
|
8
|
-
|
9
|
-
scanner_c: scanner_c/Makefile
|
10
|
-
cd scanner_c; $(MAKE)
|
11
|
-
scanner_c/Makefile: scanner_c/extconf.rb
|
12
|
-
cd scanner_c; ruby extconf.rb
|
13
|
-
|
14
|
-
base64: base64/Makefile
|
15
|
-
cd base64; $(MAKE)
|
16
|
-
base64/Makefile: base64/extconf.rb
|
17
|
-
cd base64; ruby extconf.rb
|
18
|
-
|
19
|
-
clean:
|
20
|
-
cd base64; $(MAKE) clean
|
21
|
-
cd scanner_c; $(MAKE) clean
|
22
|
-
|
23
|
-
distclean:
|
24
|
-
cd base64; $(MAKE) distclean
|
25
|
-
cd scanner_c; $(MAKE) distclean
|
data/ext/tmail/base64/base64.c
DELETED
@@ -1,264 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
|
3
|
-
base64.c
|
4
|
-
|
5
|
-
Copyright (c) 2001-2007 Minero Aoki
|
6
|
-
|
7
|
-
This program is free software.
|
8
|
-
You can distribute/modify this program under the terms of
|
9
|
-
the GNU Lesser General Public License version 2.1.
|
10
|
-
|
11
|
-
*/
|
12
|
-
|
13
|
-
#include "ruby.h"
|
14
|
-
#include "version.h"
|
15
|
-
#include <stdio.h>
|
16
|
-
|
17
|
-
#ifdef DEBUG
|
18
|
-
# define D(code) code
|
19
|
-
#else
|
20
|
-
# define D(code)
|
21
|
-
#endif
|
22
|
-
|
23
|
-
static char *CONVTAB =
|
24
|
-
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
25
|
-
static int REVTAB[256];
|
26
|
-
#define INIT (-1)
|
27
|
-
#define SKIP (-2)
|
28
|
-
#define ILLEGAL (-3)
|
29
|
-
|
30
|
-
#if RUBY_VERSION_CODE < 170 /* Ruby 1.6 */
|
31
|
-
# define StringValue(s) tmail_rb_string_value(&(s))
|
32
|
-
static void
|
33
|
-
tmail_rb_string_value(s)
|
34
|
-
VALUE *s;
|
35
|
-
{
|
36
|
-
if (TYPE(*s) != T_STRING) {
|
37
|
-
*s = rb_str_to_str(*s);
|
38
|
-
}
|
39
|
-
}
|
40
|
-
#endif
|
41
|
-
|
42
|
-
static void
|
43
|
-
get_ptrlen(s, ptr, len)
|
44
|
-
VALUE *s;
|
45
|
-
char **ptr;
|
46
|
-
long *len;
|
47
|
-
{
|
48
|
-
StringValue(*s);
|
49
|
-
*ptr = RSTRING(*s)->ptr;
|
50
|
-
if (!*ptr) *ptr = "";
|
51
|
-
*len = RSTRING(*s)->len;
|
52
|
-
}
|
53
|
-
|
54
|
-
static long
|
55
|
-
calculate_buflen(len, eollen, limit)
|
56
|
-
long len, eollen;
|
57
|
-
{
|
58
|
-
long result;
|
59
|
-
|
60
|
-
result = (len/3 + 1) * 4;
|
61
|
-
if (eollen) {
|
62
|
-
result += (result/limit + 1) * eollen;
|
63
|
-
}
|
64
|
-
return result;
|
65
|
-
}
|
66
|
-
|
67
|
-
static VALUE
|
68
|
-
do_base64(str, eolv, limit)
|
69
|
-
VALUE str, eolv;
|
70
|
-
long limit;
|
71
|
-
{
|
72
|
-
char *buf, *b;
|
73
|
-
char *p, *pend;
|
74
|
-
long len;
|
75
|
-
char *eol;
|
76
|
-
long eollen;
|
77
|
-
VALUE s;
|
78
|
-
char *linehead;
|
79
|
-
|
80
|
-
get_ptrlen(&str, &p, &len);
|
81
|
-
pend = p + len;
|
82
|
-
if (NIL_P(eolv)) {
|
83
|
-
eol = "";
|
84
|
-
eollen = 0;
|
85
|
-
}
|
86
|
-
else {
|
87
|
-
get_ptrlen(&eolv, &eol, &eollen);
|
88
|
-
}
|
89
|
-
b = buf = ALLOC_N(char, calculate_buflen(len, eollen, limit));
|
90
|
-
linehead = b;
|
91
|
-
|
92
|
-
while (pend - p >= 3) {
|
93
|
-
if (eollen) {
|
94
|
-
if (b - linehead + 4 > limit) {
|
95
|
-
memcpy(b, eol, eollen); b += eollen;
|
96
|
-
linehead = b;
|
97
|
-
}
|
98
|
-
}
|
99
|
-
*b++ = CONVTAB[0x3f & (p[0] >> 2)];
|
100
|
-
*b++ = CONVTAB[0x3f & (((p[0] << 4) & 0x30) | ((p[1] >> 4) & 0xf))];
|
101
|
-
*b++ = CONVTAB[0x3f & (((p[1] << 2) & 0x3c) | ((p[2] >> 6) & 0x3))];
|
102
|
-
*b++ = CONVTAB[0x3f & p[2]];
|
103
|
-
p += 3;
|
104
|
-
}
|
105
|
-
if ((b - linehead) + (pend - p) > limit) {
|
106
|
-
if (eollen) {
|
107
|
-
memcpy(b, eol, eollen); b += eollen;
|
108
|
-
}
|
109
|
-
}
|
110
|
-
if (pend - p == 2) {
|
111
|
-
*b++ = CONVTAB[0x3f & (p[0] >> 2)];
|
112
|
-
*b++ = CONVTAB[0x3f & (((p[0] << 4) & 0x30) | ((p[1] >> 4) &0xf))];
|
113
|
-
*b++ = CONVTAB[0x3f & (((p[1] << 2) & 0x3c) | 0)];
|
114
|
-
*b++ = '=';
|
115
|
-
}
|
116
|
-
else if (pend - p == 1) {
|
117
|
-
*b++ = CONVTAB[0x3f & (p[0] >> 2)];
|
118
|
-
*b++ = CONVTAB[0x3f & (((p[0] << 4) & 0x30) | 0)];
|
119
|
-
*b++ = '=';
|
120
|
-
*b++ = '=';
|
121
|
-
}
|
122
|
-
if (eollen) {
|
123
|
-
memcpy(b, eol, eollen); b += eollen;
|
124
|
-
}
|
125
|
-
|
126
|
-
s = rb_str_new("", 0);
|
127
|
-
rb_str_cat(s, buf, b - buf);
|
128
|
-
free(buf);
|
129
|
-
|
130
|
-
return s;
|
131
|
-
}
|
132
|
-
|
133
|
-
#define DEFAULT_LINE_LIMIT 72
|
134
|
-
|
135
|
-
/* def folding_encode( str, eol, limit ) */
|
136
|
-
static VALUE
|
137
|
-
b64_fold_encode(argc, argv, self)
|
138
|
-
int argc;
|
139
|
-
VALUE *argv;
|
140
|
-
VALUE self;
|
141
|
-
{
|
142
|
-
VALUE str, eol, limit_v;
|
143
|
-
long limit = DEFAULT_LINE_LIMIT;
|
144
|
-
|
145
|
-
switch (rb_scan_args(argc, argv, "12", &str, &eol, &limit_v)) {
|
146
|
-
case 1:
|
147
|
-
eol = rb_str_new("\n", 1);
|
148
|
-
break;
|
149
|
-
case 2:
|
150
|
-
break;
|
151
|
-
case 3:
|
152
|
-
limit = NUM2LONG(limit_v);
|
153
|
-
if (limit < 4) {
|
154
|
-
rb_raise(rb_eArgError, "too small line length limit");
|
155
|
-
}
|
156
|
-
break;
|
157
|
-
default:
|
158
|
-
break;
|
159
|
-
}
|
160
|
-
return do_base64(str, eol, limit);
|
161
|
-
}
|
162
|
-
|
163
|
-
static VALUE
|
164
|
-
b64_encode(self, str)
|
165
|
-
VALUE self, str;
|
166
|
-
{
|
167
|
-
return do_base64(str, Qnil, 0);
|
168
|
-
}
|
169
|
-
|
170
|
-
static VALUE
|
171
|
-
b64_decode(argc, argv, self)
|
172
|
-
int argc;
|
173
|
-
VALUE *argv;
|
174
|
-
VALUE self;
|
175
|
-
{
|
176
|
-
VALUE str, strict;
|
177
|
-
char *buf, *bp;
|
178
|
-
char *p, *pend;
|
179
|
-
long len;
|
180
|
-
int a, b, c, d;
|
181
|
-
VALUE s;
|
182
|
-
|
183
|
-
if (rb_scan_args(argc, argv, "11", &str, &strict) == 1) {
|
184
|
-
strict = Qfalse;
|
185
|
-
}
|
186
|
-
|
187
|
-
get_ptrlen(&str, &p, &len);
|
188
|
-
pend = p + len;
|
189
|
-
bp = buf = ALLOC_N(char, (len/4 + 1) * 3);
|
190
|
-
|
191
|
-
#define FETCH(ch) \
|
192
|
-
while (1) { \
|
193
|
-
if (p >= pend) goto brk; \
|
194
|
-
ch = REVTAB[(int)(*p++)]; \
|
195
|
-
if (ch == ILLEGAL) { \
|
196
|
-
rb_raise(rb_eArgError, "corrupted base64 string"); \
|
197
|
-
} \
|
198
|
-
else if (ch == SKIP) { \
|
199
|
-
; \
|
200
|
-
} \
|
201
|
-
else { \
|
202
|
-
break; \
|
203
|
-
} \
|
204
|
-
ch = INIT; \
|
205
|
-
}
|
206
|
-
a = b = c = d = INIT;
|
207
|
-
while (p < pend) {
|
208
|
-
FETCH(a); D(printf("fetch a: %d\n", (int)a));
|
209
|
-
FETCH(b); D(printf("fetch b: %d\n", (int)b));
|
210
|
-
FETCH(c); D(printf("fetch c: %d\n", (int)c));
|
211
|
-
FETCH(d); D(printf("fetch d: %d\n", (int)d));
|
212
|
-
|
213
|
-
*bp++ = (a << 2) | (b >> 4);
|
214
|
-
*bp++ = (b << 4) | (c >> 2);
|
215
|
-
*bp++ = (c << 6) | d;
|
216
|
-
a = b = c = d = INIT;
|
217
|
-
}
|
218
|
-
brk:
|
219
|
-
if (a != INIT && b != INIT && c != INIT) {
|
220
|
-
D(puts("3bytes"));
|
221
|
-
*bp++ = (a << 2) | (b >> 4);
|
222
|
-
*bp++ = (b << 4) | (c >> 2);
|
223
|
-
}
|
224
|
-
else if (a != INIT && b != INIT) {
|
225
|
-
D(puts("2bytes"));
|
226
|
-
*bp++ = (a << 2) | (b >> 4);
|
227
|
-
}
|
228
|
-
/* ignore if only 'a' */
|
229
|
-
|
230
|
-
D(printf("decoded len=%d\n", (int)(bp - buf)));
|
231
|
-
s = rb_str_new("", 0);
|
232
|
-
rb_str_cat(s, buf, bp - buf);
|
233
|
-
free(buf);
|
234
|
-
|
235
|
-
return s;
|
236
|
-
}
|
237
|
-
|
238
|
-
static void
|
239
|
-
initialize_reverse_table()
|
240
|
-
{
|
241
|
-
int i;
|
242
|
-
|
243
|
-
for (i = 0; i < 256; i++) {
|
244
|
-
REVTAB[i] = ILLEGAL;
|
245
|
-
}
|
246
|
-
REVTAB[(int)'='] = SKIP;
|
247
|
-
REVTAB[(int)'\r'] = SKIP;
|
248
|
-
REVTAB[(int)'\n'] = SKIP;
|
249
|
-
for (i = 0; i < 64; i++) {
|
250
|
-
REVTAB[(int)CONVTAB[i]] = (char)i;
|
251
|
-
}
|
252
|
-
}
|
253
|
-
|
254
|
-
void
|
255
|
-
Init_base64()
|
256
|
-
{
|
257
|
-
VALUE Base64;
|
258
|
-
|
259
|
-
Base64 = rb_eval_string("module TMail; module Base64; end end; ::TMail::Base64");
|
260
|
-
rb_define_module_function(Base64, "c_folding_encode", b64_fold_encode, -1);
|
261
|
-
rb_define_module_function(Base64, "c_encode", b64_encode, 1);
|
262
|
-
rb_define_module_function(Base64, "c_decode", b64_decode, -1);
|
263
|
-
initialize_reverse_table();
|
264
|
-
}
|
data/ext/tmail/base64/depend
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
tmbase64.o: tmbase64.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h Makefile
|
data/ext/tmail/base64/extconf.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'mkmf'
|
2
|
-
require 'rbconfig'
|
3
|
-
|
4
|
-
extension_name = 'base64'
|
5
|
-
|
6
|
-
arch = Config::CONFIG['arch']
|
7
|
-
|
8
|
-
windows = (/mswin/ =~ arch) #RUBY_PLATFORM)
|
9
|
-
|
10
|
-
if (ENV['NORUBYEXT'] == 'true') || windows # TEMPORARILY ADD WINDOWS HERE
|
11
|
-
#ENV['make'] = 'echo' # THIS DOESN"T GET TO THE PARENT PROCESS!!!
|
12
|
-
# LETS TRY FAKING IT OUT.
|
13
|
-
if windows
|
14
|
-
File.open('make.bat', 'w') do |f|
|
15
|
-
f << 'echo Native extension will be omitted.'
|
16
|
-
end
|
17
|
-
File.open('nmake.bat', 'w') do |f|
|
18
|
-
f << 'echo Native extension will be omitted.'
|
19
|
-
end
|
20
|
-
#File.chmod(0755, "make.bat", "nmake.bat") # need?
|
21
|
-
end
|
22
|
-
File.open('Makefile', 'w') do |f|
|
23
|
-
f << "all:\n"
|
24
|
-
f << "install:\n"
|
25
|
-
end
|
26
|
-
else
|
27
|
-
if windows && ENV['make'].nil?
|
28
|
-
$LIBS += " msvcprt.lib"
|
29
|
-
#dir_config(extension_name)
|
30
|
-
#create_makefile(extension_name, "tmail")
|
31
|
-
create_makefile(extension_name, "tmail/#{arch}")
|
32
|
-
else
|
33
|
-
$CFLAGS += " -D_FILE_OFFSET_BITS=64" #???
|
34
|
-
#dir_config(extension_name)
|
35
|
-
#create_makefile(extension_name, "tmail")
|
36
|
-
create_makefile(extension_name, "tmail/#{arch}")
|
37
|
-
end
|
38
|
-
end
|