@encharm/cws 4.5.1 → 4.5.3

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 (249) hide show
  1. package/README.md +3 -5
  2. package/binding.gyp +1 -1
  3. package/dist/bindings/cws_darwin_arm64_node115.node +0 -0
  4. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Info.plist +20 -0
  5. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Resources/DWARF/cws_darwin_arm64_node115.node +0 -0
  6. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Resources/Relocations/aarch64/cws_darwin_arm64_node115.node.yml +931 -0
  7. package/dist/bindings/cws_darwin_arm64_node127.node +0 -0
  8. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Info.plist +20 -0
  9. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Resources/DWARF/cws_darwin_arm64_node127.node +0 -0
  10. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Resources/Relocations/aarch64/cws_darwin_arm64_node127.node.yml +931 -0
  11. package/dist/bindings/cws_darwin_arm64_node137.node +0 -0
  12. package/dist/bindings/cws_linux_x64_node137.node +0 -0
  13. package/dist/bindings/cws_win32_x64_node137.node +0 -0
  14. package/package.json +1 -1
  15. package/src/Addon.h +6 -1
  16. package/src/headers/24/acorn_version.h +6 -0
  17. package/src/headers/24/addon_permission.h +31 -0
  18. package/src/headers/24/agent.h +195 -0
  19. package/src/headers/24/aliased_buffer-inl.h +244 -0
  20. package/src/headers/24/aliased_buffer.h +206 -0
  21. package/src/headers/24/aliased_struct-inl.h +54 -0
  22. package/src/headers/24/aliased_struct.h +63 -0
  23. package/src/headers/24/amaro_version.h +6 -0
  24. package/src/headers/24/application.h +165 -0
  25. package/src/headers/24/async_context_frame.h +33 -0
  26. package/src/headers/24/async_wrap-inl.h +96 -0
  27. package/src/headers/24/async_wrap.h +244 -0
  28. package/src/headers/24/base_object-inl.h +330 -0
  29. package/src/headers/24/base_object.h +338 -0
  30. package/src/headers/24/base_object_types.h +74 -0
  31. package/src/headers/24/bindingdata.h +272 -0
  32. package/src/headers/24/blob_serializer_deserializer-inl.h +385 -0
  33. package/src/headers/24/blob_serializer_deserializer.h +132 -0
  34. package/src/headers/24/callback_queue-inl.h +97 -0
  35. package/src/headers/24/callback_queue.h +79 -0
  36. package/src/headers/24/cares_wrap.h +447 -0
  37. package/src/headers/24/child_process_permission.h +31 -0
  38. package/src/headers/24/cid.h +127 -0
  39. package/src/headers/24/cjs_module_lexer_version.h +6 -0
  40. package/src/headers/24/cleanup_queue-inl.h +36 -0
  41. package/src/headers/24/cleanup_queue.h +79 -0
  42. package/src/headers/24/compile_cache.h +113 -0
  43. package/src/headers/24/connect_wrap.h +26 -0
  44. package/src/headers/24/connection_wrap.h +30 -0
  45. package/src/headers/24/cppgc_helpers-inl.h +65 -0
  46. package/src/headers/24/cppgc_helpers.h +162 -0
  47. package/src/headers/24/crypto/crypto_aes.h +97 -0
  48. package/src/headers/24/crypto/crypto_argon2.h +86 -0
  49. package/src/headers/24/crypto/crypto_bio.h +193 -0
  50. package/src/headers/24/crypto/crypto_chacha20_poly1305.h +64 -0
  51. package/src/headers/24/crypto/crypto_cipher.h +281 -0
  52. package/src/headers/24/crypto/crypto_clienthello-inl.h +90 -0
  53. package/src/headers/24/crypto/crypto_clienthello.h +131 -0
  54. package/src/headers/24/crypto/crypto_common.h +48 -0
  55. package/src/headers/24/crypto/crypto_context.h +171 -0
  56. package/src/headers/24/crypto/crypto_dh.h +126 -0
  57. package/src/headers/24/crypto/crypto_dsa.h +50 -0
  58. package/src/headers/24/crypto/crypto_ec.h +163 -0
  59. package/src/headers/24/crypto/crypto_hash.h +89 -0
  60. package/src/headers/24/crypto/crypto_hkdf.h +61 -0
  61. package/src/headers/24/crypto/crypto_hmac.h +92 -0
  62. package/src/headers/24/crypto/crypto_kem.h +113 -0
  63. package/src/headers/24/crypto/crypto_keygen.h +290 -0
  64. package/src/headers/24/crypto/crypto_keys.h +392 -0
  65. package/src/headers/24/crypto/crypto_ml_dsa.h +21 -0
  66. package/src/headers/24/crypto/crypto_pbkdf2.h +74 -0
  67. package/src/headers/24/crypto/crypto_random.h +124 -0
  68. package/src/headers/24/crypto/crypto_rsa.h +136 -0
  69. package/src/headers/24/crypto/crypto_scrypt.h +85 -0
  70. package/src/headers/24/crypto/crypto_sig.h +156 -0
  71. package/src/headers/24/crypto/crypto_spkac.h +21 -0
  72. package/src/headers/24/crypto/crypto_timing.h +20 -0
  73. package/src/headers/24/crypto/crypto_tls.h +309 -0
  74. package/src/headers/24/crypto/crypto_util.h +598 -0
  75. package/src/headers/24/crypto/crypto_x509.h +140 -0
  76. package/src/headers/24/data.h +148 -0
  77. package/src/headers/24/debug_utils-inl.h +232 -0
  78. package/src/headers/24/debug_utils.h +193 -0
  79. package/src/headers/24/defs.h +254 -0
  80. package/src/headers/24/diagnosticfilename-inl.h +33 -0
  81. package/src/headers/24/embedded_data.h +17 -0
  82. package/src/headers/24/encoding_binding.h +60 -0
  83. package/src/headers/24/endpoint.h +421 -0
  84. package/src/headers/24/env-inl.h +935 -0
  85. package/src/headers/24/env.h +1257 -0
  86. package/src/headers/24/env_properties.h +561 -0
  87. package/src/headers/24/fs_permission.h +167 -0
  88. package/src/headers/24/handle_wrap.h +123 -0
  89. package/src/headers/24/histogram-inl.h +107 -0
  90. package/src/headers/24/histogram.h +279 -0
  91. package/src/headers/24/http3.h +44 -0
  92. package/src/headers/24/inspector_agent.h +165 -0
  93. package/src/headers/24/inspector_io.h +78 -0
  94. package/src/headers/24/inspector_permission.h +31 -0
  95. package/src/headers/24/inspector_profiler.h +149 -0
  96. package/src/headers/24/inspector_socket.h +60 -0
  97. package/src/headers/24/inspector_socket_server.h +110 -0
  98. package/src/headers/24/io_agent.h +30 -0
  99. package/src/headers/24/js_native_api.h +615 -0
  100. package/src/headers/24/js_native_api_types.h +211 -0
  101. package/src/headers/24/js_native_api_v8.h +485 -0
  102. package/src/headers/24/js_native_api_v8_internals.h +45 -0
  103. package/src/headers/24/js_stream.h +52 -0
  104. package/src/headers/24/json_parser.h +40 -0
  105. package/src/headers/24/json_utils.h +172 -0
  106. package/src/headers/24/logstream.h +81 -0
  107. package/src/headers/24/main_thread_interface.h +116 -0
  108. package/src/headers/24/memory_tracker-inl.h +454 -0
  109. package/src/headers/24/memory_tracker.h +333 -0
  110. package/src/headers/24/module_wrap.h +229 -0
  111. package/src/headers/24/ncrypto.h +1625 -0
  112. package/src/headers/24/network_agent.h +118 -0
  113. package/src/headers/24/network_inspector.h +45 -0
  114. package/src/headers/24/network_resource_manager.h +29 -0
  115. package/src/headers/24/node.h +1620 -0
  116. package/src/headers/24/node_api.h +269 -0
  117. package/src/headers/24/node_api_internals.h +46 -0
  118. package/src/headers/24/node_api_types.h +52 -0
  119. package/src/headers/24/node_binding.h +163 -0
  120. package/src/headers/24/node_blob.h +159 -0
  121. package/src/headers/24/node_bob-inl.h +36 -0
  122. package/src/headers/24/node_bob.h +107 -0
  123. package/src/headers/24/node_buffer.h +92 -0
  124. package/src/headers/24/node_builtins.h +223 -0
  125. package/src/headers/24/node_config_file.h +65 -0
  126. package/src/headers/24/node_constants.h +82 -0
  127. package/src/headers/24/node_context_data.h +168 -0
  128. package/src/headers/24/node_contextify.h +261 -0
  129. package/src/headers/24/node_crypto.h +62 -0
  130. package/src/headers/24/node_debug.h +25 -0
  131. package/src/headers/24/node_dir.h +52 -0
  132. package/src/headers/24/node_dotenv.h +45 -0
  133. package/src/headers/24/node_errors.h +391 -0
  134. package/src/headers/24/node_exit_code.h +54 -0
  135. package/src/headers/24/node_external_reference.h +167 -0
  136. package/src/headers/24/node_file-inl.h +412 -0
  137. package/src/headers/24/node_file.h +540 -0
  138. package/src/headers/24/node_http2.h +1175 -0
  139. package/src/headers/24/node_http2_state.h +159 -0
  140. package/src/headers/24/node_http_common-inl.h +198 -0
  141. package/src/headers/24/node_http_common.h +535 -0
  142. package/src/headers/24/node_i18n.h +132 -0
  143. package/src/headers/24/node_internals.h +476 -0
  144. package/src/headers/24/node_json.h +24 -0
  145. package/src/headers/24/node_large_page.h +34 -0
  146. package/src/headers/24/node_locks.h +180 -0
  147. package/src/headers/24/node_main_instance.h +67 -0
  148. package/src/headers/24/node_mem-inl.h +112 -0
  149. package/src/headers/24/node_mem.h +45 -0
  150. package/src/headers/24/node_messaging.h +389 -0
  151. package/src/headers/24/node_metadata.h +164 -0
  152. package/src/headers/24/node_modules.h +93 -0
  153. package/src/headers/24/node_mutex.h +323 -0
  154. package/src/headers/24/node_object_wrap.h +132 -0
  155. package/src/headers/24/node_options-inl.h +524 -0
  156. package/src/headers/24/node_options.h +682 -0
  157. package/src/headers/24/node_perf.h +166 -0
  158. package/src/headers/24/node_perf_common.h +102 -0
  159. package/src/headers/24/node_platform.h +286 -0
  160. package/src/headers/24/node_process-inl.h +26 -0
  161. package/src/headers/24/node_process.h +111 -0
  162. package/src/headers/24/node_realm-inl.h +153 -0
  163. package/src/headers/24/node_realm.h +236 -0
  164. package/src/headers/24/node_report.h +43 -0
  165. package/src/headers/24/node_revert.h +82 -0
  166. package/src/headers/24/node_root_certs.h +3546 -0
  167. package/src/headers/24/node_sea.h +74 -0
  168. package/src/headers/24/node_shadow_realm.h +46 -0
  169. package/src/headers/24/node_snapshot_builder.h +57 -0
  170. package/src/headers/24/node_snapshotable.h +174 -0
  171. package/src/headers/24/node_sockaddr-inl.h +257 -0
  172. package/src/headers/24/node_sockaddr.h +394 -0
  173. package/src/headers/24/node_sqlite.h +270 -0
  174. package/src/headers/24/node_stat_watcher.h +73 -0
  175. package/src/headers/24/node_string.h +101 -0
  176. package/src/headers/24/node_task_runner.h +92 -0
  177. package/src/headers/24/node_threadsafe_cow-inl.h +54 -0
  178. package/src/headers/24/node_threadsafe_cow.h +105 -0
  179. package/src/headers/24/node_trace_buffer.h +83 -0
  180. package/src/headers/24/node_trace_writer.h +75 -0
  181. package/src/headers/24/node_union_bytes.h +81 -0
  182. package/src/headers/24/node_url.h +101 -0
  183. package/src/headers/24/node_url_pattern.h +118 -0
  184. package/src/headers/24/node_v8.h +77 -0
  185. package/src/headers/24/node_v8_platform-inl.h +185 -0
  186. package/src/headers/24/node_version.h +110 -0
  187. package/src/headers/24/node_wasi.h +185 -0
  188. package/src/headers/24/node_wasm_web_api.h +55 -0
  189. package/src/headers/24/node_watchdog.h +154 -0
  190. package/src/headers/24/node_webstorage.h +60 -0
  191. package/src/headers/24/node_worker.h +159 -0
  192. package/src/headers/24/packet.h +155 -0
  193. package/src/headers/24/path.h +33 -0
  194. package/src/headers/24/permission/addon_permission.h +31 -0
  195. package/src/headers/24/permission/child_process_permission.h +31 -0
  196. package/src/headers/24/permission/fs_permission.h +167 -0
  197. package/src/headers/24/permission/inspector_permission.h +31 -0
  198. package/src/headers/24/permission/permission.h +100 -0
  199. package/src/headers/24/permission/permission_base.h +65 -0
  200. package/src/headers/24/permission/wasi_permission.h +31 -0
  201. package/src/headers/24/permission/worker_permission.h +31 -0
  202. package/src/headers/24/permission.h +100 -0
  203. package/src/headers/24/permission_base.h +65 -0
  204. package/src/headers/24/pipe_wrap.h +80 -0
  205. package/src/headers/24/preferredaddress.h +72 -0
  206. package/src/headers/24/protocol_helper.h +27 -0
  207. package/src/headers/24/queue.h +306 -0
  208. package/src/headers/24/req_wrap-inl.h +176 -0
  209. package/src/headers/24/req_wrap.h +79 -0
  210. package/src/headers/24/runtime_agent.h +41 -0
  211. package/src/headers/24/session.h +528 -0
  212. package/src/headers/24/sessionticket.h +108 -0
  213. package/src/headers/24/spawn_sync.h +243 -0
  214. package/src/headers/24/stream_base-inl.h +173 -0
  215. package/src/headers/24/stream_base.h +478 -0
  216. package/src/headers/24/stream_pipe.h +76 -0
  217. package/src/headers/24/stream_wrap.h +132 -0
  218. package/src/headers/24/streams.h +370 -0
  219. package/src/headers/24/string_bytes.h +109 -0
  220. package/src/headers/24/string_decoder-inl.h +31 -0
  221. package/src/headers/24/string_decoder.h +49 -0
  222. package/src/headers/24/target_agent.h +75 -0
  223. package/src/headers/24/tcp_wrap.h +105 -0
  224. package/src/headers/24/threadpoolwork-inl.h +70 -0
  225. package/src/headers/24/timer_wrap-inl.h +32 -0
  226. package/src/headers/24/timer_wrap.h +87 -0
  227. package/src/headers/24/timers.h +75 -0
  228. package/src/headers/24/tlscontext.h +228 -0
  229. package/src/headers/24/tokens.h +256 -0
  230. package/src/headers/24/trace_event.h +722 -0
  231. package/src/headers/24/trace_event_common.h +1109 -0
  232. package/src/headers/24/traced_value.h +129 -0
  233. package/src/headers/24/tracing/agent.h +195 -0
  234. package/src/headers/24/tracing/trace_event.h +722 -0
  235. package/src/headers/24/tracing_agent.h +43 -0
  236. package/src/headers/24/transportparams.h +166 -0
  237. package/src/headers/24/tty_wrap.h +65 -0
  238. package/src/headers/24/udp_wrap.h +230 -0
  239. package/src/headers/24/undici_version.h +6 -0
  240. package/src/headers/24/util-inl.h +711 -0
  241. package/src/headers/24/util.h +1016 -0
  242. package/src/headers/24/v8-external-memory-accounter.h +60 -0
  243. package/src/headers/24/v8-fast-api-calls.h +819 -0
  244. package/src/headers/24/v8-inspector.h +426 -0
  245. package/src/headers/24/wasi_permission.h +31 -0
  246. package/src/headers/24/worker_agent.h +40 -0
  247. package/src/headers/24/worker_inspector.h +124 -0
  248. package/src/headers/24/worker_permission.h +31 -0
  249. package/src/headers/24/zlib_version.h +6 -0
