Skip to content

Commit

Permalink
Remove invalid XML characters before sending a message
Browse files Browse the repository at this point in the history
  • Loading branch information
lissine0 authored and tmolitor-stud-tu committed Jan 24, 2025
1 parent f35aa1a commit aa5aa76
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
1 change: 1 addition & 0 deletions Monal/Classes/HelperTools.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ void swizzle(Class c, SEL orig, SEL new);
+(NSNumber*) currentTimestampInSeconds;
+(NSNumber*) dateToNSNumberSeconds:(NSDate*) date;

+(NSString*) removeInvalidXMLCharactersFromString:(NSString*) inputString;
+(BOOL) constantTimeCompareAttackerString:(NSString* _Nonnull) str1 withKnownString:(NSString* _Nonnull) str2;

+(BOOL) isIP:(NSString*) host;
Expand Down
31 changes: 31 additions & 0 deletions Monal/Classes/HelperTools.m
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ -(void) swizzled_queueLogMessage:(DDLogMessage*) logMessage asynchronously:(BOOL
static NSObject* _suspensionHandling_lock = nil;
static BOOL _suspensionHandling_isSuspended = NO;
static NSMutableDictionary* _versionInfoCache;
static NSCharacterSet* _validXMLCharacters;
static MLStreamRedirect* _stdoutRedirector = nil;
static MLStreamRedirect* _stderrRedirector = nil;
static volatile void (*_oldExceptionHandler)(NSException*) = NULL;
Expand Down Expand Up @@ -458,6 +459,25 @@ +(void) initialize
u_int32_t i = arc4random();
_processID = [self hexadecimalString:[NSData dataWithBytes:&i length:sizeof(i)]];

//values taken from https://www.w3.org/TR/2008/REC-xml-20081126/#charsets
NSMutableCharacterSet* validXMLCharacters = [NSMutableCharacterSet characterSetWithCharactersInString:@"\t\n\r"]; // #x9, #xA, #xD
[validXMLCharacters formUnionWithCharacterSet:[NSCharacterSet characterSetWithRange:NSMakeRange(0x20, 0xD7FF - 0x20 + 1)]];
[validXMLCharacters formUnionWithCharacterSet:[NSCharacterSet characterSetWithRange:NSMakeRange(0xE000, 0xFFFD - 0xE000 + 1)]];
[validXMLCharacters formUnionWithCharacterSet:[NSCharacterSet characterSetWithRange:NSMakeRange(0x10000, 0x10FFFF - 0x10000 + 1)]];

NSMutableString* notRecommendedXMLCharacters = [NSMutableString new];
for (unichar i = 0x007F; i <= 0x0084; i++)
[notRecommendedXMLCharacters appendFormat:@"%C", i];

for (unichar i = 0x0086; i <= 0x009F; i++)
[notRecommendedXMLCharacters appendFormat:@"%C", i];

for (unichar i = 0xFDD0; i <= 0xFDEF; i++)
[notRecommendedXMLCharacters appendFormat:@"%C", i];

[validXMLCharacters removeCharactersInString:notRecommendedXMLCharacters];
_validXMLCharacters = [validXMLCharacters copy];

//shamelessly stolen from utils.ip in conversations source
IPV4 = [NSRegularExpression regularExpressionWithPattern:@"\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z" options:0 error:nil];
IPV6_HEX4DECCOMPRESSED = [NSRegularExpression regularExpressionWithPattern:@"\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z" options:0 error:nil];
Expand Down Expand Up @@ -3158,6 +3178,17 @@ +(NSArray*) splitString:(NSString*) string withSeparator:(NSString*) separator a
return result;
}

+(NSString*) removeInvalidXMLCharactersFromString:(NSString*) inputString
{
NSMutableString* result = [NSMutableString new];
for (NSUInteger i = 0; i < inputString.length; i++) {
unichar character = [inputString characterAtIndex:i];
if([_validXMLCharacters characterIsMember:character])
[result appendFormat:@"%C", character];
}
return [result copy];
}

//see https://nachtimwald.com/2017/04/02/constant-time-string-comparison-in-c/
+(BOOL) constantTimeCompareAttackerString:(NSString* _Nonnull) str1 withKnownString:(NSString* _Nonnull) str2
{
Expand Down
2 changes: 2 additions & 0 deletions Monal/Classes/chatViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -1138,6 +1138,8 @@ -(void) resignTextView

// Trim leading spaces
NSString* cleanString = [self.chatInput.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
cleanString = [HelperTools removeInvalidXMLCharactersFromString:cleanString];

// Only send msg that have at least one character
if(cleanString.length > 0)
{
Expand Down

0 comments on commit aa5aa76

Please sign in to comment.