diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 2d07ab4819..141bee387c 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -65,6 +65,7 @@ #import #import #import +#import #import @@ -651,6 +652,12 @@ - (NSException *) save error = nil; message = [self mimeMessageAsData]; + if (!message) + { + error = [NSException exceptionWithHTTPStatus: 500 /* Server Error */ + reason: @"message too big"]; + } + client = [[self imap4Connection] client]; if (![imap4 doesMailboxExistAtURL: [container imap4URL]]) @@ -1440,18 +1447,27 @@ - (NGMimeBodyPart *) bodyPartForAttachmentWithName: (NSString *) _name } // -// +// returns nil on error // - (NSArray *) bodyPartsForAllAttachments { - /* returns nil on error */ - NSArray *attrs; - unsigned i, count; NGMimeBodyPart *bodyPart; NSMutableArray *bodyParts; + NSArray *attrs; + unsigned i, count, size, limit; attrs = [self fetchAttachmentAttrs]; count = [attrs count]; + size = 0; + + // We first check if we don't go over our message size limit + limit = [[SOGoSystemDefaults sharedSystemDefaults] maximumMessageSizeLimit] * 1024; + for (i = 0; i < count; i++) + size += [[[attrs objectAtIndex: i] objectForKey: @"size"] intValue]; + + if (limit && size > limit) + return nil; + bodyParts = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) @@ -1509,13 +1525,9 @@ - (NGMimeMessage *) mimeMultiPartMessageWithHeaderMap: (NGMutableHashMap *) map mBody = [[NGMimeMultipartBody alloc] initWithPart: message]; if (!isHTML) - { - part = [self bodyPartForText]; - } + part = [self bodyPartForText]; else - { - part = [self mimeMultipartAlternative]; - } + part = [self mimeMultipartAlternative]; [mBody addBodyPart: part]; @@ -1717,8 +1729,10 @@ - (NGMimeMessage *) mimeMessageWithHeaders: (NSDictionary *) _headers { NSMutableArray *bodyParts; NGMimeMessage *message; + NSArray *allBodyParts; NGMutableHashMap *map; NSString *newText; + BOOL has_inline_images; message = nil; @@ -1740,8 +1754,12 @@ - (NGMimeMessage *) mimeMessageWithHeaders: (NSDictionary *) _headers if (map) { //[self debugWithFormat: @"MIME Envelope: %@", map]; - - [bodyParts addObjectsFromArray: [self bodyPartsForAllAttachments]]; + allBodyParts = [self bodyPartsForAllAttachments]; + + if (!allBodyParts) + return nil; + + [bodyParts addObjectsFromArray: allBodyParts]; //[self debugWithFormat: @"attachments: %@", bodyParts]; @@ -1782,10 +1800,19 @@ - (NGMimeMessage *) mimeMessage - (NSData *) mimeMessageAsData { NGMimeMessageGenerator *generator; + NGMimeMessage *mimeMessage; NSData *message; generator = [NGMimeMessageGenerator new]; - message = [generator generateMimeFromPart: [self mimeMessageWithHeaders: nil excluding: nil extractingImages: NO]]; + mimeMessage = [self mimeMessageWithHeaders: nil excluding: nil extractingImages: NO]; + + if (!mimeMessage) + { + [generator release]; + return nil; + } + + message = [generator generateMimeFromPart: mimeMessage]; [generator release]; return message; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.h b/SoObjects/SOGo/SOGoSystemDefaults.h index 98f141438a..d6a2f7f223 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.h +++ b/SoObjects/SOGo/SOGoSystemDefaults.h @@ -92,6 +92,8 @@ - (int) maximumFailedLoginInterval; - (int) failedLoginBlockInterval; +- (int) maximumMessageSizeLimit; + - (int) maximumMessageSubmissionCount; - (int) maximumRecipientCount; - (int) maximumSubmissionInterval; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index 527f4d8e89..5fee77b54f 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -565,6 +565,14 @@ - (int) failedLoginBlockInterval return v; } +// +// +// +- (int) maximumMessageSizeLimit +{ + return [self integerForKey: @"SOGoMaximumMessageSizeLimit"]; +} + // // //