@@ -0,0 +1,155 @@
1
+ #pragma once
2
+
3
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
4
+ #if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
5
+
6
+ #include <base_object.h>
7
+ #include <env.h>
8
+ #include <ngtcp2/ngtcp2.h>
9
+ #include <node_external_reference.h>
10
+ #include <node_sockaddr.h>
11
+ #include <req_wrap.h>
12
+ #include <uv.h>
13
+ #include <v8.h>
14
+ #include <string>
15
+ #include "bindingdata.h"
16
+ #include "cid.h"
17
+ #include "data.h"
18
+ #include "defs.h"
19
+ #include "tokens.h"
20
+
21
+ namespace node::quic {
22
+
23
+ struct PathDescriptor {
24
+ uint32_t version;
25
+ const CID& dcid;
26
+ const CID& scid;
27
+ const SocketAddress& local_address;
28
+ const SocketAddress& remote_address;
29
+ std::string ToString() const;
30
+ };
31
+
32
+ // A Packet encapsulates serialized outbound QUIC data.
33
+ // Packets must never be larger than the path MTU. The
34
+ // default QUIC packet maximum length is 1200 bytes,
35
+ // which we assume by default. The packet storage will
36
+ // be stack allocated up to this size.
37
+ //
38
+ // Packets are maintained in a freelist held by the
39
+ // BindingData instance. When using Create() to create
40
+ // a Packet, we'll check to see if there is a free
41
+ // packet in the freelist and use it instead of starting
42
+ // fresh with a new packet. The freelist can store at
43
+ // most kMaxFreeList packets
44
+ //
45
+ // Packets are always encrypted so their content should
46
+ // be considered opaque to us. We leave it entirely up
47
+ // to ngtcp2 how to encode QUIC frames into the packet.
48
+ class Packet final : public ReqWrap<uv_udp_send_t> {
49
+ private:
50
+ struct Data;
51
+
52
+ public:
53
+ static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
54
+ Environment* env);
55
+
56
+ class Listener {
57
+ public:
58
+ virtual void PacketDone(int status) = 0;
59
+ };
60
+
61
+ // Do not use the Packet constructors directly to create
62
+ // them. These are public only to support MakeBaseObject.
63
+ // Use the Create, or Create variants to create or
64
+ // acquire packet instances.
65
+
66
+ Packet(Environment* env,
67
+ Listener* listener,
68
+ v8::Local<v8::Object> object,
69
+ const SocketAddress& destination,
70
+ size_t length,
71
+ const char* diagnostic_label = "<unknown>");
72
+
73
+ Packet(Environment* env,
74
+ Listener* listener,
75
+ v8::Local<v8::Object> object,
76
+ const SocketAddress& destination,
77
+ std::shared_ptr<Data> data);
78
+
79
+ DISALLOW_COPY_AND_MOVE(Packet)
80
+
81
+ const SocketAddress& destination() const;
82
+ size_t length() const;
83
+ operator uv_buf_t() const;
84
+ operator ngtcp2_vec() const;
85
+
86
+ // Modify the size of the packet after ngtcp2 has written
87
+ // to it. len must be <= length(). We call this after we've
88
+ // asked ngtcp2 to encode frames into the packet and ngtcp2
89
+ // tells us how many of the packets bytes were used.
90
+ void Truncate(size_t len);
91
+
92
+ static BaseObjectPtr<Packet> Create(
93
+ Environment* env,
94
+ Listener* listener,
95
+ const SocketAddress& destination,
96
+ size_t length = kDefaultMaxPacketLength,
97
+ const char* diagnostic_label = "<unknown>");
98
+
99
+ BaseObjectPtr<Packet> Clone() const;
100
+
101
+ void MemoryInfo(MemoryTracker* tracker) const override;
102
+ SET_MEMORY_INFO_NAME(Packet)
103
+ SET_SELF_SIZE(Packet)
104
+
105
+ std::string ToString() const;
106
+
107
+ static BaseObjectPtr<Packet> CreateRetryPacket(
108
+ Environment* env,
109
+ Listener* listener,
110
+ const PathDescriptor& path_descriptor,
111
+ const TokenSecret& token_secret);
112
+
113
+ static BaseObjectPtr<Packet> CreateConnectionClosePacket(
114
+ Environment* env,
115
+ Listener* listener,
116
+ const SocketAddress& destination,
117
+ ngtcp2_conn* conn,
118
+ const QuicError& error);
119
+
120
+ static BaseObjectPtr<Packet> CreateImmediateConnectionClosePacket(
121
+ Environment* env,
122
+ Listener* listener,
123
+ const PathDescriptor& path_descriptor,
124
+ const QuicError& reason);
125
+
126
+ static BaseObjectPtr<Packet> CreateStatelessResetPacket(
127
+ Environment* env,
128
+ Listener* listener,
129
+ const PathDescriptor& path_descriptor,
130
+ const TokenSecret& token_secret,
131
+ size_t source_len);
132
+
133
+ static BaseObjectPtr<Packet> CreateVersionNegotiationPacket(
134
+ Environment* env,
135
+ Listener* listener,
136
+ const PathDescriptor& path_descriptor);
137
+
138
+ // Called when the packet is done being sent.
139
+ void Done(int status);
140
+
141
+ private:
142
+ static BaseObjectPtr<Packet> FromFreeList(Environment* env,
143
+ std::shared_ptr<Data> data,
144
+ Listener* listener,
145
+ const SocketAddress& destination);
146
+
147
+ Listener* listener_;
148
+ SocketAddress destination_;
149
+ std::shared_ptr<Data> data_;
150
+ };
151
+
152
+ } // namespace node::quic
153
+
154
+ #endif // HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
155
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
@@ -0,0 +1,33 @@
1
+ #ifndef SRC_PATH_H_
2
+ #define SRC_PATH_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <string>
7
+ #include <vector>
8
+ #include "node_options-inl.h"
9
+ #include "util-inl.h"
10
+
11
+ namespace node {
12
+
13
+ constexpr bool IsPathSeparator(const char c) noexcept;
14
+
15
+ std::string NormalizeString(const std::string_view path,
16
+ bool allowAboveRoot,
17
+ const std::string_view separator);
18
+
19
+ std::string PathResolve(Environment* env,
20
+ const std::vector<std::string_view>& paths);
21
+
22
+ #ifdef _WIN32
23
+ constexpr bool IsWindowsDeviceRoot(const char c) noexcept;
24
+ #endif // _WIN32
25
+
26
+ void ToNamespacedPath(Environment* env, BufferValue* path);
27
+ void FromNamespacedPath(std::string* path);
28
+
29
+ } // namespace node
30
+
31
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
32
+
33
+ #endif // SRC_PATH_H_
@@ -0,0 +1,31 @@
1
+ #ifndef SRC_PERMISSION_ADDON_PERMISSION_H_
2
+ #define SRC_PERMISSION_ADDON_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <string>
7
+ #include "permission/permission_base.h"
8
+
9
+ namespace node {
10
+
11
+ namespace permission {
12
+
13
+ class AddonPermission final : public PermissionBase {
14
+ public:
15
+ void Apply(Environment* env,
16
+ const std::vector<std::string>& allow,
17
+ PermissionScope scope) override;
18
+ bool is_granted(Environment* env,
19
+ PermissionScope perm,
20
+ const std::string_view& param = "") const override;
21
+
22
+ private:
23
+ bool deny_all_;
24
+ };
25
+
26
+ } // namespace permission
27
+
28
+ } // namespace node
29
+
30
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
31
+ #endif // SRC_PERMISSION_ADDON_PERMISSION_H_
@@ -0,0 +1,31 @@
1
+ #ifndef SRC_PERMISSION_CHILD_PROCESS_PERMISSION_H_
2
+ #define SRC_PERMISSION_CHILD_PROCESS_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <vector>
7
+ #include "permission/permission_base.h"
8
+
9
+ namespace node {
10
+
11
+ namespace permission {
12
+
13
+ class ChildProcessPermission final : public PermissionBase {
14
+ public:
15
+ void Apply(Environment* env,
16
+ const std::vector<std::string>& allow,
17
+ PermissionScope scope) override;
18
+ bool is_granted(Environment* env,
19
+ PermissionScope perm,
20
+ const std::string_view& param = "") const override;
21
+
22
+ private:
23
+ bool deny_all_;
24
+ };
25
+
26
+ } // namespace permission
27
+
28
+ } // namespace node
29
+
30
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
31
+ #endif // SRC_PERMISSION_CHILD_PROCESS_PERMISSION_H_
@@ -0,0 +1,167 @@
1
+ #ifndef SRC_PERMISSION_FS_PERMISSION_H_
2
+ #define SRC_PERMISSION_FS_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include "v8.h"
7
+
8
+ #include <unordered_map>
9
+ #include "permission/permission_base.h"
10
+ #include "util.h"
11
+
12
+ namespace node {
13
+
14
+ namespace permission {
15
+
16
+ class FSPermission final : public PermissionBase {
17
+ public:
18
+ void Apply(Environment* env,
19
+ const std::vector<std::string>& allow,
20
+ PermissionScope scope) override;
21
+ bool is_granted(Environment* env,
22
+ PermissionScope perm,
23
+ const std::string_view& param) const override;
24
+
25
+ struct RadixTree {
26
+ struct Node {
27
+ std::string prefix;
28
+ std::unordered_map<char, Node*> children;
29
+ Node* wildcard_child;
30
+ bool is_leaf;
31
+
32
+ explicit Node(const std::string& pre)
33
+ : prefix(pre), wildcard_child(nullptr), is_leaf(false) {}
34
+
35
+ Node() : wildcard_child(nullptr), is_leaf(false) {}
36
+
37
+ Node* CreateChild(const std::string& path_prefix) {
38
+ if (path_prefix.empty() && !is_leaf) {
39
+ is_leaf = true;
40
+ return this;
41
+ }
42
+
43
+ CHECK(!path_prefix.empty());
44
+ char label = path_prefix[0];
45
+
46
+ Node* child = children[label];
47
+ if (child == nullptr) {
48
+ children[label] = new Node(path_prefix);
49
+ return children[label];
50
+ }
51
+
52
+ // swap prefix
53
+ size_t i = 0;
54
+ size_t prefix_len = path_prefix.length();
55
+ for (; i < child->prefix.length(); ++i) {
56
+ if (i > prefix_len || path_prefix[i] != child->prefix[i]) {
57
+ std::string parent_prefix = child->prefix.substr(0, i);
58
+ std::string child_prefix = child->prefix.substr(i);
59
+
60
+ child->prefix = child_prefix;
61
+ Node* split_child = new Node(parent_prefix);
62
+ split_child->children[child_prefix[0]] = child;
63
+ children[parent_prefix[0]] = split_child;
64
+
65
+ return split_child->CreateChild(path_prefix.substr(i));
66
+ }
67
+ }
68
+ child->is_leaf = true;
69
+ return child->CreateChild(path_prefix.substr(i));
70
+ }
71
+
72
+ Node* CreateWildcardChild() {
73
+ if (wildcard_child != nullptr) {
74
+ return wildcard_child;
75
+ }
76
+ wildcard_child = new Node();
77
+ return wildcard_child;
78
+ }
79
+
80
+ Node* NextNode(const std::string& path, size_t idx) const {
81
+ if (idx >= path.length()) {
82
+ return nullptr;
83
+ }
84
+
85
+ // wildcard node takes precedence
86
+ if (children.size() > 1) {
87
+ auto it = children.find('*');
88
+ if (it != children.end()) {
89
+ return it->second;
90
+ }
91
+ }
92
+
93
+ auto it = children.find(path[idx]);
94
+ if (it == children.end()) {
95
+ return nullptr;
96
+ }
97
+ auto child = it->second;
98
+ // match prefix
99
+ size_t prefix_len = child->prefix.length();
100
+ for (size_t i = 0; i < path.length(); ++i) {
101
+ if (i >= prefix_len || child->prefix[i] == '*') {
102
+ return child;
103
+ }
104
+
105
+ // Handle optional trailing
106
+ // path = /home/subdirectory
107
+ // child = subdirectory/*
108
+ if (idx >= path.length() &&
109
+ child->prefix[i] == node::kPathSeparator) {
110
+ continue;
111
+ }
112
+
113
+ if (path[idx++] != child->prefix[i]) {
114
+ return nullptr;
115
+ }
116
+ }
117
+ return child;
118
+ }
119
+
120
+ // A node can be a *end* node and have children
121
+ // E.g: */slower*, */slown* are inserted:
122
+ // /slow
123
+ // ---> er
124
+ // ---> n
125
+ // If */slow* is inserted right after, it will create an
126
+ // empty node
127
+ // /slow
128
+ // ---> '\000' ASCII (0) || \0
129
+ // ---> er
130
+ // ---> n
131
+ bool IsEndNode() const {
132
+ if (children.empty()) {
133
+ return true;
134
+ }
135
+ return is_leaf;
136
+ }
137
+ };
138
+
139
+ RadixTree();
140
+ ~RadixTree();
141
+ void Insert(const std::string& s);
142
+ bool Lookup(const std::string_view& s) const { return Lookup(s, false); }
143
+ bool Lookup(const std::string_view& s, bool when_empty_return) const;
144
+
145
+ private:
146
+ Node* root_node_;
147
+ };
148
+
149
+ private:
150
+ void GrantAccess(PermissionScope scope, const std::string& param);
151
+ // fs granted on startup
152
+ RadixTree granted_in_fs_;
153
+ RadixTree granted_out_fs_;
154
+
155
+ bool deny_all_in_ = true;
156
+ bool deny_all_out_ = true;
157
+
158
+ bool allow_all_in_ = false;
159
+ bool allow_all_out_ = false;
160
+ };
161
+
162
+ } // namespace permission
163
+
164
+ } // namespace node
165
+
166
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
167
+ #endif // SRC_PERMISSION_FS_PERMISSION_H_
@@ -0,0 +1,31 @@
1
+ #ifndef SRC_PERMISSION_INSPECTOR_PERMISSION_H_
2
+ #define SRC_PERMISSION_INSPECTOR_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <string>
7
+ #include "permission/permission_base.h"
8
+
9
+ namespace node {
10
+
11
+ namespace permission {
12
+
13
+ class InspectorPermission final : public PermissionBase {
14
+ public:
15
+ void Apply(Environment* env,
16
+ const std::vector<std::string>& allow,
17
+ PermissionScope scope) override;
18
+ bool is_granted(Environment* env,
19
+ PermissionScope perm,
20
+ const std::string_view& param = "") const override;
21
+
22
+ private:
23
+ bool deny_all_;
24
+ };
25
+
26
+ } // namespace permission
27
+
28
+ } // namespace node
29
+
30
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
31
+ #endif // SRC_PERMISSION_INSPECTOR_PERMISSION_H_
@@ -0,0 +1,100 @@
1
+ #ifndef SRC_PERMISSION_PERMISSION_H_
2
+ #define SRC_PERMISSION_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include "debug_utils.h"
7
+ #include "node_options.h"
8
+ #include "permission/addon_permission.h"
9
+ #include "permission/child_process_permission.h"
10
+ #include "permission/fs_permission.h"
11
+ #include "permission/inspector_permission.h"
12
+ #include "permission/permission_base.h"
13
+ #include "permission/wasi_permission.h"
14
+ #include "permission/worker_permission.h"
15
+ #include "v8.h"
16
+
17
+ #include <string_view>
18
+ #include <unordered_map>
19
+
20
+ namespace node {
21
+
22
+ class Environment;
23
+
24
+ namespace fs {
25
+ class FSReqBase;
26
+ }
27
+
28
+ namespace permission {
29
+
30
+ #define THROW_IF_INSUFFICIENT_PERMISSIONS(env, perm_, resource_, ...) \
31
+ do { \
32
+ if (!env->permission()->is_granted(env, perm_, resource_)) [[unlikely]] { \
33
+ node::permission::Permission::ThrowAccessDenied( \
34
+ (env), perm_, resource_); \
35
+ return __VA_ARGS__; \
36
+ } \
37
+ } while (0)
38
+
39
+ #define ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS( \
40
+ env, wrap, perm_, resource_, ...) \
41
+ do { \
42
+ if (!env->permission()->is_granted(env, perm_, resource_)) [[unlikely]] { \
43
+ node::permission::Permission::AsyncThrowAccessDenied( \
44
+ (env), wrap, perm_, resource_); \
45
+ return __VA_ARGS__; \
46
+ } \
47
+ } while (0)
48
+
49
+ class Permission {
50
+ public:
51
+ Permission();
52
+
53
+ FORCE_INLINE bool is_granted(Environment* env,
54
+ const PermissionScope permission,
55
+ const std::string_view& res = "") const {
56
+ if (!enabled_) [[likely]] {
57
+ return true;
58
+ }
59
+ return is_scope_granted(env, permission, res);
60
+ }
61
+
62
+ FORCE_INLINE bool enabled() const { return enabled_; }
63
+
64
+ static PermissionScope StringToPermission(const std::string& perm);
65
+ static const char* PermissionToString(PermissionScope perm);
66
+ static void ThrowAccessDenied(Environment* env,
67
+ PermissionScope perm,
68
+ const std::string_view& res);
69
+ static void AsyncThrowAccessDenied(Environment* env,
70
+ fs::FSReqBase* req_wrap,
71
+ PermissionScope perm,
72
+ const std::string_view& res);
73
+
74
+ // CLI Call
75
+ void Apply(Environment* env,
76
+ const std::vector<std::string>& allow,
77
+ PermissionScope scope);
78
+ void EnablePermissions();
79
+
80
+ private:
81
+ COLD_NOINLINE bool is_scope_granted(Environment* env,
82
+ const PermissionScope permission,
83
+ const std::string_view& res = "") const {
84
+ auto perm_node = nodes_.find(permission);
85
+ if (perm_node != nodes_.end()) {
86
+ return perm_node->second->is_granted(env, permission, res);
87
+ }
88
+ return false;
89
+ }
90
+
91
+ std::unordered_map<PermissionScope, std::shared_ptr<PermissionBase>> nodes_;
92
+ bool enabled_;
93
+ };
94
+
95
+ } // namespace permission
96
+
97
+ } // namespace node
98
+
99
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
100
+ #endif // SRC_PERMISSION_PERMISSION_H_
@@ -0,0 +1,65 @@
1
+ #ifndef SRC_PERMISSION_PERMISSION_BASE_H_
2
+ #define SRC_PERMISSION_PERMISSION_BASE_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <map>
7
+ #include <string>
8
+ #include <string_view>
9
+ #include "v8.h"
10
+
11
+ namespace node {
12
+
13
+ class Environment;
14
+
15
+ namespace permission {
16
+
17
+ #define FILESYSTEM_PERMISSIONS(V) \
18
+ V(FileSystem, "fs", PermissionsRoot, "") \
19
+ V(FileSystemRead, "fs.read", FileSystem, "--allow-fs-read") \
20
+ V(FileSystemWrite, "fs.write", FileSystem, "--allow-fs-write")
21
+
22
+ #define CHILD_PROCESS_PERMISSIONS(V) \
23
+ V(ChildProcess, "child", PermissionsRoot, "--allow-child-process")
24
+
25
+ #define WASI_PERMISSIONS(V) V(WASI, "wasi", PermissionsRoot, "--allow-wasi")
26
+
27
+ #define WORKER_THREADS_PERMISSIONS(V) \
28
+ V(WorkerThreads, "worker", PermissionsRoot, "--allow-worker")
29
+
30
+ #define INSPECTOR_PERMISSIONS(V) V(Inspector, "inspector", PermissionsRoot, "")
31
+
32
+ #define ADDON_PERMISSIONS(V) \
33
+ V(Addon, "addon", PermissionsRoot, "--allow-addons")
34
+
35
+ #define PERMISSIONS(V) \
36
+ FILESYSTEM_PERMISSIONS(V) \
37
+ CHILD_PROCESS_PERMISSIONS(V) \
38
+ WASI_PERMISSIONS(V) \
39
+ WORKER_THREADS_PERMISSIONS(V) \
40
+ INSPECTOR_PERMISSIONS(V) \
41
+ ADDON_PERMISSIONS(V)
42
+
43
+ #define V(name, _, __, ___) k##name,
44
+ enum class PermissionScope {
45
+ kPermissionsRoot = -1,
46
+ PERMISSIONS(V) kPermissionsCount
47
+ };
48
+ #undef V
49
+
50
+ class PermissionBase {
51
+ public:
52
+ virtual void Apply(Environment* env,
53
+ const std::vector<std::string>& allow,
54
+ PermissionScope scope) = 0;
55
+ virtual bool is_granted(Environment* env,
56
+ PermissionScope perm,
57
+ const std::string_view& param = "") const = 0;
58
+ };
59
+
60
+ } // namespace permission
61
+
62
+ } // namespace node
63
+
64
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
65
+ #endif // SRC_PERMISSION_PERMISSION_BASE_H_
@@ -0,0 +1,31 @@
1
+ #ifndef SRC_PERMISSION_WASI_PERMISSION_H_
2
+ #define SRC_PERMISSION_WASI_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <vector>
7
+ #include "permission/permission_base.h"
8
+
9
+ namespace node {
10
+
11
+ namespace permission {
12
+
13
+ class WASIPermission final : public PermissionBase {
14
+ public:
15
+ void Apply(Environment* env,
16
+ const std::vector<std::string>& allow,
17
+ PermissionScope scope) override;
18
+ bool is_granted(Environment* env,
19
+ PermissionScope perm,
20
+ const std::string_view& param = "") const override;
21
+
22
+ private:
23
+ bool deny_all_;
24
+ };
25
+
26
+ } // namespace permission
27
+
28
+ } // namespace node
29
+
30
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
31
+ #endif // SRC_PERMISSION_WASI_PERMISSION_H_
@@ -0,0 +1,31 @@
1
+ #ifndef SRC_PERMISSION_WORKER_PERMISSION_H_
2
+ #define SRC_PERMISSION_WORKER_PERMISSION_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <vector>
7
+ #include "permission/permission_base.h"
8
+
9
+ namespace node {
10
+
11
+ namespace permission {
12
+
13
+ class WorkerPermission final : public PermissionBase {
14
+ public:
15
+ void Apply(Environment* env,
16
+ const std::vector<std::string>& allow,
17
+ PermissionScope scope) override;
18
+ bool is_granted(Environment* env,
19
+ PermissionScope perm,
20
+ const std::string_view& param = "") const override;
21
+
22
+ private:
23
+ bool deny_all_;
24
+ };
25
+
26
+ } // namespace permission
27
+
28
+ } // namespace node
29
+
30
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
31
+ #endif // SRC_PERMISSION_WORKER_PERMISSION_H_