@@ -1857,8 +1857,9 @@ export class Stack {
1857
1857
$or : [ ] ,
1858
1858
}
1859
1859
1860
+ const sanitizedQueryBucket = this . sanitizeQueryBucket ( queryBucket ) ;
1860
1861
for ( let i = 0 , j = paths . length ; i < j ; i ++ ) {
1861
- this . fetchPathDetails ( entries , locale , paths [ i ] . split ( '.' ) , queryBucket , shelf , true , entries , 0 )
1862
+ this . fetchPathDetails ( entries , locale , paths [ i ] . split ( '.' ) , sanitizedQueryBucket , shelf , true , entries , 0 )
1862
1863
}
1863
1864
1864
1865
if ( shelf . length === 0 ) {
@@ -1869,7 +1870,7 @@ export class Stack {
1869
1870
content_type_uid : this . types . assets ,
1870
1871
locale,
1871
1872
} , this . collectionNames ) )
1872
- . find ( queryBucket )
1873
+ . find ( sanitizedQueryBucket ) // Use sanitized query here
1873
1874
. project ( {
1874
1875
_content_type_uid : 0 ,
1875
1876
_id : 0 ,
@@ -2017,14 +2018,12 @@ export class Stack {
2017
2018
2018
2019
private async bindLeftoverAssets ( queries : IQuery , locale : string , pointerList : IShelf [ ] ) {
2019
2020
// const contents = await readFile(getAssetsPath(locale) + '.json')
2020
- if ( ! this . sanitizeIQuery ( queries ) ) {
2021
- throw new Error ( 'Invalid queries provided' ) ;
2022
- }
2021
+ const queriesSanitize = this . sanitizeQueryBucket ( queries )
2023
2022
const filteredAssets = await this . db . collection ( getCollectionName ( {
2024
2023
content_type_uid : this . types . assets ,
2025
2024
locale,
2026
2025
} , this . collectionNames ) )
2027
- . find ( queries )
2026
+ . find ( queriesSanitize )
2028
2027
. project ( {
2029
2028
_content_type_uid : 0 ,
2030
2029
_id : 0 ,
@@ -2434,4 +2433,52 @@ export class Stack {
2434
2433
}
2435
2434
return true ;
2436
2435
}
2436
+
2437
+ private sanitizeQueryBucket ( queryBucket : any ) : any {
2438
+ // Validate basic structure
2439
+ if ( ! queryBucket || typeof queryBucket !== 'object' ) {
2440
+ return { $or : [ ] } ;
2441
+ }
2442
+
2443
+ // Create a new sanitized query object
2444
+ const sanitized = { $or : [ ] } ;
2445
+
2446
+ // Ensure $or is an array
2447
+ if ( ! Array . isArray ( queryBucket . $or ) ) {
2448
+ return sanitized ;
2449
+ }
2450
+
2451
+ // Process each item in the $or array
2452
+ for ( const item of queryBucket . $or ) {
2453
+ if ( ! item || typeof item !== 'object' ) {
2454
+ continue ;
2455
+ }
2456
+
2457
+ const safeItem : any = { } ;
2458
+
2459
+ // Only allow specific fields with proper type validation
2460
+ if ( typeof item . _content_type_uid === 'string' ) {
2461
+ safeItem . _content_type_uid = item . _content_type_uid ;
2462
+ }
2463
+
2464
+ if ( typeof item . uid === 'string' ) {
2465
+ safeItem . uid = item . uid ;
2466
+ }
2467
+
2468
+ if ( typeof item . locale === 'string' ) {
2469
+ safeItem . locale = item . locale ;
2470
+ }
2471
+
2472
+ if ( item . _version && typeof item . _version === 'object' &&
2473
+ typeof item . _version . $exists === 'boolean' ) {
2474
+ safeItem . _version = { $exists : item . _version . $exists } ;
2475
+ }
2476
+
2477
+ // Only add if required fields are present
2478
+ if ( safeItem . _content_type_uid && safeItem . uid ) {
2479
+ sanitized . $or . push ( safeItem ) ;
2480
+ }
2481
+ }
2482
+ return sanitized ;
2483
+ }
2437
2484
}
0 commit comments