+//
+// Run the Authorization engine to check if a given right has been authorized,
+// independent of an external client request.
+//
+OSStatus Session::authCheckRight(string &rightName, Connection &connection, bool allowUI)
+{
+ // dummy up the arguments for authCreate()
+ AuthorizationItem rightItem = { rightName.c_str(), 0, NULL, 0 };
+ AuthorizationItemSet rightItemSet = { 1, &rightItem };
+ AuthItemSet rightAuthItemSet(&rightItemSet);
+ AuthItemSet envAuthItemSet(kAuthorizationEmptyEnvironment);
+ AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagExtendRights;
+ if (true == allowUI)
+ flags |= kAuthorizationFlagInteractionAllowed;
+ AuthorizationBlob dummyHandle;
+ const audit_token_t *at = connection.auditToken();
+
+ return authCreate(rightAuthItemSet, envAuthItemSet, flags, dummyHandle, *at);
+}
+
+// for places within securityd that don't want to #include
+// <libsecurity_authorization/Authorization.h> or to fuss about exceptions
+bool Session::isRightAuthorized(string &rightName, Connection &connection, bool allowUI)
+{
+ bool isAuthorized = false;
+
+ try {
+ OSStatus status = authCheckRight(rightName, connection, allowUI);
+ if (errAuthorizationSuccess == status)
+ isAuthorized = true;
+ }
+ catch (...) {
+ }
+ return isAuthorized;
+}
+
+RefPointer<AuthHostInstance>
+Session::authhost(const AuthHostType hostType, const bool restart)
+{
+ StLock<Mutex> _(mAuthHostLock);
+
+ if (hostType == privilegedAuthHost)
+ {
+ if (restart || !mAuthHost || (mAuthHost->state() != Security::UnixPlusPlus::Child::alive))
+ {
+ if (mAuthHost)
+ PerSession::kill(*mAuthHost);
+ mAuthHost = new AuthHostInstance(*this, hostType);
+ }
+ return mAuthHost;
+ }
+ else /* if (hostType == securityAgent) */
+ {
+ if (restart || !mSecurityAgent || (mSecurityAgent->state() != Security::UnixPlusPlus::Child::alive))
+ {
+ if (mSecurityAgent)
+ PerSession::kill(*mSecurityAgent);
+ mSecurityAgent = new AuthHostInstance(*this, hostType);
+ }
+ return mSecurityAgent;
+ }
+}
+
+void DynamicSession::setUserPrefs(CFDataRef userPrefsDict)
+{
+ if (Server::process().uid() != 0)
+ MacOSError::throwMe(errSessionAuthorizationDenied);
+ StLock<Mutex> _(*this);
+ mSessionAgentPrefs = userPrefsDict;
+}
+
+CFDataRef DynamicSession::copyUserPrefs()
+{
+ StLock<Mutex> _(*this);
+ if (mSessionAgentPrefs)
+ CFRetain(mSessionAgentPrefs);
+ return mSessionAgentPrefs;
+}
+