dsh-remote 0.8.46 → 0.8.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +361 -361
  3. package/README.md +368 -368
  4. package/cordis.patch.yml +9 -9
  5. package/lib/binding.js +172 -172
  6. package/lib/client.js +3637 -3637
  7. package/lib/credential.js +177 -177
  8. package/lib/deploy-tasks.js +142 -142
  9. package/lib/errors.js +87 -87
  10. package/lib/file-reference.js +457 -457
  11. package/lib/forwards.js +258 -258
  12. package/lib/hostkey.js +108 -108
  13. package/lib/http-transport.js +196 -196
  14. package/lib/ignore.js +156 -156
  15. package/lib/index.js +3771 -3747
  16. package/lib/openssh.js +838 -838
  17. package/lib/paths.js +225 -225
  18. package/lib/pool.js +757 -757
  19. package/lib/registry.js +95 -95
  20. package/lib/remote-fs.js +148 -143
  21. package/lib/routes-fs.js +233 -233
  22. package/lib/search.js +230 -230
  23. package/lib/sftp-surface.js +76 -76
  24. package/lib/sshconfig.js +454 -454
  25. package/lib/sync.js +275 -275
  26. package/lib/tasks.js +95 -95
  27. package/lib/telemetry.js +213 -213
  28. package/lib/update.js +472 -472
  29. package/lib/web-attach.js +850 -850
  30. package/lib/web-deploy-skill.js +205 -205
  31. package/lib/web-deploy.js +694 -694
  32. package/node_modules/asn1/Jenkinsfile +65 -0
  33. package/node_modules/asn1/LICENSE +19 -0
  34. package/node_modules/asn1/README.md +50 -0
  35. package/node_modules/asn1/lib/ber/errors.js +13 -0
  36. package/node_modules/asn1/lib/ber/index.js +27 -0
  37. package/node_modules/asn1/lib/ber/reader.js +262 -0
  38. package/node_modules/asn1/lib/ber/types.js +36 -0
  39. package/node_modules/asn1/lib/ber/writer.js +317 -0
  40. package/node_modules/asn1/lib/index.js +20 -0
  41. package/node_modules/asn1/package.json +31 -0
  42. package/node_modules/bcrypt-pbkdf/CONTRIBUTING.md +13 -0
  43. package/node_modules/bcrypt-pbkdf/LICENSE +66 -0
  44. package/node_modules/bcrypt-pbkdf/README.md +45 -0
  45. package/node_modules/bcrypt-pbkdf/index.js +556 -0
  46. package/node_modules/bcrypt-pbkdf/package.json +15 -0
  47. package/node_modules/buildcheck/.eslintrc.js +5 -0
  48. package/node_modules/buildcheck/.github/workflows/ci.yml +88 -0
  49. package/node_modules/buildcheck/.github/workflows/lint.yml +27 -0
  50. package/node_modules/buildcheck/.npmignore +3 -0
  51. package/node_modules/buildcheck/LICENSE +19 -0
  52. package/node_modules/buildcheck/README.md +106 -0
  53. package/node_modules/buildcheck/deps/Find-VisualStudio.cs +250 -0
  54. package/node_modules/buildcheck/lib/findvs.js +361 -0
  55. package/node_modules/buildcheck/lib/index.js +738 -0
  56. package/node_modules/buildcheck/package.json +36 -0
  57. package/node_modules/buildcheck/test/test.js +8 -0
  58. package/node_modules/cpu-features/.eslintrc.js +5 -0
  59. package/node_modules/cpu-features/.github/workflows/ci.yml +74 -0
  60. package/node_modules/cpu-features/.github/workflows/lint.yml +27 -0
  61. package/node_modules/cpu-features/LICENSE +19 -0
  62. package/node_modules/cpu-features/README.md +59 -0
  63. package/node_modules/cpu-features/binding.gyp +16 -0
  64. package/node_modules/cpu-features/buildcheck.js +32 -0
  65. package/node_modules/cpu-features/deps/cpu_features/.clang-format +4 -0
  66. package/node_modules/cpu-features/deps/cpu_features/.dockerignore +31 -0
  67. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/Dockerfile +5 -0
  68. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/aarch64_linux_cmake.yml +30 -0
  69. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_freebsd_cmake.yml +22 -0
  70. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_bazel.yml +26 -0
  71. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml +31 -0
  72. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml +43 -0
  73. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml +25 -0
  74. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml +31 -0
  75. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml +24 -0
  76. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml +30 -0
  77. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml +29 -0
  78. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml +28 -0
  79. package/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml +27 -0
  80. package/node_modules/cpu-features/deps/cpu_features/.grenrc.yml +21 -0
  81. package/node_modules/cpu-features/deps/cpu_features/BUILD.bazel +329 -0
  82. package/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt +261 -0
  83. package/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md +23 -0
  84. package/node_modules/cpu-features/deps/cpu_features/LICENSE +230 -0
  85. package/node_modules/cpu-features/deps/cpu_features/README.md +272 -0
  86. package/node_modules/cpu-features/deps/cpu_features/WORKSPACE +19 -0
  87. package/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md +5 -0
  88. package/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl +11 -0
  89. package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in +3 -0
  90. package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in +3 -0
  91. package/node_modules/cpu-features/deps/cpu_features/cmake/README.md +30 -0
  92. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile +252 -0
  93. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md +40 -0
  94. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot +64 -0
  95. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg +312 -0
  96. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh +7 -0
  97. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile +48 -0
  98. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile +34 -0
  99. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt +22 -0
  100. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp +11 -0
  101. package/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile +107 -0
  102. package/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in +15 -0
  103. package/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp +105 -0
  104. package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h +54 -0
  105. package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h +384 -0
  106. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h +259 -0
  107. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h +121 -0
  108. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h +74 -0
  109. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h +149 -0
  110. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h +72 -0
  111. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h +108 -0
  112. package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h +288 -0
  113. package/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h +40 -0
  114. package/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h +37 -0
  115. package/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h +39 -0
  116. package/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h +240 -0
  117. package/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h +49 -0
  118. package/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h +110 -0
  119. package/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h +70 -0
  120. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt +60 -0
  121. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md +4 -0
  122. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c +205 -0
  123. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h +320 -0
  124. package/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c +12 -0
  125. package/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch +456 -0
  126. package/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d +165 -0
  127. package/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh +75 -0
  128. package/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh +490 -0
  129. package/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh +79 -0
  130. package/node_modules/cpu-features/deps/cpu_features/src/copy.inl +19 -0
  131. package/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl +86 -0
  132. package/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl +26 -0
  133. package/node_modules/cpu-features/deps/cpu_features/src/equals.inl +22 -0
  134. package/node_modules/cpu-features/deps/cpu_features/src/filesystem.c +62 -0
  135. package/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c +169 -0
  136. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl +88 -0
  137. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c +79 -0
  138. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +82 -0
  139. package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c +138 -0
  140. package/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c +212 -0
  141. package/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c +93 -0
  142. package/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c +163 -0
  143. package/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c +111 -0
  144. package/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c +120 -0
  145. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl +2055 -0
  146. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c +68 -0
  147. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c +58 -0
  148. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c +57 -0
  149. package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c +58 -0
  150. package/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c +132 -0
  151. package/node_modules/cpu-features/deps/cpu_features/src/string_view.c +192 -0
  152. package/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c +461 -0
  153. package/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt +114 -0
  154. package/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc +53 -0
  155. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc +396 -0
  156. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc +384 -0
  157. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc +176 -0
  158. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc +131 -0
  159. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc +180 -0
  160. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc +82 -0
  161. package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc +1729 -0
  162. package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc +103 -0
  163. package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h +61 -0
  164. package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc +52 -0
  165. package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h +31 -0
  166. package/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc +132 -0
  167. package/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc +202 -0
  168. package/node_modules/cpu-features/lib/index.js +5 -0
  169. package/node_modules/cpu-features/package.json +40 -0
  170. package/node_modules/cpu-features/src/binding.cc +151 -0
  171. package/node_modules/cpu-features/test/test.js +12 -0
  172. package/node_modules/nan/.github/workflows/ci.yml +46 -0
  173. package/node_modules/nan/.pre-commit-config.yaml +8 -0
  174. package/node_modules/nan/CHANGELOG.md +605 -0
  175. package/node_modules/nan/CMakeLists.txt +138 -0
  176. package/node_modules/nan/LICENSE.md +9 -0
  177. package/node_modules/nan/README.md +457 -0
  178. package/node_modules/nan/doc/asyncworker.md +146 -0
  179. package/node_modules/nan/doc/buffers.md +54 -0
  180. package/node_modules/nan/doc/callback.md +76 -0
  181. package/node_modules/nan/doc/converters.md +41 -0
  182. package/node_modules/nan/doc/errors.md +226 -0
  183. package/node_modules/nan/doc/json.md +62 -0
  184. package/node_modules/nan/doc/maybe_types.md +583 -0
  185. package/node_modules/nan/doc/methods.md +689 -0
  186. package/node_modules/nan/doc/new.md +147 -0
  187. package/node_modules/nan/doc/node_misc.md +123 -0
  188. package/node_modules/nan/doc/object_wrappers.md +263 -0
  189. package/node_modules/nan/doc/persistent.md +296 -0
  190. package/node_modules/nan/doc/scopes.md +73 -0
  191. package/node_modules/nan/doc/script.md +58 -0
  192. package/node_modules/nan/doc/string_bytes.md +81 -0
  193. package/node_modules/nan/doc/v8_internals.md +211 -0
  194. package/node_modules/nan/doc/v8_misc.md +85 -0
  195. package/node_modules/nan/include_dirs.js +1 -0
  196. package/node_modules/nan/nan.h +3202 -0
  197. package/node_modules/nan/nan_callbacks.h +141 -0
  198. package/node_modules/nan/nan_callbacks_12_inl.h +730 -0
  199. package/node_modules/nan/nan_callbacks_pre_12_inl.h +528 -0
  200. package/node_modules/nan/nan_converters.h +72 -0
  201. package/node_modules/nan/nan_converters_43_inl.h +68 -0
  202. package/node_modules/nan/nan_converters_pre_43_inl.h +42 -0
  203. package/node_modules/nan/nan_define_own_property_helper.h +29 -0
  204. package/node_modules/nan/nan_implementation_12_inl.h +446 -0
  205. package/node_modules/nan/nan_implementation_pre_12_inl.h +263 -0
  206. package/node_modules/nan/nan_json.h +166 -0
  207. package/node_modules/nan/nan_maybe_43_inl.h +360 -0
  208. package/node_modules/nan/nan_maybe_pre_43_inl.h +268 -0
  209. package/node_modules/nan/nan_new.h +340 -0
  210. package/node_modules/nan/nan_object_wrap.h +156 -0
  211. package/node_modules/nan/nan_persistent_12_inl.h +132 -0
  212. package/node_modules/nan/nan_persistent_pre_12_inl.h +242 -0
  213. package/node_modules/nan/nan_private.h +73 -0
  214. package/node_modules/nan/nan_scriptorigin.h +97 -0
  215. package/node_modules/nan/nan_string_bytes.h +305 -0
  216. package/node_modules/nan/nan_typedarray_contents.h +96 -0
  217. package/node_modules/nan/nan_weak.h +453 -0
  218. package/node_modules/nan/package.json +38 -0
  219. package/node_modules/nan/tools/1to2.js +412 -0
  220. package/node_modules/nan/tools/README.md +14 -0
  221. package/node_modules/nan/tools/package.json +19 -0
  222. package/node_modules/safer-buffer/LICENSE +21 -0
  223. package/node_modules/safer-buffer/Porting-Buffer.md +268 -0
  224. package/node_modules/safer-buffer/Readme.md +156 -0
  225. package/node_modules/safer-buffer/dangerous.js +58 -0
  226. package/node_modules/safer-buffer/package.json +34 -0
  227. package/node_modules/safer-buffer/safer.js +77 -0
  228. package/node_modules/safer-buffer/tests.js +406 -0
  229. package/node_modules/ssh2/.eslintignore +4 -0
  230. package/node_modules/ssh2/.eslintrc.js +5 -0
  231. package/node_modules/ssh2/.github/workflows/ci.yml +110 -0
  232. package/node_modules/ssh2/.github/workflows/lint.yml +27 -0
  233. package/node_modules/ssh2/LICENSE +19 -0
  234. package/node_modules/ssh2/README.md +1529 -0
  235. package/node_modules/ssh2/SFTP.md +413 -0
  236. package/node_modules/ssh2/examples/server-chat.js +238 -0
  237. package/node_modules/ssh2/examples/sftp-server-download-only.js +134 -0
  238. package/node_modules/ssh2/install.js +27 -0
  239. package/node_modules/ssh2/lib/Channel.js +295 -0
  240. package/node_modules/ssh2/lib/agent.js +1123 -0
  241. package/node_modules/ssh2/lib/client.js +2176 -0
  242. package/node_modules/ssh2/lib/http-agents.js +84 -0
  243. package/node_modules/ssh2/lib/index.js +44 -0
  244. package/node_modules/ssh2/lib/keygen.js +582 -0
  245. package/node_modules/ssh2/lib/protocol/Protocol.js +2136 -0
  246. package/node_modules/ssh2/lib/protocol/SFTP.js +4052 -0
  247. package/node_modules/ssh2/lib/protocol/constants.js +356 -0
  248. package/node_modules/ssh2/lib/protocol/crypto/binding.gyp +23 -0
  249. package/node_modules/ssh2/lib/protocol/crypto/poly1305.js +43 -0
  250. package/node_modules/ssh2/lib/protocol/crypto/src/binding.cc +2300 -0
  251. package/node_modules/ssh2/lib/protocol/crypto.js +1602 -0
  252. package/node_modules/ssh2/lib/protocol/handlers.js +16 -0
  253. package/node_modules/ssh2/lib/protocol/handlers.misc.js +1285 -0
  254. package/node_modules/ssh2/lib/protocol/kex.js +1908 -0
  255. package/node_modules/ssh2/lib/protocol/keyParser.js +1484 -0
  256. package/node_modules/ssh2/lib/protocol/node-fs-compat.js +115 -0
  257. package/node_modules/ssh2/lib/protocol/utils.js +356 -0
  258. package/node_modules/ssh2/lib/protocol/zlib.js +255 -0
  259. package/node_modules/ssh2/lib/server.js +1380 -0
  260. package/node_modules/ssh2/lib/utils.js +336 -0
  261. package/node_modules/ssh2/package.json +49 -0
  262. package/node_modules/ssh2/test/common.js +316 -0
  263. package/node_modules/ssh2/test/fixtures/bad_rsa_private_key +26 -0
  264. package/node_modules/ssh2/test/fixtures/https_cert.pem +33 -0
  265. package/node_modules/ssh2/test/fixtures/https_key.pem +52 -0
  266. package/node_modules/ssh2/test/fixtures/id_dsa +12 -0
  267. package/node_modules/ssh2/test/fixtures/id_ecdsa +5 -0
  268. package/node_modules/ssh2/test/fixtures/id_rsa +15 -0
  269. package/node_modules/ssh2/test/fixtures/id_rsa.ppk +26 -0
  270. package/node_modules/ssh2/test/fixtures/id_rsa_enc +30 -0
  271. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa +21 -0
  272. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa.pub +1 -0
  273. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa.pub.result +7 -0
  274. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa.result +7 -0
  275. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc +22 -0
  276. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc.pub +1 -0
  277. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc.pub.result +7 -0
  278. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc.result +7 -0
  279. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm +23 -0
  280. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm.pub +1 -0
  281. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm.pub.result +7 -0
  282. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm.result +7 -0
  283. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa +9 -0
  284. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa.pub +1 -0
  285. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa.pub.result +7 -0
  286. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa.result +7 -0
  287. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc +10 -0
  288. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc.pub +1 -0
  289. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc.pub.result +8 -0
  290. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc.result +7 -0
  291. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm +10 -0
  292. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm.pub +1 -0
  293. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm.pub.result +8 -0
  294. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm.result +7 -0
  295. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519 +7 -0
  296. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519.pub +1 -0
  297. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519.pub.result +7 -0
  298. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519.result +7 -0
  299. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa +27 -0
  300. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa.pub +1 -0
  301. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa.pub.result +7 -0
  302. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa.result +7 -0
  303. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc +28 -0
  304. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc.pub +1 -0
  305. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc.pub.result +8 -0
  306. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc.result +7 -0
  307. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm +29 -0
  308. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm.pub +1 -0
  309. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm.pub.result +8 -0
  310. package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm.result +7 -0
  311. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa +12 -0
  312. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa.pub +1 -0
  313. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa.pub.result +7 -0
  314. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa.result +7 -0
  315. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc +15 -0
  316. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc.pub +1 -0
  317. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc.pub.result +8 -0
  318. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc.result +7 -0
  319. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa +5 -0
  320. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa.pub +1 -0
  321. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa.pub.result +7 -0
  322. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa.result +7 -0
  323. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc +8 -0
  324. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc.pub +1 -0
  325. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc.pub.result +8 -0
  326. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc.result +7 -0
  327. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa +27 -0
  328. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa.pub +1 -0
  329. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa.pub.result +7 -0
  330. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa.result +7 -0
  331. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc +30 -0
  332. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc.pub +1 -0
  333. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc.pub.result +8 -0
  334. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc.result +7 -0
  335. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256 +54 -0
  336. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256.pub +1 -0
  337. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256.pub.result +6 -0
  338. package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256.result +6 -0
  339. package/node_modules/ssh2/test/fixtures/keyParser/ppk_dsa_enc +17 -0
  340. package/node_modules/ssh2/test/fixtures/keyParser/ppk_dsa_enc.result +7 -0
  341. package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa +26 -0
  342. package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa.result +7 -0
  343. package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa_enc +18 -0
  344. package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa_enc.result +7 -0
  345. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa.pub +9 -0
  346. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa.pub.result +7 -0
  347. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa2.pub +10 -0
  348. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa2.pub.result +7 -0
  349. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa3.pub +11 -0
  350. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa3.pub.result +7 -0
  351. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa4.pub +11 -0
  352. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa4.pub.result +7 -0
  353. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa5.pub +8 -0
  354. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa5.pub.result +7 -0
  355. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa6.pub +13 -0
  356. package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa6.pub.result +7 -0
  357. package/node_modules/ssh2/test/fixtures/openssh_new_rsa +27 -0
  358. package/node_modules/ssh2/test/fixtures/ssh_host_dsa_key +12 -0
  359. package/node_modules/ssh2/test/fixtures/ssh_host_ecdsa_key +5 -0
  360. package/node_modules/ssh2/test/fixtures/ssh_host_rsa_key +15 -0
  361. package/node_modules/ssh2/test/test-exec.js +578 -0
  362. package/node_modules/ssh2/test/test-integration-openssh.js +486 -0
  363. package/node_modules/ssh2/test/test-keygen.js +60 -0
  364. package/node_modules/ssh2/test/test-misc-client-server.js +1460 -0
  365. package/node_modules/ssh2/test/test-openssh.js +261 -0
  366. package/node_modules/ssh2/test/test-protocol-crypto.js +631 -0
  367. package/node_modules/ssh2/test/test-protocol-keyparser.js +177 -0
  368. package/node_modules/ssh2/test/test-server-hostkeys.js +138 -0
  369. package/node_modules/ssh2/test/test-sftp.js +842 -0
  370. package/node_modules/ssh2/test/test-shell.js +109 -0
  371. package/node_modules/ssh2/test/test-userauth-agent-openssh.js +110 -0
  372. package/node_modules/ssh2/test/test-userauth-agent.js +171 -0
  373. package/node_modules/ssh2/test/test-userauth.js +611 -0
  374. package/node_modules/ssh2/test/test-worker-imports.js +25 -0
  375. package/node_modules/ssh2/test/test.js +20 -0
  376. package/node_modules/ssh2/util/build_pagent.bat +2 -0
  377. package/node_modules/ssh2/util/pagent.c +88 -0
  378. package/node_modules/ssh2/util/pagent.exe +0 -0
  379. package/node_modules/tweetnacl/.npmignore +4 -0
  380. package/node_modules/tweetnacl/AUTHORS.md +28 -0
  381. package/node_modules/tweetnacl/CHANGELOG.md +221 -0
  382. package/node_modules/tweetnacl/LICENSE +24 -0
  383. package/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md +20 -0
  384. package/node_modules/tweetnacl/README.md +459 -0
  385. package/node_modules/tweetnacl/nacl-fast.js +2388 -0
  386. package/node_modules/tweetnacl/nacl-fast.min.js +2 -0
  387. package/node_modules/tweetnacl/nacl.d.ts +98 -0
  388. package/node_modules/tweetnacl/nacl.js +1175 -0
  389. package/node_modules/tweetnacl/nacl.min.js +1 -0
  390. package/node_modules/tweetnacl/package.json +58 -0
  391. package/package.json +95 -89
