2  * Copyright (c) 2000-2001,2011,2013-2014 Apple Inc. All Rights Reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. Please obtain a copy of the License at 
  10  * http://www.opensource.apple.com/apsl/ and read it before using this 
  13  * The Original Code and all software distributed under the License are 
  14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  18  * Please see the License for the specific language governing rights and 
  19  * limitations under the License. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  26 // trampolineServer.cpp - tool-side trampoline support functions 
  30 #include <Security/Authorization.h> 
  31 #include <Security/SecBase.h> 
  32 #include <dispatch/dispatch.h> 
  33 #include <security_utilities/debugging.h> 
  36 // In a tool launched via AuthorizationCopyPrivilegedReference, retrieve a copy 
  37 // of the AuthorizationRef that started it all. 
  39 OSStatus 
AuthorizationCopyPrivilegedReference(AuthorizationRef 
*authorization
, 
  40         AuthorizationFlags flags
) 
  42         secalert("AuthorizationCopyPrivilegedReference is deprecated and functionality will be removed in macOS 10.14 - please update your application"); 
  43         // flags are currently reserved 
  45                 return errAuthorizationInvalidFlags
; 
  47         // retrieve hex form of external form from environment 
  48         const char *mboxFdText 
= getenv("__AUTHORIZATION"); 
  50                 return errAuthorizationInvalidRef
; 
  53         static AuthorizationExternalForm extForm
; 
  54         static OSStatus result 
= errAuthorizationInvalidRef
; 
  55         static dispatch_once_t onceToken
; 
  56         dispatch_once(&onceToken
, ^{ 
  57                 // retrieve the pipe and read external form 
  59                 if (sscanf(mboxFdText
, "auth %d", &fd
) != 1) { 
  62                 ssize_t numOfBytes 
= read(fd
, &extForm
, sizeof(extForm
)); 
  64                 if (numOfBytes 
== sizeof(extForm
)) { 
  65                         result 
= errAuthorizationSuccess
; 
  70                 // we had some trouble with reading the extform 
  74         // internalize the authorization 
  75         AuthorizationRef auth
; 
  76         if (OSStatus error 
= AuthorizationCreateFromExternalForm(&extForm
, &auth
)) 
  80                 *authorization 
= auth
; 
  83         return errAuthorizationSuccess
;