static void nc_print_VPN_service(SCNetworkServiceRef service) { SCNetworkInterfaceRef interface = NULL; CFStringRef display_name = NULL; CFStringRef display_name_padded = NULL; CFStringRef service_id = NULL; CFStringRef service_name = NULL; CFStringRef service_name_padded = NULL; CFStringRef service_status = NULL; CFStringRef service_status_padded = NULL; CFStringRef sub_type = NULL; CFStringRef type = NULL; nc_get_service_type_and_subtype(service, &type, &sub_type); service_name = SCNetworkServiceGetName(service); service_name_padded = copy_padded_string(service_name, 32, CFSTR("\""), CFSTR("\"")); service_id = SCNetworkServiceGetServiceID(service); interface = SCNetworkServiceGetInterface(service); display_name = SCNetworkInterfaceGetLocalizedDisplayName(interface); display_name_padded = copy_padded_string(display_name, 18, NULL, NULL); service_status = copy_VPN_status(service); service_status_padded = copy_padded_string(service_status, 16, CFSTR("("), CFSTR(")")); SCPrint(TRUE, stdout, CFSTR("%@ %@ %@ %@ %@ [%@%@%@]\n"), SCNetworkServiceGetEnabled(service) ? CFSTR("*") : CFSTR(" "), service_status_padded, service_id, display_name_padded, service_name_padded, type, (sub_type == NULL) ? CFSTR("") : CFSTR(":"), (sub_type == NULL) ? CFSTR("") : sub_type); CFRelease(display_name_padded); CFRelease(service_name_padded); CFRelease(service_status_padded); my_CFRelease(&service_status); }
vector<InterfaceInfo> OSXPlatform::interfaces() { vector<InterfaceInfo> result; CFStringRef name = CFSTR("com.codebutler.firesheep.backend"); SCPreferencesRef prefs = SCPreferencesCreate(NULL, name, NULL); SCNetworkSetRef set = SCNetworkSetCopyCurrent(prefs); CFArrayRef services = SCNetworkSetCopyServices(set); int arraySize = CFArrayGetCount(services); for (int i = 0; i < arraySize; i++) { SCNetworkServiceRef service = (SCNetworkServiceRef) CFArrayGetValueAtIndex(services, i); if (SCNetworkServiceGetEnabled(service)) { SCNetworkInterfaceRef iface = SCNetworkServiceGetInterface(service); CFStringRef serviceName = SCNetworkServiceGetName(service); char cServiceName[(CFStringGetLength(serviceName) * 4) + 1]; CFStringGetCString(serviceName, cServiceName, sizeof(cServiceName), kCFStringEncodingUTF8); CFStringRef type = SCNetworkInterfaceGetInterfaceType(iface); if (CFStringCompare(type, CFSTR("Ethernet"), 0) == kCFCompareEqualTo || CFStringCompare(type, CFSTR("IEEE80211"), 0) == kCFCompareEqualTo) { char cType[(CFStringGetLength(type) * 4) + 1]; CFStringGetCString(type, cType, sizeof(cType), kCFStringEncodingUTF8); CFStringRef bsdName = SCNetworkInterfaceGetBSDName(iface); char cBsdName[(CFStringGetLength(bsdName) * 4) + 1]; CFStringGetCString(bsdName, cBsdName, sizeof(cBsdName), kCFStringEncodingUTF8); InterfaceInfo info((string(cBsdName)), (string(cServiceName)), (string(cType))); result.push_back(info); } } } CFRelease(services); CFRelease(set); CFRelease(prefs); return result; }
SCNetworkServiceRef SCNetworkSetCopySelectedVPNService(SCNetworkSetRef set) { CFIndex i; CFIndex n; SCNetworkServiceRef selected = NULL; CFArrayRef services; CFMutableArrayRef services_vpn = NULL; if (!isA_SCNetworkSet(set)) { _SCErrorSet(kSCStatusInvalidArgument); return NULL; } services = SCNetworkSetCopyServices(set); if (services != NULL) { n = CFArrayGetCount(services); for (i = 0; i < n; i++) { SCNetworkServiceRef service; service = CFArrayGetValueAtIndex(services, i); if (!SCNetworkServiceGetEnabled(service)) { // if not enabled continue; } if (!_SCNetworkServiceIsVPN(service)) { // if not VPN service continue; } if (services_vpn == NULL) { services_vpn = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); } CFArrayAppendValue(services_vpn, service); } CFRelease(services); } if (services_vpn == NULL) { // if no VPN services return NULL; } n = CFArrayGetCount(services_vpn); if (n > 1) { CFArrayRef order; CFMutableArrayRef sorted; order = SCNetworkSetGetServiceOrder(set); sorted = CFArrayCreateMutableCopy(NULL, 0, services_vpn); CFArraySortValues(sorted, CFRangeMake(0, CFArrayGetCount(sorted)), _SCNetworkServiceCompare, (void *)order); CFRelease(services_vpn); services_vpn = sorted; } #if TARGET_OS_IPHONE if (n > 1) { CFStringRef serviceID_prefs; #define VPN_PREFERENCES CFSTR("com.apple.mobilevpn") #define VPN_SERVICE_ID CFSTR("activeVPNID") CFPreferencesAppSynchronize(VPN_PREFERENCES); serviceID_prefs = CFPreferencesCopyAppValue(VPN_SERVICE_ID, VPN_PREFERENCES); if (serviceID_prefs != NULL) { for (i = 0; i < n; i++) { SCNetworkServiceRef service; CFStringRef serviceID; service = CFArrayGetValueAtIndex(services_vpn, i); serviceID = SCNetworkServiceGetServiceID(service); if (CFEqual(serviceID, serviceID_prefs)) { selected = service; CFRetain(selected); break; } } CFRelease(serviceID_prefs); } } #endif // TARGET_OS_IPHONE if (selected == NULL) { selected = CFArrayGetValueAtIndex(services_vpn, 0); CFRetain(selected); } CFRelease(services_vpn); return selected; }
__private_extern__ void show_services(int argc, char **argv) { CFIndex i; CFIndex n; if (prefs == NULL) { SCPrint(TRUE, stdout, CFSTR("network configuration not open\n")); return; } if (argc == 1) { if (services != NULL) CFRelease(services); services = SCNetworkServiceCopyAll(prefs); } else { if (net_set == NULL) { SCPrint(TRUE, stdout, CFSTR("set not selected\n")); return; } if (services != NULL) CFRelease(services); services = SCNetworkSetCopyServices(net_set); n = (services != NULL) ? CFArrayGetCount(services) : 0; if (n > 1) { CFArrayRef order; CFMutableArrayRef sorted; order = SCNetworkSetGetServiceOrder(net_set); sorted = CFArrayCreateMutableCopy(NULL, 0, services); CFArraySortValues(sorted, CFRangeMake(0, CFArrayGetCount(sorted)), _SCNetworkServiceCompare, (void *)order); CFRelease(services); services = sorted; } } if (services == NULL) { SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); return; } n = CFArrayGetCount(services); for (i = 0; i < n; i++) { SCNetworkServiceRef service; CFStringRef serviceName; CFStringRef serviceID; service = CFArrayGetValueAtIndex(services, i); serviceID = SCNetworkServiceGetServiceID(service); serviceName = SCNetworkServiceGetName(service); if (serviceName == NULL) serviceName = CFSTR(""); SCPrint(TRUE, stdout, CFSTR("%c%2ld: %@%-*s (%@)%s\n"), ((net_service != NULL) && CFEqual(service, net_service)) ? '>' : ' ', i + 1, serviceName, (int)(30 - CFStringGetLength(serviceName)), " ", serviceID, SCNetworkServiceGetEnabled(service) ? "" : " *DISABLED*"); __show_service_interface(service, " Interface : "); __show_service_protocols(service, " ", TRUE); } return; }
CFStringRef copy_VPN_status(SCNetworkServiceRef service) { CFStringRef output = NULL; SCNetworkConnectionStatus status = kSCNetworkConnectionInvalid; SCNetworkConnectionRef service_connection = NULL; /* Only calculate status is the service is enabled. Default is invalid. */ if (SCNetworkServiceGetEnabled(service)) { service_connection = SCNetworkConnectionCreateWithService(NULL, service, NULL, NULL); if (service_connection == NULL) goto done; status = SCNetworkConnectionGetStatus(service_connection); } output = CFStringCreateWithCString(NULL, nc_status_string(status), kCFStringEncodingUTF8); done: my_CFRelease(&service_connection); return output; }