Skip to content

Commit

Permalink
Make decoding failure on base64.CorruptInputError non-fatal (#119)
Browse files Browse the repository at this point in the history
* Make decoding failure on base64.CorruptInputError non-fatal, closes #117
  • Loading branch information
requaos authored and jhillyerd committed Jan 24, 2019
1 parent a9ec2f8 commit 4ec8ed2
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 2 deletions.
19 changes: 19 additions & 0 deletions envelope_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -900,6 +900,25 @@ func TestBadContentTypeInMime(t *testing.T) {
}
}

func TestBadContentTransferEncodingInMime(t *testing.T) {
msg := test.OpenTestData("mail", "mime-bad-content-transfer-encoding.raw")
e, err := enmime.ReadEnvelope(msg)

if err != nil {
t.Fatal("Failed to parse MIME:", err)
}

var expectedErrorPresent bool
for _, v := range e.Errors {
if v.Name == enmime.ErrorMalformedBase64 && v.Severe {
expectedErrorPresent = true
}
}
if !expectedErrorPresent {
t.Fatal("Mail should have a severe malformed base64 error")
}
}

func TestBlankMediaName(t *testing.T) {
msg := test.OpenTestData("mail", "mime-blank-media-name.raw")
e, err := enmime.ReadEnvelope(msg)
Expand Down
22 changes: 20 additions & 2 deletions part.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,13 +284,13 @@ func (p *Part) decodeContent(r io.Reader) error {
var err error
contentReader, err = p.convertFromDetectedCharset(contentReader)
if err != nil {
return err
return p.base64CorruptInputCheck(err)
}
}
// Decode and store content.
content, err := ioutil.ReadAll(contentReader)
if err != nil {
return errors.WithStack(err)
return p.base64CorruptInputCheck(errors.WithStack(err))
}
p.Content = content
// Collect base64 errors.
Expand All @@ -306,6 +306,24 @@ func (p *Part) decodeContent(r io.Reader) error {
return nil
}

// base64CorruptInputCheck will avoid fatal failure on corrupt base64 input
//
// This is a switch on errors.Cause(err).(type) for base64.CorruptInputError
func (p *Part) base64CorruptInputCheck(err error) error {
switch errors.Cause(err).(type) {
case base64.CorruptInputError:
p.Content = nil
p.Errors = append(p.Errors, &Error{
Name: ErrorMalformedBase64,
Detail: err.Error(),
Severe: true,
})
return nil
default:
return err
}
}

// Clone returns a clone of the current Part.
func (p *Part) Clone(parent *Part) *Part {
if p == nil {
Expand Down
66 changes: 66 additions & 0 deletions testdata/mail/mime-bad-content-transfer-encoding.raw
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
Received: from HVD-Exch16-01. internal.contoso.dom (192.168.1.50) by
HVD-Exch16-01. internal.contoso.dom (192.168.1.50) with Microsoft SMTP
Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id
15.1.1591.10 via Mailbox Transport; Sun, 20 Jan 2019 14:33:43 -0600
Message-ID: <rgrbhlkyhowz-zughjdb-v@demo.com>
Content-Type: multipart/alternative; boundary="ABOUNDARY.075224149159994985"
Subject: alert
Date: Sun, 20 Jan 2019 23:33:39 +0300
From: example <example@demo.com>
To: example <example@demo.com>
Return-Path: doonglol@contoso.com
MIME-Version: 1.0

--ABOUNDARY.075224149159994985
Content-Type: text/plain; format=flowed; charset="UTF-8"
Content-Transfer-Encoding: base64

ploozdect nispplul swunkglap zarplontruskdremp fruftsist
ploystoov smohsless cregzass smoosknuspgeftlut priptyasp
smoorbrooft pukstrooz pruhrept frorblilcroospbrod spakkess
ruzyoost toctswing grumsmach birflugjechfapt broostspust
nudyet changlig droontmunt chapplooypectsoy gafral
slipblept geskchant gluddrach prontcrundhaysnind spomdast
sahshooy yinzess snutgruch breyloossstrolflooy vuptsling
ploorlish hondcrud mebnush flendblutslawspint groowpromp
maspflid grashsmey ploozblust blanzafbumyuct gligplask
fasstross voongluf gluzzast luzflooctlerpach brishhonk
troowtrict flezskooft honkglok bloofjooshshuhtuz pogpreh
clinttrost strachlunk strehslonk flinflumcrashshipt prehhach
stooplet tucttoog prindskech bloopdrarhoomgont grabtesp
prilput froontnooch nubstrisk lectkampswulgrupt pangyef
spawsnef snoondshin noonskunk sperglikvimpcrag flizfan
frogplusk claspcrav flacttink blandpahcroskbropt plobnof
sniwmact flobskenk grotslish crosppampsooskslut dekprich
slitpruw smupwiw skikstint hostslaglinboh glovyev
groolshict mirbrod tooddih smendgloshtooctsmak nanclih
plantfloog plosszav chosksmek shechsnupfrashdik smooyhipt
skulclod glubsmak swakproog snostslahshoplan sledtroosk
wizpek voofwoss ploospmoow daskspongbrawbroop suhspat
jatnoft wofthah froolyup slootgankcreshglol pidshek
nimpchest smichmund clofflask lundzoonkroonsmiss pleskting
wechslapt yulfut charshisk jospharpoffroor flubfraw
smirslang konsmiy zivblad sterchoowpooyjik huctkul
blonghum vaptslooft gloostplemp puttagslesssuft shivvuh
strongslog craftjoob lidfreh rizskachbumloow kifkid
druksnoopt drumpclir govbluf siptgeptgrozstrooss glarhaft
flanyef zetkel kifspunk gefhewsnohpur spewskoosh
rafgob zoochbiw foptgav fuyyonkbrictspob plenrimp
fruchbremp brooshchep smafbluh shoochcrakkangstrub moontdoomp
glooctclog jiffrint droozkuz zopprumpspaftheb joofstub
blidguss deshdrect gromstasp clebtusppruskgov dudtrosk
prudskil wengdesp stransloh droobglizhondsmop dewspook
vedsosp trempwusp siyfrool kuchstrissnookflest croptgum
leshkess ploobfrey blintsung rengjictbrushgrooss jiptwiv
kugstug bruchkop giftchir piwclisksloozhist frispgech
glactspang cruvvob prushswach plegpitwoospvow chuzgrunt

--ABOUNDARY.075224149159994985
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: base64

PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJz
ZXQ9dXRmLTgiPgoKPGJyPgpUaGlzIGlzIGFuIGV4YW1wbGUKPGJyPg==


--ABOUNDARY.075224149159994985--

0 comments on commit 4ec8ed2

Please sign in to comment.