@@ -98,6 +98,7 @@ export default (params?: LocalStorageDataProviderParams): DataProvider => {
9898
9999 // update methods need to persist changes in localStorage
100100 update : < RecordType extends RaRecord = any > ( resource , params ) => {
101+ checkResource ( resource ) ;
101102 updateLocalStorage ( ( ) => {
102103 const index = data [ resource ] ?. findIndex (
103104 record => record . id == params . id
@@ -110,6 +111,7 @@ export default (params?: LocalStorageDataProviderParams): DataProvider => {
110111 return baseDataProvider . update < RecordType > ( resource , params ) ;
111112 } ,
112113 updateMany : ( resource , params ) => {
114+ checkResource ( resource ) ;
113115 updateLocalStorage ( ( ) => {
114116 params . ids . forEach ( id => {
115117 const index = data [ resource ] ?. findIndex (
@@ -127,6 +129,7 @@ export default (params?: LocalStorageDataProviderParams): DataProvider => {
127129 resource ,
128130 params
129131 ) => {
132+ checkResource ( resource ) ;
130133 // we need to call the fakerest provider first to get the generated id
131134 return baseDataProvider
132135 . create < RecordType > ( resource , params )
@@ -141,6 +144,7 @@ export default (params?: LocalStorageDataProviderParams): DataProvider => {
141144 } ) ;
142145 } ,
143146 delete : < RecordType extends RaRecord = any > ( resource , params ) => {
147+ checkResource ( resource ) ;
144148 updateLocalStorage ( ( ) => {
145149 const index = data [ resource ] ?. findIndex (
146150 record => record . id == params . id
@@ -150,6 +154,7 @@ export default (params?: LocalStorageDataProviderParams): DataProvider => {
150154 return baseDataProvider . delete < RecordType > ( resource , params ) ;
151155 } ,
152156 deleteMany : ( resource , params ) => {
157+ checkResource ( resource ) ;
153158 updateLocalStorage ( ( ) => {
154159 const indexes = params . ids . map ( id =>
155160 data [ resource ] ?. findIndex ( record => record . id == id )
@@ -161,6 +166,13 @@ export default (params?: LocalStorageDataProviderParams): DataProvider => {
161166 } ;
162167} ;
163168
169+ const checkResource = resource => {
170+ if ( [ '__proto__' , 'constructor' , 'prototype' ] . includes ( resource ) ) {
171+ // protection against prototype pollution
172+ throw new Error ( `Invalid resource key: ${ resource } ` ) ;
173+ }
174+ } ;
175+
164176export interface LocalStorageDataProviderParams {
165177 defaultData ?: any ;
166178 localStorageKey ?: string ;
0 commit comments