1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 09:37:02 +00:00

Switch to storing To addresses as a slice

- Changes on-disk storage format
- Changes JSON API
- To and From values are now parsed/formatted by Go's mail.ParseAddress
  function
- Fixed bug in list-entry-template, was not escaping HTML characters
- Updated tests
This commit is contained in:
James Hillyerd
2016-09-21 22:12:20 -07:00
parent 01ea89e7e2
commit 017a097588
11 changed files with 46 additions and 26 deletions

View File

@@ -17,7 +17,7 @@ type JSONMessageHeaderV1 struct {
Mailbox string `json:"mailbox"`
ID string `json:"id"`
From string `json:"from"`
To string `json:"to"`
To []string `json:"to"`
Subject string `json:"subject"`
Date time.Time `json:"date"`
Size int64 `json:"size"`
@@ -28,7 +28,7 @@ type JSONMessageV1 struct {
Mailbox string `json:"mailbox"`
ID string `json:"id"`
From string `json:"from"`
To string `json:"to"`
To []string `json:"to"`
Subject string `json:"subject"`
Date time.Time `json:"date"`
Size int64 `json:"size"`

View File

@@ -95,7 +95,7 @@ func TestRestMailboxList(t *testing.T) {
Mailbox: "good",
ID: "0001",
From: "from1",
To: "to1",
To: []string{"to1"},
Subject: "subject 1",
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, time.FixedZone("PST", -800)),
}
@@ -103,7 +103,7 @@ func TestRestMailboxList(t *testing.T) {
Mailbox: "good",
ID: "0002",
From: "from2",
To: "to1",
To: []string{"to1"},
Subject: "subject 2",
Date: time.Date(2012, 7, 1, 10, 11, 12, 253, time.FixedZone("PDT", -700)),
}

View File

@@ -70,9 +70,9 @@ func (m *MockMessage) From() string {
return args.String(0)
}
func (m *MockMessage) To() string {
func (m *MockMessage) To() []string {
args := m.Called()
return args.String(0)
return args.Get(0).([]string)
}
func (m *MockMessage) Date() time.Time {

View File

@@ -17,7 +17,7 @@ import (
type InputMessageData struct {
Mailbox, ID, From, Subject string
To string
To []string
Date time.Time
Size int
Header mail.Header
@@ -81,9 +81,11 @@ func (d *InputMessageData) CompareToJSONHeaderMap(json interface{}) (errors []st
if msg, ok := isJSONStringEqual(fromKey, d.From, m[fromKey]); !ok {
errors = append(errors, msg)
}
if msg, ok := isJSONStringEqual(toKey, d.To, m[toKey]); !ok {
for i, inputTo := range d.To {
if msg, ok := isJSONStringEqual(toKey, inputTo, m[toKey].([]interface{})[i]); !ok {
errors = append(errors, msg)
}
}
if msg, ok := isJSONStringEqual(subjectKey, d.Subject, m[subjectKey]); !ok {
errors = append(errors, msg)
}

View File

@@ -36,7 +36,7 @@ type Mailbox interface {
type Message interface {
ID() string
From() string
To() string
To() []string
Date() time.Time
Subject() string
RawReader() (reader io.ReadCloser, err error)

View File

@@ -295,7 +295,7 @@ type FileMessage struct {
Fid string
Fdate time.Time
Ffrom string
Fto string
Fto []string
Fsubject string
Fsize int64
// These are for creating new messages only
@@ -345,7 +345,7 @@ func (m *FileMessage) From() string {
}
// From returns the value of the Message To header
func (m *FileMessage) To() string {
func (m *FileMessage) To() []string {
return m.Fto
}
@@ -490,11 +490,24 @@ func (m *FileMessage) Close() error {
return err
}
// Only public fields are stored in gob
// Only public fields are stored in gob, hence starting with capital F
// Parse From address
if address, err := mail.ParseAddress(body.GetHeader("From")); err == nil {
m.Ffrom = address.String()
} else {
m.Ffrom = body.GetHeader("From")
m.Fto = body.GetHeader("To")
}
m.Fsubject = body.GetHeader("Subject")
// Turn the To header into a slice
if addresses, err := body.AddressList("To"); err == nil {
for _, a := range addresses {
m.Fto = append(m.Fto, a.String())
}
} else {
m.Fto = []string{body.GetHeader("To")}
}
// Refresh the index before adding our message
err = m.mailbox.readIndex()
if err != nil {

View File

@@ -126,9 +126,9 @@ func (m *MockMessage) From() string {
return args.String(0)
}
func (m *MockMessage) To() string {
func (m *MockMessage) To() []string {
args := m.Called()
return args.String(0)
return args.Get(0).([]string)
}
func (m *MockMessage) Date() time.Time {

View File

@@ -31,7 +31,7 @@ export SWAKS_OPT_to="$to@inbucket.local"
swaks $* --h-Subject: "Swaks Plain Text" --body text.txt
# Multi-recipient test
swaks $* --to="$to@inbucket.local,alternate@inbucket.local" --h-Subject: "Swaks Multi-Recipient" \
swaks $* --to="$to@inbucket.local,Alt User <alternate@inbucket.local>" --h-Subject: "Swaks Multi-Recipient" \
--body text.txt
# HTML test

View File

@@ -53,7 +53,12 @@
<dt>From:</dt>
<dd>{{.message.From}}</dd>
<dt>To:</dt>
<dd>{{.message.To}}</dd>
<dd>
{{range $i, $addr := .message.To}}
{{- if $i}},{{end}}
{{$addr -}}
{{end}}
</dd>
<dt>Date:</dt>
<dd>{{.message.Date}}</dd>
<dt>Subject:</dt>

View File

@@ -15,9 +15,9 @@ $(document).ready(function() {
<script type="text/html" id="list-entry-template">
<button data-id="id" type="button" class="message-list-entry list-group-item">
<div class="row">
<div class="col-sm-4 col-md-12 text-primary" data-content="subject"
<div class="col-sm-4 col-md-12 text-primary" data-content-text="subject"
data-format="subject"/>
<div class="col-sm-4 col-md-12 small" data-content="from"/>
<div class="col-sm-4 col-md-12 small" data-content-text="from"/>
<div class="col-sm-4 col-md-12 small" data-content="date" data-format="date"/>
</div>
</button>

View File

@@ -478,9 +478,9 @@ func (m *MockMessage) From() string {
return args.String(0)
}
func (m *MockMessage) To() string {
func (m *MockMessage) To() []string {
args := m.Called()
return args.String(0)
return args.Get(0).([]string)
}
func (m *MockMessage) Date() time.Time {