Skip to content

Commit

Permalink
fix(GODT-2634): Ensure IMAP month dates are case-insensitive
Browse files Browse the repository at this point in the history
  • Loading branch information
LBeernaertProton committed May 16, 2023
1 parent 580e733 commit d18e593
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 13 deletions.
27 changes: 14 additions & 13 deletions imap/command/date_time.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package command

import (
"fmt"
"strings"
"time"

"github.com/ProtonMail/gluon/rfcparser"
Expand Down Expand Up @@ -77,18 +78,18 @@ func ParseDateDayFixed(p *rfcparser.Parser) (int, error) {
}

var dateMonthToInt = map[string]time.Month{
"Jan": time.January,
"Feb": time.February,
"Mar": time.March,
"Apr": time.April,
"May": time.May,
"Jun": time.June,
"Jul": time.July,
"Aug": time.August,
"Sep": time.September,
"Oct": time.October,
"Nov": time.November,
"Dec": time.December,
"jan": time.January,
"feb": time.February,
"mar": time.March,
"apr": time.April,
"may": time.May,
"jun": time.June,
"jul": time.July,
"aug": time.August,
"sep": time.September,
"oct": time.October,
"nov": time.November,
"dec": time.December,
}

func ParseDateMonth(p *rfcparser.Parser) (time.Month, error) {
Expand All @@ -102,7 +103,7 @@ func ParseDateMonth(p *rfcparser.Parser) (time.Month, error) {
month[i] = p.PreviousToken().Value
}

v, ok := dateMonthToInt[string(month)]
v, ok := dateMonthToInt[strings.ToLower(string(month))]
if !ok {
return 0, p.MakeError(fmt.Sprintf("invalid date month '%v'", string(month)))
}
Expand Down
15 changes: 15 additions & 0 deletions imap/command/date_time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,18 @@ func TestDateTimeParser_OneDayDigit(t *testing.T) {
require.NoError(t, err)
require.Equal(t, expected, dt)
}

func TestDateMonthIsCaseInsensitive(t *testing.T) {
inputs := []string{"May", "MAY", "may", "mAy"}

for _, input := range inputs {
p := rfcparser.NewParser(rfcparser.NewScanner(bytes.NewReader([]byte(input))))
// Advance at least once to prepare first token.
err := p.Advance()
require.NoError(t, err)

v, err := ParseDateMonth(p)
require.NoError(t, err)
require.Equal(t, time.May, v)
}
}

0 comments on commit d18e593

Please sign in to comment.