X-Git-Url: https://git.saurik.com/apple/configd.git/blobdiff_plain/0fae82ee9e32dcee00597b75650c675a75eab32e..d94708881e41bd90afd74b1a1dd0524d039ba3f7:/SystemConfiguration.fproj/SCDConsoleUser.c diff --git a/SystemConfiguration.fproj/SCDConsoleUser.c b/SystemConfiguration.fproj/SCDConsoleUser.c index 900db51..35a2cc5 100644 --- a/SystemConfiguration.fproj/SCDConsoleUser.c +++ b/SystemConfiguration.fproj/SCDConsoleUser.c @@ -1,28 +1,32 @@ /* - * 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 * @@ -31,8 +35,37 @@ */ #include -#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 SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator) @@ -53,21 +86,9 @@ SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store, CFStringRef consoleUser = NULL; CFDictionaryRef dict = NULL; CFStringRef key; - SCDynamicStoreRef mySession = store; - - if (!store) { - mySession = SCDynamicStoreCreate(NULL, - CFSTR("SCDynamicStoreCopyConsoleUser"), - NULL, - NULL); - if (!mySession) { - SCLog(_sc_verbose, LOG_INFO, CFSTR("SCDynamicStoreCreate() failed")); - return NULL; - } - } key = SCDynamicStoreKeyCreateConsoleUser(NULL); - dict = SCDynamicStoreCopyValue(mySession, key); + dict = SCDynamicStoreCopyValue(store, key); CFRelease(key); if (!isA_CFDictionary(dict)) { _SCErrorSet(kSCStatusNoKey); @@ -109,10 +130,91 @@ SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store, done : - if (!store && mySession) CFRelease(mySession); - if (dict) CFRelease(dict); + 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; } @@ -125,23 +227,11 @@ SCDynamicStoreSetConsoleUser(SCDynamicStoreRef store, CFStringRef consoleUser; CFMutableDictionaryRef dict = NULL; CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL); - SCDynamicStoreRef mySession = store; CFNumberRef num; - Boolean ok = TRUE; - - if (!store) { - mySession = SCDynamicStoreCreate(NULL, - CFSTR("SCDynamicStoreSetConsoleUser"), - NULL, - NULL); - if (!mySession) { - SCLog(_sc_verbose, LOG_INFO, CFSTR("SCDynamicStoreCreate() failed")); - return FALSE; - } - } + Boolean ok = FALSE; if (user == NULL) { - ok = SCDynamicStoreRemoveValue(mySession, key); + ok = SCDynamicStoreRemoveValue(store, key); goto done; } @@ -162,12 +252,11 @@ SCDynamicStoreSetConsoleUser(SCDynamicStoreRef store, CFDictionarySetValue(dict, kSCPropUsersConsoleUserGID, num); CFRelease(num); - ok = SCDynamicStoreSetValue(mySession, key, dict); + ok = SCDynamicStoreSetValue(store, key, dict); done : - if (dict) CFRelease(dict); - if (key) CFRelease(key); - if (!store && mySession) CFRelease(mySession); + if (dict) CFRelease(dict); + if (key) CFRelease(key); return ok; }