diff options
| -rw-r--r-- | MAT/archive.py | 12 | ||||
| -rw-r--r-- | MAT/exiftool.py | 4 | ||||
| -rw-r--r-- | MAT/mat.py | 7 | ||||
| -rw-r--r-- | MAT/misc.py | 4 | ||||
| -rw-r--r-- | MAT/mutagenstripper.py | 4 | ||||
| -rw-r--r-- | MAT/office.py | 8 | ||||
| -rw-r--r-- | MAT/parser.py | 3 | ||||
| -rwxr-xr-x | mat | 3 | ||||
| -rwxr-xr-x | mat-gui | 4 | ||||
| -rw-r--r-- | test/clitest.py | 2 |
10 files changed, 27 insertions, 24 deletions
diff --git a/MAT/archive.py b/MAT/archive.py index f7b5783..447f068 100644 --- a/MAT/archive.py +++ b/MAT/archive.py | |||
| @@ -17,8 +17,8 @@ class GenericArchiveStripper(parser.GenericParser): | |||
| 17 | ''' | 17 | ''' |
| 18 | Represent a generic archive | 18 | Represent a generic archive |
| 19 | ''' | 19 | ''' |
| 20 | def __init__(self, filename, parser, mime, backup, **kwargs): | 20 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 21 | super(GenericArchiveStripper, self).__init__(filename, parser, mime, backup, **kwargs) | 21 | super(GenericArchiveStripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 22 | self.compression = '' | 22 | self.compression = '' |
| 23 | self.add2archive = kwargs['add2archive'] | 23 | self.add2archive = kwargs['add2archive'] |
| 24 | self.tempdir = tempfile.mkdtemp() | 24 | self.tempdir = tempfile.mkdtemp() |
| @@ -251,8 +251,8 @@ class GzipStripper(TarStripper): | |||
| 251 | ''' | 251 | ''' |
| 252 | Represent a tar.gz archive | 252 | Represent a tar.gz archive |
| 253 | ''' | 253 | ''' |
| 254 | def __init__(self, filename, parser, mime, backup, **kwargs): | 254 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 255 | super(GzipStripper, self).__init__(filename, parser, mime, backup, **kwargs) | 255 | super(GzipStripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 256 | self.compression = ':gz' | 256 | self.compression = ':gz' |
| 257 | 257 | ||
| 258 | 258 | ||
| @@ -260,6 +260,6 @@ class Bzip2Stripper(TarStripper): | |||
| 260 | ''' | 260 | ''' |
| 261 | Represents a tar.bz2 archive | 261 | Represents a tar.bz2 archive |
| 262 | ''' | 262 | ''' |
| 263 | def __init__(self, filename, parser, mime, backup, **kwargs): | 263 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 264 | super(Bzip2Stripper, self).__init__(filename, parser, mime, backup, **kwargs) | 264 | super(Bzip2Stripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 265 | self.compression = ':bz2' | 265 | self.compression = ':bz2' |
diff --git a/MAT/exiftool.py b/MAT/exiftool.py index 16e383f..9803aa9 100644 --- a/MAT/exiftool.py +++ b/MAT/exiftool.py | |||
| @@ -12,8 +12,8 @@ class ExiftoolStripper(parser.GenericParser): | |||
| 12 | A generic stripper class using exiftool as backend | 12 | A generic stripper class using exiftool as backend |
| 13 | ''' | 13 | ''' |
| 14 | 14 | ||
| 15 | def __init__(self, filename, parser, mime, backup, **kwargs): | 15 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 16 | super(ExiftoolStripper, self).__init__(filename, parser, mime, backup, **kwargs) | 16 | super(ExiftoolStripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 17 | self.allowed = set(['ExifTool Version Number', 'File Name', 'Directory', | 17 | self.allowed = set(['ExifTool Version Number', 'File Name', 'Directory', |
| 18 | 'File Size', 'File Modification Date/Time', 'File Access Date/Time', 'File Permissions', | 18 | 'File Size', 'File Modification Date/Time', 'File Access Date/Time', 'File Permissions', |
| 19 | 'File Type', 'MIME Type', 'Image Width', 'Image Height', | 19 | 'File Type', 'MIME Type', 'Image Width', 'Image Height', |
| @@ -140,10 +140,7 @@ def create_class_file(name, backup, **kwargs): | |||
| 140 | logging.error('%s is is not readable' % name) | 140 | logging.error('%s is is not readable' % name) |
| 141 | return None | 141 | return None |
| 142 | 142 | ||
| 143 | if not os.access(name, os.W_OK): | 143 | is_writable = os.access(name, os.W_OK) |
| 144 | #check write permission | ||
| 145 | logging.error('%s is not writable' % name) | ||
| 146 | return None | ||
| 147 | 144 | ||
| 148 | if not os.path.getsize(name): | 145 | if not os.path.getsize(name): |
| 149 | #check if the file is not empty (hachoir crash on empty files) | 146 | #check if the file is not empty (hachoir crash on empty files) |
| @@ -178,4 +175,4 @@ def create_class_file(name, backup, **kwargs): | |||
| 178 | logging.info('Don\'t have stripper for %s format' % mime) | 175 | logging.info('Don\'t have stripper for %s format' % mime) |
| 179 | return None | 176 | return None |
| 180 | 177 | ||
| 181 | return stripper_class(filename, parser, mime, backup, **kwargs) | 178 | return stripper_class(filename, parser, mime, backup, is_writable, **kwargs) |
diff --git a/MAT/misc.py b/MAT/misc.py index 4c104a8..e016d18 100644 --- a/MAT/misc.py +++ b/MAT/misc.py | |||
| @@ -12,8 +12,8 @@ class TorrentStripper(parser.GenericParser): | |||
| 12 | Represent a torrent file with the help | 12 | Represent a torrent file with the help |
| 13 | of the bencode lib from Petru Paler | 13 | of the bencode lib from Petru Paler |
| 14 | ''' | 14 | ''' |
| 15 | def __init__(self, filename, parser, mime, backup, **kwargs): | 15 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 16 | super(TorrentStripper, self).__init__(filename, parser, mime, backup) | 16 | super(TorrentStripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 17 | self.fields = ['comment', 'creation date', 'created by'] | 17 | self.fields = ['comment', 'creation date', 'created by'] |
| 18 | 18 | ||
| 19 | def is_clean(self): | 19 | def is_clean(self): |
diff --git a/MAT/mutagenstripper.py b/MAT/mutagenstripper.py index 9d82a30..ebc6b91 100644 --- a/MAT/mutagenstripper.py +++ b/MAT/mutagenstripper.py | |||
| @@ -3,8 +3,8 @@ import shutil | |||
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | class MutagenStripper(parser.GenericParser): | 5 | class MutagenStripper(parser.GenericParser): |
| 6 | def __init__(self, filename, parser, mime, backup, **kwargs): | 6 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 7 | super(MutagenStripper, self).__init__(filename, parser, mime, backup, **kwargs) | 7 | super(MutagenStripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 8 | self._create_mfile() | 8 | self._create_mfile() |
| 9 | 9 | ||
| 10 | def _create_mfile(self): | 10 | def _create_mfile(self): |
diff --git a/MAT/office.py b/MAT/office.py index 50a4282..c44a52b 100644 --- a/MAT/office.py +++ b/MAT/office.py | |||
| @@ -111,7 +111,7 @@ class OpenDocumentStripper(archive.GenericArchiveStripper): | |||
| 111 | zipin.getinfo('meta.xml') | 111 | zipin.getinfo('meta.xml') |
| 112 | except KeyError: # no meta.xml in the file | 112 | except KeyError: # no meta.xml in the file |
| 113 | czf = archive.ZipStripper(self.filename, self.parser, | 113 | czf = archive.ZipStripper(self.filename, self.parser, |
| 114 | 'application/zip', False, add2archive=self.add2archive) | 114 | 'application/zip', False, True, add2archive=self.add2archive) |
| 115 | if czf.is_clean(): | 115 | if czf.is_clean(): |
| 116 | zipin.close() | 116 | zipin.close() |
| 117 | return True | 117 | return True |
| @@ -123,8 +123,8 @@ class PdfStripper(parser.GenericParser): | |||
| 123 | ''' | 123 | ''' |
| 124 | Represent a PDF file | 124 | Represent a PDF file |
| 125 | ''' | 125 | ''' |
| 126 | def __init__(self, filename, parser, mime, backup, **kwargs): | 126 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 127 | super(PdfStripper, self).__init__(filename, parser, mime, backup, **kwargs) | 127 | super(PdfStripper, self).__init__(filename, parser, mime, backup, is_writable, **kwargs) |
| 128 | uri = 'file://' + os.path.abspath(self.filename) | 128 | uri = 'file://' + os.path.abspath(self.filename) |
| 129 | self.password = None | 129 | self.password = None |
| 130 | try: | 130 | try: |
| @@ -257,7 +257,7 @@ class OpenXmlStripper(archive.GenericArchiveStripper): | |||
| 257 | return False | 257 | return False |
| 258 | zipin.close() | 258 | zipin.close() |
| 259 | czf = archive.ZipStripper(self.filename, self.parser, | 259 | czf = archive.ZipStripper(self.filename, self.parser, |
| 260 | 'application/zip', False, add2archive=self.add2archive) | 260 | 'application/zip', False, True, add2archive=self.add2archive) |
| 261 | return czf.is_clean() | 261 | return czf.is_clean() |
| 262 | 262 | ||
| 263 | def get_meta(self): | 263 | def get_meta(self): |
diff --git a/MAT/parser.py b/MAT/parser.py index 949e24b..c57eb00 100644 --- a/MAT/parser.py +++ b/MAT/parser.py | |||
| @@ -25,11 +25,12 @@ class GenericParser(object): | |||
| 25 | ''' | 25 | ''' |
| 26 | Parent class of all parsers | 26 | Parent class of all parsers |
| 27 | ''' | 27 | ''' |
| 28 | def __init__(self, filename, parser, mime, backup, **kwargs): | 28 | def __init__(self, filename, parser, mime, backup, is_writable, **kwargs): |
| 29 | self.filename = '' | 29 | self.filename = '' |
| 30 | self.parser = parser | 30 | self.parser = parser |
| 31 | self.mime = mime | 31 | self.mime = mime |
| 32 | self.backup = backup | 32 | self.backup = backup |
| 33 | self.is_writable = is_writable | ||
| 33 | self.editor = hachoir_editor.createEditor(parser) | 34 | self.editor = hachoir_editor.createEditor(parser) |
| 34 | try: | 35 | try: |
| 35 | self.filename = hachoir_core.cmd_line.unicodeFilename(filename) | 36 | self.filename = hachoir_core.cmd_line.unicodeFilename(filename) |
| @@ -88,6 +88,9 @@ def clean_meta(class_file, filename, force): | |||
| 88 | ''' | 88 | ''' |
| 89 | Clean the file 'filename' | 89 | Clean the file 'filename' |
| 90 | ''' | 90 | ''' |
| 91 | if not class_file.is_writable: | ||
| 92 | print('[-] %s is not writable' % filename) | ||
| 93 | return | ||
| 91 | print('[+] Cleaning %s' % filename) | 94 | print('[+] Cleaning %s' % filename) |
| 92 | if not force and class_file.is_clean(): | 95 | if not force and class_file.is_clean(): |
| 93 | print('%s is already clean' % filename) | 96 | print('%s is already clean' % filename) |
| @@ -279,7 +279,9 @@ non-anonymised) file to output archive')) | |||
| 279 | ''' | 279 | ''' |
| 280 | cf = CFile(filename, add2archive=self.add2archive, | 280 | cf = CFile(filename, add2archive=self.add2archive, |
| 281 | low_pdf_quality=self.pdf_quality) | 281 | low_pdf_quality=self.pdf_quality) |
| 282 | if cf.file: # if the file is supported by the mat | 282 | # if the file is supported by the mat, |
| 283 | # and is writable (for usability's sake). | ||
| 284 | if cf.file and cf.file.is_writable: | ||
| 283 | self.liststore.append([cf, cf.file.basename, _('Unknown')]) | 285 | self.liststore.append([cf, cf.file.basename, _('Unknown')]) |
| 284 | return False | 286 | return False |
| 285 | return True | 287 | return True |
diff --git a/test/clitest.py b/test/clitest.py index 31e9015..1e552ba 100644 --- a/test/clitest.py +++ b/test/clitest.py | |||
| @@ -86,7 +86,7 @@ class TestFileAttributes(unittest.TestCase): | |||
| 86 | proc = subprocess.Popen(['../mat', 'not_writtable'], | 86 | proc = subprocess.Popen(['../mat', 'not_writtable'], |
| 87 | stdout=subprocess.PIPE) | 87 | stdout=subprocess.PIPE) |
| 88 | stdout, _ = proc.communicate() | 88 | stdout, _ = proc.communicate() |
| 89 | self.assertEqual(str(stdout).strip('\n'), 'Unable to process %s' % 'not_writtable') | 89 | self.assertEqual(str(stdout).strip('\n'), '[-] %s is not writable' % 'not_writtable') |
| 90 | 90 | ||
| 91 | def test_not_exist(self): | 91 | def test_not_exist(self): |
| 92 | ''' test MAT's behaviour on non-existent file''' | 92 | ''' test MAT's behaviour on non-existent file''' |
