@@ -28,6 +28,7 @@ using v8::Nothing;
28
28
using v8::Object;
29
29
using v8::ObjectTemplate;
30
30
using v8::PropertyCallbackInfo;
31
+ using v8::PropertyDescriptor;
31
32
using v8::PropertyHandlerFlags;
32
33
using v8::ReadOnly;
33
34
using v8::String;
@@ -396,11 +397,57 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
396
397
env->env_vars ()->Enumerate (env->isolate ()));
397
398
}
398
399
400
+ static void EnvDefiner (Local<Name> property,
401
+ const PropertyDescriptor& desc,
402
+ const PropertyCallbackInfo<Value>& info) {
403
+ Environment* env = Environment::GetCurrent (info);
404
+ if (desc.has_value ()) {
405
+ if (!desc.has_writable () ||
406
+ !desc.has_enumerable () ||
407
+ !desc.has_configurable ()) {
408
+ THROW_ERR_INVALID_OBJECT_DEFINE_PROPERTY (env,
409
+ " 'process.env' only accepts a "
410
+ " configurable, writable,"
411
+ " and enumerable "
412
+ " data descriptor" );
413
+ } else if (!desc.configurable () ||
414
+ !desc.enumerable () ||
415
+ !desc.writable ()) {
416
+ THROW_ERR_INVALID_OBJECT_DEFINE_PROPERTY (env,
417
+ " 'process.env' only accepts a "
418
+ " configurable, writable,"
419
+ " and enumerable "
420
+ " data descriptor" );
421
+ } else {
422
+ return EnvSetter (property, desc.value (), info);
423
+ }
424
+ } else if (desc.has_get () || desc.has_set ()) {
425
+ // we don't accept a getter/setter in 'process.env'
426
+ THROW_ERR_INVALID_OBJECT_DEFINE_PROPERTY (env,
427
+ " 'process.env' does not accept an"
428
+ " accessor(getter/setter)"
429
+ " descriptor" );
430
+ } else {
431
+ THROW_ERR_INVALID_OBJECT_DEFINE_PROPERTY (env,
432
+ " 'process.env' only accepts a "
433
+ " configurable, writable,"
434
+ " and enumerable "
435
+ " data descriptor" );
436
+ }
437
+ }
438
+
399
439
MaybeLocal<Object> CreateEnvVarProxy (Local<Context> context, Isolate* isolate) {
400
440
EscapableHandleScope scope (isolate);
401
441
Local<ObjectTemplate> env_proxy_template = ObjectTemplate::New (isolate);
402
442
env_proxy_template->SetHandler (NamedPropertyHandlerConfiguration (
403
- EnvGetter, EnvSetter, EnvQuery, EnvDeleter, EnvEnumerator, Local<Value>(),
443
+ EnvGetter,
444
+ EnvSetter,
445
+ EnvQuery,
446
+ EnvDeleter,
447
+ EnvEnumerator,
448
+ EnvDefiner,
449
+ nullptr ,
450
+ Local<Value>(),
404
451
PropertyHandlerFlags::kHasNoSideEffect ));
405
452
return scope.EscapeMaybe (env_proxy_template->NewInstance (context));
406
453
}
@@ -411,6 +458,7 @@ void RegisterEnvVarExternalReferences(ExternalReferenceRegistry* registry) {
411
458
registry->Register (EnvQuery);
412
459
registry->Register (EnvDeleter);
413
460
registry->Register (EnvEnumerator);
461
+ registry->Register (EnvDefiner);
414
462
}
415
463
} // namespace node
416
464
0 commit comments