boolean_t wireless_is_wpa_enterprise(wireless_t wref) { Apple80211Err error; CFDictionaryRef info = NULL; boolean_t is_wpa_enterprise = FALSE; CFNumberRef upper_cf; uint32_t upper; EAPLOG(LOG_ERR, "######## DEBUG ####### - wireless_is_wpa_enterprise"); error = Apple80211CopyValue((Apple80211Ref)wref, APPLE80211_IOC_AUTH_TYPE, NULL, &info); if (error != kA11NoErr) { EAPLOG(LOG_ERR, "Apple80211CopyValue(APPLE80211_IOC_AUTH_TYPE) failed, 0x%x\n", error); goto done; } if (info == NULL) { goto done; } /* size = CFDictionaryGetCount(info); CFTypeRef *keysTypeRef = (CFTypeRef *) malloc( size * sizeof(CFTypeRef) ); CFDictionaryGetKeysAndValues(info, (const void **) keysTypeRef, NULL); const void **keys = (const void **) keysTypeRef; for (int x=0; x < size; x++) { EAPLOG(LOG_ERR, "####### DUMP ###### - %d %d %.3s", x, keys[x], keys[x]); if (isA_CFString(keys[x])) { char *salve = MYCFStringCopyUTF8String(keys[x]); EAPLOG(LOG_ERR, "######## DEBUG ####### - EH UM CFSTRING %s", salve); free(salve); } if (isA_CFNumber(keys[x])) { EAPLOG(LOG_ERR, "######## DEBUG ####### - EH UM CFNUMBER"); } upper_cf = CFDictionaryGetValue(info, keys[x]); if (upper_cf) { if (CFNumberGetValue(upper_cf, kCFNumberSInt32Type, &upper) != FALSE) { switch (upper) { case APPLE80211_AUTHTYPE_WPA: case APPLE80211_AUTHTYPE_WPA2: EAPLOG(LOG_ERR, "##### DEBUG ##### - Numero %d", upper); is_wpa_enterprise = TRUE; break; default: break; } } } } free (keys);*/ upper_cf = CFDictionaryGetValue(info, APPLE80211KEY_AUTH_UPPER); if (upper_cf == NULL) { goto done; } if (CFNumberGetValue(upper_cf, kCFNumberSInt32Type, &upper) == FALSE) { goto done; } switch (upper) { case APPLE80211_AUTHTYPE_WPA: case APPLE80211_AUTHTYPE_WPA2: is_wpa_enterprise = TRUE; break; default: break; } done: my_CFRelease(&info); return (is_wpa_enterprise); }
static CFStringRef pollCurrentNAP (struct service *serv, Boolean *wifiErr) { CFDataRef napDataRef = NULL; CFStringRef nap = NULL; char *interface_buf; CFStringRef interfName = NULL; Apple80211Err err = kA11NoErr; int state; SCLog(TRUE, LOG_INFO, CFSTR("%s:"), __FUNCTION__); // get interface info interface_buf = getVPNInterfaceBuf(serv); // setup update notification (if not already) if (!serv->connection_nap_monitor) { interfName = copyVPNInterfaceName(serv); if (!interfName) { SCLog(TRUE, LOG_INFO, CFSTR("%s: failed to get CF interface name for %s"), __FUNCTION__, interface_buf? interface_buf : "null"); goto init_failed; } err = Apple80211Open((Apple80211Ref *)&serv->connection_nap_monitor); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211Open failed"), __FUNCTION__); *wifiErr = true; goto init_failed; } err = Apple80211BindToInterface((Apple80211Ref)serv->connection_nap_monitor, interfName); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211BindToInterface(%@) failed"), __FUNCTION__, interfName); *wifiErr = true; goto init_failed; } err = Apple80211EventMonitoringInit((Apple80211Ref)serv->connection_nap_monitor, monitorApple80211Callback, (void*)serv, CFRunLoopGetCurrent()); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211EventMonitoringInit(%@) failed, %d"), __FUNCTION__, interfName, err); goto init_failed; } err = Apple80211StartMonitoringEvent((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_M_SSID_CHANGED); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211StartMonitoringEvent(%@) failed, %d"), __FUNCTION__, interfName, err); goto init_failed; } } // get current state err = Apple80211Get((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_IOC_STATE, 0, &state, sizeof(state)); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) failed, err = %d"), __FUNCTION__, interfName, err); *wifiErr = true; goto done; } if (state != APPLE80211_S_ASSOC && state != APPLE80211_S_RUN) { if (state > APPLE80211_S_INIT) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) got invalid state = %d."), __FUNCTION__, interfName, state, WAIT_SSID_TIMEOUT); } goto done; } else { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) got valid state = %d"), __FUNCTION__, interfName, state); } err = Apple80211CopyValue((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_IOC_SSID, NULL, &napDataRef); if (err != kA11NoErr) { SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211CopyValue(%@, SSID) failed, err = %d"), __FUNCTION__, interfName, err); *wifiErr = true; goto done; } nap = CFStringCreateWithBytes(kCFAllocatorDefault, CFDataGetBytePtr(napDataRef), CFDataGetLength(napDataRef), kCFStringEncodingUTF8, false); SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211CopyValue(%@, SSID) got %@"), __FUNCTION__, interfName, nap); if (napDataRef) { CFRelease(napDataRef); } if (interfName) { CFRelease(interfName); } return nap; init_failed: if (serv->connection_nap_monitor) { Apple80211Close((Apple80211Ref)serv->connection_nap_monitor); serv->connection_nap_monitor = NULL; } done: if (nap) { CFRelease(nap); } if (napDataRef) { CFRelease(napDataRef); } if (interfName) { CFRelease(interfName); } return NULL; }