44#include " node_external_reference.h"
55#include " node_i18n.h"
66#include " node_process-inl.h"
7+ #include " permission/permission.h"
78#include " util.h"
89
910#include < time.h> // tzset(), _tzset()
@@ -435,6 +436,14 @@ static Intercepted EnvGetter(Local<Name> property,
435436 return Intercepted::kYes ;
436437 }
437438 CHECK (property->IsString ());
439+
440+ Utf8Value key (env->isolate (), property);
441+ if (env->permission ()->enabled () &&
442+ !env->permission ()->is_granted (
443+ env, permission::PermissionScope::kEnvVar , key.ToStringView ())) {
444+ return Intercepted::kNo ;
445+ }
446+
438447 MaybeLocal<String> value_string =
439448 env->env_vars ()->Get (env->isolate (), property.As <String>());
440449
@@ -453,6 +462,16 @@ static Intercepted EnvSetter(Local<Name> property,
453462 const PropertyCallbackInfo<void >& info) {
454463 Environment* env = Environment::GetCurrent (info);
455464 CHECK (env->has_run_bootstrapping_code ());
465+
466+ if (property->IsString ()) {
467+ Utf8Value key (env->isolate (), property);
468+ THROW_IF_INSUFFICIENT_PERMISSIONS (
469+ env,
470+ permission::PermissionScope::kEnvVar ,
471+ key.ToStringView (),
472+ Intercepted::kYes );
473+ }
474+
456475 // calling env->EmitProcessEnvWarning() sets a variable indicating that
457476 // warnings have been emitted. It should be called last after other
458477 // conditions leading to a warning have been met.
@@ -489,6 +508,13 @@ static Intercepted EnvQuery(Local<Name> property,
489508 Environment* env = Environment::GetCurrent (info);
490509 CHECK (env->has_run_bootstrapping_code ());
491510 if (property->IsString ()) {
511+ Utf8Value key (env->isolate (), property);
512+ if (env->permission ()->enabled () &&
513+ !env->permission ()->is_granted (
514+ env, permission::PermissionScope::kEnvVar , key.ToStringView ())) {
515+ return Intercepted::kNo ;
516+ }
517+
492518 int32_t rc = env->env_vars ()->Query (env->isolate (), property.As <String>());
493519 bool has_env = (rc != -1 );
494520 TraceEnvVar (env, " query" , property.As <String>());
@@ -506,6 +532,13 @@ static Intercepted EnvDeleter(Local<Name> property,
506532 Environment* env = Environment::GetCurrent (info);
507533 CHECK (env->has_run_bootstrapping_code ());
508534 if (property->IsString ()) {
535+ Utf8Value key (env->isolate (), property);
536+ THROW_IF_INSUFFICIENT_PERMISSIONS (
537+ env,
538+ permission::PermissionScope::kEnvVar ,
539+ key.ToStringView (),
540+ Intercepted::kYes );
541+
509542 env->env_vars ()->Delete (env->isolate (), property.As <String>());
510543
511544 TraceEnvVar (env, " delete" , property.As <String>());
@@ -525,7 +558,24 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
525558
526559 Local<Array> ret;
527560 if (env->env_vars ()->Enumerate (env->isolate ()).ToLocal (&ret)) {
528- info.GetReturnValue ().Set (ret);
561+ if (env->permission ()->enabled ()) {
562+ LocalVector<Value> filtered (env->isolate ());
563+ for (uint32_t i = 0 ; i < ret->Length (); i++) {
564+ Local<Value> elem;
565+ if (!ret->Get (env->context (), i).ToLocal (&elem)) continue ;
566+ Utf8Value key (env->isolate (), elem);
567+ if (env->permission ()->is_granted (
568+ env,
569+ permission::PermissionScope::kEnvVar ,
570+ key.ToStringView ())) {
571+ filtered.push_back (elem);
572+ }
573+ }
574+ info.GetReturnValue ().Set (
575+ Array::New (env->isolate (), filtered.data (), filtered.size ()));
576+ } else {
577+ info.GetReturnValue ().Set (ret);
578+ }
529579 }
530580}
531581
0 commit comments