@@ -12,109 +12,104 @@ type unsafeWindow = typeof window
1212// eslint-disable-next-line @typescript-eslint/naming-convention
1313declare const unsafeWindow : unsafeWindow
1414
15- const Win = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window
15+ const BrowserWindow = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window
16+ const UserscriptName = 'tinyShield'
1617
1718import { CheckDepthInASWeakMap } from './as-weakmap.js'
1819import { SafeArrayToString } from './safe-ArrayToString.js'
1920
20- export const OriginalRegExpTest = Win . RegExp . prototype . test
21+ const OriginalRegExpTest = BrowserWindow . RegExp . prototype . test
22+ const OriginalArrayMap = BrowserWindow . Array . prototype . map
23+ const OriginalString = BrowserWindow . String
24+ const OriginalArrayJoin = BrowserWindow . Array . prototype . join
25+ const OriginalObjectGetPrototypeOf = BrowserWindow . Object . getPrototypeOf
2126
22- export function RunTinyShieldUserscript ( BrowserWindow : typeof window , UserscriptName : string = 'tinyShield' ) : void {
23- const OriginalRegExpTest = BrowserWindow . RegExp . prototype . test
24- const OriginalArrayMap = BrowserWindow . Array . prototype . map
25- const OriginalString = BrowserWindow . String
26- const OriginalArrayJoin = BrowserWindow . Array . prototype . join
27- const OriginalObjectGetPrototypeOf = BrowserWindow . Object . getPrototypeOf
27+ const ProtectedFunctionStrings = [ 'toString' , 'get' , 'set' ]
2828
29- const ProtectedFunctionStrings = [ 'toString' , 'get' , 'set' ]
30-
31- BrowserWindow . Function . prototype . toString = new Proxy ( BrowserWindow . Function . prototype . toString , {
32- // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
33- apply ( Target : ( ) => string , ThisArg : Function , Args : [ ] ) {
34- if ( ProtectedFunctionStrings . includes ( ThisArg . name ) ) {
35- return `function ${ ThisArg . name } () { [native code] }`
36- } else {
37- return Reflect . apply ( Target , ThisArg , Args )
38- }
29+ BrowserWindow . Function . prototype . toString = new Proxy ( BrowserWindow . Function . prototype . toString , {
30+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
31+ apply ( Target : ( ) => string , ThisArg : Function , Args : [ ] ) {
32+ if ( ProtectedFunctionStrings . includes ( ThisArg . name ) ) {
33+ return `function ${ ThisArg . name } () { [native code] }`
34+ } else {
35+ return Reflect . apply ( Target , ThisArg , Args )
3936 }
40- } )
41-
42- const ASInitPositiveRegExps : RegExp [ ] [ ] = [ [
43- / [ a - z A - Z 0 - 9 ] + * = > * { * c o n s t * [ a - z A - Z 0 - 9 ] + * = * [ a - z A - Z 0 - 9 ] + * ; * i f / ,
44- / = = = ? * [ a - z A - Z 0 - 9 ] + * \[ * [ a - z A - Z 0 - 9 ] + \( * [ 0 - 9 a - z ] + * \) * \] * \) * r e t u r n * [ a - z A - Z 0 - 9 ] + * \( * { * ( ' | " ) ? i n v e n t o r y I d ( ' | " ) ? * : / ,
45- / { * ( ' | " ) ? i n v e n t o r y I d ( ' | " ) ? * : * t h i s * \[ [ a - z A - Z 0 - 9 ] + * \( * [ 0 - 9 a - z ] + * \) * \] * , * \. \. \. * [ a - z A - Z 0 - 9 ] + * \[ * [ a - z A - Z 0 - 9 ] + * \( * [ 0 - 9 a - z ] + * * \) * \] * } * \) /
46- ] ]
47- BrowserWindow . Map . prototype . get = new Proxy ( BrowserWindow . Map . prototype . get , {
48- apply ( Target : ( key : unknown ) => unknown , ThisArg : Map < unknown , unknown > , Args : [ unknown ] ) {
49- if ( Args . length > 0 && typeof Args [ 0 ] !== 'function' ) {
50- return Reflect . apply ( Target , ThisArg , Args )
51- }
52-
53- let ArgText = SafeArrayToString ( Args , { OriginalArrayMap, OriginalString, OriginalArrayJoin, OriginalObjectGetPrototypeOf } )
54- if ( ASInitPositiveRegExps . filter ( ASInitPositiveRegExp => ASInitPositiveRegExp . filter ( Index => OriginalRegExpTest . call ( Index , ArgText ) as boolean ) . length >= 2 ) . length === 1 ) {
55- console . debug ( `[${ UserscriptName } ]: Map.prototype.get:` , ThisArg , Args )
56- throw new Error ( )
57- }
37+ }
38+ } )
5839
40+ const ASInitPositiveRegExps : RegExp [ ] [ ] = [ [
41+ / [ a - z A - Z 0 - 9 ] + * = > * { * c o n s t * [ a - z A - Z 0 - 9 ] + * = * [ a - z A - Z 0 - 9 ] + * ; * i f / ,
42+ / = = = ? * [ a - z A - Z 0 - 9 ] + * \[ * [ a - z A - Z 0 - 9 ] + \( * [ 0 - 9 a - z ] + * \) * \] * \) * r e t u r n * [ a - z A - Z 0 - 9 ] + * \( * { * ( ' | " ) ? i n v e n t o r y I d ( ' | " ) ? * : / ,
43+ / { * ( ' | " ) ? i n v e n t o r y I d ( ' | " ) ? * : * t h i s * \[ [ a - z A - Z 0 - 9 ] + * \( * [ 0 - 9 a - z ] + * \) * \] * , * \. \. \. * [ a - z A - Z 0 - 9 ] + * \[ * [ a - z A - Z 0 - 9 ] + * \( * [ 0 - 9 a - z ] + * * \) * \] * } * \) /
44+ ] ]
45+ BrowserWindow . Map . prototype . get = new Proxy ( BrowserWindow . Map . prototype . get , {
46+ apply ( Target : ( key : unknown ) => unknown , ThisArg : Map < unknown , unknown > , Args : [ unknown ] ) {
47+ if ( Args . length > 0 && typeof Args [ 0 ] !== 'function' ) {
5948 return Reflect . apply ( Target , ThisArg , Args )
6049 }
61- } )
6250
63- const ASReinsertedAdvInvenPositiveRegExps : RegExp [ ] [ ] = [ [
64- / i n v e n t o r y _ i d , [ a - z A - Z 0 - 9 - ] + \/ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + / ,
65- / i n v e n t o r y _ i d , [ a - z A - Z 0 - 9 - ] + \/ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + / ,
66- / i n v e n t o r y _ i d , [ a - z A - Z 0 - 9 - ] + \/ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + /
67- ] , [
68- / [ a - z 0 - 9 A - Z ] + \. s e t A t t r i b u t e \( * ( ' | " ) o n l o a d ( ' | " ) * , * ( ' | " ) ! * a s y n c * f u n c t i o n \( * \) * \{ * l e t * / ,
69- / c o n f i r m \( * [ A - Z a - z 0 - 9 ] + * \) * \) * { * c o n s t * [ A - Z a - z 0 - 9 ] + * = * n e w * [ A - Z a - z 0 - 9 ] + \. U R L \( ( ' | " ) h t t p s : \/ \/ r e p o r t \. e r r o r - r e p o r t \. c o m \/ / ,
70- / \. f o r E a c h * \( * \( * [ A - Z a - z 0 - 9 ] + * = > * [ A - Z a - z 0 - 9 ] + \. r e m o v e * \( * \) * \) * \) * \) * , * [ 0 - 9 a - f ] + * \) * ; * c o n s t * [ A - Z a - z 0 - 9 ] + * = * a w a i t * \( * a w a i t * f e t c h * \( /
71- ] ]
72- BrowserWindow . Map . prototype . set = new Proxy ( BrowserWindow . Map . prototype . set , {
73- apply ( Target : ( key : unknown , value : unknown ) => Map < unknown , unknown > , ThisArg : Map < unknown , unknown > , Args : [ unknown , unknown ] ) {
74- let ArgText = ''
75- ArgText = SafeArrayToString ( Args , { OriginalArrayMap, OriginalString, OriginalArrayJoin, OriginalObjectGetPrototypeOf } )
76- if ( ASReinsertedAdvInvenPositiveRegExps . filter ( ASReinsertedAdvInvenPositiveRegExp => ASReinsertedAdvInvenPositiveRegExp . filter ( Index => OriginalRegExpTest . call ( Index , ArgText ) as boolean ) . length >= 3 ) . length === 1 ) {
77- console . debug ( `[${ UserscriptName } ]: Map.prototype.set:` , ThisArg , Args )
78- throw new Error ( )
79- }
80- return Reflect . apply ( Target , ThisArg , Args )
51+ let ArgText = SafeArrayToString ( Args , { OriginalArrayMap, OriginalString, OriginalArrayJoin, OriginalObjectGetPrototypeOf } )
52+ if ( ASInitPositiveRegExps . filter ( ASInitPositiveRegExp => ASInitPositiveRegExp . filter ( Index => OriginalRegExpTest . call ( Index , ArgText ) as boolean ) . length >= 2 ) . length === 1 ) {
53+ console . debug ( `[${ UserscriptName } ]: Map.prototype.get:` , ThisArg , Args )
54+ throw new Error ( )
8155 }
82- } )
8356
84- BrowserWindow . WeakMap . prototype . set = new Proxy ( BrowserWindow . WeakMap . prototype . set , {
85- apply ( Target : ( key : object , value : unknown ) => WeakMap < object , unknown > , ThisArg : WeakMap < object , unknown > , Args : [ object , unknown ] ) {
86- if ( CheckDepthInASWeakMap ( Args ) ) {
87- console . debug ( `[${ UserscriptName } ]: WeakMap.prototype.set:` , ThisArg , Args )
88- throw new Error ( )
89- }
57+ return Reflect . apply ( Target , ThisArg , Args )
58+ }
59+ } )
9060
91- return Reflect . apply ( Target , ThisArg , Args )
61+ const ASReinsertedAdvInvenPositiveRegExps : RegExp [ ] [ ] = [ [
62+ / i n v e n t o r y _ i d , [ a - z A - Z 0 - 9 - ] + \/ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + / ,
63+ / i n v e n t o r y _ i d , [ a - z A - Z 0 - 9 - ] + \/ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + / ,
64+ / i n v e n t o r y _ i d , [ a - z A - Z 0 - 9 - ] + \/ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + /
65+ ] , [
66+ / [ a - z 0 - 9 A - Z ] + \. s e t A t t r i b u t e \( * ( ' | " ) o n l o a d ( ' | " ) * , * ( ' | " ) ! * a s y n c * f u n c t i o n \( * \) * \{ * l e t * / ,
67+ / c o n f i r m \( * [ A - Z a - z 0 - 9 ] + * \) * \) * { * c o n s t * [ A - Z a - z 0 - 9 ] + * = * n e w * [ A - Z a - z 0 - 9 ] + \. U R L \( ( ' | " ) h t t p s : \/ \/ r e p o r t \. e r r o r - r e p o r t \. c o m \/ / ,
68+ / \. f o r E a c h * \( * \( * [ A - Z a - z 0 - 9 ] + * = > * [ A - Z a - z 0 - 9 ] + \. r e m o v e * \( * \) * \) * \) * \) * , * [ 0 - 9 a - f ] + * \) * ; * c o n s t * [ A - Z a - z 0 - 9 ] + * = * a w a i t * \( * a w a i t * f e t c h * \( /
69+ ] ]
70+ BrowserWindow . Map . prototype . set = new Proxy ( BrowserWindow . Map . prototype . set , {
71+ apply ( Target : ( key : unknown , value : unknown ) => Map < unknown , unknown > , ThisArg : Map < unknown , unknown > , Args : [ unknown , unknown ] ) {
72+ let ArgText = ''
73+ ArgText = SafeArrayToString ( Args , { OriginalArrayMap, OriginalString, OriginalArrayJoin, OriginalObjectGetPrototypeOf } )
74+ if ( ASReinsertedAdvInvenPositiveRegExps . filter ( ASReinsertedAdvInvenPositiveRegExp => ASReinsertedAdvInvenPositiveRegExp . filter ( Index => OriginalRegExpTest . call ( Index , ArgText ) as boolean ) . length >= 3 ) . length === 1 ) {
75+ console . debug ( `[${ UserscriptName } ]: Map.prototype.set:` , ThisArg , Args )
76+ throw new Error ( )
9277 }
93- } )
78+ return Reflect . apply ( Target , ThisArg , Args )
79+ }
80+ } )
9481
95- let ASTimerRegExps : RegExp [ ] [ ] = [ [
96- / a s y n c * \( * \) * = > * { * c o n s t * [ A - Z a - z 0 - 9 ] + * = * [ A - Z a - z 0 - 9 ] + * ; * a w a i t * [ A - Z a - z 0 - 9 ] + * \( * \) / ,
97- / ; * a w a i t * [ A - Z a - z 0 - 9 ] + * \( * \) * , * [ A - Z a - z 0 - 9 ] + * \( * ! * 1 * , * n e w * E r r o r * \( * [ A - Z a - z 0 - 9 ] + * \( * [ 0 - 9 a - f ] + * \) * \) * \) * } / ,
98- / * \) * \) * \) * } /
99- ] ]
100- BrowserWindow . setTimeout = new Proxy ( BrowserWindow . setTimeout , {
101- apply ( Target : typeof BrowserWindow . setTimeout , ThisArg : undefined , Args : Parameters < typeof setTimeout > ) {
102- if ( ASTimerRegExps . filter ( ASTimerRegExp => ASTimerRegExp . filter ( Index => Index . test ( Args [ 0 ] . toString ( ) ) ) . length >= 3 ) . length === 1 ) {
103- console . debug ( `[${ UserscriptName } ]: setTimeout:` , Args )
104- return
105- }
106- return Reflect . apply ( Target , ThisArg , Args )
107- }
108- } )
109- BrowserWindow . setInterval = new Proxy ( BrowserWindow . setInterval , {
110- apply ( Target : typeof BrowserWindow . setInterval , ThisArg : undefined , Args : Parameters < typeof setInterval > ) {
111- if ( ASTimerRegExps . filter ( ASTimerRegExp => ASTimerRegExp . filter ( Index => Index . test ( Args [ 0 ] . toString ( ) ) ) . length >= 3 ) . length === 1 ) {
112- console . debug ( `[${ UserscriptName } ]: setInterval:` , Args )
113- return
114- }
115- return Reflect . apply ( Target , ThisArg , Args )
82+ BrowserWindow . WeakMap . prototype . set = new Proxy ( BrowserWindow . WeakMap . prototype . set , {
83+ apply ( Target : ( key : object , value : unknown ) => WeakMap < object , unknown > , ThisArg : WeakMap < object , unknown > , Args : [ object , unknown ] ) {
84+ if ( CheckDepthInASWeakMap ( Args ) ) {
85+ console . debug ( `[${ UserscriptName } ]: WeakMap.prototype.set:` , ThisArg , Args )
86+ throw new Error ( )
11687 }
117- } )
118- }
11988
120- RunTinyShieldUserscript ( Win )
89+ return Reflect . apply ( Target , ThisArg , Args )
90+ }
91+ } )
92+
93+ let ASTimerRegExps : RegExp [ ] [ ] = [ [
94+ / a s y n c * \( * \) * = > * { * c o n s t * [ A - Z a - z 0 - 9 ] + * = * [ A - Z a - z 0 - 9 ] + * ; * a w a i t * [ A - Z a - z 0 - 9 ] + * \( * \) / ,
95+ / ; * a w a i t * [ A - Z a - z 0 - 9 ] + * \( * \) * , * [ A - Z a - z 0 - 9 ] + * \( * ! * 1 * , * n e w * E r r o r * \( * [ A - Z a - z 0 - 9 ] + * \( * [ 0 - 9 a - f ] + * \) * \) * \) * } / ,
96+ / * \) * \) * \) * } /
97+ ] ]
98+ BrowserWindow . setTimeout = new Proxy ( BrowserWindow . setTimeout , {
99+ apply ( Target : typeof BrowserWindow . setTimeout , ThisArg : undefined , Args : Parameters < typeof setTimeout > ) {
100+ if ( ASTimerRegExps . filter ( ASTimerRegExp => ASTimerRegExp . filter ( Index => Index . test ( Args [ 0 ] . toString ( ) ) ) . length >= 3 ) . length === 1 ) {
101+ console . debug ( `[${ UserscriptName } ]: setTimeout:` , Args )
102+ return
103+ }
104+ return Reflect . apply ( Target , ThisArg , Args )
105+ }
106+ } )
107+ BrowserWindow . setInterval = new Proxy ( BrowserWindow . setInterval , {
108+ apply ( Target : typeof BrowserWindow . setInterval , ThisArg : undefined , Args : Parameters < typeof setInterval > ) {
109+ if ( ASTimerRegExps . filter ( ASTimerRegExp => ASTimerRegExp . filter ( Index => Index . test ( Args [ 0 ] . toString ( ) ) ) . length >= 3 ) . length === 1 ) {
110+ console . debug ( `[${ UserscriptName } ]: setInterval:` , Args )
111+ return
112+ }
113+ return Reflect . apply ( Target , ThisArg , Args )
114+ }
115+ } )
0 commit comments