X-Git-Url: https://git.saurik.com/apple/configd.git/blobdiff_plain/5958d7c06f2795b9ec773eb750b8259460acf8cb..d94708881e41bd90afd74b1a1dd0524d039ba3f7:/SystemConfiguration.fproj/SCDConsoleUser.c diff --git a/SystemConfiguration.fproj/SCDConsoleUser.c b/SystemConfiguration.fproj/SCDConsoleUser.c index a607b93..35a2cc5 100644 --- a/SystemConfiguration.fproj/SCDConsoleUser.c +++ b/SystemConfiguration.fproj/SCDConsoleUser.c @@ -1,91 +1,115 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2005, 2009, 2011, 2015 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ - * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. - * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. - * + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * * @APPLE_LICENSE_HEADER_END@ */ +/* + * Modification History + * + * May 1, 2003 Allan Nathanson + * - add console [session] information SPIs + * + * June 1, 2001 Allan Nathanson + * - public API conversion + * + * January 2, 2001 Allan Nathanson + * - initial revision + */ + #include +#include +#include + + +#undef kSCPropUsersConsoleUserName +#define kSCPropUsersConsoleUserName CFSTR("Name") + +#undef kSCPropUsersConsoleUserUID +#define kSCPropUsersConsoleUserUID CFSTR("UID") + +#undef kSCPropUsersConsoleUserGID +#define kSCPropUsersConsoleUserGID CFSTR("GID") + +#undef kSCPropUsersConsoleSessionInfo +#define kSCPropUsersConsoleSessionInfo CFSTR("SessionInfo") + + +// from CoreGraphics (CGSession.h) +const CFStringRef kSCConsoleSessionUserName = CFSTR("kCGSSessionUserNameKey"); /* value is CFString */ +const CFStringRef kSCConsoleSessionUID = CFSTR("kCGSSessionUserIDKey"); /* value is CFNumber (a uid_t) */ +const CFStringRef kSCConsoleSessionConsoleSet = CFSTR("kCGSSessionConsoleSetKey"); /* value is CFNumber */ +const CFStringRef kSCConsoleSessionOnConsole = CFSTR("kCGSSessionOnConsoleKey"); /* value is CFBoolean */ +const CFStringRef kSCConsoleSessionLoginDone = CFSTR("kCGSessionLoginDoneKey"); /* value is CFBoolean */ + +// from CoreGraphics (CGSSession.h) +const CFStringRef kSCConsoleSessionID = CFSTR("kCGSSessionIDKey"); /* value is CFNumber */ + +// for loginwindow +const CFStringRef kSCConsoleSessionSystemSafeBoot = CFSTR("kCGSSessionSystemSafeBoot"); /* value is CFBoolean */ +const CFStringRef kSCConsoleSessionLoginwindowSafeLogin = CFSTR("kCGSSessionLoginwindowSafeLogin"); /* value is CFBoolean */ CFStringRef -SCDKeyCreateConsoleUser() +SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator) { - return SCDKeyCreate(CFSTR("%@/%@/%@"), - CFSTR("state:"), // FIXME!!! (should be kSCCacheDomainState) - kSCCompUsers, - kSCEntUsersConsoleUser); + return SCDynamicStoreKeyCreate(allocator, + CFSTR("%@/%@/%@"), + kSCDynamicStoreDomainState, + kSCCompUsers, + kSCEntUsersConsoleUser); } -SCDStatus -SCDConsoleUserGet(char *user, int userlen, uid_t *uid, gid_t *gid) +CFStringRef +SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store, + uid_t *uid, + gid_t *gid) { - CFDictionaryRef dict; - SCDHandleRef handle = NULL; - CFStringRef key; - SCDSessionRef session = NULL; - SCDStatus status; - - /* get current user */ - status = SCDOpen(&session, CFSTR("SCDConsoleUserGet")); - if (status != SCD_OK) { - goto done; - } + CFStringRef consoleUser = NULL; + CFDictionaryRef dict = NULL; + CFStringRef key; - key = SCDKeyCreateConsoleUser(); - status = SCDGet(session, key, &handle); + key = SCDynamicStoreKeyCreateConsoleUser(NULL); + dict = SCDynamicStoreCopyValue(store, key); CFRelease(key); - if (status != SCD_OK) { + if (!isA_CFDictionary(dict)) { + _SCErrorSet(kSCStatusNoKey); goto done; } - dict = SCDHandleGetData(handle); - - if (user && (userlen > 0)) { - CFStringRef consoleUser; - - bzero(user, userlen); - if (CFDictionaryGetValueIfPresent(dict, - kSCPropUsersConsoleUserName, - (void **)&consoleUser)) { - CFIndex len; - CFRange range; - - range = CFRangeMake(0, CFStringGetLength(consoleUser)); - (void)CFStringGetBytes(consoleUser, - range, - kCFStringEncodingMacRoman, - 0, - FALSE, - user, - userlen, - &len); - } + consoleUser = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserName); + consoleUser = isA_CFString(consoleUser); + if (!consoleUser) { + _SCErrorSet(kSCStatusNoKey); + goto done; } + CFRetain(consoleUser); + if (uid) { CFNumberRef num; SInt32 val; - if (CFDictionaryGetValueIfPresent(dict, - kSCPropUsersConsoleUserUID, - (void **)&num)) { + num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserUID); + if (isA_CFNumber(num)) { if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) { *uid = (uid_t)val; } @@ -96,9 +120,8 @@ SCDConsoleUserGet(char *user, int userlen, uid_t *uid, gid_t *gid) CFNumberRef num; SInt32 val; - if (CFDictionaryGetValueIfPresent(dict, - kSCPropUsersConsoleUserGID, - (void **)&num)) { + num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserGID); + if (isA_CFNumber(num)) { if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) { *gid = (gid_t)val; } @@ -107,30 +130,108 @@ SCDConsoleUserGet(char *user, int userlen, uid_t *uid, gid_t *gid) done : - if (handle) SCDHandleRelease(handle); - if (session) (void) SCDClose(&session); - return status; + 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; } -SCDStatus -SCDConsoleUserSet(const char *user, uid_t uid, gid_t gid) +Boolean +SCDynamicStoreSetConsoleInformation(SCDynamicStoreRef store, + const char *user, + uid_t uid, + gid_t gid, + CFArrayRef sessions) { CFStringRef consoleUser; - CFMutableDictionaryRef dict = NULL; - SCDHandleRef handle = NULL; - CFStringRef key = SCDKeyCreateConsoleUser(); - CFNumberRef num; - SCDSessionRef session = NULL; - SCDStatus status; + CFMutableDictionaryRef dict = NULL; + CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL); + Boolean ok = FALSE; - status = SCDOpen(&session, CFSTR("SCDConsoleUserSet")); - if (status != SCD_OK) { + 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) { - (void)SCDRemove(session, key); + ok = SCDynamicStoreRemoveValue(store, key); goto done; } @@ -151,22 +252,11 @@ SCDConsoleUserSet(const char *user, uid_t uid, gid_t gid) CFDictionarySetValue(dict, kSCPropUsersConsoleUserGID, num); CFRelease(num); - handle = SCDHandleInit(); - SCDHandleSetData(handle, dict); - - status = SCDLock(session); - if (status != SCD_OK) { - goto done; - } - (void)SCDRemove(session, key); - (void)SCDAdd (session, key, handle); - status = SCDUnlock(session); + ok = SCDynamicStoreSetValue(store, key, dict); done : - if (dict) CFRelease(dict); - if (handle) SCDHandleRelease(handle); - if (key) CFRelease(key); - if (session) (void) SCDClose(&session); - return status; + if (dict) CFRelease(dict); + if (key) CFRelease(key); + return ok; }