@@ -3,7 +3,7 @@ import { ItemType, databaseSchema, Uuid, Item, ShareType, Share, ChangeType, Use
3
3
import { defaultPagination , paginateDbQuery , PaginatedResults , Pagination } from './utils/pagination' ;
4
4
import { isJoplinItemName , isJoplinResourceBlobPath , linkedResourceIds , serializeJoplinItem , unserializeJoplinItem } from '../utils/joplinUtils' ;
5
5
import { ModelType } from '@joplin/lib/BaseModel' ;
6
- import { ApiError , ErrorCode , ErrorForbidden , ErrorUnprocessableEntity } from '../utils/errors' ;
6
+ import { ApiError , ErrorCode , ErrorForbidden , ErrorPayloadTooLarge , ErrorUnprocessableEntity } from '../utils/errors' ;
7
7
import { Knex } from 'knex' ;
8
8
import { ChangePreviousItem } from './ChangeModel' ;
9
9
import { unique } from '../utils/array' ;
@@ -14,6 +14,7 @@ import { NewModelFactoryHandler } from './factory';
14
14
import loadStorageDriver from './items/storage/loadStorageDriver' ;
15
15
import { msleep } from '../utils/time' ;
16
16
import Logger from '@joplin/lib/Logger' ;
17
+ import prettyBytes = require( 'pretty-bytes' ) ;
17
18
18
19
const mimeUtils = require ( '@joplin/lib/mime-utils.js' ) . mime ;
19
20
@@ -182,7 +183,11 @@ export default class ItemModel extends BaseModel<Item> {
182
183
}
183
184
}
184
185
185
- private async storageDriverRead ( itemId : Uuid , context : Context ) {
186
+ private async storageDriverRead ( itemId : Uuid , itemSize : number , context : Context ) {
187
+ if ( itemSize > this . itemSizeHardLimit ) {
188
+ throw new ErrorPayloadTooLarge ( `Downloading items larger than ${ prettyBytes ( this . itemSizeHardLimit ) } is currently disabled` ) ;
189
+ }
190
+
186
191
const storageDriver = await this . storageDriver ( ) ;
187
192
const storageDriverFallback = await this . storageDriverFallback ( ) ;
188
193
@@ -203,13 +208,13 @@ export default class ItemModel extends BaseModel<Item> {
203
208
const rows : Item [ ] = await this
204
209
. db ( 'user_items' )
205
210
. leftJoin ( 'items' , 'items.id' , 'user_items.item_id' )
206
- . distinct ( this . selectFields ( options , null , 'items' ) )
211
+ . distinct ( this . selectFields ( options , null , 'items' , [ 'items.content_size' ] ) )
207
212
. whereIn ( 'user_items.user_id' , userIds )
208
213
. whereIn ( 'jop_id' , jopIds ) ;
209
214
210
215
if ( options . withContent ) {
211
216
for ( const row of rows ) {
212
- row . content = await this . storageDriverRead ( row . id , { models : this . models ( ) } ) ;
217
+ row . content = await this . storageDriverRead ( row . id , row . content_size , { models : this . models ( ) } ) ;
213
218
}
214
219
}
215
220
@@ -229,13 +234,13 @@ export default class ItemModel extends BaseModel<Item> {
229
234
const rows : Item [ ] = await this
230
235
. db ( 'user_items' )
231
236
. leftJoin ( 'items' , 'items.id' , 'user_items.item_id' )
232
- . distinct ( this . selectFields ( options , null , 'items' ) )
237
+ . distinct ( this . selectFields ( options , null , 'items' , [ 'items.content_size' ] ) )
233
238
. whereIn ( 'user_items.user_id' , userIds )
234
239
. whereIn ( 'name' , names ) ;
235
240
236
241
if ( options . withContent ) {
237
242
for ( const row of rows ) {
238
- row . content = await this . storageDriverRead ( row . id , { models : this . models ( ) } ) ;
243
+ row . content = await this . storageDriverRead ( row . id , row . content_size , { models : this . models ( ) } ) ;
239
244
}
240
245
}
241
246
@@ -248,15 +253,17 @@ export default class ItemModel extends BaseModel<Item> {
248
253
}
249
254
250
255
public async loadWithContent ( id : Uuid , options : ItemLoadOptions = { } ) : Promise < Item > {
251
- const content = await this . storageDriverRead ( id , { models : this . models ( ) } ) ;
256
+ const item : Item = await this
257
+ . db ( 'user_items' )
258
+ . leftJoin ( 'items' , 'items.id' , 'user_items.item_id' )
259
+ . select ( this . selectFields ( options , [ '*' ] , 'items' , [ 'items.content_size' ] ) )
260
+ . where ( 'items.id' , '=' , id )
261
+ . first ( ) ;
262
+
263
+ const content = await this . storageDriverRead ( id , item . content_size , { models : this . models ( ) } ) ;
252
264
253
265
return {
254
- ...await this
255
- . db ( 'user_items' )
256
- . leftJoin ( 'items' , 'items.id' , 'user_items.item_id' )
257
- . select ( this . selectFields ( options , [ '*' ] , 'items' ) )
258
- . where ( 'items.id' , '=' , id )
259
- . first ( ) ,
266
+ ...item ,
260
267
content,
261
268
} ;
262
269
}
0 commit comments