Skip to content

Commit

Permalink
Check filesize limit before sending Image, Video or File
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicolas Buquet committed Jun 5, 2024
1 parent f16203a commit 90f1122
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 15 deletions.
7 changes: 7 additions & 0 deletions Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ typedef enum : NSUInteger

} MXKRoomDataSourceBubblesPagination;

// Check filesize before sending: make RoomDataSource errors public
typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
MXKRoomDataSourceErrorResendGeneric = 10001,
MXKRoomDataSourceErrorResendInvalidMessageType = 10002,
MXKRoomDataSourceErrorResendInvalidLocalFilePath = 10003,
MXKRoomDataSourceErrorCantSendFileToBig = 10004, // Check filesize before sending: file to big error
};

#pragma mark - Cells identifiers

Expand Down
93 changes: 88 additions & 5 deletions Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@

NSString * const MXKRoomDataSourceErrorDomain = @"kMXKRoomDataSourceErrorDomain";

typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
MXKRoomDataSourceErrorResendGeneric = 10001,
MXKRoomDataSourceErrorResendInvalidMessageType = 10002,
MXKRoomDataSourceErrorResendInvalidLocalFilePath = 10003,
};
// Check filesize before sending: make RoomDataSource errors public
//typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
// MXKRoomDataSourceErrorResendGeneric = 10001,
// MXKRoomDataSourceErrorResendInvalidMessageType = 10002,
// MXKRoomDataSourceErrorResendInvalidLocalFilePath = 10003,
//};


@interface MXKRoomDataSource ()
Expand Down Expand Up @@ -1923,6 +1924,67 @@ - (BOOL)canReplyToEventWithId:(NSString*)eventIdToReply
return [self.room canReplyToEvent:eventToReply];
}

// Check filesize before sending: check file size before sending
- (BOOL)_isFilesizeOkToBeSent:(NSUInteger)filesize
{
// Check maxUploadSize accepted by the home server before trying to upload.
NSUInteger maxUploadFileSize = self.mxSession.maxUploadSize;
if (filesize > maxUploadFileSize)
{
return NO;
}
else
{
return YES;
}
}

- (BOOL)isFilesizeOkToBeSentForData:(NSData *)fileData
{
return [self _isFilesizeOkToBeSent:fileData.length];
}

- (BOOL)isFilesizeOkToBeSentForLocalFileUrl:(NSURL *)localFileUrl
{
NSDictionary *fileAttributes = [NSFileManager.defaultManager attributesOfItemAtPath:localFileUrl.path error:nil];
if (fileAttributes)
{
return [self _isFilesizeOkToBeSent:fileAttributes.fileSize];
}
else
{
return NO;
}
}

- (BOOL)isFilesizeOkToBeSentForLocalAVAsset:(AVAsset *)asset
{
// Check if asset points to a local file
if( ![asset isKindOfClass:AVURLAsset.class] )
{
// If asset doesn't point to a local asset, we can't check size.
// Return YES to let the upload happens and get the result of the backend.
return YES;
}

AVURLAsset *urlAsset = (AVURLAsset *)asset;
NSNumber *assetFilesize;
NSError *error;

// Try to get asset filesize.
[urlAsset.URL getResourceValue:&assetFilesize forKey:NSURLFileSizeKey error:&error];

// If we can't check size,
if( error != NULL || assetFilesize == NULL )
{
// return YES to let the upload happens and get the result of the backend.
return YES;
}

return [self _isFilesizeOkToBeSent:assetFilesize.unsignedLongValue];
}


