#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCValidation.h>
#include <SystemConfiguration/SCPrivate.h>
#undef kSCPropUsersConsoleUserName
#define kSCPropUsersConsoleUserName CFSTR("Name")
#undef kSCPropUsersConsoleUserUID
#define kSCPropUsersConsoleUserUID CFSTR("UID")
#undef kSCPropUsersConsoleUserGID
#define kSCPropUsersConsoleUserGID CFSTR("GID")
#undef kSCPropUsersConsoleSessionInfo
#define kSCPropUsersConsoleSessionInfo CFSTR("SessionInfo")
const CFStringRef kSCConsoleSessionUserName = CFSTR("kCGSSessionUserNameKey");
const CFStringRef kSCConsoleSessionUID = CFSTR("kCGSSessionUserIDKey");
const CFStringRef kSCConsoleSessionConsoleSet = CFSTR("kCGSSessionConsoleSetKey");
const CFStringRef kSCConsoleSessionOnConsole = CFSTR("kCGSSessionOnConsoleKey");
const CFStringRef kSCConsoleSessionLoginDone = CFSTR("kCGSessionLoginDoneKey");
const CFStringRef kSCConsoleSessionID = CFSTR("kCGSSessionIDKey");
const CFStringRef kSCConsoleSessionSystemSafeBoot = CFSTR("kCGSSessionSystemSafeBoot");
const CFStringRef kSCConsoleSessionLoginwindowSafeLogin = CFSTR("kCGSSessionLoginwindowSafeLogin");
CFStringRef
SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator)
{
return SCDynamicStoreKeyCreate(allocator,
CFSTR("%@/%@/%@"),
kSCDynamicStoreDomainState,
kSCCompUsers,
kSCEntUsersConsoleUser);
}
CFStringRef
SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store,
uid_t *uid,
gid_t *gid)
{
CFStringRef consoleUser = NULL;
CFDictionaryRef dict = NULL;
CFStringRef key;
key = SCDynamicStoreKeyCreateConsoleUser(NULL);
dict = SCDynamicStoreCopyValue(store, key);
CFRelease(key);
if (!isA_CFDictionary(dict)) {
_SCErrorSet(kSCStatusNoKey);
goto done;
}
consoleUser = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserName);
consoleUser = isA_CFString(consoleUser);
if (!consoleUser) {
_SCErrorSet(kSCStatusNoKey);
goto done;
}
CFRetain(consoleUser);
if (uid) {
CFNumberRef num;
SInt32 val;
num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserUID);
if (isA_CFNumber(num)) {
if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) {
*uid = (uid_t)val;
}
}
}
if (gid) {
CFNumberRef num;
SInt32 val;
num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserGID);
if (isA_CFNumber(num)) {
if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) {
*gid = (gid_t)val;
}
}
}
done :
if (dict) CFRelease(dict);
return consoleUser;
}
CFArrayRef
SCDynamicStoreCopyConsoleInformation(SCDynamicStoreRef store)
{
CFDictionaryRef dict = NULL;
CFArrayRef info = NULL;
CFStringRef key;
key = SCDynamicStoreKeyCreateConsoleUser(NULL);
dict = SCDynamicStoreCopyValue(store, key);
CFRelease(key);
if (!isA_CFDictionary(dict)) {
_SCErrorSet(kSCStatusNoKey);
goto done;
}
info = CFDictionaryGetValue(dict, kSCPropUsersConsoleSessionInfo);
info = isA_CFArray(info);
if (info == NULL) {
_SCErrorSet(kSCStatusNoKey);
goto done;
}
CFRetain(info);
done :
if (dict) CFRelease(dict);
return info;
}
Boolean
SCDynamicStoreSetConsoleInformation(SCDynamicStoreRef store,
const char *user,
uid_t uid,
gid_t gid,
CFArrayRef sessions)
{
CFStringRef consoleUser;
CFMutableDictionaryRef dict = NULL;
CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL);
Boolean ok = FALSE;
if ((user == NULL) && (sessions == NULL)) {
ok = SCDynamicStoreRemoveValue(store, key);
goto done;
}
dict = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
if (user != NULL) {
CFNumberRef num;
consoleUser = CFStringCreateWithCString(NULL, user, kCFStringEncodingMacRoman);
CFDictionarySetValue(dict, kSCPropUsersConsoleUserName, consoleUser);
CFRelease(consoleUser);
num = CFNumberCreate(NULL, kCFNumberSInt32Type, (SInt32 *)&uid);
CFDictionarySetValue(dict, kSCPropUsersConsoleUserUID, num);
CFRelease(num);
num = CFNumberCreate(NULL, kCFNumberSInt32Type, (SInt32 *)&gid);
CFDictionarySetValue(dict, kSCPropUsersConsoleUserGID, num);
CFRelease(num);
}
if (sessions != NULL) {
CFDictionarySetValue(dict, kSCPropUsersConsoleSessionInfo, sessions);
}
ok = SCDynamicStoreSetValue(store, key, dict);
done :
if (dict) CFRelease(dict);
if (key) CFRelease(key);
return ok;
}
Boolean
SCDynamicStoreSetConsoleUser(SCDynamicStoreRef store,
const char *user,
uid_t uid,
gid_t gid)
{
CFStringRef consoleUser;
CFMutableDictionaryRef dict = NULL;
CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL);
CFNumberRef num;
Boolean ok = FALSE;
if (user == NULL) {
ok = SCDynamicStoreRemoveValue(store, key);
goto done;
}
dict = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
consoleUser = CFStringCreateWithCString(NULL, user, kCFStringEncodingMacRoman);
CFDictionarySetValue(dict, kSCPropUsersConsoleUserName, consoleUser);
CFRelease(consoleUser);
num = CFNumberCreate(NULL, kCFNumberSInt32Type, (SInt32 *)&uid);
CFDictionarySetValue(dict, kSCPropUsersConsoleUserUID, num);
CFRelease(num);
num = CFNumberCreate(NULL, kCFNumberSInt32Type, (SInt32 *)&gid);
CFDictionarySetValue(dict, kSCPropUsersConsoleUserGID, num);
CFRelease(num);
ok = SCDynamicStoreSetValue(store, key, dict);
done :
if (dict) CFRelease(dict);
if (key) CFRelease(key);
return ok;
}