aboutsummaryrefslogtreecommitdiff
path: root/b4/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'b4/__init__.py')
-rw-r--r--b4/__init__.py41
1 files changed, 37 insertions, 4 deletions
diff --git a/b4/__init__.py b/b4/__init__.py
index 14224a7..e05af03 100644
--- a/b4/__init__.py
+++ b/b4/__init__.py
@@ -84,6 +84,19 @@ AMHDRS = [
'List-Id',
]
+# Unicode chars that can be used to mess up legitimate code review
+BAD_UNI_CHARS = {
+ chr(0x202A),
+ chr(0x202B),
+ chr(0x202C),
+ chr(0x202D),
+ chr(0x202E),
+ chr(0x2066),
+ chr(0x2067),
+ chr(0x2068),
+ chr(0x2069),
+}
+
# You can use bash-style globbing here
# end with '*' to include any other trailers
# You can change the default in your ~/.gitconfig, e.g.:
@@ -491,7 +504,7 @@ class LoreSeries:
return slug[:100]
def get_am_ready(self, noaddtrailers=False, covertrailers=False, trailer_order=None, addmysob=False,
- addlink=False, linkmask=None, cherrypick=None, copyccs=False) -> list:
+ addlink=False, linkmask=None, cherrypick=None, copyccs=False, allowbadchars=False) -> list:
usercfg = get_user_config()
config = get_main_config()
@@ -579,7 +592,8 @@ class LoreSeries:
add_trailers = True
if noaddtrailers:
add_trailers = False
- msg = lmsg.get_am_message(add_trailers=add_trailers, trailer_order=trailer_order, copyccs=copyccs)
+ msg = lmsg.get_am_message(add_trailers=add_trailers, trailer_order=trailer_order, copyccs=copyccs,
+ allowbadchars=allowbadchars)
msgs.append(msg)
else:
logger.error(' ERROR: missing [%s/%s]!', at, self.expected)
@@ -1596,11 +1610,30 @@ class LoreMessage:
return '[%s] %s' % (' '.join(parts), self.lsubject.subject)
- def get_am_message(self, add_trailers=True, trailer_order=None, copyccs=False):
+ def get_am_message(self, add_trailers=True, trailer_order=None, copyccs=False, allowbadchars=False):
if add_trailers:
self.fix_trailers(trailer_order=trailer_order, copyccs=copyccs)
+ bbody = self.body.encode()
+ # Look through the body to make sure there aren't any unwanted unicode characters
+ # First, encode into ascii and compare for a quickie utf8 presence test
+ if self.body.encode('ascii', errors='replace') != bbody:
+ logger.debug('Body contains non-ascii characters. Performing a test against badchars.')
+ matches = {u for u in self.body if u in BAD_UNI_CHARS}
+ if matches and not allowbadchars:
+ logger.critical('---')
+ logger.critical('WARNING: Message contains unicode control characters!')
+ logger.critical(' Subject: %s', self.full_subject)
+ logger.critical(' If you know what you are doing, rerun with the right flag to allow this.')
+ sys.exit(1)
+ if matches and allowbadchars:
+ logger.info('---')
+ logger.info('WARNING: Message contains unicode control characters!')
+ logger.info(' Subject: %s', self.full_subject)
+ logger.info(' Allowing this through, I hope you know what you are doing.')
+ logger.info('---')
+
am_msg = email.message.EmailMessage()
- am_msg.set_payload(self.body.encode())
+ am_msg.set_payload(bbody)
am_msg.add_header('Subject', self.get_am_subject(indicate_reroll=False))
if self.fromname:
am_msg.add_header('From', f'{self.fromname} <{self.fromemail}>')