diff --git a/AppController.m b/AppController.m index f819cca..dcb81b0 100755 --- a/AppController.m +++ b/AppController.m @@ -55,6 +55,16 @@ @"store", [NSNumber numberWithBool:YES], @"skipPasswordFields", + [NSNumber numberWithBool:YES], + @"skipPboardTypes", + @"PasswordPboardType", + @"skipPboardTypesList", + [NSNumber numberWithBool:NO], + @"skipPasswordLengths", + @"12, 20, 32", + @"skipPasswordLengthsList", + [NSNumber numberWithBool:NO], + @"revealPasteboardTypes", [NSNumber numberWithBool:NO], @"removeDuplicates", [NSNumber numberWithBool:YES], @@ -427,6 +437,73 @@ CFRelease(sourceRef); } +-(BOOL)shouldSkip:(NSString *)contents +{ + NSString *type = [jcPasteboard availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]]; + + // Check to see if we are skipping passwords based on length and characters. + if ( [[DBUserDefaults standardUserDefaults] boolForKey:@"skipPasswordFields"] ) + { + // Check to see if they want a little help figuring out what types to enter. + if ( [[DBUserDefaults standardUserDefaults] boolForKey:@"revealPasteboardTypes"] ) + [clippingStore addClipping:type ofType:type]; + + __block bool skipClipping = NO; + + // Check the array of types to skip. + if ( [[DBUserDefaults standardUserDefaults] boolForKey:@"skipPboardTypes"] ) + { + NSArray *typesArray = [[[[DBUserDefaults standardUserDefaults] stringForKey:@"skipPboardTypesList"] stringByReplacingOccurrencesOfString:@" " withString:@""] componentsSeparatedByString: @","]; + [typesArray enumerateObjectsUsingBlock:^(id typeString, NSUInteger idx, BOOL *stop) + { + if ( [type isEqualToString:typeString] ) + { + skipClipping = YES; + stop = YES; + } + }]; + } + if (skipClipping) + return YES; + + // Check the array of lengths to skip for suspicious strings. + if ( [[DBUserDefaults standardUserDefaults] boolForKey:@"skipPasswordLengths"] ) + { + int contentsLength = [contents length]; + NSArray *lengthsArray = [[[[DBUserDefaults standardUserDefaults] stringForKey:@"skipPasswordLengthsList"] stringByReplacingOccurrencesOfString:@" " withString:@""] componentsSeparatedByString: @","]; + [lengthsArray enumerateObjectsUsingBlock:^(id lengthString, NSUInteger idx, BOOL *stop) + { + if ( [lengthString integerValue] == contentsLength ) + { + NSRange uppercaseLetter = [contents rangeOfCharacterFromSet: [NSCharacterSet uppercaseLetterCharacterSet]]; + NSRange lowercaseLetter = [contents rangeOfCharacterFromSet: [NSCharacterSet lowercaseLetterCharacterSet]]; + NSRange decimalDigit = [contents rangeOfCharacterFromSet: [NSCharacterSet decimalDigitCharacterSet]]; + NSRange punctuation = [contents rangeOfCharacterFromSet: [NSCharacterSet punctuationCharacterSet]]; + NSRange symbol = [contents rangeOfCharacterFromSet: [NSCharacterSet symbolCharacterSet]]; + NSRange control = [contents rangeOfCharacterFromSet: [NSCharacterSet controlCharacterSet]]; + NSRange illegal = [contents rangeOfCharacterFromSet: [NSCharacterSet illegalCharacterSet]]; + NSRange whitespaceAndNewline = [contents rangeOfCharacterFromSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if ( NSNotFound == control.location + && NSNotFound == illegal.location + && NSNotFound == whitespaceAndNewline.location + && NSNotFound != uppercaseLetter.location + && NSNotFound != lowercaseLetter.location + && NSNotFound != decimalDigit.location + && ( NSNotFound != punctuation.location + || NSNotFound != symbol.location ) ) + { + skipClipping = YES; + stop = YES; + } + } + }]; + + if (skipClipping) + return YES; + } + } + return NO; +} -(void)pollPB:(NSTimer *)timer { @@ -458,8 +535,8 @@ if (largeCopyRisk) [self toggleMenuIconDisabled]; - if ( contents == nil || ([jcPasteboard stringForType:@"PasswordPboardType"] && [[DBUserDefaults standardUserDefaults] boolForKey:@"skipPasswordFields"]) ) { - NSLog(@"Contents: Empty"); + if ( contents == nil || [self shouldSkip:contents] ) { + NSLog(@"Contents: Empty or skipped"); } else { if (( [clippingStore jcListCount] == 0 || ! [contents isEqualToString:[clippingStore clippingContentsAtPosition:0]]) && ! [pbCount isEqualTo:pbBlockCount] ) { diff --git a/English.lproj/MainMenu.nib/designable.nib b/English.lproj/MainMenu.nib/designable.nib index f4308b1..81b716e 100644 --- a/English.lproj/MainMenu.nib/designable.nib +++ b/English.lproj/MainMenu.nib/designable.nib @@ -80,14 +80,14 @@ - + - + - + @@ -116,7 +116,7 @@ - + @@ -172,7 +172,7 @@ - + @@ -183,7 +183,7 @@ - + @@ -194,7 +194,7 @@ - + @@ -203,7 +203,7 @@ - + @@ -222,7 +222,7 @@ - + @@ -241,7 +241,7 @@ - + @@ -250,7 +250,7 @@ - + @@ -260,7 +260,7 @@ - + @@ -302,7 +302,7 @@ - + @@ -321,7 +321,7 @@ - + @@ -329,6 +329,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 0c420fa..cf0c7e9 100644 Binary files a/English.lproj/MainMenu.nib/keyedobjects.nib and b/English.lproj/MainMenu.nib/keyedobjects.nib differ