#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFRuntime.h>
#include <xpc/xpc.h>
#import "config.h"
#if HEIMCRED_SERVER
#import <heim-ipc.h>
#import "heim_threads.h"
typedef enum {
CRED_STATUS_ACQUIRE_INITIAL = -1,
CRED_STATUS_ACQUIRE_START = 0,
CRED_STATUS_ACQUIRE_STOPPED = 1,
CRED_STATUS_ACQUIRE_FAILED = 2,
CRED_STATUS_ACQUIRE_SUCCESS = 3
} cred_acquire_status;
#endif
#include "heimcred.h"
#define CFRELEASE_NULL(x) do { if (x!=NULL) { CFRelease(x); x = NULL; } } while(0)
struct HeimMech;
struct HeimCred_s {
CFRuntimeBase runtime;
CFUUIDRef uuid;
CFDictionaryRef attributes;
#if HEIMCRED_SERVER
struct HeimMech *mech;
HEIMDAL_MUTEX event_mutex; time_t renew_time; heim_event_t renew_event; time_t next_acquire_time; time_t expire; heim_event_t expire_event; cred_acquire_status acquire_status; uid_t session; #endif
};
typedef struct {
dispatch_queue_t queue;
CFTypeID haid;
#if HEIMCRED_SERVER
CFSetRef connections;
CFMutableDictionaryRef sessions;
CFMutableDictionaryRef mechanisms;
CFMutableDictionaryRef schemas;
CFMutableDictionaryRef globalSchema;
pid_t session;
#else
CFMutableDictionaryRef items;
xpc_connection_t conn;
#endif
bool needFlush;
bool flushPending;
} HeimCredContext;
extern HeimCredContext HeimCredCTX;
void
_HeimCredInitCommon(void);
HeimCredRef
HeimCredCreateItem(CFUUIDRef uuid) CF_RETURNS_RETAINED;
CFTypeID
HeimCredGetTypeID(void);
CFUUIDRef
HeimCredCopyUUID(xpc_object_t object, const char *key);
CFTypeRef
HeimCredMessageCopyAttributes(xpc_object_t object, const char *key, CFTypeID type);
void
HeimCredMessageSetAttributes(xpc_object_t object, const char *key, CFTypeRef attrs);
void
HeimCredSetUUID(xpc_object_t object, const char *key, CFUUIDRef uuid);
#ifdef __OBJC__
NSData *
ksDecryptData(NSData * blob);
NSData *
ksEncryptData(NSData *plainText);
#endif
#define HEIMCRED_CONST(_t,_c) extern const char * _c##xpc
#include "heimcred-const.h"
#undef HEIMCRED_CONST