mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +00:00
storage: Store addresses as mail.Address for #69
This commit is contained in:
@@ -36,8 +36,8 @@ func MailboxListV1(w http.ResponseWriter, req *http.Request, ctx *web.Context) (
|
|||||||
jmessages[i] = &model.JSONMessageHeaderV1{
|
jmessages[i] = &model.JSONMessageHeaderV1{
|
||||||
Mailbox: name,
|
Mailbox: name,
|
||||||
ID: msg.ID(),
|
ID: msg.ID(),
|
||||||
From: msg.From(),
|
From: msg.From().String(),
|
||||||
To: msg.To(),
|
To: stringutil.StringAddressList(msg.To()),
|
||||||
Subject: msg.Subject(),
|
Subject: msg.Subject(),
|
||||||
Date: msg.Date(),
|
Date: msg.Date(),
|
||||||
Size: msg.Size(),
|
Size: msg.Size(),
|
||||||
@@ -90,8 +90,8 @@ func MailboxShowV1(w http.ResponseWriter, req *http.Request, ctx *web.Context) (
|
|||||||
&model.JSONMessageV1{
|
&model.JSONMessageV1{
|
||||||
Mailbox: name,
|
Mailbox: name,
|
||||||
ID: msg.ID(),
|
ID: msg.ID(),
|
||||||
From: msg.From(),
|
From: msg.From().String(),
|
||||||
To: msg.To(),
|
To: stringutil.StringAddressList(msg.To()),
|
||||||
Subject: msg.Subject(),
|
Subject: msg.Subject(),
|
||||||
Date: msg.Date(),
|
Date: msg.Date(),
|
||||||
Size: msg.Size(),
|
Size: msg.Size(),
|
||||||
|
|||||||
@@ -67,16 +67,16 @@ func TestRestMailboxList(t *testing.T) {
|
|||||||
data1 := &InputMessageData{
|
data1 := &InputMessageData{
|
||||||
Mailbox: "good",
|
Mailbox: "good",
|
||||||
ID: "0001",
|
ID: "0001",
|
||||||
From: "from1",
|
From: "<from1@host>",
|
||||||
To: []string{"to1"},
|
To: []string{"<to1@host>"},
|
||||||
Subject: "subject 1",
|
Subject: "subject 1",
|
||||||
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, time.FixedZone("PST", -800)),
|
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, time.FixedZone("PST", -800)),
|
||||||
}
|
}
|
||||||
data2 := &InputMessageData{
|
data2 := &InputMessageData{
|
||||||
Mailbox: "good",
|
Mailbox: "good",
|
||||||
ID: "0002",
|
ID: "0002",
|
||||||
From: "from2",
|
From: "<from2@host>",
|
||||||
To: []string{"to1"},
|
To: []string{"<to1@host>"},
|
||||||
Subject: "subject 2",
|
Subject: "subject 2",
|
||||||
Date: time.Date(2012, 7, 1, 10, 11, 12, 253, time.FixedZone("PDT", -700)),
|
Date: time.Date(2012, 7, 1, 10, 11, 12, 253, time.FixedZone("PDT", -700)),
|
||||||
}
|
}
|
||||||
@@ -171,7 +171,7 @@ func TestRestMessage(t *testing.T) {
|
|||||||
data1 := &InputMessageData{
|
data1 := &InputMessageData{
|
||||||
Mailbox: "good",
|
Mailbox: "good",
|
||||||
ID: "0001",
|
ID: "0001",
|
||||||
From: "from1",
|
From: "<from1@host>",
|
||||||
Subject: "subject 1",
|
Subject: "subject 1",
|
||||||
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, time.FixedZone("PST", -800)),
|
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, time.FixedZone("PST", -800)),
|
||||||
Header: mail.Header{
|
Header: mail.Header{
|
||||||
|
|||||||
@@ -26,10 +26,15 @@ type InputMessageData struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *InputMessageData) MockMessage() *storage.MockMessage {
|
func (d *InputMessageData) MockMessage() *storage.MockMessage {
|
||||||
|
from, _ := mail.ParseAddress(d.From)
|
||||||
|
to := make([]*mail.Address, len(d.To))
|
||||||
|
for i, a := range d.To {
|
||||||
|
to[i], _ = mail.ParseAddress(a)
|
||||||
|
}
|
||||||
msg := &storage.MockMessage{}
|
msg := &storage.MockMessage{}
|
||||||
msg.On("ID").Return(d.ID)
|
msg.On("ID").Return(d.ID)
|
||||||
msg.On("From").Return(d.From)
|
msg.On("From").Return(from)
|
||||||
msg.On("To").Return(d.To)
|
msg.On("To").Return(to)
|
||||||
msg.On("Subject").Return(d.Subject)
|
msg.On("Subject").Return(d.Subject)
|
||||||
msg.On("Date").Return(d.Date)
|
msg.On("Date").Return(d.Date)
|
||||||
msg.On("Size").Return(d.Size)
|
msg.On("Size").Return(d.Size)
|
||||||
|
|||||||
@@ -479,8 +479,8 @@ func (ss *Session) deliverMessage(r recipientDetails, msgBuf [][]byte) (ok bool)
|
|||||||
broadcast := msghub.Message{
|
broadcast := msghub.Message{
|
||||||
Mailbox: name,
|
Mailbox: name,
|
||||||
ID: msg.ID(),
|
ID: msg.ID(),
|
||||||
From: msg.From(),
|
From: msg.From().String(),
|
||||||
To: msg.To(),
|
To: stringutil.StringAddressList(msg.To()),
|
||||||
Subject: msg.Subject(),
|
Subject: msg.Subject(),
|
||||||
Date: msg.Date(),
|
Date: msg.Date(),
|
||||||
Size: msg.Size(),
|
Size: msg.Size(),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"net/mail"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -145,8 +146,8 @@ func TestMailState(t *testing.T) {
|
|||||||
msg1 := &storage.MockMessage{}
|
msg1 := &storage.MockMessage{}
|
||||||
mds.On("NewMessage", "u1").Return(msg1, nil)
|
mds.On("NewMessage", "u1").Return(msg1, nil)
|
||||||
msg1.On("ID").Return("")
|
msg1.On("ID").Return("")
|
||||||
msg1.On("From").Return("")
|
msg1.On("From").Return(&mail.Address{})
|
||||||
msg1.On("To").Return(make([]string, 0))
|
msg1.On("To").Return(make([]*mail.Address, 0))
|
||||||
msg1.On("Date").Return(time.Time{})
|
msg1.On("Date").Return(time.Time{})
|
||||||
msg1.On("Subject").Return("")
|
msg1.On("Subject").Return("")
|
||||||
msg1.On("Size").Return(0)
|
msg1.On("Size").Return(0)
|
||||||
@@ -257,8 +258,8 @@ func TestDataState(t *testing.T) {
|
|||||||
msg1 := &storage.MockMessage{}
|
msg1 := &storage.MockMessage{}
|
||||||
mds.On("NewMessage", "u1").Return(msg1, nil)
|
mds.On("NewMessage", "u1").Return(msg1, nil)
|
||||||
msg1.On("ID").Return("")
|
msg1.On("ID").Return("")
|
||||||
msg1.On("From").Return("")
|
msg1.On("From").Return(&mail.Address{})
|
||||||
msg1.On("To").Return(make([]string, 0))
|
msg1.On("To").Return(make([]*mail.Address, 0))
|
||||||
msg1.On("Date").Return(time.Time{})
|
msg1.On("Date").Return(time.Time{})
|
||||||
msg1.On("Subject").Return("")
|
msg1.On("Subject").Return("")
|
||||||
msg1.On("Size").Return(0)
|
msg1.On("Size").Return(0)
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ type Message struct {
|
|||||||
// Stored in GOB
|
// Stored in GOB
|
||||||
Fid string
|
Fid string
|
||||||
Fdate time.Time
|
Fdate time.Time
|
||||||
Ffrom string
|
Ffrom *mail.Address
|
||||||
Fto []string
|
Fto []*mail.Address
|
||||||
Fsubject string
|
Fsubject string
|
||||||
Fsize int64
|
Fsize int64
|
||||||
// These are for creating new messages only
|
// These are for creating new messages only
|
||||||
@@ -71,12 +71,12 @@ func (m *Message) Date() time.Time {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// From returns the value of the Message From header
|
// From returns the value of the Message From header
|
||||||
func (m *Message) From() string {
|
func (m *Message) From() *mail.Address {
|
||||||
return m.Ffrom
|
return m.Ffrom
|
||||||
}
|
}
|
||||||
|
|
||||||
// To returns the value of the Message To header
|
// To returns the value of the Message To header
|
||||||
func (m *Message) To() []string {
|
func (m *Message) To() []*mail.Address {
|
||||||
return m.Fto
|
return m.Fto
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,19 +220,17 @@ func (m *Message) Close() error {
|
|||||||
// Only public fields are stored in gob, hence starting with capital F
|
// Only public fields are stored in gob, hence starting with capital F
|
||||||
// Parse From address
|
// Parse From address
|
||||||
if address, err := mail.ParseAddress(body.GetHeader("From")); err == nil {
|
if address, err := mail.ParseAddress(body.GetHeader("From")); err == nil {
|
||||||
m.Ffrom = address.String()
|
m.Ffrom = address
|
||||||
} else {
|
} else {
|
||||||
m.Ffrom = body.GetHeader("From")
|
m.Ffrom = &mail.Address{Address: body.GetHeader("From")}
|
||||||
}
|
}
|
||||||
m.Fsubject = body.GetHeader("Subject")
|
m.Fsubject = body.GetHeader("Subject")
|
||||||
|
|
||||||
// Turn the To header into a slice
|
// Turn the To header into a slice
|
||||||
if addresses, err := body.AddressList("To"); err == nil {
|
if addresses, err := body.AddressList("To"); err == nil {
|
||||||
for _, a := range addresses {
|
m.Fto = addresses
|
||||||
m.Fto = append(m.Fto, a.String())
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
m.Fto = []string{body.GetHeader("To")}
|
m.Fto = []*mail.Address{{Address: body.GetHeader("To")}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh the index before adding our message
|
// Refresh the index before adding our message
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ type Store interface {
|
|||||||
type StoreMessage interface {
|
type StoreMessage interface {
|
||||||
Mailbox() string
|
Mailbox() string
|
||||||
ID() string
|
ID() string
|
||||||
From() string
|
From() *mail.Address
|
||||||
To() []string
|
To() []*mail.Address
|
||||||
Date() time.Time
|
Date() time.Time
|
||||||
Subject() string
|
Subject() string
|
||||||
RawReader() (reader io.ReadCloser, err error)
|
RawReader() (reader io.ReadCloser, err error)
|
||||||
|
|||||||
@@ -74,15 +74,15 @@ func (m *MockMessage) ID() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// From mock function
|
// From mock function
|
||||||
func (m *MockMessage) From() string {
|
func (m *MockMessage) From() *mail.Address {
|
||||||
args := m.Called()
|
args := m.Called()
|
||||||
return args.String(0)
|
return args.Get(0).(*mail.Address)
|
||||||
}
|
}
|
||||||
|
|
||||||
// To mock function
|
// To mock function
|
||||||
func (m *MockMessage) To() []string {
|
func (m *MockMessage) To() []*mail.Address {
|
||||||
args := m.Called()
|
args := m.Called()
|
||||||
return args.Get(0).([]string)
|
return args.Get(0).([]*mail.Address)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Date mock function
|
// Date mock function
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"net/mail"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -224,3 +225,14 @@ LOOP:
|
|||||||
|
|
||||||
return buf.String(), domain, nil
|
return buf.String(), domain, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StringAddressList converts a list of addresses to a list of strings
|
||||||
|
func StringAddressList(addrs []*mail.Address) []string {
|
||||||
|
s := make([]string, len(addrs))
|
||||||
|
for i, a := range addrs {
|
||||||
|
if a != nil {
|
||||||
|
s[i] = a.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user