SharedDirectoryMoveRequest (#1045)

This commit is contained in:
Isaiah Becker-Mayer 2022-07-28 16:24:54 -04:00 committed by GitHub
parent 056dd7cd8f
commit 467c8ebd7c
3 changed files with 83 additions and 40 deletions

View file

@ -135,6 +135,9 @@ export default class Client extends EventEmitterWebAuthnSender {
case MessageType.SHARED_DIRECTORY_WRITE_REQUEST:
this.handleSharedDirectoryWriteRequest(buffer);
break;
case MessageType.SHARED_DIRECTORY_MOVE_REQUEST:
this.handleSharedDirectoryMoveRequest(buffer);
break;
case MessageType.SHARED_DIRECTORY_LIST_REQUEST:
this.handleSharedDirectoryListRequest(buffer);
break;
@ -301,6 +304,14 @@ export default class Client extends EventEmitterWebAuthnSender {
}
}
handleSharedDirectoryMoveRequest(buffer: ArrayBuffer) {
const req = this.codec.decodeSharedDirectoryMoveRequest(buffer);
// TODO(isaiah): delete debug logs
this.logger.debug('Received SharedDirectoryMoveRequest:');
this.logger.debug(req);
// TODO(isaiah): here's where we'll respond with a SharedDirectoryMoveResponse
}
async handleSharedDirectoryListRequest(buffer: ArrayBuffer) {
try {
const req = this.codec.decodeSharedDirectoryListRequest(buffer);
@ -388,13 +399,19 @@ export default class Client extends EventEmitterWebAuthnSender {
}
sendSharedDirectoryAnnounce() {
let name: string;
try {
name = this.sdManager.getName();
} catch (e) {
this.handleError(e);
}
this.send(
this.codec.encodeSharedDirectoryAnnounce({
completionId: 0, // This is always the first request.
// Hardcode directoryId for now since we only support sharing 1 directory.
// We're using 2 because the smartcard device is hardcoded to 1 in the backend.
directoryId: 2,
name: this.sdManager.getName(),
name,
})
);
}

View file

@ -45,6 +45,7 @@ export enum MessageType {
SHARED_DIRECTORY_READ_RESPONSE = 20,
SHARED_DIRECTORY_WRITE_REQUEST = 21,
SHARED_DIRECTORY_WRITE_RESPONSE = 22,
SHARED_DIRECTORY_MOVE_REQUEST = 23,
SHARED_DIRECTORY_LIST_REQUEST = 25,
SHARED_DIRECTORY_LIST_RESPONSE = 26,
__LAST, // utility value
@ -157,6 +158,16 @@ export type SharedDirectoryWriteResponse = {
bytesWritten: number;
};
// | message type (23) | completion_id uint32 | directory_id uint32 | original_path_length uint32 | original_path []byte | new_path_length uint32 | new_path []byte |
export type SharedDirectoryMoveRequest = {
completionId: number;
directoryId: number;
originalPathLength: number;
originalPath: string;
newPathLength: number;
newPath: string;
};
// | message type (25) | completion_id uint32 | directory_id uint32 | path_length uint32 | path []byte |
export type SharedDirectoryListRequest = {
completionId: number;
@ -677,7 +688,7 @@ export default class Codec {
// decodeMfaChallenge decodes a raw tdp MFA challenge message and returns it as a string (of a json).
// | message type (10) | mfa_type byte | message_length uint32 | json []byte
decodeMfaJson(buffer: ArrayBuffer): MfaJson {
let dv = new DataView(buffer);
const dv = new DataView(buffer);
let offset = 0;
offset += byteLength; // eat message type
const mfaType = String.fromCharCode(dv.getUint8(offset));
@ -771,19 +782,19 @@ export default class Codec {
const dv = new DataView(buffer);
let bufOffset = 0;
bufOffset += byteLength; // eat message type
let completionId = dv.getUint32(bufOffset);
const completionId = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat completion_id
let directoryId = dv.getUint32(bufOffset);
const directoryId = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat directory_id
let pathLength = dv.getUint32(bufOffset);
const pathLength = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat path_length
let path = this.decoder.decode(
const path = this.decoder.decode(
new Uint8Array(buffer.slice(bufOffset, bufOffset + pathLength))
);
bufOffset += pathLength; // eat path
let offset = dv.getBigUint64(bufOffset);
const offset = dv.getBigUint64(bufOffset);
bufOffset += uint64Length; // eat offset
let length = dv.getUint32(bufOffset);
const length = dv.getUint32(bufOffset);
return {
completionId,
@ -799,24 +810,23 @@ export default class Codec {
decodeSharedDirectoryWriteRequest(
buffer: ArrayBuffer
): SharedDirectoryWriteRequest {
let dv = new DataView(buffer);
let bufOffset = byteLength;
let completionId = dv.getUint32(bufOffset);
bufOffset += uint32Length;
let directoryId = dv.getUint32(bufOffset);
bufOffset += uint32Length;
let offset = dv.getBigUint64(bufOffset);
bufOffset += uint64Length;
let pathLength = dv.getUint32(bufOffset);
bufOffset += uint32Length;
let path = this.decoder.decode(
const dv = new DataView(buffer);
let bufOffset = byteLength; // eat message type
const completionId = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat completion_id
const directoryId = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat directory_id
const offset = dv.getBigUint64(bufOffset);
bufOffset += uint64Length; // eat offset
const pathLength = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat path_length
const path = this.decoder.decode(
new Uint8Array(buffer.slice(bufOffset, bufOffset + pathLength))
);
bufOffset += pathLength;
let writeDataLength = dv.getUint32(bufOffset);
bufOffset += uint32Length;
let writeData = new Uint8Array(
bufOffset += pathLength; // eat path
const writeDataLength = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat write_data_length
const writeData = new Uint8Array(
buffer.slice(bufOffset, bufOffset + writeDataLength)
);
@ -830,6 +840,38 @@ export default class Codec {
};
}
// | message type (23) | completion_id uint32 | directory_id uint32 | original_path_length uint32 | original_path []byte | new_path_length uint32 | new_path []byte |
decodeSharedDirectoryMoveRequest(
buffer: ArrayBuffer
): SharedDirectoryMoveRequest {
const dv = new DataView(buffer);
let bufOffset = byteLength; // eat message type
const completionId = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat completion_id
const directoryId = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat directory_id
const originalPathLength = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat original_path_length
const originalPath = this.decoder.decode(
new Uint8Array(buffer.slice(bufOffset, bufOffset + originalPathLength))
);
bufOffset += originalPathLength; // eat original_path
const newPathLength = dv.getUint32(bufOffset);
bufOffset += uint32Length; // eat new_path_length
const newPath = this.decoder.decode(
new Uint8Array(buffer.slice(bufOffset, bufOffset + newPathLength))
);
return {
completionId,
directoryId,
originalPathLength,
originalPath,
newPathLength,
newPath,
};
}
// | message type (25) | completion_id uint32 | directory_id uint32 | path_length uint32 | path []byte |
decodeSharedDirectoryListRequest(
buffer: ArrayBuffer

View file

@ -10412,22 +10412,6 @@ 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"