(self, service_name, path, file_obj, callback, errback, starting_offset, max_length, timeout = 30, show_progress = False, tqdm_kwargs = { })
| 2449 | return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0, -1, timeout, show_progress, tqdm_kwargs) |
| 2450 | |
| 2451 | def _retrieveFileFromOffset_SMB1(self, service_name, path, file_obj, callback, errback, starting_offset, max_length, timeout = 30, show_progress = False, tqdm_kwargs = { }): |
| 2452 | if not self.has_authenticated: |
| 2453 | raise NotReadyError('SMB connection not authenticated') |
| 2454 | |
| 2455 | path = path.replace('/', '\\') |
| 2456 | messages_history = [ ] |
| 2457 | |
| 2458 | def sendOpen(tid): |
| 2459 | m = SMBMessage(ComOpenAndxRequest(filename = path, |
| 2460 | access_mode = 0x0040, # Sharing mode: Deny nothing to others |
| 2461 | open_mode = 0x0001, # Failed if file does not exist |
| 2462 | search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM, |
| 2463 | timeout = timeout * 1000)) |
| 2464 | m.tid = tid |
| 2465 | self._sendSMBMessage(m) |
| 2466 | self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, openCB, errback) |
| 2467 | self._pushToArray(messages_history, m) |
| 2468 | |
| 2469 | def openCB(open_message, **kwargs): |
| 2470 | self._pushToArray(messages_history, open_message) |
| 2471 | if not open_message.status.hasError: |
| 2472 | if max_length == 0: |
| 2473 | closeFid(open_message.tid, open_message.payload.fid) |
| 2474 | callback(( file_obj, open_message.payload.file_attributes, 0 )) |
| 2475 | else: |
| 2476 | if show_progress and max_length > 0: |
| 2477 | tqdm_kwargs.setdefault("total", max_length) |
| 2478 | tqdm_kwargs.setdefault("unit", "B") |
| 2479 | tqdm_kwargs.setdefault("unit_scale", True) |
| 2480 | tqdm_kwargs.setdefault("unit_divisor", 1024) |
| 2481 | tqdm_kwargs.setdefault("desc", f"Downloading {path}") |
| 2482 | self.pbar = tqdm(**tqdm_kwargs) |
| 2483 | sendRead(open_message.tid, open_message.payload.fid, starting_offset, open_message.payload.file_attributes, 0, max_length) |
| 2484 | else: |
| 2485 | errback(OperationFailure('Failed to retrieve %s on %s: Unable to open file' % ( path, service_name ), messages_history)) |
| 2486 | |
| 2487 | def sendRead(tid, fid, offset, file_attributes, read_len, remaining_len): |
| 2488 | read_count = self.max_raw_size - 2 |
| 2489 | m = SMBMessage(ComReadAndxRequest(fid = fid, |
| 2490 | offset = offset, |
| 2491 | max_return_bytes_count = read_count, |
| 2492 | min_return_bytes_count = min(0xFFFF, read_count))) |
| 2493 | m.tid = tid |
| 2494 | self._sendSMBMessage(m) |
| 2495 | self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback, fid = fid, offset = offset, file_attributes = file_attributes, |
| 2496 | read_len = read_len, remaining_len = remaining_len) |
| 2497 | |
| 2498 | def readCB(read_message, **kwargs): |
| 2499 | # To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history. |
| 2500 | if not read_message.status.hasError: |
| 2501 | read_len = kwargs['read_len'] |
| 2502 | remaining_len = kwargs['remaining_len'] |
| 2503 | data_len = read_message.payload.data_length |
| 2504 | if max_length > 0: |
| 2505 | if data_len > remaining_len: |
| 2506 | file_obj.write(read_message.payload.data[:remaining_len]) |
| 2507 | read_len += remaining_len |
| 2508 | remaining_len = 0 |
nothing calls this directly
no test coverage detected