5 #import <Foundation/Foundation.h>
9 const CFStringRef kTKSmartCardPreferencesDomain = CFSTR("com.apple.security.smartcard");
10 const CFStringRef kTKDisabledTokensPreferencesKey = CFSTR("DisabledTokens");
12 static void listDisabledTokens() {
13 id value = (__bridge_transfer id)CFPreferencesCopyValue(kTKDisabledTokensPreferencesKey, kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
14 if (![value isKindOfClass:NSArray.class])
17 NSArray *disabledTokens = (NSArray*)value;
18 for (id tokenName in disabledTokens) {
19 if ([tokenName isKindOfClass:NSString.class]) {
20 printf("\t\"%s\"\n", [tokenName UTF8String]);
25 static void disable(const char *tokenToDisable) {
26 id value = (__bridge_transfer id)CFPreferencesCopyValue(kTKDisabledTokensPreferencesKey, kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
27 if (![value isKindOfClass:NSArray.class])
29 NSMutableArray *disabledTokens = [NSMutableArray arrayWithArray:value];
30 NSString *tokenName = [NSString stringWithUTF8String:tokenToDisable];
31 if (![disabledTokens containsObject:tokenName]) {
32 [disabledTokens addObject:tokenName];
33 CFPreferencesSetValue(kTKDisabledTokensPreferencesKey, (__bridge CFTypeRef)disabledTokens, kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
34 if (!CFPreferencesSynchronize(kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost))
35 printf("Permission denied!\n");
38 printf("Token is already disabled.\n");
41 static void enable(const char *tokenToEnable) {
42 id value = (__bridge_transfer id)CFPreferencesCopyValue(kTKDisabledTokensPreferencesKey, kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
43 if (![value isKindOfClass:NSArray.class])
46 NSString *tokenName = [NSString stringWithUTF8String:tokenToEnable];
47 NSMutableArray *disabledTokens = [NSMutableArray arrayWithArray:value];
48 if ([disabledTokens containsObject:tokenName]) {
49 [disabledTokens removeObject:tokenName];
50 CFPreferencesSetValue(kTKDisabledTokensPreferencesKey, (__bridge CFTypeRef)disabledTokens, kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
51 if (!CFPreferencesSynchronize(kTKSmartCardPreferencesDomain, kCFPreferencesAnyUser, kCFPreferencesCurrentHost))
52 printf("Permission denied!\n");
55 printf("Token is already enabled.\n");
58 static int token(int argc, char * const *argv)
61 while ((ch = getopt(argc, argv, "le:d:")) != -1)
77 return 2; /* @@@ Return 2 triggers usage message. */
80 int smartcards(int argc, char * const *argv) {
82 require_quiet(argc > 2, out);
84 if (!strcmp("token", argv[1])) {
85 result = token(argc - 1, argv + 1);