diff --git a/packages/teleport/src/lib/tdp/client.ts b/packages/teleport/src/lib/tdp/client.ts index 8a6d5b093..754c2cc19 100644 --- a/packages/teleport/src/lib/tdp/client.ts +++ b/packages/teleport/src/lib/tdp/client.ts @@ -127,6 +127,9 @@ export default class Client extends EventEmitterWebAuthnSender { case MessageType.SHARED_DIRECTORY_INFO_REQUEST: this.handleSharedDirectoryInfoRequest(buffer); break; + case MessageType.SHARED_DIRECTORY_READ_REQUEST: + this.handleSharedDirectoryReadRequest(buffer); + break; case MessageType.SHARED_DIRECTORY_LIST_REQUEST: this.handleSharedDirectoryListRequest(buffer); break; @@ -250,6 +253,14 @@ export default class Client extends EventEmitterWebAuthnSender { } } + handleSharedDirectoryReadRequest(buffer: ArrayBuffer) { + const req = this.codec.decodeSharedDirectoryReadRequest(buffer); + // TODO(isaiah): delete debug logs + this.logger.debug('Received SharedDirectoryReadRequest:'); + this.logger.debug(req); + // TODO(isaiah): here's where we'll handle the SharedDirectoryReadResponse. + } + async handleSharedDirectoryListRequest(buffer: ArrayBuffer) { try { const req = this.codec.decodeSharedDirectoryListRequest(buffer); diff --git a/packages/teleport/src/lib/tdp/codec.ts b/packages/teleport/src/lib/tdp/codec.ts index 5c72d1576..3f1258043 100644 --- a/packages/teleport/src/lib/tdp/codec.ts +++ b/packages/teleport/src/lib/tdp/codec.ts @@ -41,6 +41,7 @@ export enum MessageType { SHARED_DIRECTORY_ACKNOWLEDGE = 12, SHARED_DIRECTORY_INFO_REQUEST = 13, SHARED_DIRECTORY_INFO_RESPONSE = 14, + SHARED_DIRECTORY_READ_REQUEST = 19, SHARED_DIRECTORY_LIST_REQUEST = 25, SHARED_DIRECTORY_LIST_RESPONSE = 26, __LAST, // utility value @@ -118,6 +119,16 @@ export type SharedDirectoryInfoResponse = { fso: FileSystemObject; }; +// | message type (19) | completion_id uint32 | directory_id uint32 | path_length uint32 | path []byte | offset uint64 | length uint32 | +export type SharedDirectoryReadRequest = { + completionId: number; + directoryId: number; + path: string; + pathLength: number; + offset: bigint; + length: number; +}; + // | message type (25) | completion_id uint32 | directory_id uint32 | path_length uint32 | path []byte | export type SharedDirectoryListRequest = { completionId: number; @@ -682,6 +693,37 @@ export default class Codec { }; } + // | message type (19) | completion_id uint32 | directory_id uint32 | path_length uint32 | path []byte | offset uint64 | length uint32 | + decodeSharedDirectoryReadRequest( + buffer: ArrayBuffer + ): SharedDirectoryReadRequest { + const dv = new DataView(buffer); + let bufOffset = 0; + bufOffset += byteLength; // eat message type + let completionId = dv.getUint32(bufOffset); + bufOffset += uint32Length; // eat completion_id + let directoryId = dv.getUint32(bufOffset); + bufOffset += uint32Length; // eat directory_id + let pathLength = dv.getUint32(bufOffset); + bufOffset += uint32Length; // eat path_length + let path = this.decoder.decode( + new Uint8Array(buffer.slice(bufOffset, bufOffset + pathLength)) + ); + bufOffset += pathLength; // eat path + let offset = dv.getBigUint64(bufOffset); + bufOffset += uint64Length; // eat offset + let length = dv.getUint32(bufOffset); + + return { + completionId, + directoryId, + pathLength, + path, + offset, + length, + }; + } + // | message type (25) | completion_id uint32 | directory_id uint32 | path_length uint32 | path []byte | decodeSharedDirectoryListRequest( buffer: ArrayBuffer diff --git a/yarn.lock b/yarn.lock index 0d5599b7f..441f43f63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10428,6 +10428,22 @@ node-gyp@8.4.1: tar "^6.1.2" which "^2.0.2" +node-gyp@8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"