summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MAT/archive.py12
-rw-r--r--MAT/exiftool.py4
-rw-r--r--MAT/mat.py7
-rw-r--r--MAT/misc.py4
-rw-r--r--MAT/mutagenstripper.py4
-rw-r--r--MAT/office.py8
-rw-r--r--MAT/parser.py3
-rwxr-xr-xmat3
-rwxr-xr-xmat-gui4
-rw-r--r--test/clitest.py2
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',
diff --git a/MAT/mat.py b/MAT/mat.py
index c692a6a..ffe97ea 100644
--- a/MAT/mat.py
+++ b/MAT/mat.py
@@ -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
5class MutagenStripper(parser.GenericParser): 5class 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)
diff --git a/mat b/mat
index 60c6e5d..a22e3c5 100755
--- a/mat
+++ b/mat
@@ -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)
diff --git a/mat-gui b/mat-gui
index 4371521..3ff9670 100755
--- a/mat-gui
+++ b/mat-gui
@@ -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'''