From c3d6cbf6cc00e4ed658e8bb5c6c61fa9e289c6f2 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 11:46:51 +0000
Subject: [PATCH 01/42] update package
---
package-lock.json | 1312 +++++++++++++++++++++++++++++----------------
package.json | 13 +-
2 files changed, 865 insertions(+), 460 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 3403c18..fb0bb3d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,142 +1,179 @@
{
- "name": "@stifani/smb2",
+ "name": "@awo00/smb2",
"version": "0.3.0",
- "lockfileVersion": 1,
+ "lockfileVersion": 3,
"requires": true,
- "dependencies": {
- "@babel/code-frame": {
+ "packages": {
+ "": {
+ "name": "@awo00/smb2",
+ "version": "0.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "moment-timezone": "^0.5.31"
+ },
+ "devDependencies": {
+ "@types/node": "^13.13.52",
+ "nodemon": "^2.0.4",
+ "ts-node": "^9.0.0",
+ "tslint": "^6.1.0",
+ "typescript": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
"integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/highlight": "^7.8.3"
}
},
- "@babel/helper-validator-identifier": {
+ "node_modules/@babel/helper-validator-identifier": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz",
"integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==",
"dev": true
},
- "@babel/highlight": {
+ "node_modules/@babel/highlight": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
"integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/helper-validator-identifier": "^7.9.0",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
},
- "@sindresorhus/is": {
+ "node_modules/@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "@szmarczak/http-timer": {
+ "node_modules/@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"dev": true,
- "requires": {
+ "dependencies": {
"defer-to-connect": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "@types/node": {
- "version": "13.7.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz",
- "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==",
+ "node_modules/@types/node": {
+ "version": "13.13.52",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz",
+ "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==",
"dev": true
},
- "abbrev": {
+ "node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
- "ansi-align": {
+ "node_modules/ansi-align": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
"integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
"dev": true,
- "requires": {
+ "dependencies": {
"string-width": "^3.0.0"
- },
+ }
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
"dependencies": {
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- }
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "ansi-regex": {
+ "node_modules/ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "ansi-styles": {
+ "node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "anymatch": {
+ "node_modules/anymatch": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
- "requires": {
+ "dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "arg": {
+ "node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
- "argparse": {
+ "node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "requires": {
+ "dependencies": {
"sprintf-js": "~1.0.2"
}
},
- "balanced-match": {
+ "node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "binary-extensions": {
+ "node_modules/binary-extensions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "boxen": {
+ "node_modules/boxen": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
"integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-align": "^3.0.0",
"camelcase": "^5.3.1",
"chalk": "^3.0.0",
@@ -146,95 +183,123 @@
"type-fest": "^0.8.1",
"widest-line": "^3.1.0"
},
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/boxen/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/boxen/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "brace-expansion": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "braces": {
+ "node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
- "requires": {
+ "dependencies": {
"fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "buffer-from": {
+ "node_modules/buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
- "builtin-modules": {
+ "node_modules/builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "cacheable-request": {
+ "node_modules/cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
- "requires": {
+ "dependencies": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
@@ -243,278 +308,363 @@
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
"dependencies": {
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true
- }
- }
- },
- "camelcase": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "chalk": {
+ "node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "chokidar": {
+ "node_modules/chokidar": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
"integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
"dev": true,
- "requires": {
+ "dependencies": {
"anymatch": "~3.1.1",
"braces": "~3.0.2",
- "fsevents": "~2.1.2",
"glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.4.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.1.2"
}
},
- "ci-info": {
+ "node_modules/ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
"dev": true
},
- "cli-boxes": {
+ "node_modules/cli-boxes": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
"integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "clone-response": {
+ "node_modules/clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"dev": true,
- "requires": {
+ "dependencies": {
"mimic-response": "^1.0.0"
}
},
- "color-convert": {
+ "node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
- "requires": {
+ "dependencies": {
"color-name": "1.1.3"
}
},
- "color-name": {
+ "node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
- "commander": {
+ "node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "concat-map": {
+ "node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "configstore": {
+ "node_modules/configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
"integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
"dev": true,
- "requires": {
+ "dependencies": {
"dot-prop": "^5.2.0",
"graceful-fs": "^4.1.2",
"make-dir": "^3.0.0",
"unique-string": "^2.0.0",
"write-file-atomic": "^3.0.0",
"xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "crypto-random-string": {
+ "node_modules/crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
"integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "debug": {
+ "node_modules/debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
"dev": true,
- "requires": {
+ "dependencies": {
"ms": "^2.1.1"
}
},
- "decompress-response": {
+ "node_modules/decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
"dev": true,
- "requires": {
+ "dependencies": {
"mimic-response": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "deep-extend": {
+ "node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
},
- "defer-to-connect": {
+ "node_modules/defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
- "diff": {
+ "node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
},
- "dot-prop": {
+ "node_modules/dot-prop": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
"integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "duplexer3": {
+ "node_modules/duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
"dev": true
},
- "emoji-regex": {
+ "node_modules/emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
- "end-of-stream": {
+ "node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"once": "^1.4.0"
}
},
- "escape-goat": {
+ "node_modules/escape-goat": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
"integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "escape-string-regexp": {
+ "node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
},
- "esprima": {
+ "node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "fill-range": {
+ "node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "fs.realpath": {
+ "node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "fsevents": {
+ "node_modules/fsevents": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "deprecated": "\"Please update to latest v2.3 or v2.2\"",
"dev": true,
- "optional": true
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
},
- "get-stream": {
+ "node_modules/get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
- "requires": {
+ "dependencies": {
"pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "glob": {
+ "node_modules/glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
- "requires": {
+ "dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "glob-parent": {
+ "node_modules/glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "global-dirs": {
+ "node_modules/global-dirs": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
"integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
"dev": true,
- "requires": {
+ "dependencies": {
"ini": "^1.3.5"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "got": {
+ "node_modules/got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
@@ -526,281 +676,362 @@
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.6"
}
},
- "graceful-fs": {
+ "node_modules/graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
- "has-flag": {
+ "node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "has-yarn": {
+ "node_modules/has-yarn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "http-cache-semantics": {
+ "node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
- "ignore-by-default": {
+ "node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
"dev": true
},
- "import-lazy": {
+ "node_modules/import-lazy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
"integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "imurmurhash": {
+ "node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
},
- "inflight": {
+ "node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
- "requires": {
+ "dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
- "inherits": {
+ "node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "ini": {
+ "node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
- "is-binary-path": {
+ "node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
- "requires": {
+ "dependencies": {
"binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "is-ci": {
+ "node_modules/is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
- "requires": {
+ "dependencies": {
"ci-info": "^2.0.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
}
},
- "is-extglob": {
+ "node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-fullwidth-code-point": {
+ "node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "is-glob": {
+ "node_modules/is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-installed-globally": {
+ "node_modules/is-installed-globally": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
"integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
"dev": true,
- "requires": {
+ "dependencies": {
"global-dirs": "^2.0.1",
"is-path-inside": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "is-npm": {
+ "node_modules/is-npm": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
"integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-number": {
+ "node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
},
- "is-obj": {
+ "node_modules/is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-path-inside": {
+ "node_modules/is-path-inside": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
"integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-typedarray": {
+ "node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
- "is-yarn-global": {
+ "node_modules/is-yarn-global": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
"dev": true
},
- "js-tokens": {
+ "node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
- "js-yaml": {
+ "node_modules/js-yaml": {
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "json-buffer": {
+ "node_modules/json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
- "keyv": {
+ "node_modules/keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"dev": true,
- "requires": {
+ "dependencies": {
"json-buffer": "3.0.0"
}
},
- "latest-version": {
+ "node_modules/latest-version": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
"integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
"dev": true,
- "requires": {
+ "dependencies": {
"package-json": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "lowercase-keys": {
+ "node_modules/lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "make-dir": {
+ "node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
- "requires": {
+ "dependencies": {
"semver": "^6.0.0"
},
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "make-error": {
+ "node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
- "mimic-response": {
+ "node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "minimatch": {
+ "node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
- "requires": {
+ "dependencies": {
"brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "minimist": {
+ "node_modules/minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
- "mkdirp": {
+ "node_modules/mkdirp": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
"integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
+ "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "moment": {
+ "node_modules/moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
+ "engines": {
+ "node": "*"
+ }
},
- "moment-timezone": {
+ "node_modules/moment-timezone": {
"version": "0.5.31",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
"integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
- "requires": {
+ "dependencies": {
"moment": ">= 2.9.0"
+ },
+ "engines": {
+ "node": "*"
}
},
- "ms": {
+ "node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "nodemon": {
+ "node_modules/nodemon": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
"integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
"dev": true,
- "requires": {
+ "hasInstallScript": true,
+ "dependencies": {
"chokidar": "^3.2.2",
"debug": "^3.2.6",
"ignore-by-default": "^1.0.1",
@@ -811,340 +1042,456 @@
"touch": "^3.1.0",
"undefsafe": "^2.0.2",
"update-notifier": "^4.0.0"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
}
},
- "nopt": {
+ "node_modules/nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
"dev": true,
- "requires": {
+ "dependencies": {
"abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "*"
}
},
- "normalize-path": {
+ "node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "normalize-url": {
+ "node_modules/normalize-url": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "once": {
+ "node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
- "requires": {
+ "dependencies": {
"wrappy": "1"
}
},
- "p-cancelable": {
+ "node_modules/p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "package-json": {
+ "node_modules/package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
"integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"got": "^9.6.0",
"registry-auth-token": "^4.0.0",
"registry-url": "^5.0.0",
"semver": "^6.2.0"
},
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/package-json/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "path-is-absolute": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-parse": {
+ "node_modules/path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
- "picomatch": {
+ "node_modules/picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
},
- "prepend-http": {
+ "node_modules/prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "pstree.remy": {
+ "node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
"dev": true
},
- "pump": {
+ "node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
- "requires": {
+ "dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
- "pupa": {
+ "node_modules/pupa": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
"integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
"dev": true,
- "requires": {
+ "dependencies": {
"escape-goat": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "rc": {
+ "node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
- "requires": {
+ "dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
}
},
- "readdirp": {
+ "node_modules/readdirp": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
"integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
}
},
- "registry-auth-token": {
+ "node_modules/registry-auth-token": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
"integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
"dev": true,
- "requires": {
+ "dependencies": {
"rc": "^1.2.8"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "registry-url": {
+ "node_modules/registry-url": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
"integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
"dev": true,
- "requires": {
+ "dependencies": {
"rc": "^1.2.8"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "resolve": {
+ "node_modules/resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
"integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "responselike": {
+ "node_modules/responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
"dev": true,
- "requires": {
+ "dependencies": {
"lowercase-keys": "^1.0.0"
}
},
- "semver": {
+ "node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
},
- "semver-diff": {
+ "node_modules/semver-diff": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
"integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
"dev": true,
- "requires": {
+ "dependencies": {
"semver": "^6.3.0"
},
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "signal-exit": {
+ "node_modules/semver-diff/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
- "source-map": {
+ "node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "source-map-support": {
+ "node_modules/source-map-support": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
- "requires": {
+ "dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
- "sprintf-js": {
+ "node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "string-width": {
+ "node_modules/string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
- "requires": {
+ "dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
},
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
"dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "strip-ansi": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "strip-json-comments": {
+ "node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "supports-color": {
+ "node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
- "requires": {
+ "dependencies": {
"has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "term-size": {
+ "node_modules/term-size": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
"integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "to-readable-stream": {
+ "node_modules/to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "to-regex-range": {
+ "node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
}
},
- "touch": {
+ "node_modules/touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dev": true,
- "requires": {
+ "dependencies": {
"nopt": "~1.0.10"
+ },
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
}
},
- "ts-node": {
+ "node_modules/ts-node": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz",
"integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==",
"dev": true,
- "requires": {
+ "dependencies": {
"arg": "^4.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"source-map-support": "^0.5.17",
"yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.7"
}
},
- "tslib": {
+ "node_modules/tslib": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
"integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
"dev": true
},
- "tslint": {
+ "node_modules/tslint": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz",
"integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==",
+ "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/code-frame": "^7.0.0",
"builtin-modules": "^1.1.1",
"chalk": "^2.3.0",
@@ -1158,79 +1505,102 @@
"semver": "^5.3.0",
"tslib": "^1.10.0",
"tsutils": "^2.29.0"
+ },
+ "bin": {
+ "tslint": "bin/tslint"
+ },
+ "engines": {
+ "node": ">=4.8.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev"
}
},
- "tsutils": {
+ "node_modules/tsutils": {
"version": "2.29.0",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
"integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
"dev": true,
- "requires": {
+ "dependencies": {
"tslib": "^1.8.1"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
}
},
- "type-fest": {
+ "node_modules/type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "typedarray-to-buffer": {
+ "node_modules/typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-typedarray": "^1.0.0"
}
},
- "typescript": {
+ "node_modules/typescript": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
"integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
},
- "undefsafe": {
+ "node_modules/undefsafe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
"integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
"dev": true,
- "requires": {
+ "dependencies": {
"debug": "^2.2.0"
- },
+ }
+ },
+ "node_modules/undefsafe/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "unique-string": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/undefsafe/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/unique-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
"integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
"dev": true,
- "requires": {
+ "dependencies": {
"crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "update-notifier": {
+ "node_modules/update-notifier": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
"integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
"dev": true,
- "requires": {
+ "dependencies": {
"boxen": "^4.2.0",
"chalk": "^3.0.0",
"configstore": "^5.0.1",
@@ -1245,105 +1615,139 @@
"semver-diff": "^3.1.1",
"xdg-basedir": "^4.0.0"
},
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "url-parse-lax": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/update-notifier/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/update-notifier/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/update-notifier/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/update-notifier/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
"integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
"dev": true,
- "requires": {
+ "dependencies": {
"prepend-http": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "widest-line": {
+ "node_modules/widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
"integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
"dev": true,
- "requires": {
+ "dependencies": {
"string-width": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "wrappy": {
+ "node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write-file-atomic": {
+ "node_modules/write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
- "xdg-basedir": {
+ "node_modules/xdg-basedir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
"integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "yn": {
+ "node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
}
}
}
diff --git a/package.json b/package.json
index f66118c..41df345 100644
--- a/package.json
+++ b/package.json
@@ -1,15 +1,16 @@
{
- "name": "@stifani/smb2",
+ "name": "@awo00/smb2",
"description": "A SMB2 implementation in TypeScript",
- "repository": "https://github.com/ardean/smb2",
- "bugs": "https://github.com/ardean/smb2/issues",
+ "repository": "https://github.com/awo00/smb2",
+ "bugs": "https://github.com/awo00/smb2/issues",
"version": "0.3.0",
- "author": "ardean",
+ "author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
"scripts": {
- "start": "nodemon",
+ "start": "node dist/src/index.js",
+ "dev": "nodemon -r src/index.ts",
"build": "rm -rf dist && tsc",
"lint": "tslint --project ."
},
@@ -32,7 +33,7 @@
"moment-timezone": "^0.5.31"
},
"devDependencies": {
- "@types/node": "^13.7.4",
+ "@types/node": "^13.13.52",
"nodemon": "^2.0.4",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
From 59fd6262c483ab2459136bc24ae044fd92f2cdff Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 11:58:12 +0000
Subject: [PATCH 02/42] package
---
LICENSE.md | 4 ++--
package.json | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/LICENSE.md b/LICENSE.md
index 7b19232..a64fec4 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2020 stifani
+Copyright (c) 2020 awo00
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
+SOFTWARE.
diff --git a/package.json b/package.json
index 41df345..03db4b8 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,8 @@
"lint": "tslint --project ."
},
"files": [
- "dist"
+ "dist",
+ "src"
],
"keywords": [
"smb2",
@@ -27,7 +28,7 @@
"file-sharing"
],
"engines": {
- "node": ">=10.0.0"
+ "node": ">18"
},
"dependencies": {
"moment-timezone": "^0.5.31"
From bfb415639d568d21140e9d57c875a35d2dbd7fc6 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 12:04:57 +0000
Subject: [PATCH 03/42] package dev
---
package-lock.json | 1156 +++++----------------------------------------
package.json | 8 +-
2 files changed, 130 insertions(+), 1034 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index fb0bb3d..41c0715 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,13 +13,13 @@
},
"devDependencies": {
"@types/node": "^13.13.52",
- "nodemon": "^2.0.4",
+ "nodemon": "^3.0.2",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
"typescript": "^4.0.3"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
}
},
"node_modules/@babel/code-frame": {
@@ -48,27 +48,6 @@
"js-tokens": "^4.0.0"
}
},
- "node_modules/@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "dev": true,
- "dependencies": {
- "defer-to-connect": "^1.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@types/node": {
"version": "13.13.52",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz",
@@ -81,38 +60,6 @@
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
- "node_modules/ansi-align": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
- "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
- "dev": true,
- "dependencies": {
- "string-width": "^3.0.0"
- }
- },
- "node_modules/ansi-align/node_modules/string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -126,9 +73,9 @@
}
},
"node_modules/anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
@@ -160,99 +107,10 @@
"dev": true
},
"node_modules/binary-extensions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
- "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
- "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
- "dev": true,
- "dependencies": {
- "ansi-align": "^3.0.0",
- "camelcase": "^5.3.1",
- "chalk": "^3.0.0",
- "cli-boxes": "^2.2.0",
- "string-width": "^4.1.0",
- "term-size": "^2.1.0",
- "type-fest": "^0.8.1",
- "widest-line": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/boxen/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/boxen/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
"engines": {
"node": ">=8"
}
@@ -294,57 +152,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dev": true,
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cacheable-request/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -360,51 +167,30 @@
}
},
"node_modules/chokidar": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
- "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
- "dev": true,
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
"dependencies": {
- "anymatch": "~3.1.1",
+ "anymatch": "~3.1.2",
"braces": "~3.0.2",
- "glob-parent": "~5.1.0",
+ "glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
- "readdirp": "~3.4.0"
+ "readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
- "fsevents": "~2.1.2"
- }
- },
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "node_modules/cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dev": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
+ "fsevents": "~2.3.2"
}
},
"node_modules/color-convert": {
@@ -434,69 +220,23 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
- "node_modules/configstore": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
- "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
- "dev": true,
- "dependencies": {
- "dot-prop": "^5.2.0",
- "graceful-fs": "^4.1.2",
- "make-dir": "^3.0.0",
- "unique-string": "^2.0.0",
- "write-file-atomic": "^3.0.0",
- "xdg-basedir": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
- "mimic-response": "^1.0.0"
+ "ms": "2.1.2"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
- "dev": true
- },
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -506,48 +246,6 @@
"node": ">=0.3.1"
}
},
- "node_modules/dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/escape-goat": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
- "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -589,10 +287,9 @@
"dev": true
},
"node_modules/fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "deprecated": "\"Please update to latest v2.3 or v2.2\"",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"optional": true,
@@ -603,18 +300,6 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -636,9 +321,9 @@
}
},
"node_modules/glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
@@ -647,46 +332,6 @@
"node": ">= 6"
}
},
- "node_modules/global-dirs": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
- "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
- "dev": true,
- "dependencies": {
- "ini": "^1.3.5"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dev": true,
- "dependencies": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
- "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
- "dev": true
- },
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -696,45 +341,12 @@
"node": ">=4"
}
},
- "node_modules/has-yarn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
- "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
"dev": true
},
- "node_modules/import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -751,12 +363,6 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -769,40 +375,19 @@
"node": ">=8"
}
},
- "node_modules/is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
- "dependencies": {
- "ci-info": "^2.0.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
@@ -811,31 +396,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
- "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^2.0.1",
- "is-path-inside": "^3.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-npm": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
- "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -845,36 +405,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
- "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "node_modules/is-yarn-global": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
- "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
- "dev": true
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -894,64 +424,16 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "node_modules/keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dev": true,
- "dependencies": {
- "json-buffer": "3.0.0"
- }
- },
- "node_modules/latest-version": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
- "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
- "dev": true,
- "dependencies": {
- "package-json": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
- "semver": "^6.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "node": ">=10"
}
},
"node_modules/make-error": {
@@ -960,19 +442,10 @@
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -982,10 +455,13 @@
}
},
"node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/mkdirp": {
"version": "0.5.3",
@@ -1001,19 +477,19 @@
}
},
"node_modules/moment": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
+ "version": "2.29.4",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"engines": {
"node": "*"
}
},
"node_modules/moment-timezone": {
- "version": "0.5.31",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
- "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
+ "version": "0.5.43",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz",
+ "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==",
"dependencies": {
- "moment": ">= 2.9.0"
+ "moment": "^2.29.4"
},
"engines": {
"node": "*"
@@ -1026,34 +502,48 @@
"dev": true
},
"node_modules/nodemon": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
- "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz",
+ "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==",
"dev": true,
- "hasInstallScript": true,
"dependencies": {
- "chokidar": "^3.2.2",
- "debug": "^3.2.6",
+ "chokidar": "^3.5.2",
+ "debug": "^4",
"ignore-by-default": "^1.0.1",
- "minimatch": "^3.0.4",
- "pstree.remy": "^1.1.7",
- "semver": "^5.7.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
- "undefsafe": "^2.0.2",
- "update-notifier": "^4.0.0"
+ "undefsafe": "^2.0.5"
},
"bin": {
"nodemon": "bin/nodemon.js"
},
"engines": {
- "node": ">=8.10.0"
+ "node": ">=10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
+ "node_modules/nodemon/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
@@ -1078,15 +568,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/normalize-url": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
- "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1096,39 +577,6 @@
"wrappy": "1"
}
},
- "node_modules/p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/package-json": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
- "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
- "dev": true,
- "dependencies": {
- "got": "^9.6.0",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
- "semver": "^6.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/package-json/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1139,15 +587,15 @@
}
},
"node_modules/path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
@@ -1156,62 +604,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
"dev": true
},
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/pupa": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
- "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
- "dev": true,
- "dependencies": {
- "escape-goat": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dev": true,
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
"node_modules/readdirp": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
- "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
@@ -1220,30 +622,6 @@
"node": ">=8.10.0"
}
},
- "node_modules/registry-auth-token": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
- "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
- "dev": true,
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
- "dev": true,
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/resolve": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
@@ -1256,51 +634,42 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "dependencies": {
- "lowercase-keys": "^1.0.0"
- }
- },
"node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
}
},
- "node_modules/semver-diff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
- "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
"dependencies": {
- "semver": "^6.3.0"
+ "semver": "^7.5.3"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/semver-diff/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "node_modules/simple-update-notifier/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
- "dev": true
- },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -1326,77 +695,6 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "node_modules/string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width/node_modules/ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/string-width/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1409,27 +707,6 @@
"node": ">=4"
}
},
- "node_modules/term-size": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
- "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -1528,24 +805,6 @@
"typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
}
},
- "node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
"node_modules/typescript": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
@@ -1560,185 +819,22 @@
}
},
"node_modules/undefsafe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
- "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
- "dev": true,
- "dependencies": {
- "debug": "^2.2.0"
- }
- },
- "node_modules/undefsafe/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/undefsafe/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
"dev": true
},
- "node_modules/unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "dev": true,
- "dependencies": {
- "crypto-random-string": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/update-notifier": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
- "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
- "dev": true,
- "dependencies": {
- "boxen": "^4.2.0",
- "chalk": "^3.0.0",
- "configstore": "^5.0.1",
- "has-yarn": "^2.1.0",
- "import-lazy": "^2.1.0",
- "is-ci": "^2.0.0",
- "is-installed-globally": "^0.3.1",
- "is-npm": "^4.0.0",
- "is-yarn-global": "^0.3.0",
- "latest-version": "^5.0.0",
- "pupa": "^2.0.1",
- "semver-diff": "^3.1.1",
- "xdg-basedir": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/yeoman/update-notifier?sponsor=1"
- }
- },
- "node_modules/update-notifier/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/update-notifier/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/update-notifier/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/update-notifier/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/update-notifier/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/update-notifier/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "dev": true,
- "dependencies": {
- "prepend-http": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "node_modules/xdg-basedir": {
+ "node_modules/yallist": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
- "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
},
"node_modules/yn": {
"version": "3.1.1",
diff --git a/package.json b/package.json
index 03db4b8..6ab19a8 100644
--- a/package.json
+++ b/package.json
@@ -5,13 +5,13 @@
"bugs": "https://github.com/awo00/smb2/issues",
"version": "0.3.0",
"author": "awo00",
- "main": "dist/index.js",
+ "main": "src/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
"scripts": {
"start": "node dist/src/index.js",
"dev": "nodemon -r src/index.ts",
- "build": "rm -rf dist && tsc",
+ "build": "tsc --build",
"lint": "tslint --project ."
},
"files": [
@@ -28,14 +28,14 @@
"file-sharing"
],
"engines": {
- "node": ">18"
+ "node": ">=18"
},
"dependencies": {
"moment-timezone": "^0.5.31"
},
"devDependencies": {
"@types/node": "^13.13.52",
- "nodemon": "^2.0.4",
+ "nodemon": "^3.0.2",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
"typescript": "^4.0.3"
From 5de797c9b423fc97c5f05764136bbc2713edffd9 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 14:29:32 +0000
Subject: [PATCH 04/42] build
---
.gitignore | 2 +-
dist/client/Client.d.ts | 50 ++++
dist/client/Client.js | 208 ++++++++++++++++
dist/client/Directory.d.ts | 42 ++++
dist/client/Directory.js | 183 ++++++++++++++
dist/client/File.d.ts | 33 +++
dist/client/File.js | 161 +++++++++++++
dist/client/Session.d.ts | 28 +++
dist/client/Session.js | 90 +++++++
dist/client/Tree.d.ts | 38 +++
dist/client/Tree.js | 167 +++++++++++++
dist/index.d.ts | 6 +
dist/index.js | 11 +
dist/protocol/Packet.d.ts | 10 +
dist/protocol/Packet.js | 54 +++++
dist/protocol/Request.d.ts | 9 +
dist/protocol/Request.js | 9 +
dist/protocol/Response.d.ts | 9 +
dist/protocol/Response.js | 9 +
dist/protocol/Structure.d.ts | 5 +
dist/protocol/Structure.js | 2 +
dist/protocol/StructureField.d.ts | 14 ++
dist/protocol/StructureField.js | 2 +
dist/protocol/Value.d.ts | 3 +
dist/protocol/Value.js | 2 +
dist/protocol/models/ChangeEntry.d.ts | 6 +
dist/protocol/models/ChangeEntry.js | 2 +
dist/protocol/models/DirectoryEntry.d.ts | 15 ++
dist/protocol/models/DirectoryEntry.js | 2 +
dist/protocol/ntlm/NegotiateFlag.d.ts | 25 ++
dist/protocol/ntlm/NegotiateFlag.js | 28 +++
dist/protocol/ntlm/util.d.ts | 11 +
dist/protocol/ntlm/util.js | 225 ++++++++++++++++++
dist/protocol/protocolIds.d.ts | 2 +
dist/protocol/protocolIds.js | 19 ++
dist/protocol/smb/Header.d.ts | 26 ++
dist/protocol/smb/Header.js | 68 ++++++
dist/protocol/smb/Packet.d.ts | 13 +
dist/protocol/smb/Packet.js | 80 +++++++
dist/protocol/smb/PacketType.d.ts | 56 +++++
dist/protocol/smb/PacketType.js | 60 +++++
dist/protocol/smb/Request.d.ts | 8 +
dist/protocol/smb/Request.js | 18 ++
dist/protocol/smb/Response.d.ts | 8 +
dist/protocol/smb/Response.js | 18 ++
dist/protocol/smb2/Capability.d.ts | 5 +
dist/protocol/smb2/Capability.js | 8 +
dist/protocol/smb2/CreateDispositionType.d.ts | 9 +
dist/protocol/smb2/CreateDispositionType.js | 12 +
dist/protocol/smb2/Dialect.d.ts | 10 +
dist/protocol/smb2/Dialect.js | 13 +
dist/protocol/smb2/DirectoryAccess.d.ts | 23 ++
dist/protocol/smb2/DirectoryAccess.js | 26 ++
dist/protocol/smb2/FileAction.d.ts | 14 ++
dist/protocol/smb2/FileAction.js | 17 ++
dist/protocol/smb2/FileAttribute.d.ts | 19 ++
dist/protocol/smb2/FileAttribute.js | 22 ++
dist/protocol/smb2/FilePipePrinterAccess.d.ts | 23 ++
dist/protocol/smb2/FilePipePrinterAccess.js | 26 ++
dist/protocol/smb2/Header.d.ts | 24 ++
dist/protocol/smb2/Header.js | 62 +++++
dist/protocol/smb2/HeaderFlag.d.ts | 10 +
dist/protocol/smb2/HeaderFlag.js | 13 +
dist/protocol/smb2/Packet.d.ts | 20 ++
dist/protocol/smb2/Packet.js | 83 +++++++
dist/protocol/smb2/PacketType.d.ts | 22 ++
dist/protocol/smb2/PacketType.js | 26 ++
dist/protocol/smb2/Request.d.ts | 11 +
dist/protocol/smb2/Request.js | 25 ++
dist/protocol/smb2/Response.d.ts | 11 +
dist/protocol/smb2/Response.js | 27 +++
dist/protocol/smb2/ShareAccessType.d.ts | 6 +
dist/protocol/smb2/ShareAccessType.js | 9 +
dist/protocol/smb2/StatusCode.d.ts | 9 +
dist/protocol/smb2/StatusCode.js | 12 +
dist/protocol/smb2/packets/ChangeNotify.d.ts | 27 +++
dist/protocol/smb2/packets/ChangeNotify.js | 129 ++++++++++
dist/protocol/smb2/packets/Close.d.ts | 6 +
dist/protocol/smb2/packets/Close.js | 69 ++++++
dist/protocol/smb2/packets/Create.d.ts | 10 +
dist/protocol/smb2/packets/Create.js | 168 +++++++++++++
dist/protocol/smb2/packets/Echo.d.ts | 6 +
dist/protocol/smb2/packets/Echo.js | 27 +++
dist/protocol/smb2/packets/Flush.d.ts | 6 +
dist/protocol/smb2/packets/Flush.js | 36 +++
dist/protocol/smb2/packets/LogOff.d.ts | 6 +
dist/protocol/smb2/packets/LogOff.js | 28 +++
dist/protocol/smb2/packets/Negotiate.d.ts | 15 ++
dist/protocol/smb2/packets/Negotiate.js | 107 +++++++++
.../protocol/smb2/packets/QueryDirectory.d.ts | 9 +
dist/protocol/smb2/packets/QueryDirectory.js | 151 ++++++++++++
dist/protocol/smb2/packets/Read.d.ts | 6 +
dist/protocol/smb2/packets/Read.js | 89 +++++++
dist/protocol/smb2/packets/SessionSetup.d.ts | 6 +
dist/protocol/smb2/packets/SessionSetup.js | 70 ++++++
dist/protocol/smb2/packets/SetInfo.d.ts | 26 ++
dist/protocol/smb2/packets/SetInfo.js | 78 ++++++
dist/protocol/smb2/packets/TreeConnect.d.ts | 6 +
dist/protocol/smb2/packets/TreeConnect.js | 56 +++++
.../protocol/smb2/packets/TreeDisconnect.d.ts | 6 +
dist/protocol/smb2/packets/TreeDisconnect.js | 27 +++
dist/protocol/smb2/packets/Write.d.ts | 6 +
dist/protocol/smb2/packets/Write.js | 81 +++++++
dist/protocol/smb2/packets/index.d.ts | 14 ++
dist/protocol/smb2/packets/index.js | 34 +++
dist/protocol/structureUtil.d.ts | 16 ++
dist/protocol/structureUtil.js | 175 ++++++++++++++
dist/protocol/util.d.ts | 7 +
dist/protocol/util.js | 58 +++++
dist/server/Client.d.ts | 23 ++
dist/server/Client.js | 64 +++++
dist/server/Middleware.d.ts | 4 +
dist/server/Middleware.js | 2 +
dist/server/Request.d.ts | 4 +
dist/server/Request.js | 2 +
dist/server/Response.d.ts | 4 +
dist/server/Response.js | 2 +
dist/server/Server.d.ts | 21 ++
dist/server/Server.js | 122 ++++++++++
dist/server/Smb2Request.d.ts | 7 +
dist/server/Smb2Request.js | 9 +
dist/server/Smb2Response.d.ts | 11 +
dist/server/Smb2Response.js | 27 +++
dist/server/SmbRequest.d.ts | 7 +
dist/server/SmbRequest.js | 9 +
dist/server/SmbResponse.d.ts | 11 +
dist/server/SmbResponse.js | 27 +++
dist/server/middlewares/requestType.d.ts | 6 +
dist/server/middlewares/requestType.js | 7 +
.../middlewares/supportedProtocols.d.ts | 4 +
dist/server/middlewares/supportedProtocols.js | 6 +
.../server/requestHandlers/smb/Negotiate.d.ts | 4 +
dist/server/requestHandlers/smb/Negotiate.js | 55 +++++
dist/server/requestHandlers/smb/index.d.ts | 1 +
dist/server/requestHandlers/smb/index.js | 8 +
.../requestHandlers/smb2/Negotiate.d.ts | 4 +
dist/server/requestHandlers/smb2/Negotiate.js | 60 +++++
.../requestHandlers/smb2/SessionSetup.d.ts | 4 +
.../requestHandlers/smb2/SessionSetup.js | 96 ++++++++
dist/server/requestHandlers/smb2/index.d.ts | 2 +
dist/server/requestHandlers/smb2/index.js | 10 +
package-lock.json | 60 ++++-
package.json | 6 +-
src/protocol/ntlm/util.ts | 159 +++++--------
144 files changed, 4737 insertions(+), 106 deletions(-)
create mode 100644 dist/client/Client.d.ts
create mode 100644 dist/client/Client.js
create mode 100644 dist/client/Directory.d.ts
create mode 100644 dist/client/Directory.js
create mode 100644 dist/client/File.d.ts
create mode 100644 dist/client/File.js
create mode 100644 dist/client/Session.d.ts
create mode 100644 dist/client/Session.js
create mode 100644 dist/client/Tree.d.ts
create mode 100644 dist/client/Tree.js
create mode 100644 dist/index.d.ts
create mode 100644 dist/index.js
create mode 100644 dist/protocol/Packet.d.ts
create mode 100644 dist/protocol/Packet.js
create mode 100644 dist/protocol/Request.d.ts
create mode 100644 dist/protocol/Request.js
create mode 100644 dist/protocol/Response.d.ts
create mode 100644 dist/protocol/Response.js
create mode 100644 dist/protocol/Structure.d.ts
create mode 100644 dist/protocol/Structure.js
create mode 100644 dist/protocol/StructureField.d.ts
create mode 100644 dist/protocol/StructureField.js
create mode 100644 dist/protocol/Value.d.ts
create mode 100644 dist/protocol/Value.js
create mode 100644 dist/protocol/models/ChangeEntry.d.ts
create mode 100644 dist/protocol/models/ChangeEntry.js
create mode 100644 dist/protocol/models/DirectoryEntry.d.ts
create mode 100644 dist/protocol/models/DirectoryEntry.js
create mode 100644 dist/protocol/ntlm/NegotiateFlag.d.ts
create mode 100644 dist/protocol/ntlm/NegotiateFlag.js
create mode 100644 dist/protocol/ntlm/util.d.ts
create mode 100644 dist/protocol/ntlm/util.js
create mode 100644 dist/protocol/protocolIds.d.ts
create mode 100644 dist/protocol/protocolIds.js
create mode 100644 dist/protocol/smb/Header.d.ts
create mode 100644 dist/protocol/smb/Header.js
create mode 100644 dist/protocol/smb/Packet.d.ts
create mode 100644 dist/protocol/smb/Packet.js
create mode 100644 dist/protocol/smb/PacketType.d.ts
create mode 100644 dist/protocol/smb/PacketType.js
create mode 100644 dist/protocol/smb/Request.d.ts
create mode 100644 dist/protocol/smb/Request.js
create mode 100644 dist/protocol/smb/Response.d.ts
create mode 100644 dist/protocol/smb/Response.js
create mode 100644 dist/protocol/smb2/Capability.d.ts
create mode 100644 dist/protocol/smb2/Capability.js
create mode 100644 dist/protocol/smb2/CreateDispositionType.d.ts
create mode 100644 dist/protocol/smb2/CreateDispositionType.js
create mode 100644 dist/protocol/smb2/Dialect.d.ts
create mode 100644 dist/protocol/smb2/Dialect.js
create mode 100644 dist/protocol/smb2/DirectoryAccess.d.ts
create mode 100644 dist/protocol/smb2/DirectoryAccess.js
create mode 100644 dist/protocol/smb2/FileAction.d.ts
create mode 100644 dist/protocol/smb2/FileAction.js
create mode 100644 dist/protocol/smb2/FileAttribute.d.ts
create mode 100644 dist/protocol/smb2/FileAttribute.js
create mode 100644 dist/protocol/smb2/FilePipePrinterAccess.d.ts
create mode 100644 dist/protocol/smb2/FilePipePrinterAccess.js
create mode 100644 dist/protocol/smb2/Header.d.ts
create mode 100644 dist/protocol/smb2/Header.js
create mode 100644 dist/protocol/smb2/HeaderFlag.d.ts
create mode 100644 dist/protocol/smb2/HeaderFlag.js
create mode 100644 dist/protocol/smb2/Packet.d.ts
create mode 100644 dist/protocol/smb2/Packet.js
create mode 100644 dist/protocol/smb2/PacketType.d.ts
create mode 100644 dist/protocol/smb2/PacketType.js
create mode 100644 dist/protocol/smb2/Request.d.ts
create mode 100644 dist/protocol/smb2/Request.js
create mode 100644 dist/protocol/smb2/Response.d.ts
create mode 100644 dist/protocol/smb2/Response.js
create mode 100644 dist/protocol/smb2/ShareAccessType.d.ts
create mode 100644 dist/protocol/smb2/ShareAccessType.js
create mode 100644 dist/protocol/smb2/StatusCode.d.ts
create mode 100644 dist/protocol/smb2/StatusCode.js
create mode 100644 dist/protocol/smb2/packets/ChangeNotify.d.ts
create mode 100644 dist/protocol/smb2/packets/ChangeNotify.js
create mode 100644 dist/protocol/smb2/packets/Close.d.ts
create mode 100644 dist/protocol/smb2/packets/Close.js
create mode 100644 dist/protocol/smb2/packets/Create.d.ts
create mode 100644 dist/protocol/smb2/packets/Create.js
create mode 100644 dist/protocol/smb2/packets/Echo.d.ts
create mode 100644 dist/protocol/smb2/packets/Echo.js
create mode 100644 dist/protocol/smb2/packets/Flush.d.ts
create mode 100644 dist/protocol/smb2/packets/Flush.js
create mode 100644 dist/protocol/smb2/packets/LogOff.d.ts
create mode 100644 dist/protocol/smb2/packets/LogOff.js
create mode 100644 dist/protocol/smb2/packets/Negotiate.d.ts
create mode 100644 dist/protocol/smb2/packets/Negotiate.js
create mode 100644 dist/protocol/smb2/packets/QueryDirectory.d.ts
create mode 100644 dist/protocol/smb2/packets/QueryDirectory.js
create mode 100644 dist/protocol/smb2/packets/Read.d.ts
create mode 100644 dist/protocol/smb2/packets/Read.js
create mode 100644 dist/protocol/smb2/packets/SessionSetup.d.ts
create mode 100644 dist/protocol/smb2/packets/SessionSetup.js
create mode 100644 dist/protocol/smb2/packets/SetInfo.d.ts
create mode 100644 dist/protocol/smb2/packets/SetInfo.js
create mode 100644 dist/protocol/smb2/packets/TreeConnect.d.ts
create mode 100644 dist/protocol/smb2/packets/TreeConnect.js
create mode 100644 dist/protocol/smb2/packets/TreeDisconnect.d.ts
create mode 100644 dist/protocol/smb2/packets/TreeDisconnect.js
create mode 100644 dist/protocol/smb2/packets/Write.d.ts
create mode 100644 dist/protocol/smb2/packets/Write.js
create mode 100644 dist/protocol/smb2/packets/index.d.ts
create mode 100644 dist/protocol/smb2/packets/index.js
create mode 100644 dist/protocol/structureUtil.d.ts
create mode 100644 dist/protocol/structureUtil.js
create mode 100644 dist/protocol/util.d.ts
create mode 100644 dist/protocol/util.js
create mode 100644 dist/server/Client.d.ts
create mode 100644 dist/server/Client.js
create mode 100644 dist/server/Middleware.d.ts
create mode 100644 dist/server/Middleware.js
create mode 100644 dist/server/Request.d.ts
create mode 100644 dist/server/Request.js
create mode 100644 dist/server/Response.d.ts
create mode 100644 dist/server/Response.js
create mode 100644 dist/server/Server.d.ts
create mode 100644 dist/server/Server.js
create mode 100644 dist/server/Smb2Request.d.ts
create mode 100644 dist/server/Smb2Request.js
create mode 100644 dist/server/Smb2Response.d.ts
create mode 100644 dist/server/Smb2Response.js
create mode 100644 dist/server/SmbRequest.d.ts
create mode 100644 dist/server/SmbRequest.js
create mode 100644 dist/server/SmbResponse.d.ts
create mode 100644 dist/server/SmbResponse.js
create mode 100644 dist/server/middlewares/requestType.d.ts
create mode 100644 dist/server/middlewares/requestType.js
create mode 100644 dist/server/middlewares/supportedProtocols.d.ts
create mode 100644 dist/server/middlewares/supportedProtocols.js
create mode 100644 dist/server/requestHandlers/smb/Negotiate.d.ts
create mode 100644 dist/server/requestHandlers/smb/Negotiate.js
create mode 100644 dist/server/requestHandlers/smb/index.d.ts
create mode 100644 dist/server/requestHandlers/smb/index.js
create mode 100644 dist/server/requestHandlers/smb2/Negotiate.d.ts
create mode 100644 dist/server/requestHandlers/smb2/Negotiate.js
create mode 100644 dist/server/requestHandlers/smb2/SessionSetup.d.ts
create mode 100644 dist/server/requestHandlers/smb2/SessionSetup.js
create mode 100644 dist/server/requestHandlers/smb2/index.d.ts
create mode 100644 dist/server/requestHandlers/smb2/index.js
diff --git a/.gitignore b/.gitignore
index 1e47279..aa31649 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
/node_modules
-/dist
+# /dist
.DS_Store
*.log
\ No newline at end of file
diff --git a/dist/client/Client.d.ts b/dist/client/Client.d.ts
new file mode 100644
index 0000000..6080594
--- /dev/null
+++ b/dist/client/Client.d.ts
@@ -0,0 +1,50 @@
+///
+import { Socket } from "net";
+import { EventEmitter } from "events";
+import Request from "../protocol/smb2/Request";
+import Response from "../protocol/smb2/Response";
+import Header from "../protocol/smb2/Header";
+import Session, { AuthenticateOptions } from "./Session";
+export interface Options {
+ port?: number;
+ connectTimeout?: number;
+ requestTimeout?: number;
+}
+interface Client {
+ on(event: "error", callback: (error: Error) => void): this;
+ on(event: "changeNotify", callback: (response: Response) => void): this;
+ once(event: "error", callback: (error: Error) => void): this;
+ once(event: "changeNotify", callback: (response: Response) => void): this;
+}
+declare class Client extends EventEmitter {
+ host: string;
+ options: Options;
+ _id: string;
+ socket: Socket;
+ nextMessageId: bigint;
+ responseRestChunk: Buffer;
+ responseMap: Map;
+ responseCallbackMap: Map void>;
+ connected: boolean;
+ port: number;
+ connectTimeout: number;
+ connectTimeoutId: NodeJS.Timer;
+ requestTimeout: number;
+ requestTimeoutIdMap: Map;
+ sessions: Session[];
+ constructor(host: string, options?: Options);
+ connect(): Promise;
+ createRequest(header?: Header, body?: any): Request;
+ request(header?: Header, body?: any): Promise;
+ send(request: Request): Promise;
+ onData: (buffer: Buffer) => void;
+ onResponse(response: Response): void;
+ onError: (err: Error) => void;
+ onClose: (hadError: boolean) => void;
+ echo(): Promise;
+ authenticate(options: AuthenticateOptions): Promise;
+ private destroySocket;
+ private registerSession;
+ close(): Promise;
+}
+export default Client;
diff --git a/dist/client/Client.js b/dist/client/Client.js
new file mode 100644
index 0000000..9850957
--- /dev/null
+++ b/dist/client/Client.js
@@ -0,0 +1,208 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const crypto_1 = __importDefault(require("crypto"));
+const net_1 = require("net");
+const events_1 = require("events");
+const Packet_1 = __importDefault(require("../protocol/Packet"));
+const Request_1 = __importDefault(require("../protocol/smb2/Request"));
+const Response_1 = __importDefault(require("../protocol/smb2/Response"));
+const StatusCode_1 = __importDefault(require("../protocol/smb2/StatusCode"));
+const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
+const Session_1 = __importDefault(require("./Session"));
+const structureUtil = __importStar(require("../protocol/structureUtil"));
+class Client extends events_1.EventEmitter {
+ constructor(host, options = {}) {
+ super();
+ this.host = host;
+ this.options = options;
+ this._id = crypto_1.default.randomBytes(4).toString("hex");
+ this.nextMessageId = 0n;
+ this.responseMap = new Map();
+ this.responseCallbackMap = new Map();
+ this.connected = false;
+ this.port = 445;
+ this.connectTimeout = 5 * 1000;
+ this.requestTimeout = 5 * 1000;
+ this.requestTimeoutIdMap = new Map();
+ this.sessions = [];
+ this.onData = (buffer) => {
+ if (this.responseRestChunk) {
+ buffer = Buffer.concat([this.responseRestChunk, buffer]);
+ this.responseRestChunk = undefined;
+ }
+ const { chunks, restChunk } = Packet_1.default.getChunks(buffer);
+ this.responseRestChunk = restChunk;
+ for (const chunk of chunks) {
+ const response = Response_1.default.parse(chunk);
+ this.onResponse(response);
+ }
+ };
+ this.onError = (err) => {
+ this.emit("error", err);
+ };
+ this.onClose = (hadError) => {
+ this.connected = false;
+ this.emit("error", new Error("client_closed"));
+ };
+ if (typeof this.options.port === "number")
+ this.port = this.options.port;
+ if (typeof this.options.connectTimeout === "number")
+ this.connectTimeout = this.options.connectTimeout;
+ if (typeof this.options.requestTimeout === "number")
+ this.requestTimeout = this.options.requestTimeout;
+ }
+ async connect() {
+ if (this.connected)
+ return;
+ this.socket = new net_1.Socket({ allowHalfOpen: true })
+ .addListener("data", this.onData)
+ .addListener("error", this.onError)
+ .addListener("close", this.onClose);
+ this.socket.setTimeout(0);
+ this.socket.setKeepAlive(true);
+ const connectPromise = new Promise((resolve, reject) => {
+ this.connectTimeoutId = setTimeout(() => {
+ reject(new Error("connect_timeout"));
+ }, this.connectTimeout);
+ this.socket.connect(this.port, this.host);
+ this.socket.once("connect", () => {
+ resolve();
+ });
+ this.socket.once("error", (err) => {
+ reject(err);
+ });
+ });
+ try {
+ await connectPromise;
+ clearTimeout(this.connectTimeoutId);
+ this.connected = true;
+ }
+ catch (err) {
+ this.destroySocket();
+ throw err;
+ }
+ }
+ createRequest(header = {}, body = {}) {
+ const messageId = this.nextMessageId++;
+ return new Request_1.default({
+ messageId,
+ clientId: this._id,
+ ...header
+ }, body);
+ }
+ async request(header, body) {
+ const request = this.createRequest(header, body);
+ return await this.send(request);
+ }
+ async send(request) {
+ if (!this.connected)
+ throw new Error("not_connected");
+ const buffer = request.serialize();
+ this.socket.write(buffer);
+ const messageId = request.header.messageId;
+ const sendPromise = new Promise((resolve, reject) => {
+ const requestTimeoutId = setTimeout(() => {
+ const err = new Error(`request_timeout: ${structureUtil.parseEnumValue(PacketType_1.default, request.header.type)}(${messageId})`);
+ reject(err);
+ }, this.requestTimeout);
+ this.requestTimeoutIdMap.set(messageId, requestTimeoutId);
+ const finishRequest = (response) => {
+ response.request = request;
+ if (response.header.status !== StatusCode_1.default.Success &&
+ response.header.status !== StatusCode_1.default.Pending &&
+ response.header.status !== StatusCode_1.default.MoreProcessingRequired &&
+ response.header.status !== StatusCode_1.default.FileClosed) {
+ reject(response);
+ }
+ else {
+ resolve(response);
+ }
+ };
+ if (this.responseMap.has(messageId)) {
+ finishRequest(this.responseMap.get(messageId));
+ this.responseMap.delete(messageId);
+ }
+ else if (!this.responseCallbackMap.has(messageId)) {
+ this.responseCallbackMap.set(messageId, finishRequest);
+ }
+ });
+ const response = await sendPromise;
+ if (this.requestTimeoutIdMap.has(messageId)) {
+ const requestTimeoutId = this.requestTimeoutIdMap.get(messageId);
+ clearTimeout(requestTimeoutId);
+ this.requestTimeoutIdMap.delete(messageId);
+ }
+ return response;
+ }
+ onResponse(response) {
+ if (response.header.type === PacketType_1.default.ChangeNotify &&
+ response.header.status === StatusCode_1.default.Success) {
+ this.emit("changeNotify", response);
+ }
+ const messageId = response.header.messageId;
+ if (this.responseCallbackMap.has(messageId)) {
+ this.responseCallbackMap.get(messageId)(response);
+ this.responseCallbackMap.delete(messageId);
+ }
+ else {
+ this.responseMap.set(messageId, response);
+ }
+ }
+ async echo() {
+ return await this.request({
+ type: PacketType_1.default.Echo
+ });
+ }
+ async authenticate(options) {
+ if (!this.connected)
+ await this.connect();
+ const session = new Session_1.default(this);
+ this.registerSession(session);
+ await session.authenticate(options);
+ return session;
+ }
+ destroySocket() {
+ this.socket
+ .removeListener("data", this.onData)
+ .removeListener("error", this.onError)
+ .removeListener("close", this.onClose);
+ this.socket.end();
+ this.socket.destroy();
+ delete this.socket;
+ }
+ registerSession(session) {
+ session
+ .once("authenticate", () => this.sessions.push(session))
+ .once("logoff", () => this.sessions.splice(this.sessions.indexOf(session), 1));
+ }
+ async close() {
+ if (!this.connected)
+ return;
+ await Promise.all(this.sessions.map(x => x.logoff()));
+ this.destroySocket();
+ this.connected = false;
+ }
+}
+exports.default = Client;
diff --git a/dist/client/Directory.d.ts b/dist/client/Directory.d.ts
new file mode 100644
index 0000000..b546f51
--- /dev/null
+++ b/dist/client/Directory.d.ts
@@ -0,0 +1,42 @@
+///
+import Tree from "./Tree";
+import { EventEmitter } from "events";
+import Response from "../protocol/smb2/Response";
+import DirectoryAccess from "../protocol/smb2/DirectoryAccess";
+import { CreateOptions } from "../protocol/smb2/packets/Create";
+import DirectoryEntry from "../protocol/models/DirectoryEntry";
+import CreateDispositionType from "../protocol/smb2/CreateDispositionType";
+interface OpenOptions {
+ desiredAccess?: DirectoryAccess;
+ createDisposition?: CreateDispositionType;
+ createOptions?: CreateOptions;
+}
+interface Directory {
+ on(event: "open" | "close", callback: (directory: Directory) => void): this;
+ on(event: "change", callback: (response: Response) => void): this;
+ once(event: "open" | "close", callback: (directory: Directory) => void): this;
+ once(event: "change", callback: (response: Response) => void): this;
+}
+declare class Directory extends EventEmitter {
+ private tree;
+ _id: string;
+ isOpen: boolean;
+ watching: boolean;
+ private watchingMessageIds;
+ private watchRecursive;
+ constructor(tree: Tree);
+ open(path: string, options?: OpenOptions): Promise;
+ create(path: string): Promise;
+ watch(recursive?: boolean): Promise;
+ unwatch(): Promise;
+ private onChangeNotify;
+ private requestWatch;
+ flush(): Promise;
+ read(): Promise;
+ exists(path: string): Promise;
+ remove(): Promise;
+ rename(newPath: string): Promise;
+ setInfo(fileInfoClass: number, buffer: Buffer): Promise;
+ close(): Promise;
+}
+export default Directory;
diff --git a/dist/client/Directory.js b/dist/client/Directory.js
new file mode 100644
index 0000000..2a4bc6e
--- /dev/null
+++ b/dist/client/Directory.js
@@ -0,0 +1,183 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const events_1 = require("events");
+const util = __importStar(require("../protocol/util"));
+const StatusCode_1 = __importDefault(require("../protocol/smb2/StatusCode"));
+const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
+const FileAttribute_1 = __importDefault(require("../protocol/smb2/FileAttribute"));
+const ShareAccessType_1 = __importDefault(require("../protocol/smb2/ShareAccessType"));
+const DirectoryAccess_1 = __importDefault(require("../protocol/smb2/DirectoryAccess"));
+const Create_1 = require("../protocol/smb2/packets/Create");
+const structureUtil = __importStar(require("../protocol/structureUtil"));
+const SetInfo_1 = require("../protocol/smb2/packets/SetInfo");
+const CreateDispositionType_1 = __importDefault(require("../protocol/smb2/CreateDispositionType"));
+const ChangeNotify_1 = require("../protocol/smb2/packets/ChangeNotify");
+class Directory extends events_1.EventEmitter {
+ constructor(tree) {
+ super();
+ this.tree = tree;
+ this.isOpen = false;
+ this.watching = false;
+ this.watchingMessageIds = [];
+ this.onChangeNotify = async (response) => {
+ const messageId = response.header.messageId;
+ const messageIdIndex = this.watchingMessageIds.indexOf(messageId);
+ if (messageIdIndex !== -1) {
+ this.watchingMessageIds.splice(messageIdIndex, 1);
+ this.emit("change", response);
+ await this.requestWatch();
+ }
+ };
+ }
+ async open(path, options = {}) {
+ if (this.isOpen)
+ return;
+ const buffer = Buffer.from(util.toWindowsFilePath(path), "ucs2");
+ const response = await this.tree.request({ type: PacketType_1.default.Create }, {
+ buffer,
+ desiredAccess: typeof options.desiredAccess === "number" ?
+ options.desiredAccess :
+ (DirectoryAccess_1.default.ListDirectory |
+ DirectoryAccess_1.default.ReadAttributes |
+ DirectoryAccess_1.default.Synchronize),
+ fileAttributes: FileAttribute_1.default.Directory,
+ shareAccess: ShareAccessType_1.default.Read |
+ ShareAccessType_1.default.Write |
+ ShareAccessType_1.default.Delete,
+ createDisposition: typeof options.createDisposition === "number" ?
+ options.createDisposition :
+ CreateDispositionType_1.default.Open,
+ createOptions: typeof options.createOptions === "number" ?
+ options.createOptions :
+ Create_1.CreateOptions.None,
+ nameOffset: 0x0078,
+ createContextsOffset: 0x007a + buffer.length
+ });
+ this._id = response.body.fileId;
+ this.isOpen = true;
+ this.emit("open", this);
+ }
+ async create(path) {
+ await this.open(path, {
+ createDisposition: CreateDispositionType_1.default.Create,
+ createOptions: Create_1.CreateOptions.Directory
+ });
+ }
+ async watch(recursive = true) {
+ if (this.watching)
+ return;
+ this.watching = true;
+ this.watchRecursive = recursive;
+ await this.requestWatch();
+ this.tree.session.client.addListener("changeNotify", this.onChangeNotify);
+ }
+ async unwatch() {
+ if (!this.watching)
+ return;
+ this.watching = false;
+ this.tree.session.client.removeListener("changeNotify", this.onChangeNotify);
+ await this.close();
+ }
+ async requestWatch() {
+ const request = this.tree.createRequest({ type: PacketType_1.default.ChangeNotify }, {
+ flags: this.watchRecursive ?
+ ChangeNotify_1.Flags.WatchTreeRecursively :
+ ChangeNotify_1.Flags.None,
+ fileId: this._id
+ });
+ this.watchingMessageIds.push(request.header.messageId);
+ const response = await this.tree.session.client.send(request);
+ if (response.header.status !== StatusCode_1.default.Success &&
+ response.header.status !== StatusCode_1.default.Pending)
+ throw new Error(`ChangeNotify: ${structureUtil.parseEnumValue(StatusCode_1.default, response.header.status)} (${response.header.status})`);
+ return response;
+ }
+ async flush() {
+ await this.tree.request({
+ type: PacketType_1.default.Flush
+ }, {
+ fileId: this._id
+ });
+ }
+ async read() {
+ const response = await this.tree.request({ type: PacketType_1.default.QueryDirectory }, {
+ fileId: this._id,
+ buffer: Buffer.from("*", "ucs2")
+ });
+ let entries = [];
+ if (response.data) {
+ entries = response.data.filter(x => x.filename !== "." && x.filename !== "..");
+ }
+ else {
+ console.warn("response without data", response);
+ }
+ return entries;
+ }
+ async exists(path) {
+ try {
+ await this.open(path);
+ }
+ catch (err) {
+ if (err.header.status === StatusCode_1.default.FileNameNotFound ||
+ err.header.status === StatusCode_1.default.FilePathNotFound) {
+ return false;
+ }
+ throw err;
+ }
+ return true;
+ }
+ async remove() {
+ const buffer = Buffer.alloc(1);
+ buffer.writeUInt8(1, 0);
+ await this.setInfo(SetInfo_1.FileInfoClass.DispositionInformation, buffer);
+ }
+ async rename(newPath) {
+ const newPathUCS2 = Buffer.from(newPath, "ucs2");
+ const buffer = Buffer.alloc(1 + 7 + 8 + 4 + newPathUCS2.length);
+ buffer.fill(0x00);
+ buffer.writeUInt8(1, 0);
+ buffer.writeUInt32LE(newPathUCS2.length, 16);
+ buffer.fill(newPathUCS2, 20);
+ await this.setInfo(SetInfo_1.FileInfoClass.RenameInformation, buffer);
+ }
+ async setInfo(fileInfoClass, buffer) {
+ await this.tree.request({ type: PacketType_1.default.SetInfo }, {
+ infoType: SetInfo_1.InfoType.File,
+ fileId: this._id,
+ fileInfoClass,
+ buffer
+ });
+ }
+ async close() {
+ if (this.watching)
+ return await this.unwatch();
+ if (!this.isOpen)
+ return;
+ this.isOpen = false;
+ await this.tree.request({ type: PacketType_1.default.Close }, { fileId: this._id });
+ this.emit("close", this);
+ }
+}
+exports.default = Directory;
diff --git a/dist/client/File.d.ts b/dist/client/File.d.ts
new file mode 100644
index 0000000..769e6e7
--- /dev/null
+++ b/dist/client/File.d.ts
@@ -0,0 +1,33 @@
+///
+import Tree from "./Tree";
+import { EventEmitter } from "events";
+import { CreateOptions } from "../protocol/smb2/packets/Create";
+import CreateDispositionType from "../protocol/smb2/CreateDispositionType";
+import FilePipePrinterAccess from "../protocol/smb2/FilePipePrinterAccess";
+interface OpenOptions {
+ desiredAccess?: FilePipePrinterAccess;
+ createDisposition?: CreateDispositionType;
+ createOptions?: CreateOptions;
+}
+interface File {
+ on(event: "open" | "close", callback: (file: File) => void): this;
+ once(event: "open" | "close", callback: (file: File) => void): this;
+}
+declare class File extends EventEmitter {
+ private tree;
+ _id: Buffer;
+ isOpen: boolean;
+ fileSize: bigint;
+ constructor(tree: Tree);
+ open(path: string, options?: OpenOptions): Promise;
+ create(path: string): Promise;
+ remove(): Promise;
+ rename(newPath: string): Promise;
+ setSize(size: bigint): Promise;
+ setInfo(fileInfoClass: number, buffer: Buffer): Promise;
+ write(content: Buffer | string): Promise;
+ read(): Promise;
+ exists(path: string): Promise;
+ close(): Promise;
+}
+export default File;
diff --git a/dist/client/File.js b/dist/client/File.js
new file mode 100644
index 0000000..3809e1b
--- /dev/null
+++ b/dist/client/File.js
@@ -0,0 +1,161 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const events_1 = require("events");
+const util = __importStar(require("../protocol/util"));
+const StatusCode_1 = __importDefault(require("../protocol/smb2/StatusCode"));
+const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
+const FileAttribute_1 = __importDefault(require("../protocol/smb2/FileAttribute"));
+const ShareAccessType_1 = __importDefault(require("../protocol/smb2/ShareAccessType"));
+const Create_1 = require("../protocol/smb2/packets/Create");
+const CreateDispositionType_1 = __importDefault(require("../protocol/smb2/CreateDispositionType"));
+const FilePipePrinterAccess_1 = __importDefault(require("../protocol/smb2/FilePipePrinterAccess"));
+const SetInfo_1 = require("../protocol/smb2/packets/SetInfo");
+const maxReadChunkLength = 0x00010000;
+const maxWriteChunkLength = 0x00010000 - 0x71;
+class File extends events_1.EventEmitter {
+ constructor(tree) {
+ super();
+ this.tree = tree;
+ }
+ async open(path, options = {}) {
+ if (this.isOpen)
+ return;
+ const buffer = Buffer.from(util.toWindowsFilePath(path), "ucs2");
+ const response = await this.tree.request({ type: PacketType_1.default.Create }, {
+ buffer,
+ desiredAccess: typeof options.desiredAccess === "number" ?
+ options.desiredAccess :
+ FilePipePrinterAccess_1.default.ReadData,
+ fileAttributes: FileAttribute_1.default.Normal,
+ shareAccess: ShareAccessType_1.default.Read |
+ ShareAccessType_1.default.Write |
+ ShareAccessType_1.default.Delete,
+ createDisposition: typeof options.createDisposition === "number" ?
+ options.createDisposition :
+ CreateDispositionType_1.default.Open,
+ createOptions: typeof options.createDisposition === "number" ?
+ options.createDisposition :
+ Create_1.CreateOptions.None,
+ nameOffset: 0x0078,
+ createContextsOffset: 0x007a + buffer.length
+ });
+ this._id = response.body.fileId;
+ this.fileSize = response.body.endOfFile;
+ this.isOpen = true;
+ this.emit("open", this);
+ }
+ async create(path) {
+ await this.open(path, {
+ desiredAccess: FilePipePrinterAccess_1.default.WriteData,
+ createDisposition: CreateDispositionType_1.default.Create
+ });
+ }
+ async remove() {
+ const buffer = Buffer.alloc(1);
+ buffer.writeUInt8(1, 0);
+ await this.setInfo(SetInfo_1.FileInfoClass.DispositionInformation, buffer);
+ }
+ async rename(newPath) {
+ const newPathUCS2 = Buffer.from(newPath, "ucs2");
+ const buffer = Buffer.alloc(1 + 7 + 8 + 4 + newPathUCS2.length);
+ buffer.fill(0x00);
+ buffer.writeUInt8(1, 0);
+ buffer.writeUInt32LE(newPathUCS2.length, 16);
+ buffer.fill(newPathUCS2, 20);
+ await this.setInfo(SetInfo_1.FileInfoClass.RenameInformation, buffer);
+ }
+ async setSize(size) {
+ const buffer = Buffer.alloc(8);
+ buffer.writeBigInt64LE(size);
+ await this.setInfo(SetInfo_1.FileInfoClass.EndOfFileInformation, buffer);
+ }
+ async setInfo(fileInfoClass, buffer) {
+ await this.tree.request({ type: PacketType_1.default.SetInfo }, {
+ infoType: SetInfo_1.InfoType.File,
+ fileId: this._id,
+ fileInfoClass,
+ buffer
+ });
+ }
+ async write(content) {
+ const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content, "utf8");
+ const chunkCount = Math.ceil(buffer.length / maxWriteChunkLength);
+ for (let index = 0; index < chunkCount; index++) {
+ const offset = index * maxWriteChunkLength;
+ const nextOffset = (index + 1) * maxWriteChunkLength;
+ const length = nextOffset > buffer.length ? buffer.length - offset : nextOffset - offset;
+ const chunk = buffer.slice(offset, offset + length);
+ const offsetBuffer = Buffer.alloc(8);
+ offsetBuffer.writeBigUInt64LE(BigInt(offset));
+ await this.tree.request({ type: PacketType_1.default.Write }, {
+ fileId: this._id,
+ buffer: chunk,
+ offset: offsetBuffer
+ });
+ }
+ }
+ async read() {
+ const fileSize = Number(this.fileSize);
+ const chunkCount = Math.ceil(fileSize / maxReadChunkLength);
+ const buffer = Buffer.alloc(fileSize);
+ for (let index = 0; index < chunkCount; index++) {
+ const offset = index * maxReadChunkLength;
+ const nextOffset = (index + 1) * maxReadChunkLength;
+ const length = nextOffset > fileSize ? fileSize - offset : nextOffset - offset;
+ const lengthBuffer = Buffer.alloc(4);
+ lengthBuffer.writeInt32LE(length, 0);
+ const offsetBuffer = Buffer.alloc(8);
+ offsetBuffer.writeBigUInt64LE(BigInt(offset));
+ const response = await this.tree.request({ type: PacketType_1.default.Read }, {
+ fileId: this._id,
+ length: lengthBuffer,
+ offset: offsetBuffer
+ });
+ response.body.buffer.copy(buffer, offset);
+ }
+ return buffer;
+ }
+ async exists(path) {
+ try {
+ await this.open(path);
+ }
+ catch (err) {
+ if (err.header.status === StatusCode_1.default.FileNameNotFound ||
+ err.header.status === StatusCode_1.default.FilePathNotFound) {
+ return false;
+ }
+ throw err;
+ }
+ return true;
+ }
+ async close() {
+ if (!this.isOpen)
+ return;
+ this.isOpen = false;
+ await this.tree.request({ type: PacketType_1.default.Close }, { fileId: this._id });
+ this.emit("close", this);
+ }
+}
+exports.default = File;
diff --git a/dist/client/Session.d.ts b/dist/client/Session.d.ts
new file mode 100644
index 0000000..825bf75
--- /dev/null
+++ b/dist/client/Session.d.ts
@@ -0,0 +1,28 @@
+///
+import Tree from "./Tree";
+import Client from "./Client";
+import { EventEmitter } from "events";
+import Header from "../protocol/smb2/Header";
+export interface AuthenticateOptions {
+ domain: string;
+ username: string;
+ password: string;
+}
+interface Session {
+ on(event: "authenticate" | "logoff", callback: (session: Session) => void): this;
+ once(event: "authenticate" | "logoff", callback: (session: Session) => void): this;
+}
+declare class Session extends EventEmitter {
+ client: Client;
+ _id: string;
+ authenticated: boolean;
+ connectedTrees: Tree[];
+ constructor(client: Client);
+ connectTree(path: string): Promise;
+ createRequest(header?: Header, body?: any): import("../protocol/smb2/Request").default;
+ request(header?: Header, body?: any): Promise;
+ authenticate(options: AuthenticateOptions): Promise;
+ private registerTree;
+ logoff(): Promise;
+}
+export default Session;
diff --git a/dist/client/Session.js b/dist/client/Session.js
new file mode 100644
index 0000000..b1c223d
--- /dev/null
+++ b/dist/client/Session.js
@@ -0,0 +1,90 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Tree_1 = __importDefault(require("./Tree"));
+const events_1 = require("events");
+const Dialect_1 = __importDefault(require("../protocol/smb2/Dialect"));
+const ntlmUtil = __importStar(require("../protocol/ntlm/util"));
+const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
+class Session extends events_1.EventEmitter {
+ constructor(client) {
+ super();
+ this.client = client;
+ this.authenticated = false;
+ this.connectedTrees = [];
+ }
+ async connectTree(path) {
+ const tree = new Tree_1.default(this);
+ this.registerTree(tree);
+ await tree.connect(path);
+ return tree;
+ }
+ createRequest(header = {}, body = {}) {
+ return this.client.createRequest({
+ sessionId: this._id,
+ ...header
+ }, body);
+ }
+ async request(header = {}, body = {}) {
+ return await this.client.request({
+ sessionId: this._id,
+ ...header
+ }, body);
+ }
+ async authenticate(options) {
+ if (this.authenticated)
+ return;
+ await this.request({
+ type: PacketType_1.default.Negotiate
+ }, {
+ dialects: [
+ Dialect_1.default.Smb202,
+ Dialect_1.default.Smb210
+ ]
+ });
+ const sessionSetupResponse = await this.request({ type: PacketType_1.default.SessionSetup }, { buffer: ntlmUtil.encodeNegotiationMessage(this.client.host, options.domain) });
+ this._id = sessionSetupResponse.header.sessionId;
+ const nonce = ntlmUtil.decodeChallengeMessage(sessionSetupResponse.body.buffer);
+ await this.request({ type: PacketType_1.default.SessionSetup }, {
+ buffer: ntlmUtil.encodeAuthenticationMessage(options.username, this.client.host, options.domain, nonce, options.password)
+ });
+ this.authenticated = true;
+ this.emit("authenticate", this);
+ }
+ registerTree(tree) {
+ tree
+ .once("connect", () => this.connectedTrees.push(tree))
+ .once("disconnect", () => this.connectedTrees.splice(this.connectedTrees.indexOf(tree), 1));
+ }
+ async logoff() {
+ if (!this.authenticated)
+ return;
+ this.authenticated = false;
+ await Promise.all(this.connectedTrees.map(x => x.disconnect()));
+ await this.request({ type: PacketType_1.default.LogOff });
+ delete this._id;
+ this.emit("logoff", this);
+ }
+}
+exports.default = Session;
diff --git a/dist/client/Tree.d.ts b/dist/client/Tree.d.ts
new file mode 100644
index 0000000..1ae7615
--- /dev/null
+++ b/dist/client/Tree.d.ts
@@ -0,0 +1,38 @@
+///
+import File from "./File";
+import Session from "./Session";
+import Directory from "./Directory";
+import { EventEmitter } from "events";
+import Header from "../protocol/smb2/Header";
+import Response from "../protocol/smb2/Response";
+interface Tree {
+ on(event: "connect" | "disconnect", callback: (tree: Tree) => void): this;
+ once(event: "connect" | "disconnect", callback: (tree: Tree) => void): this;
+}
+declare class Tree extends EventEmitter {
+ session: Session;
+ _id: number;
+ connected: boolean;
+ connecting: boolean;
+ openFiles: File[];
+ openDirectories: Directory[];
+ constructor(session: Session);
+ connect(path: string): Promise;
+ disconnect(): Promise;
+ createDirectory(path: string): Promise;
+ removeDirectory(path: string): Promise;
+ renameDirectory(path: string, newPath: string): Promise;
+ watch(onChange?: (response: Response) => void, recursive?: boolean): Promise<() => Promise>;
+ watchDirectory(path: string, onChange: (response: Response) => void, recursive?: boolean): Promise<() => Promise>;
+ readDirectory(path?: string): Promise;
+ exists(path: string): Promise;
+ createFile(path: string, content?: Buffer | string): Promise;
+ removeFile(path: string): Promise;
+ renameFile(path: string, newPath: string): Promise;
+ readFile(path: string): Promise;
+ private registerFile;
+ private registerDirectory;
+ createRequest(header?: Header, body?: any): import("../protocol/smb2/Request").default;
+ request(header?: Header, body?: any): Promise;
+}
+export default Tree;
diff --git a/dist/client/Tree.js b/dist/client/Tree.js
new file mode 100644
index 0000000..b12556f
--- /dev/null
+++ b/dist/client/Tree.js
@@ -0,0 +1,167 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const File_1 = __importDefault(require("./File"));
+const Directory_1 = __importDefault(require("./Directory"));
+const events_1 = require("events");
+const util = __importStar(require("../protocol/util"));
+const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
+const DirectoryAccess_1 = __importDefault(require("../protocol/smb2/DirectoryAccess"));
+const FilePipePrinterAccess_1 = __importDefault(require("../protocol/smb2/FilePipePrinterAccess"));
+class Tree extends events_1.EventEmitter {
+ constructor(session) {
+ super();
+ this.session = session;
+ this.connected = false;
+ this.connecting = false;
+ this.openFiles = [];
+ this.openDirectories = [];
+ }
+ async connect(path) {
+ if (this.connected || this.connecting)
+ return;
+ this.connecting = true;
+ const buffer = Buffer.from(util.toWindowsPath(`//${this.session.client.host}:${this.session.client.port}/${path}`), "ucs2");
+ const response = await this.request({ type: PacketType_1.default.TreeConnect }, { buffer });
+ this._id = response.header.treeId;
+ this.connecting = false;
+ this.connected = true;
+ this.emit("connect", this);
+ }
+ async disconnect() {
+ if (!this.connected)
+ return;
+ this.connected = false;
+ await Promise.all([
+ ...this.openFiles.map(x => x.close()),
+ ...this.openDirectories.map(x => x.close())
+ ]);
+ await this.request({ type: PacketType_1.default.TreeDisconnect });
+ this.emit("disconnect", this);
+ }
+ async createDirectory(path) {
+ const directory = new Directory_1.default(this);
+ this.registerDirectory(directory);
+ await directory.create(path);
+ await directory.close();
+ }
+ async removeDirectory(path) {
+ const directory = new Directory_1.default(this);
+ this.registerDirectory(directory);
+ await directory.open(path, { desiredAccess: DirectoryAccess_1.default.Delete });
+ await directory.remove();
+ await directory.close();
+ }
+ async renameDirectory(path, newPath) {
+ const directory = new Directory_1.default(this);
+ this.registerDirectory(directory);
+ await directory.open(path, { desiredAccess: DirectoryAccess_1.default.MaximumAllowed });
+ await directory.rename(newPath);
+ await directory.close();
+ }
+ async watch(onChange, recursive) {
+ return await this.watchDirectory("", onChange, recursive);
+ }
+ async watchDirectory(path = "/", onChange, recursive) {
+ const directory = new Directory_1.default(this);
+ this.registerDirectory(directory);
+ await directory.open(path);
+ await directory.watch(recursive);
+ directory.addListener("change", onChange);
+ return async () => {
+ directory.removeListener("change", onChange);
+ await directory.unwatch();
+ };
+ }
+ async readDirectory(path = "/") {
+ const directory = new Directory_1.default(this);
+ this.registerDirectory(directory);
+ await directory.open(path);
+ const entries = await directory.read();
+ await directory.close();
+ return entries;
+ }
+ async exists(path) {
+ const file = new File_1.default(this);
+ this.registerFile(file);
+ const exists = await file.exists(path);
+ await file.close();
+ return exists;
+ }
+ async createFile(path, content) {
+ const file = new File_1.default(this);
+ this.registerFile(file);
+ await file.create(path);
+ if (typeof content !== "undefined") {
+ await file.setSize(BigInt(content.length));
+ await file.write(content);
+ }
+ await file.close();
+ }
+ async removeFile(path) {
+ const file = new File_1.default(this);
+ this.registerFile(file);
+ await file.open(path, { desiredAccess: FilePipePrinterAccess_1.default.Delete });
+ await file.remove();
+ await file.close();
+ }
+ async renameFile(path, newPath) {
+ const file = new File_1.default(this);
+ this.registerFile(file);
+ await file.open(path, { desiredAccess: FilePipePrinterAccess_1.default.MaximumAllowed });
+ await file.rename(newPath);
+ await file.close();
+ }
+ async readFile(path) {
+ const file = new File_1.default(this);
+ this.registerFile(file);
+ await file.open(path);
+ const buffer = await file.read();
+ await file.close();
+ return buffer;
+ }
+ registerFile(file) {
+ file
+ .once("open", () => this.openFiles.push(file))
+ .once("close", () => this.openFiles.splice(this.openFiles.indexOf(file), 1));
+ }
+ registerDirectory(directory) {
+ directory
+ .once("open", () => this.openDirectories.push(directory))
+ .once("close", () => this.openDirectories.splice(this.openDirectories.indexOf(directory), 1));
+ }
+ createRequest(header = {}, body = {}) {
+ return this.session.createRequest({
+ treeId: this._id,
+ ...header
+ }, body);
+ }
+ request(header = {}, body = {}) {
+ return this.session.request({
+ treeId: this._id,
+ ...header
+ }, body);
+ }
+}
+exports.default = Tree;
diff --git a/dist/index.d.ts b/dist/index.d.ts
new file mode 100644
index 0000000..48f3871
--- /dev/null
+++ b/dist/index.d.ts
@@ -0,0 +1,6 @@
+import { default as Client } from "./client/Client";
+export { Client, };
+declare const _default: {
+ Client: typeof Client;
+};
+export default _default;
diff --git a/dist/index.js b/dist/index.js
new file mode 100644
index 0000000..1350f5e
--- /dev/null
+++ b/dist/index.js
@@ -0,0 +1,11 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Client = void 0;
+const Client_1 = __importDefault(require("./client/Client"));
+Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return Client_1.default; } });
+exports.default = {
+ Client: Client_1.default,
+};
diff --git a/dist/protocol/Packet.d.ts b/dist/protocol/Packet.d.ts
new file mode 100644
index 0000000..2a7cc4f
--- /dev/null
+++ b/dist/protocol/Packet.d.ts
@@ -0,0 +1,10 @@
+///
+import StructureField from "./StructureField";
+export declare const protocolIdStructureField: StructureField;
+export default class Packet {
+ static parseProtocolId(buffer: Buffer): string;
+ static getChunks(buffer: Buffer): {
+ chunks: Buffer[];
+ restChunk: Buffer;
+ };
+}
diff --git a/dist/protocol/Packet.js b/dist/protocol/Packet.js
new file mode 100644
index 0000000..0ec492e
--- /dev/null
+++ b/dist/protocol/Packet.js
@@ -0,0 +1,54 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.protocolIdStructureField = void 0;
+const protocolIds = __importStar(require("./protocolIds"));
+const structureUtil = __importStar(require("./structureUtil"));
+exports.protocolIdStructureField = {
+ type: String,
+ encoding: "hex",
+ size: 4,
+ defaultValue: protocolIds.smb2
+};
+class Packet {
+ static parseProtocolId(buffer) {
+ return structureUtil.parseValue(buffer, exports.protocolIdStructureField);
+ }
+ static getChunks(buffer) {
+ const chunks = [];
+ while (buffer.length > 4) {
+ const netBiosType = buffer.readUInt8(0);
+ if (netBiosType !== 0x00)
+ throw new Error("no_net_bios_message");
+ const packetLength = buffer.readUInt32BE(0);
+ if (packetLength > buffer.length - 4)
+ break;
+ buffer = buffer.slice(4);
+ chunks.push(buffer.slice(0, packetLength));
+ buffer = buffer.slice(packetLength);
+ }
+ return {
+ chunks,
+ restChunk: buffer
+ };
+ }
+}
+exports.default = Packet;
diff --git a/dist/protocol/Request.d.ts b/dist/protocol/Request.d.ts
new file mode 100644
index 0000000..42dc0d9
--- /dev/null
+++ b/dist/protocol/Request.d.ts
@@ -0,0 +1,9 @@
+///
+import Response from "./Response";
+export default abstract class Request {
+ header: any;
+ body: any;
+ response?: Response;
+ constructor(header?: any, body?: any);
+ abstract serialize(): Buffer;
+}
diff --git a/dist/protocol/Request.js b/dist/protocol/Request.js
new file mode 100644
index 0000000..89111ed
--- /dev/null
+++ b/dist/protocol/Request.js
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+class Request {
+ constructor(header = {}, body = {}) {
+ this.header = header;
+ this.body = body;
+ }
+}
+exports.default = Request;
diff --git a/dist/protocol/Response.d.ts b/dist/protocol/Response.d.ts
new file mode 100644
index 0000000..fb05f9d
--- /dev/null
+++ b/dist/protocol/Response.d.ts
@@ -0,0 +1,9 @@
+///
+import Request from "./Request";
+export default abstract class Response {
+ header: any;
+ body: any;
+ request?: Request;
+ constructor(header?: any, body?: any);
+ abstract serialize(): Buffer;
+}
diff --git a/dist/protocol/Response.js b/dist/protocol/Response.js
new file mode 100644
index 0000000..2012baa
--- /dev/null
+++ b/dist/protocol/Response.js
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+class Response {
+ constructor(header = {}, body = {}) {
+ this.header = header;
+ this.body = body;
+ }
+}
+exports.default = Response;
diff --git a/dist/protocol/Structure.d.ts b/dist/protocol/Structure.d.ts
new file mode 100644
index 0000000..2c09eba
--- /dev/null
+++ b/dist/protocol/Structure.d.ts
@@ -0,0 +1,5 @@
+import StructureField from "./StructureField";
+declare type Structure = {
+ [key: string]: StructureField;
+};
+export default Structure;
diff --git a/dist/protocol/Structure.js b/dist/protocol/Structure.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/protocol/Structure.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/StructureField.d.ts b/dist/protocol/StructureField.d.ts
new file mode 100644
index 0000000..ecb2c2e
--- /dev/null
+++ b/dist/protocol/StructureField.d.ts
@@ -0,0 +1,14 @@
+///
+import Value from "./Value";
+declare type StructureField = {
+ type: NumberConstructor | typeof Buffer | StringConstructor;
+ enum?: any;
+ signedness?: "Signed" | "Unsigned";
+ encoding?: "hex";
+ countFieldName?: string;
+ count?: number;
+ sizeFieldName?: string;
+ size?: number;
+ defaultValue?: Value;
+};
+export default StructureField;
diff --git a/dist/protocol/StructureField.js b/dist/protocol/StructureField.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/protocol/StructureField.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/Value.d.ts b/dist/protocol/Value.d.ts
new file mode 100644
index 0000000..3296edf
--- /dev/null
+++ b/dist/protocol/Value.d.ts
@@ -0,0 +1,3 @@
+///
+declare type Value = number | bigint | string | Buffer | Value[];
+export default Value;
diff --git a/dist/protocol/Value.js b/dist/protocol/Value.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/protocol/Value.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/models/ChangeEntry.d.ts b/dist/protocol/models/ChangeEntry.d.ts
new file mode 100644
index 0000000..bc2229e
--- /dev/null
+++ b/dist/protocol/models/ChangeEntry.d.ts
@@ -0,0 +1,6 @@
+import FileAction from "../smb2/FileAction";
+export default interface ChangeEntry {
+ action: FileAction;
+ actionName: string;
+ filename: string;
+}
diff --git a/dist/protocol/models/ChangeEntry.js b/dist/protocol/models/ChangeEntry.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/protocol/models/ChangeEntry.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/models/DirectoryEntry.d.ts b/dist/protocol/models/DirectoryEntry.d.ts
new file mode 100644
index 0000000..6a2cd3e
--- /dev/null
+++ b/dist/protocol/models/DirectoryEntry.d.ts
@@ -0,0 +1,15 @@
+export default interface DirectoryEntry {
+ index: number;
+ type: "File" | "Directory";
+ creationTime: Date;
+ lastAccessTime: Date;
+ lastWriteTime: Date;
+ changeTime: Date;
+ fileSize: BigInt;
+ allocationSize: BigInt;
+ shortFilename?: string;
+ eaSize: number;
+ fileId: string;
+ filename: string;
+ fileAttributes: string[];
+}
diff --git a/dist/protocol/models/DirectoryEntry.js b/dist/protocol/models/DirectoryEntry.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/protocol/models/DirectoryEntry.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/ntlm/NegotiateFlag.d.ts b/dist/protocol/ntlm/NegotiateFlag.d.ts
new file mode 100644
index 0000000..bf567c3
--- /dev/null
+++ b/dist/protocol/ntlm/NegotiateFlag.d.ts
@@ -0,0 +1,25 @@
+declare enum NegotiateFlag {
+ UnicodeEncoding = 1,
+ OemEncoding = 2,
+ TargetNameSupplied = 4,
+ Sign = 16,
+ Seal = 32,
+ Diagram = 64,
+ LanManagerSessionKey = 128,
+ NTLMSessionSecurity = 512,
+ Anonymous = 2048,
+ DomainNameSupplied = 4096,
+ WorkstationNameSupplied = 8192,
+ AlwaysSign = 32768,
+ TargetTypeDomain = 65536,
+ TargetTypeServer = 131072,
+ ExtendedSessionSecurity = 524288,
+ Identify = 1048576,
+ RequestNonNtSessionKey = 4194304,
+ TargetInfo = 8388608,
+ Version = 33554432,
+ Use128BitEncryption = 536870912,
+ KeyExchange = 1073741824,
+ Use56BitEncryption = -2147483648
+}
+export default NegotiateFlag;
diff --git a/dist/protocol/ntlm/NegotiateFlag.js b/dist/protocol/ntlm/NegotiateFlag.js
new file mode 100644
index 0000000..9eb8066
--- /dev/null
+++ b/dist/protocol/ntlm/NegotiateFlag.js
@@ -0,0 +1,28 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var NegotiateFlag;
+(function (NegotiateFlag) {
+ NegotiateFlag[NegotiateFlag["UnicodeEncoding"] = 1] = "UnicodeEncoding";
+ NegotiateFlag[NegotiateFlag["OemEncoding"] = 2] = "OemEncoding";
+ NegotiateFlag[NegotiateFlag["TargetNameSupplied"] = 4] = "TargetNameSupplied";
+ NegotiateFlag[NegotiateFlag["Sign"] = 16] = "Sign";
+ NegotiateFlag[NegotiateFlag["Seal"] = 32] = "Seal";
+ NegotiateFlag[NegotiateFlag["Diagram"] = 64] = "Diagram";
+ NegotiateFlag[NegotiateFlag["LanManagerSessionKey"] = 128] = "LanManagerSessionKey";
+ NegotiateFlag[NegotiateFlag["NTLMSessionSecurity"] = 512] = "NTLMSessionSecurity";
+ NegotiateFlag[NegotiateFlag["Anonymous"] = 2048] = "Anonymous";
+ NegotiateFlag[NegotiateFlag["DomainNameSupplied"] = 4096] = "DomainNameSupplied";
+ NegotiateFlag[NegotiateFlag["WorkstationNameSupplied"] = 8192] = "WorkstationNameSupplied";
+ NegotiateFlag[NegotiateFlag["AlwaysSign"] = 32768] = "AlwaysSign";
+ NegotiateFlag[NegotiateFlag["TargetTypeDomain"] = 65536] = "TargetTypeDomain";
+ NegotiateFlag[NegotiateFlag["TargetTypeServer"] = 131072] = "TargetTypeServer";
+ NegotiateFlag[NegotiateFlag["ExtendedSessionSecurity"] = 524288] = "ExtendedSessionSecurity";
+ NegotiateFlag[NegotiateFlag["Identify"] = 1048576] = "Identify";
+ NegotiateFlag[NegotiateFlag["RequestNonNtSessionKey"] = 4194304] = "RequestNonNtSessionKey";
+ NegotiateFlag[NegotiateFlag["TargetInfo"] = 8388608] = "TargetInfo";
+ NegotiateFlag[NegotiateFlag["Version"] = 33554432] = "Version";
+ NegotiateFlag[NegotiateFlag["Use128BitEncryption"] = 536870912] = "Use128BitEncryption";
+ NegotiateFlag[NegotiateFlag["KeyExchange"] = 1073741824] = "KeyExchange";
+ NegotiateFlag[NegotiateFlag["Use56BitEncryption"] = -2147483648] = "Use56BitEncryption";
+})(NegotiateFlag || (NegotiateFlag = {}));
+exports.default = NegotiateFlag;
diff --git a/dist/protocol/ntlm/util.d.ts b/dist/protocol/ntlm/util.d.ts
new file mode 100644
index 0000000..c3cc2a6
--- /dev/null
+++ b/dist/protocol/ntlm/util.d.ts
@@ -0,0 +1,11 @@
+///
+export declare const encodeNegotiationMessage: (hostname: string, domain: string) => Buffer;
+export declare const decodeNegotiationMessage: (buffer: Buffer) => {
+ negotiateFlags: number;
+ domain: string;
+ hostname: string;
+};
+export declare const encodeChallengeMessage: (negotiateFlags: number) => Buffer;
+export declare const decodeChallengeMessage: (buffer: Buffer) => Buffer;
+export declare const encodeAuthenticationMessage: (username: string, hostname: string, domain: string, nonce: Buffer, password: string) => Buffer;
+export declare const generateServerChallenge: () => Buffer;
diff --git a/dist/protocol/ntlm/util.js b/dist/protocol/ntlm/util.js
new file mode 100644
index 0000000..0b9c7e6
--- /dev/null
+++ b/dist/protocol/ntlm/util.js
@@ -0,0 +1,225 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.generateServerChallenge = exports.encodeAuthenticationMessage = exports.decodeChallengeMessage = exports.encodeChallengeMessage = exports.decodeNegotiationMessage = exports.encodeNegotiationMessage = void 0;
+const crypto_1 = __importDefault(require("crypto"));
+const httpntlm_1 = __importDefault(require("httpntlm"));
+const NegotiateFlag_1 = __importDefault(require("./NegotiateFlag"));
+exports.encodeNegotiationMessage = (hostname, domain) => {
+ hostname = hostname.toUpperCase();
+ domain = domain.toUpperCase();
+ const hostnameLength = Buffer.byteLength(hostname, 'ascii');
+ const domainLength = Buffer.byteLength(domain, 'ascii');
+ let offset = 0;
+ const buffer = Buffer.alloc(32 + hostnameLength + domainLength);
+ buffer.write('NTLMSSP', offset, 7, 'ascii');
+ offset += 7;
+ buffer.writeUInt8(0, offset);
+ offset += 1;
+ buffer.writeUInt32LE(1, offset);
+ offset += 4;
+ const negotiateFlags = NegotiateFlag_1.default.UnicodeEncoding |
+ NegotiateFlag_1.default.NTLMSessionSecurity |
+ NegotiateFlag_1.default.AlwaysSign;
+ buffer.writeUInt32LE(negotiateFlags, offset);
+ offset += 4;
+ buffer.writeUInt16LE(domainLength, offset);
+ offset += 2;
+ buffer.writeUInt16LE(domainLength, offset);
+ offset += 2;
+ const domainOffset = 0x20 + hostnameLength;
+ buffer.writeUInt32LE(domainOffset, offset);
+ offset += 4;
+ buffer.writeUInt16LE(hostnameLength, offset);
+ offset += 2;
+ buffer.writeUInt16LE(hostnameLength, offset);
+ offset += 2;
+ buffer.writeUInt32LE(0x20, offset);
+ offset += 4;
+ buffer.write(hostname, 0x20, hostnameLength, 'ascii');
+ buffer.write(domain, domainOffset, domainLength, 'ascii');
+ return buffer;
+};
+exports.decodeNegotiationMessage = (buffer) => {
+ let offset = 0;
+ const protocol = buffer.slice(0, 7).toString('ascii');
+ if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
+ throw new Error('ntlmssp_header_not_found');
+ offset += 8;
+ const type = buffer.readUInt32LE(offset);
+ if (type !== 0x01)
+ throw new Error('ntlmssp_type_is_not_one');
+ offset += 4;
+ const negotiateFlags = buffer.readUInt32LE(offset);
+ offset += 4;
+ const domainLength = buffer.readUInt16LE(offset);
+ offset += 2;
+ const domainMaxLength = buffer.readUInt16LE(offset);
+ offset += 2;
+ const domainOffset = buffer.readUInt32LE(offset);
+ offset += 4;
+ const hostnameLength = buffer.readUInt16LE(offset);
+ offset += 2;
+ const hostnameMaxLength = buffer.readUInt16LE(offset);
+ offset += 2;
+ const hostnameOffset = buffer.readUInt32LE(offset);
+ offset += 4;
+ const domain = buffer
+ .slice(domainOffset, domainOffset + domainLength)
+ .toString('ascii');
+ const hostname = buffer
+ .slice(hostnameOffset, hostnameOffset + hostnameLength)
+ .toString('ascii');
+ return {
+ negotiateFlags,
+ domain,
+ hostname
+ };
+};
+exports.encodeChallengeMessage = (negotiateFlags) => {
+ let offset = 0;
+ const buffer = Buffer.alloc(64);
+ buffer.write('NTLMSSP', offset, 7, 'ascii');
+ offset += 7;
+ buffer.writeUInt8(0, offset);
+ offset += 1;
+ buffer.writeUInt32LE(2, offset);
+ offset += 4;
+ buffer.writeUInt16LE(0, offset);
+ offset += 2;
+ buffer.writeUInt16LE(0, offset);
+ offset += 2;
+ buffer.writeUInt32LE(0, offset);
+ offset += 4;
+ buffer.writeUInt32LE(negotiateFlags, offset);
+ offset += 4;
+ exports.generateServerChallenge().copy(buffer, offset);
+ offset += 8;
+ buffer.fill(0, offset, offset + 8);
+ offset += 8;
+ return buffer;
+};
+exports.decodeChallengeMessage = (buffer) => {
+ let offset = 0;
+ const protocol = buffer.slice(0, 7).toString('ascii');
+ if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
+ throw new Error('ntlmssp_header_not_found');
+ offset += 8;
+ const type = buffer.readUInt32LE(offset);
+ if (type !== 0x02)
+ throw new Error('ntlmssp_type_is_not_two');
+ offset += 4;
+ const targetNameLength = buffer.readUInt16LE(offset);
+ offset += 2;
+ const targetNameMaxLength = buffer.readUInt16LE(offset);
+ offset += 2;
+ const targetNameOffset = buffer.readUInt32LE(offset);
+ offset += 4;
+ const negotiateFlags = buffer.readUInt32LE(offset);
+ offset += 4;
+ const serverChallenge = buffer.slice(offset, offset + 8);
+ offset += 8;
+ offset += 8; // Reserved
+ return serverChallenge;
+};
+exports.encodeAuthenticationMessage = (username, hostname, domain, nonce, password) => {
+ hostname = hostname.toUpperCase();
+ domain = domain.toUpperCase();
+ const lmHash = Buffer.alloc(21);
+ createLmHash(password).copy(lmHash);
+ lmHash.fill(0x00, 16);
+ const ntHash = Buffer.alloc(21);
+ createNtHash(password).copy(ntHash);
+ ntHash.fill(0x00, 16);
+ const lmResponse = createResponse(lmHash, nonce);
+ const ntResponse = createResponse(ntHash, nonce);
+ const usernameLength = Buffer.byteLength(username, 'ucs2');
+ const hostnameLength = Buffer.byteLength(hostname, 'ucs2');
+ const domainLength = Buffer.byteLength(domain, 'ucs2');
+ const lmResponseLength = 0x18;
+ const ntResponseLength = 0x18;
+ const domainOffset = 0x40;
+ const usernameOffset = domainOffset + domainLength;
+ const hostnameOffset = usernameOffset + usernameLength;
+ const lmResponseOffset = hostnameOffset + hostnameLength;
+ const ntResponseOffset = lmResponseOffset + lmResponseLength;
+ let offset = 0;
+ const messageLength = 64 +
+ domainLength +
+ usernameLength +
+ hostnameLength +
+ lmResponseLength +
+ ntResponseLength;
+ const buffer = Buffer.alloc(messageLength);
+ buffer.write('NTLMSSP', offset, 7, 'ascii'); // byte protocol[8];
+ offset += 7;
+ buffer.writeUInt8(0, offset);
+ offset++;
+ buffer.writeUInt8(0x03, offset); // byte type;
+ offset++;
+ buffer.fill(0x00, offset, offset + 3); // byte zero[3];
+ offset += 3;
+ buffer.writeUInt16LE(lmResponseLength, offset); // short lm_resp_len;
+ offset += 2;
+ buffer.writeUInt16LE(lmResponseLength, offset); // short lm_resp_len;
+ offset += 2;
+ buffer.writeUInt16LE(lmResponseOffset, offset); // short lm_resp_off;
+ offset += 2;
+ buffer.fill(0x00, offset, offset + 2); // byte zero[2];
+ offset += 2;
+ buffer.writeUInt16LE(ntResponseLength, offset); // short nt_resp_len;
+ offset += 2;
+ buffer.writeUInt16LE(ntResponseLength, offset); // short nt_resp_len;
+ offset += 2;
+ buffer.writeUInt16LE(ntResponseOffset, offset); // short nt_resp_off;
+ offset += 2;
+ buffer.fill(0x00, offset, offset + 2); // byte zero[2];
+ offset += 2;
+ buffer.writeUInt16LE(domainLength, offset); // short dom_len;
+ offset += 2;
+ buffer.writeUInt16LE(domainLength, offset); // short dom_len;
+ offset += 2;
+ buffer.writeUInt16LE(domainOffset, offset); // short dom_off;
+ offset += 2;
+ buffer.fill(0x00, offset, offset + 2); // byte zero[2];
+ offset += 2;
+ buffer.writeUInt16LE(usernameLength, offset); // short user_len;
+ offset += 2;
+ buffer.writeUInt16LE(usernameLength, offset); // short user_len;
+ offset += 2;
+ buffer.writeUInt16LE(usernameOffset, offset); // short user_off;
+ offset += 2;
+ buffer.fill(0x00, offset, offset + 2); // byte zero[2];
+ offset += 2;
+ buffer.writeUInt16LE(hostnameLength, offset); // short host_len;
+ offset += 2;
+ buffer.writeUInt16LE(hostnameLength, offset); // short host_len;
+ offset += 2;
+ buffer.writeUInt16LE(hostnameOffset, offset); // short host_off;
+ offset += 2;
+ buffer.fill(0x00, offset, offset + 6); // byte zero[6];
+ offset += 6;
+ buffer.writeUInt16LE(messageLength, offset); // short msg_len;
+ offset += 2;
+ buffer.fill(0x00, offset, offset + 2); // byte zero[2];
+ offset += 2;
+ const negotiateFlags = NegotiateFlag_1.default.UnicodeEncoding |
+ NegotiateFlag_1.default.NTLMSessionSecurity |
+ NegotiateFlag_1.default.AlwaysSign;
+ buffer.writeUInt32LE(negotiateFlags, offset);
+ offset += 4;
+ buffer.write(domain, domainOffset, domainLength, 'ucs2');
+ buffer.write(username, usernameOffset, usernameLength, 'ucs2');
+ buffer.write(hostname, hostnameOffset, hostnameLength, 'ucs2');
+ lmResponse.copy(buffer, lmResponseOffset, 0, lmResponseLength);
+ ntResponse.copy(buffer, ntResponseOffset, 0, ntResponseLength);
+ return buffer;
+};
+exports.generateServerChallenge = () => {
+ return crypto_1.default.randomBytes(8);
+};
+const createLmHash = (text) => httpntlm_1.default.ntlm.create_LM_hashed_password(text);
+const createNtHash = (str) => httpntlm_1.default.ntlm.create_NT_hashed_password(str);
+const createResponse = (hash, nonce) => httpntlm_1.default.ntlm.calc_resp(hash, nonce);
diff --git a/dist/protocol/protocolIds.d.ts b/dist/protocol/protocolIds.d.ts
new file mode 100644
index 0000000..d7bcce3
--- /dev/null
+++ b/dist/protocol/protocolIds.d.ts
@@ -0,0 +1,2 @@
+export declare const smb: string;
+export declare const smb2: string;
diff --git a/dist/protocol/protocolIds.js b/dist/protocol/protocolIds.js
new file mode 100644
index 0000000..cdef815
--- /dev/null
+++ b/dist/protocol/protocolIds.js
@@ -0,0 +1,19 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.smb2 = exports.smb = void 0;
+exports.smb = Buffer
+ .from([
+ 0xff,
+ "S".charCodeAt(0),
+ "M".charCodeAt(0),
+ "B".charCodeAt(0)
+])
+ .toString("hex");
+exports.smb2 = Buffer
+ .from([
+ 0xfe,
+ "S".charCodeAt(0),
+ "M".charCodeAt(0),
+ "B".charCodeAt(0)
+])
+ .toString("hex");
diff --git a/dist/protocol/smb/Header.d.ts b/dist/protocol/smb/Header.d.ts
new file mode 100644
index 0000000..7f7bd85
--- /dev/null
+++ b/dist/protocol/smb/Header.d.ts
@@ -0,0 +1,26 @@
+import PacketType from "./PacketType";
+import StructureField from "../StructureField";
+export declare const headerSize = 32;
+export default interface Header {
+ protocolId?: string;
+ type?: PacketType;
+ status?: number;
+ flags?: number;
+ flags2?: number;
+ processIdHigh?: number;
+ securityFeatures?: number;
+ securitySignature?: number;
+ key?: number;
+ connectionId?: number;
+ sequenceNumber?: number;
+ reserved?: number;
+ treeId?: number;
+ processIdLow?: number;
+ userId?: number;
+ multiplexId?: number;
+}
+export declare type HeaderName = ("protocolId" | "type" | "status" | "flags" | "flags2" | "processIdHigh" | "securityFeatures" | "securitySignature" | "key" | "connectionId" | "sequenceNumber" | "reserved" | "treeId" | "processIdLow" | "userId" | "multiplexId");
+export declare type HeaderStructure = {
+ [key in HeaderName]?: StructureField;
+};
+export declare const headerStructure: HeaderStructure;
diff --git a/dist/protocol/smb/Header.js b/dist/protocol/smb/Header.js
new file mode 100644
index 0000000..bf4b05a
--- /dev/null
+++ b/dist/protocol/smb/Header.js
@@ -0,0 +1,68 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.headerStructure = exports.headerSize = void 0;
+const Packet_1 = require("../Packet");
+exports.headerSize = 32;
+exports.headerStructure = {
+ protocolId: Packet_1.protocolIdStructureField,
+ type: {
+ type: Number,
+ size: 1
+ },
+ status: {
+ type: Number,
+ size: 4
+ },
+ flags: {
+ type: Number,
+ size: 1
+ },
+ flags2: {
+ type: Number,
+ size: 2
+ },
+ processIdHigh: {
+ type: Number,
+ size: 2
+ },
+ securityFeatures: {
+ type: Number,
+ size: 8
+ },
+ securitySignature: {
+ type: Number,
+ size: 8
+ },
+ key: {
+ type: Number,
+ size: 4
+ },
+ connectionId: {
+ type: Number,
+ size: 2
+ },
+ sequenceNumber: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ treeId: {
+ type: Number,
+ size: 2
+ },
+ processIdLow: {
+ type: Number,
+ size: 2
+ },
+ userId: {
+ type: Number,
+ size: 2
+ },
+ multiplexId: {
+ type: Number,
+ size: 2
+ }
+};
diff --git a/dist/protocol/smb/Packet.d.ts b/dist/protocol/smb/Packet.d.ts
new file mode 100644
index 0000000..36fe198
--- /dev/null
+++ b/dist/protocol/smb/Packet.d.ts
@@ -0,0 +1,13 @@
+///
+import Header from "./Header";
+export default class Packet {
+ static parse(buffer: Buffer): {
+ header: Header;
+ body: any;
+ };
+ static parseHeader(buffer: Buffer): {
+ header: Header;
+ bodyBuffer: Buffer;
+ };
+ static parseList(buffer: Buffer): any[];
+}
diff --git a/dist/protocol/smb/Packet.js b/dist/protocol/smb/Packet.js
new file mode 100644
index 0000000..f7edc25
--- /dev/null
+++ b/dist/protocol/smb/Packet.js
@@ -0,0 +1,80 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const structureUtil = __importStar(require("../structureUtil"));
+const Header_1 = require("./Header");
+class Packet {
+ static parse(buffer) {
+ const { header, bodyBuffer } = Packet.parseHeader(buffer);
+ let offset = 0;
+ const wordCount = bodyBuffer.readInt8(offset);
+ offset += 1;
+ const dataCount = bodyBuffer.readUInt16LE(offset);
+ offset += 2;
+ const dataBuffer = bodyBuffer.slice(offset);
+ const dialects = Packet.parseList(dataBuffer); // TODO: export into Negotiate packet
+ const body = {
+ dialects
+ };
+ return {
+ header,
+ body
+ };
+ }
+ static parseHeader(buffer) {
+ const header = structureUtil.parseStructure(buffer, Header_1.headerStructure);
+ const bodyBuffer = buffer.slice(Header_1.headerSize);
+ return {
+ header,
+ bodyBuffer
+ };
+ }
+ static parseList(buffer) {
+ let offset = 0;
+ let currentBytes = [];
+ let terminated = true;
+ let format = 0;
+ const list = [];
+ while (offset < buffer.length) {
+ const byte = buffer.readInt8(offset);
+ if (terminated) {
+ format = byte;
+ offset++;
+ terminated = false;
+ continue;
+ }
+ if (byte === 0) {
+ if (format === 2) {
+ const text = Buffer.from(currentBytes).toString("ascii");
+ list.push(text);
+ }
+ currentBytes = [];
+ terminated = true;
+ }
+ else {
+ currentBytes.push(byte);
+ }
+ offset++;
+ }
+ return list;
+ }
+}
+exports.default = Packet;
diff --git a/dist/protocol/smb/PacketType.d.ts b/dist/protocol/smb/PacketType.d.ts
new file mode 100644
index 0000000..877a4b6
--- /dev/null
+++ b/dist/protocol/smb/PacketType.d.ts
@@ -0,0 +1,56 @@
+declare enum PacketType {
+ CreateDirectory = 0,
+ DeleteDirectory = 1,
+ Open = 2,
+ Create = 3,
+ Close = 4,
+ Flush = 5,
+ Delete = 6,
+ Rename = 7,
+ QueryInformation = 8,
+ SetInformation = 9,
+ Read = 10,
+ Write = 11,
+ LockByteRange = 12,
+ UnlockByteRange = 13,
+ CreateTemporary = 14,
+ CreateNew = 15,
+ CheckDirectory = 16,
+ ProcessExit = 17,
+ Seek = 18,
+ LockAndRead = 19,
+ WriteAndUnlock = 20,
+ ReadRaw = 26,
+ ReadMultiplex = 27,
+ ReadMultiplexSecondary = 28,
+ WriteRaw = 29,
+ WriteMultiplex = 30,
+ WriteMultiplexSecondary = 31,
+ WriteComplete = 32,
+ QueryServer = 33,
+ SetInformation2 = 34,
+ QueryInformation2 = 35,
+ LockingAndX = 36,
+ Transaction = 37,
+ TransactionSecondary = 38,
+ InputOutputControl = 39,
+ InputOutputControlSecondary = 40,
+ Copy = 41,
+ Move = 42,
+ Echo = 43,
+ WriteAndClose = 44,
+ OpenAndX = 45,
+ ReadAndX = 46,
+ WriteAndX = 47,
+ NewFileSize = 48,
+ CloseFileAndDisconnectTree = 49,
+ Transaction2 = 50,
+ Transaction2Secondary = 51,
+ FindClose2 = 52,
+ FindNotifyClose = 53,
+ TreeConnect = 112,
+ TreeDisconnect = 113,
+ Negotiate = 114,
+ SessionSetup = 115
+}
+export default PacketType;
diff --git a/dist/protocol/smb/PacketType.js b/dist/protocol/smb/PacketType.js
new file mode 100644
index 0000000..45bfb13
--- /dev/null
+++ b/dist/protocol/smb/PacketType.js
@@ -0,0 +1,60 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var PacketType;
+(function (PacketType) {
+ PacketType[PacketType["CreateDirectory"] = 0] = "CreateDirectory";
+ PacketType[PacketType["DeleteDirectory"] = 1] = "DeleteDirectory";
+ PacketType[PacketType["Open"] = 2] = "Open";
+ PacketType[PacketType["Create"] = 3] = "Create";
+ PacketType[PacketType["Close"] = 4] = "Close";
+ PacketType[PacketType["Flush"] = 5] = "Flush";
+ PacketType[PacketType["Delete"] = 6] = "Delete";
+ PacketType[PacketType["Rename"] = 7] = "Rename";
+ PacketType[PacketType["QueryInformation"] = 8] = "QueryInformation";
+ PacketType[PacketType["SetInformation"] = 9] = "SetInformation";
+ PacketType[PacketType["Read"] = 10] = "Read";
+ PacketType[PacketType["Write"] = 11] = "Write";
+ PacketType[PacketType["LockByteRange"] = 12] = "LockByteRange";
+ PacketType[PacketType["UnlockByteRange"] = 13] = "UnlockByteRange";
+ PacketType[PacketType["CreateTemporary"] = 14] = "CreateTemporary";
+ PacketType[PacketType["CreateNew"] = 15] = "CreateNew";
+ PacketType[PacketType["CheckDirectory"] = 16] = "CheckDirectory";
+ PacketType[PacketType["ProcessExit"] = 17] = "ProcessExit";
+ PacketType[PacketType["Seek"] = 18] = "Seek";
+ PacketType[PacketType["LockAndRead"] = 19] = "LockAndRead";
+ PacketType[PacketType["WriteAndUnlock"] = 20] = "WriteAndUnlock";
+ PacketType[PacketType["ReadRaw"] = 26] = "ReadRaw";
+ PacketType[PacketType["ReadMultiplex"] = 27] = "ReadMultiplex";
+ PacketType[PacketType["ReadMultiplexSecondary"] = 28] = "ReadMultiplexSecondary";
+ PacketType[PacketType["WriteRaw"] = 29] = "WriteRaw";
+ PacketType[PacketType["WriteMultiplex"] = 30] = "WriteMultiplex";
+ PacketType[PacketType["WriteMultiplexSecondary"] = 31] = "WriteMultiplexSecondary";
+ PacketType[PacketType["WriteComplete"] = 32] = "WriteComplete";
+ PacketType[PacketType["QueryServer"] = 33] = "QueryServer";
+ PacketType[PacketType["SetInformation2"] = 34] = "SetInformation2";
+ PacketType[PacketType["QueryInformation2"] = 35] = "QueryInformation2";
+ PacketType[PacketType["LockingAndX"] = 36] = "LockingAndX";
+ PacketType[PacketType["Transaction"] = 37] = "Transaction";
+ PacketType[PacketType["TransactionSecondary"] = 38] = "TransactionSecondary";
+ PacketType[PacketType["InputOutputControl"] = 39] = "InputOutputControl";
+ PacketType[PacketType["InputOutputControlSecondary"] = 40] = "InputOutputControlSecondary";
+ PacketType[PacketType["Copy"] = 41] = "Copy";
+ PacketType[PacketType["Move"] = 42] = "Move";
+ PacketType[PacketType["Echo"] = 43] = "Echo";
+ PacketType[PacketType["WriteAndClose"] = 44] = "WriteAndClose";
+ PacketType[PacketType["OpenAndX"] = 45] = "OpenAndX";
+ PacketType[PacketType["ReadAndX"] = 46] = "ReadAndX";
+ PacketType[PacketType["WriteAndX"] = 47] = "WriteAndX";
+ PacketType[PacketType["NewFileSize"] = 48] = "NewFileSize";
+ PacketType[PacketType["CloseFileAndDisconnectTree"] = 49] = "CloseFileAndDisconnectTree";
+ PacketType[PacketType["Transaction2"] = 50] = "Transaction2";
+ PacketType[PacketType["Transaction2Secondary"] = 51] = "Transaction2Secondary";
+ PacketType[PacketType["FindClose2"] = 52] = "FindClose2";
+ PacketType[PacketType["FindNotifyClose"] = 53] = "FindNotifyClose";
+ PacketType[PacketType["TreeConnect"] = 112] = "TreeConnect";
+ PacketType[PacketType["TreeDisconnect"] = 113] = "TreeDisconnect";
+ PacketType[PacketType["Negotiate"] = 114] = "Negotiate";
+ PacketType[PacketType["SessionSetup"] = 115] = "SessionSetup";
+})(PacketType || (PacketType = {}));
+;
+exports.default = PacketType;
diff --git a/dist/protocol/smb/Request.d.ts b/dist/protocol/smb/Request.d.ts
new file mode 100644
index 0000000..0aac943
--- /dev/null
+++ b/dist/protocol/smb/Request.d.ts
@@ -0,0 +1,8 @@
+///
+import Header from "./Header";
+import ProtocolRequest from "../Request";
+export default class Request extends ProtocolRequest {
+ header: Header;
+ static parse(buffer: Buffer): Request;
+ serialize(): Buffer;
+}
diff --git a/dist/protocol/smb/Request.js b/dist/protocol/smb/Request.js
new file mode 100644
index 0000000..648bb67
--- /dev/null
+++ b/dist/protocol/smb/Request.js
@@ -0,0 +1,18 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Packet_1 = __importDefault(require("./Packet"));
+const Request_1 = __importDefault(require("../Request"));
+class Request extends Request_1.default {
+ static parse(buffer) {
+ const { header, body } = Packet_1.default.parse(buffer);
+ return new Request(header, body);
+ }
+ serialize() {
+ return Buffer.from([]);
+ // return Packet.serialize(this.header, this.body);
+ }
+}
+exports.default = Request;
diff --git a/dist/protocol/smb/Response.d.ts b/dist/protocol/smb/Response.d.ts
new file mode 100644
index 0000000..7e68390
--- /dev/null
+++ b/dist/protocol/smb/Response.d.ts
@@ -0,0 +1,8 @@
+///
+import Header from "./Header";
+import ProtocolResponse from "../Response";
+export default class Response extends ProtocolResponse {
+ header: Header;
+ static parse(buffer: Buffer): Response;
+ serialize(): Buffer;
+}
diff --git a/dist/protocol/smb/Response.js b/dist/protocol/smb/Response.js
new file mode 100644
index 0000000..9b9438a
--- /dev/null
+++ b/dist/protocol/smb/Response.js
@@ -0,0 +1,18 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Packet_1 = __importDefault(require("./Packet"));
+const Response_1 = __importDefault(require("../Response"));
+class Response extends Response_1.default {
+ static parse(buffer) {
+ const { header, body } = Packet_1.default.parse(buffer);
+ return new Response(header, body);
+ }
+ serialize() {
+ return Buffer.from([]);
+ // return Packet.serialize(this.header, this.body);
+ }
+}
+exports.default = Response;
diff --git a/dist/protocol/smb2/Capability.d.ts b/dist/protocol/smb2/Capability.d.ts
new file mode 100644
index 0000000..6b60043
--- /dev/null
+++ b/dist/protocol/smb2/Capability.d.ts
@@ -0,0 +1,5 @@
+declare enum Capability {
+ DistributedFileSystem = 1,
+ MultiCreditSupport = 4
+}
+export default Capability;
diff --git a/dist/protocol/smb2/Capability.js b/dist/protocol/smb2/Capability.js
new file mode 100644
index 0000000..4b394f0
--- /dev/null
+++ b/dist/protocol/smb2/Capability.js
@@ -0,0 +1,8 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Capability;
+(function (Capability) {
+ Capability[Capability["DistributedFileSystem"] = 1] = "DistributedFileSystem";
+ Capability[Capability["MultiCreditSupport"] = 4] = "MultiCreditSupport";
+})(Capability || (Capability = {}));
+exports.default = Capability;
diff --git a/dist/protocol/smb2/CreateDispositionType.d.ts b/dist/protocol/smb2/CreateDispositionType.d.ts
new file mode 100644
index 0000000..c30fcc1
--- /dev/null
+++ b/dist/protocol/smb2/CreateDispositionType.d.ts
@@ -0,0 +1,9 @@
+declare enum CreateDispositionType {
+ Supersede = 0,
+ Open = 1,
+ Create = 2,
+ OpenIf = 3,
+ Overwrite = 4,
+ OverwriteIf = 5
+}
+export default CreateDispositionType;
diff --git a/dist/protocol/smb2/CreateDispositionType.js b/dist/protocol/smb2/CreateDispositionType.js
new file mode 100644
index 0000000..55f9a2a
--- /dev/null
+++ b/dist/protocol/smb2/CreateDispositionType.js
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var CreateDispositionType;
+(function (CreateDispositionType) {
+ CreateDispositionType[CreateDispositionType["Supersede"] = 0] = "Supersede";
+ CreateDispositionType[CreateDispositionType["Open"] = 1] = "Open";
+ CreateDispositionType[CreateDispositionType["Create"] = 2] = "Create";
+ CreateDispositionType[CreateDispositionType["OpenIf"] = 3] = "OpenIf";
+ CreateDispositionType[CreateDispositionType["Overwrite"] = 4] = "Overwrite";
+ CreateDispositionType[CreateDispositionType["OverwriteIf"] = 5] = "OverwriteIf";
+})(CreateDispositionType || (CreateDispositionType = {}));
+exports.default = CreateDispositionType;
diff --git a/dist/protocol/smb2/Dialect.d.ts b/dist/protocol/smb2/Dialect.d.ts
new file mode 100644
index 0000000..2016190
--- /dev/null
+++ b/dist/protocol/smb2/Dialect.d.ts
@@ -0,0 +1,10 @@
+declare enum Dialect {
+ Smb202 = 514,
+ Smb210 = 528,
+ Smb2xx = 767,
+ Smb300 = 768,
+ Smb302 = 770,
+ Smb311 = 785,
+ Smb3xx = 1023
+}
+export default Dialect;
diff --git a/dist/protocol/smb2/Dialect.js b/dist/protocol/smb2/Dialect.js
new file mode 100644
index 0000000..2d2cd09
--- /dev/null
+++ b/dist/protocol/smb2/Dialect.js
@@ -0,0 +1,13 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Dialect;
+(function (Dialect) {
+ Dialect[Dialect["Smb202"] = 514] = "Smb202";
+ Dialect[Dialect["Smb210"] = 528] = "Smb210";
+ Dialect[Dialect["Smb2xx"] = 767] = "Smb2xx";
+ Dialect[Dialect["Smb300"] = 768] = "Smb300";
+ Dialect[Dialect["Smb302"] = 770] = "Smb302";
+ Dialect[Dialect["Smb311"] = 785] = "Smb311";
+ Dialect[Dialect["Smb3xx"] = 1023] = "Smb3xx";
+})(Dialect || (Dialect = {}));
+exports.default = Dialect;
diff --git a/dist/protocol/smb2/DirectoryAccess.d.ts b/dist/protocol/smb2/DirectoryAccess.d.ts
new file mode 100644
index 0000000..01bcaca
--- /dev/null
+++ b/dist/protocol/smb2/DirectoryAccess.d.ts
@@ -0,0 +1,23 @@
+declare enum DirectoryAccess {
+ ListDirectory = 1,
+ AddFile = 2,
+ AddSubDirectory = 4,
+ ReadEa = 8,
+ WriteEa = 16,
+ Traverse = 32,
+ DeleteChild = 64,
+ ReadAttributes = 128,
+ WriteAttributes = 256,
+ Delete = 65536,
+ ReadControl = 131072,
+ WriteDiscretionaryAccessControl = 262144,
+ WriteOwner = 524288,
+ Synchronize = 1048576,
+ AccessSystemSecurity = 16777216,
+ MaximumAllowed = 33554432,
+ GenericAll = 268435456,
+ GenericExecute = 536870912,
+ GenericWrite = 1073741824,
+ GenericRead = -2147483648
+}
+export default DirectoryAccess;
diff --git a/dist/protocol/smb2/DirectoryAccess.js b/dist/protocol/smb2/DirectoryAccess.js
new file mode 100644
index 0000000..62b5b22
--- /dev/null
+++ b/dist/protocol/smb2/DirectoryAccess.js
@@ -0,0 +1,26 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var DirectoryAccess;
+(function (DirectoryAccess) {
+ DirectoryAccess[DirectoryAccess["ListDirectory"] = 1] = "ListDirectory";
+ DirectoryAccess[DirectoryAccess["AddFile"] = 2] = "AddFile";
+ DirectoryAccess[DirectoryAccess["AddSubDirectory"] = 4] = "AddSubDirectory";
+ DirectoryAccess[DirectoryAccess["ReadEa"] = 8] = "ReadEa";
+ DirectoryAccess[DirectoryAccess["WriteEa"] = 16] = "WriteEa";
+ DirectoryAccess[DirectoryAccess["Traverse"] = 32] = "Traverse";
+ DirectoryAccess[DirectoryAccess["DeleteChild"] = 64] = "DeleteChild";
+ DirectoryAccess[DirectoryAccess["ReadAttributes"] = 128] = "ReadAttributes";
+ DirectoryAccess[DirectoryAccess["WriteAttributes"] = 256] = "WriteAttributes";
+ DirectoryAccess[DirectoryAccess["Delete"] = 65536] = "Delete";
+ DirectoryAccess[DirectoryAccess["ReadControl"] = 131072] = "ReadControl";
+ DirectoryAccess[DirectoryAccess["WriteDiscretionaryAccessControl"] = 262144] = "WriteDiscretionaryAccessControl";
+ DirectoryAccess[DirectoryAccess["WriteOwner"] = 524288] = "WriteOwner";
+ DirectoryAccess[DirectoryAccess["Synchronize"] = 1048576] = "Synchronize";
+ DirectoryAccess[DirectoryAccess["AccessSystemSecurity"] = 16777216] = "AccessSystemSecurity";
+ DirectoryAccess[DirectoryAccess["MaximumAllowed"] = 33554432] = "MaximumAllowed";
+ DirectoryAccess[DirectoryAccess["GenericAll"] = 268435456] = "GenericAll";
+ DirectoryAccess[DirectoryAccess["GenericExecute"] = 536870912] = "GenericExecute";
+ DirectoryAccess[DirectoryAccess["GenericWrite"] = 1073741824] = "GenericWrite";
+ DirectoryAccess[DirectoryAccess["GenericRead"] = -2147483648] = "GenericRead";
+})(DirectoryAccess || (DirectoryAccess = {}));
+exports.default = DirectoryAccess;
diff --git a/dist/protocol/smb2/FileAction.d.ts b/dist/protocol/smb2/FileAction.d.ts
new file mode 100644
index 0000000..1855902
--- /dev/null
+++ b/dist/protocol/smb2/FileAction.d.ts
@@ -0,0 +1,14 @@
+declare enum FileAction {
+ Added = 1,
+ Removed = 2,
+ Modified = 3,
+ RenamedOldName = 4,
+ RenamedNewName = 5,
+ AddedStream = 6,
+ RemovedStream = 7,
+ ModifiedStream = 8,
+ RemovedByDelete = 9,
+ IdNotTunnelled = 10,
+ TunnelledIdCollision = 11
+}
+export default FileAction;
diff --git a/dist/protocol/smb2/FileAction.js b/dist/protocol/smb2/FileAction.js
new file mode 100644
index 0000000..1f86d65
--- /dev/null
+++ b/dist/protocol/smb2/FileAction.js
@@ -0,0 +1,17 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var FileAction;
+(function (FileAction) {
+ FileAction[FileAction["Added"] = 1] = "Added";
+ FileAction[FileAction["Removed"] = 2] = "Removed";
+ FileAction[FileAction["Modified"] = 3] = "Modified";
+ FileAction[FileAction["RenamedOldName"] = 4] = "RenamedOldName";
+ FileAction[FileAction["RenamedNewName"] = 5] = "RenamedNewName";
+ FileAction[FileAction["AddedStream"] = 6] = "AddedStream";
+ FileAction[FileAction["RemovedStream"] = 7] = "RemovedStream";
+ FileAction[FileAction["ModifiedStream"] = 8] = "ModifiedStream";
+ FileAction[FileAction["RemovedByDelete"] = 9] = "RemovedByDelete";
+ FileAction[FileAction["IdNotTunnelled"] = 10] = "IdNotTunnelled";
+ FileAction[FileAction["TunnelledIdCollision"] = 11] = "TunnelledIdCollision";
+})(FileAction || (FileAction = {}));
+exports.default = FileAction;
diff --git a/dist/protocol/smb2/FileAttribute.d.ts b/dist/protocol/smb2/FileAttribute.d.ts
new file mode 100644
index 0000000..cda98e5
--- /dev/null
+++ b/dist/protocol/smb2/FileAttribute.d.ts
@@ -0,0 +1,19 @@
+declare enum FileAttribute {
+ None = 0,
+ ReadOnly = 1,
+ Hidden = 2,
+ System = 4,
+ Directory = 16,
+ Archive = 32,
+ Normal = 128,
+ Temporary = 256,
+ SparseFile = 512,
+ ReparsePoint = 1024,
+ Compressed = 2048,
+ Offline = 4096,
+ NotContentIndexed = 8192,
+ Encrypted = 16384,
+ IntegrityStream = 32768,
+ NoScrubData = 131072
+}
+export default FileAttribute;
diff --git a/dist/protocol/smb2/FileAttribute.js b/dist/protocol/smb2/FileAttribute.js
new file mode 100644
index 0000000..820770a
--- /dev/null
+++ b/dist/protocol/smb2/FileAttribute.js
@@ -0,0 +1,22 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var FileAttribute;
+(function (FileAttribute) {
+ FileAttribute[FileAttribute["None"] = 0] = "None";
+ FileAttribute[FileAttribute["ReadOnly"] = 1] = "ReadOnly";
+ FileAttribute[FileAttribute["Hidden"] = 2] = "Hidden";
+ FileAttribute[FileAttribute["System"] = 4] = "System";
+ FileAttribute[FileAttribute["Directory"] = 16] = "Directory";
+ FileAttribute[FileAttribute["Archive"] = 32] = "Archive";
+ FileAttribute[FileAttribute["Normal"] = 128] = "Normal";
+ FileAttribute[FileAttribute["Temporary"] = 256] = "Temporary";
+ FileAttribute[FileAttribute["SparseFile"] = 512] = "SparseFile";
+ FileAttribute[FileAttribute["ReparsePoint"] = 1024] = "ReparsePoint";
+ FileAttribute[FileAttribute["Compressed"] = 2048] = "Compressed";
+ FileAttribute[FileAttribute["Offline"] = 4096] = "Offline";
+ FileAttribute[FileAttribute["NotContentIndexed"] = 8192] = "NotContentIndexed";
+ FileAttribute[FileAttribute["Encrypted"] = 16384] = "Encrypted";
+ FileAttribute[FileAttribute["IntegrityStream"] = 32768] = "IntegrityStream";
+ FileAttribute[FileAttribute["NoScrubData"] = 131072] = "NoScrubData";
+})(FileAttribute || (FileAttribute = {}));
+exports.default = FileAttribute;
diff --git a/dist/protocol/smb2/FilePipePrinterAccess.d.ts b/dist/protocol/smb2/FilePipePrinterAccess.d.ts
new file mode 100644
index 0000000..47a05dd
--- /dev/null
+++ b/dist/protocol/smb2/FilePipePrinterAccess.d.ts
@@ -0,0 +1,23 @@
+declare enum FilePipePrinterAccess {
+ ReadData = 1,
+ WriteData = 2,
+ AppendData = 4,
+ ReadEa = 8,
+ WriteEa = 16,
+ DeleteChild = 32,
+ Execute = 64,
+ ReadAttributes = 128,
+ WriteAttributes = 256,
+ Delete = 65536,
+ ReadControl = 131072,
+ WriteDiscretionaryAccessControl = 262144,
+ WriteOwner = 524288,
+ Synchronize = 1048576,
+ AccessSystemSecurity = 16777216,
+ MaximumAllowed = 33554432,
+ GenericAll = 268435456,
+ GenericExecute = 536870912,
+ GenericWrite = 1073741824,
+ GenericRead = -2147483648
+}
+export default FilePipePrinterAccess;
diff --git a/dist/protocol/smb2/FilePipePrinterAccess.js b/dist/protocol/smb2/FilePipePrinterAccess.js
new file mode 100644
index 0000000..8d17ab7
--- /dev/null
+++ b/dist/protocol/smb2/FilePipePrinterAccess.js
@@ -0,0 +1,26 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var FilePipePrinterAccess;
+(function (FilePipePrinterAccess) {
+ FilePipePrinterAccess[FilePipePrinterAccess["ReadData"] = 1] = "ReadData";
+ FilePipePrinterAccess[FilePipePrinterAccess["WriteData"] = 2] = "WriteData";
+ FilePipePrinterAccess[FilePipePrinterAccess["AppendData"] = 4] = "AppendData";
+ FilePipePrinterAccess[FilePipePrinterAccess["ReadEa"] = 8] = "ReadEa";
+ FilePipePrinterAccess[FilePipePrinterAccess["WriteEa"] = 16] = "WriteEa";
+ FilePipePrinterAccess[FilePipePrinterAccess["DeleteChild"] = 32] = "DeleteChild";
+ FilePipePrinterAccess[FilePipePrinterAccess["Execute"] = 64] = "Execute";
+ FilePipePrinterAccess[FilePipePrinterAccess["ReadAttributes"] = 128] = "ReadAttributes";
+ FilePipePrinterAccess[FilePipePrinterAccess["WriteAttributes"] = 256] = "WriteAttributes";
+ FilePipePrinterAccess[FilePipePrinterAccess["Delete"] = 65536] = "Delete";
+ FilePipePrinterAccess[FilePipePrinterAccess["ReadControl"] = 131072] = "ReadControl";
+ FilePipePrinterAccess[FilePipePrinterAccess["WriteDiscretionaryAccessControl"] = 262144] = "WriteDiscretionaryAccessControl";
+ FilePipePrinterAccess[FilePipePrinterAccess["WriteOwner"] = 524288] = "WriteOwner";
+ FilePipePrinterAccess[FilePipePrinterAccess["Synchronize"] = 1048576] = "Synchronize";
+ FilePipePrinterAccess[FilePipePrinterAccess["AccessSystemSecurity"] = 16777216] = "AccessSystemSecurity";
+ FilePipePrinterAccess[FilePipePrinterAccess["MaximumAllowed"] = 33554432] = "MaximumAllowed";
+ FilePipePrinterAccess[FilePipePrinterAccess["GenericAll"] = 268435456] = "GenericAll";
+ FilePipePrinterAccess[FilePipePrinterAccess["GenericExecute"] = 536870912] = "GenericExecute";
+ FilePipePrinterAccess[FilePipePrinterAccess["GenericWrite"] = 1073741824] = "GenericWrite";
+ FilePipePrinterAccess[FilePipePrinterAccess["GenericRead"] = -2147483648] = "GenericRead";
+})(FilePipePrinterAccess || (FilePipePrinterAccess = {}));
+exports.default = FilePipePrinterAccess;
diff --git a/dist/protocol/smb2/Header.d.ts b/dist/protocol/smb2/Header.d.ts
new file mode 100644
index 0000000..23e3631
--- /dev/null
+++ b/dist/protocol/smb2/Header.d.ts
@@ -0,0 +1,24 @@
+import PacketType from "./PacketType";
+import StatusCode from "./StatusCode";
+import StructureField from "../StructureField";
+export declare const headerSize = 64;
+export default interface Header {
+ protocolId?: string;
+ structureSize?: number;
+ creditCharge?: number;
+ status?: StatusCode;
+ type?: PacketType;
+ credit?: number;
+ flags?: number;
+ nextCommand?: number;
+ messageId?: bigint;
+ clientId?: string;
+ treeId?: number;
+ sessionId?: string;
+ signature?: number;
+}
+export declare type HeaderName = ("protocolId" | "structureSize" | "creditCharge" | "status" | "type" | "credit" | "flags" | "nextCommand" | "messageId" | "clientId" | "treeId" | "sessionId" | "signature");
+export declare type HeaderStructure = {
+ [key in HeaderName]?: StructureField;
+};
+export declare const headerStructure: HeaderStructure;
diff --git a/dist/protocol/smb2/Header.js b/dist/protocol/smb2/Header.js
new file mode 100644
index 0000000..fc4d23c
--- /dev/null
+++ b/dist/protocol/smb2/Header.js
@@ -0,0 +1,62 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.headerStructure = exports.headerSize = void 0;
+const Packet_1 = require("../Packet");
+exports.headerSize = 64;
+exports.headerStructure = {
+ protocolId: Packet_1.protocolIdStructureField,
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: exports.headerSize
+ },
+ creditCharge: {
+ type: Number,
+ size: 2
+ },
+ status: {
+ type: Number,
+ signedness: "Unsigned",
+ size: 4
+ },
+ type: {
+ type: Number,
+ size: 2,
+ defaultValue: 2
+ },
+ credit: {
+ type: Number,
+ size: 2,
+ defaultValue: 126
+ },
+ flags: {
+ type: Number,
+ size: 4
+ },
+ nextCommand: {
+ type: Number,
+ size: 4
+ },
+ messageId: {
+ type: Number,
+ size: 8
+ },
+ clientId: {
+ type: String,
+ encoding: "hex",
+ size: 4
+ },
+ treeId: {
+ type: Number,
+ size: 4
+ },
+ sessionId: {
+ type: String,
+ encoding: "hex",
+ size: 8
+ },
+ signature: {
+ type: Number,
+ size: 16
+ }
+};
diff --git a/dist/protocol/smb2/HeaderFlag.d.ts b/dist/protocol/smb2/HeaderFlag.d.ts
new file mode 100644
index 0000000..490f8e0
--- /dev/null
+++ b/dist/protocol/smb2/HeaderFlag.d.ts
@@ -0,0 +1,10 @@
+declare enum HeaderFlag {
+ Response = 1,
+ Async = 2,
+ Chained = 4,
+ Signed = 8,
+ Priority = 16,
+ DfsOperation = 32,
+ ReplayOperation = 64
+}
+export default HeaderFlag;
diff --git a/dist/protocol/smb2/HeaderFlag.js b/dist/protocol/smb2/HeaderFlag.js
new file mode 100644
index 0000000..68c769f
--- /dev/null
+++ b/dist/protocol/smb2/HeaderFlag.js
@@ -0,0 +1,13 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var HeaderFlag;
+(function (HeaderFlag) {
+ HeaderFlag[HeaderFlag["Response"] = 1] = "Response";
+ HeaderFlag[HeaderFlag["Async"] = 2] = "Async";
+ HeaderFlag[HeaderFlag["Chained"] = 4] = "Chained";
+ HeaderFlag[HeaderFlag["Signed"] = 8] = "Signed";
+ HeaderFlag[HeaderFlag["Priority"] = 16] = "Priority";
+ HeaderFlag[HeaderFlag["DfsOperation"] = 32] = "DfsOperation";
+ HeaderFlag[HeaderFlag["ReplayOperation"] = 64] = "ReplayOperation";
+})(HeaderFlag || (HeaderFlag = {}));
+exports.default = HeaderFlag;
diff --git a/dist/protocol/smb2/Packet.d.ts b/dist/protocol/smb2/Packet.d.ts
new file mode 100644
index 0000000..294fcb3
--- /dev/null
+++ b/dist/protocol/smb2/Packet.d.ts
@@ -0,0 +1,20 @@
+///
+import Structure from "../Structure";
+import PacketType from "./PacketType";
+import Header from "./Header";
+export default class Packet {
+ static getPacketTypeName(packetType: PacketType): string;
+ static getPacketByPacketType(packetType: PacketType): any;
+ static getPacket(typeName: string): any;
+ static getStructure(header: Header): Structure;
+ static serialize(header: Header, body: any): Buffer;
+ static parse(buffer: Buffer): {
+ header: Header;
+ body: any;
+ };
+ static parseHeader(buffer: Buffer): {
+ header: Header;
+ bodyBuffer: Buffer;
+ };
+ static serializeHeader(header: Header): Buffer;
+}
diff --git a/dist/protocol/smb2/Packet.js b/dist/protocol/smb2/Packet.js
new file mode 100644
index 0000000..da0c73f
--- /dev/null
+++ b/dist/protocol/smb2/Packet.js
@@ -0,0 +1,83 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const packets = __importStar(require("./packets"));
+const HeaderFlag_1 = __importDefault(require("./HeaderFlag"));
+const PacketType_1 = __importDefault(require("./PacketType"));
+const structureUtil = __importStar(require("../structureUtil"));
+const Header_1 = require("./Header");
+class Packet {
+ static getPacketTypeName(packetType) {
+ return structureUtil.parseEnumValue(PacketType_1.default, packetType);
+ }
+ static getPacketByPacketType(packetType) {
+ const typeName = structureUtil.parseEnumValue(PacketType_1.default, packetType);
+ return Packet.getPacket(typeName);
+ }
+ static getPacket(typeName) {
+ const packet = packets[typeName];
+ if (!packet)
+ throw new Error(`packet_not_found: ${typeName}`);
+ return packet;
+ }
+ static getStructure(header) {
+ const packet = Packet.getPacketByPacketType(header.type);
+ const isResponse = (header.flags & HeaderFlag_1.default.Response) === 1;
+ const structure = packet[`${isResponse ? "response" : "request"}Structure`];
+ return structure;
+ }
+ static serialize(header, body) {
+ const structure = Packet.getStructure(header);
+ const headerBuffer = Packet.serializeHeader(header);
+ const bodyBuffer = structureUtil.serializeStructure(structure, body);
+ const buffer = Buffer.concat([headerBuffer, bodyBuffer]);
+ const prefixedBuffer = Buffer.allocUnsafe(buffer.length + 4);
+ prefixedBuffer.writeUInt8(0x00, 0);
+ prefixedBuffer.writeUInt8((0xff0000 & buffer.length) >> 16, 1);
+ prefixedBuffer.writeUInt16BE(0xffff & buffer.length, 2);
+ buffer.copy(prefixedBuffer, 4, 0, buffer.length);
+ return prefixedBuffer;
+ }
+ static parse(buffer) {
+ const { header, bodyBuffer } = Packet.parseHeader(buffer);
+ const structure = Packet.getStructure(header);
+ const body = structureUtil.parseStructure(bodyBuffer, structure);
+ return {
+ header,
+ body
+ };
+ }
+ static parseHeader(buffer) {
+ const header = structureUtil.parseStructure(buffer, Header_1.headerStructure);
+ const bodyBuffer = buffer.slice(Header_1.headerSize);
+ return {
+ header,
+ bodyBuffer
+ };
+ }
+ static serializeHeader(header) {
+ return structureUtil.serializeStructure(Header_1.headerStructure, header);
+ }
+}
+exports.default = Packet;
diff --git a/dist/protocol/smb2/PacketType.d.ts b/dist/protocol/smb2/PacketType.d.ts
new file mode 100644
index 0000000..e2a3ef7
--- /dev/null
+++ b/dist/protocol/smb2/PacketType.d.ts
@@ -0,0 +1,22 @@
+declare enum PacketType {
+ Negotiate = 0,
+ SessionSetup = 1,
+ LogOff = 2,
+ TreeConnect = 3,
+ TreeDisconnect = 4,
+ Create = 5,
+ Close = 6,
+ Flush = 7,
+ Read = 8,
+ Write = 9,
+ Lock = 10,
+ InputOutputControl = 11,
+ Cancel = 12,
+ Echo = 13,
+ QueryDirectory = 14,
+ ChangeNotify = 15,
+ QueryInfo = 16,
+ SetInfo = 17,
+ OplockBreak = 18
+}
+export default PacketType;
diff --git a/dist/protocol/smb2/PacketType.js b/dist/protocol/smb2/PacketType.js
new file mode 100644
index 0000000..d0cad1e
--- /dev/null
+++ b/dist/protocol/smb2/PacketType.js
@@ -0,0 +1,26 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var PacketType;
+(function (PacketType) {
+ PacketType[PacketType["Negotiate"] = 0] = "Negotiate";
+ PacketType[PacketType["SessionSetup"] = 1] = "SessionSetup";
+ PacketType[PacketType["LogOff"] = 2] = "LogOff";
+ PacketType[PacketType["TreeConnect"] = 3] = "TreeConnect";
+ PacketType[PacketType["TreeDisconnect"] = 4] = "TreeDisconnect";
+ PacketType[PacketType["Create"] = 5] = "Create";
+ PacketType[PacketType["Close"] = 6] = "Close";
+ PacketType[PacketType["Flush"] = 7] = "Flush";
+ PacketType[PacketType["Read"] = 8] = "Read";
+ PacketType[PacketType["Write"] = 9] = "Write";
+ PacketType[PacketType["Lock"] = 10] = "Lock";
+ PacketType[PacketType["InputOutputControl"] = 11] = "InputOutputControl";
+ PacketType[PacketType["Cancel"] = 12] = "Cancel";
+ PacketType[PacketType["Echo"] = 13] = "Echo";
+ PacketType[PacketType["QueryDirectory"] = 14] = "QueryDirectory";
+ PacketType[PacketType["ChangeNotify"] = 15] = "ChangeNotify";
+ PacketType[PacketType["QueryInfo"] = 16] = "QueryInfo";
+ PacketType[PacketType["SetInfo"] = 17] = "SetInfo";
+ PacketType[PacketType["OplockBreak"] = 18] = "OplockBreak";
+})(PacketType || (PacketType = {}));
+;
+exports.default = PacketType;
diff --git a/dist/protocol/smb2/Request.d.ts b/dist/protocol/smb2/Request.d.ts
new file mode 100644
index 0000000..55e5d2a
--- /dev/null
+++ b/dist/protocol/smb2/Request.d.ts
@@ -0,0 +1,11 @@
+///
+import Header from "./Header";
+import ProtocolRequest from "../Request";
+export default class Request extends ProtocolRequest {
+ header: Header;
+ typeName: string;
+ data: any;
+ constructor(header?: Header, body?: any);
+ static parse(buffer: Buffer): Request;
+ serialize(): Buffer;
+}
diff --git a/dist/protocol/smb2/Request.js b/dist/protocol/smb2/Request.js
new file mode 100644
index 0000000..2ad2812
--- /dev/null
+++ b/dist/protocol/smb2/Request.js
@@ -0,0 +1,25 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Packet_1 = __importDefault(require("./Packet"));
+const Request_1 = __importDefault(require("../Request"));
+class Request extends Request_1.default {
+ constructor(header, body) {
+ super(header, body);
+ this.typeName = Packet_1.default.getPacketTypeName(this.header.type);
+ const packet = Packet_1.default.getPacketByPacketType(this.header.type);
+ if (Buffer.isBuffer(this.body.buffer) && packet.parseRequestBuffer) {
+ this.data = packet.parseRequestBuffer(this.body.buffer);
+ }
+ }
+ static parse(buffer) {
+ const { header, body } = Packet_1.default.parse(buffer);
+ return new Request(header, body);
+ }
+ serialize() {
+ return Packet_1.default.serialize(this.header, this.body);
+ }
+}
+exports.default = Request;
diff --git a/dist/protocol/smb2/Response.d.ts b/dist/protocol/smb2/Response.d.ts
new file mode 100644
index 0000000..c1e15ba
--- /dev/null
+++ b/dist/protocol/smb2/Response.d.ts
@@ -0,0 +1,11 @@
+///
+import Header from "./Header";
+import ProtocolResponse from "../Response";
+export default class Response extends ProtocolResponse {
+ header: Header;
+ typeName: string;
+ data: any;
+ constructor(header?: Header, body?: any);
+ static parse(buffer: Buffer): Response;
+ serialize(): Buffer;
+}
diff --git a/dist/protocol/smb2/Response.js b/dist/protocol/smb2/Response.js
new file mode 100644
index 0000000..70aea65
--- /dev/null
+++ b/dist/protocol/smb2/Response.js
@@ -0,0 +1,27 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Packet_1 = __importDefault(require("./Packet"));
+const HeaderFlag_1 = __importDefault(require("./HeaderFlag"));
+const Response_1 = __importDefault(require("../Response"));
+class Response extends Response_1.default {
+ constructor(header, body) {
+ super(header, body);
+ this.header.flags |= HeaderFlag_1.default.Response;
+ this.typeName = Packet_1.default.getPacketTypeName(this.header.type);
+ const packet = Packet_1.default.getPacketByPacketType(this.header.type);
+ if (Buffer.isBuffer(this.body.buffer) && packet.parseResponseBuffer) {
+ this.data = packet.parseResponseBuffer(this.body.buffer);
+ }
+ }
+ static parse(buffer) {
+ const { header, body } = Packet_1.default.parse(buffer);
+ return new Response(header, body);
+ }
+ serialize() {
+ return Packet_1.default.serialize(this.header, this.body);
+ }
+}
+exports.default = Response;
diff --git a/dist/protocol/smb2/ShareAccessType.d.ts b/dist/protocol/smb2/ShareAccessType.d.ts
new file mode 100644
index 0000000..12d2131
--- /dev/null
+++ b/dist/protocol/smb2/ShareAccessType.d.ts
@@ -0,0 +1,6 @@
+declare enum ShareAccessType {
+ Read = 1,
+ Write = 2,
+ Delete = 4
+}
+export default ShareAccessType;
diff --git a/dist/protocol/smb2/ShareAccessType.js b/dist/protocol/smb2/ShareAccessType.js
new file mode 100644
index 0000000..4826010
--- /dev/null
+++ b/dist/protocol/smb2/ShareAccessType.js
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ShareAccessType;
+(function (ShareAccessType) {
+ ShareAccessType[ShareAccessType["Read"] = 1] = "Read";
+ ShareAccessType[ShareAccessType["Write"] = 2] = "Write";
+ ShareAccessType[ShareAccessType["Delete"] = 4] = "Delete";
+})(ShareAccessType || (ShareAccessType = {}));
+exports.default = ShareAccessType;
diff --git a/dist/protocol/smb2/StatusCode.d.ts b/dist/protocol/smb2/StatusCode.d.ts
new file mode 100644
index 0000000..8b39232
--- /dev/null
+++ b/dist/protocol/smb2/StatusCode.d.ts
@@ -0,0 +1,9 @@
+declare enum StatusCode {
+ Success = 0,
+ Pending = 259,
+ MoreProcessingRequired = 3221225494,
+ FileNameNotFound = 3221225524,
+ FilePathNotFound = 3221225530,
+ FileClosed = 3221225768
+}
+export default StatusCode;
diff --git a/dist/protocol/smb2/StatusCode.js b/dist/protocol/smb2/StatusCode.js
new file mode 100644
index 0000000..d2ac12d
--- /dev/null
+++ b/dist/protocol/smb2/StatusCode.js
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var StatusCode;
+(function (StatusCode) {
+ StatusCode[StatusCode["Success"] = 0] = "Success";
+ StatusCode[StatusCode["Pending"] = 259] = "Pending";
+ StatusCode[StatusCode["MoreProcessingRequired"] = 3221225494] = "MoreProcessingRequired";
+ StatusCode[StatusCode["FileNameNotFound"] = 3221225524] = "FileNameNotFound";
+ StatusCode[StatusCode["FilePathNotFound"] = 3221225530] = "FilePathNotFound";
+ StatusCode[StatusCode["FileClosed"] = 3221225768] = "FileClosed";
+})(StatusCode || (StatusCode = {}));
+exports.default = StatusCode;
diff --git a/dist/protocol/smb2/packets/ChangeNotify.d.ts b/dist/protocol/smb2/packets/ChangeNotify.d.ts
new file mode 100644
index 0000000..edfe96d
--- /dev/null
+++ b/dist/protocol/smb2/packets/ChangeNotify.d.ts
@@ -0,0 +1,27 @@
+///
+import Structure from "../../Structure";
+import ChangeEntry from "../../models/ChangeEntry";
+export declare enum Flags {
+ None = 0,
+ WatchTreeRecursively = 1
+}
+export declare enum CompletionFilter {
+ FilenameChange = 1,
+ DirnameChange = 2,
+ AttributesChange = 4,
+ SizeChange = 8,
+ LastWriteChange = 16,
+ LastAccessChange = 32,
+ CreationChange = 64,
+ EaChange = 128,
+ SecurityChange = 256,
+ StreamNameChange = 512,
+ StreamSizeChange = 1024,
+ StreamWriteChange = 2048
+}
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+ parseResponseBuffer: (buffer: Buffer) => ChangeEntry[];
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/ChangeNotify.js b/dist/protocol/smb2/packets/ChangeNotify.js
new file mode 100644
index 0000000..cd8dab6
--- /dev/null
+++ b/dist/protocol/smb2/packets/ChangeNotify.js
@@ -0,0 +1,129 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CompletionFilter = exports.Flags = void 0;
+const util = __importStar(require("../../util"));
+const FileAction_1 = __importDefault(require("../FileAction"));
+const structureUtil = __importStar(require("../../structureUtil"));
+var Flags;
+(function (Flags) {
+ Flags[Flags["None"] = 0] = "None";
+ Flags[Flags["WatchTreeRecursively"] = 1] = "WatchTreeRecursively";
+})(Flags = exports.Flags || (exports.Flags = {}));
+var CompletionFilter;
+(function (CompletionFilter) {
+ CompletionFilter[CompletionFilter["FilenameChange"] = 1] = "FilenameChange";
+ CompletionFilter[CompletionFilter["DirnameChange"] = 2] = "DirnameChange";
+ CompletionFilter[CompletionFilter["AttributesChange"] = 4] = "AttributesChange";
+ CompletionFilter[CompletionFilter["SizeChange"] = 8] = "SizeChange";
+ CompletionFilter[CompletionFilter["LastWriteChange"] = 16] = "LastWriteChange";
+ CompletionFilter[CompletionFilter["LastAccessChange"] = 32] = "LastAccessChange";
+ CompletionFilter[CompletionFilter["CreationChange"] = 64] = "CreationChange";
+ CompletionFilter[CompletionFilter["EaChange"] = 128] = "EaChange";
+ CompletionFilter[CompletionFilter["SecurityChange"] = 256] = "SecurityChange";
+ CompletionFilter[CompletionFilter["StreamNameChange"] = 512] = "StreamNameChange";
+ CompletionFilter[CompletionFilter["StreamSizeChange"] = 1024] = "StreamSizeChange";
+ CompletionFilter[CompletionFilter["StreamWriteChange"] = 2048] = "StreamWriteChange";
+})(CompletionFilter = exports.CompletionFilter || (exports.CompletionFilter = {}));
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 32
+ },
+ flags: {
+ type: Number,
+ size: 2,
+ defaultValue: Flags.WatchTreeRecursively
+ },
+ outputBufferLength: {
+ type: Number,
+ size: 4,
+ defaultValue: 0x00010000
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ },
+ completionFilter: {
+ type: Number,
+ size: 4,
+ defaultValue: CompletionFilter.FilenameChange |
+ CompletionFilter.DirnameChange |
+ CompletionFilter.AttributesChange |
+ CompletionFilter.SizeChange |
+ CompletionFilter.LastWriteChange |
+ CompletionFilter.LastAccessChange |
+ CompletionFilter.CreationChange |
+ CompletionFilter.EaChange |
+ CompletionFilter.SecurityChange |
+ CompletionFilter.StreamNameChange |
+ CompletionFilter.StreamSizeChange |
+ CompletionFilter.StreamWriteChange
+ },
+ reserved: {
+ type: Number,
+ size: 4
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ outputBufferOffset: {
+ type: Number,
+ size: 2
+ },
+ outputBufferLength: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "outputBufferLength"
+ }
+};
+const parseChangeEntry = (entryBuffer) => {
+ const action = entryBuffer.readUInt32LE(0);
+ const filenameLength = entryBuffer.readUInt32LE(4);
+ const filename = util.toUnixFilePath(entryBuffer
+ .slice(8, 8 + filenameLength)
+ .toString("ucs2"));
+ const actionName = structureUtil.parseEnumValue(FileAction_1.default, action);
+ return {
+ action,
+ actionName,
+ filename
+ };
+};
+const parseResponseBuffer = (buffer) => {
+ return structureUtil.parseList(buffer, parseChangeEntry);
+};
+exports.default = {
+ requestStructure,
+ responseStructure,
+ parseResponseBuffer
+};
diff --git a/dist/protocol/smb2/packets/Close.d.ts b/dist/protocol/smb2/packets/Close.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/Close.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Close.js b/dist/protocol/smb2/packets/Close.js
new file mode 100644
index 0000000..346ea43
--- /dev/null
+++ b/dist/protocol/smb2/packets/Close.js
@@ -0,0 +1,69 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 24
+ },
+ flags: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 4
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ flags: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 4
+ },
+ creationTime: {
+ type: Number,
+ size: 8
+ },
+ lastAccessTime: {
+ type: Number,
+ size: 8
+ },
+ lastWriteTime: {
+ type: Number,
+ size: 8
+ },
+ changeTime: {
+ type: Number,
+ size: 8
+ },
+ allocationSize: {
+ type: Number,
+ size: 8
+ },
+ endOfFile: {
+ type: Number,
+ signedness: "Signed",
+ size: 8
+ },
+ fileAttributes: {
+ type: Number,
+ size: 4
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/Create.d.ts b/dist/protocol/smb2/packets/Create.d.ts
new file mode 100644
index 0000000..75803a6
--- /dev/null
+++ b/dist/protocol/smb2/packets/Create.d.ts
@@ -0,0 +1,10 @@
+import Structure from "../../Structure";
+export declare enum CreateOptions {
+ None = 0,
+ Directory = 1
+}
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Create.js b/dist/protocol/smb2/packets/Create.js
new file mode 100644
index 0000000..824a2b9
--- /dev/null
+++ b/dist/protocol/smb2/packets/Create.js
@@ -0,0 +1,168 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateOptions = void 0;
+const ShareAccessType_1 = __importDefault(require("../ShareAccessType"));
+const CreateDispositionType_1 = __importDefault(require("../CreateDispositionType"));
+var CreateOptions;
+(function (CreateOptions) {
+ CreateOptions[CreateOptions["None"] = 0] = "None";
+ CreateOptions[CreateOptions["Directory"] = 1] = "Directory";
+})(CreateOptions = exports.CreateOptions || (exports.CreateOptions = {}));
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 57
+ },
+ securityFlags: {
+ type: Number,
+ size: 1
+ },
+ requestedOplockLevel: {
+ type: Number,
+ size: 1
+ },
+ impersonationLevel: {
+ type: Number,
+ size: 4,
+ defaultValue: 0x00000002
+ },
+ smbCreateFlags: {
+ type: Number,
+ size: 8
+ },
+ reserved: {
+ type: Number,
+ size: 8
+ },
+ desiredAccess: {
+ type: Number,
+ size: 4,
+ defaultValue: 0x00100081
+ },
+ fileAttributes: {
+ type: Number,
+ size: 4
+ },
+ shareAccess: {
+ type: Number,
+ size: 4,
+ defaultValue: ShareAccessType_1.default.Read |
+ ShareAccessType_1.default.Write |
+ ShareAccessType_1.default.Delete
+ },
+ createDisposition: {
+ type: Number,
+ size: 4,
+ defaultValue: CreateDispositionType_1.default.Open
+ },
+ createOptions: {
+ type: Number,
+ size: 4,
+ defaultValue: CreateOptions.None
+ },
+ nameOffset: {
+ type: Number,
+ size: 2
+ },
+ nameLength: {
+ type: Number,
+ size: 2
+ },
+ createContextsOffset: {
+ type: Number,
+ size: 4
+ },
+ createContextsLength: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "nameLength"
+ },
+ reserved2: {
+ type: Number,
+ size: 2,
+ defaultValue: 0x4200
+ },
+ createContexts: {
+ type: Number,
+ sizeFieldName: "createContextsLength",
+ defaultValue: ""
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ oplockLevel: {
+ type: Number,
+ size: 1
+ },
+ flags: {
+ type: Number,
+ size: 1
+ },
+ createAction: {
+ type: Number,
+ size: 4
+ },
+ creationTime: {
+ type: Number,
+ size: 8
+ },
+ lastAccessTime: {
+ type: Number,
+ size: 8
+ },
+ lastWriteTime: {
+ type: Number,
+ size: 8
+ },
+ changeTime: {
+ type: Number,
+ size: 8
+ },
+ allocationSize: {
+ type: Number,
+ size: 8
+ },
+ endOfFile: {
+ type: Number,
+ size: 8
+ },
+ fileAttributes: {
+ type: Number,
+ size: 4
+ },
+ reserved2: {
+ type: Number,
+ size: 4
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ },
+ createContextsOffset: {
+ type: Number,
+ size: 4
+ },
+ createContextsLength: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "createContextsLength"
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/Echo.d.ts b/dist/protocol/smb2/packets/Echo.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/Echo.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Echo.js b/dist/protocol/smb2/packets/Echo.js
new file mode 100644
index 0000000..c3093fd
--- /dev/null
+++ b/dist/protocol/smb2/packets/Echo.js
@@ -0,0 +1,27 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 4
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/Flush.d.ts b/dist/protocol/smb2/packets/Flush.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/Flush.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Flush.js b/dist/protocol/smb2/packets/Flush.js
new file mode 100644
index 0000000..a913ec0
--- /dev/null
+++ b/dist/protocol/smb2/packets/Flush.js
@@ -0,0 +1,36 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 24
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ reserved2: {
+ type: Number,
+ size: 4
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/LogOff.d.ts b/dist/protocol/smb2/packets/LogOff.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/LogOff.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/LogOff.js b/dist/protocol/smb2/packets/LogOff.js
new file mode 100644
index 0000000..79c30b6
--- /dev/null
+++ b/dist/protocol/smb2/packets/LogOff.js
@@ -0,0 +1,28 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 4
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 4
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/Negotiate.d.ts b/dist/protocol/smb2/packets/Negotiate.d.ts
new file mode 100644
index 0000000..6d5edde
--- /dev/null
+++ b/dist/protocol/smb2/packets/Negotiate.d.ts
@@ -0,0 +1,15 @@
+import Structure from "../../Structure";
+import Capability from "../Capability";
+export interface RequestBody {
+ structureSize?: number;
+ dialects: number[];
+ securityMode?: number;
+ capabilities: Capability;
+ clientGuid: string;
+ clientStartDate: Date;
+}
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Negotiate.js b/dist/protocol/smb2/packets/Negotiate.js
new file mode 100644
index 0000000..d469ab8
--- /dev/null
+++ b/dist/protocol/smb2/packets/Negotiate.js
@@ -0,0 +1,107 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 36
+ },
+ dialectCount: {
+ type: Number,
+ signedness: "Unsigned",
+ size: 2
+ },
+ securityMode: {
+ type: Number,
+ size: 2,
+ defaultValue: 1
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ capabilities: {
+ type: Number,
+ size: 4
+ },
+ clientGuid: {
+ type: Number,
+ size: 16
+ },
+ clientStartTime: {
+ type: Number,
+ size: 8
+ },
+ dialects: {
+ type: Number,
+ countFieldName: "dialectCount",
+ size: 2
+ }
+};
+;
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ securityMode: {
+ type: Number,
+ size: 2
+ },
+ dialectRevision: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ serverGuid: {
+ type: Number,
+ size: 16
+ },
+ capabilities: {
+ type: Number,
+ size: 4
+ },
+ maxTransactSize: {
+ type: Number,
+ size: 4
+ },
+ maxReadSize: {
+ type: Number,
+ size: 4
+ },
+ maxWriteSize: {
+ type: Number,
+ size: 4
+ },
+ systemTime: {
+ type: Number,
+ size: 8
+ },
+ serverStartTime: {
+ type: Number,
+ size: 8
+ },
+ securityBufferOffset: {
+ type: Number,
+ size: 2
+ },
+ securityBufferLength: {
+ type: Number,
+ size: 2
+ },
+ reserved2: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "securityBufferLength"
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/QueryDirectory.d.ts b/dist/protocol/smb2/packets/QueryDirectory.d.ts
new file mode 100644
index 0000000..42a9e3e
--- /dev/null
+++ b/dist/protocol/smb2/packets/QueryDirectory.d.ts
@@ -0,0 +1,9 @@
+///
+import Structure from "../../Structure";
+import DirectoryEntry from "../../models/DirectoryEntry";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+ parseResponseBuffer: (buffer: Buffer) => DirectoryEntry[];
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/QueryDirectory.js b/dist/protocol/smb2/packets/QueryDirectory.js
new file mode 100644
index 0000000..7bfdd82
--- /dev/null
+++ b/dist/protocol/smb2/packets/QueryDirectory.js
@@ -0,0 +1,151 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../../util"));
+const FileAttribute_1 = __importDefault(require("../FileAttribute"));
+const structureUtil = __importStar(require("../../structureUtil"));
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 33
+ },
+ fileInformationClass: {
+ type: Number,
+ size: 1,
+ defaultValue: 37 // FileIdBothDirectoryInformation
+ },
+ flags: {
+ type: Number,
+ size: 1
+ },
+ fileIndex: {
+ type: Number,
+ size: 4
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ },
+ fileNameOffset: {
+ type: Number,
+ size: 2,
+ defaultValue: 96
+ },
+ fileNameLength: {
+ type: Number,
+ size: 2
+ },
+ outputBufferLength: {
+ type: Number,
+ size: 4,
+ defaultValue: 0x00010000
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "fileNameLength"
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ outputBufferOffset: {
+ type: Number,
+ size: 2
+ },
+ outputBufferLength: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "outputBufferLength"
+ }
+};
+const parseDirectoryEntry = (entryBuffer) => {
+ let offset = 0;
+ const index = entryBuffer.readUInt32LE(offset);
+ offset += 4;
+ const creationTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
+ offset += 8;
+ const lastAccessTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
+ offset += 8;
+ const lastWriteTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
+ offset += 8;
+ const changeTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
+ offset += 8;
+ const fileSize = entryBuffer.readBigUInt64LE(offset);
+ offset += 8;
+ const allocationSize = entryBuffer.readBigUInt64LE(offset);
+ offset += 8;
+ const fileAttributes = structureUtil.parseEnumValues(FileAttribute_1.default, entryBuffer.readUInt32LE(offset));
+ offset += 4;
+ const filenameLength = entryBuffer.readUInt32LE(offset);
+ offset += 4;
+ const eaSize = entryBuffer.readUInt32LE(offset);
+ offset += 4;
+ const shortNameLength = entryBuffer.readUInt8(offset);
+ offset += 1;
+ offset += 1; // reserved
+ let shortFilename;
+ if (shortNameLength !== 0) {
+ shortFilename = util.toUnixFilePath(entryBuffer
+ .slice(offset, offset + shortNameLength)
+ .toString("ucs2"));
+ }
+ offset += 24;
+ offset += 2; // reserved
+ const fileId = structureUtil.parseString(entryBuffer.slice(offset, offset + 8).reverse(), { type: String, encoding: "hex" });
+ offset += 8;
+ const filename = util.toUnixFilePath(entryBuffer
+ .slice(offset, offset + filenameLength)
+ .toString("ucs2"));
+ offset += filenameLength;
+ return {
+ type: fileAttributes.includes("Directory") ? "Directory" : "File",
+ index,
+ creationTime,
+ lastAccessTime,
+ lastWriteTime,
+ changeTime,
+ fileSize,
+ allocationSize,
+ eaSize,
+ shortFilename,
+ fileId,
+ filename,
+ fileAttributes
+ };
+};
+const parseResponseBuffer = (buffer) => {
+ return structureUtil.parseList(buffer, parseDirectoryEntry);
+};
+exports.default = {
+ requestStructure,
+ responseStructure,
+ parseResponseBuffer
+};
diff --git a/dist/protocol/smb2/packets/Read.d.ts b/dist/protocol/smb2/packets/Read.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/Read.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Read.js b/dist/protocol/smb2/packets/Read.js
new file mode 100644
index 0000000..3b90f9f
--- /dev/null
+++ b/dist/protocol/smb2/packets/Read.js
@@ -0,0 +1,89 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 49
+ },
+ padding: {
+ type: Number,
+ size: 1,
+ defaultValue: 80
+ },
+ flags: {
+ type: Number,
+ size: 1
+ },
+ length: {
+ type: Number,
+ size: 4
+ },
+ offset: {
+ type: Number,
+ size: 8
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ },
+ minimumCount: {
+ type: Number,
+ size: 4
+ },
+ channel: {
+ type: Number,
+ size: 4
+ },
+ remainingBytes: {
+ type: Number,
+ size: 4
+ },
+ readChannelInfoOffset: {
+ type: Number,
+ size: 2
+ },
+ readChannelInfoLength: {
+ type: Number,
+ size: 2
+ },
+ buffer: {
+ type: Buffer,
+ size: 1
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ dataOffset: {
+ type: Number,
+ size: 1
+ },
+ reserved: {
+ type: Number,
+ size: 1
+ },
+ dataLength: {
+ type: Number,
+ size: 4
+ },
+ dataRemaining: {
+ type: Number,
+ size: 4
+ },
+ reserved2: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "dataLength"
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/SessionSetup.d.ts b/dist/protocol/smb2/packets/SessionSetup.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/SessionSetup.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/SessionSetup.js b/dist/protocol/smb2/packets/SessionSetup.js
new file mode 100644
index 0000000..086bbd5
--- /dev/null
+++ b/dist/protocol/smb2/packets/SessionSetup.js
@@ -0,0 +1,70 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 25
+ },
+ flags: {
+ type: Number,
+ size: 1
+ },
+ securityMode: {
+ type: Number,
+ size: 1,
+ defaultValue: 1
+ },
+ capabilities: {
+ type: Number,
+ size: 4,
+ defaultValue: 1
+ },
+ channel: {
+ type: Number,
+ size: 4
+ },
+ securityBufferOffset: {
+ type: Number,
+ size: 2,
+ defaultValue: 88
+ },
+ securityBufferLength: {
+ type: Number,
+ size: 2
+ },
+ previousSessionId: {
+ type: Number,
+ size: 8
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "securityBufferLength"
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ sessionFlags: {
+ type: Number,
+ size: 2
+ },
+ securityBufferOffset: {
+ type: Number,
+ size: 2
+ },
+ securityBufferLength: {
+ type: Number,
+ size: 2
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "securityBufferLength"
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/SetInfo.d.ts b/dist/protocol/smb2/packets/SetInfo.d.ts
new file mode 100644
index 0000000..56f0fd6
--- /dev/null
+++ b/dist/protocol/smb2/packets/SetInfo.d.ts
@@ -0,0 +1,26 @@
+import Structure from "../../Structure";
+export declare enum InfoType {
+ File = 1,
+ Filesystem = 2,
+ Security = 3,
+ Quota = 4
+}
+export declare enum FileInfoClass {
+ AllocationInformation = 19,
+ BasicInformation = 4,
+ DispositionInformation = 13,
+ EndOfFileInformation = 20,
+ FullEaInformation = 15,
+ LinkInformation = 11,
+ ModeInformation = 16,
+ PipeInformation = 23,
+ PositionInformation = 14,
+ RenameInformation = 10,
+ ShortNameInformation = 40,
+ ValidDataLengthInformation = 39
+}
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/SetInfo.js b/dist/protocol/smb2/packets/SetInfo.js
new file mode 100644
index 0000000..4194fd6
--- /dev/null
+++ b/dist/protocol/smb2/packets/SetInfo.js
@@ -0,0 +1,78 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FileInfoClass = exports.InfoType = void 0;
+var InfoType;
+(function (InfoType) {
+ InfoType[InfoType["File"] = 1] = "File";
+ InfoType[InfoType["Filesystem"] = 2] = "Filesystem";
+ InfoType[InfoType["Security"] = 3] = "Security";
+ InfoType[InfoType["Quota"] = 4] = "Quota";
+})(InfoType = exports.InfoType || (exports.InfoType = {}));
+var FileInfoClass;
+(function (FileInfoClass) {
+ FileInfoClass[FileInfoClass["AllocationInformation"] = 19] = "AllocationInformation";
+ FileInfoClass[FileInfoClass["BasicInformation"] = 4] = "BasicInformation";
+ FileInfoClass[FileInfoClass["DispositionInformation"] = 13] = "DispositionInformation";
+ FileInfoClass[FileInfoClass["EndOfFileInformation"] = 20] = "EndOfFileInformation";
+ FileInfoClass[FileInfoClass["FullEaInformation"] = 15] = "FullEaInformation";
+ FileInfoClass[FileInfoClass["LinkInformation"] = 11] = "LinkInformation";
+ FileInfoClass[FileInfoClass["ModeInformation"] = 16] = "ModeInformation";
+ FileInfoClass[FileInfoClass["PipeInformation"] = 23] = "PipeInformation";
+ FileInfoClass[FileInfoClass["PositionInformation"] = 14] = "PositionInformation";
+ FileInfoClass[FileInfoClass["RenameInformation"] = 10] = "RenameInformation";
+ FileInfoClass[FileInfoClass["ShortNameInformation"] = 40] = "ShortNameInformation";
+ FileInfoClass[FileInfoClass["ValidDataLengthInformation"] = 39] = "ValidDataLengthInformation";
+})(FileInfoClass = exports.FileInfoClass || (exports.FileInfoClass = {}));
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 33
+ },
+ infoType: {
+ type: Number,
+ size: 1,
+ defaultValue: InfoType.File
+ },
+ fileInfoClass: {
+ type: Number,
+ size: 1,
+ defaultValue: FileInfoClass.EndOfFileInformation
+ },
+ bufferLength: {
+ type: Number,
+ size: 4
+ },
+ bufferOffset: {
+ type: Number,
+ size: 2,
+ defaultValue: 96
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ additionalInformation: {
+ type: Number,
+ size: 4
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "bufferLength"
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/TreeConnect.d.ts b/dist/protocol/smb2/packets/TreeConnect.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/TreeConnect.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/TreeConnect.js b/dist/protocol/smb2/packets/TreeConnect.js
new file mode 100644
index 0000000..97cd5c1
--- /dev/null
+++ b/dist/protocol/smb2/packets/TreeConnect.js
@@ -0,0 +1,56 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 9
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ pathOffset: {
+ type: Number,
+ size: 2,
+ defaultValue: 72
+ },
+ pathLength: {
+ type: Number,
+ size: 2
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "pathLength"
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ shareType: {
+ type: Number,
+ size: 1
+ },
+ reserved: {
+ type: Number,
+ size: 1
+ },
+ shareFlags: {
+ type: Number,
+ size: 4
+ },
+ capabilities: {
+ type: Number,
+ size: 4
+ },
+ maximalAccess: {
+ type: Number,
+ size: 4
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/TreeDisconnect.d.ts b/dist/protocol/smb2/packets/TreeDisconnect.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/TreeDisconnect.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/TreeDisconnect.js b/dist/protocol/smb2/packets/TreeDisconnect.js
new file mode 100644
index 0000000..c3093fd
--- /dev/null
+++ b/dist/protocol/smb2/packets/TreeDisconnect.js
@@ -0,0 +1,27 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 4
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/Write.d.ts b/dist/protocol/smb2/packets/Write.d.ts
new file mode 100644
index 0000000..00e7040
--- /dev/null
+++ b/dist/protocol/smb2/packets/Write.d.ts
@@ -0,0 +1,6 @@
+import Structure from "../../Structure";
+declare const _default: {
+ requestStructure: Structure;
+ responseStructure: Structure;
+};
+export default _default;
diff --git a/dist/protocol/smb2/packets/Write.js b/dist/protocol/smb2/packets/Write.js
new file mode 100644
index 0000000..97b1fe8
--- /dev/null
+++ b/dist/protocol/smb2/packets/Write.js
@@ -0,0 +1,81 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const requestStructure = {
+ structureSize: {
+ type: Number,
+ size: 2,
+ defaultValue: 49
+ },
+ dataOffset: {
+ type: Number,
+ size: 2,
+ defaultValue: 112
+ },
+ length: {
+ type: Number,
+ size: 4
+ },
+ offset: {
+ type: Number,
+ size: 8
+ },
+ fileId: {
+ type: String,
+ encoding: "hex",
+ size: 16
+ },
+ channel: {
+ type: Number,
+ size: 4
+ },
+ remainingBytes: {
+ type: Number,
+ size: 4
+ },
+ writeChannelInfoOffset: {
+ type: Number,
+ size: 2
+ },
+ writeChannelInfoLength: {
+ type: Number,
+ size: 2
+ },
+ flags: {
+ type: Number,
+ size: 4
+ },
+ buffer: {
+ type: Buffer,
+ sizeFieldName: "length"
+ }
+};
+const responseStructure = {
+ structureSize: {
+ type: Number,
+ size: 2
+ },
+ reserved: {
+ type: Number,
+ size: 2
+ },
+ count: {
+ type: Number,
+ size: 4
+ },
+ remaining: {
+ type: Number,
+ size: 4
+ },
+ writeChannelInfoOffset: {
+ type: Number,
+ size: 2
+ },
+ writeChannelInfoLength: {
+ type: Number,
+ size: 2
+ }
+};
+exports.default = {
+ requestStructure,
+ responseStructure
+};
diff --git a/dist/protocol/smb2/packets/index.d.ts b/dist/protocol/smb2/packets/index.d.ts
new file mode 100644
index 0000000..bd0933f
--- /dev/null
+++ b/dist/protocol/smb2/packets/index.d.ts
@@ -0,0 +1,14 @@
+export { default as Negotiate } from "./Negotiate";
+export { default as SessionSetup } from "./SessionSetup";
+export { default as LogOff } from "./LogOff";
+export { default as TreeConnect } from "./TreeConnect";
+export { default as TreeDisconnect } from "./TreeDisconnect";
+export { default as Create } from "./Create";
+export { default as Close } from "./Close";
+export { default as Flush } from "./Flush";
+export { default as Read } from "./Read";
+export { default as Write } from "./Write";
+export { default as Echo } from "./Echo";
+export { default as QueryDirectory } from "./QueryDirectory";
+export { default as ChangeNotify } from "./ChangeNotify";
+export { default as SetInfo } from "./SetInfo";
diff --git a/dist/protocol/smb2/packets/index.js b/dist/protocol/smb2/packets/index.js
new file mode 100644
index 0000000..08a4474
--- /dev/null
+++ b/dist/protocol/smb2/packets/index.js
@@ -0,0 +1,34 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SetInfo = exports.ChangeNotify = exports.QueryDirectory = exports.Echo = exports.Write = exports.Read = exports.Flush = exports.Close = exports.Create = exports.TreeDisconnect = exports.TreeConnect = exports.LogOff = exports.SessionSetup = exports.Negotiate = void 0;
+var Negotiate_1 = require("./Negotiate");
+Object.defineProperty(exports, "Negotiate", { enumerable: true, get: function () { return __importDefault(Negotiate_1).default; } });
+var SessionSetup_1 = require("./SessionSetup");
+Object.defineProperty(exports, "SessionSetup", { enumerable: true, get: function () { return __importDefault(SessionSetup_1).default; } });
+var LogOff_1 = require("./LogOff");
+Object.defineProperty(exports, "LogOff", { enumerable: true, get: function () { return __importDefault(LogOff_1).default; } });
+var TreeConnect_1 = require("./TreeConnect");
+Object.defineProperty(exports, "TreeConnect", { enumerable: true, get: function () { return __importDefault(TreeConnect_1).default; } });
+var TreeDisconnect_1 = require("./TreeDisconnect");
+Object.defineProperty(exports, "TreeDisconnect", { enumerable: true, get: function () { return __importDefault(TreeDisconnect_1).default; } });
+var Create_1 = require("./Create");
+Object.defineProperty(exports, "Create", { enumerable: true, get: function () { return __importDefault(Create_1).default; } });
+var Close_1 = require("./Close");
+Object.defineProperty(exports, "Close", { enumerable: true, get: function () { return __importDefault(Close_1).default; } });
+var Flush_1 = require("./Flush");
+Object.defineProperty(exports, "Flush", { enumerable: true, get: function () { return __importDefault(Flush_1).default; } });
+var Read_1 = require("./Read");
+Object.defineProperty(exports, "Read", { enumerable: true, get: function () { return __importDefault(Read_1).default; } });
+var Write_1 = require("./Write");
+Object.defineProperty(exports, "Write", { enumerable: true, get: function () { return __importDefault(Write_1).default; } });
+var Echo_1 = require("./Echo");
+Object.defineProperty(exports, "Echo", { enumerable: true, get: function () { return __importDefault(Echo_1).default; } });
+var QueryDirectory_1 = require("./QueryDirectory");
+Object.defineProperty(exports, "QueryDirectory", { enumerable: true, get: function () { return __importDefault(QueryDirectory_1).default; } });
+var ChangeNotify_1 = require("./ChangeNotify");
+Object.defineProperty(exports, "ChangeNotify", { enumerable: true, get: function () { return __importDefault(ChangeNotify_1).default; } });
+var SetInfo_1 = require("./SetInfo");
+Object.defineProperty(exports, "SetInfo", { enumerable: true, get: function () { return __importDefault(SetInfo_1).default; } });
diff --git a/dist/protocol/structureUtil.d.ts b/dist/protocol/structureUtil.d.ts
new file mode 100644
index 0000000..1d12aec
--- /dev/null
+++ b/dist/protocol/structureUtil.d.ts
@@ -0,0 +1,16 @@
+///
+import Value from "./Value";
+import Structure from "./Structure";
+import StructureField from "./StructureField";
+export declare const parseStructure: (buffer: Buffer, structure: Structure) => any;
+export declare const parseNumber: (buffer: Buffer, structureField: StructureField) => number | bigint;
+export declare const parseValue: (buffer: Buffer, structureField: StructureField) => Value;
+export declare const parseString: (buffer: Buffer, structureField: StructureField) => string;
+export declare const parseDate: (buffer: Buffer) => Date;
+export declare const parseEnumValue: (enumObject: any, value: number | string) => string;
+export declare const parseEnumValues: (enumObject: any, value: number) => string[];
+export declare const parseList: (buffer: Buffer, parser: (entryBuffer: Buffer) => EntryType) => EntryType[];
+export declare const serializeStructure: (structure: Structure, data: any) => Buffer;
+export declare const serializeValue: (value: Value, structureField: StructureField) => Buffer;
+export declare const serializeDate: (date: Date) => Buffer;
+export declare const serializeString: (value: string, structureField: StructureField) => Buffer;
diff --git a/dist/protocol/structureUtil.js b/dist/protocol/structureUtil.js
new file mode 100644
index 0000000..67576ab
--- /dev/null
+++ b/dist/protocol/structureUtil.js
@@ -0,0 +1,175 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.serializeString = exports.serializeDate = exports.serializeValue = exports.serializeStructure = exports.parseList = exports.parseEnumValues = exports.parseEnumValue = exports.parseDate = exports.parseString = exports.parseValue = exports.parseNumber = exports.parseStructure = void 0;
+const moment_timezone_1 = __importDefault(require("moment-timezone"));
+exports.parseStructure = (buffer, structure) => {
+ let offset = 0;
+ const data = {};
+ const structureFieldNames = Object.keys(structure);
+ for (const structureFieldName of structureFieldNames) {
+ const structureField = structure[structureFieldName];
+ let size;
+ if (structureField.sizeFieldName) {
+ size = data[structureField.sizeFieldName];
+ if (typeof size === "undefined")
+ throw new Error(`invalid_size_field_name: ${structureField.sizeFieldName}`);
+ }
+ else if (typeof structureField.size === "number") {
+ size = structureField.size;
+ }
+ else
+ throw new Error(`unknown_field_size`);
+ structureField.count = typeof structureField.count === "number" ?
+ structureField.count :
+ 1;
+ if (structureField.countFieldName) {
+ structureField.count = data[structureField.countFieldName];
+ if (typeof structureField.count === "undefined")
+ throw new Error(`invalid_count_field_name: ${structureField.countFieldName}`);
+ }
+ const value = buffer.slice(offset, offset + (size * structureField.count));
+ data[structureFieldName] = exports.parseValue(value, structureField);
+ offset += size * structureField.count;
+ }
+ return data;
+};
+exports.parseNumber = (buffer, structureField) => {
+ if (structureField.size === 2 && buffer.length === 2) {
+ return structureField.signedness === "Unsigned" ?
+ buffer.readUInt16LE(0) :
+ buffer.readInt16LE(0);
+ }
+ if (structureField.size === 4 && buffer.length === 4) {
+ return structureField.signedness === "Unsigned" ?
+ buffer.readUInt32LE(0) :
+ buffer.readInt32LE(0);
+ }
+ if (structureField.size === 8 && buffer.length === 8) {
+ return structureField.signedness === "Unsigned" ?
+ buffer.readBigUInt64LE(0) :
+ buffer.readBigInt64LE(0);
+ }
+ let result = 0;
+ for (let index = 0; index < buffer.length; index++) {
+ result += buffer.readUInt8(index) << (index * 8);
+ }
+ return result;
+};
+exports.parseValue = (buffer, structureField) => {
+ if (structureField.count > 1) {
+ const entryBuffers = [];
+ for (let index = 0; index < structureField.count; index++) {
+ const entryBuffer = buffer.slice(index * structureField.size, (index + 1) * structureField.size);
+ entryBuffers.push(entryBuffer);
+ }
+ return entryBuffers.map(entryBuffer => exports.parseValue(entryBuffer, { ...structureField, count: 1 }));
+ }
+ let value = buffer;
+ if (structureField.type === String)
+ value = exports.parseString(buffer, structureField);
+ else if (structureField.type === Number)
+ value = exports.parseNumber(buffer, structureField);
+ return value;
+};
+exports.parseString = (buffer, structureField) => {
+ return buffer.slice(0, structureField.size).toString(structureField.encoding);
+};
+exports.parseDate = (buffer) => {
+ const milliseconds = Number(buffer.readBigUInt64LE(0) / 10000n);
+ return moment_timezone_1.default.utc("1601-01-01").add(milliseconds, "milliseconds").toDate();
+};
+exports.parseEnumValue = (enumObject, value) => {
+ return Object.keys(enumObject)
+ .find(x => enumObject[x] === value);
+};
+exports.parseEnumValues = (enumObject, value) => {
+ return Object.keys(enumObject)
+ .filter(x => (enumObject[x] & value) !== 0);
+};
+exports.parseList = (buffer, parser) => {
+ if (buffer.length === 0)
+ return [];
+ let currentOffset = 0;
+ let nextEntryOffset = -1;
+ const list = [];
+ while (nextEntryOffset !== 0) {
+ nextEntryOffset = buffer.readUInt32LE(currentOffset);
+ const entryBufferStart = currentOffset + 4;
+ const entryBufferEnd = nextEntryOffset === 0 ?
+ buffer.length :
+ currentOffset + nextEntryOffset;
+ const entryBuffer = buffer.slice(entryBufferStart, entryBufferEnd);
+ list.push(parser(entryBuffer));
+ currentOffset += nextEntryOffset;
+ }
+ return list;
+};
+exports.serializeStructure = (structure, data) => {
+ const normalizedData = {};
+ const structureFieldNames = Object.keys(structure);
+ for (const structureFieldName of structureFieldNames) {
+ const structureField = structure[structureFieldName];
+ const value = typeof data[structureFieldName] !== "undefined" ?
+ data[structureFieldName] :
+ structureField.defaultValue || 0;
+ normalizedData[structureFieldName] = {};
+ if (structureField.sizeFieldName) {
+ structureField.size = Buffer.isBuffer(value) ?
+ value.length :
+ 0;
+ const referencedStructureField = structure[structureField.sizeFieldName];
+ normalizedData[structureField.sizeFieldName].value = exports.serializeValue(structureField.size, referencedStructureField);
+ }
+ structureField.count = typeof structureField.count === "number" ?
+ structureField.count :
+ 1;
+ if (structureField.countFieldName) {
+ structureField.count = Array.isArray(value) ?
+ value.length :
+ 0;
+ const referencedStructureField = structure[structureField.countFieldName];
+ normalizedData[structureField.countFieldName].value = exports.serializeValue(structureField.count, referencedStructureField);
+ }
+ normalizedData[structureFieldName].value = exports.serializeValue(value, structureField);
+ normalizedData[structureFieldName].size = structureField.size * structureField.count;
+ }
+ const normalizedFields = structureFieldNames.map(x => normalizedData[x]);
+ const bufferSize = normalizedFields.reduce((prev, current) => prev + current.size, 0);
+ const buffer = Buffer.allocUnsafe(bufferSize);
+ let offset = 0;
+ for (const normalizedField of normalizedFields) {
+ normalizedField.value.copy(buffer, offset);
+ offset += normalizedField.size;
+ }
+ return buffer;
+};
+exports.serializeValue = (value, structureField) => {
+ if (structureField.count > 1 && Array.isArray(value)) {
+ const buffers = value.map(listEntry => exports.serializeValue(listEntry, { ...structureField, count: 1 }));
+ return Buffer.concat(buffers);
+ }
+ if (Buffer.isBuffer(value))
+ return value;
+ if (typeof value === "string")
+ return exports.serializeString(value, structureField);
+ const bignumberValue = BigInt(value);
+ const result = Buffer.allocUnsafe(structureField.size);
+ for (let index = 0; index < structureField.size; index++) {
+ const offset = BigInt(index * 8);
+ const byte = 0xffn & (bignumberValue >> offset);
+ result.writeUInt8(Number(byte), index);
+ }
+ return result;
+};
+exports.serializeDate = (date) => {
+ const milliseconds = moment_timezone_1.default(date).diff(moment_timezone_1.default.utc("1601-01-01"), "milliseconds");
+ const buffer = Buffer.allocUnsafe(8);
+ buffer.writeBigInt64LE(BigInt(milliseconds) * 10000n, 0);
+ return buffer;
+};
+exports.serializeString = (value, structureField) => {
+ return Buffer.from(value, structureField.encoding);
+};
diff --git a/dist/protocol/util.d.ts b/dist/protocol/util.d.ts
new file mode 100644
index 0000000..78e6f76
--- /dev/null
+++ b/dist/protocol/util.d.ts
@@ -0,0 +1,7 @@
+///
+export declare const toUnixFilePath: (value: string) => string;
+export declare const toWindowsFilePath: (value: string) => string;
+export declare const toUnixPath: (value: string) => string;
+export declare const toWindowsPath: (value: string) => string;
+export declare const getRandomInt: (min: number, max: number) => number;
+export declare const generateGuid: () => Buffer;
diff --git a/dist/protocol/util.js b/dist/protocol/util.js
new file mode 100644
index 0000000..9b2c31c
--- /dev/null
+++ b/dist/protocol/util.js
@@ -0,0 +1,58 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.generateGuid = exports.getRandomInt = exports.toWindowsPath = exports.toUnixPath = exports.toWindowsFilePath = exports.toUnixFilePath = void 0;
+const crypto_1 = __importDefault(require("crypto"));
+exports.toUnixFilePath = (value) => {
+ value = exports.toUnixPath(value);
+ if (value[0] !== "/" && value[0] !== ".")
+ value = `./${value}`;
+ if (value[0] === "/")
+ value = `.${value}`;
+ return value;
+};
+exports.toWindowsFilePath = (value) => {
+ if (value[0] === ".")
+ value = value.substring(1);
+ if (value[0] === "/")
+ value = value.substring(1);
+ value = exports.toWindowsPath(value);
+ return value;
+};
+exports.toUnixPath = (value) => {
+ value = value.replace(/\\/g, "/");
+ return value;
+};
+exports.toWindowsPath = (value) => {
+ value = value.replace(/\//g, "\\");
+ return value;
+};
+exports.getRandomInt = (min, max) => {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+};
+exports.generateGuid = () => {
+ const timeLow = exports.getRandomInt(0, Math.pow(2, 32) - 1);
+ const timeMiddle = exports.getRandomInt(0, Math.pow(2, 16) - 1);
+ const timeHighAndVersion = 0x4000 | exports.getRandomInt(0, Math.pow(2, 12) - 1);
+ const clockSequenceHighAndReserved = 0x80 | exports.getRandomInt(0, Math.pow(2, 6) - 1);
+ const clockSequenceLow = exports.getRandomInt(0, Math.pow(2, 8) - 1);
+ const node = crypto_1.default.randomBytes(6);
+ const buffer = Buffer.alloc(16);
+ let offset = 0;
+ buffer.writeUInt32LE(timeLow, offset);
+ offset += 4;
+ buffer.writeUInt16LE(timeMiddle, offset);
+ offset += 2;
+ buffer.writeUInt16LE(timeHighAndVersion, offset);
+ offset += 2;
+ buffer.writeUInt8(clockSequenceHighAndReserved, offset);
+ offset += 1;
+ buffer.writeUInt8(clockSequenceLow, offset);
+ offset += 1;
+ node.copy(buffer, offset);
+ return buffer;
+};
diff --git a/dist/server/Client.d.ts b/dist/server/Client.d.ts
new file mode 100644
index 0000000..3b8a762
--- /dev/null
+++ b/dist/server/Client.d.ts
@@ -0,0 +1,23 @@
+///
+import { Socket } from "net";
+import Server from "./Server";
+import { EventEmitter } from "events";
+import Request from "../protocol/Request";
+import Response from "../protocol/Response";
+import Dialect from "../protocol/smb2/Dialect";
+interface Client {
+ on(event: "request", callback: (req: Request) => void): this;
+ once(event: "request", callback: (req: Request) => void): this;
+}
+declare class Client extends EventEmitter {
+ private server;
+ private socket;
+ private restChunk;
+ targetDialect: Dialect;
+ targetDialectName: string;
+ constructor(server: Server, socket: Socket);
+ setup(): void;
+ private onData;
+ send(response: Response): void;
+}
+export default Client;
diff --git a/dist/server/Client.js b/dist/server/Client.js
new file mode 100644
index 0000000..75b8c12
--- /dev/null
+++ b/dist/server/Client.js
@@ -0,0 +1,64 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const events_1 = require("events");
+const SmbRequest_1 = __importDefault(require("./SmbRequest"));
+const Smb2Request_1 = __importDefault(require("./Smb2Request"));
+const Packet_1 = __importDefault(require("../protocol/Packet"));
+const protocolIds = __importStar(require("../protocol/protocolIds"));
+class Client extends events_1.EventEmitter {
+ constructor(server, socket) {
+ super();
+ this.server = server;
+ this.socket = socket;
+ this.onData = (buffer) => {
+ if (this.restChunk) {
+ buffer = Buffer.concat([this.restChunk, buffer]);
+ this.restChunk = undefined;
+ }
+ const { chunks, restChunk } = Packet_1.default.getChunks(buffer);
+ this.restChunk = restChunk;
+ for (const chunk of chunks) {
+ const protocolId = Packet_1.default.parseProtocolId(chunk);
+ if (protocolId === protocolIds.smb) {
+ const request = SmbRequest_1.default.parse(chunk);
+ this.emit("request", request);
+ }
+ else {
+ const request = Smb2Request_1.default.parse(chunk);
+ this.emit("request", request);
+ }
+ }
+ };
+ }
+ setup() {
+ this.socket.setNoDelay(true);
+ this.socket.addListener("data", this.onData);
+ }
+ send(response) {
+ const buffer = response.serialize();
+ this.socket.write(buffer);
+ }
+}
+exports.default = Client;
diff --git a/dist/server/Middleware.d.ts b/dist/server/Middleware.d.ts
new file mode 100644
index 0000000..e321299
--- /dev/null
+++ b/dist/server/Middleware.d.ts
@@ -0,0 +1,4 @@
+import Request from "./Request";
+import Response from "./Response";
+declare type Middleware = (req: Request, res: Response) => void | Promise;
+export default Middleware;
diff --git a/dist/server/Middleware.js b/dist/server/Middleware.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/server/Middleware.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/server/Request.d.ts b/dist/server/Request.d.ts
new file mode 100644
index 0000000..9b89226
--- /dev/null
+++ b/dist/server/Request.d.ts
@@ -0,0 +1,4 @@
+import SmbRequest from "./SmbRequest";
+import Smb2Request from "./Smb2Request";
+declare type Request = SmbRequest | Smb2Request;
+export default Request;
diff --git a/dist/server/Request.js b/dist/server/Request.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/server/Request.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/server/Response.d.ts b/dist/server/Response.d.ts
new file mode 100644
index 0000000..2fd2efe
--- /dev/null
+++ b/dist/server/Response.d.ts
@@ -0,0 +1,4 @@
+import SmbResponse from "./SmbResponse";
+import Smb2Response from "./Smb2Response";
+declare type Response = SmbResponse | Smb2Response;
+export default Response;
diff --git a/dist/server/Response.js b/dist/server/Response.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/dist/server/Response.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/server/Server.d.ts b/dist/server/Server.d.ts
new file mode 100644
index 0000000..b976717
--- /dev/null
+++ b/dist/server/Server.d.ts
@@ -0,0 +1,21 @@
+///
+import Client from "./Client";
+import Request from "./Request";
+import net from "net";
+import Middleware from "./Middleware";
+export default class Server {
+ port: number;
+ private clients;
+ private server;
+ startDate: Date;
+ guid: Buffer;
+ private middlewares;
+ constructor();
+ listen(port?: number): Promise;
+ private onConnection;
+ onRequest: (client: Client) => (req: Request) => Promise;
+ initRequest(req: Request, client: Client): Request;
+ handleRequest(req: Request): Promise;
+ redirect(from: Request, to: Request): Promise;
+ use(middleware: Middleware): void;
+}
diff --git a/dist/server/Server.js b/dist/server/Server.js
new file mode 100644
index 0000000..42a8d42
--- /dev/null
+++ b/dist/server/Server.js
@@ -0,0 +1,122 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Client_1 = __importDefault(require("./Client"));
+const net_1 = __importDefault(require("net"));
+const moment_timezone_1 = __importDefault(require("moment-timezone"));
+const SmbResponse_1 = __importDefault(require("./SmbResponse"));
+const util = __importStar(require("../protocol/util"));
+const Smb2Response_1 = __importDefault(require("./Smb2Response"));
+const requestType_1 = __importDefault(require("./middlewares/requestType"));
+const protocolIds = __importStar(require("../protocol/protocolIds"));
+const PacketType_1 = __importDefault(require("../protocol/smb/PacketType"));
+const PacketType_2 = __importDefault(require("../protocol/smb2/PacketType"));
+const smbRequestHandlers = __importStar(require("./requestHandlers/smb"));
+const smb2RequestHandlers = __importStar(require("./requestHandlers/smb2"));
+const supportedProtocols_1 = __importDefault(require("./middlewares/supportedProtocols"));
+class Server {
+ constructor() {
+ this.clients = [];
+ this.server = net_1.default.createServer();
+ this.guid = util.generateGuid();
+ this.middlewares = [];
+ this.onConnection = (socket) => {
+ const client = new Client_1.default(this, socket);
+ client.on("request", this.onRequest(client));
+ client.setup();
+ this.clients.push(client);
+ };
+ this.onRequest = (client) => async (req) => {
+ this.initRequest(req, client);
+ await this.handleRequest(req);
+ };
+ this.use(supportedProtocols_1.default([protocolIds.smb, protocolIds.smb2]));
+ const smb2RequestHandlerTypes = Object.keys(smb2RequestHandlers);
+ for (const smb2RequestHandlerType of smb2RequestHandlerTypes) {
+ const handler = requestType_1.default(protocolIds.smb2, PacketType_2.default[smb2RequestHandlerType], smb2RequestHandlers[smb2RequestHandlerType]);
+ this.use(handler);
+ }
+ const smbRequestHandlerTypes = Object.keys(smbRequestHandlers);
+ for (const smbRequestHandlerType of smbRequestHandlerTypes) {
+ const handler = requestType_1.default(protocolIds.smb, PacketType_1.default[smbRequestHandlerType], smbRequestHandlers[smbRequestHandlerType]);
+ this.use(handler);
+ }
+ this.server.addListener("connection", this.onConnection);
+ }
+ async listen(port = 445) {
+ this.port = port;
+ await new Promise((resolve) => {
+ this.server.listen({ port }, () => {
+ resolve();
+ });
+ });
+ this.startDate = moment_timezone_1.default().toDate();
+ return this.server;
+ }
+ initRequest(req, client) {
+ req.server = this;
+ req.client = client;
+ return req;
+ }
+ async handleRequest(req) {
+ let res;
+ if (req.header.protocolId === protocolIds.smb) {
+ const header = req.header;
+ res = new SmbResponse_1.default({
+ protocolId: header.protocolId,
+ type: header.type,
+ treeId: header.treeId,
+ userId: header.userId
+ });
+ }
+ else {
+ const header = req.header;
+ res = new Smb2Response_1.default({
+ protocolId: header.protocolId,
+ type: header.type,
+ messageId: header.messageId,
+ clientId: header.clientId,
+ treeId: header.treeId,
+ sessionId: header.sessionId,
+ signature: header.signature
+ });
+ }
+ req.response = res;
+ for (const middleware of this.middlewares) {
+ await middleware(req, res);
+ if (res.sent)
+ return req.client.send(res);
+ if (res.redirectedReq)
+ return await this.redirect(req, res.redirectedReq);
+ }
+ }
+ async redirect(from, to) {
+ this.initRequest(to, from.client);
+ await this.handleRequest(to);
+ }
+ use(middleware) {
+ this.middlewares.push(middleware);
+ }
+}
+exports.default = Server;
diff --git a/dist/server/Smb2Request.d.ts b/dist/server/Smb2Request.d.ts
new file mode 100644
index 0000000..d1ae2e4
--- /dev/null
+++ b/dist/server/Smb2Request.d.ts
@@ -0,0 +1,7 @@
+import Client from "./Client";
+import Server from "./Server";
+import ProtocolSmb2Request from "../protocol/smb2/Request";
+export default class Smb2Request extends ProtocolSmb2Request {
+ server?: Server;
+ client?: Client;
+}
diff --git a/dist/server/Smb2Request.js b/dist/server/Smb2Request.js
new file mode 100644
index 0000000..2aa14d4
--- /dev/null
+++ b/dist/server/Smb2Request.js
@@ -0,0 +1,9 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Request_1 = __importDefault(require("../protocol/smb2/Request"));
+class Smb2Request extends Request_1.default {
+}
+exports.default = Smb2Request;
diff --git a/dist/server/Smb2Response.d.ts b/dist/server/Smb2Response.d.ts
new file mode 100644
index 0000000..c87966e
--- /dev/null
+++ b/dist/server/Smb2Response.d.ts
@@ -0,0 +1,11 @@
+import Request from "./Request";
+import Value from "../protocol/Value";
+import ProtocolSmb2Response from "../protocol/smb2/Response";
+export default class Smb2Response extends ProtocolSmb2Response {
+ sent: boolean;
+ redirectedReq: Request;
+ status(status: number): this;
+ set(name: string, value: Value): void;
+ send(data: any): void;
+ redirect(req: Request): void;
+}
diff --git a/dist/server/Smb2Response.js b/dist/server/Smb2Response.js
new file mode 100644
index 0000000..340e528
--- /dev/null
+++ b/dist/server/Smb2Response.js
@@ -0,0 +1,27 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Response_1 = __importDefault(require("../protocol/smb2/Response"));
+class Smb2Response extends Response_1.default {
+ constructor() {
+ super(...arguments);
+ this.sent = false;
+ }
+ status(status) {
+ this.header.status = status;
+ return this;
+ }
+ set(name, value) {
+ this.header[name] = value;
+ }
+ send(data) {
+ this.body = data;
+ this.sent = true;
+ }
+ redirect(req) {
+ this.redirectedReq = req;
+ }
+}
+exports.default = Smb2Response;
diff --git a/dist/server/SmbRequest.d.ts b/dist/server/SmbRequest.d.ts
new file mode 100644
index 0000000..23776db
--- /dev/null
+++ b/dist/server/SmbRequest.d.ts
@@ -0,0 +1,7 @@
+import Client from "./Client";
+import Server from "./Server";
+import ProtocolSmbRequest from "../protocol/smb/Request";
+export default class SmbRequest extends ProtocolSmbRequest {
+ server?: Server;
+ client?: Client;
+}
diff --git a/dist/server/SmbRequest.js b/dist/server/SmbRequest.js
new file mode 100644
index 0000000..4e356bc
--- /dev/null
+++ b/dist/server/SmbRequest.js
@@ -0,0 +1,9 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Request_1 = __importDefault(require("../protocol/smb/Request"));
+class SmbRequest extends Request_1.default {
+}
+exports.default = SmbRequest;
diff --git a/dist/server/SmbResponse.d.ts b/dist/server/SmbResponse.d.ts
new file mode 100644
index 0000000..d1b13d8
--- /dev/null
+++ b/dist/server/SmbResponse.d.ts
@@ -0,0 +1,11 @@
+import Request from "./Request";
+import Value from "../protocol/Value";
+import ProtocolSmbResponse from "../protocol/smb/Response";
+export default class SmbResponse extends ProtocolSmbResponse {
+ sent: boolean;
+ redirectedReq: Request;
+ status(status: number): this;
+ set(name: string, value: Value): void;
+ send(data: any): void;
+ redirect(req: Request): void;
+}
diff --git a/dist/server/SmbResponse.js b/dist/server/SmbResponse.js
new file mode 100644
index 0000000..9f86bf4
--- /dev/null
+++ b/dist/server/SmbResponse.js
@@ -0,0 +1,27 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Response_1 = __importDefault(require("../protocol/smb/Response"));
+class SmbResponse extends Response_1.default {
+ constructor() {
+ super(...arguments);
+ this.sent = false;
+ }
+ status(status) {
+ this.header.status = status;
+ return this;
+ }
+ set(name, value) {
+ this.header[name] = value;
+ }
+ send(data) {
+ this.body = data;
+ this.sent = true;
+ }
+ redirect(req) {
+ this.redirectedReq = req;
+ }
+}
+exports.default = SmbResponse;
diff --git a/dist/server/middlewares/requestType.d.ts b/dist/server/middlewares/requestType.d.ts
new file mode 100644
index 0000000..f5121e7
--- /dev/null
+++ b/dist/server/middlewares/requestType.d.ts
@@ -0,0 +1,6 @@
+import Request from "../Smb2Request";
+import Response from "../Smb2Response";
+import Middleware from "../Middleware";
+import PacketType from "../../protocol/smb2/PacketType";
+declare const _default: (protocolId: string, packetType: PacketType, middleware: Middleware) => (req: Request, res: Response) => Promise;
+export default _default;
diff --git a/dist/server/middlewares/requestType.js b/dist/server/middlewares/requestType.js
new file mode 100644
index 0000000..869588e
--- /dev/null
+++ b/dist/server/middlewares/requestType.js
@@ -0,0 +1,7 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.default = (protocolId, packetType, middleware) => async (req, res) => {
+ if (req.header.protocolId === protocolId &&
+ req.header.type === packetType)
+ return await middleware(req, res);
+};
diff --git a/dist/server/middlewares/supportedProtocols.d.ts b/dist/server/middlewares/supportedProtocols.d.ts
new file mode 100644
index 0000000..056858b
--- /dev/null
+++ b/dist/server/middlewares/supportedProtocols.d.ts
@@ -0,0 +1,4 @@
+import Request from "../Smb2Request";
+import Response from "../Smb2Response";
+declare const _default: (supportedProtocols: string[]) => (req: Request, res: Response) => void;
+export default _default;
diff --git a/dist/server/middlewares/supportedProtocols.js b/dist/server/middlewares/supportedProtocols.js
new file mode 100644
index 0000000..94df33e
--- /dev/null
+++ b/dist/server/middlewares/supportedProtocols.js
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.default = (supportedProtocols) => (req, res) => {
+ if (!supportedProtocols.includes(req.header.protocolId))
+ throw new Error(`protocol_not_supported: ${req.header.protocolId}`);
+};
diff --git a/dist/server/requestHandlers/smb/Negotiate.d.ts b/dist/server/requestHandlers/smb/Negotiate.d.ts
new file mode 100644
index 0000000..8191c1f
--- /dev/null
+++ b/dist/server/requestHandlers/smb/Negotiate.d.ts
@@ -0,0 +1,4 @@
+import Request from "../../SmbRequest";
+import Response from "../../SmbResponse";
+declare const _default: (req: Request, res: Response) => void;
+export default _default;
diff --git a/dist/server/requestHandlers/smb/Negotiate.js b/dist/server/requestHandlers/smb/Negotiate.js
new file mode 100644
index 0000000..e7108f8
--- /dev/null
+++ b/dist/server/requestHandlers/smb/Negotiate.js
@@ -0,0 +1,55 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const Smb2Request_1 = __importDefault(require("../../Smb2Request"));
+const Dialect_1 = __importDefault(require("../../../protocol/smb2/Dialect"));
+const protocolIds = __importStar(require("../../../protocol/protocolIds"));
+const PacketType_1 = __importDefault(require("../../../protocol/smb2/PacketType"));
+const supportedDialects = [
+ "NT LM 0.12",
+ "SMB 2.002",
+ "SMB 2.???"
+];
+exports.default = (req, res) => {
+ const dialects = req.body.dialects;
+ const matchingDialects = dialects.filter(dialect => supportedDialects.indexOf(dialect) !== -1);
+ if (matchingDialects.length === 0)
+ throw new Error(`no_dialect_supported`);
+ if (matchingDialects.find(x => x.startsWith("SMB 2."))) {
+ const newReq = new Smb2Request_1.default({
+ protocolId: protocolIds.smb2,
+ type: PacketType_1.default.Negotiate
+ }, {
+ dialects: [
+ Dialect_1.default.Smb210,
+ Dialect_1.default.Smb202,
+ Dialect_1.default.Smb2xx
+ ]
+ });
+ res.redirect(newReq);
+ }
+ else {
+ throw new Error("smb_not_implemented_yet");
+ }
+};
diff --git a/dist/server/requestHandlers/smb/index.d.ts b/dist/server/requestHandlers/smb/index.d.ts
new file mode 100644
index 0000000..5bf0aa2
--- /dev/null
+++ b/dist/server/requestHandlers/smb/index.d.ts
@@ -0,0 +1 @@
+export { default as Negotiate } from "./Negotiate";
diff --git a/dist/server/requestHandlers/smb/index.js b/dist/server/requestHandlers/smb/index.js
new file mode 100644
index 0000000..681730c
--- /dev/null
+++ b/dist/server/requestHandlers/smb/index.js
@@ -0,0 +1,8 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Negotiate = void 0;
+var Negotiate_1 = require("./Negotiate");
+Object.defineProperty(exports, "Negotiate", { enumerable: true, get: function () { return __importDefault(Negotiate_1).default; } });
diff --git a/dist/server/requestHandlers/smb2/Negotiate.d.ts b/dist/server/requestHandlers/smb2/Negotiate.d.ts
new file mode 100644
index 0000000..a92ace1
--- /dev/null
+++ b/dist/server/requestHandlers/smb2/Negotiate.d.ts
@@ -0,0 +1,4 @@
+import Request from "../../Smb2Request";
+import Response from "../../Smb2Response";
+declare const _default: (req: Request, res: Response) => void;
+export default _default;
diff --git a/dist/server/requestHandlers/smb2/Negotiate.js b/dist/server/requestHandlers/smb2/Negotiate.js
new file mode 100644
index 0000000..2d01353
--- /dev/null
+++ b/dist/server/requestHandlers/smb2/Negotiate.js
@@ -0,0 +1,60 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const moment_timezone_1 = __importDefault(require("moment-timezone"));
+const StatusCode_1 = __importDefault(require("../../../protocol/smb2/StatusCode"));
+const Capability_1 = __importDefault(require("../../../protocol/smb2/Capability"));
+const Dialect_1 = __importDefault(require("../../../protocol/smb2/Dialect"));
+const Header_1 = require("../../../protocol/smb2/Header");
+const structureUtil = __importStar(require("../../../protocol/structureUtil"));
+const supportedDialects = [
+ Dialect_1.default.Smb210,
+ Dialect_1.default.Smb202,
+ Dialect_1.default.Smb2xx
+];
+exports.default = (req, res) => {
+ const dialects = req.body.dialects;
+ const targetDialect = supportedDialects.find(supportedDialect => dialects.find(dialect => dialect === supportedDialect));
+ const targetDialectName = structureUtil.parseEnumValue(Dialect_1.default, targetDialect);
+ const securityBuffer = Buffer.alloc(0);
+ res.status(StatusCode_1.default.Success);
+ res.set("clientId", req.header.clientId);
+ res.send({
+ structureSize: 0x0041,
+ securityMode: 0,
+ dialectRevision: targetDialect,
+ reserved: 0,
+ serverGuid: req.server.guid,
+ capabilities: Capability_1.default.DistributedFileSystem | Capability_1.default.MultiCreditSupport,
+ maxTransactSize: 0x00100000,
+ maxReadSize: 0x00100000,
+ maxWriteSize: 0x00100000,
+ systemTime: structureUtil.serializeDate(moment_timezone_1.default().toDate()),
+ serverStartTime: structureUtil.serializeDate(req.server.startDate),
+ securityBufferOffset: Header_1.headerSize + 64,
+ securityBufferLength: securityBuffer.length,
+ reserved2: 0,
+ buffer: securityBuffer
+ });
+};
diff --git a/dist/server/requestHandlers/smb2/SessionSetup.d.ts b/dist/server/requestHandlers/smb2/SessionSetup.d.ts
new file mode 100644
index 0000000..a92ace1
--- /dev/null
+++ b/dist/server/requestHandlers/smb2/SessionSetup.d.ts
@@ -0,0 +1,4 @@
+import Request from "../../Smb2Request";
+import Response from "../../Smb2Response";
+declare const _default: (req: Request, res: Response) => void;
+export default _default;
diff --git a/dist/server/requestHandlers/smb2/SessionSetup.js b/dist/server/requestHandlers/smb2/SessionSetup.js
new file mode 100644
index 0000000..dc6ef4f
--- /dev/null
+++ b/dist/server/requestHandlers/smb2/SessionSetup.js
@@ -0,0 +1,96 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const ntlm = __importStar(require("../../../protocol/ntlm/util"));
+const StatusCode_1 = __importDefault(require("../../../protocol/smb2/StatusCode"));
+const NegotiateFlag_1 = __importDefault(require("../../../protocol/ntlm/NegotiateFlag"));
+exports.default = (req, res) => {
+ // console.log(ntlm);
+ // console.log(req.body);
+ // console.log();
+ console.log("SessionSetup");
+ const decodedNtlmNegotiation = ntlm.decodeNegotiationMessage(req.body.buffer);
+ // console.log(ntlmData);
+ const ntlmChallengeNegotiationFlags = syncNegotiationFlags(decodedNtlmNegotiation.negotiateFlags);
+ const encodedNtlmChallenge = ntlm.encodeChallengeMessage(ntlmChallengeNegotiationFlags);
+ // console.log(encodedNtlmChallenge.toString("hex"));
+ res.status(StatusCode_1.default.MoreProcessingRequired); // first session setup request (second success)
+ res.set("clientId", req.header.clientId);
+ res.send({
+ structureSize: 9,
+ sessionFlags: 0,
+ securityBufferOffset: 72,
+ securityBufferLength: 178,
+ buffer: encodedNtlmChallenge
+ });
+};
+const syncNegotiationFlags = (negotiationFlags) => {
+ let challengeNegotiateFlags = NegotiateFlag_1.default.TargetTypeServer |
+ NegotiateFlag_1.default.TargetInfo |
+ NegotiateFlag_1.default.TargetNameSupplied |
+ NegotiateFlag_1.default.Version;
+ // [MS-NLMP] NTLMSSP_NEGOTIATE_NTLM MUST be set in the [..] CHALLENGE_MESSAGE to the client.
+ challengeNegotiateFlags |= NegotiateFlag_1.default.NTLMSessionSecurity;
+ if ((negotiationFlags & NegotiateFlag_1.default.UnicodeEncoding) > 0) {
+ challengeNegotiateFlags |= NegotiateFlag_1.default.UnicodeEncoding;
+ }
+ else if ((negotiationFlags & NegotiateFlag_1.default.OemEncoding) > 0) {
+ challengeNegotiateFlags |= NegotiateFlag_1.default.OemEncoding;
+ }
+ if ((negotiationFlags & NegotiateFlag_1.default.ExtendedSessionSecurity) > 0) {
+ challengeNegotiateFlags |= NegotiateFlag_1.default.ExtendedSessionSecurity;
+ }
+ else if ((negotiationFlags & NegotiateFlag_1.default.LanManagerSessionKey) > 0) {
+ challengeNegotiateFlags |= NegotiateFlag_1.default.LanManagerSessionKey;
+ }
+ if ((negotiationFlags & NegotiateFlag_1.default.Sign) > 0) {
+ // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_SIGN to the server in the NEGOTIATE_MESSAGE,
+ // the server MUST return NTLMSSP_NEGOTIATE_SIGN to the client in the CHALLENGE_MESSAGE.
+ challengeNegotiateFlags |= NegotiateFlag_1.default.Sign;
+ }
+ if ((negotiationFlags & NegotiateFlag_1.default.Seal) > 0) {
+ // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_SEAL to the server in the NEGOTIATE_MESSAGE,
+ // the server MUST return NTLMSSP_NEGOTIATE_SEAL to the client in the CHALLENGE_MESSAGE.
+ challengeNegotiateFlags |= NegotiateFlag_1.default.Seal;
+ }
+ if ((negotiationFlags & NegotiateFlag_1.default.Sign) > 0 ||
+ (negotiationFlags & NegotiateFlag_1.default.Seal) > 0) {
+ if ((negotiationFlags & NegotiateFlag_1.default.Use56BitEncryption) > 0) {
+ // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_SEAL or NTLMSSP_NEGOTIATE_SIGN with
+ // NTLMSSP_NEGOTIATE_56 to the server in the NEGOTIATE_MESSAGE, the server MUST return
+ // NTLMSSP_NEGOTIATE_56 to the client in the CHALLENGE_MESSAGE.
+ challengeNegotiateFlags |= NegotiateFlag_1.default.Use56BitEncryption;
+ }
+ if ((negotiationFlags & NegotiateFlag_1.default.Use128BitEncryption) > 0) {
+ // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_128 to the server in the NEGOTIATE_MESSAGE,
+ // the server MUST return NTLMSSP_NEGOTIATE_128 to the client in the CHALLENGE_MESSAGE only if
+ // the client sets NTLMSSP_NEGOTIATE_SEAL or NTLMSSP_NEGOTIATE_SIGN.
+ challengeNegotiateFlags |= NegotiateFlag_1.default.Use128BitEncryption;
+ }
+ }
+ if ((negotiationFlags & NegotiateFlag_1.default.KeyExchange) > 0) {
+ challengeNegotiateFlags |= NegotiateFlag_1.default.KeyExchange;
+ }
+ return challengeNegotiateFlags;
+};
diff --git a/dist/server/requestHandlers/smb2/index.d.ts b/dist/server/requestHandlers/smb2/index.d.ts
new file mode 100644
index 0000000..841174b
--- /dev/null
+++ b/dist/server/requestHandlers/smb2/index.d.ts
@@ -0,0 +1,2 @@
+export { default as Negotiate } from "./Negotiate";
+export { default as SessionSetup } from "./SessionSetup";
diff --git a/dist/server/requestHandlers/smb2/index.js b/dist/server/requestHandlers/smb2/index.js
new file mode 100644
index 0000000..de583d4
--- /dev/null
+++ b/dist/server/requestHandlers/smb2/index.js
@@ -0,0 +1,10 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SessionSetup = exports.Negotiate = void 0;
+var Negotiate_1 = require("./Negotiate");
+Object.defineProperty(exports, "Negotiate", { enumerable: true, get: function () { return __importDefault(Negotiate_1).default; } });
+var SessionSetup_1 = require("./SessionSetup");
+Object.defineProperty(exports, "SessionSetup", { enumerable: true, get: function () { return __importDefault(SessionSetup_1).default; } });
diff --git a/package-lock.json b/package-lock.json
index 41c0715..12f9da8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
"version": "0.3.0",
"license": "MIT",
"dependencies": {
+ "httpntlm": "^1.8.13",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
@@ -237,6 +238,15 @@
}
}
},
+ "node_modules/des.js": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
+ "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -341,6 +351,38 @@
"node": ">=4"
}
},
+ "node_modules/httpntlm": {
+ "version": "1.8.13",
+ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz",
+ "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==",
+ "funding": [
+ {
+ "type": "paypal",
+ "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://www.buymeacoffee.com/samdecrock"
+ }
+ ],
+ "dependencies": {
+ "des.js": "^1.0.1",
+ "httpreq": ">=0.4.22",
+ "js-md4": "^0.3.2",
+ "underscore": "~1.12.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/httpreq": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz",
+ "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==",
+ "engines": {
+ "node": ">= 6.15.1"
+ }
+ },
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@@ -360,8 +402,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/is-binary-path": {
"version": "2.1.0",
@@ -405,6 +446,11 @@
"node": ">=0.12.0"
}
},
+ "node_modules/js-md4": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz",
+ "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -442,6 +488,11 @@
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -824,6 +875,11 @@
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
"dev": true
},
+ "node_modules/underscore": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 6ab19a8..98ce7f4 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"bugs": "https://github.com/awo00/smb2/issues",
"version": "0.3.0",
"author": "awo00",
- "main": "src/index.js",
+ "main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
"scripts": {
@@ -15,8 +15,7 @@
"lint": "tslint --project ."
},
"files": [
- "dist",
- "src"
+ "dist"
],
"keywords": [
"smb2",
@@ -31,6 +30,7 @@
"node": ">=18"
},
"dependencies": {
+ "httpntlm": "^1.8.13",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
diff --git a/src/protocol/ntlm/util.ts b/src/protocol/ntlm/util.ts
index 4a610df..35bb526 100644
--- a/src/protocol/ntlm/util.ts
+++ b/src/protocol/ntlm/util.ts
@@ -1,17 +1,18 @@
-import crypto from "crypto";
-import NegotiateFlag from "./NegotiateFlag";
+import crypto from 'crypto';
+import httpntlm from 'httpntlm';
+import NegotiateFlag from './NegotiateFlag';
export const encodeNegotiationMessage = (hostname: string, domain: string) => {
hostname = hostname.toUpperCase();
domain = domain.toUpperCase();
- const hostnameLength = Buffer.byteLength(hostname, "ascii");
- const domainLength = Buffer.byteLength(domain, "ascii");
+ const hostnameLength = Buffer.byteLength(hostname, 'ascii');
+ const domainLength = Buffer.byteLength(domain, 'ascii');
let offset = 0;
const buffer = Buffer.alloc(32 + hostnameLength + domainLength);
- buffer.write("NTLMSSP", offset, 7, "ascii");
+ buffer.write('NTLMSSP', offset, 7, 'ascii');
offset += 7;
buffer.writeUInt8(0, offset);
offset += 1;
@@ -19,7 +20,10 @@ export const encodeNegotiationMessage = (hostname: string, domain: string) => {
buffer.writeUInt32LE(1, offset);
offset += 4;
- const negotiateFlags = NegotiateFlag.UnicodeEncoding | NegotiateFlag.NTLMSessionSecurity | NegotiateFlag.AlwaysSign;
+ const negotiateFlags =
+ NegotiateFlag.UnicodeEncoding |
+ NegotiateFlag.NTLMSessionSecurity |
+ NegotiateFlag.AlwaysSign;
buffer.writeUInt32LE(negotiateFlags, offset);
offset += 4;
@@ -40,8 +44,8 @@ export const encodeNegotiationMessage = (hostname: string, domain: string) => {
buffer.writeUInt32LE(0x20, offset);
offset += 4;
- buffer.write(hostname, 0x20, hostnameLength, "ascii");
- buffer.write(domain, domainOffset, domainLength, "ascii");
+ buffer.write(hostname, 0x20, hostnameLength, 'ascii');
+ buffer.write(domain, domainOffset, domainLength, 'ascii');
return buffer;
};
@@ -49,15 +53,13 @@ export const encodeNegotiationMessage = (hostname: string, domain: string) => {
export const decodeNegotiationMessage = (buffer: Buffer) => {
let offset = 0;
- const protocol = buffer.slice(0, 7).toString("ascii");
- if (
- protocol !== "NTLMSSP" ||
- buffer.readInt8(7) !== 0x00
- ) throw new Error("ntlmssp_header_not_found");
+ const protocol = buffer.slice(0, 7).toString('ascii');
+ if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
+ throw new Error('ntlmssp_header_not_found');
offset += 8;
const type = buffer.readUInt32LE(offset);
- if (type !== 0x01) throw new Error("ntlmssp_type_is_not_one");
+ if (type !== 0x01) throw new Error('ntlmssp_type_is_not_one');
offset += 4;
const negotiateFlags = buffer.readUInt32LE(offset);
@@ -77,8 +79,12 @@ export const decodeNegotiationMessage = (buffer: Buffer) => {
const hostnameOffset = buffer.readUInt32LE(offset);
offset += 4;
- const domain = buffer.slice(domainOffset, domainOffset + domainLength).toString("ascii");
- const hostname = buffer.slice(hostnameOffset, hostnameOffset + hostnameLength).toString("ascii");
+ const domain = buffer
+ .slice(domainOffset, domainOffset + domainLength)
+ .toString('ascii');
+ const hostname = buffer
+ .slice(hostnameOffset, hostnameOffset + hostnameLength)
+ .toString('ascii');
return {
negotiateFlags,
@@ -91,7 +97,7 @@ export const encodeChallengeMessage = (negotiateFlags: number) => {
let offset = 0;
const buffer = Buffer.alloc(64);
- buffer.write("NTLMSSP", offset, 7, "ascii");
+ buffer.write('NTLMSSP', offset, 7, 'ascii');
offset += 7;
buffer.writeUInt8(0, offset);
offset += 1;
@@ -123,15 +129,13 @@ export const encodeChallengeMessage = (negotiateFlags: number) => {
export const decodeChallengeMessage = (buffer: Buffer) => {
let offset = 0;
- const protocol = buffer.slice(0, 7).toString("ascii");
- if (
- protocol !== "NTLMSSP" ||
- buffer.readInt8(7) !== 0x00
- ) throw new Error("ntlmssp_header_not_found");
+ const protocol = buffer.slice(0, 7).toString('ascii');
+ if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
+ throw new Error('ntlmssp_header_not_found');
offset += 8;
const type = buffer.readUInt32LE(offset);
- if (type !== 0x02) throw new Error("ntlmssp_type_is_not_two");
+ if (type !== 0x02) throw new Error('ntlmssp_type_is_not_two');
offset += 4;
const targetNameLength = buffer.readUInt16LE(offset);
@@ -152,9 +156,15 @@ export const decodeChallengeMessage = (buffer: Buffer) => {
offset += 8; // Reserved
return serverChallenge;
-}
+};
-export const encodeAuthenticationMessage = (username: string, hostname: string, domain: string, nonce: Buffer, password: string) => {
+export const encodeAuthenticationMessage = (
+ username: string,
+ hostname: string,
+ domain: string,
+ nonce: Buffer,
+ password: string
+) => {
hostname = hostname.toUpperCase();
domain = domain.toUpperCase();
@@ -169,9 +179,9 @@ export const encodeAuthenticationMessage = (username: string, hostname: string,
const lmResponse = createResponse(lmHash, nonce);
const ntResponse = createResponse(ntHash, nonce);
- const usernameLength = Buffer.byteLength(username, "ucs2");
- const hostnameLength = Buffer.byteLength(hostname, "ucs2");
- const domainLength = Buffer.byteLength(domain, "ucs2");
+ const usernameLength = Buffer.byteLength(username, 'ucs2');
+ const hostnameLength = Buffer.byteLength(hostname, 'ucs2');
+ const domainLength = Buffer.byteLength(domain, 'ucs2');
const lmResponseLength = 0x18;
const ntResponseLength = 0x18;
@@ -182,10 +192,16 @@ export const encodeAuthenticationMessage = (username: string, hostname: string,
const ntResponseOffset = lmResponseOffset + lmResponseLength;
let offset = 0;
- const messageLength = 64 + domainLength + usernameLength + hostnameLength + lmResponseLength + ntResponseLength;
+ const messageLength =
+ 64 +
+ domainLength +
+ usernameLength +
+ hostnameLength +
+ lmResponseLength +
+ ntResponseLength;
const buffer = Buffer.alloc(messageLength);
- buffer.write("NTLMSSP", offset, 7, "ascii"); // byte protocol[8];
+ buffer.write('NTLMSSP', offset, 7, 'ascii'); // byte protocol[8];
offset += 7;
buffer.writeUInt8(0, offset);
offset++;
@@ -246,13 +262,16 @@ export const encodeAuthenticationMessage = (username: string, hostname: string,
buffer.fill(0x00, offset, offset + 2); // byte zero[2];
offset += 2;
- const negotiateFlags = NegotiateFlag.UnicodeEncoding | NegotiateFlag.NTLMSessionSecurity | NegotiateFlag.AlwaysSign;
+ const negotiateFlags =
+ NegotiateFlag.UnicodeEncoding |
+ NegotiateFlag.NTLMSessionSecurity |
+ NegotiateFlag.AlwaysSign;
buffer.writeUInt32LE(negotiateFlags, offset);
offset += 4;
- buffer.write(domain, domainOffset, domainLength, "ucs2");
- buffer.write(username, usernameOffset, usernameLength, "ucs2");
- buffer.write(hostname, hostnameOffset, hostnameLength, "ucs2");
+ buffer.write(domain, domainOffset, domainLength, 'ucs2');
+ buffer.write(username, usernameOffset, usernameLength, 'ucs2');
+ buffer.write(hostname, hostnameOffset, hostnameLength, 'ucs2');
lmResponse.copy(buffer, lmResponseOffset, 0, lmResponseLength);
ntResponse.copy(buffer, ntResponseOffset, 0, ntResponseLength);
@@ -263,71 +282,11 @@ export const generateServerChallenge = () => {
return crypto.randomBytes(8);
};
-const fixOddParity = (buffer: Buffer) => {
- for (let index = 0; index < buffer.length; index++) {
- let parity = 1;
- for (let index2 = 1; index2 < 8; index2++) {
- parity = (parity + ((buffer[index] >> index2) & 1)) % 2;
- }
- buffer[index] |= parity & 1;
- }
- return buffer;
-};
-
-const createDESKey = (key56: Buffer) => {
- const key64 = Buffer.alloc(8);
-
- key64[0] = key56[0] & 0xFE;
- key64[1] = ((key56[0] << 7) & 0xFF) | (key56[1] >> 1);
- key64[2] = ((key56[1] << 6) & 0xFF) | (key56[2] >> 2);
- key64[3] = ((key56[2] << 5) & 0xFF) | (key56[3] >> 3);
- key64[4] = ((key56[3] << 4) & 0xFF) | (key56[4] >> 4);
- key64[5] = ((key56[4] << 3) & 0xFF) | (key56[5] >> 5);
- key64[6] = ((key56[5] << 2) & 0xFF) | (key56[6] >> 6);
- key64[7] = (key56[6] << 1) & 0xFF;
-
- return key64;
-};
-
-const createLmHash = (text: string) => {
- const upperCaseText = text.substring(0, 14).toUpperCase();
- const upperCaseTextLength = Buffer.byteLength(upperCaseText, "ascii");
-
- const paddingBuffer = Buffer.alloc(14);
- paddingBuffer.write(upperCaseText, 0, upperCaseTextLength, "ascii");
- paddingBuffer.fill(0, upperCaseTextLength);
+const createLmHash = (text: string): Buffer =>
+ httpntlm.ntlm.create_LM_hashed_password(text);
- const halves = [
- fixOddParity(createDESKey(paddingBuffer.slice(0, 7))),
- fixOddParity(createDESKey(paddingBuffer.slice(7, 14)))
- ];
+const createNtHash = (str: string): Buffer =>
+ httpntlm.ntlm.create_NT_hashed_password(str);
- const buffer = Buffer.alloc(16);
- let offset = 0;
- for (const halve of halves) {
- const cipher = crypto.createCipheriv("DES-ECB", halve, "");
- const string = cipher.update("KGS!@#$%", "binary", "binary");
- buffer.write(string, offset, offset + 8, "binary");
- offset += 8;
- }
-
- return buffer;
-};
-
-const createNtHash = (str: string) => {
- const ucs2 = Buffer.from(str, "ucs2");
- const md4 = crypto.createHash("md4");
- md4.update(ucs2);
- return Buffer.from(md4.digest("hex"), "hex");
-};
-
-const createResponse = (hash: Buffer, nonce: Buffer) => {
- const buffer = Buffer.alloc(24);
- for (let index = 0; index < 3; index++) {
- const keyBuffer = fixOddParity(createDESKey(hash.slice(index * 7, index * 7 + 7)));
- const cipher = crypto.createCipheriv("DES-ECB", keyBuffer, "");
- const string = cipher.update(nonce.toString("binary"), "binary", "binary");
- buffer.write(string, index * 8, index * 8 + 8, "binary");
- }
- return buffer;
-};
\ No newline at end of file
+const createResponse = (hash: Buffer, nonce: Buffer): Buffer =>
+ httpntlm.ntlm.calc_resp(hash, nonce);
From 290b2a2f48ae492de6f6aace67f73c2e15d72a1e Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 14:44:44 +0000
Subject: [PATCH 05/42] extracted response
---
package-lock.json | 1 +
package.json | 1 +
src/protocol/ntlm/util.ts | 134 +++++++++++++++++++++++++++++++++++++-
3 files changed, 134 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 12f9da8..2eb781b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
"version": "0.3.0",
"license": "MIT",
"dependencies": {
+ "des.js": "^1.1.0",
"httpntlm": "^1.8.13",
"moment-timezone": "^0.5.31"
},
diff --git a/package.json b/package.json
index 98ce7f4..89d6300 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"node": ">=18"
},
"dependencies": {
+ "des.js": "^1.1.0",
"httpntlm": "^1.8.13",
"moment-timezone": "^0.5.31"
},
diff --git a/src/protocol/ntlm/util.ts b/src/protocol/ntlm/util.ts
index 35bb526..bfe0e80 100644
--- a/src/protocol/ntlm/util.ts
+++ b/src/protocol/ntlm/util.ts
@@ -1,5 +1,6 @@
import crypto from 'crypto';
import httpntlm from 'httpntlm';
+import desjs from 'des.js';
import NegotiateFlag from './NegotiateFlag';
export const encodeNegotiationMessage = (hostname: string, domain: string) => {
@@ -288,5 +289,134 @@ const createLmHash = (text: string): Buffer =>
const createNtHash = (str: string): Buffer =>
httpntlm.ntlm.create_NT_hashed_password(str);
-const createResponse = (hash: Buffer, nonce: Buffer): Buffer =>
- httpntlm.ntlm.calc_resp(hash, nonce);
+// const createResponse = (hash: Buffer, nonce: Buffer): Buffer =>
+// httpntlm.ntlm.calc_resp(hash, nonce);
+
+// const createResponse = (hash: Buffer, nonce: Buffer) => {
+// const buffer = Buffer.alloc(24);
+// for (let index = 0; index < 3; index++) {
+// const keyBuffer = fixOddParity(
+// createDESKey(hash.slice(index * 7, index * 7 + 7))
+// );
+// const cipher = crypto.createCipheriv('DES-ECB', keyBuffer, '');
+// const string = cipher.update(nonce.toString('binary'), 'binary', 'binary');
+// buffer.write(string, index * 8, index * 8 + 8, 'binary');
+// }
+// return buffer;
+// };
+const bytes2binaryArray = (buf: Buffer): number[] => {
+ const hex2binary = {
+ 0: [0, 0, 0, 0],
+ 1: [0, 0, 0, 1],
+ 2: [0, 0, 1, 0],
+ 3: [0, 0, 1, 1],
+ 4: [0, 1, 0, 0],
+ 5: [0, 1, 0, 1],
+ 6: [0, 1, 1, 0],
+ 7: [0, 1, 1, 1],
+ 8: [1, 0, 0, 0],
+ 9: [1, 0, 0, 1],
+ A: [1, 0, 1, 0],
+ B: [1, 0, 1, 1],
+ C: [1, 1, 0, 0],
+ D: [1, 1, 0, 1],
+ E: [1, 1, 1, 0],
+ F: [1, 1, 1, 1]
+ };
+
+ const hexString = buf.toString('hex').toUpperCase();
+ let array: number[] = [];
+ for (let i = 0; i < hexString.length; i++) {
+ const hexchar = hexString.charAt(i);
+ array = array.concat(hex2binary[hexchar]);
+ }
+ return array;
+};
+
+const binaryArray2bytes = (array: number[]): Buffer => {
+ const binary2hex = {
+ '0000': 0,
+ '0001': 1,
+ '0010': 2,
+ '0011': 3,
+ '0100': 4,
+ '0101': 5,
+ '0110': 6,
+ '0111': 7,
+ '1000': 8,
+ '1001': 9,
+ '1010': 'A',
+ '1011': 'B',
+ '1100': 'C',
+ '1101': 'D',
+ '1110': 'E',
+ '1111': 'F'
+ };
+
+ const bufArray: Buffer[] = [];
+
+ for (let i = 0; i < array.length; i += 8) {
+ if (i + 7 > array.length) break;
+
+ const binString1 =
+ '' + array[i] + '' + array[i + 1] + '' + array[i + 2] + '' + array[i + 3];
+ const binString2 =
+ '' +
+ array[i + 4] +
+ '' +
+ array[i + 5] +
+ '' +
+ array[i + 6] +
+ '' +
+ array[i + 7];
+ const hexchar1 = binary2hex[binString1];
+ const hexchar2 = binary2hex[binString2];
+
+ const buf = Buffer.from(hexchar1 + '' + hexchar2, 'hex');
+ bufArray.push(buf);
+ }
+
+ return Buffer.concat(bufArray);
+};
+
+const insertZerosEvery7Bits = (buf: Buffer): Buffer => {
+ const binaryArray = bytes2binaryArray(buf);
+ const newBinaryArray = [];
+ for (let i = 0; i < binaryArray.length; i++) {
+ newBinaryArray.push(binaryArray[i]);
+
+ if ((i + 1) % 7 === 0) {
+ newBinaryArray.push(0);
+ }
+ }
+ return binaryArray2bytes(newBinaryArray);
+};
+
+const createResponse = (hash: Buffer, nonce: Buffer) => {
+ // padding with zeros to make the hash 21 bytes long
+ const passHashPadded = Buffer.alloc(21);
+ passHashPadded.fill('\0');
+ hash.copy(passHashPadded, 0, 0, hash.length);
+
+ const resArray = [];
+
+ const des1 = desjs.DES.create({
+ type: 'encrypt',
+ key: insertZerosEvery7Bits(passHashPadded.slice(0, 7))
+ });
+ resArray.push(Buffer.from(des1.update(nonce.slice(0, 8))));
+
+ const des2 = desjs.DES.create({
+ type: 'encrypt',
+ key: insertZerosEvery7Bits(passHashPadded.slice(7, 14))
+ });
+ resArray.push(Buffer.from(des2.update(nonce.slice(0, 8))));
+
+ const des3 = desjs.DES.create({
+ type: 'encrypt',
+ key: insertZerosEvery7Bits(passHashPadded.slice(14, 21))
+ });
+ resArray.push(Buffer.from(des3.update(nonce.slice(0, 8))));
+
+ return Buffer.concat(resArray);
+};
From 314f6e694551d3921e2a1f577ab3e84c2a413e16 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 14:45:08 +0000
Subject: [PATCH 06/42] build
---
dist/protocol/ntlm/util.js | 116 ++++++++++++++++++++++++++++++++++++-
1 file changed, 115 insertions(+), 1 deletion(-)
diff --git a/dist/protocol/ntlm/util.js b/dist/protocol/ntlm/util.js
index 0b9c7e6..958c20b 100644
--- a/dist/protocol/ntlm/util.js
+++ b/dist/protocol/ntlm/util.js
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.generateServerChallenge = exports.encodeAuthenticationMessage = exports.decodeChallengeMessage = exports.encodeChallengeMessage = exports.decodeNegotiationMessage = exports.encodeNegotiationMessage = void 0;
const crypto_1 = __importDefault(require("crypto"));
const httpntlm_1 = __importDefault(require("httpntlm"));
+const des_js_1 = __importDefault(require("des.js"));
const NegotiateFlag_1 = __importDefault(require("./NegotiateFlag"));
exports.encodeNegotiationMessage = (hostname, domain) => {
hostname = hostname.toUpperCase();
@@ -222,4 +223,117 @@ exports.generateServerChallenge = () => {
};
const createLmHash = (text) => httpntlm_1.default.ntlm.create_LM_hashed_password(text);
const createNtHash = (str) => httpntlm_1.default.ntlm.create_NT_hashed_password(str);
-const createResponse = (hash, nonce) => httpntlm_1.default.ntlm.calc_resp(hash, nonce);
+// const createResponse = (hash: Buffer, nonce: Buffer): Buffer =>
+// httpntlm.ntlm.calc_resp(hash, nonce);
+// const createResponse = (hash: Buffer, nonce: Buffer) => {
+// const buffer = Buffer.alloc(24);
+// for (let index = 0; index < 3; index++) {
+// const keyBuffer = fixOddParity(
+// createDESKey(hash.slice(index * 7, index * 7 + 7))
+// );
+// const cipher = crypto.createCipheriv('DES-ECB', keyBuffer, '');
+// const string = cipher.update(nonce.toString('binary'), 'binary', 'binary');
+// buffer.write(string, index * 8, index * 8 + 8, 'binary');
+// }
+// return buffer;
+// };
+const bytes2binaryArray = (buf) => {
+ const hex2binary = {
+ 0: [0, 0, 0, 0],
+ 1: [0, 0, 0, 1],
+ 2: [0, 0, 1, 0],
+ 3: [0, 0, 1, 1],
+ 4: [0, 1, 0, 0],
+ 5: [0, 1, 0, 1],
+ 6: [0, 1, 1, 0],
+ 7: [0, 1, 1, 1],
+ 8: [1, 0, 0, 0],
+ 9: [1, 0, 0, 1],
+ A: [1, 0, 1, 0],
+ B: [1, 0, 1, 1],
+ C: [1, 1, 0, 0],
+ D: [1, 1, 0, 1],
+ E: [1, 1, 1, 0],
+ F: [1, 1, 1, 1]
+ };
+ const hexString = buf.toString('hex').toUpperCase();
+ let array = [];
+ for (let i = 0; i < hexString.length; i++) {
+ const hexchar = hexString.charAt(i);
+ array = array.concat(hex2binary[hexchar]);
+ }
+ return array;
+};
+const binaryArray2bytes = (array) => {
+ const binary2hex = {
+ '0000': 0,
+ '0001': 1,
+ '0010': 2,
+ '0011': 3,
+ '0100': 4,
+ '0101': 5,
+ '0110': 6,
+ '0111': 7,
+ '1000': 8,
+ '1001': 9,
+ '1010': 'A',
+ '1011': 'B',
+ '1100': 'C',
+ '1101': 'D',
+ '1110': 'E',
+ '1111': 'F'
+ };
+ const bufArray = [];
+ for (let i = 0; i < array.length; i += 8) {
+ if (i + 7 > array.length)
+ break;
+ const binString1 = '' + array[i] + '' + array[i + 1] + '' + array[i + 2] + '' + array[i + 3];
+ const binString2 = '' +
+ array[i + 4] +
+ '' +
+ array[i + 5] +
+ '' +
+ array[i + 6] +
+ '' +
+ array[i + 7];
+ const hexchar1 = binary2hex[binString1];
+ const hexchar2 = binary2hex[binString2];
+ const buf = Buffer.from(hexchar1 + '' + hexchar2, 'hex');
+ bufArray.push(buf);
+ }
+ return Buffer.concat(bufArray);
+};
+const insertZerosEvery7Bits = (buf) => {
+ const binaryArray = bytes2binaryArray(buf);
+ const newBinaryArray = [];
+ for (let i = 0; i < binaryArray.length; i++) {
+ newBinaryArray.push(binaryArray[i]);
+ if ((i + 1) % 7 === 0) {
+ newBinaryArray.push(0);
+ }
+ }
+ return binaryArray2bytes(newBinaryArray);
+};
+const createResponse = (hash, nonce) => {
+ // padding with zeros to make the hash 21 bytes long
+ const passHashPadded = Buffer.alloc(21);
+ passHashPadded.fill('\0');
+ hash.copy(passHashPadded, 0, 0, hash.length);
+ const resArray = [];
+ const des1 = des_js_1.default.DES.create({
+ type: 'encrypt',
+ key: insertZerosEvery7Bits(passHashPadded.slice(0, 7))
+ });
+ resArray.push(Buffer.from(des1.update(nonce.slice(0, 8))));
+ const des2 = des_js_1.default.DES.create({
+ type: 'encrypt',
+ key: insertZerosEvery7Bits(passHashPadded.slice(7, 14))
+ });
+ resArray.push(Buffer.from(des2.update(nonce.slice(0, 8))));
+ const des3 = des_js_1.default.DES.create({
+ type: 'encrypt',
+ key: insertZerosEvery7Bits(passHashPadded.slice(14, 21))
+ });
+ resArray.push(Buffer.from(des3.update(nonce.slice(0, 8))));
+ return Buffer.concat(resArray);
+};
From 44d5bc37b7479082222a41438db480d2c53d89d3 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 14:52:31 +0000
Subject: [PATCH 07/42] removed httpntlm dep
---
dist/protocol/ntlm/util.js | 48 ++++++++++++++++++++-----------
package-lock.json | 39 +------------------------
package.json | 4 +--
src/protocol/ntlm/util.ts | 59 ++++++++++++++++++++++++--------------
4 files changed, 71 insertions(+), 79 deletions(-)
diff --git a/dist/protocol/ntlm/util.js b/dist/protocol/ntlm/util.js
index 958c20b..ebc4693 100644
--- a/dist/protocol/ntlm/util.js
+++ b/dist/protocol/ntlm/util.js
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateServerChallenge = exports.encodeAuthenticationMessage = exports.decodeChallengeMessage = exports.encodeChallengeMessage = exports.decodeNegotiationMessage = exports.encodeNegotiationMessage = void 0;
const crypto_1 = __importDefault(require("crypto"));
-const httpntlm_1 = __importDefault(require("httpntlm"));
const des_js_1 = __importDefault(require("des.js"));
+const js_md4_1 = __importDefault(require("js-md4"));
const NegotiateFlag_1 = __importDefault(require("./NegotiateFlag"));
exports.encodeNegotiationMessage = (hostname, domain) => {
hostname = hostname.toUpperCase();
@@ -221,22 +221,6 @@ exports.encodeAuthenticationMessage = (username, hostname, domain, nonce, passwo
exports.generateServerChallenge = () => {
return crypto_1.default.randomBytes(8);
};
-const createLmHash = (text) => httpntlm_1.default.ntlm.create_LM_hashed_password(text);
-const createNtHash = (str) => httpntlm_1.default.ntlm.create_NT_hashed_password(str);
-// const createResponse = (hash: Buffer, nonce: Buffer): Buffer =>
-// httpntlm.ntlm.calc_resp(hash, nonce);
-// const createResponse = (hash: Buffer, nonce: Buffer) => {
-// const buffer = Buffer.alloc(24);
-// for (let index = 0; index < 3; index++) {
-// const keyBuffer = fixOddParity(
-// createDESKey(hash.slice(index * 7, index * 7 + 7))
-// );
-// const cipher = crypto.createCipheriv('DES-ECB', keyBuffer, '');
-// const string = cipher.update(nonce.toString('binary'), 'binary', 'binary');
-// buffer.write(string, index * 8, index * 8 + 8, 'binary');
-// }
-// return buffer;
-// };
const bytes2binaryArray = (buf) => {
const hex2binary = {
0: [0, 0, 0, 0],
@@ -314,6 +298,36 @@ const insertZerosEvery7Bits = (buf) => {
}
return binaryArray2bytes(newBinaryArray);
};
+const createLmHash = (password) => {
+ // fix the password length to 14 bytes
+ password = password.toUpperCase();
+ const passwordBytes = Buffer.from(password, 'ascii');
+ const passwordBytesPadded = Buffer.alloc(14);
+ passwordBytesPadded.fill('\0');
+ let sourceEnd = 14;
+ if (passwordBytes.length < 14)
+ sourceEnd = passwordBytes.length;
+ passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd);
+ // split into 2 parts of 7 bytes:
+ const firstPart = passwordBytesPadded.slice(0, 7);
+ const secondPart = passwordBytesPadded.slice(7);
+ function encrypt(buf) {
+ const key = insertZerosEvery7Bits(buf);
+ const des = des_js_1.default.DES.create({ type: 'encrypt', key: key });
+ const magicKey = Buffer.from('KGS!@#$%', 'ascii'); // page 57 in [MS-NLMP]
+ const encrypted = des.update(magicKey);
+ return Buffer.from(encrypted);
+ }
+ const firstPartEncrypted = encrypt(firstPart);
+ const secondPartEncrypted = encrypt(secondPart);
+ return Buffer.concat([firstPartEncrypted, secondPartEncrypted]);
+};
+const createNtHash = (password) => {
+ const buf = Buffer.from(password, 'utf16le');
+ const md4 = js_md4_1.default.create();
+ md4.update(buf);
+ return Buffer.from(md4.digest());
+};
const createResponse = (hash, nonce) => {
// padding with zeros to make the hash 21 bytes long
const passHashPadded = Buffer.alloc(21);
diff --git a/package-lock.json b/package-lock.json
index 2eb781b..c6b4e33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "MIT",
"dependencies": {
"des.js": "^1.1.0",
- "httpntlm": "^1.8.13",
+ "js-md4": "^0.3.2",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
@@ -352,38 +352,6 @@
"node": ">=4"
}
},
- "node_modules/httpntlm": {
- "version": "1.8.13",
- "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz",
- "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==",
- "funding": [
- {
- "type": "paypal",
- "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC"
- },
- {
- "type": "buymeacoffee",
- "url": "https://www.buymeacoffee.com/samdecrock"
- }
- ],
- "dependencies": {
- "des.js": "^1.0.1",
- "httpreq": ">=0.4.22",
- "js-md4": "^0.3.2",
- "underscore": "~1.12.1"
- },
- "engines": {
- "node": ">=10.4.0"
- }
- },
- "node_modules/httpreq": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz",
- "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==",
- "engines": {
- "node": ">= 6.15.1"
- }
- },
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@@ -876,11 +844,6 @@
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
"dev": true
},
- "node_modules/underscore": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
- "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
- },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 89d6300..9d2e517 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.3.0",
+ "version": "0.4.0",
"author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
@@ -31,7 +31,7 @@
},
"dependencies": {
"des.js": "^1.1.0",
- "httpntlm": "^1.8.13",
+ "js-md4": "^0.3.2",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
diff --git a/src/protocol/ntlm/util.ts b/src/protocol/ntlm/util.ts
index bfe0e80..37094b0 100644
--- a/src/protocol/ntlm/util.ts
+++ b/src/protocol/ntlm/util.ts
@@ -1,6 +1,6 @@
import crypto from 'crypto';
-import httpntlm from 'httpntlm';
import desjs from 'des.js';
+import jsmd4 from 'js-md4';
import NegotiateFlag from './NegotiateFlag';
export const encodeNegotiationMessage = (hostname: string, domain: string) => {
@@ -283,27 +283,6 @@ export const generateServerChallenge = () => {
return crypto.randomBytes(8);
};
-const createLmHash = (text: string): Buffer =>
- httpntlm.ntlm.create_LM_hashed_password(text);
-
-const createNtHash = (str: string): Buffer =>
- httpntlm.ntlm.create_NT_hashed_password(str);
-
-// const createResponse = (hash: Buffer, nonce: Buffer): Buffer =>
-// httpntlm.ntlm.calc_resp(hash, nonce);
-
-// const createResponse = (hash: Buffer, nonce: Buffer) => {
-// const buffer = Buffer.alloc(24);
-// for (let index = 0; index < 3; index++) {
-// const keyBuffer = fixOddParity(
-// createDESKey(hash.slice(index * 7, index * 7 + 7))
-// );
-// const cipher = crypto.createCipheriv('DES-ECB', keyBuffer, '');
-// const string = cipher.update(nonce.toString('binary'), 'binary', 'binary');
-// buffer.write(string, index * 8, index * 8 + 8, 'binary');
-// }
-// return buffer;
-// };
const bytes2binaryArray = (buf: Buffer): number[] => {
const hex2binary = {
0: [0, 0, 0, 0],
@@ -392,6 +371,42 @@ const insertZerosEvery7Bits = (buf: Buffer): Buffer => {
return binaryArray2bytes(newBinaryArray);
};
+const createLmHash = (password: string): Buffer => {
+ // fix the password length to 14 bytes
+ password = password.toUpperCase();
+ const passwordBytes = Buffer.from(password, 'ascii');
+
+ const passwordBytesPadded = Buffer.alloc(14);
+ passwordBytesPadded.fill('\0');
+ let sourceEnd = 14;
+ if (passwordBytes.length < 14) sourceEnd = passwordBytes.length;
+ passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd);
+
+ // split into 2 parts of 7 bytes:
+ const firstPart = passwordBytesPadded.slice(0, 7);
+ const secondPart = passwordBytesPadded.slice(7);
+
+ function encrypt(buf) {
+ const key = insertZerosEvery7Bits(buf);
+ const des = desjs.DES.create({ type: 'encrypt', key: key });
+ const magicKey = Buffer.from('KGS!@#$%', 'ascii'); // page 57 in [MS-NLMP]
+ const encrypted = des.update(magicKey);
+ return Buffer.from(encrypted);
+ }
+
+ const firstPartEncrypted = encrypt(firstPart);
+ const secondPartEncrypted = encrypt(secondPart);
+
+ return Buffer.concat([firstPartEncrypted, secondPartEncrypted]);
+};
+
+const createNtHash = (password: string): Buffer => {
+ const buf = Buffer.from(password, 'utf16le');
+ const md4 = jsmd4.create();
+ md4.update(buf);
+ return Buffer.from(md4.digest());
+};
+
const createResponse = (hash: Buffer, nonce: Buffer) => {
// padding with zeros to make the hash 21 bytes long
const passHashPadded = Buffer.alloc(21);
From f1fb4a1b9116e54ae7d1db07a2b9095573c46d5b Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 14:55:15 +0000
Subject: [PATCH 08/42] remove dist
---
.gitignore | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index aa31649..1e47279 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
/node_modules
-# /dist
+/dist
.DS_Store
*.log
\ No newline at end of file
From 57a6dda3ddae26e5f648467a9a862930df017b72 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:00:21 +0000
Subject: [PATCH 09/42] revert
---
LICENSE.md | 2 +-
package.json | 21 +++++++++------------
2 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/LICENSE.md b/LICENSE.md
index a64fec4..6cee059 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2020 awo00
+Copyright (c) 2020 stifani
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/package.json b/package.json
index 9d2e517..9f02321 100644
--- a/package.json
+++ b/package.json
@@ -1,17 +1,16 @@
{
- "name": "@awo00/smb2",
+ "name": "@stifani/smb2",
"description": "A SMB2 implementation in TypeScript",
- "repository": "https://github.com/awo00/smb2",
- "bugs": "https://github.com/awo00/smb2/issues",
+ "repository": "https://github.com/ardean/smb2",
+ "bugs": "https://github.com/ardean/smb2/issues",
"version": "0.4.0",
- "author": "awo00",
+ "author": "ardean",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
"scripts": {
- "start": "node dist/src/index.js",
- "dev": "nodemon -r src/index.ts",
- "build": "tsc --build",
+ "start": "nodemon",
+ "build": "rm -rf dist && tsc",
"lint": "tslint --project ."
},
"files": [
@@ -27,16 +26,14 @@
"file-sharing"
],
"engines": {
- "node": ">=18"
+ "node": ">=10.0.0"
},
"dependencies": {
- "des.js": "^1.1.0",
- "js-md4": "^0.3.2",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
- "@types/node": "^13.13.52",
- "nodemon": "^3.0.2",
+ "@types/node": "^13.7.4",
+ "nodemon": "^2.0.4",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
"typescript": "^4.0.3"
From 1e9ff80edb7e3a0c9e5250365460b664ca011f0e Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:01:08 +0000
Subject: [PATCH 10/42] remove dist
---
dist/client/Client.d.ts | 50 ---
dist/client/Client.js | 208 -----------
dist/client/Directory.d.ts | 42 ---
dist/client/Directory.js | 183 ---------
dist/client/File.d.ts | 33 --
dist/client/File.js | 161 --------
dist/client/Session.d.ts | 28 --
dist/client/Session.js | 90 -----
dist/client/Tree.d.ts | 38 --
dist/client/Tree.js | 167 ---------
dist/index.d.ts | 6 -
dist/index.js | 11 -
dist/protocol/Packet.d.ts | 10 -
dist/protocol/Packet.js | 54 ---
dist/protocol/Request.d.ts | 9 -
dist/protocol/Request.js | 9 -
dist/protocol/Response.d.ts | 9 -
dist/protocol/Response.js | 9 -
dist/protocol/Structure.d.ts | 5 -
dist/protocol/Structure.js | 2 -
dist/protocol/StructureField.d.ts | 14 -
dist/protocol/StructureField.js | 2 -
dist/protocol/Value.d.ts | 3 -
dist/protocol/Value.js | 2 -
dist/protocol/models/ChangeEntry.d.ts | 6 -
dist/protocol/models/ChangeEntry.js | 2 -
dist/protocol/models/DirectoryEntry.d.ts | 15 -
dist/protocol/models/DirectoryEntry.js | 2 -
dist/protocol/ntlm/NegotiateFlag.d.ts | 25 --
dist/protocol/ntlm/NegotiateFlag.js | 28 --
dist/protocol/ntlm/util.d.ts | 11 -
dist/protocol/ntlm/util.js | 353 ------------------
dist/protocol/protocolIds.d.ts | 2 -
dist/protocol/protocolIds.js | 19 -
dist/protocol/smb/Header.d.ts | 26 --
dist/protocol/smb/Header.js | 68 ----
dist/protocol/smb/Packet.d.ts | 13 -
dist/protocol/smb/Packet.js | 80 ----
dist/protocol/smb/PacketType.d.ts | 56 ---
dist/protocol/smb/PacketType.js | 60 ---
dist/protocol/smb/Request.d.ts | 8 -
dist/protocol/smb/Request.js | 18 -
dist/protocol/smb/Response.d.ts | 8 -
dist/protocol/smb/Response.js | 18 -
dist/protocol/smb2/Capability.d.ts | 5 -
dist/protocol/smb2/Capability.js | 8 -
dist/protocol/smb2/CreateDispositionType.d.ts | 9 -
dist/protocol/smb2/CreateDispositionType.js | 12 -
dist/protocol/smb2/Dialect.d.ts | 10 -
dist/protocol/smb2/Dialect.js | 13 -
dist/protocol/smb2/DirectoryAccess.d.ts | 23 --
dist/protocol/smb2/DirectoryAccess.js | 26 --
dist/protocol/smb2/FileAction.d.ts | 14 -
dist/protocol/smb2/FileAction.js | 17 -
dist/protocol/smb2/FileAttribute.d.ts | 19 -
dist/protocol/smb2/FileAttribute.js | 22 --
dist/protocol/smb2/FilePipePrinterAccess.d.ts | 23 --
dist/protocol/smb2/FilePipePrinterAccess.js | 26 --
dist/protocol/smb2/Header.d.ts | 24 --
dist/protocol/smb2/Header.js | 62 ---
dist/protocol/smb2/HeaderFlag.d.ts | 10 -
dist/protocol/smb2/HeaderFlag.js | 13 -
dist/protocol/smb2/Packet.d.ts | 20 -
dist/protocol/smb2/Packet.js | 83 ----
dist/protocol/smb2/PacketType.d.ts | 22 --
dist/protocol/smb2/PacketType.js | 26 --
dist/protocol/smb2/Request.d.ts | 11 -
dist/protocol/smb2/Request.js | 25 --
dist/protocol/smb2/Response.d.ts | 11 -
dist/protocol/smb2/Response.js | 27 --
dist/protocol/smb2/ShareAccessType.d.ts | 6 -
dist/protocol/smb2/ShareAccessType.js | 9 -
dist/protocol/smb2/StatusCode.d.ts | 9 -
dist/protocol/smb2/StatusCode.js | 12 -
dist/protocol/smb2/packets/ChangeNotify.d.ts | 27 --
dist/protocol/smb2/packets/ChangeNotify.js | 129 -------
dist/protocol/smb2/packets/Close.d.ts | 6 -
dist/protocol/smb2/packets/Close.js | 69 ----
dist/protocol/smb2/packets/Create.d.ts | 10 -
dist/protocol/smb2/packets/Create.js | 168 ---------
dist/protocol/smb2/packets/Echo.d.ts | 6 -
dist/protocol/smb2/packets/Echo.js | 27 --
dist/protocol/smb2/packets/Flush.d.ts | 6 -
dist/protocol/smb2/packets/Flush.js | 36 --
dist/protocol/smb2/packets/LogOff.d.ts | 6 -
dist/protocol/smb2/packets/LogOff.js | 28 --
dist/protocol/smb2/packets/Negotiate.d.ts | 15 -
dist/protocol/smb2/packets/Negotiate.js | 107 ------
.../protocol/smb2/packets/QueryDirectory.d.ts | 9 -
dist/protocol/smb2/packets/QueryDirectory.js | 151 --------
dist/protocol/smb2/packets/Read.d.ts | 6 -
dist/protocol/smb2/packets/Read.js | 89 -----
dist/protocol/smb2/packets/SessionSetup.d.ts | 6 -
dist/protocol/smb2/packets/SessionSetup.js | 70 ----
dist/protocol/smb2/packets/SetInfo.d.ts | 26 --
dist/protocol/smb2/packets/SetInfo.js | 78 ----
dist/protocol/smb2/packets/TreeConnect.d.ts | 6 -
dist/protocol/smb2/packets/TreeConnect.js | 56 ---
.../protocol/smb2/packets/TreeDisconnect.d.ts | 6 -
dist/protocol/smb2/packets/TreeDisconnect.js | 27 --
dist/protocol/smb2/packets/Write.d.ts | 6 -
dist/protocol/smb2/packets/Write.js | 81 ----
dist/protocol/smb2/packets/index.d.ts | 14 -
dist/protocol/smb2/packets/index.js | 34 --
dist/protocol/structureUtil.d.ts | 16 -
dist/protocol/structureUtil.js | 175 ---------
dist/protocol/util.d.ts | 7 -
dist/protocol/util.js | 58 ---
dist/server/Client.d.ts | 23 --
dist/server/Client.js | 64 ----
dist/server/Middleware.d.ts | 4 -
dist/server/Middleware.js | 2 -
dist/server/Request.d.ts | 4 -
dist/server/Request.js | 2 -
dist/server/Response.d.ts | 4 -
dist/server/Response.js | 2 -
dist/server/Server.d.ts | 21 --
dist/server/Server.js | 122 ------
dist/server/Smb2Request.d.ts | 7 -
dist/server/Smb2Request.js | 9 -
dist/server/Smb2Response.d.ts | 11 -
dist/server/Smb2Response.js | 27 --
dist/server/SmbRequest.d.ts | 7 -
dist/server/SmbRequest.js | 9 -
dist/server/SmbResponse.d.ts | 11 -
dist/server/SmbResponse.js | 27 --
dist/server/middlewares/requestType.d.ts | 6 -
dist/server/middlewares/requestType.js | 7 -
.../middlewares/supportedProtocols.d.ts | 4 -
dist/server/middlewares/supportedProtocols.js | 6 -
.../server/requestHandlers/smb/Negotiate.d.ts | 4 -
dist/server/requestHandlers/smb/Negotiate.js | 55 ---
dist/server/requestHandlers/smb/index.d.ts | 1 -
dist/server/requestHandlers/smb/index.js | 8 -
.../requestHandlers/smb2/Negotiate.d.ts | 4 -
dist/server/requestHandlers/smb2/Negotiate.js | 60 ---
.../requestHandlers/smb2/SessionSetup.d.ts | 4 -
.../requestHandlers/smb2/SessionSetup.js | 96 -----
dist/server/requestHandlers/smb2/index.d.ts | 2 -
dist/server/requestHandlers/smb2/index.js | 10 -
140 files changed, 4744 deletions(-)
delete mode 100644 dist/client/Client.d.ts
delete mode 100644 dist/client/Client.js
delete mode 100644 dist/client/Directory.d.ts
delete mode 100644 dist/client/Directory.js
delete mode 100644 dist/client/File.d.ts
delete mode 100644 dist/client/File.js
delete mode 100644 dist/client/Session.d.ts
delete mode 100644 dist/client/Session.js
delete mode 100644 dist/client/Tree.d.ts
delete mode 100644 dist/client/Tree.js
delete mode 100644 dist/index.d.ts
delete mode 100644 dist/index.js
delete mode 100644 dist/protocol/Packet.d.ts
delete mode 100644 dist/protocol/Packet.js
delete mode 100644 dist/protocol/Request.d.ts
delete mode 100644 dist/protocol/Request.js
delete mode 100644 dist/protocol/Response.d.ts
delete mode 100644 dist/protocol/Response.js
delete mode 100644 dist/protocol/Structure.d.ts
delete mode 100644 dist/protocol/Structure.js
delete mode 100644 dist/protocol/StructureField.d.ts
delete mode 100644 dist/protocol/StructureField.js
delete mode 100644 dist/protocol/Value.d.ts
delete mode 100644 dist/protocol/Value.js
delete mode 100644 dist/protocol/models/ChangeEntry.d.ts
delete mode 100644 dist/protocol/models/ChangeEntry.js
delete mode 100644 dist/protocol/models/DirectoryEntry.d.ts
delete mode 100644 dist/protocol/models/DirectoryEntry.js
delete mode 100644 dist/protocol/ntlm/NegotiateFlag.d.ts
delete mode 100644 dist/protocol/ntlm/NegotiateFlag.js
delete mode 100644 dist/protocol/ntlm/util.d.ts
delete mode 100644 dist/protocol/ntlm/util.js
delete mode 100644 dist/protocol/protocolIds.d.ts
delete mode 100644 dist/protocol/protocolIds.js
delete mode 100644 dist/protocol/smb/Header.d.ts
delete mode 100644 dist/protocol/smb/Header.js
delete mode 100644 dist/protocol/smb/Packet.d.ts
delete mode 100644 dist/protocol/smb/Packet.js
delete mode 100644 dist/protocol/smb/PacketType.d.ts
delete mode 100644 dist/protocol/smb/PacketType.js
delete mode 100644 dist/protocol/smb/Request.d.ts
delete mode 100644 dist/protocol/smb/Request.js
delete mode 100644 dist/protocol/smb/Response.d.ts
delete mode 100644 dist/protocol/smb/Response.js
delete mode 100644 dist/protocol/smb2/Capability.d.ts
delete mode 100644 dist/protocol/smb2/Capability.js
delete mode 100644 dist/protocol/smb2/CreateDispositionType.d.ts
delete mode 100644 dist/protocol/smb2/CreateDispositionType.js
delete mode 100644 dist/protocol/smb2/Dialect.d.ts
delete mode 100644 dist/protocol/smb2/Dialect.js
delete mode 100644 dist/protocol/smb2/DirectoryAccess.d.ts
delete mode 100644 dist/protocol/smb2/DirectoryAccess.js
delete mode 100644 dist/protocol/smb2/FileAction.d.ts
delete mode 100644 dist/protocol/smb2/FileAction.js
delete mode 100644 dist/protocol/smb2/FileAttribute.d.ts
delete mode 100644 dist/protocol/smb2/FileAttribute.js
delete mode 100644 dist/protocol/smb2/FilePipePrinterAccess.d.ts
delete mode 100644 dist/protocol/smb2/FilePipePrinterAccess.js
delete mode 100644 dist/protocol/smb2/Header.d.ts
delete mode 100644 dist/protocol/smb2/Header.js
delete mode 100644 dist/protocol/smb2/HeaderFlag.d.ts
delete mode 100644 dist/protocol/smb2/HeaderFlag.js
delete mode 100644 dist/protocol/smb2/Packet.d.ts
delete mode 100644 dist/protocol/smb2/Packet.js
delete mode 100644 dist/protocol/smb2/PacketType.d.ts
delete mode 100644 dist/protocol/smb2/PacketType.js
delete mode 100644 dist/protocol/smb2/Request.d.ts
delete mode 100644 dist/protocol/smb2/Request.js
delete mode 100644 dist/protocol/smb2/Response.d.ts
delete mode 100644 dist/protocol/smb2/Response.js
delete mode 100644 dist/protocol/smb2/ShareAccessType.d.ts
delete mode 100644 dist/protocol/smb2/ShareAccessType.js
delete mode 100644 dist/protocol/smb2/StatusCode.d.ts
delete mode 100644 dist/protocol/smb2/StatusCode.js
delete mode 100644 dist/protocol/smb2/packets/ChangeNotify.d.ts
delete mode 100644 dist/protocol/smb2/packets/ChangeNotify.js
delete mode 100644 dist/protocol/smb2/packets/Close.d.ts
delete mode 100644 dist/protocol/smb2/packets/Close.js
delete mode 100644 dist/protocol/smb2/packets/Create.d.ts
delete mode 100644 dist/protocol/smb2/packets/Create.js
delete mode 100644 dist/protocol/smb2/packets/Echo.d.ts
delete mode 100644 dist/protocol/smb2/packets/Echo.js
delete mode 100644 dist/protocol/smb2/packets/Flush.d.ts
delete mode 100644 dist/protocol/smb2/packets/Flush.js
delete mode 100644 dist/protocol/smb2/packets/LogOff.d.ts
delete mode 100644 dist/protocol/smb2/packets/LogOff.js
delete mode 100644 dist/protocol/smb2/packets/Negotiate.d.ts
delete mode 100644 dist/protocol/smb2/packets/Negotiate.js
delete mode 100644 dist/protocol/smb2/packets/QueryDirectory.d.ts
delete mode 100644 dist/protocol/smb2/packets/QueryDirectory.js
delete mode 100644 dist/protocol/smb2/packets/Read.d.ts
delete mode 100644 dist/protocol/smb2/packets/Read.js
delete mode 100644 dist/protocol/smb2/packets/SessionSetup.d.ts
delete mode 100644 dist/protocol/smb2/packets/SessionSetup.js
delete mode 100644 dist/protocol/smb2/packets/SetInfo.d.ts
delete mode 100644 dist/protocol/smb2/packets/SetInfo.js
delete mode 100644 dist/protocol/smb2/packets/TreeConnect.d.ts
delete mode 100644 dist/protocol/smb2/packets/TreeConnect.js
delete mode 100644 dist/protocol/smb2/packets/TreeDisconnect.d.ts
delete mode 100644 dist/protocol/smb2/packets/TreeDisconnect.js
delete mode 100644 dist/protocol/smb2/packets/Write.d.ts
delete mode 100644 dist/protocol/smb2/packets/Write.js
delete mode 100644 dist/protocol/smb2/packets/index.d.ts
delete mode 100644 dist/protocol/smb2/packets/index.js
delete mode 100644 dist/protocol/structureUtil.d.ts
delete mode 100644 dist/protocol/structureUtil.js
delete mode 100644 dist/protocol/util.d.ts
delete mode 100644 dist/protocol/util.js
delete mode 100644 dist/server/Client.d.ts
delete mode 100644 dist/server/Client.js
delete mode 100644 dist/server/Middleware.d.ts
delete mode 100644 dist/server/Middleware.js
delete mode 100644 dist/server/Request.d.ts
delete mode 100644 dist/server/Request.js
delete mode 100644 dist/server/Response.d.ts
delete mode 100644 dist/server/Response.js
delete mode 100644 dist/server/Server.d.ts
delete mode 100644 dist/server/Server.js
delete mode 100644 dist/server/Smb2Request.d.ts
delete mode 100644 dist/server/Smb2Request.js
delete mode 100644 dist/server/Smb2Response.d.ts
delete mode 100644 dist/server/Smb2Response.js
delete mode 100644 dist/server/SmbRequest.d.ts
delete mode 100644 dist/server/SmbRequest.js
delete mode 100644 dist/server/SmbResponse.d.ts
delete mode 100644 dist/server/SmbResponse.js
delete mode 100644 dist/server/middlewares/requestType.d.ts
delete mode 100644 dist/server/middlewares/requestType.js
delete mode 100644 dist/server/middlewares/supportedProtocols.d.ts
delete mode 100644 dist/server/middlewares/supportedProtocols.js
delete mode 100644 dist/server/requestHandlers/smb/Negotiate.d.ts
delete mode 100644 dist/server/requestHandlers/smb/Negotiate.js
delete mode 100644 dist/server/requestHandlers/smb/index.d.ts
delete mode 100644 dist/server/requestHandlers/smb/index.js
delete mode 100644 dist/server/requestHandlers/smb2/Negotiate.d.ts
delete mode 100644 dist/server/requestHandlers/smb2/Negotiate.js
delete mode 100644 dist/server/requestHandlers/smb2/SessionSetup.d.ts
delete mode 100644 dist/server/requestHandlers/smb2/SessionSetup.js
delete mode 100644 dist/server/requestHandlers/smb2/index.d.ts
delete mode 100644 dist/server/requestHandlers/smb2/index.js
diff --git a/dist/client/Client.d.ts b/dist/client/Client.d.ts
deleted file mode 100644
index 6080594..0000000
--- a/dist/client/Client.d.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-///
-import { Socket } from "net";
-import { EventEmitter } from "events";
-import Request from "../protocol/smb2/Request";
-import Response from "../protocol/smb2/Response";
-import Header from "../protocol/smb2/Header";
-import Session, { AuthenticateOptions } from "./Session";
-export interface Options {
- port?: number;
- connectTimeout?: number;
- requestTimeout?: number;
-}
-interface Client {
- on(event: "error", callback: (error: Error) => void): this;
- on(event: "changeNotify", callback: (response: Response) => void): this;
- once(event: "error", callback: (error: Error) => void): this;
- once(event: "changeNotify", callback: (response: Response) => void): this;
-}
-declare class Client extends EventEmitter {
- host: string;
- options: Options;
- _id: string;
- socket: Socket;
- nextMessageId: bigint;
- responseRestChunk: Buffer;
- responseMap: Map;
- responseCallbackMap: Map void>;
- connected: boolean;
- port: number;
- connectTimeout: number;
- connectTimeoutId: NodeJS.Timer;
- requestTimeout: number;
- requestTimeoutIdMap: Map;
- sessions: Session[];
- constructor(host: string, options?: Options);
- connect(): Promise;
- createRequest(header?: Header, body?: any): Request;
- request(header?: Header, body?: any): Promise;
- send(request: Request): Promise;
- onData: (buffer: Buffer) => void;
- onResponse(response: Response): void;
- onError: (err: Error) => void;
- onClose: (hadError: boolean) => void;
- echo(): Promise;
- authenticate(options: AuthenticateOptions): Promise;
- private destroySocket;
- private registerSession;
- close(): Promise;
-}
-export default Client;
diff --git a/dist/client/Client.js b/dist/client/Client.js
deleted file mode 100644
index 9850957..0000000
--- a/dist/client/Client.js
+++ /dev/null
@@ -1,208 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const crypto_1 = __importDefault(require("crypto"));
-const net_1 = require("net");
-const events_1 = require("events");
-const Packet_1 = __importDefault(require("../protocol/Packet"));
-const Request_1 = __importDefault(require("../protocol/smb2/Request"));
-const Response_1 = __importDefault(require("../protocol/smb2/Response"));
-const StatusCode_1 = __importDefault(require("../protocol/smb2/StatusCode"));
-const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
-const Session_1 = __importDefault(require("./Session"));
-const structureUtil = __importStar(require("../protocol/structureUtil"));
-class Client extends events_1.EventEmitter {
- constructor(host, options = {}) {
- super();
- this.host = host;
- this.options = options;
- this._id = crypto_1.default.randomBytes(4).toString("hex");
- this.nextMessageId = 0n;
- this.responseMap = new Map();
- this.responseCallbackMap = new Map();
- this.connected = false;
- this.port = 445;
- this.connectTimeout = 5 * 1000;
- this.requestTimeout = 5 * 1000;
- this.requestTimeoutIdMap = new Map();
- this.sessions = [];
- this.onData = (buffer) => {
- if (this.responseRestChunk) {
- buffer = Buffer.concat([this.responseRestChunk, buffer]);
- this.responseRestChunk = undefined;
- }
- const { chunks, restChunk } = Packet_1.default.getChunks(buffer);
- this.responseRestChunk = restChunk;
- for (const chunk of chunks) {
- const response = Response_1.default.parse(chunk);
- this.onResponse(response);
- }
- };
- this.onError = (err) => {
- this.emit("error", err);
- };
- this.onClose = (hadError) => {
- this.connected = false;
- this.emit("error", new Error("client_closed"));
- };
- if (typeof this.options.port === "number")
- this.port = this.options.port;
- if (typeof this.options.connectTimeout === "number")
- this.connectTimeout = this.options.connectTimeout;
- if (typeof this.options.requestTimeout === "number")
- this.requestTimeout = this.options.requestTimeout;
- }
- async connect() {
- if (this.connected)
- return;
- this.socket = new net_1.Socket({ allowHalfOpen: true })
- .addListener("data", this.onData)
- .addListener("error", this.onError)
- .addListener("close", this.onClose);
- this.socket.setTimeout(0);
- this.socket.setKeepAlive(true);
- const connectPromise = new Promise((resolve, reject) => {
- this.connectTimeoutId = setTimeout(() => {
- reject(new Error("connect_timeout"));
- }, this.connectTimeout);
- this.socket.connect(this.port, this.host);
- this.socket.once("connect", () => {
- resolve();
- });
- this.socket.once("error", (err) => {
- reject(err);
- });
- });
- try {
- await connectPromise;
- clearTimeout(this.connectTimeoutId);
- this.connected = true;
- }
- catch (err) {
- this.destroySocket();
- throw err;
- }
- }
- createRequest(header = {}, body = {}) {
- const messageId = this.nextMessageId++;
- return new Request_1.default({
- messageId,
- clientId: this._id,
- ...header
- }, body);
- }
- async request(header, body) {
- const request = this.createRequest(header, body);
- return await this.send(request);
- }
- async send(request) {
- if (!this.connected)
- throw new Error("not_connected");
- const buffer = request.serialize();
- this.socket.write(buffer);
- const messageId = request.header.messageId;
- const sendPromise = new Promise((resolve, reject) => {
- const requestTimeoutId = setTimeout(() => {
- const err = new Error(`request_timeout: ${structureUtil.parseEnumValue(PacketType_1.default, request.header.type)}(${messageId})`);
- reject(err);
- }, this.requestTimeout);
- this.requestTimeoutIdMap.set(messageId, requestTimeoutId);
- const finishRequest = (response) => {
- response.request = request;
- if (response.header.status !== StatusCode_1.default.Success &&
- response.header.status !== StatusCode_1.default.Pending &&
- response.header.status !== StatusCode_1.default.MoreProcessingRequired &&
- response.header.status !== StatusCode_1.default.FileClosed) {
- reject(response);
- }
- else {
- resolve(response);
- }
- };
- if (this.responseMap.has(messageId)) {
- finishRequest(this.responseMap.get(messageId));
- this.responseMap.delete(messageId);
- }
- else if (!this.responseCallbackMap.has(messageId)) {
- this.responseCallbackMap.set(messageId, finishRequest);
- }
- });
- const response = await sendPromise;
- if (this.requestTimeoutIdMap.has(messageId)) {
- const requestTimeoutId = this.requestTimeoutIdMap.get(messageId);
- clearTimeout(requestTimeoutId);
- this.requestTimeoutIdMap.delete(messageId);
- }
- return response;
- }
- onResponse(response) {
- if (response.header.type === PacketType_1.default.ChangeNotify &&
- response.header.status === StatusCode_1.default.Success) {
- this.emit("changeNotify", response);
- }
- const messageId = response.header.messageId;
- if (this.responseCallbackMap.has(messageId)) {
- this.responseCallbackMap.get(messageId)(response);
- this.responseCallbackMap.delete(messageId);
- }
- else {
- this.responseMap.set(messageId, response);
- }
- }
- async echo() {
- return await this.request({
- type: PacketType_1.default.Echo
- });
- }
- async authenticate(options) {
- if (!this.connected)
- await this.connect();
- const session = new Session_1.default(this);
- this.registerSession(session);
- await session.authenticate(options);
- return session;
- }
- destroySocket() {
- this.socket
- .removeListener("data", this.onData)
- .removeListener("error", this.onError)
- .removeListener("close", this.onClose);
- this.socket.end();
- this.socket.destroy();
- delete this.socket;
- }
- registerSession(session) {
- session
- .once("authenticate", () => this.sessions.push(session))
- .once("logoff", () => this.sessions.splice(this.sessions.indexOf(session), 1));
- }
- async close() {
- if (!this.connected)
- return;
- await Promise.all(this.sessions.map(x => x.logoff()));
- this.destroySocket();
- this.connected = false;
- }
-}
-exports.default = Client;
diff --git a/dist/client/Directory.d.ts b/dist/client/Directory.d.ts
deleted file mode 100644
index b546f51..0000000
--- a/dist/client/Directory.d.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-///
-import Tree from "./Tree";
-import { EventEmitter } from "events";
-import Response from "../protocol/smb2/Response";
-import DirectoryAccess from "../protocol/smb2/DirectoryAccess";
-import { CreateOptions } from "../protocol/smb2/packets/Create";
-import DirectoryEntry from "../protocol/models/DirectoryEntry";
-import CreateDispositionType from "../protocol/smb2/CreateDispositionType";
-interface OpenOptions {
- desiredAccess?: DirectoryAccess;
- createDisposition?: CreateDispositionType;
- createOptions?: CreateOptions;
-}
-interface Directory {
- on(event: "open" | "close", callback: (directory: Directory) => void): this;
- on(event: "change", callback: (response: Response) => void): this;
- once(event: "open" | "close", callback: (directory: Directory) => void): this;
- once(event: "change", callback: (response: Response) => void): this;
-}
-declare class Directory extends EventEmitter {
- private tree;
- _id: string;
- isOpen: boolean;
- watching: boolean;
- private watchingMessageIds;
- private watchRecursive;
- constructor(tree: Tree);
- open(path: string, options?: OpenOptions): Promise;
- create(path: string): Promise;
- watch(recursive?: boolean): Promise;
- unwatch(): Promise;
- private onChangeNotify;
- private requestWatch;
- flush(): Promise;
- read(): Promise;
- exists(path: string): Promise;
- remove(): Promise;
- rename(newPath: string): Promise;
- setInfo(fileInfoClass: number, buffer: Buffer): Promise;
- close(): Promise;
-}
-export default Directory;
diff --git a/dist/client/Directory.js b/dist/client/Directory.js
deleted file mode 100644
index 2a4bc6e..0000000
--- a/dist/client/Directory.js
+++ /dev/null
@@ -1,183 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const events_1 = require("events");
-const util = __importStar(require("../protocol/util"));
-const StatusCode_1 = __importDefault(require("../protocol/smb2/StatusCode"));
-const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
-const FileAttribute_1 = __importDefault(require("../protocol/smb2/FileAttribute"));
-const ShareAccessType_1 = __importDefault(require("../protocol/smb2/ShareAccessType"));
-const DirectoryAccess_1 = __importDefault(require("../protocol/smb2/DirectoryAccess"));
-const Create_1 = require("../protocol/smb2/packets/Create");
-const structureUtil = __importStar(require("../protocol/structureUtil"));
-const SetInfo_1 = require("../protocol/smb2/packets/SetInfo");
-const CreateDispositionType_1 = __importDefault(require("../protocol/smb2/CreateDispositionType"));
-const ChangeNotify_1 = require("../protocol/smb2/packets/ChangeNotify");
-class Directory extends events_1.EventEmitter {
- constructor(tree) {
- super();
- this.tree = tree;
- this.isOpen = false;
- this.watching = false;
- this.watchingMessageIds = [];
- this.onChangeNotify = async (response) => {
- const messageId = response.header.messageId;
- const messageIdIndex = this.watchingMessageIds.indexOf(messageId);
- if (messageIdIndex !== -1) {
- this.watchingMessageIds.splice(messageIdIndex, 1);
- this.emit("change", response);
- await this.requestWatch();
- }
- };
- }
- async open(path, options = {}) {
- if (this.isOpen)
- return;
- const buffer = Buffer.from(util.toWindowsFilePath(path), "ucs2");
- const response = await this.tree.request({ type: PacketType_1.default.Create }, {
- buffer,
- desiredAccess: typeof options.desiredAccess === "number" ?
- options.desiredAccess :
- (DirectoryAccess_1.default.ListDirectory |
- DirectoryAccess_1.default.ReadAttributes |
- DirectoryAccess_1.default.Synchronize),
- fileAttributes: FileAttribute_1.default.Directory,
- shareAccess: ShareAccessType_1.default.Read |
- ShareAccessType_1.default.Write |
- ShareAccessType_1.default.Delete,
- createDisposition: typeof options.createDisposition === "number" ?
- options.createDisposition :
- CreateDispositionType_1.default.Open,
- createOptions: typeof options.createOptions === "number" ?
- options.createOptions :
- Create_1.CreateOptions.None,
- nameOffset: 0x0078,
- createContextsOffset: 0x007a + buffer.length
- });
- this._id = response.body.fileId;
- this.isOpen = true;
- this.emit("open", this);
- }
- async create(path) {
- await this.open(path, {
- createDisposition: CreateDispositionType_1.default.Create,
- createOptions: Create_1.CreateOptions.Directory
- });
- }
- async watch(recursive = true) {
- if (this.watching)
- return;
- this.watching = true;
- this.watchRecursive = recursive;
- await this.requestWatch();
- this.tree.session.client.addListener("changeNotify", this.onChangeNotify);
- }
- async unwatch() {
- if (!this.watching)
- return;
- this.watching = false;
- this.tree.session.client.removeListener("changeNotify", this.onChangeNotify);
- await this.close();
- }
- async requestWatch() {
- const request = this.tree.createRequest({ type: PacketType_1.default.ChangeNotify }, {
- flags: this.watchRecursive ?
- ChangeNotify_1.Flags.WatchTreeRecursively :
- ChangeNotify_1.Flags.None,
- fileId: this._id
- });
- this.watchingMessageIds.push(request.header.messageId);
- const response = await this.tree.session.client.send(request);
- if (response.header.status !== StatusCode_1.default.Success &&
- response.header.status !== StatusCode_1.default.Pending)
- throw new Error(`ChangeNotify: ${structureUtil.parseEnumValue(StatusCode_1.default, response.header.status)} (${response.header.status})`);
- return response;
- }
- async flush() {
- await this.tree.request({
- type: PacketType_1.default.Flush
- }, {
- fileId: this._id
- });
- }
- async read() {
- const response = await this.tree.request({ type: PacketType_1.default.QueryDirectory }, {
- fileId: this._id,
- buffer: Buffer.from("*", "ucs2")
- });
- let entries = [];
- if (response.data) {
- entries = response.data.filter(x => x.filename !== "." && x.filename !== "..");
- }
- else {
- console.warn("response without data", response);
- }
- return entries;
- }
- async exists(path) {
- try {
- await this.open(path);
- }
- catch (err) {
- if (err.header.status === StatusCode_1.default.FileNameNotFound ||
- err.header.status === StatusCode_1.default.FilePathNotFound) {
- return false;
- }
- throw err;
- }
- return true;
- }
- async remove() {
- const buffer = Buffer.alloc(1);
- buffer.writeUInt8(1, 0);
- await this.setInfo(SetInfo_1.FileInfoClass.DispositionInformation, buffer);
- }
- async rename(newPath) {
- const newPathUCS2 = Buffer.from(newPath, "ucs2");
- const buffer = Buffer.alloc(1 + 7 + 8 + 4 + newPathUCS2.length);
- buffer.fill(0x00);
- buffer.writeUInt8(1, 0);
- buffer.writeUInt32LE(newPathUCS2.length, 16);
- buffer.fill(newPathUCS2, 20);
- await this.setInfo(SetInfo_1.FileInfoClass.RenameInformation, buffer);
- }
- async setInfo(fileInfoClass, buffer) {
- await this.tree.request({ type: PacketType_1.default.SetInfo }, {
- infoType: SetInfo_1.InfoType.File,
- fileId: this._id,
- fileInfoClass,
- buffer
- });
- }
- async close() {
- if (this.watching)
- return await this.unwatch();
- if (!this.isOpen)
- return;
- this.isOpen = false;
- await this.tree.request({ type: PacketType_1.default.Close }, { fileId: this._id });
- this.emit("close", this);
- }
-}
-exports.default = Directory;
diff --git a/dist/client/File.d.ts b/dist/client/File.d.ts
deleted file mode 100644
index 769e6e7..0000000
--- a/dist/client/File.d.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-///
-import Tree from "./Tree";
-import { EventEmitter } from "events";
-import { CreateOptions } from "../protocol/smb2/packets/Create";
-import CreateDispositionType from "../protocol/smb2/CreateDispositionType";
-import FilePipePrinterAccess from "../protocol/smb2/FilePipePrinterAccess";
-interface OpenOptions {
- desiredAccess?: FilePipePrinterAccess;
- createDisposition?: CreateDispositionType;
- createOptions?: CreateOptions;
-}
-interface File {
- on(event: "open" | "close", callback: (file: File) => void): this;
- once(event: "open" | "close", callback: (file: File) => void): this;
-}
-declare class File extends EventEmitter {
- private tree;
- _id: Buffer;
- isOpen: boolean;
- fileSize: bigint;
- constructor(tree: Tree);
- open(path: string, options?: OpenOptions): Promise;
- create(path: string): Promise;
- remove(): Promise;
- rename(newPath: string): Promise;
- setSize(size: bigint): Promise;
- setInfo(fileInfoClass: number, buffer: Buffer): Promise;
- write(content: Buffer | string): Promise;
- read(): Promise;
- exists(path: string): Promise;
- close(): Promise;
-}
-export default File;
diff --git a/dist/client/File.js b/dist/client/File.js
deleted file mode 100644
index 3809e1b..0000000
--- a/dist/client/File.js
+++ /dev/null
@@ -1,161 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const events_1 = require("events");
-const util = __importStar(require("../protocol/util"));
-const StatusCode_1 = __importDefault(require("../protocol/smb2/StatusCode"));
-const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
-const FileAttribute_1 = __importDefault(require("../protocol/smb2/FileAttribute"));
-const ShareAccessType_1 = __importDefault(require("../protocol/smb2/ShareAccessType"));
-const Create_1 = require("../protocol/smb2/packets/Create");
-const CreateDispositionType_1 = __importDefault(require("../protocol/smb2/CreateDispositionType"));
-const FilePipePrinterAccess_1 = __importDefault(require("../protocol/smb2/FilePipePrinterAccess"));
-const SetInfo_1 = require("../protocol/smb2/packets/SetInfo");
-const maxReadChunkLength = 0x00010000;
-const maxWriteChunkLength = 0x00010000 - 0x71;
-class File extends events_1.EventEmitter {
- constructor(tree) {
- super();
- this.tree = tree;
- }
- async open(path, options = {}) {
- if (this.isOpen)
- return;
- const buffer = Buffer.from(util.toWindowsFilePath(path), "ucs2");
- const response = await this.tree.request({ type: PacketType_1.default.Create }, {
- buffer,
- desiredAccess: typeof options.desiredAccess === "number" ?
- options.desiredAccess :
- FilePipePrinterAccess_1.default.ReadData,
- fileAttributes: FileAttribute_1.default.Normal,
- shareAccess: ShareAccessType_1.default.Read |
- ShareAccessType_1.default.Write |
- ShareAccessType_1.default.Delete,
- createDisposition: typeof options.createDisposition === "number" ?
- options.createDisposition :
- CreateDispositionType_1.default.Open,
- createOptions: typeof options.createDisposition === "number" ?
- options.createDisposition :
- Create_1.CreateOptions.None,
- nameOffset: 0x0078,
- createContextsOffset: 0x007a + buffer.length
- });
- this._id = response.body.fileId;
- this.fileSize = response.body.endOfFile;
- this.isOpen = true;
- this.emit("open", this);
- }
- async create(path) {
- await this.open(path, {
- desiredAccess: FilePipePrinterAccess_1.default.WriteData,
- createDisposition: CreateDispositionType_1.default.Create
- });
- }
- async remove() {
- const buffer = Buffer.alloc(1);
- buffer.writeUInt8(1, 0);
- await this.setInfo(SetInfo_1.FileInfoClass.DispositionInformation, buffer);
- }
- async rename(newPath) {
- const newPathUCS2 = Buffer.from(newPath, "ucs2");
- const buffer = Buffer.alloc(1 + 7 + 8 + 4 + newPathUCS2.length);
- buffer.fill(0x00);
- buffer.writeUInt8(1, 0);
- buffer.writeUInt32LE(newPathUCS2.length, 16);
- buffer.fill(newPathUCS2, 20);
- await this.setInfo(SetInfo_1.FileInfoClass.RenameInformation, buffer);
- }
- async setSize(size) {
- const buffer = Buffer.alloc(8);
- buffer.writeBigInt64LE(size);
- await this.setInfo(SetInfo_1.FileInfoClass.EndOfFileInformation, buffer);
- }
- async setInfo(fileInfoClass, buffer) {
- await this.tree.request({ type: PacketType_1.default.SetInfo }, {
- infoType: SetInfo_1.InfoType.File,
- fileId: this._id,
- fileInfoClass,
- buffer
- });
- }
- async write(content) {
- const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content, "utf8");
- const chunkCount = Math.ceil(buffer.length / maxWriteChunkLength);
- for (let index = 0; index < chunkCount; index++) {
- const offset = index * maxWriteChunkLength;
- const nextOffset = (index + 1) * maxWriteChunkLength;
- const length = nextOffset > buffer.length ? buffer.length - offset : nextOffset - offset;
- const chunk = buffer.slice(offset, offset + length);
- const offsetBuffer = Buffer.alloc(8);
- offsetBuffer.writeBigUInt64LE(BigInt(offset));
- await this.tree.request({ type: PacketType_1.default.Write }, {
- fileId: this._id,
- buffer: chunk,
- offset: offsetBuffer
- });
- }
- }
- async read() {
- const fileSize = Number(this.fileSize);
- const chunkCount = Math.ceil(fileSize / maxReadChunkLength);
- const buffer = Buffer.alloc(fileSize);
- for (let index = 0; index < chunkCount; index++) {
- const offset = index * maxReadChunkLength;
- const nextOffset = (index + 1) * maxReadChunkLength;
- const length = nextOffset > fileSize ? fileSize - offset : nextOffset - offset;
- const lengthBuffer = Buffer.alloc(4);
- lengthBuffer.writeInt32LE(length, 0);
- const offsetBuffer = Buffer.alloc(8);
- offsetBuffer.writeBigUInt64LE(BigInt(offset));
- const response = await this.tree.request({ type: PacketType_1.default.Read }, {
- fileId: this._id,
- length: lengthBuffer,
- offset: offsetBuffer
- });
- response.body.buffer.copy(buffer, offset);
- }
- return buffer;
- }
- async exists(path) {
- try {
- await this.open(path);
- }
- catch (err) {
- if (err.header.status === StatusCode_1.default.FileNameNotFound ||
- err.header.status === StatusCode_1.default.FilePathNotFound) {
- return false;
- }
- throw err;
- }
- return true;
- }
- async close() {
- if (!this.isOpen)
- return;
- this.isOpen = false;
- await this.tree.request({ type: PacketType_1.default.Close }, { fileId: this._id });
- this.emit("close", this);
- }
-}
-exports.default = File;
diff --git a/dist/client/Session.d.ts b/dist/client/Session.d.ts
deleted file mode 100644
index 825bf75..0000000
--- a/dist/client/Session.d.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-///
-import Tree from "./Tree";
-import Client from "./Client";
-import { EventEmitter } from "events";
-import Header from "../protocol/smb2/Header";
-export interface AuthenticateOptions {
- domain: string;
- username: string;
- password: string;
-}
-interface Session {
- on(event: "authenticate" | "logoff", callback: (session: Session) => void): this;
- once(event: "authenticate" | "logoff", callback: (session: Session) => void): this;
-}
-declare class Session extends EventEmitter {
- client: Client;
- _id: string;
- authenticated: boolean;
- connectedTrees: Tree[];
- constructor(client: Client);
- connectTree(path: string): Promise;
- createRequest(header?: Header, body?: any): import("../protocol/smb2/Request").default;
- request(header?: Header, body?: any): Promise;
- authenticate(options: AuthenticateOptions): Promise;
- private registerTree;
- logoff(): Promise;
-}
-export default Session;
diff --git a/dist/client/Session.js b/dist/client/Session.js
deleted file mode 100644
index b1c223d..0000000
--- a/dist/client/Session.js
+++ /dev/null
@@ -1,90 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Tree_1 = __importDefault(require("./Tree"));
-const events_1 = require("events");
-const Dialect_1 = __importDefault(require("../protocol/smb2/Dialect"));
-const ntlmUtil = __importStar(require("../protocol/ntlm/util"));
-const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
-class Session extends events_1.EventEmitter {
- constructor(client) {
- super();
- this.client = client;
- this.authenticated = false;
- this.connectedTrees = [];
- }
- async connectTree(path) {
- const tree = new Tree_1.default(this);
- this.registerTree(tree);
- await tree.connect(path);
- return tree;
- }
- createRequest(header = {}, body = {}) {
- return this.client.createRequest({
- sessionId: this._id,
- ...header
- }, body);
- }
- async request(header = {}, body = {}) {
- return await this.client.request({
- sessionId: this._id,
- ...header
- }, body);
- }
- async authenticate(options) {
- if (this.authenticated)
- return;
- await this.request({
- type: PacketType_1.default.Negotiate
- }, {
- dialects: [
- Dialect_1.default.Smb202,
- Dialect_1.default.Smb210
- ]
- });
- const sessionSetupResponse = await this.request({ type: PacketType_1.default.SessionSetup }, { buffer: ntlmUtil.encodeNegotiationMessage(this.client.host, options.domain) });
- this._id = sessionSetupResponse.header.sessionId;
- const nonce = ntlmUtil.decodeChallengeMessage(sessionSetupResponse.body.buffer);
- await this.request({ type: PacketType_1.default.SessionSetup }, {
- buffer: ntlmUtil.encodeAuthenticationMessage(options.username, this.client.host, options.domain, nonce, options.password)
- });
- this.authenticated = true;
- this.emit("authenticate", this);
- }
- registerTree(tree) {
- tree
- .once("connect", () => this.connectedTrees.push(tree))
- .once("disconnect", () => this.connectedTrees.splice(this.connectedTrees.indexOf(tree), 1));
- }
- async logoff() {
- if (!this.authenticated)
- return;
- this.authenticated = false;
- await Promise.all(this.connectedTrees.map(x => x.disconnect()));
- await this.request({ type: PacketType_1.default.LogOff });
- delete this._id;
- this.emit("logoff", this);
- }
-}
-exports.default = Session;
diff --git a/dist/client/Tree.d.ts b/dist/client/Tree.d.ts
deleted file mode 100644
index 1ae7615..0000000
--- a/dist/client/Tree.d.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-///
-import File from "./File";
-import Session from "./Session";
-import Directory from "./Directory";
-import { EventEmitter } from "events";
-import Header from "../protocol/smb2/Header";
-import Response from "../protocol/smb2/Response";
-interface Tree {
- on(event: "connect" | "disconnect", callback: (tree: Tree) => void): this;
- once(event: "connect" | "disconnect", callback: (tree: Tree) => void): this;
-}
-declare class Tree extends EventEmitter {
- session: Session;
- _id: number;
- connected: boolean;
- connecting: boolean;
- openFiles: File[];
- openDirectories: Directory[];
- constructor(session: Session);
- connect(path: string): Promise;
- disconnect(): Promise;
- createDirectory(path: string): Promise;
- removeDirectory(path: string): Promise;
- renameDirectory(path: string, newPath: string): Promise;
- watch(onChange?: (response: Response) => void, recursive?: boolean): Promise<() => Promise>;
- watchDirectory(path: string, onChange: (response: Response) => void, recursive?: boolean): Promise<() => Promise>;
- readDirectory(path?: string): Promise;
- exists(path: string): Promise;
- createFile(path: string, content?: Buffer | string): Promise;
- removeFile(path: string): Promise;
- renameFile(path: string, newPath: string): Promise;
- readFile(path: string): Promise;
- private registerFile;
- private registerDirectory;
- createRequest(header?: Header, body?: any): import("../protocol/smb2/Request").default;
- request(header?: Header, body?: any): Promise;
-}
-export default Tree;
diff --git a/dist/client/Tree.js b/dist/client/Tree.js
deleted file mode 100644
index b12556f..0000000
--- a/dist/client/Tree.js
+++ /dev/null
@@ -1,167 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const File_1 = __importDefault(require("./File"));
-const Directory_1 = __importDefault(require("./Directory"));
-const events_1 = require("events");
-const util = __importStar(require("../protocol/util"));
-const PacketType_1 = __importDefault(require("../protocol/smb2/PacketType"));
-const DirectoryAccess_1 = __importDefault(require("../protocol/smb2/DirectoryAccess"));
-const FilePipePrinterAccess_1 = __importDefault(require("../protocol/smb2/FilePipePrinterAccess"));
-class Tree extends events_1.EventEmitter {
- constructor(session) {
- super();
- this.session = session;
- this.connected = false;
- this.connecting = false;
- this.openFiles = [];
- this.openDirectories = [];
- }
- async connect(path) {
- if (this.connected || this.connecting)
- return;
- this.connecting = true;
- const buffer = Buffer.from(util.toWindowsPath(`//${this.session.client.host}:${this.session.client.port}/${path}`), "ucs2");
- const response = await this.request({ type: PacketType_1.default.TreeConnect }, { buffer });
- this._id = response.header.treeId;
- this.connecting = false;
- this.connected = true;
- this.emit("connect", this);
- }
- async disconnect() {
- if (!this.connected)
- return;
- this.connected = false;
- await Promise.all([
- ...this.openFiles.map(x => x.close()),
- ...this.openDirectories.map(x => x.close())
- ]);
- await this.request({ type: PacketType_1.default.TreeDisconnect });
- this.emit("disconnect", this);
- }
- async createDirectory(path) {
- const directory = new Directory_1.default(this);
- this.registerDirectory(directory);
- await directory.create(path);
- await directory.close();
- }
- async removeDirectory(path) {
- const directory = new Directory_1.default(this);
- this.registerDirectory(directory);
- await directory.open(path, { desiredAccess: DirectoryAccess_1.default.Delete });
- await directory.remove();
- await directory.close();
- }
- async renameDirectory(path, newPath) {
- const directory = new Directory_1.default(this);
- this.registerDirectory(directory);
- await directory.open(path, { desiredAccess: DirectoryAccess_1.default.MaximumAllowed });
- await directory.rename(newPath);
- await directory.close();
- }
- async watch(onChange, recursive) {
- return await this.watchDirectory("", onChange, recursive);
- }
- async watchDirectory(path = "/", onChange, recursive) {
- const directory = new Directory_1.default(this);
- this.registerDirectory(directory);
- await directory.open(path);
- await directory.watch(recursive);
- directory.addListener("change", onChange);
- return async () => {
- directory.removeListener("change", onChange);
- await directory.unwatch();
- };
- }
- async readDirectory(path = "/") {
- const directory = new Directory_1.default(this);
- this.registerDirectory(directory);
- await directory.open(path);
- const entries = await directory.read();
- await directory.close();
- return entries;
- }
- async exists(path) {
- const file = new File_1.default(this);
- this.registerFile(file);
- const exists = await file.exists(path);
- await file.close();
- return exists;
- }
- async createFile(path, content) {
- const file = new File_1.default(this);
- this.registerFile(file);
- await file.create(path);
- if (typeof content !== "undefined") {
- await file.setSize(BigInt(content.length));
- await file.write(content);
- }
- await file.close();
- }
- async removeFile(path) {
- const file = new File_1.default(this);
- this.registerFile(file);
- await file.open(path, { desiredAccess: FilePipePrinterAccess_1.default.Delete });
- await file.remove();
- await file.close();
- }
- async renameFile(path, newPath) {
- const file = new File_1.default(this);
- this.registerFile(file);
- await file.open(path, { desiredAccess: FilePipePrinterAccess_1.default.MaximumAllowed });
- await file.rename(newPath);
- await file.close();
- }
- async readFile(path) {
- const file = new File_1.default(this);
- this.registerFile(file);
- await file.open(path);
- const buffer = await file.read();
- await file.close();
- return buffer;
- }
- registerFile(file) {
- file
- .once("open", () => this.openFiles.push(file))
- .once("close", () => this.openFiles.splice(this.openFiles.indexOf(file), 1));
- }
- registerDirectory(directory) {
- directory
- .once("open", () => this.openDirectories.push(directory))
- .once("close", () => this.openDirectories.splice(this.openDirectories.indexOf(directory), 1));
- }
- createRequest(header = {}, body = {}) {
- return this.session.createRequest({
- treeId: this._id,
- ...header
- }, body);
- }
- request(header = {}, body = {}) {
- return this.session.request({
- treeId: this._id,
- ...header
- }, body);
- }
-}
-exports.default = Tree;
diff --git a/dist/index.d.ts b/dist/index.d.ts
deleted file mode 100644
index 48f3871..0000000
--- a/dist/index.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { default as Client } from "./client/Client";
-export { Client, };
-declare const _default: {
- Client: typeof Client;
-};
-export default _default;
diff --git a/dist/index.js b/dist/index.js
deleted file mode 100644
index 1350f5e..0000000
--- a/dist/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Client = void 0;
-const Client_1 = __importDefault(require("./client/Client"));
-Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return Client_1.default; } });
-exports.default = {
- Client: Client_1.default,
-};
diff --git a/dist/protocol/Packet.d.ts b/dist/protocol/Packet.d.ts
deleted file mode 100644
index 2a7cc4f..0000000
--- a/dist/protocol/Packet.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-///
-import StructureField from "./StructureField";
-export declare const protocolIdStructureField: StructureField;
-export default class Packet {
- static parseProtocolId(buffer: Buffer): string;
- static getChunks(buffer: Buffer): {
- chunks: Buffer[];
- restChunk: Buffer;
- };
-}
diff --git a/dist/protocol/Packet.js b/dist/protocol/Packet.js
deleted file mode 100644
index 0ec492e..0000000
--- a/dist/protocol/Packet.js
+++ /dev/null
@@ -1,54 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.protocolIdStructureField = void 0;
-const protocolIds = __importStar(require("./protocolIds"));
-const structureUtil = __importStar(require("./structureUtil"));
-exports.protocolIdStructureField = {
- type: String,
- encoding: "hex",
- size: 4,
- defaultValue: protocolIds.smb2
-};
-class Packet {
- static parseProtocolId(buffer) {
- return structureUtil.parseValue(buffer, exports.protocolIdStructureField);
- }
- static getChunks(buffer) {
- const chunks = [];
- while (buffer.length > 4) {
- const netBiosType = buffer.readUInt8(0);
- if (netBiosType !== 0x00)
- throw new Error("no_net_bios_message");
- const packetLength = buffer.readUInt32BE(0);
- if (packetLength > buffer.length - 4)
- break;
- buffer = buffer.slice(4);
- chunks.push(buffer.slice(0, packetLength));
- buffer = buffer.slice(packetLength);
- }
- return {
- chunks,
- restChunk: buffer
- };
- }
-}
-exports.default = Packet;
diff --git a/dist/protocol/Request.d.ts b/dist/protocol/Request.d.ts
deleted file mode 100644
index 42dc0d9..0000000
--- a/dist/protocol/Request.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-import Response from "./Response";
-export default abstract class Request {
- header: any;
- body: any;
- response?: Response;
- constructor(header?: any, body?: any);
- abstract serialize(): Buffer;
-}
diff --git a/dist/protocol/Request.js b/dist/protocol/Request.js
deleted file mode 100644
index 89111ed..0000000
--- a/dist/protocol/Request.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class Request {
- constructor(header = {}, body = {}) {
- this.header = header;
- this.body = body;
- }
-}
-exports.default = Request;
diff --git a/dist/protocol/Response.d.ts b/dist/protocol/Response.d.ts
deleted file mode 100644
index fb05f9d..0000000
--- a/dist/protocol/Response.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-import Request from "./Request";
-export default abstract class Response {
- header: any;
- body: any;
- request?: Request;
- constructor(header?: any, body?: any);
- abstract serialize(): Buffer;
-}
diff --git a/dist/protocol/Response.js b/dist/protocol/Response.js
deleted file mode 100644
index 2012baa..0000000
--- a/dist/protocol/Response.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class Response {
- constructor(header = {}, body = {}) {
- this.header = header;
- this.body = body;
- }
-}
-exports.default = Response;
diff --git a/dist/protocol/Structure.d.ts b/dist/protocol/Structure.d.ts
deleted file mode 100644
index 2c09eba..0000000
--- a/dist/protocol/Structure.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import StructureField from "./StructureField";
-declare type Structure = {
- [key: string]: StructureField;
-};
-export default Structure;
diff --git a/dist/protocol/Structure.js b/dist/protocol/Structure.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/protocol/Structure.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/StructureField.d.ts b/dist/protocol/StructureField.d.ts
deleted file mode 100644
index ecb2c2e..0000000
--- a/dist/protocol/StructureField.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-///
-import Value from "./Value";
-declare type StructureField = {
- type: NumberConstructor | typeof Buffer | StringConstructor;
- enum?: any;
- signedness?: "Signed" | "Unsigned";
- encoding?: "hex";
- countFieldName?: string;
- count?: number;
- sizeFieldName?: string;
- size?: number;
- defaultValue?: Value;
-};
-export default StructureField;
diff --git a/dist/protocol/StructureField.js b/dist/protocol/StructureField.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/protocol/StructureField.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/Value.d.ts b/dist/protocol/Value.d.ts
deleted file mode 100644
index 3296edf..0000000
--- a/dist/protocol/Value.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-///
-declare type Value = number | bigint | string | Buffer | Value[];
-export default Value;
diff --git a/dist/protocol/Value.js b/dist/protocol/Value.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/protocol/Value.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/models/ChangeEntry.d.ts b/dist/protocol/models/ChangeEntry.d.ts
deleted file mode 100644
index bc2229e..0000000
--- a/dist/protocol/models/ChangeEntry.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import FileAction from "../smb2/FileAction";
-export default interface ChangeEntry {
- action: FileAction;
- actionName: string;
- filename: string;
-}
diff --git a/dist/protocol/models/ChangeEntry.js b/dist/protocol/models/ChangeEntry.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/protocol/models/ChangeEntry.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/models/DirectoryEntry.d.ts b/dist/protocol/models/DirectoryEntry.d.ts
deleted file mode 100644
index 6a2cd3e..0000000
--- a/dist/protocol/models/DirectoryEntry.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-export default interface DirectoryEntry {
- index: number;
- type: "File" | "Directory";
- creationTime: Date;
- lastAccessTime: Date;
- lastWriteTime: Date;
- changeTime: Date;
- fileSize: BigInt;
- allocationSize: BigInt;
- shortFilename?: string;
- eaSize: number;
- fileId: string;
- filename: string;
- fileAttributes: string[];
-}
diff --git a/dist/protocol/models/DirectoryEntry.js b/dist/protocol/models/DirectoryEntry.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/protocol/models/DirectoryEntry.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/protocol/ntlm/NegotiateFlag.d.ts b/dist/protocol/ntlm/NegotiateFlag.d.ts
deleted file mode 100644
index bf567c3..0000000
--- a/dist/protocol/ntlm/NegotiateFlag.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-declare enum NegotiateFlag {
- UnicodeEncoding = 1,
- OemEncoding = 2,
- TargetNameSupplied = 4,
- Sign = 16,
- Seal = 32,
- Diagram = 64,
- LanManagerSessionKey = 128,
- NTLMSessionSecurity = 512,
- Anonymous = 2048,
- DomainNameSupplied = 4096,
- WorkstationNameSupplied = 8192,
- AlwaysSign = 32768,
- TargetTypeDomain = 65536,
- TargetTypeServer = 131072,
- ExtendedSessionSecurity = 524288,
- Identify = 1048576,
- RequestNonNtSessionKey = 4194304,
- TargetInfo = 8388608,
- Version = 33554432,
- Use128BitEncryption = 536870912,
- KeyExchange = 1073741824,
- Use56BitEncryption = -2147483648
-}
-export default NegotiateFlag;
diff --git a/dist/protocol/ntlm/NegotiateFlag.js b/dist/protocol/ntlm/NegotiateFlag.js
deleted file mode 100644
index 9eb8066..0000000
--- a/dist/protocol/ntlm/NegotiateFlag.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var NegotiateFlag;
-(function (NegotiateFlag) {
- NegotiateFlag[NegotiateFlag["UnicodeEncoding"] = 1] = "UnicodeEncoding";
- NegotiateFlag[NegotiateFlag["OemEncoding"] = 2] = "OemEncoding";
- NegotiateFlag[NegotiateFlag["TargetNameSupplied"] = 4] = "TargetNameSupplied";
- NegotiateFlag[NegotiateFlag["Sign"] = 16] = "Sign";
- NegotiateFlag[NegotiateFlag["Seal"] = 32] = "Seal";
- NegotiateFlag[NegotiateFlag["Diagram"] = 64] = "Diagram";
- NegotiateFlag[NegotiateFlag["LanManagerSessionKey"] = 128] = "LanManagerSessionKey";
- NegotiateFlag[NegotiateFlag["NTLMSessionSecurity"] = 512] = "NTLMSessionSecurity";
- NegotiateFlag[NegotiateFlag["Anonymous"] = 2048] = "Anonymous";
- NegotiateFlag[NegotiateFlag["DomainNameSupplied"] = 4096] = "DomainNameSupplied";
- NegotiateFlag[NegotiateFlag["WorkstationNameSupplied"] = 8192] = "WorkstationNameSupplied";
- NegotiateFlag[NegotiateFlag["AlwaysSign"] = 32768] = "AlwaysSign";
- NegotiateFlag[NegotiateFlag["TargetTypeDomain"] = 65536] = "TargetTypeDomain";
- NegotiateFlag[NegotiateFlag["TargetTypeServer"] = 131072] = "TargetTypeServer";
- NegotiateFlag[NegotiateFlag["ExtendedSessionSecurity"] = 524288] = "ExtendedSessionSecurity";
- NegotiateFlag[NegotiateFlag["Identify"] = 1048576] = "Identify";
- NegotiateFlag[NegotiateFlag["RequestNonNtSessionKey"] = 4194304] = "RequestNonNtSessionKey";
- NegotiateFlag[NegotiateFlag["TargetInfo"] = 8388608] = "TargetInfo";
- NegotiateFlag[NegotiateFlag["Version"] = 33554432] = "Version";
- NegotiateFlag[NegotiateFlag["Use128BitEncryption"] = 536870912] = "Use128BitEncryption";
- NegotiateFlag[NegotiateFlag["KeyExchange"] = 1073741824] = "KeyExchange";
- NegotiateFlag[NegotiateFlag["Use56BitEncryption"] = -2147483648] = "Use56BitEncryption";
-})(NegotiateFlag || (NegotiateFlag = {}));
-exports.default = NegotiateFlag;
diff --git a/dist/protocol/ntlm/util.d.ts b/dist/protocol/ntlm/util.d.ts
deleted file mode 100644
index c3cc2a6..0000000
--- a/dist/protocol/ntlm/util.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-///
-export declare const encodeNegotiationMessage: (hostname: string, domain: string) => Buffer;
-export declare const decodeNegotiationMessage: (buffer: Buffer) => {
- negotiateFlags: number;
- domain: string;
- hostname: string;
-};
-export declare const encodeChallengeMessage: (negotiateFlags: number) => Buffer;
-export declare const decodeChallengeMessage: (buffer: Buffer) => Buffer;
-export declare const encodeAuthenticationMessage: (username: string, hostname: string, domain: string, nonce: Buffer, password: string) => Buffer;
-export declare const generateServerChallenge: () => Buffer;
diff --git a/dist/protocol/ntlm/util.js b/dist/protocol/ntlm/util.js
deleted file mode 100644
index ebc4693..0000000
--- a/dist/protocol/ntlm/util.js
+++ /dev/null
@@ -1,353 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.generateServerChallenge = exports.encodeAuthenticationMessage = exports.decodeChallengeMessage = exports.encodeChallengeMessage = exports.decodeNegotiationMessage = exports.encodeNegotiationMessage = void 0;
-const crypto_1 = __importDefault(require("crypto"));
-const des_js_1 = __importDefault(require("des.js"));
-const js_md4_1 = __importDefault(require("js-md4"));
-const NegotiateFlag_1 = __importDefault(require("./NegotiateFlag"));
-exports.encodeNegotiationMessage = (hostname, domain) => {
- hostname = hostname.toUpperCase();
- domain = domain.toUpperCase();
- const hostnameLength = Buffer.byteLength(hostname, 'ascii');
- const domainLength = Buffer.byteLength(domain, 'ascii');
- let offset = 0;
- const buffer = Buffer.alloc(32 + hostnameLength + domainLength);
- buffer.write('NTLMSSP', offset, 7, 'ascii');
- offset += 7;
- buffer.writeUInt8(0, offset);
- offset += 1;
- buffer.writeUInt32LE(1, offset);
- offset += 4;
- const negotiateFlags = NegotiateFlag_1.default.UnicodeEncoding |
- NegotiateFlag_1.default.NTLMSessionSecurity |
- NegotiateFlag_1.default.AlwaysSign;
- buffer.writeUInt32LE(negotiateFlags, offset);
- offset += 4;
- buffer.writeUInt16LE(domainLength, offset);
- offset += 2;
- buffer.writeUInt16LE(domainLength, offset);
- offset += 2;
- const domainOffset = 0x20 + hostnameLength;
- buffer.writeUInt32LE(domainOffset, offset);
- offset += 4;
- buffer.writeUInt16LE(hostnameLength, offset);
- offset += 2;
- buffer.writeUInt16LE(hostnameLength, offset);
- offset += 2;
- buffer.writeUInt32LE(0x20, offset);
- offset += 4;
- buffer.write(hostname, 0x20, hostnameLength, 'ascii');
- buffer.write(domain, domainOffset, domainLength, 'ascii');
- return buffer;
-};
-exports.decodeNegotiationMessage = (buffer) => {
- let offset = 0;
- const protocol = buffer.slice(0, 7).toString('ascii');
- if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
- throw new Error('ntlmssp_header_not_found');
- offset += 8;
- const type = buffer.readUInt32LE(offset);
- if (type !== 0x01)
- throw new Error('ntlmssp_type_is_not_one');
- offset += 4;
- const negotiateFlags = buffer.readUInt32LE(offset);
- offset += 4;
- const domainLength = buffer.readUInt16LE(offset);
- offset += 2;
- const domainMaxLength = buffer.readUInt16LE(offset);
- offset += 2;
- const domainOffset = buffer.readUInt32LE(offset);
- offset += 4;
- const hostnameLength = buffer.readUInt16LE(offset);
- offset += 2;
- const hostnameMaxLength = buffer.readUInt16LE(offset);
- offset += 2;
- const hostnameOffset = buffer.readUInt32LE(offset);
- offset += 4;
- const domain = buffer
- .slice(domainOffset, domainOffset + domainLength)
- .toString('ascii');
- const hostname = buffer
- .slice(hostnameOffset, hostnameOffset + hostnameLength)
- .toString('ascii');
- return {
- negotiateFlags,
- domain,
- hostname
- };
-};
-exports.encodeChallengeMessage = (negotiateFlags) => {
- let offset = 0;
- const buffer = Buffer.alloc(64);
- buffer.write('NTLMSSP', offset, 7, 'ascii');
- offset += 7;
- buffer.writeUInt8(0, offset);
- offset += 1;
- buffer.writeUInt32LE(2, offset);
- offset += 4;
- buffer.writeUInt16LE(0, offset);
- offset += 2;
- buffer.writeUInt16LE(0, offset);
- offset += 2;
- buffer.writeUInt32LE(0, offset);
- offset += 4;
- buffer.writeUInt32LE(negotiateFlags, offset);
- offset += 4;
- exports.generateServerChallenge().copy(buffer, offset);
- offset += 8;
- buffer.fill(0, offset, offset + 8);
- offset += 8;
- return buffer;
-};
-exports.decodeChallengeMessage = (buffer) => {
- let offset = 0;
- const protocol = buffer.slice(0, 7).toString('ascii');
- if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
- throw new Error('ntlmssp_header_not_found');
- offset += 8;
- const type = buffer.readUInt32LE(offset);
- if (type !== 0x02)
- throw new Error('ntlmssp_type_is_not_two');
- offset += 4;
- const targetNameLength = buffer.readUInt16LE(offset);
- offset += 2;
- const targetNameMaxLength = buffer.readUInt16LE(offset);
- offset += 2;
- const targetNameOffset = buffer.readUInt32LE(offset);
- offset += 4;
- const negotiateFlags = buffer.readUInt32LE(offset);
- offset += 4;
- const serverChallenge = buffer.slice(offset, offset + 8);
- offset += 8;
- offset += 8; // Reserved
- return serverChallenge;
-};
-exports.encodeAuthenticationMessage = (username, hostname, domain, nonce, password) => {
- hostname = hostname.toUpperCase();
- domain = domain.toUpperCase();
- const lmHash = Buffer.alloc(21);
- createLmHash(password).copy(lmHash);
- lmHash.fill(0x00, 16);
- const ntHash = Buffer.alloc(21);
- createNtHash(password).copy(ntHash);
- ntHash.fill(0x00, 16);
- const lmResponse = createResponse(lmHash, nonce);
- const ntResponse = createResponse(ntHash, nonce);
- const usernameLength = Buffer.byteLength(username, 'ucs2');
- const hostnameLength = Buffer.byteLength(hostname, 'ucs2');
- const domainLength = Buffer.byteLength(domain, 'ucs2');
- const lmResponseLength = 0x18;
- const ntResponseLength = 0x18;
- const domainOffset = 0x40;
- const usernameOffset = domainOffset + domainLength;
- const hostnameOffset = usernameOffset + usernameLength;
- const lmResponseOffset = hostnameOffset + hostnameLength;
- const ntResponseOffset = lmResponseOffset + lmResponseLength;
- let offset = 0;
- const messageLength = 64 +
- domainLength +
- usernameLength +
- hostnameLength +
- lmResponseLength +
- ntResponseLength;
- const buffer = Buffer.alloc(messageLength);
- buffer.write('NTLMSSP', offset, 7, 'ascii'); // byte protocol[8];
- offset += 7;
- buffer.writeUInt8(0, offset);
- offset++;
- buffer.writeUInt8(0x03, offset); // byte type;
- offset++;
- buffer.fill(0x00, offset, offset + 3); // byte zero[3];
- offset += 3;
- buffer.writeUInt16LE(lmResponseLength, offset); // short lm_resp_len;
- offset += 2;
- buffer.writeUInt16LE(lmResponseLength, offset); // short lm_resp_len;
- offset += 2;
- buffer.writeUInt16LE(lmResponseOffset, offset); // short lm_resp_off;
- offset += 2;
- buffer.fill(0x00, offset, offset + 2); // byte zero[2];
- offset += 2;
- buffer.writeUInt16LE(ntResponseLength, offset); // short nt_resp_len;
- offset += 2;
- buffer.writeUInt16LE(ntResponseLength, offset); // short nt_resp_len;
- offset += 2;
- buffer.writeUInt16LE(ntResponseOffset, offset); // short nt_resp_off;
- offset += 2;
- buffer.fill(0x00, offset, offset + 2); // byte zero[2];
- offset += 2;
- buffer.writeUInt16LE(domainLength, offset); // short dom_len;
- offset += 2;
- buffer.writeUInt16LE(domainLength, offset); // short dom_len;
- offset += 2;
- buffer.writeUInt16LE(domainOffset, offset); // short dom_off;
- offset += 2;
- buffer.fill(0x00, offset, offset + 2); // byte zero[2];
- offset += 2;
- buffer.writeUInt16LE(usernameLength, offset); // short user_len;
- offset += 2;
- buffer.writeUInt16LE(usernameLength, offset); // short user_len;
- offset += 2;
- buffer.writeUInt16LE(usernameOffset, offset); // short user_off;
- offset += 2;
- buffer.fill(0x00, offset, offset + 2); // byte zero[2];
- offset += 2;
- buffer.writeUInt16LE(hostnameLength, offset); // short host_len;
- offset += 2;
- buffer.writeUInt16LE(hostnameLength, offset); // short host_len;
- offset += 2;
- buffer.writeUInt16LE(hostnameOffset, offset); // short host_off;
- offset += 2;
- buffer.fill(0x00, offset, offset + 6); // byte zero[6];
- offset += 6;
- buffer.writeUInt16LE(messageLength, offset); // short msg_len;
- offset += 2;
- buffer.fill(0x00, offset, offset + 2); // byte zero[2];
- offset += 2;
- const negotiateFlags = NegotiateFlag_1.default.UnicodeEncoding |
- NegotiateFlag_1.default.NTLMSessionSecurity |
- NegotiateFlag_1.default.AlwaysSign;
- buffer.writeUInt32LE(negotiateFlags, offset);
- offset += 4;
- buffer.write(domain, domainOffset, domainLength, 'ucs2');
- buffer.write(username, usernameOffset, usernameLength, 'ucs2');
- buffer.write(hostname, hostnameOffset, hostnameLength, 'ucs2');
- lmResponse.copy(buffer, lmResponseOffset, 0, lmResponseLength);
- ntResponse.copy(buffer, ntResponseOffset, 0, ntResponseLength);
- return buffer;
-};
-exports.generateServerChallenge = () => {
- return crypto_1.default.randomBytes(8);
-};
-const bytes2binaryArray = (buf) => {
- const hex2binary = {
- 0: [0, 0, 0, 0],
- 1: [0, 0, 0, 1],
- 2: [0, 0, 1, 0],
- 3: [0, 0, 1, 1],
- 4: [0, 1, 0, 0],
- 5: [0, 1, 0, 1],
- 6: [0, 1, 1, 0],
- 7: [0, 1, 1, 1],
- 8: [1, 0, 0, 0],
- 9: [1, 0, 0, 1],
- A: [1, 0, 1, 0],
- B: [1, 0, 1, 1],
- C: [1, 1, 0, 0],
- D: [1, 1, 0, 1],
- E: [1, 1, 1, 0],
- F: [1, 1, 1, 1]
- };
- const hexString = buf.toString('hex').toUpperCase();
- let array = [];
- for (let i = 0; i < hexString.length; i++) {
- const hexchar = hexString.charAt(i);
- array = array.concat(hex2binary[hexchar]);
- }
- return array;
-};
-const binaryArray2bytes = (array) => {
- const binary2hex = {
- '0000': 0,
- '0001': 1,
- '0010': 2,
- '0011': 3,
- '0100': 4,
- '0101': 5,
- '0110': 6,
- '0111': 7,
- '1000': 8,
- '1001': 9,
- '1010': 'A',
- '1011': 'B',
- '1100': 'C',
- '1101': 'D',
- '1110': 'E',
- '1111': 'F'
- };
- const bufArray = [];
- for (let i = 0; i < array.length; i += 8) {
- if (i + 7 > array.length)
- break;
- const binString1 = '' + array[i] + '' + array[i + 1] + '' + array[i + 2] + '' + array[i + 3];
- const binString2 = '' +
- array[i + 4] +
- '' +
- array[i + 5] +
- '' +
- array[i + 6] +
- '' +
- array[i + 7];
- const hexchar1 = binary2hex[binString1];
- const hexchar2 = binary2hex[binString2];
- const buf = Buffer.from(hexchar1 + '' + hexchar2, 'hex');
- bufArray.push(buf);
- }
- return Buffer.concat(bufArray);
-};
-const insertZerosEvery7Bits = (buf) => {
- const binaryArray = bytes2binaryArray(buf);
- const newBinaryArray = [];
- for (let i = 0; i < binaryArray.length; i++) {
- newBinaryArray.push(binaryArray[i]);
- if ((i + 1) % 7 === 0) {
- newBinaryArray.push(0);
- }
- }
- return binaryArray2bytes(newBinaryArray);
-};
-const createLmHash = (password) => {
- // fix the password length to 14 bytes
- password = password.toUpperCase();
- const passwordBytes = Buffer.from(password, 'ascii');
- const passwordBytesPadded = Buffer.alloc(14);
- passwordBytesPadded.fill('\0');
- let sourceEnd = 14;
- if (passwordBytes.length < 14)
- sourceEnd = passwordBytes.length;
- passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd);
- // split into 2 parts of 7 bytes:
- const firstPart = passwordBytesPadded.slice(0, 7);
- const secondPart = passwordBytesPadded.slice(7);
- function encrypt(buf) {
- const key = insertZerosEvery7Bits(buf);
- const des = des_js_1.default.DES.create({ type: 'encrypt', key: key });
- const magicKey = Buffer.from('KGS!@#$%', 'ascii'); // page 57 in [MS-NLMP]
- const encrypted = des.update(magicKey);
- return Buffer.from(encrypted);
- }
- const firstPartEncrypted = encrypt(firstPart);
- const secondPartEncrypted = encrypt(secondPart);
- return Buffer.concat([firstPartEncrypted, secondPartEncrypted]);
-};
-const createNtHash = (password) => {
- const buf = Buffer.from(password, 'utf16le');
- const md4 = js_md4_1.default.create();
- md4.update(buf);
- return Buffer.from(md4.digest());
-};
-const createResponse = (hash, nonce) => {
- // padding with zeros to make the hash 21 bytes long
- const passHashPadded = Buffer.alloc(21);
- passHashPadded.fill('\0');
- hash.copy(passHashPadded, 0, 0, hash.length);
- const resArray = [];
- const des1 = des_js_1.default.DES.create({
- type: 'encrypt',
- key: insertZerosEvery7Bits(passHashPadded.slice(0, 7))
- });
- resArray.push(Buffer.from(des1.update(nonce.slice(0, 8))));
- const des2 = des_js_1.default.DES.create({
- type: 'encrypt',
- key: insertZerosEvery7Bits(passHashPadded.slice(7, 14))
- });
- resArray.push(Buffer.from(des2.update(nonce.slice(0, 8))));
- const des3 = des_js_1.default.DES.create({
- type: 'encrypt',
- key: insertZerosEvery7Bits(passHashPadded.slice(14, 21))
- });
- resArray.push(Buffer.from(des3.update(nonce.slice(0, 8))));
- return Buffer.concat(resArray);
-};
diff --git a/dist/protocol/protocolIds.d.ts b/dist/protocol/protocolIds.d.ts
deleted file mode 100644
index d7bcce3..0000000
--- a/dist/protocol/protocolIds.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export declare const smb: string;
-export declare const smb2: string;
diff --git a/dist/protocol/protocolIds.js b/dist/protocol/protocolIds.js
deleted file mode 100644
index cdef815..0000000
--- a/dist/protocol/protocolIds.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.smb2 = exports.smb = void 0;
-exports.smb = Buffer
- .from([
- 0xff,
- "S".charCodeAt(0),
- "M".charCodeAt(0),
- "B".charCodeAt(0)
-])
- .toString("hex");
-exports.smb2 = Buffer
- .from([
- 0xfe,
- "S".charCodeAt(0),
- "M".charCodeAt(0),
- "B".charCodeAt(0)
-])
- .toString("hex");
diff --git a/dist/protocol/smb/Header.d.ts b/dist/protocol/smb/Header.d.ts
deleted file mode 100644
index 7f7bd85..0000000
--- a/dist/protocol/smb/Header.d.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import PacketType from "./PacketType";
-import StructureField from "../StructureField";
-export declare const headerSize = 32;
-export default interface Header {
- protocolId?: string;
- type?: PacketType;
- status?: number;
- flags?: number;
- flags2?: number;
- processIdHigh?: number;
- securityFeatures?: number;
- securitySignature?: number;
- key?: number;
- connectionId?: number;
- sequenceNumber?: number;
- reserved?: number;
- treeId?: number;
- processIdLow?: number;
- userId?: number;
- multiplexId?: number;
-}
-export declare type HeaderName = ("protocolId" | "type" | "status" | "flags" | "flags2" | "processIdHigh" | "securityFeatures" | "securitySignature" | "key" | "connectionId" | "sequenceNumber" | "reserved" | "treeId" | "processIdLow" | "userId" | "multiplexId");
-export declare type HeaderStructure = {
- [key in HeaderName]?: StructureField;
-};
-export declare const headerStructure: HeaderStructure;
diff --git a/dist/protocol/smb/Header.js b/dist/protocol/smb/Header.js
deleted file mode 100644
index bf4b05a..0000000
--- a/dist/protocol/smb/Header.js
+++ /dev/null
@@ -1,68 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.headerStructure = exports.headerSize = void 0;
-const Packet_1 = require("../Packet");
-exports.headerSize = 32;
-exports.headerStructure = {
- protocolId: Packet_1.protocolIdStructureField,
- type: {
- type: Number,
- size: 1
- },
- status: {
- type: Number,
- size: 4
- },
- flags: {
- type: Number,
- size: 1
- },
- flags2: {
- type: Number,
- size: 2
- },
- processIdHigh: {
- type: Number,
- size: 2
- },
- securityFeatures: {
- type: Number,
- size: 8
- },
- securitySignature: {
- type: Number,
- size: 8
- },
- key: {
- type: Number,
- size: 4
- },
- connectionId: {
- type: Number,
- size: 2
- },
- sequenceNumber: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 2
- },
- treeId: {
- type: Number,
- size: 2
- },
- processIdLow: {
- type: Number,
- size: 2
- },
- userId: {
- type: Number,
- size: 2
- },
- multiplexId: {
- type: Number,
- size: 2
- }
-};
diff --git a/dist/protocol/smb/Packet.d.ts b/dist/protocol/smb/Packet.d.ts
deleted file mode 100644
index 36fe198..0000000
--- a/dist/protocol/smb/Packet.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-///
-import Header from "./Header";
-export default class Packet {
- static parse(buffer: Buffer): {
- header: Header;
- body: any;
- };
- static parseHeader(buffer: Buffer): {
- header: Header;
- bodyBuffer: Buffer;
- };
- static parseList(buffer: Buffer): any[];
-}
diff --git a/dist/protocol/smb/Packet.js b/dist/protocol/smb/Packet.js
deleted file mode 100644
index f7edc25..0000000
--- a/dist/protocol/smb/Packet.js
+++ /dev/null
@@ -1,80 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const structureUtil = __importStar(require("../structureUtil"));
-const Header_1 = require("./Header");
-class Packet {
- static parse(buffer) {
- const { header, bodyBuffer } = Packet.parseHeader(buffer);
- let offset = 0;
- const wordCount = bodyBuffer.readInt8(offset);
- offset += 1;
- const dataCount = bodyBuffer.readUInt16LE(offset);
- offset += 2;
- const dataBuffer = bodyBuffer.slice(offset);
- const dialects = Packet.parseList(dataBuffer); // TODO: export into Negotiate packet
- const body = {
- dialects
- };
- return {
- header,
- body
- };
- }
- static parseHeader(buffer) {
- const header = structureUtil.parseStructure(buffer, Header_1.headerStructure);
- const bodyBuffer = buffer.slice(Header_1.headerSize);
- return {
- header,
- bodyBuffer
- };
- }
- static parseList(buffer) {
- let offset = 0;
- let currentBytes = [];
- let terminated = true;
- let format = 0;
- const list = [];
- while (offset < buffer.length) {
- const byte = buffer.readInt8(offset);
- if (terminated) {
- format = byte;
- offset++;
- terminated = false;
- continue;
- }
- if (byte === 0) {
- if (format === 2) {
- const text = Buffer.from(currentBytes).toString("ascii");
- list.push(text);
- }
- currentBytes = [];
- terminated = true;
- }
- else {
- currentBytes.push(byte);
- }
- offset++;
- }
- return list;
- }
-}
-exports.default = Packet;
diff --git a/dist/protocol/smb/PacketType.d.ts b/dist/protocol/smb/PacketType.d.ts
deleted file mode 100644
index 877a4b6..0000000
--- a/dist/protocol/smb/PacketType.d.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-declare enum PacketType {
- CreateDirectory = 0,
- DeleteDirectory = 1,
- Open = 2,
- Create = 3,
- Close = 4,
- Flush = 5,
- Delete = 6,
- Rename = 7,
- QueryInformation = 8,
- SetInformation = 9,
- Read = 10,
- Write = 11,
- LockByteRange = 12,
- UnlockByteRange = 13,
- CreateTemporary = 14,
- CreateNew = 15,
- CheckDirectory = 16,
- ProcessExit = 17,
- Seek = 18,
- LockAndRead = 19,
- WriteAndUnlock = 20,
- ReadRaw = 26,
- ReadMultiplex = 27,
- ReadMultiplexSecondary = 28,
- WriteRaw = 29,
- WriteMultiplex = 30,
- WriteMultiplexSecondary = 31,
- WriteComplete = 32,
- QueryServer = 33,
- SetInformation2 = 34,
- QueryInformation2 = 35,
- LockingAndX = 36,
- Transaction = 37,
- TransactionSecondary = 38,
- InputOutputControl = 39,
- InputOutputControlSecondary = 40,
- Copy = 41,
- Move = 42,
- Echo = 43,
- WriteAndClose = 44,
- OpenAndX = 45,
- ReadAndX = 46,
- WriteAndX = 47,
- NewFileSize = 48,
- CloseFileAndDisconnectTree = 49,
- Transaction2 = 50,
- Transaction2Secondary = 51,
- FindClose2 = 52,
- FindNotifyClose = 53,
- TreeConnect = 112,
- TreeDisconnect = 113,
- Negotiate = 114,
- SessionSetup = 115
-}
-export default PacketType;
diff --git a/dist/protocol/smb/PacketType.js b/dist/protocol/smb/PacketType.js
deleted file mode 100644
index 45bfb13..0000000
--- a/dist/protocol/smb/PacketType.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var PacketType;
-(function (PacketType) {
- PacketType[PacketType["CreateDirectory"] = 0] = "CreateDirectory";
- PacketType[PacketType["DeleteDirectory"] = 1] = "DeleteDirectory";
- PacketType[PacketType["Open"] = 2] = "Open";
- PacketType[PacketType["Create"] = 3] = "Create";
- PacketType[PacketType["Close"] = 4] = "Close";
- PacketType[PacketType["Flush"] = 5] = "Flush";
- PacketType[PacketType["Delete"] = 6] = "Delete";
- PacketType[PacketType["Rename"] = 7] = "Rename";
- PacketType[PacketType["QueryInformation"] = 8] = "QueryInformation";
- PacketType[PacketType["SetInformation"] = 9] = "SetInformation";
- PacketType[PacketType["Read"] = 10] = "Read";
- PacketType[PacketType["Write"] = 11] = "Write";
- PacketType[PacketType["LockByteRange"] = 12] = "LockByteRange";
- PacketType[PacketType["UnlockByteRange"] = 13] = "UnlockByteRange";
- PacketType[PacketType["CreateTemporary"] = 14] = "CreateTemporary";
- PacketType[PacketType["CreateNew"] = 15] = "CreateNew";
- PacketType[PacketType["CheckDirectory"] = 16] = "CheckDirectory";
- PacketType[PacketType["ProcessExit"] = 17] = "ProcessExit";
- PacketType[PacketType["Seek"] = 18] = "Seek";
- PacketType[PacketType["LockAndRead"] = 19] = "LockAndRead";
- PacketType[PacketType["WriteAndUnlock"] = 20] = "WriteAndUnlock";
- PacketType[PacketType["ReadRaw"] = 26] = "ReadRaw";
- PacketType[PacketType["ReadMultiplex"] = 27] = "ReadMultiplex";
- PacketType[PacketType["ReadMultiplexSecondary"] = 28] = "ReadMultiplexSecondary";
- PacketType[PacketType["WriteRaw"] = 29] = "WriteRaw";
- PacketType[PacketType["WriteMultiplex"] = 30] = "WriteMultiplex";
- PacketType[PacketType["WriteMultiplexSecondary"] = 31] = "WriteMultiplexSecondary";
- PacketType[PacketType["WriteComplete"] = 32] = "WriteComplete";
- PacketType[PacketType["QueryServer"] = 33] = "QueryServer";
- PacketType[PacketType["SetInformation2"] = 34] = "SetInformation2";
- PacketType[PacketType["QueryInformation2"] = 35] = "QueryInformation2";
- PacketType[PacketType["LockingAndX"] = 36] = "LockingAndX";
- PacketType[PacketType["Transaction"] = 37] = "Transaction";
- PacketType[PacketType["TransactionSecondary"] = 38] = "TransactionSecondary";
- PacketType[PacketType["InputOutputControl"] = 39] = "InputOutputControl";
- PacketType[PacketType["InputOutputControlSecondary"] = 40] = "InputOutputControlSecondary";
- PacketType[PacketType["Copy"] = 41] = "Copy";
- PacketType[PacketType["Move"] = 42] = "Move";
- PacketType[PacketType["Echo"] = 43] = "Echo";
- PacketType[PacketType["WriteAndClose"] = 44] = "WriteAndClose";
- PacketType[PacketType["OpenAndX"] = 45] = "OpenAndX";
- PacketType[PacketType["ReadAndX"] = 46] = "ReadAndX";
- PacketType[PacketType["WriteAndX"] = 47] = "WriteAndX";
- PacketType[PacketType["NewFileSize"] = 48] = "NewFileSize";
- PacketType[PacketType["CloseFileAndDisconnectTree"] = 49] = "CloseFileAndDisconnectTree";
- PacketType[PacketType["Transaction2"] = 50] = "Transaction2";
- PacketType[PacketType["Transaction2Secondary"] = 51] = "Transaction2Secondary";
- PacketType[PacketType["FindClose2"] = 52] = "FindClose2";
- PacketType[PacketType["FindNotifyClose"] = 53] = "FindNotifyClose";
- PacketType[PacketType["TreeConnect"] = 112] = "TreeConnect";
- PacketType[PacketType["TreeDisconnect"] = 113] = "TreeDisconnect";
- PacketType[PacketType["Negotiate"] = 114] = "Negotiate";
- PacketType[PacketType["SessionSetup"] = 115] = "SessionSetup";
-})(PacketType || (PacketType = {}));
-;
-exports.default = PacketType;
diff --git a/dist/protocol/smb/Request.d.ts b/dist/protocol/smb/Request.d.ts
deleted file mode 100644
index 0aac943..0000000
--- a/dist/protocol/smb/Request.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-///
-import Header from "./Header";
-import ProtocolRequest from "../Request";
-export default class Request extends ProtocolRequest {
- header: Header;
- static parse(buffer: Buffer): Request;
- serialize(): Buffer;
-}
diff --git a/dist/protocol/smb/Request.js b/dist/protocol/smb/Request.js
deleted file mode 100644
index 648bb67..0000000
--- a/dist/protocol/smb/Request.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Packet_1 = __importDefault(require("./Packet"));
-const Request_1 = __importDefault(require("../Request"));
-class Request extends Request_1.default {
- static parse(buffer) {
- const { header, body } = Packet_1.default.parse(buffer);
- return new Request(header, body);
- }
- serialize() {
- return Buffer.from([]);
- // return Packet.serialize(this.header, this.body);
- }
-}
-exports.default = Request;
diff --git a/dist/protocol/smb/Response.d.ts b/dist/protocol/smb/Response.d.ts
deleted file mode 100644
index 7e68390..0000000
--- a/dist/protocol/smb/Response.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-///
-import Header from "./Header";
-import ProtocolResponse from "../Response";
-export default class Response extends ProtocolResponse {
- header: Header;
- static parse(buffer: Buffer): Response;
- serialize(): Buffer;
-}
diff --git a/dist/protocol/smb/Response.js b/dist/protocol/smb/Response.js
deleted file mode 100644
index 9b9438a..0000000
--- a/dist/protocol/smb/Response.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Packet_1 = __importDefault(require("./Packet"));
-const Response_1 = __importDefault(require("../Response"));
-class Response extends Response_1.default {
- static parse(buffer) {
- const { header, body } = Packet_1.default.parse(buffer);
- return new Response(header, body);
- }
- serialize() {
- return Buffer.from([]);
- // return Packet.serialize(this.header, this.body);
- }
-}
-exports.default = Response;
diff --git a/dist/protocol/smb2/Capability.d.ts b/dist/protocol/smb2/Capability.d.ts
deleted file mode 100644
index 6b60043..0000000
--- a/dist/protocol/smb2/Capability.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-declare enum Capability {
- DistributedFileSystem = 1,
- MultiCreditSupport = 4
-}
-export default Capability;
diff --git a/dist/protocol/smb2/Capability.js b/dist/protocol/smb2/Capability.js
deleted file mode 100644
index 4b394f0..0000000
--- a/dist/protocol/smb2/Capability.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Capability;
-(function (Capability) {
- Capability[Capability["DistributedFileSystem"] = 1] = "DistributedFileSystem";
- Capability[Capability["MultiCreditSupport"] = 4] = "MultiCreditSupport";
-})(Capability || (Capability = {}));
-exports.default = Capability;
diff --git a/dist/protocol/smb2/CreateDispositionType.d.ts b/dist/protocol/smb2/CreateDispositionType.d.ts
deleted file mode 100644
index c30fcc1..0000000
--- a/dist/protocol/smb2/CreateDispositionType.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-declare enum CreateDispositionType {
- Supersede = 0,
- Open = 1,
- Create = 2,
- OpenIf = 3,
- Overwrite = 4,
- OverwriteIf = 5
-}
-export default CreateDispositionType;
diff --git a/dist/protocol/smb2/CreateDispositionType.js b/dist/protocol/smb2/CreateDispositionType.js
deleted file mode 100644
index 55f9a2a..0000000
--- a/dist/protocol/smb2/CreateDispositionType.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var CreateDispositionType;
-(function (CreateDispositionType) {
- CreateDispositionType[CreateDispositionType["Supersede"] = 0] = "Supersede";
- CreateDispositionType[CreateDispositionType["Open"] = 1] = "Open";
- CreateDispositionType[CreateDispositionType["Create"] = 2] = "Create";
- CreateDispositionType[CreateDispositionType["OpenIf"] = 3] = "OpenIf";
- CreateDispositionType[CreateDispositionType["Overwrite"] = 4] = "Overwrite";
- CreateDispositionType[CreateDispositionType["OverwriteIf"] = 5] = "OverwriteIf";
-})(CreateDispositionType || (CreateDispositionType = {}));
-exports.default = CreateDispositionType;
diff --git a/dist/protocol/smb2/Dialect.d.ts b/dist/protocol/smb2/Dialect.d.ts
deleted file mode 100644
index 2016190..0000000
--- a/dist/protocol/smb2/Dialect.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-declare enum Dialect {
- Smb202 = 514,
- Smb210 = 528,
- Smb2xx = 767,
- Smb300 = 768,
- Smb302 = 770,
- Smb311 = 785,
- Smb3xx = 1023
-}
-export default Dialect;
diff --git a/dist/protocol/smb2/Dialect.js b/dist/protocol/smb2/Dialect.js
deleted file mode 100644
index 2d2cd09..0000000
--- a/dist/protocol/smb2/Dialect.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Dialect;
-(function (Dialect) {
- Dialect[Dialect["Smb202"] = 514] = "Smb202";
- Dialect[Dialect["Smb210"] = 528] = "Smb210";
- Dialect[Dialect["Smb2xx"] = 767] = "Smb2xx";
- Dialect[Dialect["Smb300"] = 768] = "Smb300";
- Dialect[Dialect["Smb302"] = 770] = "Smb302";
- Dialect[Dialect["Smb311"] = 785] = "Smb311";
- Dialect[Dialect["Smb3xx"] = 1023] = "Smb3xx";
-})(Dialect || (Dialect = {}));
-exports.default = Dialect;
diff --git a/dist/protocol/smb2/DirectoryAccess.d.ts b/dist/protocol/smb2/DirectoryAccess.d.ts
deleted file mode 100644
index 01bcaca..0000000
--- a/dist/protocol/smb2/DirectoryAccess.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-declare enum DirectoryAccess {
- ListDirectory = 1,
- AddFile = 2,
- AddSubDirectory = 4,
- ReadEa = 8,
- WriteEa = 16,
- Traverse = 32,
- DeleteChild = 64,
- ReadAttributes = 128,
- WriteAttributes = 256,
- Delete = 65536,
- ReadControl = 131072,
- WriteDiscretionaryAccessControl = 262144,
- WriteOwner = 524288,
- Synchronize = 1048576,
- AccessSystemSecurity = 16777216,
- MaximumAllowed = 33554432,
- GenericAll = 268435456,
- GenericExecute = 536870912,
- GenericWrite = 1073741824,
- GenericRead = -2147483648
-}
-export default DirectoryAccess;
diff --git a/dist/protocol/smb2/DirectoryAccess.js b/dist/protocol/smb2/DirectoryAccess.js
deleted file mode 100644
index 62b5b22..0000000
--- a/dist/protocol/smb2/DirectoryAccess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var DirectoryAccess;
-(function (DirectoryAccess) {
- DirectoryAccess[DirectoryAccess["ListDirectory"] = 1] = "ListDirectory";
- DirectoryAccess[DirectoryAccess["AddFile"] = 2] = "AddFile";
- DirectoryAccess[DirectoryAccess["AddSubDirectory"] = 4] = "AddSubDirectory";
- DirectoryAccess[DirectoryAccess["ReadEa"] = 8] = "ReadEa";
- DirectoryAccess[DirectoryAccess["WriteEa"] = 16] = "WriteEa";
- DirectoryAccess[DirectoryAccess["Traverse"] = 32] = "Traverse";
- DirectoryAccess[DirectoryAccess["DeleteChild"] = 64] = "DeleteChild";
- DirectoryAccess[DirectoryAccess["ReadAttributes"] = 128] = "ReadAttributes";
- DirectoryAccess[DirectoryAccess["WriteAttributes"] = 256] = "WriteAttributes";
- DirectoryAccess[DirectoryAccess["Delete"] = 65536] = "Delete";
- DirectoryAccess[DirectoryAccess["ReadControl"] = 131072] = "ReadControl";
- DirectoryAccess[DirectoryAccess["WriteDiscretionaryAccessControl"] = 262144] = "WriteDiscretionaryAccessControl";
- DirectoryAccess[DirectoryAccess["WriteOwner"] = 524288] = "WriteOwner";
- DirectoryAccess[DirectoryAccess["Synchronize"] = 1048576] = "Synchronize";
- DirectoryAccess[DirectoryAccess["AccessSystemSecurity"] = 16777216] = "AccessSystemSecurity";
- DirectoryAccess[DirectoryAccess["MaximumAllowed"] = 33554432] = "MaximumAllowed";
- DirectoryAccess[DirectoryAccess["GenericAll"] = 268435456] = "GenericAll";
- DirectoryAccess[DirectoryAccess["GenericExecute"] = 536870912] = "GenericExecute";
- DirectoryAccess[DirectoryAccess["GenericWrite"] = 1073741824] = "GenericWrite";
- DirectoryAccess[DirectoryAccess["GenericRead"] = -2147483648] = "GenericRead";
-})(DirectoryAccess || (DirectoryAccess = {}));
-exports.default = DirectoryAccess;
diff --git a/dist/protocol/smb2/FileAction.d.ts b/dist/protocol/smb2/FileAction.d.ts
deleted file mode 100644
index 1855902..0000000
--- a/dist/protocol/smb2/FileAction.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-declare enum FileAction {
- Added = 1,
- Removed = 2,
- Modified = 3,
- RenamedOldName = 4,
- RenamedNewName = 5,
- AddedStream = 6,
- RemovedStream = 7,
- ModifiedStream = 8,
- RemovedByDelete = 9,
- IdNotTunnelled = 10,
- TunnelledIdCollision = 11
-}
-export default FileAction;
diff --git a/dist/protocol/smb2/FileAction.js b/dist/protocol/smb2/FileAction.js
deleted file mode 100644
index 1f86d65..0000000
--- a/dist/protocol/smb2/FileAction.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var FileAction;
-(function (FileAction) {
- FileAction[FileAction["Added"] = 1] = "Added";
- FileAction[FileAction["Removed"] = 2] = "Removed";
- FileAction[FileAction["Modified"] = 3] = "Modified";
- FileAction[FileAction["RenamedOldName"] = 4] = "RenamedOldName";
- FileAction[FileAction["RenamedNewName"] = 5] = "RenamedNewName";
- FileAction[FileAction["AddedStream"] = 6] = "AddedStream";
- FileAction[FileAction["RemovedStream"] = 7] = "RemovedStream";
- FileAction[FileAction["ModifiedStream"] = 8] = "ModifiedStream";
- FileAction[FileAction["RemovedByDelete"] = 9] = "RemovedByDelete";
- FileAction[FileAction["IdNotTunnelled"] = 10] = "IdNotTunnelled";
- FileAction[FileAction["TunnelledIdCollision"] = 11] = "TunnelledIdCollision";
-})(FileAction || (FileAction = {}));
-exports.default = FileAction;
diff --git a/dist/protocol/smb2/FileAttribute.d.ts b/dist/protocol/smb2/FileAttribute.d.ts
deleted file mode 100644
index cda98e5..0000000
--- a/dist/protocol/smb2/FileAttribute.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-declare enum FileAttribute {
- None = 0,
- ReadOnly = 1,
- Hidden = 2,
- System = 4,
- Directory = 16,
- Archive = 32,
- Normal = 128,
- Temporary = 256,
- SparseFile = 512,
- ReparsePoint = 1024,
- Compressed = 2048,
- Offline = 4096,
- NotContentIndexed = 8192,
- Encrypted = 16384,
- IntegrityStream = 32768,
- NoScrubData = 131072
-}
-export default FileAttribute;
diff --git a/dist/protocol/smb2/FileAttribute.js b/dist/protocol/smb2/FileAttribute.js
deleted file mode 100644
index 820770a..0000000
--- a/dist/protocol/smb2/FileAttribute.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var FileAttribute;
-(function (FileAttribute) {
- FileAttribute[FileAttribute["None"] = 0] = "None";
- FileAttribute[FileAttribute["ReadOnly"] = 1] = "ReadOnly";
- FileAttribute[FileAttribute["Hidden"] = 2] = "Hidden";
- FileAttribute[FileAttribute["System"] = 4] = "System";
- FileAttribute[FileAttribute["Directory"] = 16] = "Directory";
- FileAttribute[FileAttribute["Archive"] = 32] = "Archive";
- FileAttribute[FileAttribute["Normal"] = 128] = "Normal";
- FileAttribute[FileAttribute["Temporary"] = 256] = "Temporary";
- FileAttribute[FileAttribute["SparseFile"] = 512] = "SparseFile";
- FileAttribute[FileAttribute["ReparsePoint"] = 1024] = "ReparsePoint";
- FileAttribute[FileAttribute["Compressed"] = 2048] = "Compressed";
- FileAttribute[FileAttribute["Offline"] = 4096] = "Offline";
- FileAttribute[FileAttribute["NotContentIndexed"] = 8192] = "NotContentIndexed";
- FileAttribute[FileAttribute["Encrypted"] = 16384] = "Encrypted";
- FileAttribute[FileAttribute["IntegrityStream"] = 32768] = "IntegrityStream";
- FileAttribute[FileAttribute["NoScrubData"] = 131072] = "NoScrubData";
-})(FileAttribute || (FileAttribute = {}));
-exports.default = FileAttribute;
diff --git a/dist/protocol/smb2/FilePipePrinterAccess.d.ts b/dist/protocol/smb2/FilePipePrinterAccess.d.ts
deleted file mode 100644
index 47a05dd..0000000
--- a/dist/protocol/smb2/FilePipePrinterAccess.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-declare enum FilePipePrinterAccess {
- ReadData = 1,
- WriteData = 2,
- AppendData = 4,
- ReadEa = 8,
- WriteEa = 16,
- DeleteChild = 32,
- Execute = 64,
- ReadAttributes = 128,
- WriteAttributes = 256,
- Delete = 65536,
- ReadControl = 131072,
- WriteDiscretionaryAccessControl = 262144,
- WriteOwner = 524288,
- Synchronize = 1048576,
- AccessSystemSecurity = 16777216,
- MaximumAllowed = 33554432,
- GenericAll = 268435456,
- GenericExecute = 536870912,
- GenericWrite = 1073741824,
- GenericRead = -2147483648
-}
-export default FilePipePrinterAccess;
diff --git a/dist/protocol/smb2/FilePipePrinterAccess.js b/dist/protocol/smb2/FilePipePrinterAccess.js
deleted file mode 100644
index 8d17ab7..0000000
--- a/dist/protocol/smb2/FilePipePrinterAccess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var FilePipePrinterAccess;
-(function (FilePipePrinterAccess) {
- FilePipePrinterAccess[FilePipePrinterAccess["ReadData"] = 1] = "ReadData";
- FilePipePrinterAccess[FilePipePrinterAccess["WriteData"] = 2] = "WriteData";
- FilePipePrinterAccess[FilePipePrinterAccess["AppendData"] = 4] = "AppendData";
- FilePipePrinterAccess[FilePipePrinterAccess["ReadEa"] = 8] = "ReadEa";
- FilePipePrinterAccess[FilePipePrinterAccess["WriteEa"] = 16] = "WriteEa";
- FilePipePrinterAccess[FilePipePrinterAccess["DeleteChild"] = 32] = "DeleteChild";
- FilePipePrinterAccess[FilePipePrinterAccess["Execute"] = 64] = "Execute";
- FilePipePrinterAccess[FilePipePrinterAccess["ReadAttributes"] = 128] = "ReadAttributes";
- FilePipePrinterAccess[FilePipePrinterAccess["WriteAttributes"] = 256] = "WriteAttributes";
- FilePipePrinterAccess[FilePipePrinterAccess["Delete"] = 65536] = "Delete";
- FilePipePrinterAccess[FilePipePrinterAccess["ReadControl"] = 131072] = "ReadControl";
- FilePipePrinterAccess[FilePipePrinterAccess["WriteDiscretionaryAccessControl"] = 262144] = "WriteDiscretionaryAccessControl";
- FilePipePrinterAccess[FilePipePrinterAccess["WriteOwner"] = 524288] = "WriteOwner";
- FilePipePrinterAccess[FilePipePrinterAccess["Synchronize"] = 1048576] = "Synchronize";
- FilePipePrinterAccess[FilePipePrinterAccess["AccessSystemSecurity"] = 16777216] = "AccessSystemSecurity";
- FilePipePrinterAccess[FilePipePrinterAccess["MaximumAllowed"] = 33554432] = "MaximumAllowed";
- FilePipePrinterAccess[FilePipePrinterAccess["GenericAll"] = 268435456] = "GenericAll";
- FilePipePrinterAccess[FilePipePrinterAccess["GenericExecute"] = 536870912] = "GenericExecute";
- FilePipePrinterAccess[FilePipePrinterAccess["GenericWrite"] = 1073741824] = "GenericWrite";
- FilePipePrinterAccess[FilePipePrinterAccess["GenericRead"] = -2147483648] = "GenericRead";
-})(FilePipePrinterAccess || (FilePipePrinterAccess = {}));
-exports.default = FilePipePrinterAccess;
diff --git a/dist/protocol/smb2/Header.d.ts b/dist/protocol/smb2/Header.d.ts
deleted file mode 100644
index 23e3631..0000000
--- a/dist/protocol/smb2/Header.d.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import PacketType from "./PacketType";
-import StatusCode from "./StatusCode";
-import StructureField from "../StructureField";
-export declare const headerSize = 64;
-export default interface Header {
- protocolId?: string;
- structureSize?: number;
- creditCharge?: number;
- status?: StatusCode;
- type?: PacketType;
- credit?: number;
- flags?: number;
- nextCommand?: number;
- messageId?: bigint;
- clientId?: string;
- treeId?: number;
- sessionId?: string;
- signature?: number;
-}
-export declare type HeaderName = ("protocolId" | "structureSize" | "creditCharge" | "status" | "type" | "credit" | "flags" | "nextCommand" | "messageId" | "clientId" | "treeId" | "sessionId" | "signature");
-export declare type HeaderStructure = {
- [key in HeaderName]?: StructureField;
-};
-export declare const headerStructure: HeaderStructure;
diff --git a/dist/protocol/smb2/Header.js b/dist/protocol/smb2/Header.js
deleted file mode 100644
index fc4d23c..0000000
--- a/dist/protocol/smb2/Header.js
+++ /dev/null
@@ -1,62 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.headerStructure = exports.headerSize = void 0;
-const Packet_1 = require("../Packet");
-exports.headerSize = 64;
-exports.headerStructure = {
- protocolId: Packet_1.protocolIdStructureField,
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: exports.headerSize
- },
- creditCharge: {
- type: Number,
- size: 2
- },
- status: {
- type: Number,
- signedness: "Unsigned",
- size: 4
- },
- type: {
- type: Number,
- size: 2,
- defaultValue: 2
- },
- credit: {
- type: Number,
- size: 2,
- defaultValue: 126
- },
- flags: {
- type: Number,
- size: 4
- },
- nextCommand: {
- type: Number,
- size: 4
- },
- messageId: {
- type: Number,
- size: 8
- },
- clientId: {
- type: String,
- encoding: "hex",
- size: 4
- },
- treeId: {
- type: Number,
- size: 4
- },
- sessionId: {
- type: String,
- encoding: "hex",
- size: 8
- },
- signature: {
- type: Number,
- size: 16
- }
-};
diff --git a/dist/protocol/smb2/HeaderFlag.d.ts b/dist/protocol/smb2/HeaderFlag.d.ts
deleted file mode 100644
index 490f8e0..0000000
--- a/dist/protocol/smb2/HeaderFlag.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-declare enum HeaderFlag {
- Response = 1,
- Async = 2,
- Chained = 4,
- Signed = 8,
- Priority = 16,
- DfsOperation = 32,
- ReplayOperation = 64
-}
-export default HeaderFlag;
diff --git a/dist/protocol/smb2/HeaderFlag.js b/dist/protocol/smb2/HeaderFlag.js
deleted file mode 100644
index 68c769f..0000000
--- a/dist/protocol/smb2/HeaderFlag.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var HeaderFlag;
-(function (HeaderFlag) {
- HeaderFlag[HeaderFlag["Response"] = 1] = "Response";
- HeaderFlag[HeaderFlag["Async"] = 2] = "Async";
- HeaderFlag[HeaderFlag["Chained"] = 4] = "Chained";
- HeaderFlag[HeaderFlag["Signed"] = 8] = "Signed";
- HeaderFlag[HeaderFlag["Priority"] = 16] = "Priority";
- HeaderFlag[HeaderFlag["DfsOperation"] = 32] = "DfsOperation";
- HeaderFlag[HeaderFlag["ReplayOperation"] = 64] = "ReplayOperation";
-})(HeaderFlag || (HeaderFlag = {}));
-exports.default = HeaderFlag;
diff --git a/dist/protocol/smb2/Packet.d.ts b/dist/protocol/smb2/Packet.d.ts
deleted file mode 100644
index 294fcb3..0000000
--- a/dist/protocol/smb2/Packet.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-///
-import Structure from "../Structure";
-import PacketType from "./PacketType";
-import Header from "./Header";
-export default class Packet {
- static getPacketTypeName(packetType: PacketType): string;
- static getPacketByPacketType(packetType: PacketType): any;
- static getPacket(typeName: string): any;
- static getStructure(header: Header): Structure;
- static serialize(header: Header, body: any): Buffer;
- static parse(buffer: Buffer): {
- header: Header;
- body: any;
- };
- static parseHeader(buffer: Buffer): {
- header: Header;
- bodyBuffer: Buffer;
- };
- static serializeHeader(header: Header): Buffer;
-}
diff --git a/dist/protocol/smb2/Packet.js b/dist/protocol/smb2/Packet.js
deleted file mode 100644
index da0c73f..0000000
--- a/dist/protocol/smb2/Packet.js
+++ /dev/null
@@ -1,83 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const packets = __importStar(require("./packets"));
-const HeaderFlag_1 = __importDefault(require("./HeaderFlag"));
-const PacketType_1 = __importDefault(require("./PacketType"));
-const structureUtil = __importStar(require("../structureUtil"));
-const Header_1 = require("./Header");
-class Packet {
- static getPacketTypeName(packetType) {
- return structureUtil.parseEnumValue(PacketType_1.default, packetType);
- }
- static getPacketByPacketType(packetType) {
- const typeName = structureUtil.parseEnumValue(PacketType_1.default, packetType);
- return Packet.getPacket(typeName);
- }
- static getPacket(typeName) {
- const packet = packets[typeName];
- if (!packet)
- throw new Error(`packet_not_found: ${typeName}`);
- return packet;
- }
- static getStructure(header) {
- const packet = Packet.getPacketByPacketType(header.type);
- const isResponse = (header.flags & HeaderFlag_1.default.Response) === 1;
- const structure = packet[`${isResponse ? "response" : "request"}Structure`];
- return structure;
- }
- static serialize(header, body) {
- const structure = Packet.getStructure(header);
- const headerBuffer = Packet.serializeHeader(header);
- const bodyBuffer = structureUtil.serializeStructure(structure, body);
- const buffer = Buffer.concat([headerBuffer, bodyBuffer]);
- const prefixedBuffer = Buffer.allocUnsafe(buffer.length + 4);
- prefixedBuffer.writeUInt8(0x00, 0);
- prefixedBuffer.writeUInt8((0xff0000 & buffer.length) >> 16, 1);
- prefixedBuffer.writeUInt16BE(0xffff & buffer.length, 2);
- buffer.copy(prefixedBuffer, 4, 0, buffer.length);
- return prefixedBuffer;
- }
- static parse(buffer) {
- const { header, bodyBuffer } = Packet.parseHeader(buffer);
- const structure = Packet.getStructure(header);
- const body = structureUtil.parseStructure(bodyBuffer, structure);
- return {
- header,
- body
- };
- }
- static parseHeader(buffer) {
- const header = structureUtil.parseStructure(buffer, Header_1.headerStructure);
- const bodyBuffer = buffer.slice(Header_1.headerSize);
- return {
- header,
- bodyBuffer
- };
- }
- static serializeHeader(header) {
- return structureUtil.serializeStructure(Header_1.headerStructure, header);
- }
-}
-exports.default = Packet;
diff --git a/dist/protocol/smb2/PacketType.d.ts b/dist/protocol/smb2/PacketType.d.ts
deleted file mode 100644
index e2a3ef7..0000000
--- a/dist/protocol/smb2/PacketType.d.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-declare enum PacketType {
- Negotiate = 0,
- SessionSetup = 1,
- LogOff = 2,
- TreeConnect = 3,
- TreeDisconnect = 4,
- Create = 5,
- Close = 6,
- Flush = 7,
- Read = 8,
- Write = 9,
- Lock = 10,
- InputOutputControl = 11,
- Cancel = 12,
- Echo = 13,
- QueryDirectory = 14,
- ChangeNotify = 15,
- QueryInfo = 16,
- SetInfo = 17,
- OplockBreak = 18
-}
-export default PacketType;
diff --git a/dist/protocol/smb2/PacketType.js b/dist/protocol/smb2/PacketType.js
deleted file mode 100644
index d0cad1e..0000000
--- a/dist/protocol/smb2/PacketType.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var PacketType;
-(function (PacketType) {
- PacketType[PacketType["Negotiate"] = 0] = "Negotiate";
- PacketType[PacketType["SessionSetup"] = 1] = "SessionSetup";
- PacketType[PacketType["LogOff"] = 2] = "LogOff";
- PacketType[PacketType["TreeConnect"] = 3] = "TreeConnect";
- PacketType[PacketType["TreeDisconnect"] = 4] = "TreeDisconnect";
- PacketType[PacketType["Create"] = 5] = "Create";
- PacketType[PacketType["Close"] = 6] = "Close";
- PacketType[PacketType["Flush"] = 7] = "Flush";
- PacketType[PacketType["Read"] = 8] = "Read";
- PacketType[PacketType["Write"] = 9] = "Write";
- PacketType[PacketType["Lock"] = 10] = "Lock";
- PacketType[PacketType["InputOutputControl"] = 11] = "InputOutputControl";
- PacketType[PacketType["Cancel"] = 12] = "Cancel";
- PacketType[PacketType["Echo"] = 13] = "Echo";
- PacketType[PacketType["QueryDirectory"] = 14] = "QueryDirectory";
- PacketType[PacketType["ChangeNotify"] = 15] = "ChangeNotify";
- PacketType[PacketType["QueryInfo"] = 16] = "QueryInfo";
- PacketType[PacketType["SetInfo"] = 17] = "SetInfo";
- PacketType[PacketType["OplockBreak"] = 18] = "OplockBreak";
-})(PacketType || (PacketType = {}));
-;
-exports.default = PacketType;
diff --git a/dist/protocol/smb2/Request.d.ts b/dist/protocol/smb2/Request.d.ts
deleted file mode 100644
index 55e5d2a..0000000
--- a/dist/protocol/smb2/Request.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-///
-import Header from "./Header";
-import ProtocolRequest from "../Request";
-export default class Request extends ProtocolRequest {
- header: Header;
- typeName: string;
- data: any;
- constructor(header?: Header, body?: any);
- static parse(buffer: Buffer): Request;
- serialize(): Buffer;
-}
diff --git a/dist/protocol/smb2/Request.js b/dist/protocol/smb2/Request.js
deleted file mode 100644
index 2ad2812..0000000
--- a/dist/protocol/smb2/Request.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Packet_1 = __importDefault(require("./Packet"));
-const Request_1 = __importDefault(require("../Request"));
-class Request extends Request_1.default {
- constructor(header, body) {
- super(header, body);
- this.typeName = Packet_1.default.getPacketTypeName(this.header.type);
- const packet = Packet_1.default.getPacketByPacketType(this.header.type);
- if (Buffer.isBuffer(this.body.buffer) && packet.parseRequestBuffer) {
- this.data = packet.parseRequestBuffer(this.body.buffer);
- }
- }
- static parse(buffer) {
- const { header, body } = Packet_1.default.parse(buffer);
- return new Request(header, body);
- }
- serialize() {
- return Packet_1.default.serialize(this.header, this.body);
- }
-}
-exports.default = Request;
diff --git a/dist/protocol/smb2/Response.d.ts b/dist/protocol/smb2/Response.d.ts
deleted file mode 100644
index c1e15ba..0000000
--- a/dist/protocol/smb2/Response.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-///
-import Header from "./Header";
-import ProtocolResponse from "../Response";
-export default class Response extends ProtocolResponse {
- header: Header;
- typeName: string;
- data: any;
- constructor(header?: Header, body?: any);
- static parse(buffer: Buffer): Response;
- serialize(): Buffer;
-}
diff --git a/dist/protocol/smb2/Response.js b/dist/protocol/smb2/Response.js
deleted file mode 100644
index 70aea65..0000000
--- a/dist/protocol/smb2/Response.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Packet_1 = __importDefault(require("./Packet"));
-const HeaderFlag_1 = __importDefault(require("./HeaderFlag"));
-const Response_1 = __importDefault(require("../Response"));
-class Response extends Response_1.default {
- constructor(header, body) {
- super(header, body);
- this.header.flags |= HeaderFlag_1.default.Response;
- this.typeName = Packet_1.default.getPacketTypeName(this.header.type);
- const packet = Packet_1.default.getPacketByPacketType(this.header.type);
- if (Buffer.isBuffer(this.body.buffer) && packet.parseResponseBuffer) {
- this.data = packet.parseResponseBuffer(this.body.buffer);
- }
- }
- static parse(buffer) {
- const { header, body } = Packet_1.default.parse(buffer);
- return new Response(header, body);
- }
- serialize() {
- return Packet_1.default.serialize(this.header, this.body);
- }
-}
-exports.default = Response;
diff --git a/dist/protocol/smb2/ShareAccessType.d.ts b/dist/protocol/smb2/ShareAccessType.d.ts
deleted file mode 100644
index 12d2131..0000000
--- a/dist/protocol/smb2/ShareAccessType.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-declare enum ShareAccessType {
- Read = 1,
- Write = 2,
- Delete = 4
-}
-export default ShareAccessType;
diff --git a/dist/protocol/smb2/ShareAccessType.js b/dist/protocol/smb2/ShareAccessType.js
deleted file mode 100644
index 4826010..0000000
--- a/dist/protocol/smb2/ShareAccessType.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ShareAccessType;
-(function (ShareAccessType) {
- ShareAccessType[ShareAccessType["Read"] = 1] = "Read";
- ShareAccessType[ShareAccessType["Write"] = 2] = "Write";
- ShareAccessType[ShareAccessType["Delete"] = 4] = "Delete";
-})(ShareAccessType || (ShareAccessType = {}));
-exports.default = ShareAccessType;
diff --git a/dist/protocol/smb2/StatusCode.d.ts b/dist/protocol/smb2/StatusCode.d.ts
deleted file mode 100644
index 8b39232..0000000
--- a/dist/protocol/smb2/StatusCode.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-declare enum StatusCode {
- Success = 0,
- Pending = 259,
- MoreProcessingRequired = 3221225494,
- FileNameNotFound = 3221225524,
- FilePathNotFound = 3221225530,
- FileClosed = 3221225768
-}
-export default StatusCode;
diff --git a/dist/protocol/smb2/StatusCode.js b/dist/protocol/smb2/StatusCode.js
deleted file mode 100644
index d2ac12d..0000000
--- a/dist/protocol/smb2/StatusCode.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var StatusCode;
-(function (StatusCode) {
- StatusCode[StatusCode["Success"] = 0] = "Success";
- StatusCode[StatusCode["Pending"] = 259] = "Pending";
- StatusCode[StatusCode["MoreProcessingRequired"] = 3221225494] = "MoreProcessingRequired";
- StatusCode[StatusCode["FileNameNotFound"] = 3221225524] = "FileNameNotFound";
- StatusCode[StatusCode["FilePathNotFound"] = 3221225530] = "FilePathNotFound";
- StatusCode[StatusCode["FileClosed"] = 3221225768] = "FileClosed";
-})(StatusCode || (StatusCode = {}));
-exports.default = StatusCode;
diff --git a/dist/protocol/smb2/packets/ChangeNotify.d.ts b/dist/protocol/smb2/packets/ChangeNotify.d.ts
deleted file mode 100644
index edfe96d..0000000
--- a/dist/protocol/smb2/packets/ChangeNotify.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-///
-import Structure from "../../Structure";
-import ChangeEntry from "../../models/ChangeEntry";
-export declare enum Flags {
- None = 0,
- WatchTreeRecursively = 1
-}
-export declare enum CompletionFilter {
- FilenameChange = 1,
- DirnameChange = 2,
- AttributesChange = 4,
- SizeChange = 8,
- LastWriteChange = 16,
- LastAccessChange = 32,
- CreationChange = 64,
- EaChange = 128,
- SecurityChange = 256,
- StreamNameChange = 512,
- StreamSizeChange = 1024,
- StreamWriteChange = 2048
-}
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
- parseResponseBuffer: (buffer: Buffer) => ChangeEntry[];
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/ChangeNotify.js b/dist/protocol/smb2/packets/ChangeNotify.js
deleted file mode 100644
index cd8dab6..0000000
--- a/dist/protocol/smb2/packets/ChangeNotify.js
+++ /dev/null
@@ -1,129 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CompletionFilter = exports.Flags = void 0;
-const util = __importStar(require("../../util"));
-const FileAction_1 = __importDefault(require("../FileAction"));
-const structureUtil = __importStar(require("../../structureUtil"));
-var Flags;
-(function (Flags) {
- Flags[Flags["None"] = 0] = "None";
- Flags[Flags["WatchTreeRecursively"] = 1] = "WatchTreeRecursively";
-})(Flags = exports.Flags || (exports.Flags = {}));
-var CompletionFilter;
-(function (CompletionFilter) {
- CompletionFilter[CompletionFilter["FilenameChange"] = 1] = "FilenameChange";
- CompletionFilter[CompletionFilter["DirnameChange"] = 2] = "DirnameChange";
- CompletionFilter[CompletionFilter["AttributesChange"] = 4] = "AttributesChange";
- CompletionFilter[CompletionFilter["SizeChange"] = 8] = "SizeChange";
- CompletionFilter[CompletionFilter["LastWriteChange"] = 16] = "LastWriteChange";
- CompletionFilter[CompletionFilter["LastAccessChange"] = 32] = "LastAccessChange";
- CompletionFilter[CompletionFilter["CreationChange"] = 64] = "CreationChange";
- CompletionFilter[CompletionFilter["EaChange"] = 128] = "EaChange";
- CompletionFilter[CompletionFilter["SecurityChange"] = 256] = "SecurityChange";
- CompletionFilter[CompletionFilter["StreamNameChange"] = 512] = "StreamNameChange";
- CompletionFilter[CompletionFilter["StreamSizeChange"] = 1024] = "StreamSizeChange";
- CompletionFilter[CompletionFilter["StreamWriteChange"] = 2048] = "StreamWriteChange";
-})(CompletionFilter = exports.CompletionFilter || (exports.CompletionFilter = {}));
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 32
- },
- flags: {
- type: Number,
- size: 2,
- defaultValue: Flags.WatchTreeRecursively
- },
- outputBufferLength: {
- type: Number,
- size: 4,
- defaultValue: 0x00010000
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- },
- completionFilter: {
- type: Number,
- size: 4,
- defaultValue: CompletionFilter.FilenameChange |
- CompletionFilter.DirnameChange |
- CompletionFilter.AttributesChange |
- CompletionFilter.SizeChange |
- CompletionFilter.LastWriteChange |
- CompletionFilter.LastAccessChange |
- CompletionFilter.CreationChange |
- CompletionFilter.EaChange |
- CompletionFilter.SecurityChange |
- CompletionFilter.StreamNameChange |
- CompletionFilter.StreamSizeChange |
- CompletionFilter.StreamWriteChange
- },
- reserved: {
- type: Number,
- size: 4
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- outputBufferOffset: {
- type: Number,
- size: 2
- },
- outputBufferLength: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "outputBufferLength"
- }
-};
-const parseChangeEntry = (entryBuffer) => {
- const action = entryBuffer.readUInt32LE(0);
- const filenameLength = entryBuffer.readUInt32LE(4);
- const filename = util.toUnixFilePath(entryBuffer
- .slice(8, 8 + filenameLength)
- .toString("ucs2"));
- const actionName = structureUtil.parseEnumValue(FileAction_1.default, action);
- return {
- action,
- actionName,
- filename
- };
-};
-const parseResponseBuffer = (buffer) => {
- return structureUtil.parseList(buffer, parseChangeEntry);
-};
-exports.default = {
- requestStructure,
- responseStructure,
- parseResponseBuffer
-};
diff --git a/dist/protocol/smb2/packets/Close.d.ts b/dist/protocol/smb2/packets/Close.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/Close.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Close.js b/dist/protocol/smb2/packets/Close.js
deleted file mode 100644
index 346ea43..0000000
--- a/dist/protocol/smb2/packets/Close.js
+++ /dev/null
@@ -1,69 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 24
- },
- flags: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 4
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- flags: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 4
- },
- creationTime: {
- type: Number,
- size: 8
- },
- lastAccessTime: {
- type: Number,
- size: 8
- },
- lastWriteTime: {
- type: Number,
- size: 8
- },
- changeTime: {
- type: Number,
- size: 8
- },
- allocationSize: {
- type: Number,
- size: 8
- },
- endOfFile: {
- type: Number,
- signedness: "Signed",
- size: 8
- },
- fileAttributes: {
- type: Number,
- size: 4
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/Create.d.ts b/dist/protocol/smb2/packets/Create.d.ts
deleted file mode 100644
index 75803a6..0000000
--- a/dist/protocol/smb2/packets/Create.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import Structure from "../../Structure";
-export declare enum CreateOptions {
- None = 0,
- Directory = 1
-}
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Create.js b/dist/protocol/smb2/packets/Create.js
deleted file mode 100644
index 824a2b9..0000000
--- a/dist/protocol/smb2/packets/Create.js
+++ /dev/null
@@ -1,168 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateOptions = void 0;
-const ShareAccessType_1 = __importDefault(require("../ShareAccessType"));
-const CreateDispositionType_1 = __importDefault(require("../CreateDispositionType"));
-var CreateOptions;
-(function (CreateOptions) {
- CreateOptions[CreateOptions["None"] = 0] = "None";
- CreateOptions[CreateOptions["Directory"] = 1] = "Directory";
-})(CreateOptions = exports.CreateOptions || (exports.CreateOptions = {}));
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 57
- },
- securityFlags: {
- type: Number,
- size: 1
- },
- requestedOplockLevel: {
- type: Number,
- size: 1
- },
- impersonationLevel: {
- type: Number,
- size: 4,
- defaultValue: 0x00000002
- },
- smbCreateFlags: {
- type: Number,
- size: 8
- },
- reserved: {
- type: Number,
- size: 8
- },
- desiredAccess: {
- type: Number,
- size: 4,
- defaultValue: 0x00100081
- },
- fileAttributes: {
- type: Number,
- size: 4
- },
- shareAccess: {
- type: Number,
- size: 4,
- defaultValue: ShareAccessType_1.default.Read |
- ShareAccessType_1.default.Write |
- ShareAccessType_1.default.Delete
- },
- createDisposition: {
- type: Number,
- size: 4,
- defaultValue: CreateDispositionType_1.default.Open
- },
- createOptions: {
- type: Number,
- size: 4,
- defaultValue: CreateOptions.None
- },
- nameOffset: {
- type: Number,
- size: 2
- },
- nameLength: {
- type: Number,
- size: 2
- },
- createContextsOffset: {
- type: Number,
- size: 4
- },
- createContextsLength: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "nameLength"
- },
- reserved2: {
- type: Number,
- size: 2,
- defaultValue: 0x4200
- },
- createContexts: {
- type: Number,
- sizeFieldName: "createContextsLength",
- defaultValue: ""
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- oplockLevel: {
- type: Number,
- size: 1
- },
- flags: {
- type: Number,
- size: 1
- },
- createAction: {
- type: Number,
- size: 4
- },
- creationTime: {
- type: Number,
- size: 8
- },
- lastAccessTime: {
- type: Number,
- size: 8
- },
- lastWriteTime: {
- type: Number,
- size: 8
- },
- changeTime: {
- type: Number,
- size: 8
- },
- allocationSize: {
- type: Number,
- size: 8
- },
- endOfFile: {
- type: Number,
- size: 8
- },
- fileAttributes: {
- type: Number,
- size: 4
- },
- reserved2: {
- type: Number,
- size: 4
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- },
- createContextsOffset: {
- type: Number,
- size: 4
- },
- createContextsLength: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "createContextsLength"
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/Echo.d.ts b/dist/protocol/smb2/packets/Echo.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/Echo.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Echo.js b/dist/protocol/smb2/packets/Echo.js
deleted file mode 100644
index c3093fd..0000000
--- a/dist/protocol/smb2/packets/Echo.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 4
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/Flush.d.ts b/dist/protocol/smb2/packets/Flush.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/Flush.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Flush.js b/dist/protocol/smb2/packets/Flush.js
deleted file mode 100644
index a913ec0..0000000
--- a/dist/protocol/smb2/packets/Flush.js
+++ /dev/null
@@ -1,36 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 24
- },
- reserved: {
- type: Number,
- size: 2
- },
- reserved2: {
- type: Number,
- size: 4
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/LogOff.d.ts b/dist/protocol/smb2/packets/LogOff.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/LogOff.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/LogOff.js b/dist/protocol/smb2/packets/LogOff.js
deleted file mode 100644
index 79c30b6..0000000
--- a/dist/protocol/smb2/packets/LogOff.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 4
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 4
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/Negotiate.d.ts b/dist/protocol/smb2/packets/Negotiate.d.ts
deleted file mode 100644
index 6d5edde..0000000
--- a/dist/protocol/smb2/packets/Negotiate.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import Structure from "../../Structure";
-import Capability from "../Capability";
-export interface RequestBody {
- structureSize?: number;
- dialects: number[];
- securityMode?: number;
- capabilities: Capability;
- clientGuid: string;
- clientStartDate: Date;
-}
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Negotiate.js b/dist/protocol/smb2/packets/Negotiate.js
deleted file mode 100644
index d469ab8..0000000
--- a/dist/protocol/smb2/packets/Negotiate.js
+++ /dev/null
@@ -1,107 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 36
- },
- dialectCount: {
- type: Number,
- signedness: "Unsigned",
- size: 2
- },
- securityMode: {
- type: Number,
- size: 2,
- defaultValue: 1
- },
- reserved: {
- type: Number,
- size: 2
- },
- capabilities: {
- type: Number,
- size: 4
- },
- clientGuid: {
- type: Number,
- size: 16
- },
- clientStartTime: {
- type: Number,
- size: 8
- },
- dialects: {
- type: Number,
- countFieldName: "dialectCount",
- size: 2
- }
-};
-;
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- securityMode: {
- type: Number,
- size: 2
- },
- dialectRevision: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 2
- },
- serverGuid: {
- type: Number,
- size: 16
- },
- capabilities: {
- type: Number,
- size: 4
- },
- maxTransactSize: {
- type: Number,
- size: 4
- },
- maxReadSize: {
- type: Number,
- size: 4
- },
- maxWriteSize: {
- type: Number,
- size: 4
- },
- systemTime: {
- type: Number,
- size: 8
- },
- serverStartTime: {
- type: Number,
- size: 8
- },
- securityBufferOffset: {
- type: Number,
- size: 2
- },
- securityBufferLength: {
- type: Number,
- size: 2
- },
- reserved2: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "securityBufferLength"
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/QueryDirectory.d.ts b/dist/protocol/smb2/packets/QueryDirectory.d.ts
deleted file mode 100644
index 42a9e3e..0000000
--- a/dist/protocol/smb2/packets/QueryDirectory.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-import Structure from "../../Structure";
-import DirectoryEntry from "../../models/DirectoryEntry";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
- parseResponseBuffer: (buffer: Buffer) => DirectoryEntry[];
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/QueryDirectory.js b/dist/protocol/smb2/packets/QueryDirectory.js
deleted file mode 100644
index 7bfdd82..0000000
--- a/dist/protocol/smb2/packets/QueryDirectory.js
+++ /dev/null
@@ -1,151 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const util = __importStar(require("../../util"));
-const FileAttribute_1 = __importDefault(require("../FileAttribute"));
-const structureUtil = __importStar(require("../../structureUtil"));
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 33
- },
- fileInformationClass: {
- type: Number,
- size: 1,
- defaultValue: 37 // FileIdBothDirectoryInformation
- },
- flags: {
- type: Number,
- size: 1
- },
- fileIndex: {
- type: Number,
- size: 4
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- },
- fileNameOffset: {
- type: Number,
- size: 2,
- defaultValue: 96
- },
- fileNameLength: {
- type: Number,
- size: 2
- },
- outputBufferLength: {
- type: Number,
- size: 4,
- defaultValue: 0x00010000
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "fileNameLength"
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- outputBufferOffset: {
- type: Number,
- size: 2
- },
- outputBufferLength: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "outputBufferLength"
- }
-};
-const parseDirectoryEntry = (entryBuffer) => {
- let offset = 0;
- const index = entryBuffer.readUInt32LE(offset);
- offset += 4;
- const creationTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
- offset += 8;
- const lastAccessTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
- offset += 8;
- const lastWriteTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
- offset += 8;
- const changeTime = structureUtil.parseDate(entryBuffer.slice(offset, offset + 8));
- offset += 8;
- const fileSize = entryBuffer.readBigUInt64LE(offset);
- offset += 8;
- const allocationSize = entryBuffer.readBigUInt64LE(offset);
- offset += 8;
- const fileAttributes = structureUtil.parseEnumValues(FileAttribute_1.default, entryBuffer.readUInt32LE(offset));
- offset += 4;
- const filenameLength = entryBuffer.readUInt32LE(offset);
- offset += 4;
- const eaSize = entryBuffer.readUInt32LE(offset);
- offset += 4;
- const shortNameLength = entryBuffer.readUInt8(offset);
- offset += 1;
- offset += 1; // reserved
- let shortFilename;
- if (shortNameLength !== 0) {
- shortFilename = util.toUnixFilePath(entryBuffer
- .slice(offset, offset + shortNameLength)
- .toString("ucs2"));
- }
- offset += 24;
- offset += 2; // reserved
- const fileId = structureUtil.parseString(entryBuffer.slice(offset, offset + 8).reverse(), { type: String, encoding: "hex" });
- offset += 8;
- const filename = util.toUnixFilePath(entryBuffer
- .slice(offset, offset + filenameLength)
- .toString("ucs2"));
- offset += filenameLength;
- return {
- type: fileAttributes.includes("Directory") ? "Directory" : "File",
- index,
- creationTime,
- lastAccessTime,
- lastWriteTime,
- changeTime,
- fileSize,
- allocationSize,
- eaSize,
- shortFilename,
- fileId,
- filename,
- fileAttributes
- };
-};
-const parseResponseBuffer = (buffer) => {
- return structureUtil.parseList(buffer, parseDirectoryEntry);
-};
-exports.default = {
- requestStructure,
- responseStructure,
- parseResponseBuffer
-};
diff --git a/dist/protocol/smb2/packets/Read.d.ts b/dist/protocol/smb2/packets/Read.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/Read.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Read.js b/dist/protocol/smb2/packets/Read.js
deleted file mode 100644
index 3b90f9f..0000000
--- a/dist/protocol/smb2/packets/Read.js
+++ /dev/null
@@ -1,89 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 49
- },
- padding: {
- type: Number,
- size: 1,
- defaultValue: 80
- },
- flags: {
- type: Number,
- size: 1
- },
- length: {
- type: Number,
- size: 4
- },
- offset: {
- type: Number,
- size: 8
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- },
- minimumCount: {
- type: Number,
- size: 4
- },
- channel: {
- type: Number,
- size: 4
- },
- remainingBytes: {
- type: Number,
- size: 4
- },
- readChannelInfoOffset: {
- type: Number,
- size: 2
- },
- readChannelInfoLength: {
- type: Number,
- size: 2
- },
- buffer: {
- type: Buffer,
- size: 1
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- dataOffset: {
- type: Number,
- size: 1
- },
- reserved: {
- type: Number,
- size: 1
- },
- dataLength: {
- type: Number,
- size: 4
- },
- dataRemaining: {
- type: Number,
- size: 4
- },
- reserved2: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "dataLength"
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/SessionSetup.d.ts b/dist/protocol/smb2/packets/SessionSetup.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/SessionSetup.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/SessionSetup.js b/dist/protocol/smb2/packets/SessionSetup.js
deleted file mode 100644
index 086bbd5..0000000
--- a/dist/protocol/smb2/packets/SessionSetup.js
+++ /dev/null
@@ -1,70 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 25
- },
- flags: {
- type: Number,
- size: 1
- },
- securityMode: {
- type: Number,
- size: 1,
- defaultValue: 1
- },
- capabilities: {
- type: Number,
- size: 4,
- defaultValue: 1
- },
- channel: {
- type: Number,
- size: 4
- },
- securityBufferOffset: {
- type: Number,
- size: 2,
- defaultValue: 88
- },
- securityBufferLength: {
- type: Number,
- size: 2
- },
- previousSessionId: {
- type: Number,
- size: 8
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "securityBufferLength"
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- sessionFlags: {
- type: Number,
- size: 2
- },
- securityBufferOffset: {
- type: Number,
- size: 2
- },
- securityBufferLength: {
- type: Number,
- size: 2
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "securityBufferLength"
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/SetInfo.d.ts b/dist/protocol/smb2/packets/SetInfo.d.ts
deleted file mode 100644
index 56f0fd6..0000000
--- a/dist/protocol/smb2/packets/SetInfo.d.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import Structure from "../../Structure";
-export declare enum InfoType {
- File = 1,
- Filesystem = 2,
- Security = 3,
- Quota = 4
-}
-export declare enum FileInfoClass {
- AllocationInformation = 19,
- BasicInformation = 4,
- DispositionInformation = 13,
- EndOfFileInformation = 20,
- FullEaInformation = 15,
- LinkInformation = 11,
- ModeInformation = 16,
- PipeInformation = 23,
- PositionInformation = 14,
- RenameInformation = 10,
- ShortNameInformation = 40,
- ValidDataLengthInformation = 39
-}
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/SetInfo.js b/dist/protocol/smb2/packets/SetInfo.js
deleted file mode 100644
index 4194fd6..0000000
--- a/dist/protocol/smb2/packets/SetInfo.js
+++ /dev/null
@@ -1,78 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.FileInfoClass = exports.InfoType = void 0;
-var InfoType;
-(function (InfoType) {
- InfoType[InfoType["File"] = 1] = "File";
- InfoType[InfoType["Filesystem"] = 2] = "Filesystem";
- InfoType[InfoType["Security"] = 3] = "Security";
- InfoType[InfoType["Quota"] = 4] = "Quota";
-})(InfoType = exports.InfoType || (exports.InfoType = {}));
-var FileInfoClass;
-(function (FileInfoClass) {
- FileInfoClass[FileInfoClass["AllocationInformation"] = 19] = "AllocationInformation";
- FileInfoClass[FileInfoClass["BasicInformation"] = 4] = "BasicInformation";
- FileInfoClass[FileInfoClass["DispositionInformation"] = 13] = "DispositionInformation";
- FileInfoClass[FileInfoClass["EndOfFileInformation"] = 20] = "EndOfFileInformation";
- FileInfoClass[FileInfoClass["FullEaInformation"] = 15] = "FullEaInformation";
- FileInfoClass[FileInfoClass["LinkInformation"] = 11] = "LinkInformation";
- FileInfoClass[FileInfoClass["ModeInformation"] = 16] = "ModeInformation";
- FileInfoClass[FileInfoClass["PipeInformation"] = 23] = "PipeInformation";
- FileInfoClass[FileInfoClass["PositionInformation"] = 14] = "PositionInformation";
- FileInfoClass[FileInfoClass["RenameInformation"] = 10] = "RenameInformation";
- FileInfoClass[FileInfoClass["ShortNameInformation"] = 40] = "ShortNameInformation";
- FileInfoClass[FileInfoClass["ValidDataLengthInformation"] = 39] = "ValidDataLengthInformation";
-})(FileInfoClass = exports.FileInfoClass || (exports.FileInfoClass = {}));
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 33
- },
- infoType: {
- type: Number,
- size: 1,
- defaultValue: InfoType.File
- },
- fileInfoClass: {
- type: Number,
- size: 1,
- defaultValue: FileInfoClass.EndOfFileInformation
- },
- bufferLength: {
- type: Number,
- size: 4
- },
- bufferOffset: {
- type: Number,
- size: 2,
- defaultValue: 96
- },
- reserved: {
- type: Number,
- size: 2
- },
- additionalInformation: {
- type: Number,
- size: 4
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "bufferLength"
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/TreeConnect.d.ts b/dist/protocol/smb2/packets/TreeConnect.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/TreeConnect.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/TreeConnect.js b/dist/protocol/smb2/packets/TreeConnect.js
deleted file mode 100644
index 97cd5c1..0000000
--- a/dist/protocol/smb2/packets/TreeConnect.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 9
- },
- reserved: {
- type: Number,
- size: 2
- },
- pathOffset: {
- type: Number,
- size: 2,
- defaultValue: 72
- },
- pathLength: {
- type: Number,
- size: 2
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "pathLength"
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- shareType: {
- type: Number,
- size: 1
- },
- reserved: {
- type: Number,
- size: 1
- },
- shareFlags: {
- type: Number,
- size: 4
- },
- capabilities: {
- type: Number,
- size: 4
- },
- maximalAccess: {
- type: Number,
- size: 4
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/TreeDisconnect.d.ts b/dist/protocol/smb2/packets/TreeDisconnect.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/TreeDisconnect.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/TreeDisconnect.js b/dist/protocol/smb2/packets/TreeDisconnect.js
deleted file mode 100644
index c3093fd..0000000
--- a/dist/protocol/smb2/packets/TreeDisconnect.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 4
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 2
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/Write.d.ts b/dist/protocol/smb2/packets/Write.d.ts
deleted file mode 100644
index 00e7040..0000000
--- a/dist/protocol/smb2/packets/Write.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Structure from "../../Structure";
-declare const _default: {
- requestStructure: Structure;
- responseStructure: Structure;
-};
-export default _default;
diff --git a/dist/protocol/smb2/packets/Write.js b/dist/protocol/smb2/packets/Write.js
deleted file mode 100644
index 97b1fe8..0000000
--- a/dist/protocol/smb2/packets/Write.js
+++ /dev/null
@@ -1,81 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const requestStructure = {
- structureSize: {
- type: Number,
- size: 2,
- defaultValue: 49
- },
- dataOffset: {
- type: Number,
- size: 2,
- defaultValue: 112
- },
- length: {
- type: Number,
- size: 4
- },
- offset: {
- type: Number,
- size: 8
- },
- fileId: {
- type: String,
- encoding: "hex",
- size: 16
- },
- channel: {
- type: Number,
- size: 4
- },
- remainingBytes: {
- type: Number,
- size: 4
- },
- writeChannelInfoOffset: {
- type: Number,
- size: 2
- },
- writeChannelInfoLength: {
- type: Number,
- size: 2
- },
- flags: {
- type: Number,
- size: 4
- },
- buffer: {
- type: Buffer,
- sizeFieldName: "length"
- }
-};
-const responseStructure = {
- structureSize: {
- type: Number,
- size: 2
- },
- reserved: {
- type: Number,
- size: 2
- },
- count: {
- type: Number,
- size: 4
- },
- remaining: {
- type: Number,
- size: 4
- },
- writeChannelInfoOffset: {
- type: Number,
- size: 2
- },
- writeChannelInfoLength: {
- type: Number,
- size: 2
- }
-};
-exports.default = {
- requestStructure,
- responseStructure
-};
diff --git a/dist/protocol/smb2/packets/index.d.ts b/dist/protocol/smb2/packets/index.d.ts
deleted file mode 100644
index bd0933f..0000000
--- a/dist/protocol/smb2/packets/index.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export { default as Negotiate } from "./Negotiate";
-export { default as SessionSetup } from "./SessionSetup";
-export { default as LogOff } from "./LogOff";
-export { default as TreeConnect } from "./TreeConnect";
-export { default as TreeDisconnect } from "./TreeDisconnect";
-export { default as Create } from "./Create";
-export { default as Close } from "./Close";
-export { default as Flush } from "./Flush";
-export { default as Read } from "./Read";
-export { default as Write } from "./Write";
-export { default as Echo } from "./Echo";
-export { default as QueryDirectory } from "./QueryDirectory";
-export { default as ChangeNotify } from "./ChangeNotify";
-export { default as SetInfo } from "./SetInfo";
diff --git a/dist/protocol/smb2/packets/index.js b/dist/protocol/smb2/packets/index.js
deleted file mode 100644
index 08a4474..0000000
--- a/dist/protocol/smb2/packets/index.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SetInfo = exports.ChangeNotify = exports.QueryDirectory = exports.Echo = exports.Write = exports.Read = exports.Flush = exports.Close = exports.Create = exports.TreeDisconnect = exports.TreeConnect = exports.LogOff = exports.SessionSetup = exports.Negotiate = void 0;
-var Negotiate_1 = require("./Negotiate");
-Object.defineProperty(exports, "Negotiate", { enumerable: true, get: function () { return __importDefault(Negotiate_1).default; } });
-var SessionSetup_1 = require("./SessionSetup");
-Object.defineProperty(exports, "SessionSetup", { enumerable: true, get: function () { return __importDefault(SessionSetup_1).default; } });
-var LogOff_1 = require("./LogOff");
-Object.defineProperty(exports, "LogOff", { enumerable: true, get: function () { return __importDefault(LogOff_1).default; } });
-var TreeConnect_1 = require("./TreeConnect");
-Object.defineProperty(exports, "TreeConnect", { enumerable: true, get: function () { return __importDefault(TreeConnect_1).default; } });
-var TreeDisconnect_1 = require("./TreeDisconnect");
-Object.defineProperty(exports, "TreeDisconnect", { enumerable: true, get: function () { return __importDefault(TreeDisconnect_1).default; } });
-var Create_1 = require("./Create");
-Object.defineProperty(exports, "Create", { enumerable: true, get: function () { return __importDefault(Create_1).default; } });
-var Close_1 = require("./Close");
-Object.defineProperty(exports, "Close", { enumerable: true, get: function () { return __importDefault(Close_1).default; } });
-var Flush_1 = require("./Flush");
-Object.defineProperty(exports, "Flush", { enumerable: true, get: function () { return __importDefault(Flush_1).default; } });
-var Read_1 = require("./Read");
-Object.defineProperty(exports, "Read", { enumerable: true, get: function () { return __importDefault(Read_1).default; } });
-var Write_1 = require("./Write");
-Object.defineProperty(exports, "Write", { enumerable: true, get: function () { return __importDefault(Write_1).default; } });
-var Echo_1 = require("./Echo");
-Object.defineProperty(exports, "Echo", { enumerable: true, get: function () { return __importDefault(Echo_1).default; } });
-var QueryDirectory_1 = require("./QueryDirectory");
-Object.defineProperty(exports, "QueryDirectory", { enumerable: true, get: function () { return __importDefault(QueryDirectory_1).default; } });
-var ChangeNotify_1 = require("./ChangeNotify");
-Object.defineProperty(exports, "ChangeNotify", { enumerable: true, get: function () { return __importDefault(ChangeNotify_1).default; } });
-var SetInfo_1 = require("./SetInfo");
-Object.defineProperty(exports, "SetInfo", { enumerable: true, get: function () { return __importDefault(SetInfo_1).default; } });
diff --git a/dist/protocol/structureUtil.d.ts b/dist/protocol/structureUtil.d.ts
deleted file mode 100644
index 1d12aec..0000000
--- a/dist/protocol/structureUtil.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-///
-import Value from "./Value";
-import Structure from "./Structure";
-import StructureField from "./StructureField";
-export declare const parseStructure: (buffer: Buffer, structure: Structure) => any;
-export declare const parseNumber: (buffer: Buffer, structureField: StructureField) => number | bigint;
-export declare const parseValue: (buffer: Buffer, structureField: StructureField) => Value;
-export declare const parseString: (buffer: Buffer, structureField: StructureField) => string;
-export declare const parseDate: (buffer: Buffer) => Date;
-export declare const parseEnumValue: (enumObject: any, value: number | string) => string;
-export declare const parseEnumValues: (enumObject: any, value: number) => string[];
-export declare const parseList: (buffer: Buffer, parser: (entryBuffer: Buffer) => EntryType) => EntryType[];
-export declare const serializeStructure: (structure: Structure, data: any) => Buffer;
-export declare const serializeValue: (value: Value, structureField: StructureField) => Buffer;
-export declare const serializeDate: (date: Date) => Buffer;
-export declare const serializeString: (value: string, structureField: StructureField) => Buffer;
diff --git a/dist/protocol/structureUtil.js b/dist/protocol/structureUtil.js
deleted file mode 100644
index 67576ab..0000000
--- a/dist/protocol/structureUtil.js
+++ /dev/null
@@ -1,175 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.serializeString = exports.serializeDate = exports.serializeValue = exports.serializeStructure = exports.parseList = exports.parseEnumValues = exports.parseEnumValue = exports.parseDate = exports.parseString = exports.parseValue = exports.parseNumber = exports.parseStructure = void 0;
-const moment_timezone_1 = __importDefault(require("moment-timezone"));
-exports.parseStructure = (buffer, structure) => {
- let offset = 0;
- const data = {};
- const structureFieldNames = Object.keys(structure);
- for (const structureFieldName of structureFieldNames) {
- const structureField = structure[structureFieldName];
- let size;
- if (structureField.sizeFieldName) {
- size = data[structureField.sizeFieldName];
- if (typeof size === "undefined")
- throw new Error(`invalid_size_field_name: ${structureField.sizeFieldName}`);
- }
- else if (typeof structureField.size === "number") {
- size = structureField.size;
- }
- else
- throw new Error(`unknown_field_size`);
- structureField.count = typeof structureField.count === "number" ?
- structureField.count :
- 1;
- if (structureField.countFieldName) {
- structureField.count = data[structureField.countFieldName];
- if (typeof structureField.count === "undefined")
- throw new Error(`invalid_count_field_name: ${structureField.countFieldName}`);
- }
- const value = buffer.slice(offset, offset + (size * structureField.count));
- data[structureFieldName] = exports.parseValue(value, structureField);
- offset += size * structureField.count;
- }
- return data;
-};
-exports.parseNumber = (buffer, structureField) => {
- if (structureField.size === 2 && buffer.length === 2) {
- return structureField.signedness === "Unsigned" ?
- buffer.readUInt16LE(0) :
- buffer.readInt16LE(0);
- }
- if (structureField.size === 4 && buffer.length === 4) {
- return structureField.signedness === "Unsigned" ?
- buffer.readUInt32LE(0) :
- buffer.readInt32LE(0);
- }
- if (structureField.size === 8 && buffer.length === 8) {
- return structureField.signedness === "Unsigned" ?
- buffer.readBigUInt64LE(0) :
- buffer.readBigInt64LE(0);
- }
- let result = 0;
- for (let index = 0; index < buffer.length; index++) {
- result += buffer.readUInt8(index) << (index * 8);
- }
- return result;
-};
-exports.parseValue = (buffer, structureField) => {
- if (structureField.count > 1) {
- const entryBuffers = [];
- for (let index = 0; index < structureField.count; index++) {
- const entryBuffer = buffer.slice(index * structureField.size, (index + 1) * structureField.size);
- entryBuffers.push(entryBuffer);
- }
- return entryBuffers.map(entryBuffer => exports.parseValue(entryBuffer, { ...structureField, count: 1 }));
- }
- let value = buffer;
- if (structureField.type === String)
- value = exports.parseString(buffer, structureField);
- else if (structureField.type === Number)
- value = exports.parseNumber(buffer, structureField);
- return value;
-};
-exports.parseString = (buffer, structureField) => {
- return buffer.slice(0, structureField.size).toString(structureField.encoding);
-};
-exports.parseDate = (buffer) => {
- const milliseconds = Number(buffer.readBigUInt64LE(0) / 10000n);
- return moment_timezone_1.default.utc("1601-01-01").add(milliseconds, "milliseconds").toDate();
-};
-exports.parseEnumValue = (enumObject, value) => {
- return Object.keys(enumObject)
- .find(x => enumObject[x] === value);
-};
-exports.parseEnumValues = (enumObject, value) => {
- return Object.keys(enumObject)
- .filter(x => (enumObject[x] & value) !== 0);
-};
-exports.parseList = (buffer, parser) => {
- if (buffer.length === 0)
- return [];
- let currentOffset = 0;
- let nextEntryOffset = -1;
- const list = [];
- while (nextEntryOffset !== 0) {
- nextEntryOffset = buffer.readUInt32LE(currentOffset);
- const entryBufferStart = currentOffset + 4;
- const entryBufferEnd = nextEntryOffset === 0 ?
- buffer.length :
- currentOffset + nextEntryOffset;
- const entryBuffer = buffer.slice(entryBufferStart, entryBufferEnd);
- list.push(parser(entryBuffer));
- currentOffset += nextEntryOffset;
- }
- return list;
-};
-exports.serializeStructure = (structure, data) => {
- const normalizedData = {};
- const structureFieldNames = Object.keys(structure);
- for (const structureFieldName of structureFieldNames) {
- const structureField = structure[structureFieldName];
- const value = typeof data[structureFieldName] !== "undefined" ?
- data[structureFieldName] :
- structureField.defaultValue || 0;
- normalizedData[structureFieldName] = {};
- if (structureField.sizeFieldName) {
- structureField.size = Buffer.isBuffer(value) ?
- value.length :
- 0;
- const referencedStructureField = structure[structureField.sizeFieldName];
- normalizedData[structureField.sizeFieldName].value = exports.serializeValue(structureField.size, referencedStructureField);
- }
- structureField.count = typeof structureField.count === "number" ?
- structureField.count :
- 1;
- if (structureField.countFieldName) {
- structureField.count = Array.isArray(value) ?
- value.length :
- 0;
- const referencedStructureField = structure[structureField.countFieldName];
- normalizedData[structureField.countFieldName].value = exports.serializeValue(structureField.count, referencedStructureField);
- }
- normalizedData[structureFieldName].value = exports.serializeValue(value, structureField);
- normalizedData[structureFieldName].size = structureField.size * structureField.count;
- }
- const normalizedFields = structureFieldNames.map(x => normalizedData[x]);
- const bufferSize = normalizedFields.reduce((prev, current) => prev + current.size, 0);
- const buffer = Buffer.allocUnsafe(bufferSize);
- let offset = 0;
- for (const normalizedField of normalizedFields) {
- normalizedField.value.copy(buffer, offset);
- offset += normalizedField.size;
- }
- return buffer;
-};
-exports.serializeValue = (value, structureField) => {
- if (structureField.count > 1 && Array.isArray(value)) {
- const buffers = value.map(listEntry => exports.serializeValue(listEntry, { ...structureField, count: 1 }));
- return Buffer.concat(buffers);
- }
- if (Buffer.isBuffer(value))
- return value;
- if (typeof value === "string")
- return exports.serializeString(value, structureField);
- const bignumberValue = BigInt(value);
- const result = Buffer.allocUnsafe(structureField.size);
- for (let index = 0; index < structureField.size; index++) {
- const offset = BigInt(index * 8);
- const byte = 0xffn & (bignumberValue >> offset);
- result.writeUInt8(Number(byte), index);
- }
- return result;
-};
-exports.serializeDate = (date) => {
- const milliseconds = moment_timezone_1.default(date).diff(moment_timezone_1.default.utc("1601-01-01"), "milliseconds");
- const buffer = Buffer.allocUnsafe(8);
- buffer.writeBigInt64LE(BigInt(milliseconds) * 10000n, 0);
- return buffer;
-};
-exports.serializeString = (value, structureField) => {
- return Buffer.from(value, structureField.encoding);
-};
diff --git a/dist/protocol/util.d.ts b/dist/protocol/util.d.ts
deleted file mode 100644
index 78e6f76..0000000
--- a/dist/protocol/util.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-///
-export declare const toUnixFilePath: (value: string) => string;
-export declare const toWindowsFilePath: (value: string) => string;
-export declare const toUnixPath: (value: string) => string;
-export declare const toWindowsPath: (value: string) => string;
-export declare const getRandomInt: (min: number, max: number) => number;
-export declare const generateGuid: () => Buffer;
diff --git a/dist/protocol/util.js b/dist/protocol/util.js
deleted file mode 100644
index 9b2c31c..0000000
--- a/dist/protocol/util.js
+++ /dev/null
@@ -1,58 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.generateGuid = exports.getRandomInt = exports.toWindowsPath = exports.toUnixPath = exports.toWindowsFilePath = exports.toUnixFilePath = void 0;
-const crypto_1 = __importDefault(require("crypto"));
-exports.toUnixFilePath = (value) => {
- value = exports.toUnixPath(value);
- if (value[0] !== "/" && value[0] !== ".")
- value = `./${value}`;
- if (value[0] === "/")
- value = `.${value}`;
- return value;
-};
-exports.toWindowsFilePath = (value) => {
- if (value[0] === ".")
- value = value.substring(1);
- if (value[0] === "/")
- value = value.substring(1);
- value = exports.toWindowsPath(value);
- return value;
-};
-exports.toUnixPath = (value) => {
- value = value.replace(/\\/g, "/");
- return value;
-};
-exports.toWindowsPath = (value) => {
- value = value.replace(/\//g, "\\");
- return value;
-};
-exports.getRandomInt = (min, max) => {
- min = Math.ceil(min);
- max = Math.floor(max);
- return Math.floor(Math.random() * (max - min + 1)) + min;
-};
-exports.generateGuid = () => {
- const timeLow = exports.getRandomInt(0, Math.pow(2, 32) - 1);
- const timeMiddle = exports.getRandomInt(0, Math.pow(2, 16) - 1);
- const timeHighAndVersion = 0x4000 | exports.getRandomInt(0, Math.pow(2, 12) - 1);
- const clockSequenceHighAndReserved = 0x80 | exports.getRandomInt(0, Math.pow(2, 6) - 1);
- const clockSequenceLow = exports.getRandomInt(0, Math.pow(2, 8) - 1);
- const node = crypto_1.default.randomBytes(6);
- const buffer = Buffer.alloc(16);
- let offset = 0;
- buffer.writeUInt32LE(timeLow, offset);
- offset += 4;
- buffer.writeUInt16LE(timeMiddle, offset);
- offset += 2;
- buffer.writeUInt16LE(timeHighAndVersion, offset);
- offset += 2;
- buffer.writeUInt8(clockSequenceHighAndReserved, offset);
- offset += 1;
- buffer.writeUInt8(clockSequenceLow, offset);
- offset += 1;
- node.copy(buffer, offset);
- return buffer;
-};
diff --git a/dist/server/Client.d.ts b/dist/server/Client.d.ts
deleted file mode 100644
index 3b8a762..0000000
--- a/dist/server/Client.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-///
-import { Socket } from "net";
-import Server from "./Server";
-import { EventEmitter } from "events";
-import Request from "../protocol/Request";
-import Response from "../protocol/Response";
-import Dialect from "../protocol/smb2/Dialect";
-interface Client {
- on(event: "request", callback: (req: Request) => void): this;
- once(event: "request", callback: (req: Request) => void): this;
-}
-declare class Client extends EventEmitter {
- private server;
- private socket;
- private restChunk;
- targetDialect: Dialect;
- targetDialectName: string;
- constructor(server: Server, socket: Socket);
- setup(): void;
- private onData;
- send(response: Response): void;
-}
-export default Client;
diff --git a/dist/server/Client.js b/dist/server/Client.js
deleted file mode 100644
index 75b8c12..0000000
--- a/dist/server/Client.js
+++ /dev/null
@@ -1,64 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const events_1 = require("events");
-const SmbRequest_1 = __importDefault(require("./SmbRequest"));
-const Smb2Request_1 = __importDefault(require("./Smb2Request"));
-const Packet_1 = __importDefault(require("../protocol/Packet"));
-const protocolIds = __importStar(require("../protocol/protocolIds"));
-class Client extends events_1.EventEmitter {
- constructor(server, socket) {
- super();
- this.server = server;
- this.socket = socket;
- this.onData = (buffer) => {
- if (this.restChunk) {
- buffer = Buffer.concat([this.restChunk, buffer]);
- this.restChunk = undefined;
- }
- const { chunks, restChunk } = Packet_1.default.getChunks(buffer);
- this.restChunk = restChunk;
- for (const chunk of chunks) {
- const protocolId = Packet_1.default.parseProtocolId(chunk);
- if (protocolId === protocolIds.smb) {
- const request = SmbRequest_1.default.parse(chunk);
- this.emit("request", request);
- }
- else {
- const request = Smb2Request_1.default.parse(chunk);
- this.emit("request", request);
- }
- }
- };
- }
- setup() {
- this.socket.setNoDelay(true);
- this.socket.addListener("data", this.onData);
- }
- send(response) {
- const buffer = response.serialize();
- this.socket.write(buffer);
- }
-}
-exports.default = Client;
diff --git a/dist/server/Middleware.d.ts b/dist/server/Middleware.d.ts
deleted file mode 100644
index e321299..0000000
--- a/dist/server/Middleware.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import Request from "./Request";
-import Response from "./Response";
-declare type Middleware = (req: Request, res: Response) => void | Promise;
-export default Middleware;
diff --git a/dist/server/Middleware.js b/dist/server/Middleware.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/server/Middleware.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/server/Request.d.ts b/dist/server/Request.d.ts
deleted file mode 100644
index 9b89226..0000000
--- a/dist/server/Request.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import SmbRequest from "./SmbRequest";
-import Smb2Request from "./Smb2Request";
-declare type Request = SmbRequest | Smb2Request;
-export default Request;
diff --git a/dist/server/Request.js b/dist/server/Request.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/server/Request.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/server/Response.d.ts b/dist/server/Response.d.ts
deleted file mode 100644
index 2fd2efe..0000000
--- a/dist/server/Response.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import SmbResponse from "./SmbResponse";
-import Smb2Response from "./Smb2Response";
-declare type Response = SmbResponse | Smb2Response;
-export default Response;
diff --git a/dist/server/Response.js b/dist/server/Response.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/dist/server/Response.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/dist/server/Server.d.ts b/dist/server/Server.d.ts
deleted file mode 100644
index b976717..0000000
--- a/dist/server/Server.d.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-///
-import Client from "./Client";
-import Request from "./Request";
-import net from "net";
-import Middleware from "./Middleware";
-export default class Server {
- port: number;
- private clients;
- private server;
- startDate: Date;
- guid: Buffer;
- private middlewares;
- constructor();
- listen(port?: number): Promise;
- private onConnection;
- onRequest: (client: Client) => (req: Request) => Promise;
- initRequest(req: Request, client: Client): Request;
- handleRequest(req: Request): Promise;
- redirect(from: Request, to: Request): Promise;
- use(middleware: Middleware): void;
-}
diff --git a/dist/server/Server.js b/dist/server/Server.js
deleted file mode 100644
index 42a8d42..0000000
--- a/dist/server/Server.js
+++ /dev/null
@@ -1,122 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Client_1 = __importDefault(require("./Client"));
-const net_1 = __importDefault(require("net"));
-const moment_timezone_1 = __importDefault(require("moment-timezone"));
-const SmbResponse_1 = __importDefault(require("./SmbResponse"));
-const util = __importStar(require("../protocol/util"));
-const Smb2Response_1 = __importDefault(require("./Smb2Response"));
-const requestType_1 = __importDefault(require("./middlewares/requestType"));
-const protocolIds = __importStar(require("../protocol/protocolIds"));
-const PacketType_1 = __importDefault(require("../protocol/smb/PacketType"));
-const PacketType_2 = __importDefault(require("../protocol/smb2/PacketType"));
-const smbRequestHandlers = __importStar(require("./requestHandlers/smb"));
-const smb2RequestHandlers = __importStar(require("./requestHandlers/smb2"));
-const supportedProtocols_1 = __importDefault(require("./middlewares/supportedProtocols"));
-class Server {
- constructor() {
- this.clients = [];
- this.server = net_1.default.createServer();
- this.guid = util.generateGuid();
- this.middlewares = [];
- this.onConnection = (socket) => {
- const client = new Client_1.default(this, socket);
- client.on("request", this.onRequest(client));
- client.setup();
- this.clients.push(client);
- };
- this.onRequest = (client) => async (req) => {
- this.initRequest(req, client);
- await this.handleRequest(req);
- };
- this.use(supportedProtocols_1.default([protocolIds.smb, protocolIds.smb2]));
- const smb2RequestHandlerTypes = Object.keys(smb2RequestHandlers);
- for (const smb2RequestHandlerType of smb2RequestHandlerTypes) {
- const handler = requestType_1.default(protocolIds.smb2, PacketType_2.default[smb2RequestHandlerType], smb2RequestHandlers[smb2RequestHandlerType]);
- this.use(handler);
- }
- const smbRequestHandlerTypes = Object.keys(smbRequestHandlers);
- for (const smbRequestHandlerType of smbRequestHandlerTypes) {
- const handler = requestType_1.default(protocolIds.smb, PacketType_1.default[smbRequestHandlerType], smbRequestHandlers[smbRequestHandlerType]);
- this.use(handler);
- }
- this.server.addListener("connection", this.onConnection);
- }
- async listen(port = 445) {
- this.port = port;
- await new Promise((resolve) => {
- this.server.listen({ port }, () => {
- resolve();
- });
- });
- this.startDate = moment_timezone_1.default().toDate();
- return this.server;
- }
- initRequest(req, client) {
- req.server = this;
- req.client = client;
- return req;
- }
- async handleRequest(req) {
- let res;
- if (req.header.protocolId === protocolIds.smb) {
- const header = req.header;
- res = new SmbResponse_1.default({
- protocolId: header.protocolId,
- type: header.type,
- treeId: header.treeId,
- userId: header.userId
- });
- }
- else {
- const header = req.header;
- res = new Smb2Response_1.default({
- protocolId: header.protocolId,
- type: header.type,
- messageId: header.messageId,
- clientId: header.clientId,
- treeId: header.treeId,
- sessionId: header.sessionId,
- signature: header.signature
- });
- }
- req.response = res;
- for (const middleware of this.middlewares) {
- await middleware(req, res);
- if (res.sent)
- return req.client.send(res);
- if (res.redirectedReq)
- return await this.redirect(req, res.redirectedReq);
- }
- }
- async redirect(from, to) {
- this.initRequest(to, from.client);
- await this.handleRequest(to);
- }
- use(middleware) {
- this.middlewares.push(middleware);
- }
-}
-exports.default = Server;
diff --git a/dist/server/Smb2Request.d.ts b/dist/server/Smb2Request.d.ts
deleted file mode 100644
index d1ae2e4..0000000
--- a/dist/server/Smb2Request.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Client from "./Client";
-import Server from "./Server";
-import ProtocolSmb2Request from "../protocol/smb2/Request";
-export default class Smb2Request extends ProtocolSmb2Request {
- server?: Server;
- client?: Client;
-}
diff --git a/dist/server/Smb2Request.js b/dist/server/Smb2Request.js
deleted file mode 100644
index 2aa14d4..0000000
--- a/dist/server/Smb2Request.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Request_1 = __importDefault(require("../protocol/smb2/Request"));
-class Smb2Request extends Request_1.default {
-}
-exports.default = Smb2Request;
diff --git a/dist/server/Smb2Response.d.ts b/dist/server/Smb2Response.d.ts
deleted file mode 100644
index c87966e..0000000
--- a/dist/server/Smb2Response.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import Request from "./Request";
-import Value from "../protocol/Value";
-import ProtocolSmb2Response from "../protocol/smb2/Response";
-export default class Smb2Response extends ProtocolSmb2Response {
- sent: boolean;
- redirectedReq: Request;
- status(status: number): this;
- set(name: string, value: Value): void;
- send(data: any): void;
- redirect(req: Request): void;
-}
diff --git a/dist/server/Smb2Response.js b/dist/server/Smb2Response.js
deleted file mode 100644
index 340e528..0000000
--- a/dist/server/Smb2Response.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Response_1 = __importDefault(require("../protocol/smb2/Response"));
-class Smb2Response extends Response_1.default {
- constructor() {
- super(...arguments);
- this.sent = false;
- }
- status(status) {
- this.header.status = status;
- return this;
- }
- set(name, value) {
- this.header[name] = value;
- }
- send(data) {
- this.body = data;
- this.sent = true;
- }
- redirect(req) {
- this.redirectedReq = req;
- }
-}
-exports.default = Smb2Response;
diff --git a/dist/server/SmbRequest.d.ts b/dist/server/SmbRequest.d.ts
deleted file mode 100644
index 23776db..0000000
--- a/dist/server/SmbRequest.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Client from "./Client";
-import Server from "./Server";
-import ProtocolSmbRequest from "../protocol/smb/Request";
-export default class SmbRequest extends ProtocolSmbRequest {
- server?: Server;
- client?: Client;
-}
diff --git a/dist/server/SmbRequest.js b/dist/server/SmbRequest.js
deleted file mode 100644
index 4e356bc..0000000
--- a/dist/server/SmbRequest.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Request_1 = __importDefault(require("../protocol/smb/Request"));
-class SmbRequest extends Request_1.default {
-}
-exports.default = SmbRequest;
diff --git a/dist/server/SmbResponse.d.ts b/dist/server/SmbResponse.d.ts
deleted file mode 100644
index d1b13d8..0000000
--- a/dist/server/SmbResponse.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import Request from "./Request";
-import Value from "../protocol/Value";
-import ProtocolSmbResponse from "../protocol/smb/Response";
-export default class SmbResponse extends ProtocolSmbResponse {
- sent: boolean;
- redirectedReq: Request;
- status(status: number): this;
- set(name: string, value: Value): void;
- send(data: any): void;
- redirect(req: Request): void;
-}
diff --git a/dist/server/SmbResponse.js b/dist/server/SmbResponse.js
deleted file mode 100644
index 9f86bf4..0000000
--- a/dist/server/SmbResponse.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Response_1 = __importDefault(require("../protocol/smb/Response"));
-class SmbResponse extends Response_1.default {
- constructor() {
- super(...arguments);
- this.sent = false;
- }
- status(status) {
- this.header.status = status;
- return this;
- }
- set(name, value) {
- this.header[name] = value;
- }
- send(data) {
- this.body = data;
- this.sent = true;
- }
- redirect(req) {
- this.redirectedReq = req;
- }
-}
-exports.default = SmbResponse;
diff --git a/dist/server/middlewares/requestType.d.ts b/dist/server/middlewares/requestType.d.ts
deleted file mode 100644
index f5121e7..0000000
--- a/dist/server/middlewares/requestType.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import Request from "../Smb2Request";
-import Response from "../Smb2Response";
-import Middleware from "../Middleware";
-import PacketType from "../../protocol/smb2/PacketType";
-declare const _default: (protocolId: string, packetType: PacketType, middleware: Middleware) => (req: Request, res: Response) => Promise;
-export default _default;
diff --git a/dist/server/middlewares/requestType.js b/dist/server/middlewares/requestType.js
deleted file mode 100644
index 869588e..0000000
--- a/dist/server/middlewares/requestType.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = (protocolId, packetType, middleware) => async (req, res) => {
- if (req.header.protocolId === protocolId &&
- req.header.type === packetType)
- return await middleware(req, res);
-};
diff --git a/dist/server/middlewares/supportedProtocols.d.ts b/dist/server/middlewares/supportedProtocols.d.ts
deleted file mode 100644
index 056858b..0000000
--- a/dist/server/middlewares/supportedProtocols.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import Request from "../Smb2Request";
-import Response from "../Smb2Response";
-declare const _default: (supportedProtocols: string[]) => (req: Request, res: Response) => void;
-export default _default;
diff --git a/dist/server/middlewares/supportedProtocols.js b/dist/server/middlewares/supportedProtocols.js
deleted file mode 100644
index 94df33e..0000000
--- a/dist/server/middlewares/supportedProtocols.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = (supportedProtocols) => (req, res) => {
- if (!supportedProtocols.includes(req.header.protocolId))
- throw new Error(`protocol_not_supported: ${req.header.protocolId}`);
-};
diff --git a/dist/server/requestHandlers/smb/Negotiate.d.ts b/dist/server/requestHandlers/smb/Negotiate.d.ts
deleted file mode 100644
index 8191c1f..0000000
--- a/dist/server/requestHandlers/smb/Negotiate.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import Request from "../../SmbRequest";
-import Response from "../../SmbResponse";
-declare const _default: (req: Request, res: Response) => void;
-export default _default;
diff --git a/dist/server/requestHandlers/smb/Negotiate.js b/dist/server/requestHandlers/smb/Negotiate.js
deleted file mode 100644
index e7108f8..0000000
--- a/dist/server/requestHandlers/smb/Negotiate.js
+++ /dev/null
@@ -1,55 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const Smb2Request_1 = __importDefault(require("../../Smb2Request"));
-const Dialect_1 = __importDefault(require("../../../protocol/smb2/Dialect"));
-const protocolIds = __importStar(require("../../../protocol/protocolIds"));
-const PacketType_1 = __importDefault(require("../../../protocol/smb2/PacketType"));
-const supportedDialects = [
- "NT LM 0.12",
- "SMB 2.002",
- "SMB 2.???"
-];
-exports.default = (req, res) => {
- const dialects = req.body.dialects;
- const matchingDialects = dialects.filter(dialect => supportedDialects.indexOf(dialect) !== -1);
- if (matchingDialects.length === 0)
- throw new Error(`no_dialect_supported`);
- if (matchingDialects.find(x => x.startsWith("SMB 2."))) {
- const newReq = new Smb2Request_1.default({
- protocolId: protocolIds.smb2,
- type: PacketType_1.default.Negotiate
- }, {
- dialects: [
- Dialect_1.default.Smb210,
- Dialect_1.default.Smb202,
- Dialect_1.default.Smb2xx
- ]
- });
- res.redirect(newReq);
- }
- else {
- throw new Error("smb_not_implemented_yet");
- }
-};
diff --git a/dist/server/requestHandlers/smb/index.d.ts b/dist/server/requestHandlers/smb/index.d.ts
deleted file mode 100644
index 5bf0aa2..0000000
--- a/dist/server/requestHandlers/smb/index.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as Negotiate } from "./Negotiate";
diff --git a/dist/server/requestHandlers/smb/index.js b/dist/server/requestHandlers/smb/index.js
deleted file mode 100644
index 681730c..0000000
--- a/dist/server/requestHandlers/smb/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Negotiate = void 0;
-var Negotiate_1 = require("./Negotiate");
-Object.defineProperty(exports, "Negotiate", { enumerable: true, get: function () { return __importDefault(Negotiate_1).default; } });
diff --git a/dist/server/requestHandlers/smb2/Negotiate.d.ts b/dist/server/requestHandlers/smb2/Negotiate.d.ts
deleted file mode 100644
index a92ace1..0000000
--- a/dist/server/requestHandlers/smb2/Negotiate.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import Request from "../../Smb2Request";
-import Response from "../../Smb2Response";
-declare const _default: (req: Request, res: Response) => void;
-export default _default;
diff --git a/dist/server/requestHandlers/smb2/Negotiate.js b/dist/server/requestHandlers/smb2/Negotiate.js
deleted file mode 100644
index 2d01353..0000000
--- a/dist/server/requestHandlers/smb2/Negotiate.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const moment_timezone_1 = __importDefault(require("moment-timezone"));
-const StatusCode_1 = __importDefault(require("../../../protocol/smb2/StatusCode"));
-const Capability_1 = __importDefault(require("../../../protocol/smb2/Capability"));
-const Dialect_1 = __importDefault(require("../../../protocol/smb2/Dialect"));
-const Header_1 = require("../../../protocol/smb2/Header");
-const structureUtil = __importStar(require("../../../protocol/structureUtil"));
-const supportedDialects = [
- Dialect_1.default.Smb210,
- Dialect_1.default.Smb202,
- Dialect_1.default.Smb2xx
-];
-exports.default = (req, res) => {
- const dialects = req.body.dialects;
- const targetDialect = supportedDialects.find(supportedDialect => dialects.find(dialect => dialect === supportedDialect));
- const targetDialectName = structureUtil.parseEnumValue(Dialect_1.default, targetDialect);
- const securityBuffer = Buffer.alloc(0);
- res.status(StatusCode_1.default.Success);
- res.set("clientId", req.header.clientId);
- res.send({
- structureSize: 0x0041,
- securityMode: 0,
- dialectRevision: targetDialect,
- reserved: 0,
- serverGuid: req.server.guid,
- capabilities: Capability_1.default.DistributedFileSystem | Capability_1.default.MultiCreditSupport,
- maxTransactSize: 0x00100000,
- maxReadSize: 0x00100000,
- maxWriteSize: 0x00100000,
- systemTime: structureUtil.serializeDate(moment_timezone_1.default().toDate()),
- serverStartTime: structureUtil.serializeDate(req.server.startDate),
- securityBufferOffset: Header_1.headerSize + 64,
- securityBufferLength: securityBuffer.length,
- reserved2: 0,
- buffer: securityBuffer
- });
-};
diff --git a/dist/server/requestHandlers/smb2/SessionSetup.d.ts b/dist/server/requestHandlers/smb2/SessionSetup.d.ts
deleted file mode 100644
index a92ace1..0000000
--- a/dist/server/requestHandlers/smb2/SessionSetup.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import Request from "../../Smb2Request";
-import Response from "../../Smb2Response";
-declare const _default: (req: Request, res: Response) => void;
-export default _default;
diff --git a/dist/server/requestHandlers/smb2/SessionSetup.js b/dist/server/requestHandlers/smb2/SessionSetup.js
deleted file mode 100644
index dc6ef4f..0000000
--- a/dist/server/requestHandlers/smb2/SessionSetup.js
+++ /dev/null
@@ -1,96 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const ntlm = __importStar(require("../../../protocol/ntlm/util"));
-const StatusCode_1 = __importDefault(require("../../../protocol/smb2/StatusCode"));
-const NegotiateFlag_1 = __importDefault(require("../../../protocol/ntlm/NegotiateFlag"));
-exports.default = (req, res) => {
- // console.log(ntlm);
- // console.log(req.body);
- // console.log();
- console.log("SessionSetup");
- const decodedNtlmNegotiation = ntlm.decodeNegotiationMessage(req.body.buffer);
- // console.log(ntlmData);
- const ntlmChallengeNegotiationFlags = syncNegotiationFlags(decodedNtlmNegotiation.negotiateFlags);
- const encodedNtlmChallenge = ntlm.encodeChallengeMessage(ntlmChallengeNegotiationFlags);
- // console.log(encodedNtlmChallenge.toString("hex"));
- res.status(StatusCode_1.default.MoreProcessingRequired); // first session setup request (second success)
- res.set("clientId", req.header.clientId);
- res.send({
- structureSize: 9,
- sessionFlags: 0,
- securityBufferOffset: 72,
- securityBufferLength: 178,
- buffer: encodedNtlmChallenge
- });
-};
-const syncNegotiationFlags = (negotiationFlags) => {
- let challengeNegotiateFlags = NegotiateFlag_1.default.TargetTypeServer |
- NegotiateFlag_1.default.TargetInfo |
- NegotiateFlag_1.default.TargetNameSupplied |
- NegotiateFlag_1.default.Version;
- // [MS-NLMP] NTLMSSP_NEGOTIATE_NTLM MUST be set in the [..] CHALLENGE_MESSAGE to the client.
- challengeNegotiateFlags |= NegotiateFlag_1.default.NTLMSessionSecurity;
- if ((negotiationFlags & NegotiateFlag_1.default.UnicodeEncoding) > 0) {
- challengeNegotiateFlags |= NegotiateFlag_1.default.UnicodeEncoding;
- }
- else if ((negotiationFlags & NegotiateFlag_1.default.OemEncoding) > 0) {
- challengeNegotiateFlags |= NegotiateFlag_1.default.OemEncoding;
- }
- if ((negotiationFlags & NegotiateFlag_1.default.ExtendedSessionSecurity) > 0) {
- challengeNegotiateFlags |= NegotiateFlag_1.default.ExtendedSessionSecurity;
- }
- else if ((negotiationFlags & NegotiateFlag_1.default.LanManagerSessionKey) > 0) {
- challengeNegotiateFlags |= NegotiateFlag_1.default.LanManagerSessionKey;
- }
- if ((negotiationFlags & NegotiateFlag_1.default.Sign) > 0) {
- // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_SIGN to the server in the NEGOTIATE_MESSAGE,
- // the server MUST return NTLMSSP_NEGOTIATE_SIGN to the client in the CHALLENGE_MESSAGE.
- challengeNegotiateFlags |= NegotiateFlag_1.default.Sign;
- }
- if ((negotiationFlags & NegotiateFlag_1.default.Seal) > 0) {
- // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_SEAL to the server in the NEGOTIATE_MESSAGE,
- // the server MUST return NTLMSSP_NEGOTIATE_SEAL to the client in the CHALLENGE_MESSAGE.
- challengeNegotiateFlags |= NegotiateFlag_1.default.Seal;
- }
- if ((negotiationFlags & NegotiateFlag_1.default.Sign) > 0 ||
- (negotiationFlags & NegotiateFlag_1.default.Seal) > 0) {
- if ((negotiationFlags & NegotiateFlag_1.default.Use56BitEncryption) > 0) {
- // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_SEAL or NTLMSSP_NEGOTIATE_SIGN with
- // NTLMSSP_NEGOTIATE_56 to the server in the NEGOTIATE_MESSAGE, the server MUST return
- // NTLMSSP_NEGOTIATE_56 to the client in the CHALLENGE_MESSAGE.
- challengeNegotiateFlags |= NegotiateFlag_1.default.Use56BitEncryption;
- }
- if ((negotiationFlags & NegotiateFlag_1.default.Use128BitEncryption) > 0) {
- // [MS-NLMP] If the client sends NTLMSSP_NEGOTIATE_128 to the server in the NEGOTIATE_MESSAGE,
- // the server MUST return NTLMSSP_NEGOTIATE_128 to the client in the CHALLENGE_MESSAGE only if
- // the client sets NTLMSSP_NEGOTIATE_SEAL or NTLMSSP_NEGOTIATE_SIGN.
- challengeNegotiateFlags |= NegotiateFlag_1.default.Use128BitEncryption;
- }
- }
- if ((negotiationFlags & NegotiateFlag_1.default.KeyExchange) > 0) {
- challengeNegotiateFlags |= NegotiateFlag_1.default.KeyExchange;
- }
- return challengeNegotiateFlags;
-};
diff --git a/dist/server/requestHandlers/smb2/index.d.ts b/dist/server/requestHandlers/smb2/index.d.ts
deleted file mode 100644
index 841174b..0000000
--- a/dist/server/requestHandlers/smb2/index.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { default as Negotiate } from "./Negotiate";
-export { default as SessionSetup } from "./SessionSetup";
diff --git a/dist/server/requestHandlers/smb2/index.js b/dist/server/requestHandlers/smb2/index.js
deleted file mode 100644
index de583d4..0000000
--- a/dist/server/requestHandlers/smb2/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SessionSetup = exports.Negotiate = void 0;
-var Negotiate_1 = require("./Negotiate");
-Object.defineProperty(exports, "Negotiate", { enumerable: true, get: function () { return __importDefault(Negotiate_1).default; } });
-var SessionSetup_1 = require("./SessionSetup");
-Object.defineProperty(exports, "SessionSetup", { enumerable: true, get: function () { return __importDefault(SessionSetup_1).default; } });
From f39d463241167f0b78f10cb206d37b3a4602f445 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:03:19 +0000
Subject: [PATCH 11/42] single quotes
---
src/protocol/ntlm/util.ts | 128 +++++++++++++++++++-------------------
1 file changed, 64 insertions(+), 64 deletions(-)
diff --git a/src/protocol/ntlm/util.ts b/src/protocol/ntlm/util.ts
index 37094b0..d9b44d7 100644
--- a/src/protocol/ntlm/util.ts
+++ b/src/protocol/ntlm/util.ts
@@ -1,19 +1,19 @@
-import crypto from 'crypto';
-import desjs from 'des.js';
-import jsmd4 from 'js-md4';
-import NegotiateFlag from './NegotiateFlag';
+import crypto from "crypto";
+import desjs from "des.js";
+import jsmd4 from "js-md4";
+import NegotiateFlag from "./NegotiateFlag";
export const encodeNegotiationMessage = (hostname: string, domain: string) => {
hostname = hostname.toUpperCase();
domain = domain.toUpperCase();
- const hostnameLength = Buffer.byteLength(hostname, 'ascii');
- const domainLength = Buffer.byteLength(domain, 'ascii');
+ const hostnameLength = Buffer.byteLength(hostname, "ascii");
+ const domainLength = Buffer.byteLength(domain, "ascii");
let offset = 0;
const buffer = Buffer.alloc(32 + hostnameLength + domainLength);
- buffer.write('NTLMSSP', offset, 7, 'ascii');
+ buffer.write("NTLMSSP", offset, 7, "ascii");
offset += 7;
buffer.writeUInt8(0, offset);
offset += 1;
@@ -45,8 +45,8 @@ export const encodeNegotiationMessage = (hostname: string, domain: string) => {
buffer.writeUInt32LE(0x20, offset);
offset += 4;
- buffer.write(hostname, 0x20, hostnameLength, 'ascii');
- buffer.write(domain, domainOffset, domainLength, 'ascii');
+ buffer.write(hostname, 0x20, hostnameLength, "ascii");
+ buffer.write(domain, domainOffset, domainLength, "ascii");
return buffer;
};
@@ -54,13 +54,13 @@ export const encodeNegotiationMessage = (hostname: string, domain: string) => {
export const decodeNegotiationMessage = (buffer: Buffer) => {
let offset = 0;
- const protocol = buffer.slice(0, 7).toString('ascii');
- if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
- throw new Error('ntlmssp_header_not_found');
+ const protocol = buffer.slice(0, 7).toString("ascii");
+ if (protocol !== "NTLMSSP" || buffer.readInt8(7) !== 0x00)
+ throw new Error("ntlmssp_header_not_found");
offset += 8;
const type = buffer.readUInt32LE(offset);
- if (type !== 0x01) throw new Error('ntlmssp_type_is_not_one');
+ if (type !== 0x01) throw new Error("ntlmssp_type_is_not_one");
offset += 4;
const negotiateFlags = buffer.readUInt32LE(offset);
@@ -82,15 +82,15 @@ export const decodeNegotiationMessage = (buffer: Buffer) => {
const domain = buffer
.slice(domainOffset, domainOffset + domainLength)
- .toString('ascii');
+ .toString("ascii");
const hostname = buffer
.slice(hostnameOffset, hostnameOffset + hostnameLength)
- .toString('ascii');
+ .toString("ascii");
return {
negotiateFlags,
domain,
- hostname
+ hostname,
};
};
@@ -98,7 +98,7 @@ export const encodeChallengeMessage = (negotiateFlags: number) => {
let offset = 0;
const buffer = Buffer.alloc(64);
- buffer.write('NTLMSSP', offset, 7, 'ascii');
+ buffer.write("NTLMSSP", offset, 7, "ascii");
offset += 7;
buffer.writeUInt8(0, offset);
offset += 1;
@@ -130,13 +130,13 @@ export const encodeChallengeMessage = (negotiateFlags: number) => {
export const decodeChallengeMessage = (buffer: Buffer) => {
let offset = 0;
- const protocol = buffer.slice(0, 7).toString('ascii');
- if (protocol !== 'NTLMSSP' || buffer.readInt8(7) !== 0x00)
- throw new Error('ntlmssp_header_not_found');
+ const protocol = buffer.slice(0, 7).toString("ascii");
+ if (protocol !== "NTLMSSP" || buffer.readInt8(7) !== 0x00)
+ throw new Error("ntlmssp_header_not_found");
offset += 8;
const type = buffer.readUInt32LE(offset);
- if (type !== 0x02) throw new Error('ntlmssp_type_is_not_two');
+ if (type !== 0x02) throw new Error("ntlmssp_type_is_not_two");
offset += 4;
const targetNameLength = buffer.readUInt16LE(offset);
@@ -180,9 +180,9 @@ export const encodeAuthenticationMessage = (
const lmResponse = createResponse(lmHash, nonce);
const ntResponse = createResponse(ntHash, nonce);
- const usernameLength = Buffer.byteLength(username, 'ucs2');
- const hostnameLength = Buffer.byteLength(hostname, 'ucs2');
- const domainLength = Buffer.byteLength(domain, 'ucs2');
+ const usernameLength = Buffer.byteLength(username, "ucs2");
+ const hostnameLength = Buffer.byteLength(hostname, "ucs2");
+ const domainLength = Buffer.byteLength(domain, "ucs2");
const lmResponseLength = 0x18;
const ntResponseLength = 0x18;
@@ -202,7 +202,7 @@ export const encodeAuthenticationMessage = (
ntResponseLength;
const buffer = Buffer.alloc(messageLength);
- buffer.write('NTLMSSP', offset, 7, 'ascii'); // byte protocol[8];
+ buffer.write("NTLMSSP", offset, 7, "ascii"); // byte protocol[8];
offset += 7;
buffer.writeUInt8(0, offset);
offset++;
@@ -270,9 +270,9 @@ export const encodeAuthenticationMessage = (
buffer.writeUInt32LE(negotiateFlags, offset);
offset += 4;
- buffer.write(domain, domainOffset, domainLength, 'ucs2');
- buffer.write(username, usernameOffset, usernameLength, 'ucs2');
- buffer.write(hostname, hostnameOffset, hostnameLength, 'ucs2');
+ buffer.write(domain, domainOffset, domainLength, "ucs2");
+ buffer.write(username, usernameOffset, usernameLength, "ucs2");
+ buffer.write(hostname, hostnameOffset, hostnameLength, "ucs2");
lmResponse.copy(buffer, lmResponseOffset, 0, lmResponseLength);
ntResponse.copy(buffer, ntResponseOffset, 0, ntResponseLength);
@@ -300,10 +300,10 @@ const bytes2binaryArray = (buf: Buffer): number[] => {
C: [1, 1, 0, 0],
D: [1, 1, 0, 1],
E: [1, 1, 1, 0],
- F: [1, 1, 1, 1]
+ F: [1, 1, 1, 1],
};
- const hexString = buf.toString('hex').toUpperCase();
+ const hexString = buf.toString("hex").toUpperCase();
let array: number[] = [];
for (let i = 0; i < hexString.length; i++) {
const hexchar = hexString.charAt(i);
@@ -314,22 +314,22 @@ const bytes2binaryArray = (buf: Buffer): number[] => {
const binaryArray2bytes = (array: number[]): Buffer => {
const binary2hex = {
- '0000': 0,
- '0001': 1,
- '0010': 2,
- '0011': 3,
- '0100': 4,
- '0101': 5,
- '0110': 6,
- '0111': 7,
- '1000': 8,
- '1001': 9,
- '1010': 'A',
- '1011': 'B',
- '1100': 'C',
- '1101': 'D',
- '1110': 'E',
- '1111': 'F'
+ "0000": 0,
+ "0001": 1,
+ "0010": 2,
+ "0011": 3,
+ "0100": 4,
+ "0101": 5,
+ "0110": 6,
+ "0111": 7,
+ "1000": 8,
+ "1001": 9,
+ "1010": "A",
+ "1011": "B",
+ "1100": "C",
+ "1101": "D",
+ "1110": "E",
+ "1111": "F",
};
const bufArray: Buffer[] = [];
@@ -338,20 +338,20 @@ const binaryArray2bytes = (array: number[]): Buffer => {
if (i + 7 > array.length) break;
const binString1 =
- '' + array[i] + '' + array[i + 1] + '' + array[i + 2] + '' + array[i + 3];
+ "" + array[i] + "" + array[i + 1] + "" + array[i + 2] + "" + array[i + 3];
const binString2 =
- '' +
+ "" +
array[i + 4] +
- '' +
+ "" +
array[i + 5] +
- '' +
+ "" +
array[i + 6] +
- '' +
+ "" +
array[i + 7];
const hexchar1 = binary2hex[binString1];
const hexchar2 = binary2hex[binString2];
- const buf = Buffer.from(hexchar1 + '' + hexchar2, 'hex');
+ const buf = Buffer.from(hexchar1 + "" + hexchar2, "hex");
bufArray.push(buf);
}
@@ -374,10 +374,10 @@ const insertZerosEvery7Bits = (buf: Buffer): Buffer => {
const createLmHash = (password: string): Buffer => {
// fix the password length to 14 bytes
password = password.toUpperCase();
- const passwordBytes = Buffer.from(password, 'ascii');
+ const passwordBytes = Buffer.from(password, "ascii");
const passwordBytesPadded = Buffer.alloc(14);
- passwordBytesPadded.fill('\0');
+ passwordBytesPadded.fill("\0");
let sourceEnd = 14;
if (passwordBytes.length < 14) sourceEnd = passwordBytes.length;
passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd);
@@ -388,8 +388,8 @@ const createLmHash = (password: string): Buffer => {
function encrypt(buf) {
const key = insertZerosEvery7Bits(buf);
- const des = desjs.DES.create({ type: 'encrypt', key: key });
- const magicKey = Buffer.from('KGS!@#$%', 'ascii'); // page 57 in [MS-NLMP]
+ const des = desjs.DES.create({ type: "encrypt", key: key });
+ const magicKey = Buffer.from("KGS!@#$%", "ascii"); // page 57 in [MS-NLMP]
const encrypted = des.update(magicKey);
return Buffer.from(encrypted);
}
@@ -401,7 +401,7 @@ const createLmHash = (password: string): Buffer => {
};
const createNtHash = (password: string): Buffer => {
- const buf = Buffer.from(password, 'utf16le');
+ const buf = Buffer.from(password, "utf16le");
const md4 = jsmd4.create();
md4.update(buf);
return Buffer.from(md4.digest());
@@ -410,26 +410,26 @@ const createNtHash = (password: string): Buffer => {
const createResponse = (hash: Buffer, nonce: Buffer) => {
// padding with zeros to make the hash 21 bytes long
const passHashPadded = Buffer.alloc(21);
- passHashPadded.fill('\0');
+ passHashPadded.fill("\0");
hash.copy(passHashPadded, 0, 0, hash.length);
const resArray = [];
const des1 = desjs.DES.create({
- type: 'encrypt',
- key: insertZerosEvery7Bits(passHashPadded.slice(0, 7))
+ type: "encrypt",
+ key: insertZerosEvery7Bits(passHashPadded.slice(0, 7)),
});
resArray.push(Buffer.from(des1.update(nonce.slice(0, 8))));
const des2 = desjs.DES.create({
- type: 'encrypt',
- key: insertZerosEvery7Bits(passHashPadded.slice(7, 14))
+ type: "encrypt",
+ key: insertZerosEvery7Bits(passHashPadded.slice(7, 14)),
});
resArray.push(Buffer.from(des2.update(nonce.slice(0, 8))));
const des3 = desjs.DES.create({
- type: 'encrypt',
- key: insertZerosEvery7Bits(passHashPadded.slice(14, 21))
+ type: "encrypt",
+ key: insertZerosEvery7Bits(passHashPadded.slice(14, 21)),
});
resArray.push(Buffer.from(des3.update(nonce.slice(0, 8))));
From cb933894e054870a6c26bcd0f2590940ba52c1d6 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:06:46 +0000
Subject: [PATCH 12/42] reverted style changes
---
src/protocol/ntlm/util.ts | 53 ++++++++++++---------------------------
1 file changed, 16 insertions(+), 37 deletions(-)
diff --git a/src/protocol/ntlm/util.ts b/src/protocol/ntlm/util.ts
index d9b44d7..5e6f7b0 100644
--- a/src/protocol/ntlm/util.ts
+++ b/src/protocol/ntlm/util.ts
@@ -21,10 +21,7 @@ export const encodeNegotiationMessage = (hostname: string, domain: string) => {
buffer.writeUInt32LE(1, offset);
offset += 4;
- const negotiateFlags =
- NegotiateFlag.UnicodeEncoding |
- NegotiateFlag.NTLMSessionSecurity |
- NegotiateFlag.AlwaysSign;
+ const negotiateFlags = NegotiateFlag.UnicodeEncoding | NegotiateFlag.NTLMSessionSecurity | NegotiateFlag.AlwaysSign;
buffer.writeUInt32LE(negotiateFlags, offset);
offset += 4;
@@ -55,8 +52,10 @@ export const decodeNegotiationMessage = (buffer: Buffer) => {
let offset = 0;
const protocol = buffer.slice(0, 7).toString("ascii");
- if (protocol !== "NTLMSSP" || buffer.readInt8(7) !== 0x00)
- throw new Error("ntlmssp_header_not_found");
+ if (
+ protocol !== "NTLMSSP" ||
+ buffer.readInt8(7) !== 0x00
+ ) throw new Error("ntlmssp_header_not_found");
offset += 8;
const type = buffer.readUInt32LE(offset);
@@ -80,17 +79,13 @@ export const decodeNegotiationMessage = (buffer: Buffer) => {
const hostnameOffset = buffer.readUInt32LE(offset);
offset += 4;
- const domain = buffer
- .slice(domainOffset, domainOffset + domainLength)
- .toString("ascii");
- const hostname = buffer
- .slice(hostnameOffset, hostnameOffset + hostnameLength)
- .toString("ascii");
+ const domain = buffer.slice(domainOffset, domainOffset + domainLength).toString("ascii");
+ const hostname = buffer.slice(hostnameOffset, hostnameOffset + hostnameLength).toString("ascii");
return {
negotiateFlags,
domain,
- hostname,
+ hostname
};
};
@@ -131,8 +126,10 @@ export const decodeChallengeMessage = (buffer: Buffer) => {
let offset = 0;
const protocol = buffer.slice(0, 7).toString("ascii");
- if (protocol !== "NTLMSSP" || buffer.readInt8(7) !== 0x00)
- throw new Error("ntlmssp_header_not_found");
+ if (
+ protocol !== "NTLMSSP" ||
+ buffer.readInt8(7) !== 0x00
+ ) throw new Error("ntlmssp_header_not_found");
offset += 8;
const type = buffer.readUInt32LE(offset);
@@ -159,13 +156,7 @@ export const decodeChallengeMessage = (buffer: Buffer) => {
return serverChallenge;
};
-export const encodeAuthenticationMessage = (
- username: string,
- hostname: string,
- domain: string,
- nonce: Buffer,
- password: string
-) => {
+export const encodeAuthenticationMessage = (username: string, hostname: string, domain: string, nonce: Buffer, password: string) => {
hostname = hostname.toUpperCase();
domain = domain.toUpperCase();
@@ -193,13 +184,7 @@ export const encodeAuthenticationMessage = (
const ntResponseOffset = lmResponseOffset + lmResponseLength;
let offset = 0;
- const messageLength =
- 64 +
- domainLength +
- usernameLength +
- hostnameLength +
- lmResponseLength +
- ntResponseLength;
+ const messageLength = 64 + domainLength + usernameLength + hostnameLength + lmResponseLength + ntResponseLength;
const buffer = Buffer.alloc(messageLength);
buffer.write("NTLMSSP", offset, 7, "ascii"); // byte protocol[8];
@@ -263,10 +248,7 @@ export const encodeAuthenticationMessage = (
buffer.fill(0x00, offset, offset + 2); // byte zero[2];
offset += 2;
- const negotiateFlags =
- NegotiateFlag.UnicodeEncoding |
- NegotiateFlag.NTLMSessionSecurity |
- NegotiateFlag.AlwaysSign;
+ const negotiateFlags = NegotiateFlag.UnicodeEncoding | NegotiateFlag.NTLMSessionSecurity | NegotiateFlag.AlwaysSign;
buffer.writeUInt32LE(negotiateFlags, offset);
offset += 4;
@@ -372,7 +354,6 @@ const insertZerosEvery7Bits = (buf: Buffer): Buffer => {
};
const createLmHash = (password: string): Buffer => {
- // fix the password length to 14 bytes
password = password.toUpperCase();
const passwordBytes = Buffer.from(password, "ascii");
@@ -382,14 +363,13 @@ const createLmHash = (password: string): Buffer => {
if (passwordBytes.length < 14) sourceEnd = passwordBytes.length;
passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd);
- // split into 2 parts of 7 bytes:
const firstPart = passwordBytesPadded.slice(0, 7);
const secondPart = passwordBytesPadded.slice(7);
function encrypt(buf) {
const key = insertZerosEvery7Bits(buf);
const des = desjs.DES.create({ type: "encrypt", key: key });
- const magicKey = Buffer.from("KGS!@#$%", "ascii"); // page 57 in [MS-NLMP]
+ const magicKey = Buffer.from("KGS!@#$%", "ascii");
const encrypted = des.update(magicKey);
return Buffer.from(encrypted);
}
@@ -408,7 +388,6 @@ const createNtHash = (password: string): Buffer => {
};
const createResponse = (hash: Buffer, nonce: Buffer) => {
- // padding with zeros to make the hash 21 bytes long
const passHashPadded = Buffer.alloc(21);
passHashPadded.fill("\0");
hash.copy(passHashPadded, 0, 0, hash.length);
From 0c1df7011584396eeeef1da42564aedf0e105719 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:11:04 +0000
Subject: [PATCH 13/42] docs changes
---
README.md | 11 +++--------
package.json | 12 ++++++------
2 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/README.md b/README.md
index 27b498a..1254429 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,15 @@
-# @stifani/smb2
+# @awo00/smb2
> A SMB2 implementation in TypeScript.
-[](https://github.com/ardean/smb2)
-[](https://npmjs.org/package/@stifani/smb2)
-[](https://npmjs.org/package/@stifani/smb2)
-[](LICENSE.md)
-
## Installation
```sh
-$ npm i @stifani/smb2
+$ npm i @awo00/smb2
```
## Usage
```ts
-import smb2 from "@stifani/smb2";
+import smb2 from "@awo00/smb2";
const client = new smb2.Client(host);
const session = await client.authenticate({
diff --git a/package.json b/package.json
index f66118c..1ea4e67 100644
--- a/package.json
+++ b/package.json
@@ -1,16 +1,16 @@
{
- "name": "@stifani/smb2",
+ "name": "@awo00/smb2",
"description": "A SMB2 implementation in TypeScript",
- "repository": "https://github.com/ardean/smb2",
- "bugs": "https://github.com/ardean/smb2/issues",
- "version": "0.3.0",
+ "repository": "https://github.com/awo00/smb2",
+ "bugs": "https://github.com/awo00/smb2/issues",
+ "version": "0.4.0",
"author": "ardean",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
"scripts": {
"start": "nodemon",
- "build": "rm -rf dist && tsc",
+ "build": "tsc --build",
"lint": "tslint --project ."
},
"files": [
@@ -26,7 +26,7 @@
"file-sharing"
],
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
},
"dependencies": {
"moment-timezone": "^0.5.31"
From 4daa2d7cbbf54c8e986057e670fc5a392dc9d401 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:15:36 +0000
Subject: [PATCH 14/42] release workflow
---
.github/workflows/release.yml | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
create mode 100644 .github/workflows/release.yml
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..62b2dc5
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,31 @@
+name: Build and Publish to Github Packages
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ packages: write
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ # Make sure the actual branch is checked out when running on pull requests
+ ref: ${{ github.head_ref }}
+ token: ${{ secrets.PAT_WRITE }}
+ - name: Setup Node
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18
+ registry-url: 'https://npm.pkg.github.com'
+ scope: '@awo00'
+ - name: Install Dependencies
+ run: npm ci
+ - name: Publish package
+ run: npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
From 331ce7746593b85b6eb3d39536d35ae8f5549a28 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:22:25 +0000
Subject: [PATCH 15/42] fix pkg lock
---
package-lock.json | 123 +++++++++++-----------------------------------
1 file changed, 28 insertions(+), 95 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index c6b4e33..f9b78ab 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,21 +1,19 @@
{
"name": "@awo00/smb2",
- "version": "0.3.0",
+ "version": "0.4.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.3.0",
+ "version": "0.4.0",
"license": "MIT",
"dependencies": {
- "des.js": "^1.1.0",
- "js-md4": "^0.3.2",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
- "@types/node": "^13.13.52",
- "nodemon": "^3.0.2",
+ "@types/node": "^13.7.4",
+ "nodemon": "^2.0.4",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
"typescript": "^4.0.3"
@@ -223,29 +221,12 @@
"dev": true
},
"node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/des.js": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
- "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
- "dependencies": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
+ "ms": "^2.1.1"
}
},
"node_modules/diff": {
@@ -371,7 +352,8 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
},
"node_modules/is-binary-path": {
"version": "2.1.0",
@@ -415,11 +397,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/js-md4": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz",
- "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -439,29 +416,12 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -516,24 +476,24 @@
}
},
"node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/nodemon": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz",
- "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==",
+ "version": "2.0.22",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
+ "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
"dev": true,
"dependencies": {
"chokidar": "^3.5.2",
- "debug": "^4",
+ "debug": "^3.2.7",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"pstree.remy": "^1.1.8",
- "semver": "^7.5.3",
- "simple-update-notifier": "^2.0.0",
+ "semver": "^5.7.1",
+ "simple-update-notifier": "^1.0.7",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
@@ -542,28 +502,13 @@
"nodemon": "bin/nodemon.js"
},
"engines": {
- "node": ">=10"
+ "node": ">=8.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
- "node_modules/nodemon/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
@@ -664,30 +609,24 @@
}
},
"node_modules/simple-update-notifier": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
- "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
+ "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
"dev": true,
"dependencies": {
- "semver": "^7.5.3"
+ "semver": "~7.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8.10.0"
}
},
"node_modules/simple-update-notifier/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/source-map": {
@@ -850,12 +789,6 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
From d49b5e9d081d973f272c60f3b90159f7fea155c0 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:26:44 +0000
Subject: [PATCH 16/42] update readme
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 1254429..65e1a25 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,8 @@
> A SMB2 implementation in TypeScript.
+Forked from https://github.com/ardean/smb2 using code from https://github.com/SamDecrock/node-http-ntlm to fix Node 17+ OpenSSL error to prevent having to use legacy support.
+
## Installation
```sh
$ npm i @awo00/smb2
From 610bb07a8db517f6eaac9483dcfe2d73b22e468f Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 15:27:18 +0000
Subject: [PATCH 17/42] bump version
---
package-lock.json | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index f9b78ab..5bc98e3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@awo00/smb2",
- "version": "0.4.0",
+ "version": "0.4.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.4.0",
+ "version": "0.4.1",
"license": "MIT",
"dependencies": {
"moment-timezone": "^0.5.31"
diff --git a/package.json b/package.json
index 1ea4e67..7f236f3 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.4.0",
+ "version": "0.4.1",
"author": "ardean",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From 199c8c291fbc8d3c6aa68e7861f50d5d0e586e83 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 16:21:58 +0000
Subject: [PATCH 18/42] publish to npmjs
---
.github/workflows/release.yml | 31 +++++++++++--------------------
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 14 insertions(+), 23 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 62b2dc5..38459c6 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,31 +1,22 @@
-name: Build and Publish to Github Packages
-
+name: Publish Package to npmjs
on:
release:
types: [published]
-
jobs:
- publish:
+ build:
runs-on: ubuntu-latest
- permissions:
- contents: write
- packages: write
steps:
- - name: Checkout
- uses: actions/checkout@v3
+ - uses: actions/checkout@v4
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.head_ref }}
- token: ${{ secrets.PAT_WRITE }}
- - name: Setup Node
- uses: actions/setup-node@v3
+ token: ${{ secrets.GITHUB_TOKEN }}
+ # Setup .npmrc file to publish to npm
+ - uses: actions/setup-node@v3
with:
- node-version: 18
- registry-url: 'https://npm.pkg.github.com'
- scope: '@awo00'
- - name: Install Dependencies
- run: npm ci
- - name: Publish package
- run: npm publish
+ node-version: '18.x'
+ registry-url: 'https://registry.npmjs.org'
+ - run: npm ci
+ - run: npm publish --access public
env:
- NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.NPMJS_PAT }}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 5bc98e3..1428226 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@awo00/smb2",
- "version": "0.4.1",
+ "version": "0.4.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.4.1",
+ "version": "0.4.2",
"license": "MIT",
"dependencies": {
"moment-timezone": "^0.5.31"
diff --git a/package.json b/package.json
index 7f236f3..09c5f16 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.4.1",
+ "version": "0.4.2",
"author": "ardean",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From 5e6f91f0110231fcb4d8a0f313681e3f2be67094 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 16:23:48 +0000
Subject: [PATCH 19/42] update author
---
package-lock.json | 4 ++--
package.json | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 1428226..2e9be79 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@awo00/smb2",
- "version": "0.4.2",
+ "version": "0.4.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.4.2",
+ "version": "0.4.3",
"license": "MIT",
"dependencies": {
"moment-timezone": "^0.5.31"
diff --git a/package.json b/package.json
index 09c5f16..378acbe 100644
--- a/package.json
+++ b/package.json
@@ -3,8 +3,8 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.4.2",
- "author": "ardean",
+ "version": "0.4.3",
+ "author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
From e75d93066e7adf606013072116d94fe0bba35365 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 16:31:27 +0000
Subject: [PATCH 20/42] add build step
---
.github/workflows/release.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 38459c6..8cbc325 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -17,6 +17,7 @@ jobs:
node-version: '18.x'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
+ - run: tsc --build
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPMJS_PAT }}
\ No newline at end of file
From faaeb9dd122a198b1199c92c705ca3b70ba89a24 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 16:39:39 +0000
Subject: [PATCH 21/42] added types
---
src/types/des.js.d.ts | 10 ++++++++++
src/types/js-md4.d.ts | 9 +++++++++
2 files changed, 19 insertions(+)
create mode 100644 src/types/des.js.d.ts
create mode 100644 src/types/js-md4.d.ts
diff --git a/src/types/des.js.d.ts b/src/types/des.js.d.ts
new file mode 100644
index 0000000..93967cb
--- /dev/null
+++ b/src/types/des.js.d.ts
@@ -0,0 +1,10 @@
+declare module 'des.js' {
+
+ interface Des {
+ update(message: string | Buffer): number[];
+ }
+
+ export const DES: {
+ create(options: { type: 'encrypt', key: Buffer }): Des;
+ }
+}
\ No newline at end of file
diff --git a/src/types/js-md4.d.ts b/src/types/js-md4.d.ts
new file mode 100644
index 0000000..9dd4397
--- /dev/null
+++ b/src/types/js-md4.d.ts
@@ -0,0 +1,9 @@
+declare module 'js-md4' {
+
+ class MD4 {
+ update(message: Buffer): this;
+ digest(): number[];
+ }
+
+ export function create(): MD4;
+}
\ No newline at end of file
From c498c2c7ec541321e9033998e71bec6f3b6d3d68 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 16:52:26 +0000
Subject: [PATCH 22/42] fix type errors
---
src/protocol/smb2/Request.ts | 3 +--
src/protocol/smb2/Response.ts | 3 +--
src/protocol/structureUtil.ts | 1 +
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/protocol/smb2/Request.ts b/src/protocol/smb2/Request.ts
index 0ebaf99..d2c7e24 100644
--- a/src/protocol/smb2/Request.ts
+++ b/src/protocol/smb2/Request.ts
@@ -3,8 +3,7 @@ import Packet from "./Packet";
import ProtocolRequest from "../Request";
export default class Request extends ProtocolRequest {
- header: Header;
-
+ declare header: Header;
typeName: string;
data: any;
diff --git a/src/protocol/smb2/Response.ts b/src/protocol/smb2/Response.ts
index ba299fe..0757667 100644
--- a/src/protocol/smb2/Response.ts
+++ b/src/protocol/smb2/Response.ts
@@ -4,8 +4,7 @@ import HeaderFlag from "./HeaderFlag";
import ProtocolResponse from "../Response";
export default class Response extends ProtocolResponse {
- header: Header;
-
+ declare header: Header;
typeName: string;
data: any;
diff --git a/src/protocol/structureUtil.ts b/src/protocol/structureUtil.ts
index 38bf087..f32a287 100644
--- a/src/protocol/structureUtil.ts
+++ b/src/protocol/structureUtil.ts
@@ -181,6 +181,7 @@ export const serializeValue = (value: Value, structureField: StructureField): Bu
}
if (Buffer.isBuffer(value)) return value;
if (typeof value === "string") return serializeString(value, structureField);
+ if (Array.isArray(value)) return Buffer.from(value);
const bignumberValue = BigInt(value);
const result = Buffer.allocUnsafe(structureField.size);
From 17fa590e87f5c0d9521e3cca6d812fe5e94de9e0 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 17:11:15 +0000
Subject: [PATCH 23/42] class type changes
---
package-lock.json | 4 ++--
package.json | 2 +-
src/protocol/Request.ts | 6 +++---
src/protocol/Response.ts | 6 +++---
src/protocol/smb/Request.ts | 4 +---
src/protocol/smb/Response.ts | 4 +---
src/protocol/smb2/Request.ts | 5 ++---
src/protocol/smb2/Response.ts | 5 ++---
src/server/Client.ts | 6 +++---
9 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2e9be79..6f25caa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@awo00/smb2",
- "version": "0.4.3",
+ "version": "0.4.7",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.4.3",
+ "version": "0.4.7",
"license": "MIT",
"dependencies": {
"moment-timezone": "^0.5.31"
diff --git a/package.json b/package.json
index 378acbe..b75a78e 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.4.3",
+ "version": "0.4.7",
"author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
diff --git a/src/protocol/Request.ts b/src/protocol/Request.ts
index a1e2b67..9260387 100644
--- a/src/protocol/Request.ts
+++ b/src/protocol/Request.ts
@@ -1,10 +1,10 @@
import Response from "./Response";
-export default abstract class Request {
- response?: Response;
+export default abstract class Request {
+ response?: Response;
constructor(
- public header: any = {},
+ public header: T = {} as T,
public body: any = {}
) { }
diff --git a/src/protocol/Response.ts b/src/protocol/Response.ts
index 043f309..6ac9428 100644
--- a/src/protocol/Response.ts
+++ b/src/protocol/Response.ts
@@ -1,10 +1,10 @@
import Request from "./Request";
-export default abstract class Response {
- request?: Request;
+export default abstract class Response {
+ request?: Request;
constructor(
- public header: any = {},
+ public header: T = {} as T,
public body: any = {}
) { }
diff --git a/src/protocol/smb/Request.ts b/src/protocol/smb/Request.ts
index 022d3a5..aeaf317 100644
--- a/src/protocol/smb/Request.ts
+++ b/src/protocol/smb/Request.ts
@@ -2,9 +2,7 @@ import Header from "./Header";
import Packet from "./Packet";
import ProtocolRequest from "../Request";
-export default class Request extends ProtocolRequest {
- header: Header;
-
+export default class Request extends ProtocolRequest {
static parse(buffer: Buffer) {
const { header, body } = Packet.parse(buffer);
return new Request(header, body);
diff --git a/src/protocol/smb/Response.ts b/src/protocol/smb/Response.ts
index eee4c46..c47646b 100644
--- a/src/protocol/smb/Response.ts
+++ b/src/protocol/smb/Response.ts
@@ -2,9 +2,7 @@ import Header from "./Header";
import Packet from "./Packet";
import ProtocolResponse from "../Response";
-export default class Response extends ProtocolResponse {
- header: Header;
-
+export default class Response extends ProtocolResponse {
static parse(buffer: Buffer) {
const { header, body } = Packet.parse(buffer);
return new Response(header, body);
diff --git a/src/protocol/smb2/Request.ts b/src/protocol/smb2/Request.ts
index d2c7e24..7d131a3 100644
--- a/src/protocol/smb2/Request.ts
+++ b/src/protocol/smb2/Request.ts
@@ -2,12 +2,11 @@ import Header from "./Header";
import Packet from "./Packet";
import ProtocolRequest from "../Request";
-export default class Request extends ProtocolRequest {
- declare header: Header;
+export default class Request extends ProtocolRequest {
typeName: string;
data: any;
- constructor(header?: Header, body?: any) {
+ constructor(header: Header, body?: any) {
super(header, body);
this.typeName = Packet.getPacketTypeName(this.header.type);
diff --git a/src/protocol/smb2/Response.ts b/src/protocol/smb2/Response.ts
index 0757667..a4ff508 100644
--- a/src/protocol/smb2/Response.ts
+++ b/src/protocol/smb2/Response.ts
@@ -3,12 +3,11 @@ import Packet from "./Packet";
import HeaderFlag from "./HeaderFlag";
import ProtocolResponse from "../Response";
-export default class Response extends ProtocolResponse {
- declare header: Header;
+export default class Response extends ProtocolResponse {
typeName: string;
data: any;
- constructor(header?: Header, body?: any) {
+ constructor(header: Header, body?: any) {
super(header, body);
this.header.flags |= HeaderFlag.Response;
diff --git a/src/server/Client.ts b/src/server/Client.ts
index 6c31d56..bfe4e82 100644
--- a/src/server/Client.ts
+++ b/src/server/Client.ts
@@ -10,9 +10,9 @@ import Dialect from "../protocol/smb2/Dialect";
import * as protocolIds from "../protocol/protocolIds";
interface Client {
- on(event: "request", callback: (req: Request) => void): this;
+ on(event: "request", callback: (req: Request) => void): this;
- once(event: "request", callback: (req: Request) => void): this;
+ once(event: "request", callback: (req: Request) => void): this;
}
class Client extends EventEmitter {
@@ -57,7 +57,7 @@ class Client extends EventEmitter {
}
}
- send(response: Response) {
+ send(response: Response) {
const buffer = response.serialize();
this.socket.write(buffer);
}
From ed46861712ba368abd7b6d25ee1a2f89f5e88e41 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Thu, 21 Dec 2023 17:20:36 +0000
Subject: [PATCH 24/42] add missing deps
---
package-lock.json | 28 ++++++++++++++++++++++++----
package.json | 4 +++-
2 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 6f25caa..08fa664 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,14 +1,16 @@
{
"name": "@awo00/smb2",
- "version": "0.4.7",
+ "version": "0.4.8",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.4.7",
+ "version": "0.4.8",
"license": "MIT",
"dependencies": {
+ "des.js": "^1.1.0",
+ "js-md4": "^0.3.2",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
@@ -229,6 +231,15 @@
"ms": "^2.1.1"
}
},
+ "node_modules/des.js": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
+ "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -352,8 +363,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/is-binary-path": {
"version": "2.1.0",
@@ -397,6 +407,11 @@
"node": ">=0.12.0"
}
},
+ "node_modules/js-md4": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz",
+ "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -422,6 +437,11 @@
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
diff --git a/package.json b/package.json
index b75a78e..b261712 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.4.7",
+ "version": "0.4.8",
"author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
@@ -29,6 +29,8 @@
"node": ">=18"
},
"dependencies": {
+ "des.js": "^1.1.0",
+ "js-md4": "^0.3.2",
"moment-timezone": "^0.5.31"
},
"devDependencies": {
From 0097871330134b7ff825775696656ed1e6513d2e Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Thu, 4 Jan 2024 13:44:34 +0100
Subject: [PATCH 25/42] Feature/stream read write (#1)
* feature: basic readStream
* fix: remove unneccesary return
* fix: remove unused buffer variable
* feature: createFileReadableStream on tree
* feature: working read/write streams
---------
Co-authored-by: Miguel Angel Cagide Fagin
---
package-lock.json | 4 +-
package.json | 8 +--
src/client/File.ts | 76 +++++++++++++++++++---------
src/client/Tree.ts | 26 +++++++++-
src/client/stream/FileWriteStream.ts | 35 +++++++++++++
5 files changed, 118 insertions(+), 31 deletions(-)
create mode 100644 src/client/stream/FileWriteStream.ts
diff --git a/package-lock.json b/package-lock.json
index 08fa664..61c87b8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "@awo00/smb2",
+ "name": "@miguel-cagide/smb2",
"version": "0.4.8",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "@awo00/smb2",
+ "name": "@miguel-cagide/smb2",
"version": "0.4.8",
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index b261712..e03629e 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
{
- "name": "@awo00/smb2",
+ "name": "@miguel-cagide/smb2",
"description": "A SMB2 implementation in TypeScript",
- "repository": "https://github.com/awo00/smb2",
- "bugs": "https://github.com/awo00/smb2/issues",
+ "repository": "https://github.com/miguel-cagide/smb2",
+ "bugs": "https://github.com/miguel-cagide/smb2/issues",
"version": "0.4.8",
- "author": "awo00",
+ "author": "awo00(miguel-cagide)",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
diff --git a/src/client/File.ts b/src/client/File.ts
index 1da5a25..bfc3de6 100644
--- a/src/client/File.ts
+++ b/src/client/File.ts
@@ -9,6 +9,8 @@ import { CreateOptions } from "../protocol/smb2/packets/Create";
import CreateDispositionType from "../protocol/smb2/CreateDispositionType";
import FilePipePrinterAccess from "../protocol/smb2/FilePipePrinterAccess";
import { FileInfoClass, InfoType } from "../protocol/smb2/packets/SetInfo";
+import { Readable } from "stream";
+import { FileWriteStream } from "./stream/FileWriteStream";
const maxReadChunkLength = 0x00010000;
const maxWriteChunkLength = 0x00010000 - 0x71;
@@ -109,6 +111,18 @@ class File extends EventEmitter {
});
}
+ private async writeChunk(offset: number, chunk: Buffer) {
+
+ const offsetBuffer = Buffer.alloc(8);
+ offsetBuffer.writeBigUInt64LE(BigInt(offset));
+
+ await this.tree.request({ type: PacketType.Write }, {
+ fileId: this._id,
+ buffer: chunk,
+ offset: offsetBuffer
+ });
+ }
+
async write(content: Buffer | string) {
const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content, "utf8");
const chunkCount = Math.ceil(buffer.length / maxWriteChunkLength);
@@ -119,17 +133,34 @@ class File extends EventEmitter {
const length = nextOffset > buffer.length ? buffer.length - offset : nextOffset - offset;
const chunk = buffer.slice(offset, offset + length);
- const offsetBuffer = Buffer.alloc(8);
- offsetBuffer.writeBigUInt64LE(BigInt(offset));
-
- await this.tree.request({ type: PacketType.Write }, {
- fileId: this._id,
- buffer: chunk,
- offset: offsetBuffer
- });
+ await this.writeChunk(offset, chunk);
}
}
+ createWriteStream() {
+ return new FileWriteStream(maxWriteChunkLength, this.writeChunk.bind(this));
+ }
+
+ private async readChunk(initial: number, offset: number) {
+ const fileSize = Number(this.fileSize);
+ const nextOffset = (initial + 1) * maxReadChunkLength;
+ const length = nextOffset > fileSize ? fileSize - offset : nextOffset - offset;
+
+ const lengthBuffer = Buffer.alloc(4);
+ lengthBuffer.writeInt32LE(length, 0);
+
+ const offsetBuffer = Buffer.alloc(8);
+ offsetBuffer.writeBigUInt64LE(BigInt(offset));
+
+ const response = await this.tree.request({ type: PacketType.Read }, {
+ fileId: this._id,
+ length: lengthBuffer,
+ offset: offsetBuffer
+ });
+
+ return response.body.buffer as Buffer;
+ }
+
async read() {
const fileSize = Number(this.fileSize);
const chunkCount = Math.ceil(fileSize / maxReadChunkLength);
@@ -137,27 +168,24 @@ class File extends EventEmitter {
const buffer = Buffer.alloc(fileSize);
for (let index = 0; index < chunkCount; index++) {
const offset = index * maxReadChunkLength;
- const nextOffset = (index + 1) * maxReadChunkLength;
- const length = nextOffset > fileSize ? fileSize - offset : nextOffset - offset;
-
- const lengthBuffer = Buffer.alloc(4);
- lengthBuffer.writeInt32LE(length, 0);
-
- const offsetBuffer = Buffer.alloc(8);
- offsetBuffer.writeBigUInt64LE(BigInt(offset));
-
- const response = await this.tree.request({ type: PacketType.Read }, {
- fileId: this._id,
- length: lengthBuffer,
- offset: offsetBuffer
- });
-
- (response.body.buffer as Buffer).copy(buffer, offset);
+ ((await this.readChunk(index, offset)) as Buffer).copy(buffer, offset);
}
return buffer;
}
+ createReadStream() {
+ const fileSize = Number(this.fileSize);
+ return Readable.from(async function* read() {
+ const chunkCount = Math.ceil(fileSize / maxReadChunkLength);
+
+ for (let index = 0; index < chunkCount; index++) {
+ const offset = index * maxReadChunkLength;
+ yield ((await this.readChunk(index, offset)) as Buffer);
+ }
+ }.bind(this)());
+ }
+
async exists(path: string) {
try {
await this.open(path);
diff --git a/src/client/Tree.ts b/src/client/Tree.ts
index 6a81cfe..a4655a0 100644
--- a/src/client/Tree.ts
+++ b/src/client/Tree.ts
@@ -132,6 +132,18 @@ class Tree extends EventEmitter {
await file.close();
}
+ async createFileWriteStream(path: string) {
+ const file = new File(this);
+ this.registerFile(file);
+ await file.create(path);
+ const stream = file.createWriteStream();
+ stream.once("close", async () => {
+ await file.setSize(BigInt(stream.bytesWritten));
+ file.close();
+ });
+ return stream;
+ }
+
async removeFile(path: string) {
const file = new File(this);
this.registerFile(file);
@@ -139,7 +151,7 @@ class Tree extends EventEmitter {
await file.remove();
await file.close();
}
-
+
async renameFile(path: string, newPath: string) {
const file = new File(this);
this.registerFile(file);
@@ -158,6 +170,18 @@ class Tree extends EventEmitter {
return buffer;
}
+ async createFileReadStream(path: string) {
+ const file = new File(this);
+ this.registerFile(file);
+
+ await file.open(path);
+ const stream = file.createReadStream();
+ stream.once("end", async () => {
+ await file.close();
+ })
+ return stream;
+ }
+
private registerFile(file: File) {
file
.once("open", () => this.openFiles.push(file))
diff --git a/src/client/stream/FileWriteStream.ts b/src/client/stream/FileWriteStream.ts
new file mode 100644
index 0000000..029f28c
--- /dev/null
+++ b/src/client/stream/FileWriteStream.ts
@@ -0,0 +1,35 @@
+import { Writable } from "stream";
+import File from "../File"
+
+export type FileWriter = (offset: number, buffer: Buffer) => Promise;
+
+export class FileWriteStream extends Writable {
+ private maxWriteChunkLength: number;
+ private fileWriter: FileWriter;
+ private _bytesWritten: number;
+
+ get bytesWritten() {
+ return this._bytesWritten;
+ }
+
+ constructor(maxWriteChunkLength: number, fileWriter: FileWriter) {
+ super();
+ this.maxWriteChunkLength = maxWriteChunkLength;
+ this.fileWriter = fileWriter;
+ this._bytesWritten = 0;
+ }
+
+ _write(chunk: Buffer, encoding, callback) {
+ const chunkSize = chunk.length
+ if (chunkSize > this.maxWriteChunkLength) {
+
+ } else {
+ this.fileWriter(this._bytesWritten, chunk)
+ .then(() => {
+ this._bytesWritten += chunkSize;
+ callback();
+ })
+ .catch(callback);
+ }
+ }
+}
\ No newline at end of file
From 6badb6bd0fbf734e189566c6345c43b76e10d75c Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Thu, 4 Jan 2024 17:13:12 +0100
Subject: [PATCH 26/42] Fix/streams fixes (#2)
* feature: subchunks on writefilestream when chunk is bigger than "maxWriteChunkLength"
fix: "close" event on readfilestream
* chore: version bump, doc update
---
README.md | 6 +++---
package.json | 2 +-
src/client/Tree.ts | 4 ++--
src/client/stream/FileWriteStream.ts | 11 ++++++++++-
4 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 65e1a25..80fa029 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# @awo00/smb2
+# @miguel-cagide/smb2
> A SMB2 implementation in TypeScript.
@@ -6,12 +6,12 @@ Forked from https://github.com/ardean/smb2 using code from https://github.com/Sa
## Installation
```sh
-$ npm i @awo00/smb2
+$ npm i @miguel-cagide/smb2
```
## Usage
```ts
-import smb2 from "@awo00/smb2";
+import smb2 from "@miguel-cagide/smb2";
const client = new smb2.Client(host);
const session = await client.authenticate({
diff --git a/package.json b/package.json
index e03629e..3b75dc2 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/miguel-cagide/smb2",
"bugs": "https://github.com/miguel-cagide/smb2/issues",
- "version": "0.4.8",
+ "version": "0.5.0",
"author": "awo00(miguel-cagide)",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
diff --git a/src/client/Tree.ts b/src/client/Tree.ts
index a4655a0..4cab2d8 100644
--- a/src/client/Tree.ts
+++ b/src/client/Tree.ts
@@ -176,9 +176,9 @@ class Tree extends EventEmitter {
await file.open(path);
const stream = file.createReadStream();
- stream.once("end", async () => {
+ stream.once("close", async () => {
await file.close();
- })
+ });
return stream;
}
diff --git a/src/client/stream/FileWriteStream.ts b/src/client/stream/FileWriteStream.ts
index 029f28c..3a89c11 100644
--- a/src/client/stream/FileWriteStream.ts
+++ b/src/client/stream/FileWriteStream.ts
@@ -22,7 +22,16 @@ export class FileWriteStream extends Writable {
_write(chunk: Buffer, encoding, callback) {
const chunkSize = chunk.length
if (chunkSize > this.maxWriteChunkLength) {
-
+ const promises: Promise[] = [];
+ for (let offset = 0; offset < chunkSize; offset += this.maxWriteChunkLength) {
+ promises.push(this.fileWriter(this._bytesWritten + offset, chunk.subarray(offset, this.maxWriteChunkLength)));
+ }
+ Promise.all(promises)
+ .then(() => {
+ this._bytesWritten += chunkSize;
+ callback();
+ })
+ .catch(callback);
} else {
this.fileWriter(this._bytesWritten, chunk)
.then(() => {
From e92e58f69962a468dc46d6e22b05f1ec50b30996 Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Thu, 4 Jan 2024 18:24:36 +0100
Subject: [PATCH 27/42] chore: version bump (#3)
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 3b75dc2..2634042 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/miguel-cagide/smb2",
"bugs": "https://github.com/miguel-cagide/smb2/issues",
- "version": "0.5.0",
+ "version": "0.5.1",
"author": "awo00(miguel-cagide)",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From 40059f7469e5f7a518964832bf6fa04ff37afb62 Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Thu, 4 Jan 2024 18:28:44 +0100
Subject: [PATCH 28/42] chore: version bump (#4)
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 2634042..c974779 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/miguel-cagide/smb2",
"bugs": "https://github.com/miguel-cagide/smb2/issues",
- "version": "0.5.1",
+ "version": "0.5.2",
"author": "awo00(miguel-cagide)",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From bc0bcf70ba1d8bd3398ce1465ab4d7554370f199 Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Thu, 4 Jan 2024 18:42:24 +0100
Subject: [PATCH 29/42] chore: bump version (#5)
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index c974779..4857b05 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/miguel-cagide/smb2",
"bugs": "https://github.com/miguel-cagide/smb2/issues",
- "version": "0.5.2",
+ "version": "0.6.0",
"author": "awo00(miguel-cagide)",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From 658b52252d83a47826cbfcf0c47bb388cdda2b88 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Fri, 5 Jan 2024 15:09:37 +0000
Subject: [PATCH 30/42] stop emit error on close
---
src/client/Client.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/client/Client.ts b/src/client/Client.ts
index e404052..15208c6 100644
--- a/src/client/Client.ts
+++ b/src/client/Client.ts
@@ -197,12 +197,11 @@ class Client extends EventEmitter {
}
onError = (err: Error) => {
- this.emit("error", err);
+ console.error(err);
}
onClose = (hadError: boolean) => {
this.connected = false;
- this.emit("error", new Error("client_closed"));
}
async echo() {
From 7ab7a79dbdfb6c29b1e5d28fc1dbc7e1ae396832 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Fri, 5 Jan 2024 15:17:21 +0000
Subject: [PATCH 31/42] version
---
package-lock.json | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 08fa664..9c33241 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@awo00/smb2",
- "version": "0.4.8",
+ "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "0.4.8",
+ "version": "1.0.0",
"license": "MIT",
"dependencies": {
"des.js": "^1.1.0",
diff --git a/package.json b/package.json
index b261712..2c85bbd 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "0.4.8",
+ "version": "1.0.0",
"author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From b948e2ad633153facb01b56793ca55643eda4a0f Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Mon, 8 Jan 2024 08:48:04 +0100
Subject: [PATCH 32/42] fix: fixed subarray positions when chunk bigger than
maxWriteChunkLength (#6)
---
package.json | 2 +-
src/client/stream/FileWriteStream.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 4857b05..cdc5321 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/miguel-cagide/smb2",
"bugs": "https://github.com/miguel-cagide/smb2/issues",
- "version": "0.6.0",
+ "version": "0.6.3",
"author": "awo00(miguel-cagide)",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
diff --git a/src/client/stream/FileWriteStream.ts b/src/client/stream/FileWriteStream.ts
index 3a89c11..416926b 100644
--- a/src/client/stream/FileWriteStream.ts
+++ b/src/client/stream/FileWriteStream.ts
@@ -24,7 +24,7 @@ export class FileWriteStream extends Writable {
if (chunkSize > this.maxWriteChunkLength) {
const promises: Promise[] = [];
for (let offset = 0; offset < chunkSize; offset += this.maxWriteChunkLength) {
- promises.push(this.fileWriter(this._bytesWritten + offset, chunk.subarray(offset, this.maxWriteChunkLength)));
+ promises.push(this.fileWriter(this._bytesWritten + offset, chunk.subarray(offset, offset + this.maxWriteChunkLength)));
}
Promise.all(promises)
.then(() => {
From 4f7e50782bc7eec10bc4615bebe75889bb3503b3 Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Mon, 8 Jan 2024 08:58:33 +0100
Subject: [PATCH 33/42] Awo00 master (#10)
* stop emit error on close
* version
* fix: fixed subarray positions when chunk bigger than maxWriteChunkLength
---------
Co-authored-by: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
---
src/client/Client.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/client/Client.ts b/src/client/Client.ts
index e404052..15208c6 100644
--- a/src/client/Client.ts
+++ b/src/client/Client.ts
@@ -197,12 +197,11 @@ class Client extends EventEmitter {
}
onError = (err: Error) => {
- this.emit("error", err);
+ console.error(err);
}
onClose = (hadError: boolean) => {
this.connected = false;
- this.emit("error", new Error("client_closed"));
}
async echo() {
From 135ffd818c7ad1d76f8bc730d1d34d13402682bb Mon Sep 17 00:00:00 2001
From: Miguel Angel Cagide Fagin
Date: Mon, 8 Jan 2024 09:23:42 +0100
Subject: [PATCH 34/42] chore: revert to original package.json
---
package-lock.json | 8 ++++----
package.json | 10 +++++-----
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 61c87b8..9c33241 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
- "name": "@miguel-cagide/smb2",
- "version": "0.4.8",
+ "name": "@awo00/smb2",
+ "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "@miguel-cagide/smb2",
- "version": "0.4.8",
+ "name": "@awo00/smb2",
+ "version": "1.0.0",
"license": "MIT",
"dependencies": {
"des.js": "^1.1.0",
diff --git a/package.json b/package.json
index cdc5321..2c85bbd 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
{
- "name": "@miguel-cagide/smb2",
+ "name": "@awo00/smb2",
"description": "A SMB2 implementation in TypeScript",
- "repository": "https://github.com/miguel-cagide/smb2",
- "bugs": "https://github.com/miguel-cagide/smb2/issues",
- "version": "0.6.3",
- "author": "awo00(miguel-cagide)",
+ "repository": "https://github.com/awo00/smb2",
+ "bugs": "https://github.com/awo00/smb2/issues",
+ "version": "1.0.0",
+ "author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
From eeaff9e069d0f22b1c936adfaceb70a031665210 Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Mon, 8 Jan 2024 11:39:21 +0100
Subject: [PATCH 35/42] Update README.md
fix: remove miguel-cagide changes
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 80fa029..65e1a25 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# @miguel-cagide/smb2
+# @awo00/smb2
> A SMB2 implementation in TypeScript.
@@ -6,12 +6,12 @@ Forked from https://github.com/ardean/smb2 using code from https://github.com/Sa
## Installation
```sh
-$ npm i @miguel-cagide/smb2
+$ npm i @awo00/smb2
```
## Usage
```ts
-import smb2 from "@miguel-cagide/smb2";
+import smb2 from "@awo00/smb2";
const client = new smb2.Client(host);
const session = await client.authenticate({
From c8ca9fa7d2ff3b30482796a71b45a91d0bf7b45b Mon Sep 17 00:00:00 2001
From: miguel-cagide <36760317+miguel-cagide@users.noreply.github.com>
Date: Mon, 8 Jan 2024 11:40:38 +0100
Subject: [PATCH 36/42] Update FileWriteStream.ts
fix: added missing new line
---
src/client/stream/FileWriteStream.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/client/stream/FileWriteStream.ts b/src/client/stream/FileWriteStream.ts
index 416926b..ca335cc 100644
--- a/src/client/stream/FileWriteStream.ts
+++ b/src/client/stream/FileWriteStream.ts
@@ -41,4 +41,4 @@ export class FileWriteStream extends Writable {
.catch(callback);
}
}
-}
\ No newline at end of file
+}
From 19b491b838d079bee5c665b1d37564e1c460074b Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Wed, 28 Aug 2024 10:18:29 +0100
Subject: [PATCH 37/42] fix version
---
package-lock.json | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9c33241..fd0a1d6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@awo00/smb2",
- "version": "1.0.0",
+ "version": "1.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
diff --git a/package.json b/package.json
index 2c85bbd..1fca771 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "1.0.0",
+ "version": "1.1.0",
"author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From abe567f164d04cf2a2ae01b4a1382515733d075e Mon Sep 17 00:00:00 2001
From: Martin Schuster
Date: Wed, 12 Feb 2025 08:54:42 +0100
Subject: [PATCH 38/42] fix: use clientGuid on negotiation
---
src/client/Session.ts | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/client/Session.ts b/src/client/Session.ts
index 1e410a1..8fb3b14 100644
--- a/src/client/Session.ts
+++ b/src/client/Session.ts
@@ -3,6 +3,7 @@ import Client from "./Client";
import { EventEmitter } from "events";
import Dialect from "../protocol/smb2/Dialect";
import Header from "../protocol/smb2/Header";
+import * as util from "../protocol/util";
import * as ntlmUtil from "../protocol/ntlm/util";
import PacketType from "../protocol/smb2/PacketType";
@@ -64,7 +65,8 @@ class Session extends EventEmitter {
dialects: [
Dialect.Smb202,
Dialect.Smb210
- ]
+ ],
+ clientGuid: util.generateGuid()
});
const sessionSetupResponse = await this.request(
{ type: PacketType.SessionSetup },
@@ -110,4 +112,4 @@ class Session extends EventEmitter {
}
}
-export default Session;
\ No newline at end of file
+export default Session;
From 3e206df3d34bc66d6e0ab86ee8996a5b9e2cc693 Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Wed, 21 May 2025 11:34:19 +0100
Subject: [PATCH 39/42] update version
---
package-lock.json | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index fd0a1d6..5e427fb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@awo00/smb2",
- "version": "1.1.0",
+ "version": "1.1.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@awo00/smb2",
- "version": "1.0.0",
+ "version": "1.1.1",
"license": "MIT",
"dependencies": {
"des.js": "^1.1.0",
diff --git a/package.json b/package.json
index 1fca771..5c94187 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "A SMB2 implementation in TypeScript",
"repository": "https://github.com/awo00/smb2",
"bugs": "https://github.com/awo00/smb2/issues",
- "version": "1.1.0",
+ "version": "1.1.1",
"author": "awo00",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
From 69050961b1f8f4c2f19e2d4f7184406223f22f6d Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Wed, 21 May 2025 11:46:36 +0100
Subject: [PATCH 40/42] types issues
---
package-lock.json | 21 ++++++++++++++++-----
package.json | 2 +-
src/client/File.ts | 2 +-
src/protocol/ntlm/util.ts | 2 +-
src/protocol/structureUtil.ts | 2 +-
5 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5e427fb..c6c67e1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,7 +14,7 @@
"moment-timezone": "^0.5.31"
},
"devDependencies": {
- "@types/node": "^13.7.4",
+ "@types/node": "^18.19.103",
"nodemon": "^2.0.4",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
@@ -51,10 +51,14 @@
}
},
"node_modules/@types/node": {
- "version": "13.13.52",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz",
- "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==",
- "dev": true
+ "version": "18.19.103",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.103.tgz",
+ "integrity": "sha512-hHTHp+sEz6SxFsp+SA+Tqrua3AbmlAw+Y//aEwdHrdZkYVRWdvWD3y5uPZ0flYOkgskaFWqZ/YGFm3FaFQ0pRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
},
"node_modules/abbrev": {
"version": "1.1.1",
@@ -803,6 +807,13 @@
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
"dev": true
},
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 5c94187..94a7933 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
"moment-timezone": "^0.5.31"
},
"devDependencies": {
- "@types/node": "^13.7.4",
+ "@types/node": "^18.19.103",
"nodemon": "^2.0.4",
"ts-node": "^9.0.0",
"tslint": "^6.1.0",
diff --git a/src/client/File.ts b/src/client/File.ts
index bfc3de6..9f7cc35 100644
--- a/src/client/File.ts
+++ b/src/client/File.ts
@@ -178,7 +178,7 @@ class File extends EventEmitter {
const fileSize = Number(this.fileSize);
return Readable.from(async function* read() {
const chunkCount = Math.ceil(fileSize / maxReadChunkLength);
-
+
for (let index = 0; index < chunkCount; index++) {
const offset = index * maxReadChunkLength;
yield ((await this.readChunk(index, offset)) as Buffer);
diff --git a/src/protocol/ntlm/util.ts b/src/protocol/ntlm/util.ts
index 5e6f7b0..a1d0e7a 100644
--- a/src/protocol/ntlm/util.ts
+++ b/src/protocol/ntlm/util.ts
@@ -368,7 +368,7 @@ const createLmHash = (password: string): Buffer => {
function encrypt(buf) {
const key = insertZerosEvery7Bits(buf);
- const des = desjs.DES.create({ type: "encrypt", key: key });
+ const des = desjs.DES.create({ type: "encrypt", key });
const magicKey = Buffer.from("KGS!@#$%", "ascii");
const encrypted = des.update(magicKey);
return Buffer.from(encrypted);
diff --git a/src/protocol/structureUtil.ts b/src/protocol/structureUtil.ts
index f32a287..95d7333 100644
--- a/src/protocol/structureUtil.ts
+++ b/src/protocol/structureUtil.ts
@@ -181,7 +181,7 @@ export const serializeValue = (value: Value, structureField: StructureField): Bu
}
if (Buffer.isBuffer(value)) return value;
if (typeof value === "string") return serializeString(value, structureField);
- if (Array.isArray(value)) return Buffer.from(value);
+ if (Array.isArray(value)) return Buffer.from(value as ArrayLike);
const bignumberValue = BigInt(value);
const result = Buffer.allocUnsafe(structureField.size);
From fcf29444c02356884f6cbdd80428c3e533e1ea6a Mon Sep 17 00:00:00 2001
From: Andy Wooldridge <99414101+awo00@users.noreply.github.com>
Date: Wed, 21 May 2025 11:50:32 +0100
Subject: [PATCH 41/42] fix deprecated timeout type
---
src/client/Client.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/client/Client.ts b/src/client/Client.ts
index 15208c6..2e68ec3 100644
--- a/src/client/Client.ts
+++ b/src/client/Client.ts
@@ -38,7 +38,7 @@ class Client extends EventEmitter {
port: number = 445;
connectTimeout: number = 5 * 1000;
- connectTimeoutId: NodeJS.Timer;
+ connectTimeoutId: NodeJS.Timeout;
requestTimeout: number = 5 * 1000;
requestTimeoutIdMap = new Map();
From d530635c31ecb7778b39527f6a0803915af2002f Mon Sep 17 00:00:00 2001
From: jojomueller05
Date: Tue, 24 Mar 2026 10:08:44 +0100
Subject: [PATCH 42/42] fix #9: implement pagination for directory reads to
support large folders
---
src/client/Directory.ts | 161 ++++++++++++++++++++++++++--------------
1 file changed, 104 insertions(+), 57 deletions(-)
diff --git a/src/client/Directory.ts b/src/client/Directory.ts
index fe86cd0..f6979d6 100644
--- a/src/client/Directory.ts
+++ b/src/client/Directory.ts
@@ -35,9 +35,7 @@ class Directory extends EventEmitter {
private watchingMessageIds: bigint[] = [];
private watchRecursive: boolean;
- constructor(
- private tree: Tree
- ) {
+ constructor(private tree: Tree) {
super();
}
@@ -45,29 +43,31 @@ class Directory extends EventEmitter {
if (this.isOpen) return;
const buffer = Buffer.from(util.toWindowsFilePath(path), "ucs2");
- const response = await this.tree.request({ type: PacketType.Create }, {
- buffer,
- desiredAccess: typeof options.desiredAccess === "number" ?
- options.desiredAccess :
- (
- DirectoryAccess.ListDirectory |
- DirectoryAccess.ReadAttributes |
- DirectoryAccess.Synchronize
- ),
- fileAttributes: FileAttribute.Directory,
- shareAccess:
- ShareAccessType.Read |
- ShareAccessType.Write |
- ShareAccessType.Delete,
- createDisposition: typeof options.createDisposition === "number" ?
- options.createDisposition :
- CreateDispositionType.Open,
- createOptions: typeof options.createOptions === "number" ?
- options.createOptions :
- CreateOptions.None,
- nameOffset: 0x0078,
- createContextsOffset: 0x007a + buffer.length
- });
+ const response = await this.tree.request(
+ { type: PacketType.Create },
+ {
+ buffer,
+ desiredAccess:
+ typeof options.desiredAccess === "number"
+ ? options.desiredAccess
+ : DirectoryAccess.ListDirectory |
+ DirectoryAccess.ReadAttributes |
+ DirectoryAccess.Synchronize,
+ fileAttributes: FileAttribute.Directory,
+ shareAccess:
+ ShareAccessType.Read | ShareAccessType.Write | ShareAccessType.Delete,
+ createDisposition:
+ typeof options.createDisposition === "number"
+ ? options.createDisposition
+ : CreateDispositionType.Open,
+ createOptions:
+ typeof options.createOptions === "number"
+ ? options.createOptions
+ : CreateOptions.None,
+ nameOffset: 0x0078,
+ createContextsOffset: 0x007a + buffer.length,
+ },
+ );
this._id = response.body.fileId as string;
this.isOpen = true;
@@ -78,7 +78,7 @@ class Directory extends EventEmitter {
async create(path: string) {
await this.open(path, {
createDisposition: CreateDispositionType.Create,
- createOptions: CreateOptions.Directory
+ createOptions: CreateOptions.Directory,
});
}
@@ -96,7 +96,10 @@ class Directory extends EventEmitter {
if (!this.watching) return;
this.watching = false;
- this.tree.session.client.removeListener("changeNotify", this.onChangeNotify);
+ this.tree.session.client.removeListener(
+ "changeNotify",
+ this.onChangeNotify,
+ );
await this.close();
}
@@ -117,11 +120,11 @@ class Directory extends EventEmitter {
const request = this.tree.createRequest(
{ type: PacketType.ChangeNotify },
{
- flags: this.watchRecursive ?
- ChangeNotifyFlags.WatchTreeRecursively :
- ChangeNotifyFlags.None,
- fileId: this._id
- }
+ flags: this.watchRecursive
+ ? ChangeNotifyFlags.WatchTreeRecursively
+ : ChangeNotifyFlags.None,
+ fileId: this._id,
+ },
);
this.watchingMessageIds.push(request.header.messageId);
@@ -129,33 +132,74 @@ class Directory extends EventEmitter {
if (
response.header.status !== StatusCode.Success &&
response.header.status !== StatusCode.Pending
- ) throw new Error(`ChangeNotify: ${structureUtil.parseEnumValue(StatusCode, response.header.status)} (${response.header.status})`);
+ )
+ throw new Error(
+ `ChangeNotify: ${structureUtil.parseEnumValue(StatusCode, response.header.status)} (${response.header.status})`,
+ );
return response;
}
async flush() {
- await this.tree.request({
- type: PacketType.Flush
- }, {
- fileId: this._id
- });
+ await this.tree.request(
+ {
+ type: PacketType.Flush,
+ },
+ {
+ fileId: this._id,
+ },
+ );
}
async read() {
- const response = await this.tree.request({ type: PacketType.QueryDirectory }, {
- fileId: this._id,
- buffer: Buffer.from("*", "ucs2")
- });
-
- let entries: DirectoryEntry[] = [];
- if (response.data) {
- entries = response.data.filter(x => x.filename !== "." && x.filename !== "..")
- } else {
- console.warn("response without data", response);
+ let allEntries: any[] = [];
+ let hasMore = true;
+ let isFirstRequest = true;
+
+ while (hasMore) {
+ try {
+ const response = await this.tree.request(
+ { type: PacketType.QueryDirectory },
+ {
+ fileId: this._id,
+ // First call needs "*", subsequent calls need empty buffer
+ buffer: isFirstRequest
+ ? Buffer.from("*\0", "ucs2")
+ : Buffer.alloc(0),
+ },
+ );
+
+ isFirstRequest = false;
+
+ // If we got data, add it to our list
+ const currentBatch = Array.isArray(response)
+ ? response
+ : response?.data || [];
+ if (currentBatch && currentBatch.length > 0) {
+ const filtered = currentBatch.filter(
+ (x: any) => x.filename !== "." && x.filename !== "..",
+ );
+ allEntries.push(...filtered);
+ } else {
+ hasMore = false; // No data returned, we are done
+ }
+ } catch (err: any) {
+ // 0x80000006 is STATUS_NO_MORE_FILES.
+ // In decimal (signed 32-bit), it often shows up as -2147483642
+ // or as 2147483654 (unsigned).
+ const status = err?.header?.status;
+
+ if (status === 0x80000006 || status === 2147483654) {
+ // This isn't an error! It's the server saying "That's all folks!"
+ hasMore = false;
+ } else {
+ // If it's a different error (like network loss), re-throw it
+ throw err;
+ }
+ }
}
- return entries;
+ return allEntries;
}
async exists(path: string) {
@@ -194,12 +238,15 @@ class Directory extends EventEmitter {
}
async setInfo(fileInfoClass: number, buffer: Buffer) {
- await this.tree.request({ type: PacketType.SetInfo }, {
- infoType: InfoType.File,
- fileId: this._id,
- fileInfoClass,
- buffer
- });
+ await this.tree.request(
+ { type: PacketType.SetInfo },
+ {
+ infoType: InfoType.File,
+ fileId: this._id,
+ fileInfoClass,
+ buffer,
+ },
+ );
}
async close() {
@@ -213,4 +260,4 @@ class Directory extends EventEmitter {
}
}
-export default Directory;
\ No newline at end of file
+export default Directory;