/* * Copyright (c) 2000-2004,2011-2014 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * * 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, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ // // Authorization.cpp // // This file is the unified implementation of the Authorization and AuthSession APIs. // #include #include #include #include #include #include #include // // This no longer talks to securityd; it is a kernel function. // OSStatus SessionGetInfo(SecuritySessionId requestedSession, SecuritySessionId *sessionId, SessionAttributeBits *attributes) { BEGIN_API CommonCriteria::AuditInfo session; if (requestedSession == callerSecuritySession) session.get(); else session.get(requestedSession); if (sessionId) *sessionId = session.sessionId(); if (attributes) *attributes = (SessionAttributeBits)session.flags(); END_API(CSSM) } // // Create a new session. // This no longer talks to securityd; it is a kernel function. // Securityd will pick up the new session when we next talk to it. // OSStatus SessionCreate(SessionCreationFlags flags, SessionAttributeBits attributes) { BEGIN_API // we don't support the session creation flags anymore if (flags) Syslog::warning("SessionCreate flags=0x%lx unsupported (ignored)", (unsigned long)flags); CommonCriteria::AuditInfo session; session.create(attributes); // retrieve the (new) session id and set it into the process environment session.get(); char idString[80]; snprintf(idString, sizeof(idString), "%x", session.sessionId()); setenv("SECURITYSESSIONID", idString, 1); END_API(CSSM) } // // Get and set the distinguished uid (optionally) associated with the session. // OSStatus SessionSetDistinguishedUser(SecuritySessionId session, uid_t user) { BEGIN_API CommonCriteria::AuditInfo session; session.get(); session.ai_auid = user; session.set(); END_API(CSSM) } OSStatus SessionGetDistinguishedUser(SecuritySessionId session, uid_t *user) { BEGIN_API CommonCriteria::AuditInfo session; session.get(); Required(user) = session.uid(); END_API(CSSM) } //OSStatus _SessionSetUserPreferences(SecuritySessionId session); // //static //void SessionUserPreferencesChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) //{ //#warning "The cast will loose some information" // _SessionSetUserPreferences((SecuritySessionId)uintptr_t(observer)); //} // //OSStatus _SessionSetUserPreferences(SecuritySessionId session) //{ // BEGIN_API // CFStringRef appleLanguagesStr = CFSTR("AppleLanguages"); // CFStringRef controlTintStr = CFSTR("AppleAquaColorVariant"); // CFStringRef keyboardUIModeStr = CFSTR("AppleKeyboardUIMode"); // CFStringRef textDirectionStr = CFSTR("AppleTextDirection"); // CFStringRef hitoolboxAppIDStr = CFSTR("com.apple.HIToolbox"); // CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter(); // // CFRef userPrefsDict(CFDictionaryCreateMutable(NULL, 10, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); // CFRef globalPrefsDict(CFDictionaryCreateMutable(NULL, 10, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); // // if (!userPrefsDict || !globalPrefsDict) // return errSessionValueNotSet; // // CFRef appleLanguagesArray(static_cast(CFPreferencesCopyAppValue(appleLanguagesStr, kCFPreferencesCurrentApplication))); // if (appleLanguagesArray) // CFDictionarySetValue(globalPrefsDict, appleLanguagesStr, appleLanguagesArray); // // CFRef controlTintNumber(static_cast(CFPreferencesCopyAppValue(controlTintStr, kCFPreferencesCurrentApplication))); // if (controlTintNumber) // CFDictionarySetValue(globalPrefsDict, controlTintStr, controlTintNumber); // // CFRef keyboardUIModeNumber(static_cast(CFPreferencesCopyAppValue(keyboardUIModeStr, kCFPreferencesCurrentApplication))); // if (keyboardUIModeNumber) // CFDictionarySetValue(globalPrefsDict, keyboardUIModeStr, keyboardUIModeNumber); // // CFRef textDirectionNumber(static_cast(CFPreferencesCopyAppValue(textDirectionStr, kCFPreferencesCurrentApplication))); // if (textDirectionNumber) // CFDictionarySetValue(globalPrefsDict, textDirectionStr, textDirectionNumber); // // if (CFDictionaryGetCount(globalPrefsDict) > 0) // CFDictionarySetValue(userPrefsDict, kCFPreferencesAnyApplication, globalPrefsDict); // // CFPreferencesSynchronize(hitoolboxAppIDStr, kCFPreferencesCurrentUser, // kCFPreferencesCurrentHost); // CFRef hitoolboxPrefsDict(static_cast(CFPreferencesCopyMultiple(NULL, hitoolboxAppIDStr, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost))); // if (hitoolboxPrefsDict) { // CFDictionarySetValue(userPrefsDict, hitoolboxAppIDStr, hitoolboxPrefsDict); // CFNotificationCenterPostNotification(center, CFSTR("com.apple.securityagent.InputPrefsChanged"), CFSTR("com.apple.loginwindow"), hitoolboxPrefsDict, true); // } // // CFRef userPrefsData(CFPropertyListCreateXMLData(NULL, userPrefsDict)); // if (!userPrefsData) // return errSessionValueNotSet; // server().setSessionUserPrefs(session, (uint32_t)CFDataGetLength(userPrefsData), CFDataGetBytePtr(userPrefsData)); // // END_API(CSSM) //} OSStatus SessionSetUserPreferences(SecuritySessionId session) { // OSStatus status = _SessionSetUserPreferences(session); // if (errSecSuccess == status) { // CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter(); // // We've succeeded in setting up a static set of prefs, now set up // CFNotificationCenterAddObserver(center, (void*)session, SessionUserPreferencesChanged, CFSTR("com.apple.Carbon.TISNotifySelectedKeyboardInputSourceChanged"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); // CFNotificationCenterAddObserver(center, (void*)session, SessionUserPreferencesChanged, CFSTR("com.apple.Carbon.TISNotifyEnabledKeyboardInputSourcesChanged"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); // } // return status; return errSecSuccess; }