/
PassphrasePicker.m
executable file
·128 lines (94 loc) · 3.93 KB
/
PassphrasePicker.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#import "PassphrasePicker.h"
#import "NotationPrefs.h"
#import "KeyDerivationManager.h"
#import <Carbon/Carbon.h>
@implementation PassphrasePicker
- (id)initWithNotationPrefs:(NotationPrefs*)prefs {
if ([super init]) {
notationPrefs = [prefs retain];
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[notationPrefs release];
[keyDerivation release];
[super dealloc];
}
- (void)awakeFromNib {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(textDidChange:)
name:NSControlTextDidChangeNotification object:newPasswordField];
[center addObserver:self selector:@selector(textDidChange:)
name:NSControlTextDidChangeNotification object:verifyNewPasswordField];
}
- (IBAction)discloseAdvancedSettings:(id)sender {
BOOL disclosed = [disclosureButton state];
int heightDifference = disclosed ? 118 : -118;
if (disclosed) {
[self performSelector:@selector(setAdvancedViewHidden:)
withObject:[NSNumber numberWithBool:NO] afterDelay:0.0];
} else {
[advancedView setHidden:YES];
}
[advancedHelpField setStringValue:disclosed ? NSLocalizedString(@"Fewer Security Options",nil) : NSLocalizedString(@"More Security Options",nil)];
NSPoint origin = [window frame].origin;
NSRect newFrame = NSMakeRect(origin.x, origin.y - heightDifference, [window frame].size.width,
[window frame].size.height + heightDifference);
[window setFrame:newFrame display:YES animate:YES];
}
- (void)setAdvancedViewHidden:(NSNumber*)value {
[advancedView setHidden:[value boolValue]];
}
- (void)showAroundWindow:(NSWindow*)mainWindow resultDelegate:(id)aDelegate {
if (!newPassphraseWindow) {
if (![NSBundle loadNibNamed:@"PassphrasePicker" owner:self]) {
NSLog(@"Failed to load PassphrasePicker.nib");
NSBeep();
return;
}
}
resultDelegate = aDelegate;
if (!keyDerivation) {
keyDerivation = [[KeyDerivationManager alloc] initWithNotationPrefs:notationPrefs];
[advancedView addSubview:[keyDerivation view]];
}
[newPasswordField setStringValue:@""];
[verifyNewPasswordField setStringValue:@""];
[rememberNewButton setState:[notationPrefs storesPasswordInKeychain]];
[newPasswordField selectText:nil];
[okNewButton setEnabled:NO];
EnableSecureEventInput();
[NSApp beginSheet:newPassphraseWindow modalForWindow:mainWindow modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:NULL];
}
- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
[newPasswordField setStringValue:@""];
[verifyNewPasswordField setStringValue:@""];
DisableSecureEventInput();
if ([resultDelegate respondsToSelector:@selector(passphrasePicker:choseAPassphrase:)])
[resultDelegate passphrasePicker:self choseAPassphrase:returnCode];
}
- (IBAction)cancelNewPassword:(id)sender {
[NSApp endSheet:newPassphraseWindow returnCode:0];
[newPassphraseWindow close];
}
- (IBAction)okNewPassword:(id)sender {
NSString *pass = [newPasswordField stringValue];
if ([pass isEqualToString:[verifyNewPasswordField stringValue]]) {
[notationPrefs setPassphraseData:[pass dataUsingEncoding:NSUTF8StringEncoding]
inKeychain:[rememberNewButton state]
withIterations:[keyDerivation hashIterationCount]];
[NSApp endSheet:newPassphraseWindow returnCode:1];
[newPassphraseWindow close];
} else {
NSRunAlertPanel(NSLocalizedString(@"Your entered passphrase does not match your verify passphrase.",nil),
NSLocalizedString(@"Please try again.",nil), NSLocalizedString(@"OK",nil), nil, nil);
[verifyNewPasswordField setStringValue:@""];
[verifyNewPasswordField performSelector:@selector(selectText:) withObject:nil afterDelay:0.0];
}
}
- (void)textDidChange:(NSNotification *)aNotification {
[okNewButton setEnabled:(([[newPasswordField stringValue] length] > 0) && ([[verifyNewPasswordField stringValue] length] > 0))];
}
@end