Skip to content

Commit 271607e

Browse files
author
Richard Jones
committed
Accept single-character subject lines
1 parent f73c1f0 commit 271607e

File tree

4 files changed

+258
-2
lines changed

4 files changed

+258
-2
lines changed

CHANGES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ are given with the most recent entry first.
55

66
Fixed:
77
- Handle multiple @action values from broken trackers.
8+
- Accept single-character subject lines
89
- xmlrpc handling of unicode characters and binary values, see
910
http://thread.gmane.org/gmane.comp.bug-tracking.roundup.user/10040
1011
thanks to Hauke Duden for reporting these.

doc/developers.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ All development is coordinated through two resources:
2525
Website, wiki
2626
-------------
2727

28-
1. Log into <username>,[email protected]
28+
1. ssh -t <username>,[email protected] create
2929
2. cd /home/groups/r/ro/roundup
3030
3. follow instructions in README.txt
3131

roundup/mailgw.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ def _handle_message(self, message):
897897

898898
# if we've not found a valid classname prefix then force the
899899
# scanning to handle there being a leading delimiter
900-
title_re = r'(?P<title>%s[^%s]+)'%(
900+
title_re = r'(?P<title>%s[^%s]*)'%(
901901
not matches['classname'] and '.' or '', delim_open)
902902
m = re.match(title_re, tmpsubject.strip(), re.IGNORECASE)
903903
if m:

test/test_mailgw.py

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ def setUp(self):
137137
self.john_id = self.db.user.create(username='john',
138138
address='[email protected]', roles='User', realname='John Doe',
139139
alternate_addresses='[email protected]\n[email protected]')
140+
self.rgg_id = self.db.user.create(username='rgg',
141+
address='[email protected]', roles='User')
140142

141143
def tearDown(self):
142144
if os.path.exists(SENDMAILDEBUG):
@@ -1950,6 +1952,22 @@ def testUnknownPrefixSubject(self):
19501952
assert not os.path.exists(SENDMAILDEBUG)
19511953
self.assertEqual(self.db.keyword.get('1', 'name'), 'Bar')
19521954

1955+
def testOneCharSubject(self):
1956+
message = '''Content-Type: text/plain;
1957+
charset="iso-8859-1"
1958+
From: Chef <[email protected]>
1959+
1960+
Subject: b
1961+
1962+
1963+
Message-Id: <dummy_test_message_id>
1964+
1965+
'''
1966+
try:
1967+
self._handle_mail(message)
1968+
except MailUsageError:
1969+
self.fail('MailUsageError raised')
1970+
19531971
def testIssueidLast(self):
19541972
nodeid1 = self.doNewIssue()
19551973
nodeid2 = self._handle_mail('''Content-Type: text/plain;
@@ -2017,6 +2035,239 @@ def testSecurityMessagePermissionContent(self):
20172035
_______________________________________________________________________
20182036
''')
20192037

2038+
def testOutlookAttachment(self):
2039+
message = '''X-MimeOLE: Produced By Microsoft Exchange V6.5
2040+
Content-class: urn:content-classes:message
2041+
MIME-Version: 1.0
2042+
Content-Type: multipart/mixed;
2043+
boundary="----_=_NextPart_001_01CACA65.40A51CBC"
2044+
Subject: Example of a failed outlook attachment e-mail
2045+
Date: Tue, 23 Mar 2010 01:43:44 -0700
2046+
Message-ID: <[email protected]>
2047+
X-MS-Has-Attach: yes
2048+
X-MS-TNEF-Correlator:
2049+
Thread-Topic: Example of a failed outlook attachment e-mail
2050+
Thread-Index: AcrKJo/t3pUBBwTpSwWNE3LE67UBDQ==
2051+
From: "Hugh" <[email protected]>
2052+
2053+
X-OriginalArrivalTime: 23 Mar 2010 08:45:57.0350 (UTC) FILETIME=[41893860:01CACA65]
2054+
2055+
This is a multi-part message in MIME format.
2056+
2057+
------_=_NextPart_001_01CACA65.40A51CBC
2058+
Content-Type: multipart/alternative;
2059+
boundary="----_=_NextPart_002_01CACA65.40A51CBC"
2060+
2061+
2062+
------_=_NextPart_002_01CACA65.40A51CBC
2063+
Content-Type: text/plain;
2064+
charset="us-ascii"
2065+
Content-Transfer-Encoding: quoted-printable
2066+
2067+
2068+
Hi Richard,
2069+
2070+
I suppose this isn't the exact message that was sent but is a resend of
2071+
one of my trial messages that failed. For your benefit I changed the
2072+
subject line and am adding these words to the message body. Should
2073+
still be as problematic, but if you like I can resend an exact copy of a
2074+
failed message changing nothing except putting your address instead of
2075+
our tracker.
2076+
2077+
Thanks very much for taking time to look into this. Much appreciated.
2078+
2079+
<<battery backup>>=20
2080+
2081+
------_=_NextPart_002_01CACA65.40A51CBC
2082+
Content-Type: text/html;
2083+
charset="us-ascii"
2084+
Content-Transfer-Encoding: quoted-printable
2085+
2086+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
2087+
<HTML>
2088+
<HEAD>
2089+
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
2090+
charset=3Dus-ascii">
2091+
<META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
2092+
6.5.7654.12">
2093+
<TITLE>Example of a failed outlook attachment e-mail</TITLE>
2094+
</HEAD>
2095+
<BODY>
2096+
<!-- Converted from text/rtf format -->
2097+
<BR>
2098+
2099+
<P><FONT SIZE=3D2 FACE=3D"Arial">Hi Richard,</FONT>
2100+
</P>
2101+
2102+
<P><FONT SIZE=3D2 FACE=3D"Arial">I suppose this isn't the exact message =
2103+
that was sent but is a resend of one of my trial messages that =
2104+
failed.&nbsp; For your benefit I changed the subject line and am adding =
2105+
these words to the message body.&nbsp; Should still be as problematic, =
2106+
but if you like I can resend an exact copy of a failed message changing =
2107+
nothing except putting your address instead of our tracker.</FONT></P>
2108+
2109+
<P><FONT SIZE=3D2 FACE=3D"Arial">Thanks very much for taking time to =
2110+
look into this.&nbsp; Much appreciated.</FONT>
2111+
</P>
2112+
<BR>
2113+
2114+
<P><FONT FACE=3D"Arial" SIZE=3D2 COLOR=3D"#000000"> &lt;&lt;battery =
2115+
backup&gt;&gt; </FONT>
2116+
</P>
2117+
2118+
</BODY>
2119+
</HTML>
2120+
------_=_NextPart_002_01CACA65.40A51CBC--
2121+
2122+
------_=_NextPart_001_01CACA65.40A51CBC
2123+
Content-Type: message/rfc822
2124+
Content-Transfer-Encoding: 7bit
2125+
2126+
X-MimeOLE: Produced By Microsoft Exchange V6.5
2127+
MIME-Version: 1.0
2128+
Content-Type: multipart/alternative;
2129+
boundary="----_=_NextPart_003_01CAC15A.29717800"
2130+
X-OriginalArrivalTime: 11 Mar 2010 20:33:51.0249 (UTC) FILETIME=[28FEE010:01CAC15A]
2131+
Content-class: urn:content-classes:message
2132+
Subject: battery backup
2133+
Date: Thu, 11 Mar 2010 13:33:43 -0700
2134+
Message-ID: <p06240809c7bf02f9624c@[128.114.22.203]>
2135+
X-MS-Has-Attach:
2136+
X-MS-TNEF-Correlator:
2137+
Thread-Topic: battery backup
2138+
Thread-Index: AcrBWimtulTrSvBdQ2CcfZ8lyQdxmQ==
2139+
From: "Jerry" <[email protected]>
2140+
To: "Hugh" <[email protected]>
2141+
2142+
This is a multi-part message in MIME format.
2143+
2144+
------_=_NextPart_003_01CAC15A.29717800
2145+
Content-Type: text/plain;
2146+
charset="iso-8859-1"
2147+
Content-Transfer-Encoding: quoted-printable
2148+
2149+
Dear Hugh,
2150+
A car batter has an energy capacity of ~ 500Wh. A UPS=20
2151+
battery is worse than this.
2152+
2153+
if we need to provied 100kW for 30 minutes that will take 100 car=20
2154+
batteries. This seems like an awful lot of batteries.
2155+
2156+
Of course I like your idea of making the time 1 minute, so we get to=20
2157+
a more modest number of batteries
2158+
2159+
Jerry
2160+
2161+
2162+
------_=_NextPart_003_01CAC15A.29717800
2163+
Content-Type: text/html;
2164+
charset="iso-8859-1"
2165+
Content-Transfer-Encoding: quoted-printable
2166+
2167+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
2168+
<HTML>
2169+
<HEAD>
2170+
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
2171+
charset=3Diso-8859-1">
2172+
<META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
2173+
6.5.7654.12">
2174+
<TITLE>battery backup</TITLE>
2175+
</HEAD>
2176+
<BODY>
2177+
<!-- Converted from text/plain format -->
2178+
2179+
<P><FONT SIZE=3D2>Dear Hugh,</FONT>
2180+
2181+
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2>A car =
2182+
batter has an energy capacity of ~ 500Wh.&nbsp; A UPS </FONT>
2183+
2184+
<BR><FONT SIZE=3D2>battery is worse than this.</FONT>
2185+
</P>
2186+
2187+
<P><FONT SIZE=3D2>if we need to provied 100kW for 30 minutes that will =
2188+
take 100 car </FONT>
2189+
2190+
<BR><FONT SIZE=3D2>batteries.&nbsp; This seems like an awful lot of =
2191+
batteries.</FONT>
2192+
</P>
2193+
2194+
<P><FONT SIZE=3D2>Of course I like your idea of making the time 1 =
2195+
minute, so we get to </FONT>
2196+
2197+
<BR><FONT SIZE=3D2>a more modest number of batteries</FONT>
2198+
</P>
2199+
2200+
<P><FONT SIZE=3D2>Jerry</FONT>
2201+
</P>
2202+
2203+
</BODY>
2204+
</HTML>
2205+
------_=_NextPart_003_01CAC15A.29717800--
2206+
2207+
------_=_NextPart_001_01CACA65.40A51CBC--
2208+
'''
2209+
nodeid = self._handle_mail(message)
2210+
assert not os.path.exists(SENDMAILDEBUG)
2211+
msgid = self.db.issue.get(nodeid, 'messages')[0]
2212+
self.assert_(self.db.msg.get(msgid, 'content').startswith('Hi Richard'))
2213+
self.assertEqual(self.db.msg.get(msgid, 'files'), ['1', '2'])
2214+
fileid = self.db.msg.get(msgid, 'files')[0]
2215+
self.assertEqual(self.db.file.get(fileid, 'type'), 'text/html')
2216+
fileid = self.db.msg.get(msgid, 'files')[1]
2217+
self.assertEqual(self.db.file.get(fileid, 'type'), 'message/rfc822')
2218+
2219+
def testForwardedMessageAttachment(self):
2220+
message = '''Return-Path: <[email protected]>
2221+
Received: from localhost(127.0.0.1), claiming to be "[115.130.26.69]"
2222+
via SMTP by localhost, id smtpdAAApLaWrq; Tue Apr 13 23:10:05 2010
2223+
Message-ID: <[email protected]>
2224+
Date: Wed, 14 Apr 2010 09:09:59 +1000
2225+
From: Rupert Goldie <[email protected]>
2226+
User-Agent: Thunderbird 2.0.0.24 (Windows/20100228)
2227+
MIME-Version: 1.0
2228+
To: ekit issues <[email protected]>
2229+
Subject: [Fwd: PHP ERROR (fb)] post limit reached
2230+
Content-Type: multipart/mixed; boundary="------------000807090608060304010403"
2231+
2232+
This is a multi-part message in MIME format.
2233+
--------------000807090608060304010403
2234+
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
2235+
Content-Transfer-Encoding: 7bit
2236+
2237+
Catch this exception and log it without emailing.
2238+
2239+
--------------000807090608060304010403
2240+
Content-Type: message/rfc822; name="PHP ERROR (fb).eml"
2241+
Content-Transfer-Encoding: 7bit
2242+
Content-Disposition: inline; filename="PHP ERROR (fb).eml"
2243+
2244+
Return-Path: <[email protected]>
2245+
X-Sieve: CMU Sieve 2.2
2246+
via SMTP by crown.off.ekorp.com, id smtpdAAA1JaW1o; Tue Apr 13 23:01:04 2010
2247+
X-Virus-Scanned: by amavisd-new at ekit.com
2248+
2249+
2250+
Subject: PHP ERROR (fb)
2251+
Message-Id: <[email protected]>
2252+
Date: Tue, 13 Apr 2010 23:01:00 +0000 (UTC)
2253+
2254+
[13-Apr-2010 22:49:02] PHP Fatal error: Uncaught exception 'Exception' with message 'Facebook Error Message: Feed action request limit reached' in /app/01/www/virtual/fb.ekit.com/htdocs/includes/functions.php:280
2255+
Stack trace:
2256+
#0 /app/01/www/virtual/fb.ekit.com/htdocs/gateway/ekit/feed/index.php(178): fb_exceptions(Object(FacebookRestClientException))
2257+
#1 {main}
2258+
thrown in /app/01/www/virtual/fb.ekit.com/htdocs/includes/functions.php on line 280
2259+
2260+
2261+
--------------000807090608060304010403--
2262+
'''
2263+
nodeid = self._handle_mail(message)
2264+
assert not os.path.exists(SENDMAILDEBUG)
2265+
msgid = self.db.issue.get(nodeid, 'messages')[0]
2266+
self.assertEqual(self.db.msg.get(msgid, 'content'),
2267+
'Catch this exception and log it without emailing.')
2268+
self.assertEqual(self.db.msg.get(msgid, 'files'), ['1'])
2269+
fileid = self.db.msg.get(msgid, 'files')[0]
2270+
self.assertEqual(self.db.file.get(fileid, 'type'), 'message/rfc822')
20202271

20212272
def test_suite():
20222273
suite = unittest.TestSuite()
@@ -2028,3 +2279,7 @@ def test_suite():
20282279
unittest.main(testRunner=runner)
20292280

20302281
# vim: set filetype=python sts=4 sw=4 et si :
2282+
2283+
2284+
2285+

0 commit comments

Comments
 (0)