(connId, smbServer, SMBCommand, recvPacket)
| 2398 | |
| 2399 | @staticmethod |
| 2400 | def smbComTreeConnectAndX(connId, smbServer, SMBCommand, recvPacket): |
| 2401 | connData = smbServer.getConnectionData(connId) |
| 2402 | |
| 2403 | resp = smb.NewSMBPacket() |
| 2404 | resp['Flags1'] = smb.SMB.FLAGS1_REPLY |
| 2405 | resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES | \ |
| 2406 | recvPacket['Flags2'] & smb.SMB.FLAGS2_UNICODE |
| 2407 | |
| 2408 | resp['Tid'] = recvPacket['Tid'] |
| 2409 | resp['Mid'] = recvPacket['Mid'] |
| 2410 | resp['Pid'] = connData['Pid'] |
| 2411 | |
| 2412 | respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_TREE_CONNECT_ANDX) |
| 2413 | respParameters = smb.SMBTreeConnectAndXResponse_Parameters() |
| 2414 | respData = smb.SMBTreeConnectAndXResponse_Data() |
| 2415 | |
| 2416 | treeConnectAndXParameters = smb.SMBTreeConnectAndX_Parameters(SMBCommand['Parameters']) |
| 2417 | |
| 2418 | if treeConnectAndXParameters['Flags'] & 0x8: |
| 2419 | respParameters = smb.SMBTreeConnectAndXExtendedResponse_Parameters() |
| 2420 | |
| 2421 | treeConnectAndXData = smb.SMBTreeConnectAndX_Data(flags=recvPacket['Flags2']) |
| 2422 | treeConnectAndXData['_PasswordLength'] = treeConnectAndXParameters['PasswordLength'] |
| 2423 | treeConnectAndXData.fromString(SMBCommand['Data']) |
| 2424 | |
| 2425 | errorCode = STATUS_SUCCESS |
| 2426 | |
| 2427 | ## Process here the request, does the share exist? |
| 2428 | UNCOrShare = decodeSMBString(recvPacket['Flags2'], treeConnectAndXData['Path']) |
| 2429 | |
| 2430 | # Is this a UNC? |
| 2431 | if ntpath.ismount(UNCOrShare): |
| 2432 | path = UNCOrShare.split('\\')[3] |
| 2433 | else: |
| 2434 | path = ntpath.basename(UNCOrShare) |
| 2435 | |
| 2436 | share = searchShare(connId, path, smbServer) |
| 2437 | if share is not None: |
| 2438 | # Simple way to generate a Tid |
| 2439 | if len(connData['ConnectedShares']) == 0: |
| 2440 | tid = 1 |
| 2441 | else: |
| 2442 | tid = list(connData['ConnectedShares'].keys())[-1] + 1 |
| 2443 | connData['ConnectedShares'][tid] = share |
| 2444 | connData['ConnectedShares'][tid]['shareName'] = path |
| 2445 | resp['Tid'] = tid |
| 2446 | # smbServer.log("Connecting Share(%d:%s)" % (tid,path), connData=connData) |
| 2447 | else: |
| 2448 | smbServer.log("TreeConnectAndX not found %s" % path, logging.ERROR, connData=connData) |
| 2449 | errorCode = STATUS_OBJECT_PATH_NOT_FOUND |
| 2450 | resp['ErrorCode'] = errorCode >> 16 |
| 2451 | resp['ErrorClass'] = errorCode & 0xff |
| 2452 | ## |
| 2453 | respParameters['OptionalSupport'] = smb.SMB.SMB_SUPPORT_SEARCH_BITS |
| 2454 | |
| 2455 | if path == 'IPC$': |
| 2456 | respData['Service'] = 'IPC' |
| 2457 | else: |
nothing calls this directly
no test coverage detected