- (void)sendImage:(NSData *)imageData mimeType:(NSString *)mimetype success:(void (^)(NSString *))success failure:(void (^)(NSError *))failure
{
UIImage *image = [UIImage imageWithData:imageData];
Expand All @@ -1944,6 +2006,13 @@ - (void)sendImage:(NSData *)imageData mimeType:(NSString *)mimetype success:(voi

- (void)sendImageData:(NSData*)imageData withImageSize:(CGSize)imageSize mimeType:(NSString*)mimetype andThumbnail:(UIImage*)thumbnail success:(void (^)(NSString *eventId))success failure:(void (^)(NSError *error))failure
{
// Check filesize before sending: check fielsize before trying to send file
if( ![self isFilesizeOkToBeSentForData:imageData] )
{
failure([NSError errorWithDomain:MXKRoomDataSourceErrorDomain code:MXKRoomDataSourceErrorCantSendFileToBig userInfo:nil]);
return;
}

__block MXEvent *localEchoEvent = nil;

[_room sendImage:imageData withImageSize:imageSize mimeType:mimetype andThumbnail:thumbnail threadId:self.threadId localEcho:&localEchoEvent success:success failure:failure];
Expand All @@ -1964,6 +2033,13 @@ - (void)sendVideo:(NSURL *)videoLocalURL withThumbnail:(UIImage *)videoThumbnail

- (void)sendVideoAsset:(AVAsset *)videoAsset withThumbnail:(UIImage *)videoThumbnail success:(void (^)(NSString *))success failure:(void (^)(NSError *))failure
{
// Check filesize before sending: check fielsize before trying to send file
if( ![self isFilesizeOkToBeSentForLocalAVAsset:videoAsset] )
{
failure([NSError errorWithDomain:MXKRoomDataSourceErrorDomain code:MXKRoomDataSourceErrorCantSendFileToBig userInfo:nil]);
return;
}

__block MXEvent *localEchoEvent = nil;

[_room sendVideoAsset:videoAsset withThumbnail:videoThumbnail threadId:self.threadId localEcho:&localEchoEvent success:success failure:failure];
Expand Down Expand Up @@ -2013,6 +2089,13 @@ - (void)sendVoiceMessage:(NSURL *)audioFileLocalURL

- (void)sendFile:(NSURL *)fileLocalURL mimeType:(NSString*)mimeType success:(void (^)(NSString *))success failure:(void (^)(NSError *))failure
{
// Check filesize before sending: check fielsize before trying to send file
if( ![self isFilesizeOkToBeSentForLocalFileUrl:fileLocalURL] )
{
failure([NSError errorWithDomain:MXKRoomDataSourceErrorDomain code:MXKRoomDataSourceErrorCantSendFileToBig userInfo:nil]);
return;
}

__block MXEvent *localEchoEvent = nil;

[_room sendFile:fileLocalURL mimeType:mimeType threadId:self.threadId localEcho:&localEchoEvent success:success failure:failure];
Expand Down
28 changes: 18 additions & 10 deletions Riot/Modules/Room/RoomViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -7721,15 +7721,6 @@ - (void)documentPickerPresenter:(MXKDocumentPickerPresenter *)presenter didPickD
{
self.documentPickerPresenter = nil;

// Check maxUploadSize accepted by the home server before trying to upload.
NSUInteger maxUploadFileSize = self.roomDataSource.mxSession.maxUploadSize;
NSDictionary *fileAttributes = [NSFileManager.defaultManager attributesOfItemAtPath:url.path error:nil];
if (fileAttributes && fileAttributes.fileSize > maxUploadFileSize) {
[self showAlertWithTitle:[VectorL10n fileUploadErrorTooLargeTitle]
message:[VectorL10n fileUploadErrorTooLargeMessage:[NSByteCountFormatter stringFromByteCount:maxUploadFileSize countStyle:NSByteCountFormatterCountStyleFile]]];
return;
}

MXKUTI *fileUTI = [[MXKUTI alloc] initWithLocalFileURL:url];
NSString *mimeType = fileUTI.mimeType;

Expand All @@ -7756,6 +7747,17 @@ - (void)documentPickerPresenter:(MXKDocumentPickerPresenter *)presenter didPickD
}
}

// Check filesize before sending: if send file error is "File too big", display alert box to user
- (void)displayAlertIfErrorIsFileIsTooBig:(NSError *)error
{
if( error.code == MXKRoomDataSourceErrorCantSendFileToBig )
{
NSUInteger maxUploadFileSize = self.roomDataSource.mxSession.maxUploadSize;
[self showAlertWithTitle:[VectorL10n fileUploadErrorTooLargeTitle]
message:[VectorL10n fileUploadErrorTooLargeMessage:[NSByteCountFormatter stringFromByteCount:maxUploadFileSize countStyle:NSByteCountFormatterCountStyleFile]]];
}
}

- (void)sendImage:(NSData *)imageData mimeType:(NSString *)mimeType {
// Create before sending the message in case of a discussion (direct chat)
MXWeakify(self);
Expand All @@ -7767,7 +7769,9 @@ - (void)sendImage:(NSData *)imageData mimeType:(NSString *)mimeType {
[self.roomDataSource sendImage:imageData mimeType:mimeType success:nil failure:^(NSError *error) {
// Nothing to do. The image is marked as unsent in the room history by the datasource
MXLogDebug(@"[MXKRoomViewController] sendImage failed.");
}];
// Check filesize before sending: if error is "FileTooBig", display alert box.
[self displayAlertIfErrorIsFileIsTooBig:error];
}];
}
// Errors are handled at the request level. This should be improved in case of code rewriting.
}];
Expand All @@ -7784,6 +7788,8 @@ - (void)sendVideo:(NSURL * _Nonnull)url {
[(RoomDataSource*)self.roomDataSource sendVideo:url success:nil failure:^(NSError *error) {
// Nothing to do. The video is marked as unsent in the room history by the datasource
MXLogDebug(@"[MXKRoomViewController] sendVideo failed.");
// Check filesize before sending: if error is "FileTooBig", display alert box.
[self displayAlertIfErrorIsFileIsTooBig:error];
}];
}
// Errors are handled at the request level. This should be improved in case of code rewriting.
Expand All @@ -7801,6 +7807,8 @@ - (void)sendFile:(NSURL * _Nonnull)url mimeType:(NSString *)mimeType {
[self.roomDataSource sendFile:url mimeType:mimeType success:nil failure:^(NSError *error) {
// Nothing to do. The file is marked as unsent in the room history by the datasource
MXLogDebug(@"[MXKRoomViewController] sendFile failed.");
// Check filesize before sending: if error is "FileTooBig", display alert box.
[self displayAlertIfErrorIsFileIsTooBig:error];
}];
}
// Errors are handled at the request level. This should be improved in case of code rewriting.
Expand Down

0 comments on commit 90f1122

Please sign in to comment.