@@ -5,13 +5,14 @@ import (
5
5
"compress/zlib"
6
6
"crypto/md5"
7
7
"encoding/base64"
8
- "encoding/hex"
9
8
"errors"
10
9
"github.com/sloonz/go-qprintable"
11
10
"gopkg.in/iconv.v1"
12
11
"io/ioutil"
13
12
"regexp"
14
13
"strings"
14
+ "io"
15
+ "fmt"
15
16
)
16
17
17
18
func validateEmailData (client * Client ) (user string , host string , addr_err error ) {
@@ -30,9 +31,10 @@ func validateEmailData(client *Client) (user string, host string, addr_err error
30
31
return user , host , addr_err
31
32
}
32
33
34
+ var extractEmailRegex , _ = regexp .Compile (`<(.+?)@(.+?)>` ) // go home regex, you're drunk!
35
+
33
36
func extractEmail (str string ) (name string , host string , err error ) {
34
- re , _ := regexp .Compile (`<(.+?)@(.+?)>` ) // go home regex, you're drunk!
35
- if matched := re .FindStringSubmatch (str ); len (matched ) > 2 {
37
+ if matched := extractEmailRegex .FindStringSubmatch (str ); len (matched ) > 2 {
36
38
host = validHost (matched [2 ])
37
39
name = matched [1 ]
38
40
} else {
@@ -46,12 +48,12 @@ func extractEmail(str string) (name string, host string, err error) {
46
48
}
47
49
return name , host , err
48
50
}
49
-
51
+ var mimeRegex , _ = regexp . Compile ( `=\?(.+?)\?([QBqp])\?(.+?)\?=` )
50
52
// Decode strings in Mime header format
51
53
// eg. =?ISO-2022-JP?B?GyRCIVo9dztSOWJAOCVBJWMbKEI=?=
52
54
func mimeHeaderDecode (str string ) string {
53
- reg , _ := regexp . Compile ( `=\?(.+?)\?([QBqp])\?(.+?)\?=` )
54
- matched := reg .FindAllStringSubmatch (str , - 1 )
55
+
56
+ matched := mimeRegex .FindAllStringSubmatch (str , - 1 )
55
57
var charset , encoding , payload string
56
58
if matched != nil {
57
59
for i := 0 ; i < len (matched ); i ++ {
@@ -79,10 +81,10 @@ func mimeHeaderDecode(str string) string {
79
81
return str
80
82
}
81
83
84
+ var valihostRegex , _ = regexp .Compile (`^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$` )
82
85
func validHost (host string ) string {
83
86
host = strings .Trim (host , " " )
84
- re , _ := regexp .Compile (`^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$` )
85
- if re .MatchString (host ) {
87
+ if valihostRegex .MatchString (host ) {
86
88
return host
87
89
}
88
90
return ""
@@ -133,17 +135,10 @@ func fromQuotedP(data string) string {
133
135
return string (res )
134
136
}
135
137
136
- func compress (s string ) string {
137
- var b bytes.Buffer
138
- w , _ := zlib .NewWriterLevel (& b , zlib .BestSpeed ) // flate.BestCompression
139
- w .Write ([]byte (s ))
140
- w .Close ()
141
- return b .String ()
142
- }
143
138
139
+ var charsetRegex , _ = regexp .Compile (`[_:.\/\\]` )
144
140
func fixCharset (charset string ) string {
145
- reg , _ := regexp .Compile (`[_:.\/\\]` )
146
- fixed_charset := reg .ReplaceAllString (charset , "-" )
141
+ fixed_charset := charsetRegex .ReplaceAllString (charset , "-" )
147
142
// Fix charset
148
143
// borrowed from http://squirrelmail.svn.sourceforge.net/viewvc/squirrelmail/trunk/squirrelmail/include/languages.php?revision=13765&view=markup
149
144
// OE ks_c_5601_1987 > cp949
@@ -164,9 +159,27 @@ func fixCharset(charset string) string {
164
159
return charset
165
160
}
166
161
167
- func md5hex (str string ) string {
162
+ // returns an md5 hash as string of hex characters
163
+ func md5hex (stringArguments ... * string ) string {
168
164
h := md5 .New ()
169
- h .Write ([]byte (str ))
165
+ var r * strings.Reader
166
+ for i := 0 ; i < len (stringArguments ); i ++ {
167
+ r = strings .NewReader (* stringArguments [i ])
168
+ io .Copy (h , r )
169
+ }
170
170
sum := h .Sum ([]byte {})
171
- return hex .EncodeToString (sum )
171
+ return fmt .Sprintf ("%x" , sum )
172
+ }
173
+
174
+ // concatenate & compress all strings passed in
175
+ func compress (stringArguments ... * string ) string {
176
+ var b bytes.Buffer
177
+ var r * strings.Reader
178
+ w , _ := zlib .NewWriterLevel (& b , zlib .BestSpeed )
179
+ for i := 0 ; i < len (stringArguments ); i ++ {
180
+ r = strings .NewReader (* stringArguments [i ])
181
+ io .Copy (w , r )
182
+ }
183
+ w .Close ()
184
+ return b .String ()
172
185
}
0 commit comments