diff --git a/pgpdump/packet.py b/pgpdump/packet.py index cf83e4e..bb26f4e 100644 --- a/pgpdump/packet.py +++ b/pgpdump/packet.py @@ -1,10 +1,10 @@ from datetime import datetime, timedelta import hashlib from math import ceil, log -import re from .utils import (PgpdumpException, get_int2, get_int4, get_mpi, - get_key_id, get_hex_data, get_int_bytes, pack_data) + get_key_id, get_hex_data, get_int_bytes, pack_data, + find_between) class Packet(object): @@ -633,19 +633,21 @@ def __init__(self, *args, **kwargs): self.user = None self.user_name = None self.user_email = None + self.user_comment = None super(UserIDPacket, self).__init__(*args, **kwargs) - user_re = re.compile(r'^([^<]+)? ?<([^>]*)>?') - def parse(self): self.user = self.data.decode('utf8', 'replace') - matches = self.user_re.match(self.user) - if matches: - if matches.group(1): - self.user_name = matches.group(1).strip() - if matches.group(2): - self.user_email = matches.group(2).strip() - + self.user_comment = find_between(self.user, '(', ')') + self.user_email = find_between(self.user, '<', '>') + if self.user_comment: + open_paren = self.user.find('(') + self.user_name = self.user[:open_paren].strip() + elif self.user_email: + lt = self.user.find('<') + self.user_name = self.user[:lt].strip() + else: + self.user_name = self.user return self.length def __repr__(self): diff --git a/pgpdump/test.py b/pgpdump/test.py index 12a6310..5d7a28e 100644 --- a/pgpdump/test.py +++ b/pgpdump/test.py @@ -264,6 +264,7 @@ def test_parse_linus_binary(self): elif isinstance(packet, UserIDPacket): seen += 1 self.assertEqual("Linus Torvalds", packet.user_name) + self.assertEqual(None, packet.user_comment) self.assertEqual("torvalds@linux-foundation.org", packet.user_email) diff --git a/pgpdump/utils.py b/pgpdump/utils.py index 960d183..d27fbb0 100644 --- a/pgpdump/utils.py +++ b/pgpdump/utils.py @@ -145,3 +145,12 @@ def same_key(key_a, key_b): return key_b.endswith(key_a) else: return key_a.endswith(key_b) + +def find_between(s, first, second): + '''Get all characters between first and second in the string s''' + first_index = s.find(first) + if first_index >= 0: + second_index = s.find(second, first_index) + if second_index > first_index + 1: + return s[first_index+1 : second_index] + return None