diff --git a/smtpd/filestore.go b/smtpd/filestore.go index 570d61d..787fb1e 100644 --- a/smtpd/filestore.go +++ b/smtpd/filestore.go @@ -330,10 +330,10 @@ func (m *FileMessage) rawPath() string { // ReadHeader opens the .raw portion of a Message and returns a standard Go mail.Message object func (m *FileMessage) ReadHeader() (msg *mail.Message, err error) { file, err := os.Open(m.rawPath()) - defer file.Close() if err != nil { return nil, err } + defer file.Close() reader := bufio.NewReader(file) msg, err = mail.ReadMessage(reader) return msg, err diff --git a/smtpd/filestore_test.go b/smtpd/filestore_test.go index 82b9448..32d7b27 100644 --- a/smtpd/filestore_test.go +++ b/smtpd/filestore_test.go @@ -334,6 +334,48 @@ func TestFSSize(t *testing.T) { } } +// Test missing files +func TestFSMissing(t *testing.T) { + ds, logbuf := setupDataStore() + defer teardownDataStore(ds) + + mbName := "fred" + subjects := []string{"a", "b", "c"} + sentIds := make([]string, len(subjects)) + + for i, subj := range subjects { + // Add a message + id, _ := deliverMessage(ds, mbName, subj, time.Now()) + sentIds[i] = id + } + + mb, err := ds.MailboxFor(mbName) + if err != nil { + t.Fatalf("Failed to MailboxFor(%q): %v", mbName, err) + } + + // Delete a message file without removing it from index + msg, err := mb.GetMessage(sentIds[1]) + assert.Nil(t, err) + fmsg := msg.(*FileMessage) + os.Remove(fmsg.rawPath()) + msg, err = mb.GetMessage(sentIds[1]) + assert.Nil(t, err) + + // Try to read parts of message + _, err = msg.ReadHeader() + assert.Error(t, err) + _, err = msg.ReadBody() + assert.Error(t, err) + + if t.Failed() { + // Wait for handler to finish logging + time.Sleep(2 * time.Second) + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } +} + // setupDataStore creates a new FileDataStore in a temporary directory func setupDataStore() (*FileDataStore, *bytes.Buffer) { path, err := ioutil.TempDir("", "inbucket") diff --git a/themes/integral/templates/mailbox/index.html b/themes/integral/templates/mailbox/index.html index bb13327..4b5a174 100644 --- a/themes/integral/templates/mailbox/index.html +++ b/themes/integral/templates/mailbox/index.html @@ -4,6 +4,14 @@ {{define "script"}}