#include "secViewDisplay.h"
#include "secToolFileIO.h"
#include <Security/SecureObjectSync/SOSCloudCircle.h>
#include <Security/SecureObjectSync/SOSCloudCircleInternal.h>
#include <Security/SecureObjectSync/SOSViews.h>
static struct foo {
const char *name;
const CFStringRef *viewspec;
} string2View[] = {
{ "keychain", &kSOSViewKeychainV0 },
#undef DOVIEWMACRO
#define DOVIEWMACRO(VIEWNAME, DEFSTRING, CMDSTRING, SYSTEM, DEFAULTSETTING, INITIALSYNCSETTING, ALWAYSONSETTING, BACKUPSETTING, V0SETTING) \
{ CMDSTRING, &k##SYSTEM##View##VIEWNAME, },
#include "keychain/SecureObjectSync/ViewList.list"
};
static CFStringRef convertStringToView(char *viewname) {
unsigned n;
for (n = 0; n < sizeof(string2View)/sizeof(string2View[0]); n++) {
if (strcmp(string2View[n].name, viewname) == 0)
return *string2View[n].viewspec;
}
return CFStringCreateWithCString(kCFAllocatorDefault, viewname, kCFStringEncodingUTF8);
}
static CFStringRef convertViewReturnCodeToString(SOSViewActionCode ac) {
CFStringRef retval = NULL;
switch(ac) {
case kSOSCCGeneralViewError:
retval = CFSTR("General Error"); break;
case kSOSCCViewMember:
retval = CFSTR("Is Member of View"); break;
case kSOSCCViewNotMember:
retval = CFSTR("Is Not Member of View"); break;
case kSOSCCViewNotQualified:
retval = CFSTR("Is not qualified for View"); break;
case kSOSCCNoSuchView:
retval = CFSTR("No Such View"); break;
}
return retval;
}
bool viewcmd(char *itemName, CFErrorRef *err) {
char *cmd, *viewname;
SOSViewActionCode ac = kSOSCCViewQuery;
CFStringRef viewspec;
viewname = strchr(itemName, ':');
if(viewname == NULL) return false;
*viewname = 0;
viewname++;
cmd = itemName;
if(strcmp(cmd, "enable") == 0) {
ac = kSOSCCViewEnable;
} else if(strcmp(cmd, "disable") == 0) {
ac = kSOSCCViewDisable;
} else if(strcmp(cmd, "query") == 0) {
ac = kSOSCCViewQuery;
} else {
return false;
}
if(strchr(viewname, ',') == NULL) { viewspec = convertStringToView(viewname);
if(!viewspec) return false;
SOSViewResultCode rc = SOSCCView(viewspec, ac, err);
CFStringRef resultString = convertViewReturnCodeToString(rc);
printmsg(CFSTR("View Result: %@ : %@\n"), resultString, viewspec);
return true;
}
if(ac == kSOSCCViewQuery) return false;
char *viewlist = strdup(viewname);
char *token;
char *tofree = viewlist;
CFMutableSetRef viewSet = CFSetCreateMutable(NULL, 0, &kCFCopyStringSetCallBacks);
while ((token = strsep(&viewlist, ",")) != NULL) {
CFStringRef resultString = convertStringToView(token);
CFSetAddValue(viewSet, resultString);
}
printmsg(CFSTR("viewSet provided is %@\n"), viewSet);
free(tofree);
bool retcode;
if(ac == kSOSCCViewEnable) retcode = SOSCCViewSet(viewSet, NULL);
else retcode = SOSCCViewSet(NULL, viewSet);
fprintf(outFile, "SOSCCViewSet returned %s\n", (retcode)? "true": "false");
return true;
}
bool listviewcmd(CFErrorRef *err) {
unsigned n;
for (n = 0; n < sizeof(string2View)/sizeof(string2View[0]); n++) {
CFStringRef viewspec = *string2View[n].viewspec;
SOSViewResultCode rc = SOSCCView(viewspec, kSOSCCViewQuery, err);
CFStringRef resultString = convertViewReturnCodeToString(rc);
printmsg(CFSTR("View Result: %@ : %@\n"), resultString, viewspec);
};
return true;
}