- OSNumber * num;
-
- if ((num = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionUIDKey)))
- && (uid == num->unsigned32BitValue())) {
- user->retain();
- break;
- }
- }
- array->release();
- }
- return user;
-}
-
-static OSDictionary * CopyUserOnConsole(void)
-{
- OSArray * array;
- OSDictionary * user = 0;
-
- if ((array = OSDynamicCast(OSArray,
- IORegistryEntry::getRegistryRoot()->copyProperty(gIOConsoleUsersKey))))
- {
- for (unsigned int idx = 0;
- (user = OSDynamicCast(OSDictionary, array->getObject(idx)));
- idx++)
- {
- if (kOSBooleanTrue == user->getObject(gIOConsoleSessionOnConsoleKey))
- {
- user->retain();
- break;
- }
- }
- array->release();
- }
- return (user);
-}
-
-IOReturn IOUserClient::clientHasPrivilege( void * securityToken,
- const char * privilegeName )
-{
- kern_return_t kr;
- security_token_t token;
- mach_msg_type_number_t count;
- task_t task;
- OSDictionary * user;
- bool secureConsole;
-
-
- if (!strncmp(privilegeName, kIOClientPrivilegeForeground,
- sizeof(kIOClientPrivilegeForeground)))
- {
- /* is graphics access denied for current task? */
- if (proc_get_effective_task_policy(current_task(), TASK_POLICY_GPU_DENY) != 0)
- return (kIOReturnNotPrivileged);
- else
- return (kIOReturnSuccess);
- }
-
- if (!strncmp(privilegeName, kIOClientPrivilegeConsoleSession,
- sizeof(kIOClientPrivilegeConsoleSession)))
- {
- kauth_cred_t cred;
- proc_t p;
-
- task = (task_t) securityToken;
- if (!task)
- task = current_task();
- p = (proc_t) get_bsdtask_info(task);
- kr = kIOReturnNotPrivileged;
-
- if (p && (cred = kauth_cred_proc_ref(p)))
- {
- user = CopyUserOnConsole();
- if (user)
- {
- OSNumber * num;
- if ((num = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionAuditIDKey)))
- && (cred->cr_audit.as_aia_p->ai_asid == (au_asid_t) num->unsigned32BitValue()))
- {
- kr = kIOReturnSuccess;
- }
- user->release();
- }
- kauth_cred_unref(&cred);
- }
- return (kr);
- }
-
- if ((secureConsole = !strncmp(privilegeName, kIOClientPrivilegeSecureConsoleProcess,
- sizeof(kIOClientPrivilegeSecureConsoleProcess))))
- task = (task_t)((IOUCProcessToken *)securityToken)->token;
- else
- task = (task_t)securityToken;
-
- count = TASK_SECURITY_TOKEN_COUNT;
- kr = task_info( task, TASK_SECURITY_TOKEN, (task_info_t) &token, &count );
-
- if (KERN_SUCCESS != kr)
- {}
- else if (!strncmp(privilegeName, kIOClientPrivilegeAdministrator,
- sizeof(kIOClientPrivilegeAdministrator))) {
- if (0 != token.val[0])
- kr = kIOReturnNotPrivileged;
- } else if (!strncmp(privilegeName, kIOClientPrivilegeLocalUser,
- sizeof(kIOClientPrivilegeLocalUser))) {
- user = CopyConsoleUser(token.val[0]);
- if ( user )
- user->release();
- else
- kr = kIOReturnNotPrivileged;
- } else if (secureConsole || !strncmp(privilegeName, kIOClientPrivilegeConsoleUser,
- sizeof(kIOClientPrivilegeConsoleUser))) {
- user = CopyConsoleUser(token.val[0]);
- if ( user ) {
- if (user->getObject(gIOConsoleSessionOnConsoleKey) != kOSBooleanTrue)
- kr = kIOReturnNotPrivileged;
- else if ( secureConsole ) {
- OSNumber * pid = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionSecureInputPIDKey));
- if ( pid && pid->unsigned32BitValue() != ((IOUCProcessToken *)securityToken)->pid)
- kr = kIOReturnNotPrivileged;
- }
- user->release();
- }
- else
- kr = kIOReturnNotPrivileged;
- } else
- kr = kIOReturnUnsupported;
-
- return (kr);
-}
-
-bool IOUserClient::init()
-{
- if (getPropertyTable() || super::init())
- return reserve();
-
- return false;
-}
-
-bool IOUserClient::init(OSDictionary * dictionary)
-{
- if (getPropertyTable() || super::init(dictionary))
- return reserve();
-
- return false;
-}