ses
Version:
Hardened JavaScript for Fearless Cooperation
62 lines (54 loc) • 1.83 kB
JavaScript
import {
Proxy,
create,
freeze,
getOwnPropertyDescriptors,
reflectSet,
} from './commons.js';
import {
strictScopeTerminatorHandler,
alwaysThrowHandler,
} from './strict-scope-terminator.js';
/**
* `freeze` but not `harden` the proxy target so it remains trapping.
* Thus, it should not be shared outside this module.
*
* @see https://github.com/endojs/endo/blob/master/packages/ses/docs/preparing-for-stabilize.md
*/
const objTarget = freeze({ __proto__: null });
/*
* createSloppyGlobalsScopeTerminator()
* strictScopeTerminatorHandler manages a scopeTerminator Proxy which serves as
* the final scope boundary that will always return "undefined" in order
* to prevent access to "start compartment globals". When "sloppyGlobalsMode"
* is true, the Proxy will perform sets on the "globalObject".
*/
export const createSloppyGlobalsScopeTerminator = globalObject => {
const scopeProxyHandlerProperties = {
// inherit scopeTerminator behavior
...strictScopeTerminatorHandler,
// Redirect set properties to the globalObject.
set(_shadow, prop, value) {
return reflectSet(globalObject, prop, value);
},
// Always claim to have a potential property in order to be the recipient of a set
has(_shadow, _prop) {
return true;
},
};
// The scope handler's prototype is a proxy that throws if any trap other
// than get/set/has are run (like getOwnPropertyDescriptors, apply,
// getPrototypeOf).
const sloppyGlobalsScopeTerminatorHandler = freeze(
create(
alwaysThrowHandler,
getOwnPropertyDescriptors(scopeProxyHandlerProperties),
),
);
const sloppyGlobalsScopeTerminator = new Proxy(
objTarget,
sloppyGlobalsScopeTerminatorHandler,
);
return sloppyGlobalsScopeTerminator;
};
freeze(createSloppyGlobalsScopeTerminator);