#include "create_fv_user.h"
#include "keychain_utilities.h"
#include "readline.h"
#include "security.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <Security/SecKeychain.h>
#include <Admin/LoginPrefs.h>
static int
do_lock_all(void)
{
OSStatus result = SecKeychainLockAll();
if (result)
sec_perror("SecKeychainLockAll", result);
return result;
}
static int
do_lock(const char *keychainName)
{
SecKeychainRef keychain = NULL;
OSStatus result;
if (keychainName)
{
keychain = keychain_open(keychainName);
if (!keychain)
{
result = 1;
goto loser;
}
}
result = SecKeychainLock(keychain);
if (result)
{
sec_error("SecKeychainLock %s: %s", keychainName ? keychainName : "<NULL>", sec_errstr(result));
}
loser:
if (keychain)
CFRelease(keychain);
return result;
}
int
create_fv_user(int argc, char * const *argv)
{
char *keychainName = NULL;
int ch, result = 0;
Boolean lockAll = FALSE;
while ((ch = getopt(argc, argv, "ah")) != -1)
{
switch (ch)
{
case 'a':
lockAll = TRUE;
break;
case '?':
default:
return 2;
}
}
argc -= optind;
argv += optind;
if (argc == 1 && !lockAll)
{
keychainName = argv[0];
if (*keychainName == '\0')
{
result = 2;
goto loser;
}
}
else if (argc != 0)
return 2;
if (lockAll)
result = do_lock_all();
else
result = do_lock(keychainName);
loser:
return result;
}
if([[mNewUserFullName stringValue] length] == 0)
{
[mNewUserFullNameWarn setStringValue:LOCSTRING(@"USERNAME_IS_EMPTY_SHORT")];
[self _showWarningForField:mNewUserFullName];
return;
}
{
if(([[mNewUserFullName stringValue] caseInsensitiveCompare:@"admin"] != NSOrderedSame) && ([Group findGroupByName:[mNewUserFullName stringValue]] != NULL))
{
[mNewUserFullNameWarn setStringValue:LOCSTRING(@"USERNAME_IS_NOT_AVAILABLE_SHORT")];
[self _showWarningForField:mNewUserFullName];
return;
}
if(![User isUserNameUnique:[mNewUserFullName stringValue] searchParent:NO])
{
[mNewUserFullNameWarn setStringValue:LOCSTRING(@"USERNAME_IS_NOT_UNIQUE_SHORT")];
[self _showWarningForField:mNewUserFullName];
return;
}
}
if([[mNewUserName stringValue] length] == 0))
{
[mNewUserName setStringValue:[User generateUnixNameUsingString:[mNewUserFullName stringValue]]];
[[mNewUserName window] display];
}
if([[mNewUserName stringValue] isEqualToString:@"ftp"])
{
[mNewUserNameWarn setStringValue:LOCSTRING(@"UNIXNAME_IS_FTP_SHORT")];
[self _showWarningForField:mNewUserName];
return;
}
if([[mNewUserName stringValue] isEqualToString:@"public"])
{
[mNewUserNameWarn setStringValue:LOCSTRING(@"UNIXNAME_IS_PUBLIC_SHORT")];
[self _showWarningForField:mNewUserName];
return;
}
if([[mNewUserName stringValue] length] == 0)
{
[mNewUserNameWarn setStringValue:LOCSTRING(@"UNIXNAME_IS_EMPTY_SHORT")];
[self _showWarningForField:mNewUserName];
return;
}
if(![User isUserNameUnique:[mNewUserName stringValue] searchParent:NO])
{
[mNewUserNameWarn setStringValue:LOCSTRING(@"UNIXNAME_IS_NOT_UNIQUE_SHORT")];
[self _showWarningForField:mNewUserName];
return;
}
if(![User isUnixNameValid:[mNewUserName stringValue]])
{
[mNewUserNameWarn setStringValue:LOCSTRING(@"UNIXNAME_IS_NOT_VALID_SHORT")];
[self _showWarningForField:mNewUserName];
return;
}
if(([[mNewUserName stringValue] caseInsensitiveCompare:@"admin"] != NSOrderedSame) && ([Group findGroupByName:[mNewUserName stringValue]] != NULL))
{
[mNewUserNameWarn setStringValue:LOCSTRING(@"USERNAME_IS_NOT_AVAILABLE_SHORT")];
[self _showWarningForField:mNewUserName];
return;
}
if(![[mNewUserPassword stringValue] isEqualToString:[mNewUserPasswordVerify stringValue]])
{
[mNewUserPassword setStringValue:@""];
[mNewUserPasswordVerify setStringValue:@""];
[mNewUserPasswordWarn setStringValue:LOCSTRING(@"PASS_VERIFY_ERR_SHORT")];
[self _showWarningForField:mNewUserPassword];
return;
}
if(![[mNewUserPassword stringValue] length])
{
if(NSRunAlertPanel(LOCSTRING(@"PASS_IS_EMPTY_WARN"), LOCSTRING(@"PASS_IS_EMPTY_WARN_DESC"), LOCSTRING(@"CANCEL"), LOCSTRING(@"OK"), NULL) == NSOKButton)
{
[[mNewUserPassword window] makeFirstResponder:mNewUserPassword];
return;
}
}
if([[mNewUserName stringValue] caseInsensitiveCompare:@"admin"] == NSOrderedSame)
{
if(NSRunAlertPanel(LOCSTRING(@"USERNAME_IS_ADMIN"), LOCSTRING(@"USERNAME_IS_ADMIN_DESCR"), LOCSTRING(@"OK"), LOCSTRING(@"CANCEL"), NULL) != NSOKButton)
{
[[mNewUserName window] makeFirstResponder:mNewUserName];
return;
}
[mNewUserAdmin setState:NSOnState];
}
{
NSFileManager * fm = [NSFileManager defaultManager];
BOOL directory;
NSString * username = [mNewUserName stringValue];
if([fm fileExistsAtPath:[@"/Users/" stringByAppendingPathComponent:username] isDirectory:&directory])
{
if(directory)
{
if(NSRunAlertPanel([NSString stringWithFormat:LOCSTRING(@"HOME_EXISTS_WARN"), username], LOCSTRING(@"HOME_EXISTS_WARN_DESCR"), LOCSTRING(@"CANCEL"), LOCSTRING(@"OK"), NULL) != NSCancelButton) return;
}
else
{
NSRunAlertPanel([NSString stringWithFormat:LOCSTRING(@"HOME_EXISTS_ERR"), username], LOCSTRING(@"HOME_EXISTS_ERR_DESCR"), LOCSTRING(@"OK"), NULL, NULL);
return;
}
}
}
if([mNewUserIsFV state] == NSOnState && (!SecFileVaultMasterPasswordEnabled(NULL)))
{
[mMasterPassword setStringValue:@""];
[mMasterPasswordVerify setStringValue:@""];
[mMasterPasswordHint setStringValue:@""];
[mMasterPasswordWarn setStringValue:@""];
[mNewUserWarningSign setHidden:YES];
[self _setContentView:mMasterPasswordView displayAndAnimate:YES];
[mNewUserSheet performSelector:@selector(makeFirstResponder:) withObject:mMasterPassword afterDelay:0.1];
}
[[NSApplication sharedApplication] endSheet:[inSender window] returnCode:NSOKButton];
[[inSender window] orderOut:[inSender window]];