diff --git a/oletools/ppt_parser.py b/oletools/ppt_parser.py index 2c6ee22..8aefdec 100644 --- a/oletools/ppt_parser.py +++ b/oletools/ppt_parser.py @@ -17,6 +17,7 @@ References: #------------------------------------------------------------------------------ # TODO: # - license +# - create a AtomBase class that defines check_value and parses RecordHead? # # CHANGELOG: # 2016-05-04 v0.01 CH: - start parsing "Current User" stream @@ -61,6 +62,21 @@ class PptUnexpectedData(Exception): # === STRUCTS ================================================================= +def check_value(name, value, expected): + """ simplify verification of values in extract_from """ + if isinstance(expected, (list, tuple)): + if value not in expected: + exp_str = '[' + ' OR '.join('{0:04X}'.format(val) + for val in expected) + ']' + raise PptUnexpectedData( + 'Current User', name, + '{0:04X}'.format(value), exp_str) + elif expected != value: + raise PptUnexpectedData( + 'Current User', name, + '{0:04X}'.format(value), '{0:04X}'.format(expected)) + + class RecordHeader(object): """ a record header, often found in ppt files @@ -123,6 +139,9 @@ class CurrentUserAtom(object): self.unicode_user_name = None self.rel_version = None + def is_encrypted(self): + return self.header_token == self.HEADER_TOKEN_ENCRYPT + @classmethod def extract_from(clz, ole): """ extract info from olefile """ @@ -137,21 +156,19 @@ class CurrentUserAtom(object): # parse record header obj.rec_head = RecordHeader.extract_from(stream) - obj.check_value('rec_version', obj.rec_head.rec_ver, 0) - obj.check_value('rec_instance', obj.rec_head.rec_ver, 0) - obj.check_value('rec_instance', obj.rec_head.rec_type, - clz.RECORD_TYPE) + check_value('rec_version', obj.rec_head.rec_ver, 0) + check_value('rec_instance', obj.rec_head.rec_ver, 0) + check_value('rec_type', obj.rec_head.rec_type, clz.RECORD_TYPE) size, = struct.unpack('