From a51678921764b65eaac3065fe03fbacc4e203b4e Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Tue, 12 Dec 2017 15:35:35 +0100 Subject: [PATCH] fixed missing offsets for special format where only upper or lower case characters are used --- MacPass/MPPickcharsParser.m | 23 ++++++++++++++++++----- MacPassTests/MPTestPickcharsParser.m | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/MacPass/MPPickcharsParser.m b/MacPass/MPPickcharsParser.m index 82491b75..10390a04 100644 --- a/MacPass/MPPickcharsParser.m +++ b/MacPass/MPPickcharsParser.m @@ -172,9 +172,10 @@ typedef NSUInteger (^MPPickcharOffsetConverter)(NSInteger offset); if(optionPair.count != 2) { return NO; } - NSString *key = [optionPair.firstObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - NSString *option = [optionPair.lastObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSString *key = [optionPair.firstObject stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; + NSString *option = [optionPair.lastObject stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; + /* Character count option */ if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionCount options:NSCaseInsensitiveSearch] || NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionCountShort options:NSCaseInsensitiveSearch]) { NSScanner *scanner = [[NSScanner alloc] initWithString:option]; @@ -187,9 +188,7 @@ typedef NSUInteger (^MPPickcharOffsetConverter)(NSInteger offset); } return NO; } - /* - FOUNDATION_EXPORT NSString *const kKPKPlaceholderPickCharsOptionConvertFormat; - */ + /* Hide characters option */ if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionHide options:NSCaseInsensitiveSearch]) { if(NSOrderedSame == [option compare:@"false" options:NSCaseInsensitiveSearch]) { self.hideCharacters = NO; @@ -201,6 +200,7 @@ typedef NSUInteger (^MPPickcharOffsetConverter)(NSInteger offset); } return NO; } + /* Convert to down arrows option */ if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionConvert options:NSCaseInsensitiveSearch]) { if(NSOrderedSame == [option compare:@"D" options:NSCaseInsensitiveSearch]) { self.convertToDownArrows = YES; @@ -208,6 +208,7 @@ typedef NSUInteger (^MPPickcharOffsetConverter)(NSInteger offset); } return NO; } + /* Offset option for down arrow conversion */ if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionConvertOffset options:NSCaseInsensitiveSearch]) { NSScanner *scanner = [[NSScanner alloc] initWithString:option]; NSInteger offset; @@ -219,6 +220,7 @@ typedef NSUInteger (^MPPickcharOffsetConverter)(NSInteger offset); } return NO; } + /* Special checkbox format option */ if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionConvertFormat options:NSCaseInsensitiveSearch]) { if(option.length == 0) { /* interpret no optoins as default too*/ @@ -281,6 +283,17 @@ typedef NSUInteger (^MPPickcharOffsetConverter)(NSInteger offset); } index++; } + NSAssert(tmpOffsetMap.count > 0, @"Internal inconsistency. Offset format needs at least on valid format!"); + /* default behaviour is to be case insesitive, make sure we use the same converter for both cases if only one is specifier */ + MPPickcharOffsetConverter upperCaseConverter = tmpOffsetMap[@(MPPickCharOffsetTypeUpperCaseCharacter)]; + MPPickcharOffsetConverter lowerCaseConverter = tmpOffsetMap[@(MPPickCharOffsetTypeLowerCaseCharacter)]; + if(upperCaseConverter && !lowerCaseConverter) { + tmpOffsetMap[@(MPPickCharOffsetTypeLowerCaseCharacter)] = upperCaseConverter; + } + else if(!upperCaseConverter && lowerCaseConverter) { + tmpOffsetMap[@(MPPickCharOffsetTypeUpperCaseCharacter)] = lowerCaseConverter; + } + _offsetConverter = [tmpOffsetMap copy]; return YES; } diff --git a/MacPassTests/MPTestPickcharsParser.m b/MacPassTests/MPTestPickcharsParser.m index a75391a7..e3fe4cc7 100644 --- a/MacPassTests/MPTestPickcharsParser.m +++ b/MacPassTests/MPTestPickcharsParser.m @@ -30,7 +30,7 @@ - (void)testInvalidOptionsParser { - MPPickcharsParser *parser = [[MPPickcharsParser alloc] initWithOptions:@"Count=-10,Hide=whatever,Con=D,Conv-Offset=20,Conv-Fmt=0A"]; + MPPickcharsParser *parser = [[MPPickcharsParser alloc] initWithOptions:@"Count=-10,Hide=whatever,Con=D,Conv-Offset=20,Conv-Fmt=1A"]; XCTAssertEqual(0, parser.pickCount); // negative count will result in 0-count XCTAssertEqual(YES, parser.hideCharacters); // option invalid, default is YES XCTAssertEqual(NO, parser.convertToDownArrows); // option was invalid, default is NO