forked from OSchip/llvm-project
51 lines
2.1 KiB
Plaintext
51 lines
2.1 KiB
Plaintext
#include <AvailabilityMacros.h>
|
|
|
|
#if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
|
|
#define BUILDING_ON_SNOW_LEOPARD 1
|
|
#endif
|
|
|
|
#if !BUILDING_ON_SNOW_LEOPARD
|
|
#define __XPC_PRIVATE_H__
|
|
#include <xpc/xpc.h>
|
|
#include <Security/Security.h>
|
|
#include "LauncherXPCService.h"
|
|
|
|
// Returns 0 if successful.
|
|
int _validate_authorization(xpc_object_t message)
|
|
{
|
|
size_t data_length = 0ul;
|
|
const char *data_bytes = (const char *)xpc_dictionary_get_data(message, LauncherXPCServiceAuthKey, &data_length);
|
|
|
|
AuthorizationExternalForm extAuth;
|
|
if (data_length < sizeof(extAuth.bytes))
|
|
return 1;
|
|
|
|
memcpy(extAuth.bytes, data_bytes, sizeof(extAuth.bytes));
|
|
AuthorizationRef authRef;
|
|
if (AuthorizationCreateFromExternalForm(&extAuth, &authRef) != errAuthorizationSuccess)
|
|
return 2;
|
|
|
|
AuthorizationItem item1 = { LaunchUsingXPCRightName, 0, NULL, 0 };
|
|
AuthorizationItem items[] = {item1};
|
|
AuthorizationRights requestedRights = {1, items };
|
|
AuthorizationRights *outAuthorizedRights = NULL;
|
|
OSStatus status = AuthorizationCopyRights(authRef, &requestedRights, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &outAuthorizedRights);
|
|
|
|
// Given a set of rights, return the subset that is currently authorized by the AuthorizationRef given; count(subset) > 0 -> success.
|
|
bool auth_success = (status == errAuthorizationSuccess && outAuthorizedRights && outAuthorizedRights->count > 0) ? true : false;
|
|
if (outAuthorizedRights) AuthorizationFreeItemSet(outAuthorizedRights);
|
|
if (!auth_success)
|
|
return 3;
|
|
|
|
// On Lion, because the rights initially doesn't exist in /etc/authorization, if an admin user logs in and uses lldb within the first 5 minutes,
|
|
// it is possible to do AuthorizationCopyRights on LaunchUsingXPCRightName and get the rights back.
|
|
// As another security measure, we make sure that the LaunchUsingXPCRightName rights actually exists.
|
|
status = AuthorizationRightGet(LaunchUsingXPCRightName, NULL);
|
|
if (status == errAuthorizationSuccess)
|
|
return 0;
|
|
else
|
|
return 4;
|
|
}
|
|
|
|
#endif
|