MCPcopy Create free account
hub / github.com/PierreGode/Ragnar / _retrieveFileFromOffset_SMB1

Method _retrieveFileFromOffset_SMB1

pager_lib/smb/base.py:2451–2556  ·  view source on GitHub ↗
(self, service_name, path, file_obj, callback, errback, starting_offset, max_length, timeout = 30, show_progress = False, tqdm_kwargs = { })

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 5

_pushToArrayMethod · 0.95
NotReadyErrorClass · 0.85
SMBMessageClass · 0.85
_PendingRequestClass · 0.85

Tested by

no test coverage detected