@@ -0,0 +1,842 @@
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+ const { constants } = require('fs');
5
+
6
+ const {
7
+ fixture,
8
+ mustCall,
9
+ mustCallAtLeast,
10
+ mustNotCall,
11
+ setup: setup_,
12
+ setupSimple
13
+ } = require('./common.js');
14
+
15
+ const { OPEN_MODE, Stats, STATUS_CODE } = require('../lib/protocol/SFTP.js');
16
+
17
+ const DEBUG = false;
18
+
19
+ setup('open', mustCall((client, server) => {
20
+ const path_ = '/tmp/foo.txt';
21
+ const handle_ = Buffer.from('node.js');
22
+ const pflags_ = (OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE);
23
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
24
+ assert(id === 0, `Wrong request id: ${id}`);
25
+ assert(path === path_, `Wrong path: ${path}`);
26
+ assert(pflags === pflags_, `Wrong flags: ${flagsToHuman(pflags)}`);
27
+ server.handle(id, handle_);
28
+ server.end();
29
+ }));
30
+ client.open(path_, 'w', mustCall((err, handle) => {
31
+ assert(!err, `Unexpected open() error: ${err}`);
32
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
33
+ }));
34
+ }));
35
+
36
+ setup('close', mustCall((client, server) => {
37
+ const handle_ = Buffer.from('node.js');
38
+ server.on('CLOSE', mustCall((id, handle) => {
39
+ assert(id === 0, `Wrong request id: ${id}`);
40
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
41
+ server.status(id, STATUS_CODE.OK);
42
+ server.end();
43
+ }));
44
+ client.close(handle_, mustCall((err) => {
45
+ assert(!err, `Unexpected close() error: ${err}`);
46
+ }));
47
+ }));
48
+
49
+ setup('read', mustCall((client, server) => {
50
+ const expected = Buffer.from('node.jsnode.jsnode.jsnode.jsnode.jsnode.js');
51
+ const handle_ = Buffer.from('node.js');
52
+ const buf = Buffer.alloc(expected.length);
53
+ server.on('READ', mustCall((id, handle, offset, len) => {
54
+ assert(id === 0, `Wrong request id: ${id}`);
55
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
56
+ assert(offset === 5, `Wrong read offset: ${offset}`);
57
+ assert(len === buf.length, `Wrong read len: ${len}`);
58
+ server.data(id, expected);
59
+ server.end();
60
+ }));
61
+ client.read(handle_, buf, 0, buf.length, 5, mustCall((err, nb) => {
62
+ assert(!err, `Unexpected read() error: ${err}`);
63
+ assert.deepStrictEqual(buf, expected, 'read data mismatch');
64
+ }));
65
+ }));
66
+
67
+ setup('read (partial)', mustCall((client, server) => {
68
+ const expected = Buffer.from('blargh');
69
+ const handle_ = Buffer.from('node.js');
70
+ const buf = Buffer.alloc(256);
71
+ server.on('READ', mustCall((id, handle, offset, len) => {
72
+ assert(id === 0, `Wrong request id: ${id}`);
73
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
74
+ assert(offset === 0, `Wrong read offset: ${offset}`);
75
+ assert(len === buf.length, `Wrong read len: ${len}`);
76
+ server.data(id, expected);
77
+ server.end();
78
+ }));
79
+ client.read(handle_, buf, 0, buf.length, 0, mustCall((err, nb, data) => {
80
+ assert(!err, `Unexpected read() error: ${err}`);
81
+ assert.strictEqual(nb, expected.length, 'nb count mismatch');
82
+ assert.deepStrictEqual(
83
+ buf.slice(0, expected.length),
84
+ expected,
85
+ 'read data mismatch'
86
+ );
87
+ assert.deepStrictEqual(data, expected, 'read data mismatch');
88
+ }));
89
+ }));
90
+
91
+ setup('read (overflow)', mustCall((client, server) => {
92
+ const maxChunk = client._maxReadLen;
93
+ const expected = Buffer.alloc(3 * maxChunk, 'Q');
94
+ const handle_ = Buffer.from('node.js');
95
+ const buf = Buffer.alloc(expected.length, 0);
96
+ let reqs = 0;
97
+ server.on('READ', mustCall((id, handle, offset, len) => {
98
+ ++reqs;
99
+ assert.strictEqual(id, reqs - 1, `Wrong request id: ${id}`);
100
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
101
+ assert.strictEqual(offset,
102
+ (reqs - 1) * maxChunk,
103
+ `Wrong read offset: ${offset}`);
104
+ server.data(id, expected.slice(offset, offset + len));
105
+ if (reqs === 3)
106
+ server.end();
107
+ }, 3));
108
+ client.read(handle_, buf, 0, buf.length, 0, mustCall((err, nb) => {
109
+ assert(!err, `Unexpected read() error: ${err}`);
110
+ assert.deepStrictEqual(buf, expected);
111
+ assert.strictEqual(nb, buf.length, 'read nb mismatch');
112
+ }));
113
+ }));
114
+
115
+ setup('write', mustCall((client, server) => {
116
+ const handle_ = Buffer.from('node.js');
117
+ const buf = Buffer.from('node.jsnode.jsnode.jsnode.jsnode.jsnode.js');
118
+ server.on('WRITE', mustCall((id, handle, offset, data) => {
119
+ assert(id === 0, `Wrong request id: ${id}`);
120
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
121
+ assert(offset === 5, `Wrong write offset: ${offset}`);
122
+ assert.deepStrictEqual(data, buf, 'write data mismatch');
123
+ server.status(id, STATUS_CODE.OK);
124
+ server.end();
125
+ }));
126
+ client.write(handle_, buf, 0, buf.length, 5, mustCall((err, nb) => {
127
+ assert(!err, `Unexpected write() error: ${err}`);
128
+ assert.strictEqual(nb, buf.length, 'wrong bytes written');
129
+ }));
130
+ }));
131
+
132
+ setup('write (overflow)', mustCall((client, server) => {
133
+ const maxChunk = client._maxWriteLen;
134
+ const handle_ = Buffer.from('node.js');
135
+ const buf = Buffer.allocUnsafe(3 * maxChunk);
136
+ let reqs = 0;
137
+ server.on('WRITE', mustCall((id, handle, offset, data) => {
138
+ ++reqs;
139
+ assert.strictEqual(id, reqs - 1, `Wrong request id: ${id}`);
140
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
141
+ assert.strictEqual(offset,
142
+ (reqs - 1) * maxChunk,
143
+ `Wrong write offset: ${offset}`);
144
+ assert((offset + data.length) <= buf.length, 'bad offset');
145
+ assert.deepStrictEqual(data,
146
+ buf.slice(offset, offset + data.length),
147
+ 'write data mismatch');
148
+ server.status(id, STATUS_CODE.OK);
149
+ if (reqs === 3)
150
+ server.end();
151
+ }, 3));
152
+ client.write(handle_, buf, 0, buf.length, 0, mustCall((err, nb) => {
153
+ assert(!err, `Unexpected write() error: ${err}`);
154
+ assert.strictEqual(nb, buf.length, 'wrote bytes written');
155
+ }));
156
+ }));
157
+
158
+ setup('lstat', mustCall((client, server) => {
159
+ const path_ = '/foo/bar/baz';
160
+ const attrs_ = new Stats({
161
+ size: 10 * 1024,
162
+ uid: 9001,
163
+ gid: 9001,
164
+ atime: (Date.now() / 1000) | 0,
165
+ mtime: (Date.now() / 1000) | 0
166
+ });
167
+ server.on('LSTAT', mustCall((id, path) => {
168
+ assert(id === 0, `Wrong request id: ${id}`);
169
+ assert(path === path_, `Wrong path: ${path}`);
170
+ server.attrs(id, attrs_);
171
+ server.end();
172
+ }));
173
+ client.lstat(path_, mustCall((err, attrs) => {
174
+ assert(!err, `Unexpected lstat() error: ${err}`);
175
+ assert.deepStrictEqual(attrs, attrs_, 'attrs mismatch');
176
+ }));
177
+ }));
178
+
179
+ setup('fstat', mustCall((client, server) => {
180
+ const handle_ = Buffer.from('node.js');
181
+ const attrs_ = new Stats({
182
+ size: 10 * 1024,
183
+ uid: 9001,
184
+ gid: 9001,
185
+ atime: (Date.now() / 1000) | 0,
186
+ mtime: (Date.now() / 1000) | 0
187
+ });
188
+ server.on('FSTAT', mustCall((id, handle) => {
189
+ assert(id === 0, `Wrong request id: ${id}`);
190
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
191
+ server.attrs(id, attrs_);
192
+ server.end();
193
+ }));
194
+ client.fstat(handle_, mustCall((err, attrs) => {
195
+ assert(!err, `Unexpected fstat() error: ${err}`);
196
+ assert.deepStrictEqual(attrs, attrs_, 'attrs mismatch');
197
+ }));
198
+ }));
199
+
200
+ setup('setstat', mustCall((client, server) => {
201
+ const path_ = '/foo/bar/baz';
202
+ const attrs_ = new Stats({
203
+ uid: 9001,
204
+ gid: 9001,
205
+ atime: (Date.now() / 1000) | 0,
206
+ mtime: (Date.now() / 1000) | 0
207
+ });
208
+ server.on('SETSTAT', mustCall((id, path, attrs) => {
209
+ assert(id === 0, `Wrong request id: ${id}`);
210
+ assert(path === path_, `Wrong path: ${path}`);
211
+ assert.deepStrictEqual(attrs, attrs_, 'attrs mismatch');
212
+ server.status(id, STATUS_CODE.OK);
213
+ server.end();
214
+ }));
215
+ client.setstat(path_, attrs_, mustCall((err) => {
216
+ assert(!err, `Unexpected setstat() error: ${err}`);
217
+ }));
218
+ }));
219
+
220
+ setup('fsetstat', mustCall((client, server) => {
221
+ const handle_ = Buffer.from('node.js');
222
+ const attrs_ = new Stats({
223
+ uid: 9001,
224
+ gid: 9001,
225
+ atime: (Date.now() / 1000) | 0,
226
+ mtime: (Date.now() / 1000) | 0
227
+ });
228
+ server.on('FSETSTAT', mustCall((id, handle, attrs) => {
229
+ assert(id === 0, `Wrong request id: ${id}`);
230
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
231
+ assert.deepStrictEqual(attrs, attrs_, 'attrs mismatch');
232
+ server.status(id, STATUS_CODE.OK);
233
+ server.end();
234
+ }));
235
+ client.fsetstat(handle_, attrs_, mustCall((err) => {
236
+ assert(!err, `Unexpected fsetstat() error: ${err}`);
237
+ }));
238
+ }));
239
+
240
+ setup('opendir', mustCall((client, server) => {
241
+ const handle_ = Buffer.from('node.js');
242
+ const path_ = '/tmp';
243
+ server.on('OPENDIR', mustCall((id, path) => {
244
+ assert(id === 0, `Wrong request id: ${id}`);
245
+ assert(path === path_, `Wrong path: ${path}`);
246
+ server.handle(id, handle_);
247
+ server.end();
248
+ }));
249
+ client.opendir(path_, mustCall((err, handle) => {
250
+ assert(!err, `Unexpected opendir() error: ${err}`);
251
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
252
+ }));
253
+ }));
254
+
255
+ setup('readdir', mustCall((client, server) => {
256
+ const handle_ = Buffer.from('node.js');
257
+ const list_ = [
258
+ { filename: '.',
259
+ longname: 'drwxr-xr-x 56 nodejs nodejs 4096 Nov 10 01:05 .',
260
+ attrs: new Stats({
261
+ mode: 0o755 | constants.S_IFDIR,
262
+ size: 4096,
263
+ uid: 9001,
264
+ gid: 8001,
265
+ atime: 1415599549,
266
+ mtime: 1415599590
267
+ })
268
+ },
269
+ { filename: '..',
270
+ longname: 'drwxr-xr-x 4 root root 4096 May 16 2013 ..',
271
+ attrs: new Stats({
272
+ mode: 0o755 | constants.S_IFDIR,
273
+ size: 4096,
274
+ uid: 0,
275
+ gid: 0,
276
+ atime: 1368729954,
277
+ mtime: 1368729999
278
+ })
279
+ },
280
+ { filename: 'foo',
281
+ longname: 'drwxrwxrwx 2 nodejs nodejs 4096 Mar 8 2009 foo',
282
+ attrs: new Stats({
283
+ mode: 0o777 | constants.S_IFDIR,
284
+ size: 4096,
285
+ uid: 9001,
286
+ gid: 8001,
287
+ atime: 1368729954,
288
+ mtime: 1368729999
289
+ })
290
+ },
291
+ { filename: 'bar',
292
+ longname: '-rw-r--r-- 1 nodejs nodejs 513901992 Dec 4 2009 bar',
293
+ attrs: new Stats({
294
+ mode: 0o644 | constants.S_IFREG,
295
+ size: 513901992,
296
+ uid: 9001,
297
+ gid: 8001,
298
+ atime: 1259972199,
299
+ mtime: 1259972199
300
+ })
301
+ }
302
+ ];
303
+ server.on('READDIR', mustCall((id, handle) => {
304
+ assert(id === 0, `Wrong request id: ${id}`);
305
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
306
+ server.name(id, list_);
307
+ server.end();
308
+ }));
309
+ client.readdir(handle_, mustCall((err, list) => {
310
+ assert(!err, `Unexpected readdir() error: ${err}`);
311
+ assert.deepStrictEqual(list,
312
+ list_.slice(2),
313
+ 'dir list mismatch');
314
+ }));
315
+ }));
316
+
317
+ setup('readdir (full)', mustCall((client, server) => {
318
+ const handle_ = Buffer.from('node.js');
319
+ const list_ = [
320
+ { filename: '.',
321
+ longname: 'drwxr-xr-x 56 nodejs nodejs 4096 Nov 10 01:05 .',
322
+ attrs: new Stats({
323
+ mode: 0o755 | constants.S_IFDIR,
324
+ size: 4096,
325
+ uid: 9001,
326
+ gid: 8001,
327
+ atime: 1415599549,
328
+ mtime: 1415599590
329
+ })
330
+ },
331
+ { filename: '..',
332
+ longname: 'drwxr-xr-x 4 root root 4096 May 16 2013 ..',
333
+ attrs: new Stats({
334
+ mode: 0o755 | constants.S_IFDIR,
335
+ size: 4096,
336
+ uid: 0,
337
+ gid: 0,
338
+ atime: 1368729954,
339
+ mtime: 1368729999
340
+ })
341
+ },
342
+ { filename: 'foo',
343
+ longname: 'drwxrwxrwx 2 nodejs nodejs 4096 Mar 8 2009 foo',
344
+ attrs: new Stats({
345
+ mode: 0o777 | constants.S_IFDIR,
346
+ size: 4096,
347
+ uid: 9001,
348
+ gid: 8001,
349
+ atime: 1368729954,
350
+ mtime: 1368729999
351
+ })
352
+ },
353
+ { filename: 'bar',
354
+ longname: '-rw-r--r-- 1 nodejs nodejs 513901992 Dec 4 2009 bar',
355
+ attrs: new Stats({
356
+ mode: 0o644 | constants.S_IFREG,
357
+ size: 513901992,
358
+ uid: 9001,
359
+ gid: 8001,
360
+ atime: 1259972199,
361
+ mtime: 1259972199
362
+ })
363
+ }
364
+ ];
365
+ server.on('READDIR', mustCall((id, handle) => {
366
+ assert(id === 0, `Wrong request id: ${id}`);
367
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
368
+ server.name(id, list_);
369
+ server.end();
370
+ }));
371
+ client.readdir(handle_, { full: true }, mustCall((err, list) => {
372
+ assert(!err, `Unexpected readdir() error: ${err}`);
373
+ assert.deepStrictEqual(list, list_, 'dir list mismatch');
374
+ }));
375
+ }));
376
+
377
+ setup('readdir (EOF)', mustCall((client, server) => {
378
+ const handle_ = Buffer.from('node.js');
379
+ server.on('READDIR', mustCall((id, handle) => {
380
+ assert(id === 0, `Wrong request id: ${id}`);
381
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
382
+ server.status(id, STATUS_CODE.EOF);
383
+ server.end();
384
+ }));
385
+ client.readdir(handle_, mustCall((err, list) => {
386
+ assert(err && err.code === STATUS_CODE.EOF,
387
+ `Expected EOF, got: ${err}`);
388
+ }));
389
+ }));
390
+
391
+ setup('unlink', mustCall((client, server) => {
392
+ const path_ = '/foo/bar/baz';
393
+ server.on('REMOVE', mustCall((id, path) => {
394
+ assert(id === 0, `Wrong request id: ${id}`);
395
+ assert(path === path_, `Wrong path: ${path}`);
396
+ server.status(id, STATUS_CODE.OK);
397
+ server.end();
398
+ }));
399
+ client.unlink(path_, mustCall((err) => {
400
+ assert(!err, `Unexpected unlink() error: ${err}`);
401
+ }));
402
+ }));
403
+
404
+ setup('mkdir', mustCall((client, server) => {
405
+ const path_ = '/foo/bar/baz';
406
+ server.on('MKDIR', mustCall((id, path) => {
407
+ assert(id === 0, `Wrong request id: ${id}`);
408
+ assert(path === path_, `Wrong path: ${path}`);
409
+ server.status(id, STATUS_CODE.OK);
410
+ server.end();
411
+ }));
412
+ client.mkdir(path_, mustCall((err) => {
413
+ assert(!err, `Unexpected mkdir() error: ${err}`);
414
+ }));
415
+ }));
416
+
417
+ setup('rmdir', mustCall((client, server) => {
418
+ const path_ = '/foo/bar/baz';
419
+ server.on('RMDIR', mustCall((id, path) => {
420
+ assert(id === 0, `Wrong request id: ${id}`);
421
+ assert(path === path_, `Wrong path: ${path}`);
422
+ server.status(id, STATUS_CODE.OK);
423
+ server.end();
424
+ }));
425
+ client.rmdir(path_, mustCall((err) => {
426
+ assert(!err, `Unexpected rmdir() error: ${err}`);
427
+ }));
428
+ }));
429
+
430
+ setup('realpath', mustCall((client, server) => {
431
+ const path_ = '/foo/bar/baz';
432
+ const name_ = { filename: '/tmp/foo' };
433
+ server.on('REALPATH', mustCall((id, path) => {
434
+ assert(id === 0, `Wrong request id: ${id}`);
435
+ assert(path === path_, `Wrong path: ${path}`);
436
+ server.name(id, name_);
437
+ server.end();
438
+ }));
439
+ client.realpath(path_, mustCall((err, name) => {
440
+ assert(!err, `Unexpected realpath() error: ${err}`);
441
+ assert.deepStrictEqual(name, name_.filename, 'name mismatch');
442
+ }));
443
+ }));
444
+
445
+ setup('stat', mustCall((client, server) => {
446
+ const path_ = '/foo/bar/baz';
447
+ const attrs_ = new Stats({
448
+ mode: 0o644 | constants.S_IFREG,
449
+ size: 10 * 1024,
450
+ uid: 9001,
451
+ gid: 9001,
452
+ atime: (Date.now() / 1000) | 0,
453
+ mtime: (Date.now() / 1000) | 0
454
+ });
455
+ server.on('STAT', mustCall((id, path) => {
456
+ assert(id === 0, `Wrong request id: ${id}`);
457
+ assert(path === path_, `Wrong path: ${path}`);
458
+ server.attrs(id, attrs_);
459
+ server.end();
460
+ }));
461
+ client.stat(path_, mustCall((err, attrs) => {
462
+ assert(!err, `Unexpected stat() error: ${err}`);
463
+ assert.deepStrictEqual(attrs, attrs_, 'attrs mismatch');
464
+ const expectedTypes = {
465
+ isDirectory: false,
466
+ isFile: true,
467
+ isBlockDevice: false,
468
+ isCharacterDevice: false,
469
+ isSymbolicLink: false,
470
+ isFIFO: false,
471
+ isSocket: false
472
+ };
473
+ for (const [fn, expect] of Object.entries(expectedTypes))
474
+ assert(attrs[fn]() === expect, `attrs.${fn}() failed`);
475
+ }));
476
+ }));
477
+
478
+ setup('rename', mustCall((client, server) => {
479
+ const oldPath_ = '/foo/bar/baz';
480
+ const newPath_ = '/tmp/foo';
481
+ server.on('RENAME', mustCall((id, oldPath, newPath) => {
482
+ assert(id === 0, `Wrong request id: ${id}`);
483
+ assert(oldPath === oldPath_, `Wrong old path: ${oldPath}`);
484
+ assert(newPath === newPath_, `Wrong new path: ${newPath}`);
485
+ server.status(id, STATUS_CODE.OK);
486
+ server.end();
487
+ }));
488
+ client.rename(oldPath_, newPath_, mustCall((err) => {
489
+ assert(!err, `Unexpected rename() error: ${err}`);
490
+ }));
491
+ }));
492
+
493
+ setup('readlink', mustCall((client, server) => {
494
+ const linkPath_ = '/foo/bar/baz';
495
+ const name = { filename: '/tmp/foo' };
496
+ server.on('READLINK', mustCall((id, linkPath) => {
497
+ assert(id === 0, `Wrong request id: ${id}`);
498
+ assert(linkPath === linkPath_, `Wrong link path: ${linkPath}`);
499
+ server.name(id, name);
500
+ server.end();
501
+ }));
502
+ client.readlink(linkPath_, mustCall((err, targetPath) => {
503
+ assert(!err, `Unexpected readlink() error: ${err}`);
504
+ assert(targetPath === name.filename,
505
+ `Wrong target path: ${targetPath}`);
506
+ }));
507
+ }));
508
+
509
+ setup('symlink', mustCall((client, server) => {
510
+ const linkPath_ = '/foo/bar/baz';
511
+ const targetPath_ = '/tmp/foo';
512
+ server.on('SYMLINK', mustCall((id, linkPath, targetPath) => {
513
+ assert(id === 0, `Wrong request id: ${id}`);
514
+ assert(linkPath === linkPath_, `Wrong link path: ${linkPath}`);
515
+ assert(targetPath === targetPath_, `Wrong target path: ${targetPath}`);
516
+ server.status(id, STATUS_CODE.OK);
517
+ server.end();
518
+ }));
519
+ client.symlink(targetPath_, linkPath_, mustCall((err) => {
520
+ assert(!err, `Unexpected symlink() error: ${err}`);
521
+ }));
522
+ }));
523
+
524
+ setup('readFile', mustCall((client, server) => {
525
+ const path_ = '/foo/bar/baz';
526
+ const handle_ = Buffer.from('hi mom!');
527
+ const data_ = Buffer.from('hello world');
528
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
529
+ assert(id === 0, `Wrong request id: ${id}`);
530
+ assert(path === path_, `Wrong path: ${path}`);
531
+ assert(pflags === OPEN_MODE.READ, `Wrong flags: ${flagsToHuman(pflags)}`);
532
+ server.handle(id, handle_);
533
+ })).on('FSTAT', mustCall((id, handle) => {
534
+ assert(id === 1, `Wrong request id: ${id}`);
535
+ const attrs = new Stats({
536
+ size: data_.length,
537
+ uid: 9001,
538
+ gid: 9001,
539
+ atime: (Date.now() / 1000) | 0,
540
+ mtime: (Date.now() / 1000) | 0
541
+ });
542
+ server.attrs(id, attrs);
543
+ })).on('READ', mustCall((id, handle, offset, len) => {
544
+ assert(id === 2, `Wrong request id: ${id}`);
545
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
546
+ assert(offset === 0, `Wrong read offset: ${offset}`);
547
+ server.data(id, data_);
548
+ })).on('CLOSE', mustCall((id, handle) => {
549
+ assert(id === 3, `Wrong request id: ${id}`);
550
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
551
+ server.status(id, STATUS_CODE.OK);
552
+ server.end();
553
+ }));
554
+ client.readFile(path_, mustCall((err, buf) => {
555
+ assert(!err, `Unexpected error: ${err}`);
556
+ assert.deepStrictEqual(buf, data_, 'data mismatch');
557
+ }));
558
+ }));
559
+
560
+ setup('readFile (no size from fstat)', mustCall((client, server) => {
561
+ const path_ = '/foo/bar/baz';
562
+ const handle_ = Buffer.from('hi mom!');
563
+ const data_ = Buffer.from('hello world');
564
+ let reads = 0;
565
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
566
+ assert(id === 0, `Wrong request id: ${id}`);
567
+ assert(path === path_, `Wrong path: ${path}`);
568
+ assert(pflags === OPEN_MODE.READ, `Wrong flags: ${flagsToHuman(pflags)}`);
569
+ server.handle(id, handle_);
570
+ })).on('FSTAT', mustCall((id, handle) => {
571
+ assert(id === 1, `Wrong request id: ${id}`);
572
+ const attrs = new Stats({
573
+ uid: 9001,
574
+ gid: 9001,
575
+ atime: (Date.now() / 1000) | 0,
576
+ mtime: (Date.now() / 1000) | 0
577
+ });
578
+ server.attrs(id, attrs);
579
+ })).on('READ', mustCall((id, handle, offset, len) => {
580
+ assert(++reads + 1 === id, `Wrong request id: ${id}`);
581
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
582
+ switch (id) {
583
+ case 2:
584
+ assert(offset === 0, `Wrong read offset for first read: ${offset}`);
585
+ server.data(id, data_);
586
+ break;
587
+ case 3:
588
+ assert(offset === data_.length,
589
+ `Wrong read offset for second read: ${offset}`);
590
+ server.status(id, STATUS_CODE.EOF);
591
+ break;
592
+ }
593
+ }, 2)).on('CLOSE', mustCall((id, handle) => {
594
+ assert(id === 4, `Wrong request id: ${id}`);
595
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
596
+ server.status(id, STATUS_CODE.OK);
597
+ server.end();
598
+ }));
599
+ client.readFile(path_, mustCall((err, buf) => {
600
+ assert(!err, `Unexpected error: ${err}`);
601
+ assert.deepStrictEqual(buf, data_, 'data mismatch');
602
+ }));
603
+ }));
604
+
605
+ setup('ReadStream', mustCall((client, server) => {
606
+ let reads = 0;
607
+ const path_ = '/foo/bar/baz';
608
+ const handle_ = Buffer.from('hi mom!');
609
+ const data_ = Buffer.from('hello world');
610
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
611
+ assert(id === 0, `Wrong request id: ${id}`);
612
+ assert(path === path_, `Wrong path: ${path}`);
613
+ assert(pflags === OPEN_MODE.READ, `Wrong flags: ${flagsToHuman(pflags)}`);
614
+ server.handle(id, handle_);
615
+ })).on('READ', mustCall((id, handle, offset, len) => {
616
+ assert(id === ++reads, `Wrong request id: ${id}`);
617
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
618
+ if (reads === 1) {
619
+ assert(offset === 0, `Wrong read offset: ${offset}`);
620
+ server.data(id, data_);
621
+ } else {
622
+ server.status(id, STATUS_CODE.EOF);
623
+ }
624
+ }, 2)).on('CLOSE', mustCall((id, handle) => {
625
+ assert(id === 3, `Wrong request id: ${id}`);
626
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
627
+ server.status(id, STATUS_CODE.OK);
628
+ server.end();
629
+ }));
630
+ let buf = [];
631
+ client.createReadStream(path_).on('readable', mustCallAtLeast(function() {
632
+ let chunk;
633
+ while ((chunk = this.read()) !== null)
634
+ buf.push(chunk);
635
+ })).on('end', mustCall(() => {
636
+ buf = Buffer.concat(buf);
637
+ assert.deepStrictEqual(buf, data_, 'data mismatch');
638
+ }));
639
+ }));
640
+
641
+ setup('ReadStream (fewer bytes than requested)', mustCall((client, server) => {
642
+ const path_ = '/foo/bar/baz';
643
+ const handle_ = Buffer.from('hi mom!');
644
+ const data_ = Buffer.from('hello world');
645
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
646
+ server.handle(id, handle_);
647
+ })).on('READ', mustCallAtLeast((id, handle, offset, len) => {
648
+ if (offset > data_.length) {
649
+ server.status(id, STATUS_CODE.EOF);
650
+ } else {
651
+ // Only read 4 bytes at a time
652
+ server.data(id, data_.slice(offset, offset + 4));
653
+ }
654
+ })).on('CLOSE', mustCall((id, handle) => {
655
+ server.status(id, STATUS_CODE.OK);
656
+ server.end();
657
+ }));
658
+ let buf = [];
659
+ client.createReadStream(path_).on('readable', mustCallAtLeast(function() {
660
+ let chunk;
661
+ while ((chunk = this.read()) !== null)
662
+ buf.push(chunk);
663
+ })).on('end', mustCall(() => {
664
+ buf = Buffer.concat(buf);
665
+ assert.deepStrictEqual(buf, data_, 'data mismatch');
666
+ }));
667
+ }));
668
+
669
+ setup('ReadStream (error)', mustCall((client, server) => {
670
+ const path_ = '/foo/bar/baz';
671
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
672
+ assert(id === 0, `Wrong request id: ${id}`);
673
+ assert(path === path_, `Wrong path: ${path}`);
674
+ assert(pflags === OPEN_MODE.READ, `Wrong flags: ${flagsToHuman(pflags)}`);
675
+ server.status(id, STATUS_CODE.NO_SUCH_FILE);
676
+ server.end();
677
+ }));
678
+ client.createReadStream(path_).on('error', mustCall((err) => {
679
+ assert(err.code === STATUS_CODE.NO_SUCH_FILE);
680
+ }));
681
+ }));
682
+
683
+ setup('WriteStream', mustCall((client, server) => {
684
+ let writes = 0;
685
+ const path_ = '/foo/bar/baz';
686
+ const handle_ = Buffer.from('hi mom!');
687
+ const data_ = Buffer.from('hello world');
688
+ const pflags_ = OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE;
689
+ server.on('OPEN', mustCall((id, path, pflags, attrs) => {
690
+ assert(id === 0, `Wrong request id: ${id}`);
691
+ assert(path === path_, `Wrong path: ${path}`);
692
+ assert(pflags === pflags_, `Wrong flags: ${flagsToHuman(pflags)}`);
693
+ server.handle(id, handle_);
694
+ })).on('FSETSTAT', mustCall((id, handle, attrs) => {
695
+ assert(id === 1, `Wrong request id: ${id}`);
696
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
697
+ assert.strictEqual(attrs.mode, 0o666, 'Wrong file mode');
698
+ server.status(id, STATUS_CODE.OK);
699
+ })).on('WRITE', mustCall((id, handle, offset, data) => {
700
+ assert(id === ++writes + 1, `Wrong request id: ${id}`);
701
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
702
+ assert(offset === ((writes - 1) * data_.length),
703
+ `Wrong write offset: ${offset}`);
704
+ assert.deepStrictEqual(data, data_, 'Wrong data');
705
+ server.status(id, STATUS_CODE.OK);
706
+ }, 3)).on('CLOSE', mustCall((id, handle) => {
707
+ assert(id === 5, `Wrong request id: ${id}`);
708
+ assert.deepStrictEqual(handle, handle_, 'handle mismatch');
709
+ server.status(id, STATUS_CODE.OK);
710
+ server.end();
711
+ }));
712
+
713
+ const writer = client.createWriteStream(path_);
714
+ writer.cork && writer.cork();
715
+ writer.write(data_);
716
+ writer.write(data_);
717
+ writer.write(data_);
718
+ writer.uncork && writer.uncork();
719
+ writer.end();
720
+ }));
721
+
722
+ {
723
+ const { client, server } = setup_(
724
+ 'SFTP server aborts with exit-status',
725
+ {
726
+ client: { username: 'foo', password: 'bar' },
727
+ server: { hostKeys: [ fixture('ssh_host_rsa_key') ] },
728
+ },
729
+ );
730
+
731
+ server.on('connection', mustCall((conn) => {
732
+ conn.on('authentication', mustCall((ctx) => {
733
+ ctx.accept();
734
+ })).on('ready', mustCall(() => {
735
+ conn.on('session', mustCall((accept, reject) => {
736
+ accept().on('sftp', mustCall((accept, reject) => {
737
+ const sftp = accept();
738
+
739
+ // XXX: hack
740
+ sftp._protocol.exitStatus(sftp.outgoing.id, 127);
741
+ sftp._protocol.channelClose(sftp.outgoing.id);
742
+ }));
743
+ }));
744
+ }));
745
+ }));
746
+
747
+ client.on('ready', mustCall(() => {
748
+ const timeout = setTimeout(mustNotCall(), 1000);
749
+ client.sftp(mustCall((err, sftp) => {
750
+ clearTimeout(timeout);
751
+ assert(err, 'Expected error');
752
+ assert(err.code === 127, `Expected exit code 127, saw: ${err.code}`);
753
+ client.end();
754
+ }));
755
+ }));
756
+ }
757
+
758
+ {
759
+ const { client, server } = setup_(
760
+ 'SFTP client sets environment',
761
+ {
762
+ client: { username: 'foo', password: 'bar' },
763
+ server: { hostKeys: [ fixture('ssh_host_rsa_key') ] },
764
+ },
765
+ );
766
+
767
+ const env = { SSH2NODETEST: 'foo' };
768
+
769
+ server.on('connection', mustCall((conn) => {
770
+ conn.on('authentication', mustCall((ctx) => {
771
+ ctx.accept();
772
+ })).on('ready', mustCall(() => {
773
+ conn.on('session', mustCall((accept, reject) => {
774
+ accept().on('env', mustCall((accept, reject, info) => {
775
+ accept && accept();
776
+ assert(info.key === Object.keys(env)[0], 'Wrong env key');
777
+ assert(info.val === Object.values(env)[0], 'Wrong env value');
778
+ })).on('sftp', mustCall((accept, reject) => {
779
+ accept();
780
+ }));
781
+ }));
782
+ }));
783
+ }));
784
+
785
+ client.on('ready', mustCall(() => {
786
+ const timeout = setTimeout(mustNotCall(), 1000);
787
+ client.sftp(env, mustCall((err, sftp) => {
788
+ clearTimeout(timeout);
789
+ assert(!err, `Unexpected exec error: ${err}`);
790
+ client.end();
791
+ }));
792
+ }));
793
+ }
794
+
795
+ // =============================================================================
796
+ function setup(title, cb) {
797
+ const { client, server } = setupSimple(DEBUG, title);
798
+ let clientSFTP;
799
+ let serverSFTP;
800
+
801
+ const onSFTP = mustCall(() => {
802
+ if (clientSFTP && serverSFTP)
803
+ cb(clientSFTP, serverSFTP);
804
+ }, 2);
805
+
806
+ client.on('ready', mustCall(() => {
807
+ client.sftp(mustCall((err, sftp) => {
808
+ assert(!err, `[${title}] Unexpected client sftp start error: ${err}`);
809
+ sftp.on('close', mustCall(() => {
810
+ client.end();
811
+ }));
812
+ clientSFTP = sftp;
813
+ onSFTP();
814
+ }));
815
+ }));
816
+
817
+ server.on('connection', mustCall((conn) => {
818
+ conn.on('ready', mustCall(() => {
819
+ conn.on('session', mustCall((accept, reject) => {
820
+ accept().on('sftp', mustCall((accept, reject) => {
821
+ const sftp = accept();
822
+ sftp.on('close', mustCall(() => {
823
+ conn.end();
824
+ }));
825
+ serverSFTP = sftp;
826
+ onSFTP();
827
+ }));
828
+ }));
829
+ }));
830
+ }));
831
+ }
832
+
833
+ function flagsToHuman(flags) {
834
+ const ret = [];
835
+
836
+ for (const [name, value] of Object.entries(OPEN_MODE)) {
837
+ if (flags & value)
838
+ ret.push(name);
839
+ }
840
+
841
+ return ret.join(' | ');
842
+ }