mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-14 15:12:21 +00:00
Added checkbox to toggle between global and entry based defaults for password generator
This commit is contained in:
@@ -23,17 +23,18 @@
|
||||
<outlet property="shouldCopyPasswordToPasteboardButton" destination="500" id="n2M-pB-2ol"/>
|
||||
<outlet property="symbolsButton" destination="464" id="596"/>
|
||||
<outlet property="upperCaseButton" destination="452" id="592"/>
|
||||
<outlet property="useEntryDefaultsButton" destination="4yb-SC-vau" id="Z6g-Ai-729"/>
|
||||
<outlet property="view" destination="1" id="2"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customView id="1">
|
||||
<rect key="frame" x="0.0" y="0.0" width="346" height="275"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="346" height="291"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="148">
|
||||
<rect key="frame" x="18" y="237" width="66" height="17"/>
|
||||
<rect key="frame" x="18" y="253" width="66" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Password:" id="149">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@@ -41,7 +42,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="152">
|
||||
<rect key="frame" x="90" y="231" width="200" height="24"/>
|
||||
<rect key="frame" x="90" y="247" width="200" height="24"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="621"/>
|
||||
</constraints>
|
||||
@@ -52,11 +53,11 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="173">
|
||||
<rect key="frame" x="88" y="204" width="204" height="21"/>
|
||||
<rect key="frame" x="88" y="220" width="204" height="21"/>
|
||||
<sliderCell key="cell" state="on" alignment="left" maxValue="100" doubleValue="50" tickMarkPosition="above" sliderType="linear" id="174"/>
|
||||
</slider>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="178">
|
||||
<rect key="frame" x="18" y="206" width="66" height="17"/>
|
||||
<rect key="frame" x="18" y="222" width="66" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Length:" id="179">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@@ -64,7 +65,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="182">
|
||||
<rect key="frame" x="298" y="203" width="28" height="22"/>
|
||||
<rect key="frame" x="298" y="219" width="28" height="22"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="28" id="eVc-Kg-bCi"/>
|
||||
</constraints>
|
||||
@@ -75,7 +76,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<box autoresizesSubviews="NO" title="Allowed Characters" borderType="line" translatesAutoresizingMaskIntoConstraints="NO" id="332">
|
||||
<rect key="frame" x="17" y="72" width="312" height="94"/>
|
||||
<rect key="frame" x="17" y="88" width="312" height="94"/>
|
||||
<view key="contentView">
|
||||
<rect key="frame" x="1" y="1" width="310" height="78"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
@@ -168,14 +169,14 @@
|
||||
</connections>
|
||||
</button>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="500">
|
||||
<rect key="frame" x="18" y="52" width="209" height="18"/>
|
||||
<rect key="frame" x="18" y="68" width="209" height="18"/>
|
||||
<buttonCell key="cell" type="check" title="Copy password to pasteboard" bezelStyle="regularSquare" imagePosition="left" inset="2" id="501">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="509">
|
||||
<rect key="frame" x="298" y="231" width="28" height="25"/>
|
||||
<rect key="frame" x="298" y="247" width="28" height="25"/>
|
||||
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRefreshTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="510">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -195,11 +196,11 @@
|
||||
</connections>
|
||||
</button>
|
||||
<levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="635">
|
||||
<rect key="frame" x="90" y="174" width="165" height="16"/>
|
||||
<rect key="frame" x="90" y="190" width="165" height="16"/>
|
||||
<levelIndicatorCell key="cell" alignment="left" doubleValue="10" maxValue="90" warningValue="55" criticalValue="30" levelIndicatorStyle="continuousCapacity" id="636" customClass="HNHLevelIndicatorCell"/>
|
||||
</levelIndicator>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="646">
|
||||
<rect key="frame" x="18" y="174" width="66" height="17"/>
|
||||
<rect key="frame" x="18" y="190" width="66" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Entropy:" id="647">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@@ -207,7 +208,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="652">
|
||||
<rect key="frame" x="261" y="174" width="67" height="17"/>
|
||||
<rect key="frame" x="261" y="190" width="67" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="25000 bit" id="653">
|
||||
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="# bit" negativeFormat="# bit" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="309" decimalSeparator="," groupingSeparator="." currencyDecimalSeparator="," plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix=" bit" negativePrefix="-" negativeSuffix=" bit" id="681"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -225,6 +226,13 @@
|
||||
</connections>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="4yb-SC-vau">
|
||||
<rect key="frame" x="18" y="48" width="237" height="18"/>
|
||||
<buttonCell key="cell" type="check" title="Use default only for selected entry" bezelStyle="regularSquare" imagePosition="left" inset="2" id="cfZ-5F-Nge">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="148" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="151"/>
|
||||
@@ -258,16 +266,19 @@
|
||||
<constraint firstItem="652" firstAttribute="leading" secondItem="635" secondAttribute="trailing" constant="8" symbolic="YES" id="672"/>
|
||||
<constraint firstAttribute="trailing" secondItem="652" secondAttribute="trailing" constant="20" symbolic="YES" id="679"/>
|
||||
<constraint firstItem="635" firstAttribute="leading" secondItem="152" secondAttribute="leading" id="680"/>
|
||||
<constraint firstItem="613" firstAttribute="top" secondItem="500" secondAttribute="bottom" constant="12" id="684"/>
|
||||
<constraint firstItem="613" firstAttribute="leading" secondItem="yil-UB-jtO" secondAttribute="trailing" constant="60" id="59d-1n-jSa"/>
|
||||
<constraint firstItem="646" firstAttribute="trailing" secondItem="178" secondAttribute="trailing" id="6kR-jk-E8r"/>
|
||||
<constraint firstItem="yil-UB-jtO" firstAttribute="leading" secondItem="500" secondAttribute="leading" id="Hic-qB-mt4"/>
|
||||
<constraint firstItem="4yb-SC-vau" firstAttribute="top" secondItem="500" secondAttribute="bottom" constant="6" id="IZo-0q-BdQ"/>
|
||||
<constraint firstItem="148" firstAttribute="trailing" secondItem="178" secondAttribute="trailing" id="KpM-xy-ZTB"/>
|
||||
<constraint firstItem="509" firstAttribute="leading" secondItem="182" secondAttribute="leading" id="QZ5-Ge-aq8"/>
|
||||
<constraint firstItem="613" firstAttribute="top" secondItem="4yb-SC-vau" secondAttribute="bottom" constant="8" symbolic="YES" id="SoR-gh-uhq"/>
|
||||
<constraint firstAttribute="bottom" secondItem="yil-UB-jtO" secondAttribute="bottom" constant="20" id="eYK-Hw-fyy"/>
|
||||
<constraint firstItem="646" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="jPa-QR-GAy"/>
|
||||
<constraint firstItem="178" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="pAc-di-F68"/>
|
||||
<constraint firstItem="500" firstAttribute="leading" secondItem="4yb-SC-vau" secondAttribute="leading" id="xv1-5v-Ljh"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="140" y="81.5"/>
|
||||
</customView>
|
||||
</objects>
|
||||
<resources>
|
||||
|
||||
@@ -7,11 +7,13 @@
|
||||
//
|
||||
|
||||
#import "MPViewController.h"
|
||||
@class KPKEntry;
|
||||
|
||||
@interface MPPasswordCreatorViewController : MPViewController <NSTextFieldDelegate>
|
||||
|
||||
@property (copy, readonly) NSString *generatedPassword;
|
||||
@property (weak) id closeTarget;
|
||||
@property (nonatomic, weak) KPKEntry *entry;
|
||||
@property (assign) BOOL allowsEntryDefaults;
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#import "MPUniqueCharactersFormatter.h"
|
||||
#import "MPSettingsHelper.h"
|
||||
|
||||
#import "KPKEntry.h"
|
||||
|
||||
/*
|
||||
|
||||
0 - 20 Terrible
|
||||
@@ -30,18 +32,11 @@ typedef NS_ENUM(NSUInteger, MPPasswordRating) {
|
||||
MPPasswordStrong = 60
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
MPEntryDomain,
|
||||
MPGlobalDomain,
|
||||
};
|
||||
|
||||
#define MIN_PASSWORD_LENGTH 1
|
||||
#define MAX_PASSWORD_LENGTH 256
|
||||
|
||||
@interface MPPasswordCreatorViewController () {
|
||||
MPPasswordCharacterFlags _characterFlags;
|
||||
MPDefaultDomain _defaultDomain;
|
||||
}
|
||||
@interface MPPasswordCreatorViewController ()
|
||||
|
||||
@property (nonatomic, copy) NSString *password;
|
||||
@property (copy) NSString *generatedPassword;
|
||||
|
||||
@@ -58,12 +53,16 @@ typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
@property (weak) IBOutlet NSButton *setDefaultButton;
|
||||
@property (weak) IBOutlet NSTextField *entropyTextField;
|
||||
@property (weak) IBOutlet NSLevelIndicator *entropyIndicator;
|
||||
@property (weak) IBOutlet NSButton *useEntryDefaultsButton;
|
||||
|
||||
@property (nonatomic, copy) NSString *customString;
|
||||
@property (nonatomic, assign) BOOL useCustomString;
|
||||
@property (nonatomic, assign) NSUInteger passwordLength;
|
||||
@property (nonatomic, assign) CGFloat entropy;
|
||||
|
||||
@property (nonatomic, assign) BOOL useEntryDefaults;
|
||||
@property (nonatomic, assign) MPPasswordCharacterFlags characterFlags;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPPasswordCreatorViewController
|
||||
@@ -76,13 +75,10 @@ typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
||||
if (self) {
|
||||
_password = @"";
|
||||
_passwordLength = [[NSUserDefaults standardUserDefaults] integerForKey:kMPSettingsKeyDefaultPasswordLength];
|
||||
_characterFlags = [[NSUserDefaults standardUserDefaults] integerForKey:kMPSettingsKeyPasswordCharacterFlags];
|
||||
_useCustomString = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyPasswordUseCustomString];
|
||||
_customString = [[NSUserDefaults standardUserDefaults] stringForKey:kMPSettingsKeyPasswordCustomString];
|
||||
_entropy = 0.0;
|
||||
_defaultDomain = MPGlobalDomain;
|
||||
_useEntryDefaults = NO;
|
||||
_allowsEntryDefaults = NO;
|
||||
[self _setupDefaults];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -115,13 +111,19 @@ typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController];
|
||||
[self.shouldCopyPasswordToPasteboardButton bind:NSValueBinding toObject:defaultsController withKeyPath:copyToPasteBoardKeyPath options:nil];
|
||||
|
||||
if(self.allowsEntryDefaults) {
|
||||
[self.useEntryDefaultsButton bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(useEntryDefaults)) options:nil];
|
||||
}
|
||||
else {
|
||||
[self.useEntryDefaultsButton setEnabled:self.allowsEntryDefaults];
|
||||
}
|
||||
|
||||
[self.numbersButton setTag:MPPasswordCharactersNumbers];
|
||||
[self.upperCaseButton setTag:MPPasswordCharactersUpperCase];
|
||||
[self.lowerCaseButton setTag:MPPasswordCharactersLowerCase];
|
||||
[self.symbolsButton setTag:MPPasswordCharactersSymbols];
|
||||
|
||||
[self updateResponderChain];
|
||||
[self _updateSetDefaultButton];
|
||||
[self reset];
|
||||
}
|
||||
|
||||
@@ -130,43 +132,31 @@ typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
[self _generatePassword:self];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Events
|
||||
|
||||
- (void)flagsChanged:(NSEvent *)theEvent {
|
||||
if(!self.allowsEntryDefaults) {
|
||||
return;
|
||||
}
|
||||
BOOL altIsDown = (0 != ([NSEvent modifierFlags] & NSAlternateKeyMask));
|
||||
_defaultDomain = altIsDown ? MPEntryDomain : MPGlobalDomain;
|
||||
[self _updateSetDefaultButton];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Actions
|
||||
|
||||
- (IBAction)_generatePassword:(id)sender {
|
||||
if(_useCustomString) {
|
||||
if([[_customCharactersTextField stringValue] length] > 0) {
|
||||
self.password = [[_customCharactersTextField stringValue] passwordWithLength:_passwordLength];
|
||||
if(self.useCustomString) {
|
||||
if([[self.customCharactersTextField stringValue] length] > 0) {
|
||||
self.password = [[self.customCharactersTextField stringValue] passwordWithLength:self.passwordLength];
|
||||
}
|
||||
}
|
||||
else {
|
||||
self.password = [NSString passwordWithCharactersets:_characterFlags length:_passwordLength];
|
||||
self.password = [NSString passwordWithCharactersets:self.characterFlags length:self.passwordLength];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)_toggleCharacters:(id)sender {
|
||||
[_setDefaultButton setEnabled:YES];
|
||||
_characterFlags ^= [sender tag];
|
||||
[self.setDefaultButton setEnabled:YES];
|
||||
self.characterFlags ^= [sender tag];
|
||||
self.useCustomString = NO;
|
||||
[self reset];
|
||||
}
|
||||
|
||||
- (IBAction)_usePassword:(id)sender {
|
||||
self.generatedPassword = _password;
|
||||
self.generatedPassword = self.password;
|
||||
if([self.shouldCopyPasswordToPasteboardButton state] == NSOnState) {
|
||||
[[MPPasteBoardController defaultController] copyObjects:@[_password]];
|
||||
[[MPPasteBoardController defaultController] copyObjects:@[self.password]];
|
||||
}
|
||||
[[self _findCloseTarget] performClose:nil];
|
||||
}
|
||||
@@ -176,36 +166,67 @@ typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
}
|
||||
|
||||
- (IBAction)_setDefault:(id)sender {
|
||||
[[NSUserDefaults standardUserDefaults] setInteger:_passwordLength forKey:kMPSettingsKeyDefaultPasswordLength];
|
||||
[[NSUserDefaults standardUserDefaults] setInteger:_characterFlags forKey:kMPSettingsKeyPasswordCharacterFlags];
|
||||
[[NSUserDefaults standardUserDefaults] setBool:_useCustomString forKey:kMPSettingsKeyPasswordUseCustomString];
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[_customCharactersTextField stringValue] forKey:kMPSettingsKeyPasswordCustomString];
|
||||
|
||||
[_setDefaultButton setEnabled:NO];
|
||||
if(self.useEntryDefaults) {
|
||||
NSMutableDictionary *entryDefaults = [[self _currentEntryDefaults] mutableCopy];
|
||||
if(!entryDefaults) {
|
||||
entryDefaults = [[NSMutableDictionary alloc] initWithCapacity:4]; // we will only add one enty to new settings
|
||||
}
|
||||
entryDefaults[kMPSettingsKeyDefaultPasswordLength] = @(self.passwordLength);
|
||||
entryDefaults[kMPSettingsKeyPasswordCharacterFlags] = @(self.characterFlags);
|
||||
entryDefaults[kMPSettingsKeyPasswordUseCustomString] = @(self.useCustomString);
|
||||
entryDefaults[kMPSettingsKeyPasswordCustomString] = [self.customCharactersTextField stringValue];
|
||||
NSMutableDictionary *availableDefaults = [[self _availableEntryDefaults] mutableCopy];
|
||||
if(!availableDefaults) {
|
||||
availableDefaults = [[NSMutableDictionary alloc] initWithCapacity:1];
|
||||
}
|
||||
availableDefaults[self.entry.uuid] = entryDefaults;
|
||||
}
|
||||
else {
|
||||
[[NSUserDefaults standardUserDefaults] setInteger:self.passwordLength forKey:kMPSettingsKeyDefaultPasswordLength];
|
||||
[[NSUserDefaults standardUserDefaults] setInteger:self.characterFlags forKey:kMPSettingsKeyPasswordCharacterFlags];
|
||||
[[NSUserDefaults standardUserDefaults] setBool:self.useCustomString forKey:kMPSettingsKeyPasswordUseCustomString];
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[self.customCharactersTextField stringValue] forKey:kMPSettingsKeyPasswordCustomString];
|
||||
}
|
||||
[self.setDefaultButton setEnabled:NO];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Custom Setter
|
||||
- (void)setUseEntryDefaults:(BOOL)useEntryDefaults {
|
||||
if(self.useEntryDefaults != useEntryDefaults) {
|
||||
_useEntryDefaults = useEntryDefaults;
|
||||
[self _setupDefaults];
|
||||
[self reset];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setEntry:(KPKEntry *)entry {
|
||||
if(_entry != entry) {
|
||||
_entry = entry;
|
||||
[self _setupDefaults];
|
||||
[self reset];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setPassword:(NSString *)password {
|
||||
if(![_password isEqualToString:password]) {
|
||||
_password = [password copy];
|
||||
NSString *customString = _useCustomString ? [_customCharactersTextField stringValue] : nil;
|
||||
self.entropy = [password entropyWhithPossibleCharacterSet:_characterFlags orCustomCharacters:customString];
|
||||
NSString *customString = self.useCustomString ? [self.customCharactersTextField stringValue] : nil;
|
||||
self.entropy = [password entropyWhithPossibleCharacterSet:self.characterFlags orCustomCharacters:customString];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setUseCustomString:(BOOL)useCustomString {
|
||||
if(_useCustomString != useCustomString) {
|
||||
[_setDefaultButton setEnabled:YES];
|
||||
if(self.useCustomString != useCustomString) {
|
||||
[self.setDefaultButton setEnabled:YES];
|
||||
_useCustomString = useCustomString;
|
||||
[self _resetCharacters];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setPasswordLength:(NSUInteger)passwordLength {
|
||||
if(_passwordLength != passwordLength) {
|
||||
[_setDefaultButton setEnabled:YES];
|
||||
if(self.passwordLength != passwordLength) {
|
||||
[self.setDefaultButton setEnabled:YES];
|
||||
_passwordLength = passwordLength;
|
||||
[self _generatePassword:nil];
|
||||
}
|
||||
@@ -216,52 +237,64 @@ typedef NS_ENUM(NSUInteger, MPDefaultDomain) {
|
||||
|
||||
- (void)controlTextDidChange:(NSNotification *)obj {
|
||||
if([obj object] == self.customCharactersTextField) {
|
||||
[_setDefaultButton setEnabled:YES];
|
||||
[self.setDefaultButton setEnabled:YES];
|
||||
[self _generatePassword:nil];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Helper
|
||||
- (NSDictionary *)_availableEntryDefaults {
|
||||
return [[NSUserDefaults standardUserDefaults] dictionaryForKey:kMPSettingsKeyPasswordDefaultsForEntry];
|
||||
}
|
||||
|
||||
- (void)_updateSetDefaultButton {
|
||||
- (NSDictionary *)_currentEntryDefaults {
|
||||
if(self.entry) {
|
||||
return [self _availableEntryDefaults][self.entry.uuid];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
switch (_defaultDomain) {
|
||||
case MPEntryDomain:
|
||||
[self.setDefaultButton setTitle:NSLocalizedString(@"SET_DEFAULT_ENTRY_PASSWORD_RULE", "")];
|
||||
break;
|
||||
|
||||
case MPGlobalDomain:
|
||||
default:
|
||||
[self.setDefaultButton setTitle:NSLocalizedString(@"SET_DEFAULT_GENERAL_PASSWORD_RULE", "")];
|
||||
break;
|
||||
- (void)_setupDefaults {
|
||||
NSDictionary *entryDefaults = [self _currentEntryDefaults];
|
||||
if(entryDefaults) {
|
||||
self.passwordLength = [entryDefaults[kMPSettingsKeyDefaultPasswordLength] integerValue];
|
||||
self.characterFlags = [entryDefaults[kMPSettingsKeyPasswordCharacterFlags] integerValue];
|
||||
self.useCustomString = [entryDefaults[kMPSettingsKeyPasswordUseCustomString] boolValue];
|
||||
self.customString = [entryDefaults[kMPSettingsKeyPasswordCustomString] stringValue];
|
||||
}
|
||||
else {
|
||||
self.passwordLength = [[NSUserDefaults standardUserDefaults] integerForKey:kMPSettingsKeyDefaultPasswordLength];
|
||||
self.characterFlags = [[NSUserDefaults standardUserDefaults] integerForKey:kMPSettingsKeyPasswordCharacterFlags];
|
||||
self.useCustomString = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyPasswordUseCustomString];
|
||||
self.customString = [[NSUserDefaults standardUserDefaults] stringForKey:kMPSettingsKeyPasswordCustomString];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_resetCharacters {
|
||||
if(_useCustomString) {
|
||||
[_customButton setState:NSOnState];
|
||||
if(self.useCustomString) {
|
||||
[self.customButton setState:NSOnState];
|
||||
}
|
||||
[_customCharactersTextField setEnabled:_useCustomString];
|
||||
[_upperCaseButton setEnabled:!_useCustomString];
|
||||
[_lowerCaseButton setEnabled:!_useCustomString];
|
||||
[_numbersButton setEnabled:!_useCustomString];
|
||||
[_symbolsButton setEnabled:!_useCustomString];
|
||||
[self.customCharactersTextField setEnabled:_useCustomString];
|
||||
[self.upperCaseButton setEnabled:!_useCustomString];
|
||||
[self.lowerCaseButton setEnabled:!_useCustomString];
|
||||
[self.numbersButton setEnabled:!_useCustomString];
|
||||
[self.symbolsButton setEnabled:!_useCustomString];
|
||||
|
||||
/* Set to defualts, if we got nothing */
|
||||
if(_characterFlags == 0) {
|
||||
_characterFlags = MPPasswordCharactersAll;
|
||||
/* Set to defaults, if we got nothing */
|
||||
if(self.characterFlags == 0) {
|
||||
self.characterFlags = MPPasswordCharactersAll;
|
||||
}
|
||||
|
||||
const BOOL userLowercase = ( 0 != (MPPasswordCharactersLowerCase & _characterFlags));
|
||||
const BOOL useUppercase = ( 0 != (MPPasswordCharactersUpperCase & _characterFlags) );
|
||||
const BOOL useNumbers = ( 0 != (MPPasswordCharactersNumbers & _characterFlags) );
|
||||
const BOOL useSymbols = ( 0 != (MPPasswordCharactersSymbols & _characterFlags) );
|
||||
const BOOL userLowercase = ( 0 != (MPPasswordCharactersLowerCase & self.characterFlags));
|
||||
const BOOL useUppercase = ( 0 != (MPPasswordCharactersUpperCase & self.characterFlags) );
|
||||
const BOOL useNumbers = ( 0 != (MPPasswordCharactersNumbers & self.characterFlags) );
|
||||
const BOOL useSymbols = ( 0 != (MPPasswordCharactersSymbols & self.characterFlags) );
|
||||
|
||||
[_upperCaseButton setState:useUppercase ? NSOnState : NSOffState];
|
||||
[_lowerCaseButton setState:userLowercase ? NSOnState : NSOffState];
|
||||
[_numbersButton setState:useNumbers ? NSOnState : NSOffState];
|
||||
[_symbolsButton setState:useSymbols ? NSOnState : NSOffState];
|
||||
[self.upperCaseButton setState:useUppercase ? NSOnState : NSOffState];
|
||||
[self.lowerCaseButton setState:userLowercase ? NSOnState : NSOffState];
|
||||
[self.numbersButton setState:useNumbers ? NSOnState : NSOffState];
|
||||
[self.symbolsButton setState:useSymbols ? NSOnState : NSOffState];
|
||||
}
|
||||
|
||||
- (id)_findCloseTarget {
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user