this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

SystemConfiguration: Imlement SCDynamicStoreCopyProxies()

+80 -7
+2
src/SystemConfiguration/CMakeLists.txt
··· 1 1 project(SystemConfiguration) 2 2 3 3 set(CMAKE_CXX_STANDARD 11) 4 + include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src/external/libcxx/include ${CMAKE_CURRENT_BINARY_DIR}) 4 5 5 6 set(SystemConfiguration_SRCS 6 7 SCDynamicStoreCopySpecific.cpp ··· 19 20 DEPENDENCIES 20 21 system 21 22 CoreFoundation 23 + cxx 22 24 )
+78 -7
src/SystemConfiguration/SCDynamicStoreCopySpecific.cpp
··· 7 7 8 8 #include <CoreFoundation/CFString.h> 9 9 #include <SystemConfiguration/SCDynamicStoreCopySpecific.h> 10 + #include <SystemConfiguration/SCSchemaDefinitions.h> 11 + #include <vector> 10 12 11 13 #define MAX_PASSENTRY_LENGTH 4096 12 14 13 15 14 16 15 - CFStringRef SCDynamicStoreCopyComputerName (SCDynamicStoreRef store, CFStringEncoding *nameEncoding){ 16 - //LOG << "fixme: SCDynamicStoreCopyComputerName() - stub" << std::endl; 17 - return NULL; 17 + CFStringRef SCDynamicStoreCopyComputerName (SCDynamicStoreRef store, CFStringEncoding *nameEncoding) 18 + { 19 + char hostname[100]; 20 + if (gethostname(hostname, sizeof(hostname)) != 0) 21 + return nullptr; 22 + hostname[sizeof(hostname)-1] = '\0'; 23 + 24 + if (nameEncoding) 25 + *nameEncoding = kCFStringEncodingUTF8; 26 + 27 + return CFStringCreateWithCString(nullptr, hostname, kCFStringEncodingUTF8); 18 28 } 19 29 20 30 CFStringRef SCDynamicStoreCopyConsoleUser (SCDynamicStoreRef store, uid_t *uid, gid_t *gid){ ··· 49 59 return NULL; 50 60 } 51 61 52 - CFDictionaryRef SCDynamicStoreCopyProxies (SCDynamicStoreRef store){ 53 - //LOG << "fixme: SCDynamicStoreCopyComputerName() - stub" << std::endl; 54 - /* No Proxy support yet */ 55 - return NULL; 62 + static CFNumberRef cfNumber(int n) 63 + { 64 + return CFNumberCreate(nullptr, kCFNumberSInt32Type, &n); 65 + } 66 + 67 + static void fillProxy(std::vector<CFStringRef>& keys, std::vector<CFTypeRef>& values, 68 + const char* envVarName, 69 + CFStringRef enabledKey, CFStringRef hostKey, CFStringRef portKey) 70 + { 71 + const char* var = getenv(envVarName); 72 + if (!var) 73 + { 74 + keys.push_back(enabledKey); 75 + values.push_back(cfNumber(0)); 76 + } 77 + else 78 + { 79 + keys.push_back(enabledKey); 80 + values.push_back(cfNumber(1)); 81 + 82 + CFURLRef url = CFURLCreateWithBytes(nullptr, (const UInt8*) var, strlen(var), kCFStringEncodingUTF8, nullptr); 83 + 84 + if (url != nullptr) 85 + { 86 + keys.push_back(hostKey); 87 + values.push_back(CFURLCopyHostName(url)); 88 + 89 + int port = CFURLGetPortNumber(url); 90 + if (port == -1) 91 + port = 80; 92 + 93 + keys.push_back(portKey); 94 + values.push_back(cfNumber(port)); 95 + 96 + CFRelease(url); 97 + } 98 + } 99 + } 100 + 101 + CFDictionaryRef SCDynamicStoreCopyProxies (SCDynamicStoreRef store) 102 + { 103 + // NOTE: Proxy username and password are supposed to be accessed via Security.framework 104 + // https://stackoverflow.com/a/15085066/479753 105 + 106 + std::vector<CFStringRef> keys; 107 + std::vector<CFTypeRef> values; 108 + 109 + keys.push_back(kSCPropNetProxiesGopherEnable); 110 + values.push_back(cfNumber(0)); 111 + 112 + fillProxy(keys, values, "http_proxy", kSCPropNetProxiesHTTPEnable, kSCPropNetProxiesHTTPProxy, kSCPropNetProxiesHTTPPort); 113 + fillProxy(keys, values, "https_proxy", kSCPropNetProxiesHTTPSEnable, kSCPropNetProxiesHTTPSProxy, kSCPropNetProxiesHTTPSPort); 114 + fillProxy(keys, values, "ftp_proxy", kSCPropNetProxiesFTPEnable, kSCPropNetProxiesFTPProxy, kSCPropNetProxiesFTPPort); 115 + 116 + CFDictionaryRef rv = CFDictionaryCreate(nullptr, (const void**) keys.data(), (const void**) values.data(), keys.size(), 117 + &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 118 + 119 + for (CFTypeRef cf : values) 120 + CFRelease(cf); 121 + return rv; 122 + } 123 + 124 + CFDictionaryRef SCDynamicStoreCopyProxiesWithOptions(SCDynamicStoreRef store, CFDictionaryRef options) 125 + { 126 + return SCDynamicStoreCopyProxies(store); 56 127 }