// // MBIMUploadAttachmentOperation.m // kordophoned // // Created by James Magahern on 1/16/19. // Copyright © 2019 James Magahern. All rights reserved. // #import "MBIMUploadAttachmentOperation.h" #import "MBIMDataResponse.h" #import "IMCore_ClassDump.h" @implementation MBIMUploadAttachmentOperation + (void)load { [super load]; } + (NSString *)endpointName { return @"uploadAttachment"; } - (void)main { NSObject *response = nil; do { NSString *filename = [self valueForQueryItemWithName:@"filename"]; if ([filename length] == 0) { MBIMLogInfo(@"No filename provided"); response = [[HTTPErrorResponse alloc] initWithErrorCode:500]; break; } NSData *attachmentData = self.requestBodyData; if ([attachmentData length] == 0) { MBIMLogInfo(@"No attachment data in request"); response = [[HTTPErrorResponse alloc] initWithErrorCode:500]; break; } // Sanitize filename NSCharacterSet *dotCharacter = [NSCharacterSet characterSetWithCharactersInString:@"."]; NSCharacterSet *illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"]; NSString *sanitizedFilename = [[[filename componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@"-"] stringByTrimmingCharactersInSet:dotCharacter]; NSString *localPath = [NSTemporaryDirectory() stringByAppendingPathComponent:sanitizedFilename]; NSURL *localURL = [NSURL fileURLWithPath:localPath]; BOOL success = [attachmentData writeToURL:localURL atomically:NO]; if (!success) { MBIMLogInfo(@"Error writing attachment to temporary directory"); response = [[HTTPErrorResponse alloc] initWithErrorCode:500]; break; } NSString *guid = [[IMFileTransferCenter sharedInstance] guidForNewOutgoingTransferWithLocalURL:localURL]; if (!guid) { MBIMLogInfo(@"There was some problem shuttling the file to IMCore"); response = [[HTTPErrorResponse alloc] initWithErrorCode:500]; break; } NSDictionary *responseDict = @{ @"fileTransferGUID" : guid }; response = [MBIMJSONDataResponse responseWithJSONObject:responseDict]; } while (0); self.serverCompletionBlock(response); } @end