@@ -28,6 +28,7 @@ using v8::Nothing;
2828using v8::Object;
2929using v8::ObjectTemplate;
3030using v8::PropertyCallbackInfo;
31+ using v8::PropertyDescriptor;
3132using v8::PropertyHandlerFlags;
3233using v8::ReadOnly;
3334using v8::String;
@@ -396,11 +397,57 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
396397 env->env_vars ()->Enumerate (env->isolate ()));
397398}
398399
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+
399439MaybeLocal<Object> CreateEnvVarProxy (Local<Context> context, Isolate* isolate) {
400440 EscapableHandleScope scope (isolate);
401441 Local<ObjectTemplate> env_proxy_template = ObjectTemplate::New (isolate);
402442 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>(),
404451 PropertyHandlerFlags::kHasNoSideEffect ));
405452 return scope.EscapeMaybe (env_proxy_template->NewInstance (context));
406453}
@@ -411,6 +458,7 @@ void RegisterEnvVarExternalReferences(ExternalReferenceRegistry* registry) {
411458 registry->Register (EnvQuery);
412459 registry->Register (EnvDeleter);
413460 registry->Register (EnvEnumerator);
461+ registry->Register (EnvDefiner);
414462}
415463} // namespace node
416464
0 commit comments