Browse Source

fix tests (after using the smtpReader, a new one needs to be re-spawned after resetting the transaction)

flashmob 5 years ago
parent
commit
aceffadfbe
4 changed files with 26 additions and 14 deletions
  1. 1 0
      backends/p_debugger.go
  2. 1 0
      client.go
  3. 9 11
      mail/reader.go
  4. 15 3
      server_test.go

+ 1 - 0
backends/p_debugger.go

@@ -46,6 +46,7 @@ func Debugger() Decorator {
 				if config.LogReceivedMails {
 				if config.LogReceivedMails {
 					Log().Infof("Mail from: %s / to: %v", e.MailFrom.String(), e.RcptTo)
 					Log().Infof("Mail from: %s / to: %v", e.MailFrom.String(), e.RcptTo)
 					Log().Info("Headers are:", e.Header)
 					Log().Info("Headers are:", e.Header)
+					Log().Info("Body:", e.Data.String())
 				}
 				}
 
 
 				if config.SleepSec > 0 {
 				if config.SleepSec > 0 {

+ 1 - 0
client.go

@@ -117,6 +117,7 @@ func (c *client) sendResponse(r ...interface{}) {
 // -End of DATA command
 // -End of DATA command
 // TLS handshake
 // TLS handshake
 func (c *client) resetTransaction() {
 func (c *client) resetTransaction() {
+	c.smtpReader = mail.NewMimeDotReader(c.bufin.Reader, 1)
 	c.Envelope.ResetTransaction()
 	c.Envelope.ResetTransaction()
 }
 }
 
 

+ 9 - 11
mail/reader.go

@@ -24,28 +24,26 @@ func (r *MimeDotReader) Read(p []byte) (n int, err error) {
 			r.mimeErr = r.p.Parse(p)
 			r.mimeErr = r.p.Parse(p)
 		}
 		}
 	}
 	}
-	if err != nil {
-		if r.mimeErr == nil {
-			r.mimeErr = r.p.Close()
-		}
-		return
-	}
+
 	return
 	return
 }
 }
 
 
 // Close closes the underlying reader if it's a ReadCloser and closes the mime parser
 // Close closes the underlying reader if it's a ReadCloser and closes the mime parser
 func (r MimeDotReader) Close() (err error) {
 func (r MimeDotReader) Close() (err error) {
+	defer func() {
+		if err == nil && r.mimeErr != nil {
+			err = r.mimeErr
+		}
+	}()
 	if rc, t := r.R.(io.ReadCloser); t {
 	if rc, t := r.R.(io.ReadCloser); t {
 		err = rc.Close()
 		err = rc.Close()
 	}
 	}
 	// parser already closed?
 	// parser already closed?
 	if r.mimeErr != nil {
 	if r.mimeErr != nil {
-		return r.mimeErr
-	}
-	// close the parser, only care about parse errors
-	if pErr := r.p.Close(); r.p.ParseError(pErr) {
-		err = pErr
+		return
 	}
 	}
+	// close the parser
+	r.mimeErr = r.p.Close()
 	return
 	return
 }
 }
 
 

+ 15 - 3
server_test.go

@@ -3,6 +3,7 @@ package guerrilla
 import (
 import (
 	"os"
 	"os"
 	"testing"
 	"testing"
+	"time"
 
 
 	"bufio"
 	"bufio"
 	"net/textproto"
 	"net/textproto"
@@ -415,7 +416,7 @@ func TestGithubIssue198(t *testing.T) {
 	}
 	}
 	conn, server := getMockServerConn(sc, t)
 	conn, server := getMockServerConn(sc, t)
 	be, err := backends.New(map[string]interface{}{
 	be, err := backends.New(map[string]interface{}{
-		"save_process": "HeadersParser|Header|custom", "primary_mail_host": "example.com"},
+		"save_process": "HeadersParser|Header|debugger|custom", "primary_mail_host": "example.com", "log_received_mails": true},
 		mainlog)
 		mainlog)
 	if err != nil {
 	if err != nil {
 		t.Error(err)
 		t.Error(err)
@@ -504,6 +505,9 @@ func sendMessage(greet string, TLS bool, w *textproto.Writer, t *testing.T, line
 			t.Error(err)
 			t.Error(err)
 		}
 		}
 	}
 	}
+	if r.R.Buffered() > 0 {
+		line, _ = r.ReadLine()
+	}
 
 
 	if err := w.PrintfLine("MAIL FROM: [email protected]>"); err != nil {
 	if err := w.PrintfLine("MAIL FROM: [email protected]>"); err != nil {
 		t.Error(err)
 		t.Error(err)
@@ -514,17 +518,25 @@ func sendMessage(greet string, TLS bool, w *textproto.Writer, t *testing.T, line
 		t.Error(err)
 		t.Error(err)
 	}
 	}
 	line, _ = r.ReadLine()
 	line, _ = r.ReadLine()
-	client.Hashes = append(client.Hashes, "abcdef1526777763")
+	client.Hashes = append(client.Hashes, "abcdef1526777763"+greet)
 	client.TLS = TLS
 	client.TLS = TLS
+	client.QueuedId = time.Now().String()
 	if err := w.PrintfLine("DATA"); err != nil {
 	if err := w.PrintfLine("DATA"); err != nil {
 		t.Error(err)
 		t.Error(err)
 	}
 	}
 	line, _ = r.ReadLine()
 	line, _ = r.ReadLine()
+	if greet == "EHLO" {
+	}
 
 
-	if err := w.PrintfLine("Subject: Test subject\r\n\r\nHello Sir,\nThis is a test.\r\n."); err != nil {
+	if err := w.PrintfLine("Subject: Test subject" + greet + "\r\n\r\nHello Sir,\nThis is a test.\r\n."); err != nil {
 		t.Error(err)
 		t.Error(err)
 	}
 	}
+	if r.R.Buffered() > 0 {
+		line, _ = r.ReadLine()
+	}
+
 	line, _ = r.ReadLine()
 	line, _ = r.ReadLine()
+
 	return line
 	return line
 }
 }