Imported Upstream version 20151008+dfsg
Hilko Bengen
8 years ago
0 | python-dfvfs (20150915-1) unstable; urgency=low | |
0 | python-dfvfs (20151008-1) unstable; urgency=low | |
1 | 1 | |
2 | 2 | * Auto-generated |
3 | 3 | |
4 | -- Log2Timeline <log2timeline-dev@googlegroups.com> Tue, 15 Sep 2015 07:27:31 +0200 | |
4 | -- Log2Timeline <log2timeline-dev@googlegroups.com> Thu, 08 Oct 2015 19:28:03 +0200 |
47 | 47 | """Comparable representation of the path specification.""" |
48 | 48 | string_parts = [] |
49 | 49 | |
50 | if self.data_stream is not None: | |
50 | if self.data_stream: | |
51 | 51 | string_parts.append(u'data stream: {0:s}'.format(self.data_stream)) |
52 | 52 | if self.location is not None: |
53 | 53 | string_parts.append(u'location: {0:s}'.format(self.location)) |
42 | 42 | """Comparable representation of the path specification.""" |
43 | 43 | string_parts = [] |
44 | 44 | |
45 | if self.data_stream is not None: | |
45 | if self.data_stream: | |
46 | 46 | string_parts.append(u'data stream: {0:s}'.format(self.data_stream)) |
47 | 47 | if self.inode is not None: |
48 | 48 | string_parts.append(u'inode: {0:d}'.format(self.inode)) |
25 | 25 | class DataStream(object): |
26 | 26 | """Class that implements the VFS data stream interface.""" |
27 | 27 | |
28 | def __init__(self, file_entry_object): | |
29 | """Initializes the data stream object. | |
30 | ||
31 | Args: | |
32 | file_entry_object: the file entry object (instance of FileEntry). | |
33 | """ | |
34 | super(DataStream, self).__init__() | |
35 | self._file_entry = file_entry_object | |
28 | # The data stream object should not have a reference to its | |
29 | # file entry since that will create a cyclic reference. | |
36 | 30 | |
37 | 31 | @property |
38 | 32 | def name(self): |
39 | 33 | """The name.""" |
40 | 34 | return u'' |
41 | ||
42 | def GetFileObject(self): | |
43 | """Retrieves the file-like object (instance of file_io.FileIO) or None.""" | |
44 | return self._file_entry.GetFileObject() | |
45 | 35 | |
46 | 36 | |
47 | 37 | class Directory(object): |
141 | 131 | # It is assumed that directory and link file entries typically |
142 | 132 | # do not have data streams. |
143 | 133 | if not self._directory and not self.link: |
144 | self._data_streams.append(DataStream(self)) | |
134 | self._data_streams.append(DataStream()) | |
145 | 135 | |
146 | 136 | return self._data_streams |
147 | 137 |
144 | 144 | class NTFSDataStream(file_entry.DataStream): |
145 | 145 | """Class that implements a data stream object using pyfsntfs.""" |
146 | 146 | |
147 | def __init__(self, file_entry_object, fsntfs_data_stream): | |
147 | def __init__(self, fsntfs_data_stream): | |
148 | 148 | """Initializes the data stream object. |
149 | 149 | |
150 | 150 | Args: |
151 | file_entry_object: the file entry object (instance of NFTSFileEntry). | |
152 | 151 | fsntfs_data_stream: the NTFS data stream object (instance of |
153 | 152 | pyfsntfs.data_stream). |
154 | 153 | """ |
155 | super(NTFSDataStream, self).__init__(file_entry_object) | |
154 | super(NTFSDataStream, self).__init__() | |
156 | 155 | self._fsntfs_data_stream = fsntfs_data_stream |
157 | 156 | |
158 | 157 | @property |
161 | 160 | if self._fsntfs_data_stream: |
162 | 161 | return self._fsntfs_data_stream.name |
163 | 162 | return u'' |
164 | ||
165 | def GetFileObject(self): | |
166 | """Retrieves the file-like object. | |
167 | ||
168 | Returns: | |
169 | A file-like object (instance of FileIO) or None. | |
170 | """ | |
171 | if self._fsntfs_data_stream: | |
172 | return self._file_entry.GetFileObject( | |
173 | data_stream_name=self._fsntfs_data_stream.name) | |
174 | return self._file_entry.GetFileObject() | |
175 | 163 | |
176 | 164 | |
177 | 165 | class NTFSDirectory(file_entry.Directory): |
295 | 283 | |
296 | 284 | self._data_streams = [] |
297 | 285 | if fsntfs_file_entry.has_default_data_stream(): |
298 | self._data_streams.append(NTFSDataStream(self, None)) | |
286 | self._data_streams.append(NTFSDataStream(None)) | |
299 | 287 | |
300 | 288 | for fsntfs_data_stream in fsntfs_file_entry.alternate_data_streams: |
301 | self._data_streams.append( | |
302 | NTFSDataStream(self, fsntfs_data_stream)) | |
289 | self._data_streams.append(NTFSDataStream(fsntfs_data_stream)) | |
303 | 290 | |
304 | 291 | return self._data_streams |
305 | 292 |
33 | 33 | class TSKDataStream(file_entry.DataStream): |
34 | 34 | """Class that implements a data stream object using pytks3.""" |
35 | 35 | |
36 | def __init__(self, file_entry_object, tsk_attribute): | |
36 | def __init__(self, tsk_attribute): | |
37 | 37 | """Initializes the data stream object. |
38 | 38 | |
39 | 39 | Args: |
40 | file_entry_object: the file entry object (instance of NFTSFileEntry). | |
41 | 40 | tsk_attribute: the TSK attribute object (instance of pytsk3.Attribute). |
42 | 41 | """ |
43 | super(TSKDataStream, self).__init__(file_entry_object) | |
42 | super(TSKDataStream, self).__init__() | |
44 | 43 | self._tsk_attribute = tsk_attribute |
45 | 44 | |
46 | 45 | @property |
51 | 50 | # data stream. |
52 | 51 | return self._tsk_attribute.info.name or u'' |
53 | 52 | return u'' |
54 | ||
55 | def GetFileObject(self): | |
56 | """Retrieves the file-like object. | |
57 | ||
58 | Returns: | |
59 | A file-like object (instance of FileIO) or None. | |
60 | ||
61 | Raises: | |
62 | BackEndError: if the data stream name cannot be decoded properly. | |
63 | """ | |
64 | if self._tsk_attribute: | |
65 | # The value of the attribute name will be None for the default | |
66 | # data stream. In dfvfs we use an empty string for the default | |
67 | # data stream. | |
68 | data_stream_name = self._tsk_attribute.info.name or u'' | |
69 | try: | |
70 | data_stream_name = data_stream_name.decode(u'utf8') | |
71 | except UnicodeError: | |
72 | raise errors.BackEndError(u'Unable to decode data stream name.') | |
73 | ||
74 | return self._file_entry.GetFileObject(data_stream_name=data_stream_name) | |
75 | return self._file_entry.GetFileObject() | |
76 | 53 | |
77 | 54 | |
78 | 55 | class TSKDirectory(file_entry.Directory): |
261 | 238 | tsk_fs_meta_type = getattr( |
262 | 239 | tsk_file.info.meta, u'type', pytsk3.TSK_FS_META_TYPE_UNDEF) |
263 | 240 | if tsk_fs_meta_type == pytsk3.TSK_FS_META_TYPE_REG: |
264 | self._data_streams.append(TSKDataStream(self, None)) | |
241 | self._data_streams.append(TSKDataStream(None)) | |
265 | 242 | |
266 | 243 | else: |
267 | 244 | for tsk_attribute in tsk_file: |
270 | 247 | |
271 | 248 | attribute_type = getattr(tsk_attribute.info, u'type', None) |
272 | 249 | if attribute_type in known_data_attribute_types: |
273 | self._data_streams.append(TSKDataStream(self, tsk_attribute)) | |
250 | self._data_streams.append(TSKDataStream(tsk_attribute)) | |
274 | 251 | |
275 | 252 | return self._data_streams |
276 | 253 | |
476 | 453 | """ |
477 | 454 | data_stream_names = [ |
478 | 455 | data_stream.name for data_stream in self._GetDataStreams()] |
479 | if data_stream_name not in data_stream_names: | |
456 | if data_stream_name and data_stream_name not in data_stream_names: | |
480 | 457 | return |
481 | 458 | |
482 | 459 | path_spec = copy.deepcopy(self.path_spec) |
118 | 118 | self.assertNotEqual(data_stream, None) |
119 | 119 | self.assertEqual(data_stream.name, data_stream_name) |
120 | 120 | |
121 | file_object = data_stream.GetFileObject() | |
122 | self.assertNotEqual(file_object, None) | |
123 | file_object.close() | |
124 | ||
125 | 121 | data_stream = file_entry.GetDataStream(u'bogus') |
126 | 122 | self.assertEqual(data_stream, None) |
127 | 123 |
127 | 127 | self.assertNotEqual(data_stream, None) |
128 | 128 | self.assertEqual(data_stream.name, data_stream_name) |
129 | 129 | |
130 | file_object = data_stream.GetFileObject() | |
131 | self.assertNotEqual(file_object, None) | |
132 | file_object.close() | |
133 | ||
134 | 130 | data_stream = file_entry.GetDataStream(u'bogus') |
135 | 131 | self.assertEqual(data_stream, None) |
136 | 132 |
235 | 235 | self.assertNotEqual(data_stream, None) |
236 | 236 | self.assertEqual(data_stream.name, data_stream_name) |
237 | 237 | |
238 | file_object = data_stream.GetFileObject() | |
239 | self.assertNotEqual(file_object, None) | |
240 | file_object.close() | |
241 | ||
242 | 238 | data_stream = file_entry.GetDataStream(u'bogus') |
243 | 239 | self.assertEqual(data_stream, None) |
244 | 240 |
117 | 117 | self.assertNotEqual(data_stream, None) |
118 | 118 | self.assertEqual(data_stream.name, data_stream_name) |
119 | 119 | |
120 | file_object = data_stream.GetFileObject() | |
121 | self.assertNotEqual(file_object, None) | |
122 | file_object.close() | |
123 | ||
124 | 120 | data_stream = file_entry.GetDataStream(u'bogus') |
125 | 121 | self.assertEqual(data_stream, None) |
126 | 122 |
275 | 275 | self.assertNotEqual(data_stream, None) |
276 | 276 | self.assertEqual(data_stream.name, data_stream_name) |
277 | 277 | |
278 | file_object = data_stream.GetFileObject() | |
279 | self.assertNotEqual(file_object, None) | |
280 | file_object.close() | |
281 | ||
282 | 278 | data_stream = file_entry.GetDataStream(u'bogus') |
283 | 279 | self.assertEqual(data_stream, None) |
284 | 280 | |
293 | 289 | self.assertNotEqual(data_stream, None) |
294 | 290 | self.assertEqual(data_stream.name, data_stream_name) |
295 | 291 | |
296 | file_object = data_stream.GetFileObject() | |
297 | self.assertNotEqual(file_object, None) | |
298 | file_object.close() | |
299 | ||
300 | 292 | |
301 | 293 | if __name__ == '__main__': |
302 | 294 | unittest.main() |
157 | 157 | self.assertNotEqual(data_stream, None) |
158 | 158 | self.assertEqual(data_stream.name, data_stream_name) |
159 | 159 | |
160 | file_object = data_stream.GetFileObject() | |
161 | self.assertNotEqual(file_object, None) | |
162 | file_object.close() | |
163 | ||
164 | 160 | data_stream = file_entry.GetDataStream(u'bogus') |
165 | 161 | self.assertEqual(data_stream, None) |
166 | 162 |
157 | 157 | self.assertNotEqual(data_stream, None) |
158 | 158 | self.assertEqual(data_stream.name, data_stream_name) |
159 | 159 | |
160 | file_object = data_stream.GetFileObject() | |
161 | self.assertNotEqual(file_object, None) | |
162 | file_object.close() | |
163 | ||
164 | 160 | data_stream = file_entry.GetDataStream(u'bogus') |
165 | 161 | self.assertEqual(data_stream, None) |
166 | 162 |
295 | 295 | self.assertNotEqual(data_stream, None) |
296 | 296 | self.assertEqual(data_stream.name, data_stream_name) |
297 | 297 | |
298 | file_object = data_stream.GetFileObject() | |
299 | self.assertNotEqual(file_object, None) | |
300 | file_object.close() | |
301 | ||
302 | 298 | data_stream = file_entry.GetDataStream(u'bogus') |
303 | 299 | self.assertEqual(data_stream, None) |
304 | 300 | |
313 | 309 | self.assertNotEqual(data_stream, None) |
314 | 310 | self.assertEqual(data_stream.name, data_stream_name) |
315 | 311 | |
316 | file_object = data_stream.GetFileObject() | |
317 | self.assertNotEqual(file_object, None) | |
318 | file_object.close() | |
319 | ||
320 | 312 | |
321 | 313 | if __name__ == '__main__': |
322 | 314 | unittest.main() |
171 | 171 | self.assertNotEqual(data_stream, None) |
172 | 172 | self.assertEqual(data_stream.name, data_stream_name) |
173 | 173 | |
174 | file_object = data_stream.GetFileObject() | |
175 | self.assertNotEqual(file_object, None) | |
176 | file_object.close() | |
177 | ||
178 | 174 | data_stream = file_entry.GetDataStream(u'bogus') |
179 | 175 | self.assertEqual(data_stream, None) |
180 | 176 |
179 | 179 | self.assertNotEqual(data_stream, None) |
180 | 180 | self.assertEqual(data_stream.name, data_stream_name) |
181 | 181 | |
182 | file_object = data_stream.GetFileObject() | |
183 | self.assertNotEqual(file_object, None) | |
184 | file_object.close() | |
185 | ||
186 | 182 | data_stream = file_entry.GetDataStream(u'bogus') |
187 | 183 | self.assertEqual(data_stream, None) |
188 | 184 |
155 | 155 | self.assertNotEqual(data_stream, None) |
156 | 156 | self.assertEqual(data_stream.name, data_stream_name) |
157 | 157 | |
158 | file_object = data_stream.GetFileObject() | |
159 | self.assertNotEqual(file_object, None) | |
160 | file_object.close() | |
161 | ||
162 | 158 | data_stream = file_entry.GetDataStream(u'bogus') |
163 | 159 | self.assertEqual(data_stream, None) |
164 | 160 |