mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-13 22:52:26 +00:00
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:
@@ -326,6 +326,7 @@
|
|||||||
4C0728BB17B5B7F7005A7DD9 /* MPPasswordEditWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordEditWindowController.h; sourceTree = "<group>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
4C09495A1FD6E510004F2971 /* MPAddCustomFieldContextMenuDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAddCustomFieldContextMenuDelegate.h; sourceTree = "<group>"; };
|
||||||
@@ -1135,7 +1136,6 @@
|
|||||||
4C45FB1E178E09ED0010007D /* MacPassTests */ = {
|
4C45FB1E178E09ED0010007D /* MacPassTests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
4C8F0C721FCF1B7A00BE157F /* MPTestPickcharsParser.m */,
|
|
||||||
4CCFA12C1BF0CC7A0078E0A1 /* Databases */,
|
4CCFA12C1BF0CC7A0078E0A1 /* Databases */,
|
||||||
4C10207E1B750E2F00BFCD59 /* MPTestAutotype.m */,
|
4C10207E1B750E2F00BFCD59 /* MPTestAutotype.m */,
|
||||||
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */,
|
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */,
|
||||||
@@ -1143,6 +1143,7 @@
|
|||||||
4C45FB2F178E0CE20010007D /* MPTestDocument.m */,
|
4C45FB2F178E0CE20010007D /* MPTestDocument.m */,
|
||||||
4C6BC65F1A36717E00BDDF3D /* MPDatabaseSearch.m */,
|
4C6BC65F1A36717E00BDDF3D /* MPDatabaseSearch.m */,
|
||||||
4C8030491E2FBAA300133E4C /* MPTestKeyMapper.m */,
|
4C8030491E2FBAA300133E4C /* MPTestKeyMapper.m */,
|
||||||
|
4C8F0C721FCF1B7A00BE157F /* MPTestPickcharsParser.m */,
|
||||||
4C45FB1F178E09ED0010007D /* Supporting Files */,
|
4C45FB1F178E09ED0010007D /* Supporting Files */,
|
||||||
);
|
);
|
||||||
path = MacPassTests;
|
path = MacPassTests;
|
||||||
@@ -1418,6 +1419,7 @@
|
|||||||
4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */,
|
4C1F7FA01E3A12E600D6A40E /* MPModifiedKey.h */,
|
||||||
4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */,
|
4C1F7FA11E3A12E600D6A40E /* MPModifiedKey.m */,
|
||||||
4C8F0C6F1FCEF91400BE157F /* MPPickcharsParser.h */,
|
4C8F0C6F1FCEF91400BE157F /* MPPickcharsParser.h */,
|
||||||
|
4C088C401FD9A42800F92502 /* MPPickcharsParser_Private.h */,
|
||||||
4C8F0C701FCEF91400BE157F /* MPPickcharsParser.m */,
|
4C8F0C701FCEF91400BE157F /* MPPickcharsParser.m */,
|
||||||
);
|
);
|
||||||
name = Autotype;
|
name = Autotype;
|
||||||
|
|||||||
@@ -7,18 +7,49 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "MPPickcharsParser.h"
|
#import "MPPickcharsParser.h"
|
||||||
|
#import "MPPickcharsParser_Private.h"
|
||||||
|
|
||||||
#import "NSString+MPComposedCharacterAdditions.h"
|
#import "NSString+MPComposedCharacterAdditions.h"
|
||||||
|
|
||||||
#import <KeePassKit/KeePassKit.h>
|
#import <KeePassKit/KeePassKit.h>
|
||||||
|
|
||||||
@interface MPPickcharsParser ()
|
typedef NS_ENUM(NSInteger, MPPickCharOffsetType) {
|
||||||
|
MPPickCharOffsetTypeNone,
|
||||||
|
MPPickCharOffsetTypeCharacter,
|
||||||
|
MPPickCharOffsetTypeNumber,
|
||||||
|
};
|
||||||
|
|
||||||
@property NSUInteger pickCount; // count to pick
|
struct MPPickCharOffset {
|
||||||
@property NSUInteger checkboxOffset;
|
MPPickCharOffsetType type;
|
||||||
@property BOOL convertToDownArrows;
|
NSUInteger offset;
|
||||||
@property BOOL hideCharacters;
|
};
|
||||||
@property (copy) NSString *checkboxFormat;
|
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
|
@implementation MPPickcharsParser
|
||||||
|
|
||||||
@@ -43,15 +74,53 @@
|
|||||||
if(!self.convertToDownArrows) {
|
if(!self.convertToDownArrows) {
|
||||||
return string;
|
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}
|
{PICKCHAR:Field:Options}
|
||||||
|
|
||||||
Options allow to convert picked character to be typed into drop-down-boxes.
|
Options allow to convert picked character to be typed into drop-down-boxes.
|
||||||
E.g. select digits or letters
|
E.g. select digits or letters
|
||||||
Options:
|
Options:
|
||||||
@@ -62,11 +131,11 @@
|
|||||||
|
|
||||||
Conv-Fmt= Format of the check-box
|
Conv-Fmt= Format of the check-box
|
||||||
|
|
||||||
0 - Numbers 0129456789
|
0 - Numbers 0129456789
|
||||||
1 - NUmber 1234567890
|
1 - NUmber 1234567890
|
||||||
a - lowercase characters
|
a - lowercase characters
|
||||||
A - uppercase characters
|
A - uppercase characters
|
||||||
? - skip combobox item
|
? - skip combobox item
|
||||||
|
|
||||||
-> combine for layout e.g. 0a or 0aA 0?aA
|
-> combine for layout e.g. 0a or 0aA 0?aA
|
||||||
*/
|
*/
|
||||||
@@ -99,9 +168,9 @@
|
|||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
FOUNDATION_EXPORT NSString *const kKPKPlaceholderPickCharsOptionConvertFormat;
|
FOUNDATION_EXPORT NSString *const kKPKPlaceholderPickCharsOptionConvertFormat;
|
||||||
*/
|
*/
|
||||||
if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionHide options:NSCaseInsensitiveSearch]) {
|
if(NSOrderedSame == [key compare:kKPKPlaceholderPickCharsOptionHide options:NSCaseInsensitiveSearch]) {
|
||||||
if(NSOrderedSame == [option compare:@"false" options:NSCaseInsensitiveSearch]) {
|
if(NSOrderedSame == [option compare:@"false" options:NSCaseInsensitiveSearch]) {
|
||||||
self.hideCharacters = NO;
|
self.hideCharacters = NO;
|
||||||
|
|||||||
19
MacPass/MPPickcharsParser_Private.h
Normal file
19
MacPass/MPPickcharsParser_Private.h
Normal 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
|
||||||
@@ -7,7 +7,9 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import <XCTest/XCTest.h>
|
#import <XCTest/XCTest.h>
|
||||||
|
|
||||||
#import "MPPickcharsParser.h"
|
#import "MPPickcharsParser.h"
|
||||||
|
#import "MPPickcharsParser_Private.h"
|
||||||
|
|
||||||
@interface MPTestPickcharsParser : XCTestCase
|
@interface MPTestPickcharsParser : XCTestCase
|
||||||
|
|
||||||
@@ -34,4 +36,22 @@
|
|||||||
XCTAssertEqualObjects(@"0A", parser.checkboxFormat);
|
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
|
@end
|
||||||
|
|||||||
Reference in New Issue
Block a user