@mongodb-js/signing-utils 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"local-signing-client.d.ts","sourceRoot":"","sources":["../../src/signing-clients/local-signing-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,GAAG,CAAC;AAU7D,qBAAa,kBAAmB,YAAW,aAAa;IAEpD,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;IAGjE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAyBlC"}
1
+ {"version":3,"file":"local-signing-client.d.ts","sourceRoot":"","sources":["../../src/signing-clients/local-signing-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,GAAG,CAAC;AAU7D,qBAAa,kBAAmB,YAAW,aAAa;IAEpD,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;IAM3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqCxC"}
@@ -12,7 +12,7 @@ class LocalSigningClient {
12
12
  constructor(options) {
13
13
  this.options = options;
14
14
  }
15
- sign(file) {
15
+ async sign(file) {
16
16
  localClientDebug(`Signing ${file}`);
17
17
  const directoryOfFileToSign = path_1.default.dirname(file);
18
18
  try {
@@ -20,13 +20,19 @@ class LocalSigningClient {
20
20
  ...(0, utils_1.getEnv)(),
21
21
  method: this.options.signingMethod,
22
22
  };
23
- (0, child_process_1.spawnSync)('bash', [this.options.signingScript, path_1.default.basename(file)], {
23
+ const { stdout, stderr, status } = (0, child_process_1.spawnSync)('bash', [this.options.signingScript, path_1.default.basename(file)], {
24
24
  cwd: directoryOfFileToSign,
25
25
  env,
26
26
  encoding: 'utf-8',
27
27
  });
28
+ localClientDebug({ stdout, stderr });
29
+ if (status !== 0) {
30
+ throw new Error(JSON.stringify({
31
+ stdout,
32
+ stderr,
33
+ }));
34
+ }
28
35
  localClientDebug(`Signed file ${file}`);
29
- return Promise.resolve();
30
36
  }
31
37
  catch (error) {
32
38
  localClientDebug({ error });
@@ -1 +1 @@
1
- {"version":3,"file":"local-signing-client.js","sourceRoot":"","sources":["../../src/signing-clients/local-signing-client.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,iDAA0C;AAC1C,oCAAyC;AAGzC,MAAM,gBAAgB,GAAG,aAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAQ5D,MAAa,kBAAkB;IAC7B,YACU,OAAuD;QAAvD,YAAO,GAAP,OAAO,CAAgD;IAC9D,CAAC;IAEJ,IAAI,CAAC,IAAY;QACf,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAEpC,MAAM,qBAAqB,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG;gBACV,GAAG,IAAA,cAAM,GAAE;gBACX,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;aACnC,CAAC;YAEF,IAAA,yBAAS,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;gBACnE,GAAG,EAAE,qBAAqB;gBAC1B,GAAG;gBACH,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YAEH,gBAAgB,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YAExC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA9BD,gDA8BC"}
1
+ {"version":3,"file":"local-signing-client.js","sourceRoot":"","sources":["../../src/signing-clients/local-signing-client.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,iDAA0C;AAC1C,oCAAyC;AAGzC,MAAM,gBAAgB,GAAG,aAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAQ5D,MAAa,kBAAkB;IAC7B,YACU,OAAuD;QAAvD,YAAO,GAAP,OAAO,CAAgD;IAC9D,CAAC;IAKJ,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAEpC,MAAM,qBAAqB,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG;gBACV,GAAG,IAAA,cAAM,GAAE;gBACX,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;aACnC,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,yBAAS,EAC1C,MAAM,EACN,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EACjD;gBACE,GAAG,EAAE,qBAAqB;gBAC1B,GAAG;gBACH,QAAQ,EAAE,OAAO;aAClB,CACF,CAAC;YAEF,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAErC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,SAAS,CAAC;oBACb,MAAM;oBACN,MAAM;iBACP,CAAC,CACH,CAAC;YACJ,CAAC;YACD,gBAAgB,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA7CD,gDA6CC"}
@@ -3,13 +3,9 @@ import type { SigningClient, SigningClientOptions } from '.';
3
3
  export declare class RemoteSigningClient implements SigningClient {
4
4
  private sshClient;
5
5
  private options;
6
- private sftpConnection;
7
6
  constructor(sshClient: SSHClient, options: SigningClientOptions);
8
7
  private init;
9
8
  private getRemoteFilePath;
10
- private copyFile;
11
- private downloadFile;
12
- private removeFile;
13
9
  private signRemoteFile;
14
10
  sign(file: string): Promise<void>;
15
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remote-signing-client.d.ts","sourceRoot":"","sources":["../../src/signing-clients/remote-signing-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,GAAG,CAAC;AAE7D,qBAAa,mBAAoB,YAAW,aAAa;IAIrD,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IAJjB,OAAO,CAAC,cAAc,CAAe;gBAG3B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,oBAAoB;YASzB,IAAI;IAYlB,OAAO,CAAC,iBAAiB;YAMX,QAAQ;YAWR,YAAY;YAWZ,UAAU;YAWV,cAAc;IAyBtB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBxC"}
1
+ {"version":3,"file":"remote-signing-client.d.ts","sourceRoot":"","sources":["../../src/signing-clients/remote-signing-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,GAAG,CAAC;AAE7D,qBAAa,mBAAoB,YAAW,aAAa;IAErD,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;gBADP,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,oBAAoB;YASzB,IAAI;IAWlB,OAAO,CAAC,iBAAiB;YAMX,cAAc;IAyBtB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBxC"}
@@ -12,47 +12,16 @@ class RemoteSigningClient {
12
12
  this.options = options;
13
13
  }
14
14
  async init() {
15
- this.sftpConnection = await this.sshClient.getSftpConnection();
16
15
  await this.sshClient.exec(`mkdir -p ${this.options.workingDirectory}`);
17
16
  {
18
17
  const remoteScript = `${this.options.workingDirectory}/garasign.sh`;
19
- await this.copyFile(this.options.signingScript, remoteScript);
18
+ await this.sshClient.copyFile(this.options.signingScript, remoteScript);
20
19
  await this.sshClient.exec(`chmod +x ${remoteScript}`);
21
20
  }
22
21
  }
23
22
  getRemoteFilePath(file) {
24
23
  return `${this.options.workingDirectory}/temp-${Date.now()}-${path_1.default.basename(file)}`;
25
24
  }
26
- async copyFile(file, remotePath) {
27
- return new Promise((resolve, reject) => {
28
- this.sftpConnection.fastPut(file, remotePath, (err) => {
29
- if (err) {
30
- return reject(err);
31
- }
32
- return resolve();
33
- });
34
- });
35
- }
36
- async downloadFile(remotePath, file) {
37
- return new Promise((resolve, reject) => {
38
- this.sftpConnection.fastGet(remotePath, file, (err) => {
39
- if (err) {
40
- return reject(err);
41
- }
42
- return resolve();
43
- });
44
- });
45
- }
46
- async removeFile(remotePath) {
47
- return new Promise((resolve, reject) => {
48
- this.sftpConnection.unlink(remotePath, (err) => {
49
- if (err) {
50
- return reject(err);
51
- }
52
- return resolve();
53
- });
54
- });
55
- }
56
25
  async signRemoteFile(file) {
57
26
  const env = (0, utils_1.getEnv)();
58
27
  const cmds = [
@@ -72,18 +41,18 @@ class RemoteSigningClient {
72
41
  const remotePath = this.getRemoteFilePath(file);
73
42
  try {
74
43
  await this.init();
75
- await this.copyFile(file, remotePath);
44
+ await this.sshClient.copyFile(file, remotePath);
76
45
  (0, utils_1.debug)(`SFTP: Copied file ${file} to ${remotePath}`);
77
46
  await this.signRemoteFile(path_1.default.basename(remotePath));
78
47
  (0, utils_1.debug)(`SFTP: Signed file ${file}`);
79
- await this.downloadFile(remotePath, file);
48
+ await this.sshClient.downloadFile(remotePath, file);
80
49
  (0, utils_1.debug)(`SFTP: Downloaded signed file to ${file}`);
81
50
  }
82
51
  catch (error) {
83
52
  (0, utils_1.debug)({ error });
84
53
  }
85
54
  finally {
86
- await this.removeFile(remotePath);
55
+ await this.sshClient.removeFile(remotePath);
87
56
  (0, utils_1.debug)(`SFTP: Removed remote file ${remotePath}`);
88
57
  this.sshClient.disconnect();
89
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remote-signing-client.js","sourceRoot":"","sources":["../../src/signing-clients/remote-signing-client.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,oCAAyC;AAGzC,MAAa,mBAAmB;IAG9B,YACU,SAAoB,EACpB,OAA6B;QAD7B,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAsB;IACpC,CAAC;IAQI,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAGvE,CAAC;YACC,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,cAAc,CAAC;YACpE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,IAAY;QACpC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,cAAI,CAAC,QAAQ,CACzE,IAAI,CACL,EAAE,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAAkB;QACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBACpD,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,IAAY;QACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBACpD,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,UAAkB;QACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC7C,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAY;QACvC,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;QAMrB,MAAM,IAAI,GAAG;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG;YAEvC,4BAA4B,GAAG,CAAC,iBAAiB,EAAE;YAEnD,4BAA4B,GAAG,CAAC,iBAAiB,EAAE;YAEnD,+BAA+B,GAAG,CAAC,oBAAoB,EAAE;YAEzD,+BAA+B,GAAG,CAAC,oBAAoB,EAAE;YACzD,iBAAiB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YAC7C,kBAAkB,IAAI,GAAG;SAC1B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAA,aAAK,EAAC,6BAA6B,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YAEH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAElB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACtC,IAAA,aAAK,EAAC,qBAAqB,IAAI,OAAO,UAAU,EAAE,CAAC,CAAC;YAEpD,MAAM,IAAI,CAAC,cAAc,CAAC,cAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YACrD,IAAA,aAAK,EAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;YAEnC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAA,aAAK,EAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAClC,IAAA,aAAK,EAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AAhHD,kDAgHC"}
1
+ {"version":3,"file":"remote-signing-client.js","sourceRoot":"","sources":["../../src/signing-clients/remote-signing-client.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,oCAAyC;AAGzC,MAAa,mBAAmB;IAC9B,YACU,SAAoB,EACpB,OAA6B;QAD7B,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAsB;IACpC,CAAC;IAQI,KAAK,CAAC,IAAI;QAChB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAGvE,CAAC;YACC,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,cAAc,CAAC;YACpE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YACxE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,IAAY;QACpC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,cAAI,CAAC,QAAQ,CACzE,IAAI,CACL,EAAE,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAY;QACvC,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;QAMrB,MAAM,IAAI,GAAG;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG;YAEvC,4BAA4B,GAAG,CAAC,iBAAiB,EAAE;YAEnD,4BAA4B,GAAG,CAAC,iBAAiB,EAAE;YAEnD,+BAA+B,GAAG,CAAC,oBAAoB,EAAE;YAEzD,+BAA+B,GAAG,CAAC,oBAAoB,EAAE;YACzD,iBAAiB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YAC7C,kBAAkB,IAAI,GAAG;SAC1B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAA,aAAK,EAAC,6BAA6B,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YAEH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAElB,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAChD,IAAA,aAAK,EAAC,qBAAqB,IAAI,OAAO,UAAU,EAAE,CAAC,CAAC;YAEpD,MAAM,IAAI,CAAC,cAAc,CAAC,cAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YACrD,IAAA,aAAK,EAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;YAEnC,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACpD,IAAA,aAAK,EAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAA,aAAK,EAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AA5ED,kDA4EC"}
@@ -1,4 +1,4 @@
1
- import type { ConnectConfig, SFTPWrapper } from 'ssh2';
1
+ import type { ConnectConfig } from 'ssh2';
2
2
  export declare class SSHClient {
3
3
  private sshClientOptions;
4
4
  private sshConnection;
@@ -9,6 +9,9 @@ export declare class SSHClient {
9
9
  connect(): Promise<void>;
10
10
  disconnect(): void;
11
11
  exec(command: string): Promise<string>;
12
- getSftpConnection(): Promise<SFTPWrapper>;
12
+ private getSftpConnection;
13
+ copyFile(file: string, remotePath: string): Promise<void>;
14
+ downloadFile(remotePath: string, file: string): Promise<void>;
15
+ removeFile(remotePath: string): Promise<void>;
13
16
  }
14
17
  //# sourceMappingURL=ssh-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssh-client.d.ts","sourceRoot":"","sources":["../src/ssh-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAOtE,qBAAa,SAAS;IAMR,OAAO,CAAC,gBAAgB;IALpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAc;IAErC,OAAO,CAAC,SAAS,CAAS;gBAEN,gBAAgB,EAAE,aAAa;IAKnD,mBAAmB;IAgBb,OAAO;IAgBb,UAAU;IAKJ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BtC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;CAUhD"}
1
+ {"version":3,"file":"ssh-client.d.ts","sourceRoot":"","sources":["../src/ssh-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAe,MAAM,MAAM,CAAC;AAOtE,qBAAa,SAAS;IAMR,OAAO,CAAC,gBAAgB;IALpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAc;IAErC,OAAO,CAAC,SAAS,CAAS;gBAEN,gBAAgB,EAAE,aAAa;IAKnD,mBAAmB;IAgBb,OAAO;IAgBb,UAAU;IAKJ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YA0B9B,iBAAiB;IAWzB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIpD"}
@@ -75,6 +75,18 @@ class SSHClient {
75
75
  (await (0, util_1.promisify)(this.sshConnection.sftp.bind(this.sshConnection))());
76
76
  return this.sftpConnection;
77
77
  }
78
+ async copyFile(file, remotePath) {
79
+ const sftpConnection = await this.getSftpConnection();
80
+ return (0, util_1.promisify)(sftpConnection.fastPut.bind(sftpConnection))(file, remotePath);
81
+ }
82
+ async downloadFile(remotePath, file) {
83
+ const sftpConnection = await this.getSftpConnection();
84
+ return (0, util_1.promisify)(sftpConnection.fastGet.bind(sftpConnection))(remotePath, file);
85
+ }
86
+ async removeFile(remotePath) {
87
+ const sftpConnection = await this.getSftpConnection();
88
+ return (0, util_1.promisify)(sftpConnection.unlink.bind(sftpConnection))(remotePath);
89
+ }
78
90
  }
79
91
  exports.SSHClient = SSHClient;
80
92
  //# sourceMappingURL=ssh-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssh-client.js","sourceRoot":"","sources":["../src/ssh-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh-client.js","sourceRoot":"","sources":["../src/ssh-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "email": "compass@mongodb.com"
14
14
  },
15
15
  "homepage": "https://github.com/mongodb-js/devtools-shared",
16
- "version": "0.2.0",
16
+ "version": "0.2.1",
17
17
  "repository": {
18
18
  "type": "git",
19
19
  "url": "https://github.com/mongodb-js/devtools-shared.git"
@@ -70,5 +70,5 @@
70
70
  "debug": "^4.3.4",
71
71
  "ssh2": "^1.15.0"
72
72
  },
73
- "gitHead": "ad497d997a5164646475261232687c8d0ace8722"
73
+ "gitHead": "7033e8a61e977cd416cea9a79e1be1a441697e7c"
74
74
  }
@@ -41,4 +41,42 @@ describe('LocalSigningClient', function () {
41
41
  ).trim();
42
42
  expect(signedFile).to.equal('signed content');
43
43
  });
44
+
45
+ context('when the script returns a non-zero exit code', function () {
46
+ beforeEach(function () {
47
+ writeFileSync(
48
+ signingScript,
49
+ `
50
+ #!/bin/bash
51
+ echo "Signing script called with arguments: $@"
52
+ >&2 echo "error - something went wrong"
53
+ exit 1
54
+ `
55
+ );
56
+ });
57
+
58
+ it('sign() rejects', async function () {
59
+ const localSigningClient = new LocalSigningClient({
60
+ signingScript: signingScript,
61
+ signingMethod: 'gpg',
62
+ });
63
+
64
+ const error = await localSigningClient.sign(fileToSign).catch((e) => e);
65
+ expect(error).to.be.instanceOf(Error);
66
+ });
67
+
68
+ it('includes the stdout and stderr of the failed script in the error', async function () {
69
+ const localSigningClient = new LocalSigningClient({
70
+ signingScript: signingScript,
71
+ signingMethod: 'gpg',
72
+ });
73
+
74
+ const error: Error = await localSigningClient
75
+ .sign(fileToSign)
76
+ .catch((e) => e);
77
+ const { stdout, stderr } = JSON.parse(error.message);
78
+ expect(stdout).to.contain('Signing script called with arguments: ');
79
+ expect(stderr).to.equal('error - something went wrong\n');
80
+ });
81
+ });
44
82
  });
@@ -16,7 +16,10 @@ export class LocalSigningClient implements SigningClient {
16
16
  private options: Omit<SigningClientOptions, 'workingDirectory'>
17
17
  ) {}
18
18
 
19
- sign(file: string): Promise<void> {
19
+ // we want to wrap any errors in promise rejections, so even though there is no
20
+ // await statement, we use an `async` function
21
+ // eslint-disable-next-line @typescript-eslint/require-await
22
+ async sign(file: string): Promise<void> {
20
23
  localClientDebug(`Signing ${file}`);
21
24
 
22
25
  const directoryOfFileToSign = path.dirname(file);
@@ -27,15 +30,27 @@ export class LocalSigningClient implements SigningClient {
27
30
  method: this.options.signingMethod,
28
31
  };
29
32
 
30
- spawnSync('bash', [this.options.signingScript, path.basename(file)], {
31
- cwd: directoryOfFileToSign,
32
- env,
33
- encoding: 'utf-8',
34
- });
35
-
33
+ const { stdout, stderr, status } = spawnSync(
34
+ 'bash',
35
+ [this.options.signingScript, path.basename(file)],
36
+ {
37
+ cwd: directoryOfFileToSign,
38
+ env,
39
+ encoding: 'utf-8',
40
+ }
41
+ );
42
+
43
+ localClientDebug({ stdout, stderr });
44
+
45
+ if (status !== 0) {
46
+ throw new Error(
47
+ JSON.stringify({
48
+ stdout,
49
+ stderr,
50
+ })
51
+ );
52
+ }
36
53
  localClientDebug(`Signed file ${file}`);
37
-
38
- return Promise.resolve();
39
54
  } catch (error) {
40
55
  localClientDebug({ error });
41
56
  throw error;
@@ -3,55 +3,16 @@ import { exec } from 'child_process';
3
3
  import { RemoteSigningClient } from './remote-signing-client';
4
4
  import { expect } from 'chai';
5
5
  import type { SSHClient } from '../ssh-client';
6
+ import { promisify } from 'util';
6
7
 
7
8
  const getMockedSSHClient = () => {
8
9
  return {
9
- getSftpConnection: () => {
10
- return {
11
- fastPut: async (
12
- localFile: string,
13
- remoteFile: string,
14
- cb: (err?: Error) => void
15
- ) => {
16
- try {
17
- await fs.copyFile(localFile, remoteFile);
18
- cb();
19
- } catch (err) {
20
- cb(err as Error);
21
- }
22
- },
23
- fastGet: async (
24
- remoteFile: string,
25
- localFile: string,
26
- cb: (err?: Error) => void
27
- ) => {
28
- try {
29
- await fs.copyFile(remoteFile, localFile);
30
- cb();
31
- } catch (err) {
32
- cb(err as Error);
33
- }
34
- },
35
- unlink: async (remoteFile: string, cb: (err?: Error) => void) => {
36
- try {
37
- await fs.unlink(remoteFile);
38
- cb();
39
- } catch (err) {
40
- cb(err as Error);
41
- }
42
- },
43
- };
44
- },
45
- exec: (command: string) => {
46
- return new Promise((resolve, reject) => {
47
- exec(command, { shell: 'bash' }, (err) => {
48
- if (err) {
49
- return reject(err);
50
- }
51
- return resolve('Ok');
52
- });
53
- });
54
- },
10
+ // The mocked ssh client
11
+ copyFile: (from: string, to: string) => fs.copyFile(from, to),
12
+ downloadFile: (remote: string, local: string) => fs.copyFile(remote, local),
13
+ removeFile: fs.unlink.bind(fs.unlink),
14
+ exec: (command: string) =>
15
+ promisify(exec)(command, { shell: 'bash' }).then(() => 'Ok'),
55
16
  disconnect: () => {},
56
17
  } as unknown as SSHClient;
57
18
  };
@@ -1,12 +1,9 @@
1
1
  import path from 'path';
2
- import type { SFTPWrapper } from 'ssh2';
3
2
  import type { SSHClient } from '../ssh-client';
4
3
  import { debug, getEnv } from '../utils';
5
4
  import type { SigningClient, SigningClientOptions } from '.';
6
5
 
7
6
  export class RemoteSigningClient implements SigningClient {
8
- private sftpConnection!: SFTPWrapper;
9
-
10
7
  constructor(
11
8
  private sshClient: SSHClient,
12
9
  private options: SigningClientOptions
@@ -19,13 +16,12 @@ export class RemoteSigningClient implements SigningClient {
19
16
  * - Copy the signing script to the remote machine
20
17
  */
21
18
  private async init() {
22
- this.sftpConnection = await this.sshClient.getSftpConnection();
23
19
  await this.sshClient.exec(`mkdir -p ${this.options.workingDirectory}`);
24
20
 
25
21
  // Copy the signing script to the remote machine
26
22
  {
27
23
  const remoteScript = `${this.options.workingDirectory}/garasign.sh`;
28
- await this.copyFile(this.options.signingScript, remoteScript);
24
+ await this.sshClient.copyFile(this.options.signingScript, remoteScript);
29
25
  await this.sshClient.exec(`chmod +x ${remoteScript}`);
30
26
  }
31
27
  }
@@ -36,39 +32,6 @@ export class RemoteSigningClient implements SigningClient {
36
32
  )}`;
37
33
  }
38
34
 
39
- private async copyFile(file: string, remotePath: string): Promise<void> {
40
- return new Promise((resolve, reject) => {
41
- this.sftpConnection.fastPut(file, remotePath, (err) => {
42
- if (err) {
43
- return reject(err);
44
- }
45
- return resolve();
46
- });
47
- });
48
- }
49
-
50
- private async downloadFile(remotePath: string, file: string): Promise<void> {
51
- return new Promise((resolve, reject) => {
52
- this.sftpConnection.fastGet(remotePath, file, (err) => {
53
- if (err) {
54
- return reject(err);
55
- }
56
- return resolve();
57
- });
58
- });
59
- }
60
-
61
- private async removeFile(remotePath: string): Promise<void> {
62
- return new Promise((resolve, reject) => {
63
- this.sftpConnection.unlink(remotePath, (err) => {
64
- if (err) {
65
- return reject(err);
66
- }
67
- return resolve();
68
- });
69
- });
70
- }
71
-
72
35
  private async signRemoteFile(file: string) {
73
36
  const env = getEnv();
74
37
  /**
@@ -100,18 +63,18 @@ export class RemoteSigningClient implements SigningClient {
100
63
  // establish connection
101
64
  await this.init();
102
65
 
103
- await this.copyFile(file, remotePath);
66
+ await this.sshClient.copyFile(file, remotePath);
104
67
  debug(`SFTP: Copied file ${file} to ${remotePath}`);
105
68
 
106
69
  await this.signRemoteFile(path.basename(remotePath));
107
70
  debug(`SFTP: Signed file ${file}`);
108
71
 
109
- await this.downloadFile(remotePath, file);
72
+ await this.sshClient.downloadFile(remotePath, file);
110
73
  debug(`SFTP: Downloaded signed file to ${file}`);
111
74
  } catch (error) {
112
75
  debug({ error });
113
76
  } finally {
114
- await this.removeFile(remotePath);
77
+ await this.sshClient.removeFile(remotePath);
115
78
  debug(`SFTP: Removed remote file ${remotePath}`);
116
79
  this.sshClient.disconnect();
117
80
  }
package/src/ssh-client.ts CHANGED
@@ -79,7 +79,7 @@ export class SSHClient {
79
79
  return data;
80
80
  }
81
81
 
82
- async getSftpConnection(): Promise<SFTPWrapper> {
82
+ private async getSftpConnection(): Promise<SFTPWrapper> {
83
83
  if (!this.connected) {
84
84
  throw new Error('Not connected to ssh server');
85
85
  }
@@ -89,4 +89,25 @@ export class SSHClient {
89
89
  (await promisify(this.sshConnection.sftp.bind(this.sshConnection))());
90
90
  return this.sftpConnection;
91
91
  }
92
+
93
+ async copyFile(file: string, remotePath: string): Promise<void> {
94
+ const sftpConnection = await this.getSftpConnection();
95
+ return promisify(sftpConnection.fastPut.bind(sftpConnection))(
96
+ file,
97
+ remotePath
98
+ );
99
+ }
100
+
101
+ async downloadFile(remotePath: string, file: string): Promise<void> {
102
+ const sftpConnection = await this.getSftpConnection();
103
+ return promisify(sftpConnection.fastGet.bind(sftpConnection))(
104
+ remotePath,
105
+ file
106
+ );
107
+ }
108
+
109
+ async removeFile(remotePath: string): Promise<void> {
110
+ const sftpConnection = await this.getSftpConnection();
111
+ return promisify(sftpConnection.unlink.bind(sftpConnection))(remotePath);
112
+ }
92
113
  }