@kungfu-tech/libnode-win32-x64 0.0.0-bootstrap.0 → 22.22.3-kf.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +3 -0
- package/dist/node/include/acorn_version.h +6 -0
- package/dist/node/include/aliased_buffer-inl.h +244 -0
- package/dist/node/include/aliased_buffer.h +206 -0
- package/dist/node/include/aliased_struct-inl.h +54 -0
- package/dist/node/include/aliased_struct.h +63 -0
- package/dist/node/include/amaro_version.h +6 -0
- package/dist/node/include/async_context_frame.h +33 -0
- package/dist/node/include/async_wrap-inl.h +96 -0
- package/dist/node/include/async_wrap.h +243 -0
- package/dist/node/include/base_object-inl.h +335 -0
- package/dist/node/include/base_object.h +342 -0
- package/dist/node/include/base_object_types.h +74 -0
- package/dist/node/include/blob_serializer_deserializer-inl.h +385 -0
- package/dist/node/include/blob_serializer_deserializer.h +132 -0
- package/dist/node/include/callback_queue-inl.h +97 -0
- package/dist/node/include/callback_queue.h +79 -0
- package/dist/node/include/cares_wrap.h +447 -0
- package/dist/node/include/cjs_module_lexer_version.h +6 -0
- package/dist/node/include/cleanup_queue-inl.h +36 -0
- package/dist/node/include/cleanup_queue.h +79 -0
- package/dist/node/include/compile_cache.h +104 -0
- package/dist/node/include/connect_wrap.h +26 -0
- package/dist/node/include/connection_wrap.h +30 -0
- package/dist/node/include/cppgc/allocation.h +310 -0
- package/dist/node/include/cppgc/common.h +28 -0
- package/dist/node/include/cppgc/cross-thread-persistent.h +466 -0
- package/dist/node/include/cppgc/custom-space.h +97 -0
- package/dist/node/include/cppgc/default-platform.h +67 -0
- package/dist/node/include/cppgc/ephemeron-pair.h +30 -0
- package/dist/node/include/cppgc/explicit-management.h +100 -0
- package/dist/node/include/cppgc/garbage-collected.h +106 -0
- package/dist/node/include/cppgc/heap-consistency.h +309 -0
- package/dist/node/include/cppgc/heap-handle.h +48 -0
- package/dist/node/include/cppgc/heap-state.h +82 -0
- package/dist/node/include/cppgc/heap-statistics.h +120 -0
- package/dist/node/include/cppgc/heap.h +202 -0
- package/dist/node/include/cppgc/internal/api-constants.h +87 -0
- package/dist/node/include/cppgc/internal/atomic-entry-flag.h +48 -0
- package/dist/node/include/cppgc/internal/base-page-handle.h +45 -0
- package/dist/node/include/cppgc/internal/caged-heap-local-data.h +121 -0
- package/dist/node/include/cppgc/internal/caged-heap.h +68 -0
- package/dist/node/include/cppgc/internal/compiler-specific.h +38 -0
- package/dist/node/include/cppgc/internal/finalizer-trait.h +93 -0
- package/dist/node/include/cppgc/internal/gc-info.h +148 -0
- package/dist/node/include/cppgc/internal/logging.h +50 -0
- package/dist/node/include/cppgc/internal/member-storage.h +256 -0
- package/dist/node/include/cppgc/internal/name-trait.h +137 -0
- package/dist/node/include/cppgc/internal/persistent-node.h +214 -0
- package/dist/node/include/cppgc/internal/pointer-policies.h +243 -0
- package/dist/node/include/cppgc/internal/write-barrier.h +487 -0
- package/dist/node/include/cppgc/liveness-broker.h +78 -0
- package/dist/node/include/cppgc/macros.h +35 -0
- package/dist/node/include/cppgc/member.h +629 -0
- package/dist/node/include/cppgc/name-provider.h +65 -0
- package/dist/node/include/cppgc/object-size-trait.h +58 -0
- package/dist/node/include/cppgc/persistent.h +377 -0
- package/dist/node/include/cppgc/platform.h +163 -0
- package/dist/node/include/cppgc/prefinalizer.h +75 -0
- package/dist/node/include/cppgc/process-heap-statistics.h +36 -0
- package/dist/node/include/cppgc/sentinel-pointer.h +39 -0
- package/dist/node/include/cppgc/source-location.h +16 -0
- package/dist/node/include/cppgc/testing.h +106 -0
- package/dist/node/include/cppgc/trace-trait.h +128 -0
- package/dist/node/include/cppgc/type-traits.h +271 -0
- package/dist/node/include/cppgc/visitor.h +504 -0
- package/dist/node/include/crypto/crypto_aes.h +88 -0
- package/dist/node/include/crypto/crypto_bio.h +193 -0
- package/dist/node/include/crypto/crypto_cipher.h +293 -0
- package/dist/node/include/crypto/crypto_clienthello-inl.h +90 -0
- package/dist/node/include/crypto/crypto_clienthello.h +131 -0
- package/dist/node/include/crypto/crypto_common.h +64 -0
- package/dist/node/include/crypto/crypto_context.h +171 -0
- package/dist/node/include/crypto/crypto_dh.h +126 -0
- package/dist/node/include/crypto/crypto_dsa.h +52 -0
- package/dist/node/include/crypto/crypto_ec.h +164 -0
- package/dist/node/include/crypto/crypto_hash.h +91 -0
- package/dist/node/include/crypto/crypto_hkdf.h +61 -0
- package/dist/node/include/crypto/crypto_hmac.h +92 -0
- package/dist/node/include/crypto/crypto_keygen.h +299 -0
- package/dist/node/include/crypto/crypto_keys.h +392 -0
- package/dist/node/include/crypto/crypto_pbkdf2.h +74 -0
- package/dist/node/include/crypto/crypto_random.h +124 -0
- package/dist/node/include/crypto/crypto_rsa.h +136 -0
- package/dist/node/include/crypto/crypto_scrypt.h +85 -0
- package/dist/node/include/crypto/crypto_sig.h +165 -0
- package/dist/node/include/crypto/crypto_spkac.h +21 -0
- package/dist/node/include/crypto/crypto_timing.h +20 -0
- package/dist/node/include/crypto/crypto_tls.h +305 -0
- package/dist/node/include/crypto/crypto_util.h +725 -0
- package/dist/node/include/crypto/crypto_x509.h +140 -0
- package/dist/node/include/dataqueue/queue.h +306 -0
- package/dist/node/include/debug_utils-inl.h +278 -0
- package/dist/node/include/debug_utils.h +196 -0
- package/dist/node/include/diagnosticfilename-inl.h +33 -0
- package/dist/node/include/embedded_data.h +17 -0
- package/dist/node/include/encoding_binding.h +61 -0
- package/dist/node/include/env-inl.h +984 -0
- package/dist/node/include/env.h +1287 -0
- package/dist/node/include/env_properties.h +540 -0
- package/dist/node/include/handle_wrap.h +123 -0
- package/dist/node/include/histogram-inl.h +107 -0
- package/dist/node/include/histogram.h +279 -0
- package/dist/node/include/inspector/io_agent.h +30 -0
- package/dist/node/include/inspector/main_thread_interface.h +116 -0
- package/dist/node/include/inspector/network_agent.h +94 -0
- package/dist/node/include/inspector/network_inspector.h +45 -0
- package/dist/node/include/inspector/network_requests_buffer.h +195 -0
- package/dist/node/include/inspector/network_resource_manager.h +29 -0
- package/dist/node/include/inspector/node_json.h +24 -0
- package/dist/node/include/inspector/node_string.h +101 -0
- package/dist/node/include/inspector/protocol_helper.h +27 -0
- package/dist/node/include/inspector/runtime_agent.h +41 -0
- package/dist/node/include/inspector/target_agent.h +75 -0
- package/dist/node/include/inspector/tracing_agent.h +43 -0
- package/dist/node/include/inspector/worker_agent.h +40 -0
- package/dist/node/include/inspector/worker_inspector.h +124 -0
- package/dist/node/include/inspector_agent.h +165 -0
- package/dist/node/include/inspector_io.h +78 -0
- package/dist/node/include/inspector_profiler.h +149 -0
- package/dist/node/include/inspector_socket.h +60 -0
- package/dist/node/include/inspector_socket_server.h +110 -0
- package/dist/node/include/js_native_api.h +607 -0
- package/dist/node/include/js_native_api_types.h +226 -0
- package/dist/node/include/js_native_api_v8.h +485 -0
- package/dist/node/include/js_native_api_v8_internals.h +45 -0
- package/dist/node/include/js_stream.h +52 -0
- package/dist/node/include/json_utils.h +172 -0
- package/dist/node/include/large_pages/node_large_page.h +34 -0
- package/dist/node/include/libplatform/libplatform-export.h +29 -0
- package/dist/node/include/libplatform/libplatform.h +112 -0
- package/dist/node/include/libplatform/v8-tracing.h +333 -0
- package/dist/node/include/memory_tracker-inl.h +359 -0
- package/dist/node/include/memory_tracker.h +289 -0
- package/dist/node/include/module_wrap.h +216 -0
- package/dist/node/include/node.h +1593 -0
- package/dist/node/include/node_api.h +265 -0
- package/dist/node/include/node_api_internals.h +48 -0
- package/dist/node/include/node_api_types.h +56 -0
- package/dist/node/include/node_binding.h +161 -0
- package/dist/node/include/node_blob.h +159 -0
- package/dist/node/include/node_bob-inl.h +36 -0
- package/dist/node/include/node_bob.h +107 -0
- package/dist/node/include/node_buffer.h +92 -0
- package/dist/node/include/node_builtins.h +220 -0
- package/dist/node/include/node_config_file.h +46 -0
- package/dist/node/include/node_constants.h +82 -0
- package/dist/node/include/node_context_data.h +168 -0
- package/dist/node/include/node_contextify.h +204 -0
- package/dist/node/include/node_crypto.h +56 -0
- package/dist/node/include/node_debug.h +30 -0
- package/dist/node/include/node_dir.h +52 -0
- package/dist/node/include/node_dotenv.h +45 -0
- package/dist/node/include/node_errors.h +380 -0
- package/dist/node/include/node_exit_code.h +54 -0
- package/dist/node/include/node_external_reference.h +165 -0
- package/dist/node/include/node_file-inl.h +406 -0
- package/dist/node/include/node_file.h +537 -0
- package/dist/node/include/node_http2.h +1177 -0
- package/dist/node/include/node_http2_state.h +159 -0
- package/dist/node/include/node_http_common-inl.h +202 -0
- package/dist/node/include/node_http_common.h +535 -0
- package/dist/node/include/node_i18n.h +132 -0
- package/dist/node/include/node_internals.h +483 -0
- package/dist/node/include/node_main_instance.h +67 -0
- package/dist/node/include/node_mem-inl.h +113 -0
- package/dist/node/include/node_mem.h +45 -0
- package/dist/node/include/node_messaging.h +389 -0
- package/dist/node/include/node_metadata.h +164 -0
- package/dist/node/include/node_modules.h +91 -0
- package/dist/node/include/node_mutex.h +323 -0
- package/dist/node/include/node_object_wrap.h +132 -0
- package/dist/node/include/node_options-inl.h +490 -0
- package/dist/node/include/node_options.h +615 -0
- package/dist/node/include/node_perf.h +166 -0
- package/dist/node/include/node_perf_common.h +102 -0
- package/dist/node/include/node_platform.h +238 -0
- package/dist/node/include/node_process-inl.h +26 -0
- package/dist/node/include/node_process.h +112 -0
- package/dist/node/include/node_realm-inl.h +151 -0
- package/dist/node/include/node_realm.h +183 -0
- package/dist/node/include/node_report.h +43 -0
- package/dist/node/include/node_revert.h +82 -0
- package/dist/node/include/node_root_certs.h +3520 -0
- package/dist/node/include/node_sea.h +74 -0
- package/dist/node/include/node_shadow_realm.h +46 -0
- package/dist/node/include/node_snapshot_builder.h +57 -0
- package/dist/node/include/node_snapshotable.h +174 -0
- package/dist/node/include/node_sockaddr-inl.h +257 -0
- package/dist/node/include/node_sockaddr.h +394 -0
- package/dist/node/include/node_sqlite.h +270 -0
- package/dist/node/include/node_stat_watcher.h +73 -0
- package/dist/node/include/node_task_runner.h +92 -0
- package/dist/node/include/node_threadsafe_cow-inl.h +54 -0
- package/dist/node/include/node_threadsafe_cow.h +105 -0
- package/dist/node/include/node_union_bytes.h +81 -0
- package/dist/node/include/node_url.h +96 -0
- package/dist/node/include/node_v8.h +77 -0
- package/dist/node/include/node_v8_platform-inl.h +185 -0
- package/dist/node/include/node_version.h +110 -0
- package/dist/node/include/node_wasi.h +184 -0
- package/dist/node/include/node_wasm_web_api.h +55 -0
- package/dist/node/include/node_watchdog.h +154 -0
- package/dist/node/include/node_webstorage.h +60 -0
- package/dist/node/include/node_worker.h +158 -0
- package/dist/node/include/path.h +33 -0
- package/dist/node/include/permission/addon_permission.h +31 -0
- package/dist/node/include/permission/child_process_permission.h +31 -0
- package/dist/node/include/permission/fs_permission.h +167 -0
- package/dist/node/include/permission/inspector_permission.h +31 -0
- package/dist/node/include/permission/permission.h +138 -0
- package/dist/node/include/permission/permission_base.h +65 -0
- package/dist/node/include/permission/wasi_permission.h +31 -0
- package/dist/node/include/permission/worker_permission.h +31 -0
- package/dist/node/include/pipe_wrap.h +80 -0
- package/dist/node/include/quic/application.h +159 -0
- package/dist/node/include/quic/bindingdata.h +272 -0
- package/dist/node/include/quic/cid.h +127 -0
- package/dist/node/include/quic/data.h +148 -0
- package/dist/node/include/quic/defs.h +245 -0
- package/dist/node/include/quic/endpoint.h +458 -0
- package/dist/node/include/quic/http3.h +15 -0
- package/dist/node/include/quic/logstream.h +81 -0
- package/dist/node/include/quic/packet.h +152 -0
- package/dist/node/include/quic/preferredaddress.h +72 -0
- package/dist/node/include/quic/session.h +443 -0
- package/dist/node/include/quic/sessionticket.h +108 -0
- package/dist/node/include/quic/streams.h +232 -0
- package/dist/node/include/quic/tlscontext.h +227 -0
- package/dist/node/include/quic/tokens.h +256 -0
- package/dist/node/include/quic/transportparams.h +165 -0
- package/dist/node/include/req_wrap-inl.h +171 -0
- package/dist/node/include/req_wrap.h +77 -0
- package/dist/node/include/spawn_sync.h +243 -0
- package/dist/node/include/stream_base-inl.h +173 -0
- package/dist/node/include/stream_base.h +478 -0
- package/dist/node/include/stream_pipe.h +76 -0
- package/dist/node/include/stream_wrap.h +132 -0
- package/dist/node/include/string_bytes.h +113 -0
- package/dist/node/include/string_decoder-inl.h +31 -0
- package/dist/node/include/string_decoder.h +49 -0
- package/dist/node/include/tcp_wrap.h +105 -0
- package/dist/node/include/threadpoolwork-inl.h +70 -0
- package/dist/node/include/timer_wrap-inl.h +32 -0
- package/dist/node/include/timer_wrap.h +85 -0
- package/dist/node/include/timers.h +70 -0
- package/dist/node/include/tracing/agent.h +195 -0
- package/dist/node/include/tracing/node_trace_buffer.h +83 -0
- package/dist/node/include/tracing/node_trace_writer.h +75 -0
- package/dist/node/include/tracing/trace_event.h +722 -0
- package/dist/node/include/tracing/trace_event_common.h +1109 -0
- package/dist/node/include/tracing/traced_value.h +129 -0
- package/dist/node/include/tty_wrap.h +65 -0
- package/dist/node/include/udp_wrap.h +230 -0
- package/dist/node/include/undici_version.h +6 -0
- package/dist/node/include/util-inl.h +700 -0
- package/dist/node/include/util.h +1021 -0
- package/dist/node/include/uv/aix.h +32 -0
- package/dist/node/include/uv/bsd.h +34 -0
- package/dist/node/include/uv/darwin.h +61 -0
- package/dist/node/include/uv/errno.h +483 -0
- package/dist/node/include/uv/linux.h +34 -0
- package/dist/node/include/uv/os390.h +33 -0
- package/dist/node/include/uv/posix.h +31 -0
- package/dist/node/include/uv/sunos.h +44 -0
- package/dist/node/include/uv/threadpool.h +37 -0
- package/dist/node/include/uv/tree.h +521 -0
- package/dist/node/include/uv/unix.h +512 -0
- package/dist/node/include/uv/version.h +43 -0
- package/dist/node/include/uv/win.h +698 -0
- package/dist/node/include/uv.h +1990 -0
- package/dist/node/include/v8-array-buffer.h +525 -0
- package/dist/node/include/v8-callbacks.h +462 -0
- package/dist/node/include/v8-container.h +183 -0
- package/dist/node/include/v8-context.h +485 -0
- package/dist/node/include/v8-cppgc.h +245 -0
- package/dist/node/include/v8-data.h +80 -0
- package/dist/node/include/v8-date.h +48 -0
- package/dist/node/include/v8-debug.h +168 -0
- package/dist/node/include/v8-embedder-heap.h +82 -0
- package/dist/node/include/v8-embedder-state-scope.h +52 -0
- package/dist/node/include/v8-exception.h +223 -0
- package/dist/node/include/v8-extension.h +62 -0
- package/dist/node/include/v8-external.h +37 -0
- package/dist/node/include/v8-fast-api-calls.h +984 -0
- package/dist/node/include/v8-forward.h +82 -0
- package/dist/node/include/v8-function-callback.h +607 -0
- package/dist/node/include/v8-function.h +140 -0
- package/dist/node/include/v8-handle-base.h +137 -0
- package/dist/node/include/v8-initialization.h +289 -0
- package/dist/node/include/v8-inspector-protocol.h +13 -0
- package/dist/node/include/v8-inspector.h +419 -0
- package/dist/node/include/v8-internal.h +1397 -0
- package/dist/node/include/v8-isolate.h +1767 -0
- package/dist/node/include/v8-json.h +47 -0
- package/dist/node/include/v8-local-handle.h +758 -0
- package/dist/node/include/v8-locker.h +138 -0
- package/dist/node/include/v8-maybe.h +160 -0
- package/dist/node/include/v8-memory-span.h +198 -0
- package/dist/node/include/v8-message.h +233 -0
- package/dist/node/include/v8-metrics.h +264 -0
- package/dist/node/include/v8-microtask-queue.h +157 -0
- package/dist/node/include/v8-microtask.h +28 -0
- package/dist/node/include/v8-object.h +824 -0
- package/dist/node/include/v8-persistent-handle.h +582 -0
- package/dist/node/include/v8-platform.h +1358 -0
- package/dist/node/include/v8-primitive-object.h +118 -0
- package/dist/node/include/v8-primitive.h +877 -0
- package/dist/node/include/v8-profiler.h +1302 -0
- package/dist/node/include/v8-promise.h +174 -0
- package/dist/node/include/v8-proxy.h +50 -0
- package/dist/node/include/v8-regexp.h +106 -0
- package/dist/node/include/v8-script.h +904 -0
- package/dist/node/include/v8-snapshot.h +266 -0
- package/dist/node/include/v8-source-location.h +92 -0
- package/dist/node/include/v8-statistics.h +238 -0
- package/dist/node/include/v8-template.h +1297 -0
- package/dist/node/include/v8-traced-handle.h +432 -0
- package/dist/node/include/v8-typed-array.h +390 -0
- package/dist/node/include/v8-unwinder-state.h +31 -0
- package/dist/node/include/v8-unwinder.h +132 -0
- package/dist/node/include/v8-util.h +665 -0
- package/dist/node/include/v8-value-serializer-version.h +24 -0
- package/dist/node/include/v8-value-serializer.h +316 -0
- package/dist/node/include/v8-value.h +655 -0
- package/dist/node/include/v8-version-string.h +38 -0
- package/dist/node/include/v8-version.h +20 -0
- package/dist/node/include/v8-wasm-trap-handler-posix.h +31 -0
- package/dist/node/include/v8-wasm-trap-handler-win.h +28 -0
- package/dist/node/include/v8-wasm.h +201 -0
- package/dist/node/include/v8-weak-callback-info.h +80 -0
- package/dist/node/include/v8.h +88 -0
- package/dist/node/include/v8config.h +981 -0
- package/dist/node/include/zlib_version.h +6 -0
- package/dist/node/libnode.dll +0 -0
- package/dist/node/libnode.lib +0 -0
- package/dist/node/libnodebuildinfo.json +10 -0
- package/dist/node/link_node.lib +0 -0
- package/dist/node/link_node.node +0 -0
- package/index.js +5 -0
- package/libnode.release.json +8 -0
- package/package.json +29 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#ifndef SRC_NODE_WEBSTORAGE_H_
|
|
2
|
+
#define SRC_NODE_WEBSTORAGE_H_
|
|
3
|
+
|
|
4
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
|
+
|
|
6
|
+
#include "base_object.h"
|
|
7
|
+
#include "node_mem.h"
|
|
8
|
+
#include "sqlite3.h"
|
|
9
|
+
#include "util.h"
|
|
10
|
+
|
|
11
|
+
namespace node {
|
|
12
|
+
namespace webstorage {
|
|
13
|
+
|
|
14
|
+
struct conn_deleter {
|
|
15
|
+
void operator()(sqlite3* conn) const noexcept {
|
|
16
|
+
CHECK_EQ(sqlite3_close(conn), SQLITE_OK);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
using conn_unique_ptr = std::unique_ptr<sqlite3, conn_deleter>;
|
|
20
|
+
|
|
21
|
+
struct stmt_deleter {
|
|
22
|
+
void operator()(sqlite3_stmt* stmt) const noexcept { sqlite3_finalize(stmt); }
|
|
23
|
+
};
|
|
24
|
+
using stmt_unique_ptr = std::unique_ptr<sqlite3_stmt, stmt_deleter>;
|
|
25
|
+
|
|
26
|
+
static constexpr std::string_view kInMemoryPath = ":memory:";
|
|
27
|
+
|
|
28
|
+
class Storage : public BaseObject {
|
|
29
|
+
public:
|
|
30
|
+
Storage(Environment* env,
|
|
31
|
+
v8::Local<v8::Object> object,
|
|
32
|
+
std::string_view location);
|
|
33
|
+
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
34
|
+
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
35
|
+
|
|
36
|
+
v8::Maybe<void> Clear();
|
|
37
|
+
v8::MaybeLocal<v8::Array> Enumerate();
|
|
38
|
+
v8::MaybeLocal<v8::Value> Length();
|
|
39
|
+
v8::MaybeLocal<v8::Value> Load(v8::Local<v8::Name> key);
|
|
40
|
+
v8::MaybeLocal<v8::Value> LoadKey(const int index);
|
|
41
|
+
v8::Maybe<void> Remove(v8::Local<v8::Name> key);
|
|
42
|
+
v8::Maybe<void> Store(v8::Local<v8::Name> key, v8::Local<v8::Value> value);
|
|
43
|
+
|
|
44
|
+
SET_MEMORY_INFO_NAME(Storage)
|
|
45
|
+
SET_SELF_SIZE(Storage)
|
|
46
|
+
|
|
47
|
+
private:
|
|
48
|
+
v8::Maybe<void> Open();
|
|
49
|
+
|
|
50
|
+
~Storage() override;
|
|
51
|
+
std::string location_;
|
|
52
|
+
conn_unique_ptr db_;
|
|
53
|
+
v8::Global<v8::Map> symbols_;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
} // namespace webstorage
|
|
57
|
+
} // namespace node
|
|
58
|
+
|
|
59
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
60
|
+
#endif // SRC_NODE_WEBSTORAGE_H_
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#ifndef SRC_NODE_WORKER_H_
|
|
2
|
+
#define SRC_NODE_WORKER_H_
|
|
3
|
+
|
|
4
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
|
+
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <unordered_map>
|
|
8
|
+
#include "node_exit_code.h"
|
|
9
|
+
#include "node_messaging.h"
|
|
10
|
+
#include "uv.h"
|
|
11
|
+
|
|
12
|
+
namespace node {
|
|
13
|
+
|
|
14
|
+
struct SnapshotData;
|
|
15
|
+
namespace worker {
|
|
16
|
+
|
|
17
|
+
class WorkerThreadData;
|
|
18
|
+
|
|
19
|
+
enum ResourceLimits {
|
|
20
|
+
kMaxYoungGenerationSizeMb,
|
|
21
|
+
kMaxOldGenerationSizeMb,
|
|
22
|
+
kCodeRangeSizeMb,
|
|
23
|
+
kStackSizeMb,
|
|
24
|
+
kTotalResourceLimitCount
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// A worker thread, as represented in its parent thread.
|
|
28
|
+
class Worker : public AsyncWrap {
|
|
29
|
+
public:
|
|
30
|
+
Worker(Environment* env,
|
|
31
|
+
v8::Local<v8::Object> wrap,
|
|
32
|
+
const std::string& url,
|
|
33
|
+
const std::string& name,
|
|
34
|
+
std::shared_ptr<PerIsolateOptions> per_isolate_opts,
|
|
35
|
+
std::vector<std::string>&& exec_argv,
|
|
36
|
+
std::shared_ptr<KVStore> env_vars,
|
|
37
|
+
const SnapshotData* snapshot_data,
|
|
38
|
+
const bool is_internal);
|
|
39
|
+
~Worker() override;
|
|
40
|
+
|
|
41
|
+
// Run the worker. This is only called from the worker thread.
|
|
42
|
+
void Run();
|
|
43
|
+
|
|
44
|
+
// Forcibly exit the thread with a specified exit code. This may be called
|
|
45
|
+
// from any thread. `error_code` and `error_message` can be used to create
|
|
46
|
+
// a custom `'error'` event before emitting `'exit'`.
|
|
47
|
+
void Exit(ExitCode code,
|
|
48
|
+
const char* error_code = nullptr,
|
|
49
|
+
const char* error_message = nullptr);
|
|
50
|
+
|
|
51
|
+
// Wait for the worker thread to stop (in a blocking manner).
|
|
52
|
+
void JoinThread();
|
|
53
|
+
|
|
54
|
+
template <typename Fn>
|
|
55
|
+
inline bool RequestInterrupt(Fn&& cb);
|
|
56
|
+
|
|
57
|
+
SET_NO_MEMORY_INFO()
|
|
58
|
+
SET_MEMORY_INFO_NAME(Worker)
|
|
59
|
+
SET_SELF_SIZE(Worker)
|
|
60
|
+
bool IsNotIndicativeOfMemoryLeakAtExit() const override;
|
|
61
|
+
|
|
62
|
+
bool is_stopped() const;
|
|
63
|
+
const SnapshotData* snapshot_data() const { return snapshot_data_; }
|
|
64
|
+
bool is_internal() const { return is_internal_; }
|
|
65
|
+
std::string_view name() const { return name_; }
|
|
66
|
+
|
|
67
|
+
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
68
|
+
static void StartThread(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
69
|
+
static void StopThread(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
70
|
+
static void HasRef(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
71
|
+
static void Ref(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
72
|
+
static void Unref(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
73
|
+
static void GetResourceLimits(
|
|
74
|
+
const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
75
|
+
v8::Local<v8::Float64Array> GetResourceLimits(v8::Isolate* isolate) const;
|
|
76
|
+
static void TakeHeapSnapshot(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
77
|
+
static void LoopIdleTime(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
78
|
+
static void LoopStartTime(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
79
|
+
static void GetHeapStatistics(
|
|
80
|
+
const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
81
|
+
static void CpuUsage(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
82
|
+
static void StartCpuProfile(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
83
|
+
static void StopCpuProfile(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
84
|
+
|
|
85
|
+
private:
|
|
86
|
+
bool CreateEnvMessagePort(Environment* env);
|
|
87
|
+
static size_t NearHeapLimit(void* data, size_t current_heap_limit,
|
|
88
|
+
size_t initial_heap_limit);
|
|
89
|
+
|
|
90
|
+
std::shared_ptr<PerIsolateOptions> per_isolate_opts_;
|
|
91
|
+
std::vector<std::string> exec_argv_;
|
|
92
|
+
std::vector<std::string> argv_;
|
|
93
|
+
|
|
94
|
+
MultiIsolatePlatform* platform_;
|
|
95
|
+
v8::Isolate* isolate_ = nullptr;
|
|
96
|
+
std::optional<uv_thread_t> tid_; // Set while the thread is running
|
|
97
|
+
|
|
98
|
+
std::unique_ptr<InspectorParentHandle> inspector_parent_handle_;
|
|
99
|
+
|
|
100
|
+
// This mutex protects access to all variables listed below it.
|
|
101
|
+
mutable Mutex mutex_;
|
|
102
|
+
|
|
103
|
+
const char* custom_error_ = nullptr;
|
|
104
|
+
std::string custom_error_str_;
|
|
105
|
+
ExitCode exit_code_ = ExitCode::kNoFailure;
|
|
106
|
+
ThreadId thread_id_;
|
|
107
|
+
uintptr_t stack_base_ = 0;
|
|
108
|
+
// Optional name used for debugging in inspector and trace events.
|
|
109
|
+
std::string name_;
|
|
110
|
+
|
|
111
|
+
// Custom resource constraints:
|
|
112
|
+
double resource_limits_[kTotalResourceLimitCount];
|
|
113
|
+
void UpdateResourceConstraints(v8::ResourceConstraints* constraints);
|
|
114
|
+
|
|
115
|
+
// Full size of the thread's stack.
|
|
116
|
+
size_t stack_size_ = 4 * 1024 * 1024;
|
|
117
|
+
// Stack buffer size that is not available to the JS engine.
|
|
118
|
+
static constexpr size_t kStackBufferSize = 192 * 1024;
|
|
119
|
+
|
|
120
|
+
std::unique_ptr<MessagePortData> child_port_data_;
|
|
121
|
+
std::shared_ptr<KVStore> env_vars_;
|
|
122
|
+
EmbedderPreloadCallback embedder_preload_;
|
|
123
|
+
|
|
124
|
+
// A raw flag that is used by creator and worker threads to
|
|
125
|
+
// sync up on pre-mature termination of worker - while in the
|
|
126
|
+
// warmup phase. Once the worker is fully warmed up, use the
|
|
127
|
+
// async handle of the worker's Environment for the same purpose.
|
|
128
|
+
bool stopped_ = true;
|
|
129
|
+
|
|
130
|
+
bool has_ref_ = true;
|
|
131
|
+
uint64_t environment_flags_ = EnvironmentFlags::kNoFlags;
|
|
132
|
+
|
|
133
|
+
// The real Environment of the worker object. It has a lesser
|
|
134
|
+
// lifespan than the worker object itself - comes to life
|
|
135
|
+
// when the worker thread creates a new Environment, and gets
|
|
136
|
+
// destroyed alongwith the worker thread.
|
|
137
|
+
Environment* env_ = nullptr;
|
|
138
|
+
|
|
139
|
+
const SnapshotData* snapshot_data_ = nullptr;
|
|
140
|
+
const bool is_internal_;
|
|
141
|
+
friend class WorkerThreadData;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
template <typename Fn>
|
|
145
|
+
bool Worker::RequestInterrupt(Fn&& cb) {
|
|
146
|
+
Mutex::ScopedLock lock(mutex_);
|
|
147
|
+
if (env_ == nullptr) return false;
|
|
148
|
+
env_->RequestInterrupt(std::move(cb));
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
} // namespace worker
|
|
153
|
+
} // namespace node
|
|
154
|
+
|
|
155
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
#endif // SRC_NODE_WORKER_H_
|
|
@@ -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,138 @@
|
|
|
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
|
+
node::Environment* env__ = (env); \
|
|
33
|
+
const node::permission::PermissionScope perm__ = (perm); \
|
|
34
|
+
const auto resource__ = (resource); \
|
|
35
|
+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
|
|
36
|
+
[[unlikely]] { \
|
|
37
|
+
node::permission::Permission::ThrowAccessDenied( \
|
|
38
|
+
env__, perm__, resource__); \
|
|
39
|
+
return __VA_ARGS__; \
|
|
40
|
+
} \
|
|
41
|
+
} while (0)
|
|
42
|
+
|
|
43
|
+
#define ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS( \
|
|
44
|
+
env, wrap, perm, resource, ...) \
|
|
45
|
+
do { \
|
|
46
|
+
node::Environment* env__ = (env); \
|
|
47
|
+
const node::permission::PermissionScope perm__ = (perm); \
|
|
48
|
+
const auto resource__ = (resource); \
|
|
49
|
+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
|
|
50
|
+
[[unlikely]] { \
|
|
51
|
+
node::permission::Permission::AsyncThrowAccessDenied( \
|
|
52
|
+
env__, (wrap), perm__, resource__); \
|
|
53
|
+
return __VA_ARGS__; \
|
|
54
|
+
} \
|
|
55
|
+
} while (0)
|
|
56
|
+
|
|
57
|
+
#define ERR_ACCESS_DENIED_IF_INSUFFICIENT_PERMISSIONS( \
|
|
58
|
+
env, perm, resource, args, ...) \
|
|
59
|
+
do { \
|
|
60
|
+
node::Environment* env__ = (env); \
|
|
61
|
+
const node::permission::PermissionScope perm__ = (perm); \
|
|
62
|
+
const auto resource__ = (resource); \
|
|
63
|
+
if (!env__->permission()->is_granted(env__, perm__, resource__)) \
|
|
64
|
+
[[unlikely]] { \
|
|
65
|
+
Local<Value> err_access; \
|
|
66
|
+
if (node::permission::CreateAccessDeniedError(env__, perm__, resource__) \
|
|
67
|
+
.ToLocal(&err_access)) { \
|
|
68
|
+
args.GetReturnValue().Set(err_access); \
|
|
69
|
+
} else { \
|
|
70
|
+
args.GetReturnValue().Set(UV_EACCES); \
|
|
71
|
+
} \
|
|
72
|
+
return __VA_ARGS__; \
|
|
73
|
+
} \
|
|
74
|
+
} while (0)
|
|
75
|
+
|
|
76
|
+
#define SET_INSUFFICIENT_PERMISSION_ERROR_CALLBACK(scope) \
|
|
77
|
+
void InsufficientPermissionError(std::string_view resource) { \
|
|
78
|
+
v8::HandleScope handle_scope(env()->isolate()); \
|
|
79
|
+
v8::Context::Scope context_scope(env()->context()); \
|
|
80
|
+
v8::Local<v8::Value> arg; \
|
|
81
|
+
if (!permission::CreateAccessDeniedError(env(), (scope), resource) \
|
|
82
|
+
.ToLocal(&arg)) { \
|
|
83
|
+
} \
|
|
84
|
+
MakeCallback(env()->oncomplete_string(), 1, &arg); \
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
class Permission {
|
|
88
|
+
public:
|
|
89
|
+
Permission();
|
|
90
|
+
|
|
91
|
+
FORCE_INLINE bool is_granted(Environment* env,
|
|
92
|
+
const PermissionScope permission,
|
|
93
|
+
const std::string_view& res = "") const {
|
|
94
|
+
if (!enabled_) [[likely]] {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
return is_scope_granted(env, permission, res);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
FORCE_INLINE bool enabled() const { return enabled_; }
|
|
101
|
+
|
|
102
|
+
static PermissionScope StringToPermission(const std::string& perm);
|
|
103
|
+
static const char* PermissionToString(PermissionScope perm);
|
|
104
|
+
static void ThrowAccessDenied(Environment* env,
|
|
105
|
+
PermissionScope perm,
|
|
106
|
+
const std::string_view& res);
|
|
107
|
+
static void AsyncThrowAccessDenied(Environment* env,
|
|
108
|
+
fs::FSReqBase* req_wrap,
|
|
109
|
+
PermissionScope perm,
|
|
110
|
+
const std::string_view& res);
|
|
111
|
+
|
|
112
|
+
// CLI Call
|
|
113
|
+
void Apply(Environment* env,
|
|
114
|
+
const std::vector<std::string>& allow,
|
|
115
|
+
PermissionScope scope);
|
|
116
|
+
void EnablePermissions();
|
|
117
|
+
|
|
118
|
+
private:
|
|
119
|
+
COLD_NOINLINE bool is_scope_granted(Environment* env,
|
|
120
|
+
const PermissionScope permission,
|
|
121
|
+
const std::string_view& res = "") const {
|
|
122
|
+
auto perm_node = nodes_.find(permission);
|
|
123
|
+
if (perm_node != nodes_.end()) {
|
|
124
|
+
return perm_node->second->is_granted(env, permission, res);
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
std::unordered_map<PermissionScope, std::shared_ptr<PermissionBase>> nodes_;
|
|
130
|
+
bool enabled_;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
} // namespace permission
|
|
134
|
+
|
|
135
|
+
} // namespace node
|
|
136
|
+
|
|
137
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
138
|
+
#endif // SRC_PERMISSION_PERMISSION_H_
|