exposed private API for better testing on MPPickcharsParser.

Parser now support default conversion to down arrow presses.
Special format handling currently not supported
This commit is contained in:
Michael Starke
2017-12-07 17:45:00 +01:00
parent 91508f0dde
commit 4099c52266
4 changed files with 130 additions and 20 deletions

View File

@@ -326,6 +326,7 @@
4C0728BB17B5B7F7005A7DD9 /* MPPasswordEditWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordEditWindowController.h; sourceTree = "<group>"; };
4C0728BC17B5B7F7005A7DD9 /* MPPasswordEditWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordEditWindowController.m; sourceTree = "<group>"; };
4C0728BE17B68ED0005A7DD9 /* SavePanelAccessoryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SavePanelAccessoryView.xib; sourceTree = "<group>"; };
4C088C401FD9A42800F92502 /* MPPickcharsParser_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickcharsParser_Private.h; sourceTree = "<group>"; };
4C0949571FD6B89B004F2971 /* NSUserNotification+MPAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSUserNotification+MPAdditions.h"; sourceTree = "<group>"; };
4C0949581FD6B89B004F2971 /* NSUserNotification+MPAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSUserNotification+MPAdditions.m"; sourceTree = "<group>"; };
4C09495A1FD6E510004F2971 /* MPAddCustomFieldContextMenuDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAddCustomFieldContextMenuDelegate.h; sourceTree = "<group>"; };
@@ -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;

View File

@@ -7,18 +7,49 @@
//
#import "MPPickcharsParser.h"
#import "MPPickcharsParser_Private.h"
#import "NSString+MPComposedCharacterAdditions.h"
#import <KeePassKit/KeePassKit.h>
@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;

View File

@@ -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

View File

@@ -7,7 +7,9 @@
//
#import <XCTest/XCTest.h>
#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