// Flags: --expose-internals 'use strict'; const { mustNotCall } = require('../common'); const assert = require('assert'); const { RegExpPrototypeSymbolReplace, RegExpPrototypeSymbolSearch, RegExpPrototypeSymbolSplit, SafeStringPrototypeSearch, hardenRegExp, } = require('internal/test/binding').primordials; Object.defineProperties(RegExp.prototype, { [Symbol.match]: { get: mustNotCall('get %RegExp.prototype%[@@match]'), set: mustNotCall('set %RegExp.prototype%[@@match]'), }, [Symbol.matchAll]: { get: mustNotCall('get %RegExp.prototype%[@@matchAll]'), set: mustNotCall('set %RegExp.prototype%[@@matchAll]'), }, [Symbol.replace]: { get: mustNotCall('get %RegExp.prototype%[@@replace]'), set: mustNotCall('set %RegExp.prototype%[@@replace]'), }, [Symbol.search]: { get: mustNotCall('get %RegExp.prototype%[@@search]'), set: mustNotCall('set %RegExp.prototype%[@@search]'), }, [Symbol.split]: { get: mustNotCall('get %RegExp.prototype%[@@split]'), set: mustNotCall('set %RegExp.prototype%[@@split]'), }, dotAll: { get: mustNotCall('get %RegExp.prototype%.dotAll'), set: mustNotCall('set %RegExp.prototype%.dotAll'), }, exec: { get: mustNotCall('get %RegExp.prototype%.exec'), set: mustNotCall('set %RegExp.prototype%.exec'), }, flags: { get: mustNotCall('get %RegExp.prototype%.flags'), set: mustNotCall('set %RegExp.prototype%.flags'), }, global: { get: mustNotCall('get %RegExp.prototype%.global'), set: mustNotCall('set %RegExp.prototype%.global'), }, hasIndices: { get: mustNotCall('get %RegExp.prototype%.hasIndices'), set: mustNotCall('set %RegExp.prototype%.hasIndices'), }, ignoreCase: { get: mustNotCall('get %RegExp.prototype%.ignoreCase'), set: mustNotCall('set %RegExp.prototype%.ignoreCase'), }, multiline: { get: mustNotCall('get %RegExp.prototype%.multiline'), set: mustNotCall('set %RegExp.prototype%.multiline'), }, source: { get: mustNotCall('get %RegExp.prototype%.source'), set: mustNotCall('set %RegExp.prototype%.source'), }, sticky: { get: mustNotCall('get %RegExp.prototype%.sticky'), set: mustNotCall('set %RegExp.prototype%.sticky'), }, test: { get: mustNotCall('get %RegExp.prototype%.test'), set: mustNotCall('set %RegExp.prototype%.test'), }, toString: { get: mustNotCall('get %RegExp.prototype%.toString'), set: mustNotCall('set %RegExp.prototype%.toString'), }, unicode: { get: mustNotCall('get %RegExp.prototype%.unicode'), set: mustNotCall('set %RegExp.prototype%.unicode'), }, }); hardenRegExp(hardenRegExp(/1/)); // IMO there are no valid use cases in node core to use RegExpPrototypeSymbolMatch // or RegExpPrototypeSymbolMatchAll, they are inherently unsafe. { const myRegex = hardenRegExp(/a/); assert.strictEqual(RegExpPrototypeSymbolReplace(myRegex, 'baar', 'e'), 'bear'); } { const myRegex = hardenRegExp(/a/g); assert.strictEqual(RegExpPrototypeSymbolReplace(myRegex, 'baar', 'e'), 'beer'); } { const myRegex = hardenRegExp(/a/); assert.strictEqual(RegExpPrototypeSymbolSearch(myRegex, 'baar'), 1); } { const myRegex = /a/; assert.strictEqual(SafeStringPrototypeSearch('baar', myRegex), 1); } { const myRegex = hardenRegExp(/a/); assert.deepStrictEqual(RegExpPrototypeSymbolSplit(myRegex, 'baar', 0), []); } { const myRegex = hardenRegExp(/a/); assert.deepStrictEqual(RegExpPrototypeSymbolSplit(myRegex, 'baar', 1), ['b']); } { const myRegex = hardenRegExp(/a/); assert.deepStrictEqual(RegExpPrototypeSymbolSplit(myRegex, 'baar'), ['b', '', 'r']); }