From e96e5b8ac44095668198e3e6797a3f77d9fb4634 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 21 Jan 2012 23:56:52 +0100 Subject: Preliminary handling of ctime/mtime reset --- mat/archive.py | 9 +++++++++ mat/audio.py | 2 ++ mat/exiftool.py | 1 + mat/misc.py | 1 + mat/office.py | 4 ++++ mat/parser.py | 31 +++++++++++++++++++++++++++++-- 6 files changed, 46 insertions(+), 2 deletions(-) diff --git a/mat/archive.py b/mat/archive.py index 9993102..84ef10a 100644 --- a/mat/archive.py +++ b/mat/archive.py @@ -5,6 +5,7 @@ import zipfile import shutil import os +import time import logging import tempfile @@ -12,6 +13,10 @@ import parser import mat from tarfile import tarfile +#Zip fileformat does not handle dates +#prior to 1980 +ZIP_TIME = 315529200 #1jan1980 + class GenericArchiveStripper(parser.GenericParser): ''' @@ -161,6 +166,9 @@ harmless format' % item.filename) zipout.close() logging.info('%s treated' % self.filename) self.do_backup() + #time = 1980 + # TODO + #self.set_time(time) return True @@ -204,6 +212,7 @@ class TarStripper(GenericArchiveStripper): tarin.close() tarout.close() self.do_backup() + self.set_time(parser.EPOCH) return True def is_file_clean(self, current_file): diff --git a/mat/audio.py b/mat/audio.py index ed849ee..4682db1 100644 --- a/mat/audio.py +++ b/mat/audio.py @@ -35,6 +35,7 @@ class OggStripper(parser.GenericParser): mfile = OggVorbis(self.filename) mfile.delete() mfile.save() + self.set_time(parser.EPOCH) return True def is_clean(self): @@ -74,6 +75,7 @@ class FlacStripper(parser.GenericParser): mfile.delete() mfile.clear_pictures() mfile.save() + self.set_time(parser.EPOCH) return True def is_clean(self): diff --git a/mat/exiftool.py b/mat/exiftool.py index 758a094..47e7dfc 100644 --- a/mat/exiftool.py +++ b/mat/exiftool.py @@ -43,6 +43,7 @@ class ExiftoolStripper(parser.GenericParser): [ 'exiftool', '-m', '-All=', '-overwrite_original', self.filename ], stdout=open('/dev/null')) process.wait() + self.set_time(parser.EPOCH) return True except: return False diff --git a/mat/misc.py b/mat/misc.py index d084861..80ccc79 100644 --- a/mat/misc.py +++ b/mat/misc.py @@ -60,4 +60,5 @@ class TorrentStripper(parser.GenericParser): with open(self.output, 'w') as f: # encode the decoded torrent f.write(bencode.bencode(decoded)) # and write it in self.output self.do_backup() + self.set_time(parser.EPOCH) return True diff --git a/mat/office.py b/mat/office.py index e1d738e..5ff9a83 100644 --- a/mat/office.py +++ b/mat/office.py @@ -100,6 +100,7 @@ class OpenDocumentStripper(archive.GenericArchiveStripper): zipin.close() zipout.close() self.do_backup() + self.set_time(archive.ZIP_TIME) return True def is_clean(self): @@ -213,6 +214,8 @@ class PdfStripper(parser.GenericParser): if processed is False: logging.error('Please install either pdfrw, or exiftool to\ fully handle PDF files') + + self.set_time(parser.EPOCH) return processed def get_meta(self): @@ -274,6 +277,7 @@ class OpenXmlStripper(archive.GenericArchiveStripper): zipin.close() zipout.close() self.do_backup() + self.set_time(archive.ZIP_TIME) return True def is_clean(self): diff --git a/mat/parser.py b/mat/parser.py index 6dc5d0b..0c6f0ee 100644 --- a/mat/parser.py +++ b/mat/parser.py @@ -6,15 +6,18 @@ import hachoir_core import hachoir_editor import os +import time +import sys import mat NOMETA = ('.bmp', '.rdf', '.txt', '.xml', '.rels') +EPOCH = 0 #bmp : image #rdf : text #txt : plain text #xml : formated text -#rels : openxml foramted text +#rels : openxml formated text FIELD = object() @@ -55,7 +58,14 @@ class GenericParser(object): if remove is FIELD: if not self._is_clean(field): return False - return True + + def is_time_clean(self): + ''' + Check if the atime and the mtime + of self.filename is Epoch + ''' + stat = os.stat(self.filename) + return stat.st_atime == 0 and stat.st_mtime == 0 def remove_all(self): ''' @@ -64,6 +74,7 @@ class GenericParser(object): state = self._remove_all(self.editor) hachoir_core.field.writeIntoFile(self.editor, self.output) self.do_backup() + self.set_time(EPOCH) return state def _remove_all(self, fieldset): @@ -128,3 +139,19 @@ class GenericParser(object): if self.backup is False: mat.secure_remove(self.filename) os.rename(self.output, self.filename) + + def set_time(self, time): + ''' + Set the ctime of the file to $time + ''' + filename = '' + if self.backup is True: + filename = self.output + else: + filename = self.filename + + try: + os.utime(filename, (time, time)) + except: + print "Unable to set %s's date to %s" % (filename, time) + sys.exit(1) -- cgit v1.3