]> git.saurik.com Git - apple/security.git/blob - keychain/SecureObjectSync/Tool/secViewDisplay.c
Security-59306.41.2.tar.gz
[apple/security.git] / keychain / SecureObjectSync / Tool / secViewDisplay.c
1 /*
2 * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
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
11 * file.
12 *
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.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 // secViewDisplay.c
25 // sec
26 //
27 //
28 //
29
30 #include "secViewDisplay.h"
31 #include "secToolFileIO.h"
32
33 #include <Security/SecureObjectSync/SOSCloudCircle.h>
34 #include <Security/SecureObjectSync/SOSCloudCircleInternal.h>
35 #include <Security/SecureObjectSync/SOSViews.h>
36
37
38 static struct foo {
39 const char *name;
40 const CFStringRef *viewspec;
41 } string2View[] = {
42 { "keychain", &kSOSViewKeychainV0 },
43 #undef DOVIEWMACRO
44 #define DOVIEWMACRO(VIEWNAME, DEFSTRING, CMDSTRING, SYSTEM, DEFAULTSETTING, INITIALSYNCSETTING, ALWAYSONSETTING, BACKUPSETTING, V0SETTING) \
45 { CMDSTRING, &k##SYSTEM##View##VIEWNAME, },
46 #include "keychain/SecureObjectSync/ViewList.list"
47 };
48
49 static CFStringRef convertStringToView(char *viewname) {
50 unsigned n;
51
52 for (n = 0; n < sizeof(string2View)/sizeof(string2View[0]); n++) {
53 if (strcmp(string2View[n].name, viewname) == 0)
54 return *string2View[n].viewspec;
55 }
56
57 // Leak this, since it's a getter.
58 return CFStringCreateWithCString(kCFAllocatorDefault, viewname, kCFStringEncodingUTF8);
59 }
60
61 static CFStringRef convertViewReturnCodeToString(SOSViewActionCode ac) {
62 CFStringRef retval = NULL;
63 switch(ac) {
64 case kSOSCCGeneralViewError:
65 retval = CFSTR("General Error"); break;
66 case kSOSCCViewMember:
67 retval = CFSTR("Is Member of View"); break;
68 case kSOSCCViewNotMember:
69 retval = CFSTR("Is Not Member of View"); break;
70 case kSOSCCViewNotQualified:
71 retval = CFSTR("Is not qualified for View"); break;
72 case kSOSCCNoSuchView:
73 retval = CFSTR("No Such View"); break;
74 }
75 return retval;
76 }
77
78 bool viewcmd(char *itemName, CFErrorRef *err) {
79 char *cmd, *viewname;
80 SOSViewActionCode ac = kSOSCCViewQuery;
81 CFStringRef viewspec;
82
83 viewname = strchr(itemName, ':');
84 if(viewname == NULL) return false;
85 *viewname = 0;
86 viewname++;
87 cmd = itemName;
88
89 if(strcmp(cmd, "enable") == 0) {
90 ac = kSOSCCViewEnable;
91 } else if(strcmp(cmd, "disable") == 0) {
92 ac = kSOSCCViewDisable;
93 } else if(strcmp(cmd, "query") == 0) {
94 ac = kSOSCCViewQuery;
95 } else {
96 return false;
97 }
98
99 if(strchr(viewname, ',') == NULL) { // original single value version
100 viewspec = convertStringToView(viewname);
101 if(!viewspec) return false;
102
103 SOSViewResultCode rc = SOSCCView(viewspec, ac, err);
104 CFStringRef resultString = convertViewReturnCodeToString(rc);
105
106 printmsg(CFSTR("View Result: %@ : %@\n"), resultString, viewspec);
107 return true;
108 }
109
110 if(ac == kSOSCCViewQuery) return false;
111
112 // new multi-view version
113 char *viewlist = strdup(viewname);
114 char *token;
115 char *tofree = viewlist;
116 CFMutableSetRef viewSet = CFSetCreateMutable(NULL, 0, &kCFCopyStringSetCallBacks);
117
118 while ((token = strsep(&viewlist, ",")) != NULL) {
119 CFStringRef resultString = convertStringToView(token);
120 CFSetAddValue(viewSet, resultString);
121 }
122
123 printmsg(CFSTR("viewSet provided is %@\n"), viewSet);
124
125 free(tofree);
126
127 bool retcode;
128 if(ac == kSOSCCViewEnable) retcode = SOSCCViewSet(viewSet, NULL);
129 else retcode = SOSCCViewSet(NULL, viewSet);
130
131 fprintf(outFile, "SOSCCViewSet returned %s\n", (retcode)? "true": "false");
132
133 return true;
134 }
135
136 bool listviewcmd(CFErrorRef *err) {
137 unsigned n;
138
139 for (n = 0; n < sizeof(string2View)/sizeof(string2View[0]); n++) {
140 CFStringRef viewspec = *string2View[n].viewspec;
141
142 SOSViewResultCode rc = SOSCCView(viewspec, kSOSCCViewQuery, err);
143 CFStringRef resultString = convertViewReturnCodeToString(rc);
144
145 printmsg(CFSTR("View Result: %@ : %@\n"), resultString, viewspec);
146 };
147
148 return true;
149 }