@@ -79,8 +79,13 @@ -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataT
7979 [outputHandle writeData: data];
8080}
8181
82- -(void )URLSession : (NSURLSession *)session dataTask : (NSURLSessionDataTask *)dataTask didReceiveResponse : (NSURLResponse *)aResponse completionHandler : (void (^)(NSURLSessionResponseDisposition ))completionHandler {
82+ - (void )URLSession : (NSURLSession *)session dataTask : (NSURLSessionDataTask *)dataTask didReceiveResponse : (NSURLResponse *)aResponse completionHandler : (void (^)(NSURLSessionResponseDisposition ))completionHandler {
8383 response = aResponse;
84+ long long expectedLength = response.expectedContentLength ;
85+ if (expectedLength > MAX_NOTIFICATION_MEDIA_SIZE_BYTES) { // Enforcing 50 mb limit on media before downloading
86+ completionHandler (NSURLSessionResponseCancel );
87+ return ;
88+ }
8489 completionHandler (NSURLSessionResponseAllow );
8590}
8691
@@ -777,29 +782,14 @@ + (void)addNotificationRequest:(OSNotificationPayload*)payload
777782/*
778783 Synchroneously downloads an attachment
779784 On success returns bundle resource name, otherwise returns nil
780- The preference order for file type determination is as follows:
781- 1. File extension in the actual URL
782- 2. MIME type
783- 3. URL Query parameter called 'filename', such as test.jpg. The SDK will extract the file extension from it
784785*/
785- + (NSString *)downloadMediaAndSaveInBundle : (NSString *)urlString {
786+ + (NSString *)downloadMediaAndSaveInBundle : (NSString *)urlString {
786787
787788 let url = [NSURL URLWithString: urlString];
788-
789- NSString * extension = url.pathExtension ;
790-
791- if ([extension isEqualToString: @" " ])
792- extension = nil ;
793-
794- // Unrecognized extention
795- if (extension != nil && ![ONESIGNAL_SUPPORTED_ATTACHMENT_TYPES containsObject: extension])
796- return nil ;
797-
789+
790+ // Download the file
798791 var name = [self randomStringWithLength: 10 ];
799-
800- if (extension)
801- name = [name stringByAppendingString: [NSString stringWithFormat: @" .%@ " , extension]];
802-
792+
803793 NSArray * paths = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES );
804794 NSString * filePath = [paths[0 ] stringByAppendingPathComponent: name];
805795
@@ -813,33 +803,24 @@ + (NSString*)downloadMediaAndSaveInBundle:(NSString*)urlString {
813803 [OneSignal onesignal_Log: ONE_S_LL_ERROR message: [NSString stringWithFormat: @" Encountered an error while attempting to download file with URL: %@ " , error]];
814804 return nil ;
815805 }
806+
807+ NSString *extension = [OneSignalHelper getSupportedFileExtensionFromURL: url mimeType: mimeType];
808+ if (!extension || [extension isEqualToString: @" " ])
809+ return nil ;
816810
817- if (!extension) {
818- NSString *newExtension;
819-
820- if (mimeType != nil && ![mimeType isEqualToString: @" " ]) {
821- newExtension = mimeType.fileExtensionForMimeType ;
822- } else {
823- newExtension = [[[NSURL URLWithString: urlString] valueFromQueryParameter: @" filename" ] supportedFileExtension ];
824- }
825-
826- if (!newExtension || ![ONESIGNAL_SUPPORTED_ATTACHMENT_TYPES containsObject: newExtension])
827- return nil ;
828-
829- name = [NSString stringWithFormat: @" %@ .%@ " , name, newExtension];
830-
831- let newPath = [paths[0 ] stringByAppendingPathComponent: [NSString stringWithFormat: @" %@ " , name]];
832-
833- [[NSFileManager defaultManager ] moveItemAtPath: filePath toPath: newPath error: &error];
834- }
811+ name = [NSString stringWithFormat: @" %@ .%@ " , name, extension];
812+
813+ let newPath = [paths[0 ] stringByAppendingPathComponent: [NSString stringWithFormat: @" %@ " , name]];
814+
815+ [[NSFileManager defaultManager ] moveItemAtPath: filePath toPath: newPath error: &error];
835816
836817 if (error) {
837818 [OneSignal onesignal_Log: ONE_S_LL_ERROR message: [NSString stringWithFormat: @" Encountered an error while attempting to download file with URL: %@ " , error]];
838819 return nil ;
839820 }
840-
821+
841822 let standardUserDefaults = OneSignalUserDefaults.initStandard ;
842-
823+
843824 NSArray * cachedFiles = [standardUserDefaults getSavedObjectForKey: OSUD_TEMP_CACHED_NOTIFICATION_MEDIA defaultValue: nil ];
844825 NSMutableArray * appendedCache;
845826 if (cachedFiles) {
@@ -848,15 +829,49 @@ + (NSString*)downloadMediaAndSaveInBundle:(NSString*)urlString {
848829 }
849830 else
850831 appendedCache = [[NSMutableArray alloc ] initWithObjects: name, nil ];
851-
832+
852833 [standardUserDefaults saveObjectForKey: OSUD_TEMP_CACHED_NOTIFICATION_MEDIA withValue: appendedCache];
853834 return name;
854835 } @catch (NSException *exception) {
855836 [OneSignal onesignal_Log: ONE_S_LL_ERROR message: [NSString stringWithFormat: @" OneSignal encountered an exception while downloading file (%@ ), exception: %@ " , url, exception.description]];
856837
857838 return nil ;
858839 }
840+ }
841+
859842
843+ /*
844+ The preference order for file type determination is as follows:
845+ 1. URL Query parameter called 'filename', such as test.jpg. The SDK will extract the file extension from it
846+ 2. MIME type
847+ 3. File extension in the actual URL
848+ 4. A file extension extracted by searching through all URL Query parameters
849+ */
850+ + (NSString *)getSupportedFileExtensionFromURL : (NSURL *)url mimeType : (NSString *)mimeType {
851+ // Try to get extension from the filename parameter
852+ NSString * extension = [[url valueFromQueryParameter: @" filename" ]
853+ supportedFileExtension ];
854+ if (extension && [ONESIGNAL_SUPPORTED_ATTACHMENT_TYPES containsObject: extension]) {
855+ return extension;
856+ }
857+ // Use the MIME type for the extension
858+ if (mimeType != nil && ![mimeType isEqualToString: @" " ]) {
859+ extension = mimeType.fileExtensionForMimeType ;
860+ if (extension && [ONESIGNAL_SUPPORTED_ATTACHMENT_TYPES containsObject: extension]) {
861+ return extension;
862+ }
863+ }
864+ // Try using url.pathExtension
865+ extension = url.pathExtension ;
866+ if (extension && [ONESIGNAL_SUPPORTED_ATTACHMENT_TYPES containsObject: extension]) {
867+ return extension;
868+ }
869+ // Try getting an extension from the query
870+ extension = url.supportedFileExtensionFromQueryItems ;
871+ if (extension && [ONESIGNAL_SUPPORTED_ATTACHMENT_TYPES containsObject: extension]) {
872+ return extension;
873+ }
874+ return nil ;
860875}
861876
862877// TODO: Add back after testing
0 commit comments