1/* Copyright (c) 2012 Apple Inc. All rights reserved. */
2
3#include "debugging.h"
4#include "authd_private.h"
5#include "authutilities.h"
6#include <stdarg.h>
7#include <syslog.h>
8#include <dispatch/dispatch.h>
9#include <CoreFoundation/CoreFoundation.h>
10
11// sudo defaults write /Library/Preferences/com.apple.security.coderequirements Entitlements -string always
12
13static bool
14security_auth_verbose(void)
15{
16    static dispatch_once_t onceToken;
17    static bool verbose_enabled = false;
18
19    //sudo defaults write /Library/Preferences/com.apple.authd verbose -bool true
20    dispatch_once(&onceToken, ^{
21		CFTypeRef verbose = (CFNumberRef)CFPreferencesCopyValue(CFSTR("verbose"), CFSTR(SECURITY_AUTH_NAME), kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
22
23        if (verbose && CFGetTypeID(verbose) == CFBooleanGetTypeID()) {
24            verbose_enabled = CFBooleanGetValue((CFBooleanRef)verbose);
25        }
26#if DEBUG
27        syslog(LOG_NOTICE, "verbose: %s", verbose_enabled ? "enabled" : "disabled");
28#endif
29        CFReleaseSafe(verbose);
30    });
31
32    return verbose_enabled;
33}
34
35void
36security_auth_log(int type,const char * format,...)
37{
38    va_list ap;
39    va_start(ap, format);
40    switch (type) {
41        case AUTH_LOG_NORMAL:
42            vsyslog(LOG_NOTICE, format, ap);
43            break;
44        case AUTH_LOG_VERBOSE:
45            if (security_auth_verbose()) {
46                vsyslog(LOG_NOTICE, format, ap);
47            }
48            break;
49        case AUTH_LOG_ERROR:
50            vsyslog(LOG_ERR, format, ap);
51            break;
52        default:
53            break;
54    }
55    va_end(ap);
56}
57
58void _show_cf(CFTypeRef value)
59{
60    CFStringRef string = NULL;
61    char * tmp = NULL;
62    require(value != NULL, done);
63
64    if (security_auth_verbose()) {
65        string = CFCopyDescription(value);
66        tmp = _copy_cf_string(string, NULL);
67
68        syslog(LOG_NOTICE, "%s", tmp);
69    }
70
71done:
72    CFReleaseSafe(string);
73    free_safe(tmp);
74    return;
75}
76