From 4099c52266d302713bf5de0aceb8c1f8febf419a Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Thu, 7 Dec 2017 17:45:00 +0100 Subject: [PATCH] exposed private API for better testing on MPPickcharsParser. Parser now support default conversion to down arrow presses. Special format handling currently not supported --- MacPass.xcodeproj/project.pbxproj | 4 +- MacPass/MPPickcharsParser.m | 107 ++++++++++++++++++++++----- MacPass/MPPickcharsParser_Private.h | 19 +++++ MacPassTests/MPTestPickcharsParser.m | 20 +++++ 4 files changed, 130 insertions(+), 20 deletions(-) create mode 100644 MacPass/MPPickcharsParser_Private.h diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index 587b1073..7b9e44ff 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -326,6 +326,7 @@ 4C0728BB17B5B7F7005A7DD9 /* MPPasswordEditWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordEditWindowController.h; sourceTree = ""; }; 4C0728BC17B5B7F7005A7DD9 /* MPPasswordEditWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordEditWindowController.m; sourceTree = ""; }; 4C0728BE17B68ED0005A7DD9 /* SavePanelAccessoryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SavePanelAccessoryView.xib; sourceTree = ""; }; + 4C088C401FD9A42800F92502 /* MPPickcharsParser_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickcharsParser_Private.h; sourceTree = ""; }; 4C0949571FD6B89B004F2971 /* NSUserNotification+MPAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSUserNotification+MPAdditions.h"; sourceTree = ""; }; 4C0949581FD6B89B004F2971 /* NSUserNotification+MPAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSUserNotification+MPAdditions.m"; sourceTree = ""; }; 4C09495A1FD6E510004F2971 /* MPAddCustomFieldContextMenuDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAddCustomFieldContextMenuDelegate.h; sourceTree = ""; }; @@ -1135,7 +1136,6 @@ 4C45FB1E178E09ED0010007D /* MacPassTests */ = { isa = PBXGroup; children = ( - 4C8F0C721FCF1B7A00BE157F /* MPTestPickcharsParser.m */, 4CCFA12C1BF0CC7A0078E0A1 /* Databases */, 4C10207E1B750E2F00BFCD59 /* MPTestAutotype.m */, 4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */, @@ -1143,6 +1143,7 @@ 4C45FB2F178E0CE20010007D /* MPTestDocument.m */, 4C6BC65F1A36717E00BDDF3D /* MPDatabaseSearch.m */, 4C8030491E2FBAA300133E4C /* MPTestKeyMapper.m */, + 4C8F0C721FCF1B7A00BE157F /* MPTestPickcharsParser.m */, 4C45FB1F178E09ED0010007D /* Supporting Files */, ); path = MacPassTests; @@ -1418,6 +1419,7 @@ 4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */, 4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */, 4C8F0C6F1FCEF91400BE157F /* MPPickcharsParser.h */, + 4C088C401FD9A42800F92502 /* MPPickcharsParser_Private.h */, 4C8F0C701FCEF91400BE157F /* MPPickcharsParser.m */, ); name = Autotype; diff --git a/MacPass/MPPickcharsParser.m b/MacPass/MPPickcharsParser.m index 497e5631..a13feb3a 100644 --- a/MacPass/MPPickcharsParser.m +++ b/MacPass/MPPickcharsParser.m @@ -7,18 +7,49 @@ // #import "MPPickcharsParser.h" +#import "MPPickcharsParser_Private.h" + #import "NSString+MPComposedCharacterAdditions.h" + #import -@interface MPPickcharsParser () +typedef NS_ENUM(NSInteger, MPPickCharOffsetType) { + MPPickCharOffsetTypeNone, + MPPickCharOffsetTypeCharacter, + MPPickCharOffsetTypeNumber, +}; -@property NSUInteger pickCount; // count to pick -@property NSUInteger checkboxOffset; -@property BOOL convertToDownArrows; -@property BOOL hideCharacters; -@property (copy) NSString *checkboxFormat; +struct MPPickCharOffset { + MPPickCharOffsetType type; + NSUInteger offset; +}; +typedef struct MPPickCharOffset MPPickCharOffset; -@end +MPPickCharOffset MPMakePickCharCharacterOffset(NSUInteger offset) { + MPPickCharOffset offsetStruct = {MPPickCharOffsetTypeCharacter, offset}; + return offsetStruct; +} +MPPickCharOffset MPMakePickCharNumberOffset(NSUInteger offset) { + MPPickCharOffset offsetStruct = {MPPickCharOffsetTypeNumber, offset}; + return offsetStruct; +} + +MPPickCharOffset MPMakeInvalidPickCharOffset(void) { + MPPickCharOffset offset = {MPPickCharOffsetTypeNone,0}; + return offset; +} + +BOOL MPIsValidPickCharOffset(MPPickCharOffset offset) { + return (offset.type != MPPickCharOffsetTypeNone); +} + +NSInteger numberOffset(MPPickCharOffset offset) { + return (offset.type == MPPickCharOffsetTypeNumber ? offset.offset : 0); +} + +NSInteger characterOffset(MPPickCharOffset offset) { + return (offset.type == MPPickCharOffsetTypeCharacter ? offset.offset : 0); +} @implementation MPPickcharsParser @@ -43,15 +74,53 @@ if(!self.convertToDownArrows) { return string; } - for(NSString *character in string.composedCharacters) { - + NSMutableString *mutableString = [[NSMutableString alloc] init]; + BOOL isFirst = NO; + for(NSString *substring in string.composedCharacters) { + if(substring.length != 1) { + NSLog(@"Pickchars: Unsupported character %@ for conversion to down arrows, skipping!", substring); + continue; + } + MPPickCharOffset offset = MPMakeInvalidPickCharOffset(); + unichar character = [substring characterAtIndex:0]; + if(character >= '0' && character <= '9') { + offset = MPMakePickCharNumberOffset(character - '0'); + } + else if(character >= 'a' && character <= 'z') { + offset = MPMakePickCharCharacterOffset(character - 'a'); + } + else if(character >= 'A' && character <= 'Z') { + offset = MPMakePickCharCharacterOffset(character - 'A'); + } + [self _appendKeyCommandsForOffset:offset toString:mutableString]; } - return nil; + return [mutableString copy]; } +- (void)_appendKeyCommandsForOffset:(MPPickCharOffset)offset toString:(NSMutableString *)string { + if(!MPIsValidPickCharOffset(offset)) { + return; + } + NSUInteger actualOffset = self.checkboxOffset; + switch(offset.type) { + case MPPickCharOffsetTypeNumber: + actualOffset += offset.offset; + break; + case MPPickCharOffsetTypeCharacter: + actualOffset += offset.offset; + break; + case MPPickCharOffsetTypeNone: + default: + break; + } + /* todo respect format definition */ + while (actualOffset--) { + [string appendString:kKPKAutotypeDown]; + } +} /* {PICKCHAR:Field:Options} - + Options allow to convert picked character to be typed into drop-down-boxes. E.g. select digits or letters Options: @@ -62,11 +131,11 @@ Conv-Fmt= Format of the check-box - 0 - Numbers 0129456789 - 1 - NUmber 1234567890 - a - lowercase characters - A - uppercase characters - ? - skip combobox item + 0 - Numbers 0129456789 + 1 - NUmber 1234567890 + a - lowercase characters + A - uppercase characters + ? - skip combobox item -> combine for layout e.g. 0a or 0aA 0?aA */ @@ -99,9 +168,9 @@ } return NO; } - /* - FOUNDATION_EXPORT NSString *const kKPKPlaceholderPickCharsOptionConvertFormat; - */ + /* + FOUNDATION_EXPORT NSString *const kKPKPlaceholderPickCharsOptionConvertFormat; + */ if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionHide options:NSCaseInsensitiveSearch]) { if(NSOrderedSame == [option compare:@"false" options:NSCaseInsensitiveSearch]) { self.hideCharacters = NO; diff --git a/MacPass/MPPickcharsParser_Private.h b/MacPass/MPPickcharsParser_Private.h new file mode 100644 index 00000000..3b611b14 --- /dev/null +++ b/MacPass/MPPickcharsParser_Private.h @@ -0,0 +1,19 @@ +// +// MPPickcharsParser_Private.h +// MacPass +// +// Created by Michael Starke on 07.12.17. +// Copyright © 2017 HicknHack Software GmbH. All rights reserved. +// + +#import "MPPickcharsParser.h" + +@interface MPPickcharsParser () + +@property NSUInteger pickCount; // count to pick +@property NSUInteger checkboxOffset; +@property BOOL convertToDownArrows; +@property BOOL hideCharacters; +@property (copy) NSString *checkboxFormat; + +@end diff --git a/MacPassTests/MPTestPickcharsParser.m b/MacPassTests/MPTestPickcharsParser.m index cc251235..9e633801 100644 --- a/MacPassTests/MPTestPickcharsParser.m +++ b/MacPassTests/MPTestPickcharsParser.m @@ -7,7 +7,9 @@ // #import + #import "MPPickcharsParser.h" +#import "MPPickcharsParser_Private.h" @interface MPTestPickcharsParser : XCTestCase @@ -34,4 +36,22 @@ XCTAssertEqualObjects(@"0A", parser.checkboxFormat); } +- (void)testConvertToDownArrows { + MPPickcharsParser *parser = [[MPPickcharsParser alloc] init]; + parser.convertToDownArrows = YES; + NSString *result = [parser processPickedString:@"105"]; // 1 + 0 + 5 = 6 + XCTAssertEqualObjects(result, @"{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"); + result = [parser processPickedString:@"ccb"]; // 2 + 2 + 1 = 5 + XCTAssertEqualObjects(result, @"{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"); + result = [parser processPickedString:@"CCB"]; // 2 + 2 + 1 = 5 + XCTAssertEqualObjects(result, @"{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"); + parser.checkboxOffset = 2; + result = [parser processPickedString:@"105"]; // 1 + 0 + 5 + (3 * 2) = 6 + 6 = 12 + XCTAssertEqualObjects(result, @"{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"); + result = [parser processPickedString:@"ccb"]; // 2 + 2 + 1 + (2 * 2) = 5 + 6 = 12 + XCTAssertEqualObjects(result, @"{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"); +} + + + @end