@@ -33,6 +33,7 @@ func connectionChecker(peer smtpd.Peer) error {
33
33
}
34
34
}
35
35
36
+ log .Printf ("Connection from peer=[%s] denied: Not in allowed_nets\n " , peerIP )
36
37
return smtpd.Error {Code : 421 , Message : "Denied" }
37
38
}
38
39
@@ -84,10 +85,13 @@ func senderChecker(peer smtpd.Peer, addr string) error {
84
85
if * allowedUsers != "" && peer .Username != "" {
85
86
user , err := AuthFetch (peer .Username )
86
87
if err != nil {
88
+ // Shouldn't happen: authChecker already validated username+password
87
89
return smtpd.Error {Code : 451 , Message : "Bad sender address" }
88
90
}
89
91
90
92
if ! addrAllowed (addr , user .allowedAddresses ) {
93
+ log .Printf ("Mail from=<%s> not allowed for authenticated user %s (%v)\n " ,
94
+ addr , peer .Username , peer .Addr )
91
95
return smtpd.Error {Code : 451 , Message : "Bad sender address" }
92
96
}
93
97
}
@@ -106,6 +110,8 @@ func senderChecker(peer smtpd.Peer, addr string) error {
106
110
return nil
107
111
}
108
112
113
+ log .Printf ("Mail from=<%s> not allowed by allowed_sender pattern for peer %v\n " ,
114
+ addr , peer .Addr )
109
115
return smtpd.Error {Code : 451 , Message : "Bad sender address" }
110
116
}
111
117
@@ -124,13 +130,15 @@ func recipientChecker(peer smtpd.Peer, addr string) error {
124
130
return nil
125
131
}
126
132
133
+ log .Printf ("Mail to=<%s> not allowed by allowed_recipients pattern for peer %v\n " ,
134
+ addr , peer .Addr )
127
135
return smtpd.Error {Code : 451 , Message : "Bad recipient address" }
128
136
}
129
137
130
138
func authChecker (peer smtpd.Peer , username string , password string ) error {
131
139
err := AuthCheckPassword (username , password )
132
140
if err != nil {
133
- log .Printf ("Auth error: %v\n " , err )
141
+ log .Printf ("Auth error for peer %v : %v\n " , peer . Addr , err )
134
142
return smtpd.Error {Code : 535 , Message : "Authentication credentials invalid" }
135
143
}
136
144
return nil
@@ -188,7 +196,7 @@ func mailHandler(peer smtpd.Peer, env smtpd.Envelope) error {
188
196
return nil
189
197
}
190
198
191
- func main () {
199
+ func getTLSConfig () * tls. Config {
192
200
// Ciphersuites as defined in stock Go but without 3DES and RC4
193
201
// https://golang.org/src/crypto/tls/cipher_suites.go
194
202
var tlsCipherSuites = []uint16 {
@@ -214,6 +222,24 @@ func main() {
214
222
tls .TLS_RSA_WITH_AES_256_CBC_SHA ,
215
223
}
216
224
225
+ if * localCert == "" || * localKey == "" {
226
+ log .Fatal ("TLS certificate/key not defined in config" )
227
+ }
228
+
229
+ cert , err := tls .LoadX509KeyPair (* localCert , * localKey )
230
+ if err != nil {
231
+ log .Fatal (err )
232
+ }
233
+
234
+ return & tls.Config {
235
+ PreferServerCipherSuites : true ,
236
+ MinVersion : tls .VersionTLS11 ,
237
+ CipherSuites : tlsCipherSuites ,
238
+ Certificates : []tls.Certificate {cert },
239
+ }
240
+ }
241
+
242
+ func main () {
217
243
ConfigLoad ()
218
244
219
245
if * versionInfo {
@@ -231,11 +257,16 @@ func main() {
231
257
log .SetOutput (io .MultiWriter (os .Stdout , f ))
232
258
}
233
259
234
- listeners := strings .Split (* listen , " " )
235
-
236
- for i := range listeners {
237
- listener := listeners [i ]
260
+ // Load allowed users file
261
+ if * allowedUsers != "" {
262
+ err := AuthLoadFile (* allowedUsers )
263
+ if err != nil {
264
+ log .Fatalf ("Authentication file: %s\n " , err )
265
+ }
266
+ }
238
267
268
+ // Create a server for each desired listen address
269
+ for _ , listenAddr := range strings .Split (* listen , " " ) {
239
270
server := & smtpd.Server {
240
271
Hostname : * hostName ,
241
272
WelcomeMessage : * welcomeMsg ,
@@ -246,76 +277,41 @@ func main() {
246
277
}
247
278
248
279
if * allowedUsers != "" {
249
- err := AuthLoadFile (* allowedUsers )
250
- if err != nil {
251
- log .Fatalf ("Authentication file: %s\n " , err )
252
- }
253
-
254
280
server .Authenticator = authChecker
255
281
}
256
282
257
- if strings .Index (listeners [i ], "://" ) == - 1 {
258
- log .Printf ("Listen on %s ...\n " , listener )
259
- go server .ListenAndServe (listener )
260
- } else if strings .HasPrefix (listeners [i ], "starttls://" ) {
261
- listener = strings .TrimPrefix (listener , "starttls://" )
283
+ var lsnr net.Listener
284
+ var err error
262
285
263
- if * localCert == "" || * localKey == "" {
264
- log .Fatal ("TLS certificate/key not defined in config" )
265
- }
286
+ if strings .Index (listenAddr , "://" ) == - 1 {
287
+ log .Printf ("Listen on %s ...\n " , listenAddr )
266
288
267
- cert , err := tls .LoadX509KeyPair (* localCert , * localKey )
268
- if err != nil {
269
- log .Fatal (err )
270
- }
289
+ lsnr , err = net .Listen ("tcp" , listenAddr )
290
+ } else if strings .HasPrefix (listenAddr , "starttls://" ) {
291
+ listenAddr = strings .TrimPrefix (listenAddr , "starttls://" )
271
292
272
- server .TLSConfig = & tls.Config {
273
- PreferServerCipherSuites : true ,
274
- MinVersion : tls .VersionTLS11 ,
275
- CipherSuites : tlsCipherSuites ,
276
- Certificates : []tls.Certificate {cert },
277
- }
293
+ server .TLSConfig = getTLSConfig ()
278
294
server .ForceTLS = * localForceTLS
279
295
280
- log .Printf ("Listen on %s (STARTSSL) ...\n " , listener )
281
- lsnr , err := net .Listen ("tcp" , listener )
282
- if err != nil {
283
- log .Fatal (err )
284
- }
285
- defer lsnr .Close ()
286
-
287
- go server .Serve (lsnr )
288
- } else if strings .HasPrefix (listeners [i ], "tls://" ) {
289
-
290
- listener = strings .TrimPrefix (listener , "tls://" )
291
-
292
- if * localCert == "" || * localKey == "" {
293
- log .Fatal ("TLS certificate/key not defined in config" )
294
- }
295
-
296
- cert , err := tls .LoadX509KeyPair (* localCert , * localKey )
297
- if err != nil {
298
- log .Fatal (err )
299
- }
300
-
301
- server .TLSConfig = & tls.Config {
302
- PreferServerCipherSuites : true ,
303
- MinVersion : tls .VersionTLS11 ,
304
- CipherSuites : tlsCipherSuites ,
305
- Certificates : []tls.Certificate {cert },
306
- }
296
+ log .Printf ("Listen on %s (STARTTLS) ...\n " , listenAddr )
297
+ lsnr , err = net .Listen ("tcp" , listenAddr )
298
+ } else if strings .HasPrefix (listenAddr , "tls://" ) {
299
+ listenAddr = strings .TrimPrefix (listenAddr , "tls://" )
307
300
308
- log .Printf ("Listen on %s (TLS) ...\n " , listener )
309
- lsnr , err := tls .Listen ("tcp" , listener , server .TLSConfig )
310
- if err != nil {
311
- log .Fatal (err )
312
- }
313
- defer lsnr .Close ()
301
+ server .TLSConfig = getTLSConfig ()
314
302
315
- go server .Serve (lsnr )
303
+ log .Printf ("Listen on %s (TLS) ...\n " , listenAddr )
304
+ lsnr , err = tls .Listen ("tcp" , listenAddr , server .TLSConfig )
316
305
} else {
317
- log .Fatal ("Unknown protocol in listener " , listener )
306
+ log .Fatal ("Unknown protocol in listen address " , listenAddr )
318
307
}
308
+
309
+ if err != nil {
310
+ log .Fatal (err )
311
+ }
312
+ defer lsnr .Close ()
313
+
314
+ go server .Serve (lsnr )
319
315
}
320
316
321
317
for true {
0 commit comments