| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <errno.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include <sys/types.h> |
| |
| #define LOG_TAG "WifiNetwork" |
| #include <cutils/log.h> |
| |
| #include "NetworkManager.h" |
| #include "WifiNetwork.h" |
| #include "Supplicant.h" |
| #include "WifiController.h" |
| |
| WifiNetwork::WifiNetwork() { |
| // This is private to restrict copy constructors |
| } |
| |
| WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, const char *data) { |
| mController = c; |
| mSuppl = suppl; |
| |
| char *tmp = strdup(data); |
| char *next = tmp; |
| char *id; |
| char *ssid; |
| char *bssid; |
| char *flags; |
| |
| if (!(id = strsep(&next, "\t"))) |
| LOGE("Failed to extract network id"); |
| if (!(ssid = strsep(&next, "\t"))) |
| LOGE("Failed to extract ssid"); |
| if (!(bssid = strsep(&next, "\t"))) |
| LOGE("Failed to extract bssid"); |
| if (!(flags = strsep(&next, "\t"))) |
| LOGE("Failed to extract flags"); |
| |
| // LOGD("id '%s', ssid '%s', bssid '%s', flags '%s'", id, ssid, bssid, |
| // flags ? flags :"null"); |
| |
| if (id) |
| mNetid = atoi(id); |
| if (ssid) |
| mSsid = strdup(ssid); |
| if (bssid) |
| mBssid = strdup(bssid); |
| |
| mPsk = NULL; |
| memset(mWepKeys, 0, sizeof(mWepKeys)); |
| mDefaultKeyIndex = -1; |
| mPriority = -1; |
| mHiddenSsid = NULL; |
| mKeyManagement = KeyManagementMask::UNKNOWN; |
| mProtocols = 0; |
| mAuthAlgorithms = 0; |
| mPairwiseCiphers = 0; |
| mGroupCiphers = 0; |
| mEnabled = true; |
| |
| if (flags && flags[0] != '\0') { |
| if (!strcmp(flags, "[DISABLED]")) |
| mEnabled = false; |
| else |
| LOGW("Unsupported flags '%s'", flags); |
| } |
| |
| free(tmp); |
| createProperties(); |
| } |
| |
| WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, int networkId) { |
| mController = c; |
| mSuppl = suppl; |
| mNetid = networkId; |
| mSsid = NULL; |
| mBssid = NULL; |
| mPsk = NULL; |
| memset(mWepKeys, 0, sizeof(mWepKeys)); |
| mDefaultKeyIndex = -1; |
| mPriority = -1; |
| mHiddenSsid = NULL; |
| mKeyManagement = 0; |
| mProtocols = 0; |
| mAuthAlgorithms = 0; |
| mPairwiseCiphers = 0; |
| mGroupCiphers = 0; |
| mEnabled = false; |
| createProperties(); |
| } |
| |
| WifiNetwork *WifiNetwork::clone() { |
| WifiNetwork *r = new WifiNetwork(); |
| |
| r->mSuppl = mSuppl; |
| r->mNetid = mNetid; |
| |
| if (mSsid) |
| r->mSsid = strdup(mSsid); |
| if (mBssid) |
| r->mBssid = strdup(mBssid); |
| if (mPsk) |
| r->mPsk = strdup(mPsk); |
| |
| r->mController = mController; |
| memcpy(r->mWepKeys, mWepKeys, sizeof(mWepKeys)); |
| r->mDefaultKeyIndex = mDefaultKeyIndex; |
| r->mPriority = mPriority; |
| if (mHiddenSsid) |
| r->mHiddenSsid = strdup(mHiddenSsid); |
| r->mKeyManagement = mKeyManagement; |
| r->mProtocols = mProtocols; |
| r->mAuthAlgorithms = mAuthAlgorithms; |
| r->mPairwiseCiphers = mPairwiseCiphers; |
| r->mGroupCiphers = mGroupCiphers; |
| return r; |
| } |
| |
| void WifiNetwork::createProperties() { |
| asprintf(&mPropNamespace, "wifi.net.%d", mNetid); |
| |
| mStaticProperties.propEnabled = new WifiNetworkEnabledProperty(this); |
| mStaticProperties.propSsid = new WifiNetworkSsidProperty(this); |
| mStaticProperties.propBssid = new WifiNetworkBssidProperty(this); |
| mStaticProperties.propPsk = new WifiNetworkPskProperty(this); |
| mStaticProperties.propWepKey = new WifiNetworkWepKeyProperty(this); |
| mStaticProperties.propDefKeyIdx = new WifiNetworkDefaultKeyIndexProperty(this); |
| mStaticProperties.propPriority = new WifiNetworkPriorityProperty(this); |
| mStaticProperties.propKeyManagement = new WifiNetworkKeyManagementProperty(this); |
| mStaticProperties.propProtocols = new WifiNetworkProtocolsProperty(this); |
| mStaticProperties.propAuthAlgorithms = new WifiNetworkAuthAlgorithmsProperty(this); |
| mStaticProperties.propPairwiseCiphers = new WifiNetworkPairwiseCiphersProperty(this); |
| mStaticProperties.propGroupCiphers = new WifiNetworkGroupCiphersProperty(this); |
| mStaticProperties.propHiddenSsid = new WifiNetworkHiddenSsidProperty(this); |
| } |
| |
| WifiNetwork::~WifiNetwork() { |
| if (mPropNamespace) |
| free(mPropNamespace); |
| if (mSsid) |
| free(mSsid); |
| if (mBssid) |
| free(mBssid); |
| if (mPsk) |
| free(mPsk); |
| for (int i = 0; i < 4; i++) { |
| if (mWepKeys[i]) |
| free(mWepKeys[i]); |
| } |
| |
| if (mHiddenSsid) |
| free(mHiddenSsid); |
| |
| delete mStaticProperties.propEnabled; |
| delete mStaticProperties.propSsid; |
| delete mStaticProperties.propBssid; |
| delete mStaticProperties.propPsk; |
| delete mStaticProperties.propWepKey; |
| delete mStaticProperties.propDefKeyIdx; |
| delete mStaticProperties.propPriority; |
| delete mStaticProperties.propKeyManagement; |
| delete mStaticProperties.propProtocols; |
| delete mStaticProperties.propAuthAlgorithms; |
| delete mStaticProperties.propPairwiseCiphers; |
| delete mStaticProperties.propGroupCiphers; |
| delete mStaticProperties.propHiddenSsid; |
| } |
| |
| int WifiNetwork::refresh() { |
| char buffer[255]; |
| size_t len; |
| uint32_t mask; |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "psk", buffer, len)) |
| mPsk = strdup(buffer); |
| |
| for (int i = 0; i < 4; i++) { |
| char *name; |
| |
| asprintf(&name, "wep_key%d", i); |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, name, buffer, len)) |
| mWepKeys[i] = strdup(buffer); |
| free(name); |
| } |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "wep_tx_keyidx", buffer, len)) |
| mDefaultKeyIndex = atoi(buffer); |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "priority", buffer, len)) |
| mPriority = atoi(buffer); |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "scan_ssid", buffer, len)) |
| mHiddenSsid = strdup(buffer); |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "key_mgmt", buffer, len)) { |
| if (WifiNetwork::parseKeyManagementMask(buffer, &mask)) { |
| LOGE("Error parsing key_mgmt (%s)", strerror(errno)); |
| } else { |
| mKeyManagement = mask; |
| } |
| } |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "proto", buffer, len)) { |
| if (WifiNetwork::parseProtocolsMask(buffer, &mask)) { |
| LOGE("Error parsing proto (%s)", strerror(errno)); |
| } else { |
| mProtocols = mask; |
| } |
| } |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "auth_alg", buffer, len)) { |
| if (WifiNetwork::parseAuthAlgorithmsMask(buffer, &mask)) { |
| LOGE("Error parsing auth_alg (%s)", strerror(errno)); |
| } else { |
| mAuthAlgorithms = mask; |
| } |
| } |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "pairwise", buffer, len)) { |
| if (WifiNetwork::parsePairwiseCiphersMask(buffer, &mask)) { |
| LOGE("Error parsing pairwise (%s)", strerror(errno)); |
| } else { |
| mPairwiseCiphers = mask; |
| } |
| } |
| |
| len = sizeof(buffer); |
| if (mSuppl->getNetworkVar(mNetid, "group", buffer, len)) { |
| if (WifiNetwork::parseGroupCiphersMask(buffer, &mask)) { |
| LOGE("Error parsing group (%s)", strerror(errno)); |
| } else { |
| mGroupCiphers = mask; |
| } |
| } |
| |
| return 0; |
| out_err: |
| LOGE("Refresh failed (%s)",strerror(errno)); |
| return -1; |
| } |
| |
| int WifiNetwork::setSsid(const char *ssid) { |
| char tmp[255]; |
| snprintf(tmp, sizeof(tmp), "\"%s\"", ssid); |
| if (mSuppl->setNetworkVar(mNetid, "ssid", tmp)) |
| return -1; |
| if (mSsid) |
| free(mSsid); |
| mSsid = strdup(ssid); |
| return 0; |
| } |
| |
| int WifiNetwork::setBssid(const char *bssid) { |
| if (mSuppl->setNetworkVar(mNetid, "bssid", bssid)) |
| return -1; |
| if (mBssid) |
| free(mBssid); |
| mBssid = strdup(bssid); |
| return 0; |
| } |
| |
| int WifiNetwork::setPsk(const char *psk) { |
| char tmp[255]; |
| snprintf(tmp, sizeof(tmp), "\"%s\"", psk); |
| if (mSuppl->setNetworkVar(mNetid, "psk", tmp)) |
| return -1; |
| |
| if (mPsk) |
| free(mPsk); |
| mPsk = strdup(psk); |
| return 0; |
| } |
| |
| int WifiNetwork::setWepKey(int idx, const char *key) { |
| char *name; |
| |
| asprintf(&name, "wep_key%d", idx); |
| int rc = mSuppl->setNetworkVar(mNetid, name, key); |
| free(name); |
| |
| if (rc) |
| return -1; |
| |
| if (mWepKeys[idx]) |
| free(mWepKeys[idx]); |
| mWepKeys[idx] = strdup(key); |
| return 0; |
| } |
| |
| int WifiNetwork::setDefaultKeyIndex(int idx) { |
| char val[16]; |
| sprintf(val, "%d", idx); |
| if (mSuppl->setNetworkVar(mNetid, "wep_tx_keyidx", val)) |
| return -1; |
| |
| mDefaultKeyIndex = idx; |
| return 0; |
| } |
| |
| int WifiNetwork::setPriority(int priority) { |
| char val[16]; |
| sprintf(val, "%d", priority); |
| if (mSuppl->setNetworkVar(mNetid, "priority", val)) |
| return -1; |
| |
| mPriority = priority; |
| return 0; |
| } |
| |
| int WifiNetwork::setHiddenSsid(const char *ssid) { |
| if (mSuppl->setNetworkVar(mNetid, "scan_ssid", ssid)) |
| return -1; |
| |
| if (mHiddenSsid) |
| free(mHiddenSsid); |
| mHiddenSsid = strdup(ssid); |
| return 0; |
| } |
| |
| int WifiNetwork::setKeyManagement(uint32_t mask) { |
| char accum[64] = {'\0'}; |
| |
| if (mask == KeyManagementMask::NONE) |
| strcpy(accum, "NONE"); |
| else { |
| if (mask & KeyManagementMask::WPA_PSK) |
| strcat(accum, "WPA-PSK"); |
| if (mask & KeyManagementMask::WPA_EAP) { |
| if (accum[0] != '\0') |
| strcat(accum, " "); |
| strcat(accum, "WPA-EAP"); |
| } |
| if (mask & KeyManagementMask::IEEE8021X) { |
| if (accum[0] != '\0') |
| strcat(accum, " "); |
| strcat(accum, "IEEE8021X"); |
| } |
| } |
| |
| if (mSuppl->setNetworkVar(mNetid, "key_mgmt", accum)) |
| return -1; |
| mKeyManagement = mask; |
| return 0; |
| } |
| |
| int WifiNetwork::setProtocols(uint32_t mask) { |
| char accum[64]; |
| |
| accum[0] = '\0'; |
| |
| if (mask & SecurityProtocolMask::WPA) |
| strcpy(accum, "WPA "); |
| |
| if (mask & SecurityProtocolMask::RSN) |
| strcat(accum, "RSN"); |
| |
| if (mSuppl->setNetworkVar(mNetid, "proto", accum)) |
| return -1; |
| mProtocols = mask; |
| return 0; |
| } |
| |
| int WifiNetwork::setAuthAlgorithms(uint32_t mask) { |
| char accum[64]; |
| |
| accum[0] = '\0'; |
| |
| if (mask == 0) |
| strcpy(accum, ""); |
| |
| if (mask & AuthenticationAlgorithmMask::OPEN) |
| strcpy(accum, "OPEN "); |
| |
| if (mask & AuthenticationAlgorithmMask::SHARED) |
| strcat(accum, "SHARED "); |
| |
| if (mask & AuthenticationAlgorithmMask::LEAP) |
| strcat(accum, "LEAP "); |
| |
| if (mSuppl->setNetworkVar(mNetid, "auth_alg", accum)) |
| return -1; |
| |
| mAuthAlgorithms = mask; |
| return 0; |
| } |
| |
| int WifiNetwork::setPairwiseCiphers(uint32_t mask) { |
| char accum[64]; |
| |
| accum[0] = '\0'; |
| |
| if (mask == PairwiseCiphersMask::NONE) |
| strcpy(accum, "NONE"); |
| else { |
| if (mask & PairwiseCiphersMask::TKIP) |
| strcat(accum, "TKIP "); |
| if (mask & PairwiseCiphersMask::CCMP) |
| strcat(accum, "CCMP "); |
| } |
| |
| if (mSuppl->setNetworkVar(mNetid, "pairwise", accum)) |
| return -1; |
| |
| mPairwiseCiphers = mask; |
| return 0; |
| } |
| |
| int WifiNetwork::setGroupCiphers(uint32_t mask) { |
| char accum[64]; |
| |
| accum[0] = '\0'; |
| |
| if (mask & GroupCiphersMask::WEP40) |
| strcat(accum, "WEP40 "); |
| if (mask & GroupCiphersMask::WEP104) |
| strcat(accum, "WEP104 "); |
| if (mask & GroupCiphersMask::TKIP) |
| strcat(accum, "TKIP "); |
| if (mask & GroupCiphersMask::CCMP) |
| strcat(accum, "CCMP "); |
| |
| if (mSuppl->setNetworkVar(mNetid, "group", accum)) |
| return -1; |
| mGroupCiphers = mask; |
| return 0; |
| } |
| |
| int WifiNetwork::setEnabled(bool enabled) { |
| |
| if (enabled) { |
| if (getPriority() == -1) { |
| LOGE("Cannot enable network when priority is not set"); |
| errno = EAGAIN; |
| return -1; |
| } |
| if (getKeyManagement() == KeyManagementMask::UNKNOWN) { |
| LOGE("Cannot enable network when KeyManagement is not set"); |
| errno = EAGAIN; |
| return -1; |
| } |
| } |
| |
| if (mSuppl->enableNetwork(mNetid, enabled)) |
| return -1; |
| |
| mEnabled = enabled; |
| return 0; |
| } |
| |
| int WifiNetwork::attachProperties(PropertyManager *pm, const char *nsName) { |
| pm->attachProperty(nsName, mStaticProperties.propSsid); |
| pm->attachProperty(nsName, mStaticProperties.propBssid); |
| pm->attachProperty(nsName, mStaticProperties.propPsk); |
| pm->attachProperty(nsName, mStaticProperties.propWepKey); |
| pm->attachProperty(nsName, mStaticProperties.propDefKeyIdx); |
| pm->attachProperty(nsName, mStaticProperties.propPriority); |
| pm->attachProperty(nsName, mStaticProperties.propKeyManagement); |
| pm->attachProperty(nsName, mStaticProperties.propProtocols); |
| pm->attachProperty(nsName, mStaticProperties.propAuthAlgorithms); |
| pm->attachProperty(nsName, mStaticProperties.propPairwiseCiphers); |
| pm->attachProperty(nsName, mStaticProperties.propGroupCiphers); |
| pm->attachProperty(nsName, mStaticProperties.propHiddenSsid); |
| pm->attachProperty(nsName, mStaticProperties.propEnabled); |
| return 0; |
| } |
| |
| int WifiNetwork::detachProperties(PropertyManager *pm, const char *nsName) { |
| pm->detachProperty(nsName, mStaticProperties.propEnabled); |
| pm->detachProperty(nsName, mStaticProperties.propSsid); |
| pm->detachProperty(nsName, mStaticProperties.propBssid); |
| pm->detachProperty(nsName, mStaticProperties.propPsk); |
| pm->detachProperty(nsName, mStaticProperties.propWepKey); |
| pm->detachProperty(nsName, mStaticProperties.propDefKeyIdx); |
| pm->detachProperty(nsName, mStaticProperties.propPriority); |
| pm->detachProperty(nsName, mStaticProperties.propKeyManagement); |
| pm->detachProperty(nsName, mStaticProperties.propProtocols); |
| pm->detachProperty(nsName, mStaticProperties.propAuthAlgorithms); |
| pm->detachProperty(nsName, mStaticProperties.propPairwiseCiphers); |
| pm->detachProperty(nsName, mStaticProperties.propGroupCiphers); |
| pm->detachProperty(nsName, mStaticProperties.propHiddenSsid); |
| return 0; |
| } |
| |
| int WifiNetwork::parseKeyManagementMask(const char *buffer, uint32_t *mask) { |
| bool none = false; |
| char *v_tmp = strdup(buffer); |
| char *v_next = v_tmp; |
| char *v_token; |
| |
| // LOGD("parseKeyManagementMask(%s)", buffer); |
| *mask = 0; |
| |
| while((v_token = strsep(&v_next, " "))) { |
| if (!strcasecmp(v_token, "NONE")) { |
| *mask = KeyManagementMask::NONE; |
| none = true; |
| } else if (!none) { |
| if (!strcasecmp(v_token, "WPA-PSK")) |
| *mask |= KeyManagementMask::WPA_PSK; |
| else if (!strcasecmp(v_token, "WPA-EAP")) |
| *mask |= KeyManagementMask::WPA_EAP; |
| else if (!strcasecmp(v_token, "IEEE8021X")) |
| *mask |= KeyManagementMask::IEEE8021X; |
| else { |
| LOGW("Invalid KeyManagementMask value '%s'", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } else { |
| LOGW("KeyManagementMask value '%s' when NONE", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } |
| free(v_tmp); |
| return 0; |
| } |
| |
| int WifiNetwork::parseProtocolsMask(const char *buffer, uint32_t *mask) { |
| bool none = false; |
| char *v_tmp = strdup(buffer); |
| char *v_next = v_tmp; |
| char *v_token; |
| |
| // LOGD("parseProtocolsMask(%s)", buffer); |
| *mask = 0; |
| while((v_token = strsep(&v_next, " "))) { |
| if (!strcasecmp(v_token, "WPA")) |
| *mask |= SecurityProtocolMask::WPA; |
| else if (!strcasecmp(v_token, "RSN")) |
| *mask |= SecurityProtocolMask::RSN; |
| else { |
| LOGW("Invalid ProtocolsMask value '%s'", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } |
| |
| free(v_tmp); |
| return 0; |
| } |
| |
| int WifiNetwork::parseAuthAlgorithmsMask(const char *buffer, uint32_t *mask) { |
| bool none = false; |
| char *v_tmp = strdup(buffer); |
| char *v_next = v_tmp; |
| char *v_token; |
| |
| // LOGD("parseAuthAlgorithmsMask(%s)", buffer); |
| |
| *mask = 0; |
| if (buffer[0] == '\0') |
| return 0; |
| |
| while((v_token = strsep(&v_next, " "))) { |
| if (!strcasecmp(v_token, "OPEN")) |
| *mask |= AuthenticationAlgorithmMask::OPEN; |
| else if (!strcasecmp(v_token, "SHARED")) |
| *mask |= AuthenticationAlgorithmMask::SHARED; |
| else if (!strcasecmp(v_token, "LEAP")) |
| *mask |= AuthenticationAlgorithmMask::LEAP; |
| else { |
| LOGW("Invalid AuthAlgorithmsMask value '%s'", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } |
| free(v_tmp); |
| return 0; |
| } |
| |
| int WifiNetwork::parsePairwiseCiphersMask(const char *buffer, uint32_t *mask) { |
| bool none = false; |
| char *v_tmp = strdup(buffer); |
| char *v_next = v_tmp; |
| char *v_token; |
| |
| // LOGD("parsePairwiseCiphersMask(%s)", buffer); |
| |
| *mask = 0; |
| while((v_token = strsep(&v_next, " "))) { |
| if (!strcasecmp(v_token, "NONE")) { |
| *mask = PairwiseCiphersMask::NONE; |
| none = true; |
| } else if (!none) { |
| if (!strcasecmp(v_token, "TKIP")) |
| *mask |= PairwiseCiphersMask::TKIP; |
| else if (!strcasecmp(v_token, "CCMP")) |
| *mask |= PairwiseCiphersMask::CCMP; |
| else { |
| LOGW("PairwiseCiphersMask value '%s' when NONE", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } else { |
| LOGW("Invalid PairwiseCiphersMask value '%s'", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } |
| free(v_tmp); |
| return 0; |
| } |
| |
| int WifiNetwork::parseGroupCiphersMask(const char *buffer, uint32_t *mask) { |
| bool none = false; |
| char *v_tmp = strdup(buffer); |
| char *v_next = v_tmp; |
| char *v_token; |
| |
| // LOGD("parseGroupCiphersMask(%s)", buffer); |
| |
| *mask = 0; |
| while((v_token = strsep(&v_next, " "))) { |
| if (!strcasecmp(v_token, "WEP40")) |
| *mask |= GroupCiphersMask::WEP40; |
| else if (!strcasecmp(v_token, "WEP104")) |
| *mask |= GroupCiphersMask::WEP104; |
| else if (!strcasecmp(v_token, "TKIP")) |
| *mask |= GroupCiphersMask::TKIP; |
| else if (!strcasecmp(v_token, "CCMP")) |
| *mask |= GroupCiphersMask::CCMP; |
| else { |
| LOGW("Invalid GroupCiphersMask value '%s'", v_token); |
| errno = EINVAL; |
| free(v_tmp); |
| return -1; |
| } |
| } |
| free(v_tmp); |
| return 0; |
| } |
| |
| WifiNetwork::WifiNetworkIntegerProperty::WifiNetworkIntegerProperty(WifiNetwork *wn, |
| const char *name, |
| bool ro, |
| int elements) : |
| IntegerProperty(name, ro, elements) { |
| mWn = wn; |
| } |
| |
| WifiNetwork::WifiNetworkStringProperty::WifiNetworkStringProperty(WifiNetwork *wn, |
| const char *name, |
| bool ro, int elements) : |
| StringProperty(name, ro, elements) { |
| mWn = wn; |
| } |
| |
| WifiNetwork::WifiNetworkEnabledProperty::WifiNetworkEnabledProperty(WifiNetwork *wn) : |
| WifiNetworkIntegerProperty(wn, "Enabled", false, 1) { |
| } |
| |
| int WifiNetwork::WifiNetworkEnabledProperty::get(int idx, int *buffer) { |
| *buffer = mWn->mEnabled; |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkEnabledProperty::set(int idx, int value) { |
| return mWn->setEnabled(value == 1); |
| } |
| |
| WifiNetwork::WifiNetworkSsidProperty::WifiNetworkSsidProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "Ssid", false, 1) { |
| } |
| |
| int WifiNetwork::WifiNetworkSsidProperty::get(int idx, char *buffer, size_t max) { |
| strncpy(buffer, |
| mWn->getSsid() ? mWn->getSsid() : "none", |
| max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkSsidProperty::set(int idx, const char *value) { |
| return mWn->setSsid(value); |
| } |
| |
| WifiNetwork::WifiNetworkBssidProperty::WifiNetworkBssidProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "Bssid", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkBssidProperty::get(int idx, char *buffer, size_t max) { |
| strncpy(buffer, |
| mWn->getBssid() ? mWn->getBssid() : "none", |
| max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkBssidProperty::set(int idx, const char *value) { |
| return mWn->setBssid(value); |
| } |
| |
| WifiNetwork::WifiNetworkPskProperty::WifiNetworkPskProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "Psk", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkPskProperty::get(int idx, char *buffer, size_t max) { |
| strncpy(buffer, |
| mWn->getPsk() ? mWn->getPsk() : "none", |
| max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkPskProperty::set(int idx, const char *value) { |
| return mWn->setPsk(value); |
| } |
| |
| WifiNetwork::WifiNetworkWepKeyProperty::WifiNetworkWepKeyProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "WepKey", false, 4) { |
| } |
| |
| int WifiNetwork::WifiNetworkWepKeyProperty::get(int idx, char *buffer, size_t max) { |
| const char *key = mWn->getWepKey(idx); |
| |
| strncpy(buffer, (key ? key : "none"), max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkWepKeyProperty::set(int idx, const char *value) { |
| return mWn->setWepKey(idx, value); |
| } |
| |
| WifiNetwork::WifiNetworkDefaultKeyIndexProperty::WifiNetworkDefaultKeyIndexProperty(WifiNetwork *wn) : |
| WifiNetworkIntegerProperty(wn, "DefaultKeyIndex", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkDefaultKeyIndexProperty::get(int idx, int *buffer) { |
| *buffer = mWn->getDefaultKeyIndex(); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkDefaultKeyIndexProperty::set(int idx, int value) { |
| return mWn->setDefaultKeyIndex(value); |
| } |
| |
| WifiNetwork::WifiNetworkPriorityProperty::WifiNetworkPriorityProperty(WifiNetwork *wn) : |
| WifiNetworkIntegerProperty(wn, "Priority", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkPriorityProperty::get(int idx, int *buffer) { |
| *buffer = mWn->getPriority(); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkPriorityProperty::set(int idx, int value) { |
| return mWn->setPriority(value); |
| } |
| |
| WifiNetwork::WifiNetworkKeyManagementProperty::WifiNetworkKeyManagementProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "KeyManagement", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkKeyManagementProperty::get(int idx, char *buffer, size_t max) { |
| |
| if (mWn->getKeyManagement() == KeyManagementMask::NONE) |
| strncpy(buffer, "NONE", max); |
| else { |
| char tmp[80] = { '\0' }; |
| |
| if (mWn->getKeyManagement() & KeyManagementMask::WPA_PSK) |
| strcat(tmp, "WPA-PSK"); |
| if (mWn->getKeyManagement() & KeyManagementMask::WPA_EAP) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "WPA-EAP"); |
| } |
| if (mWn->getKeyManagement() & KeyManagementMask::IEEE8021X) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "IEEE8021X"); |
| } |
| if (tmp[0] == '\0') { |
| strncpy(buffer, "(internal error)", max); |
| errno = ENOENT; |
| return -1; |
| } |
| if (tmp[strlen(tmp)] == ' ') |
| tmp[strlen(tmp)] = '\0'; |
| |
| strncpy(buffer, tmp, max); |
| } |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkKeyManagementProperty::set(int idx, const char *value) { |
| uint32_t mask; |
| if (mWn->parseKeyManagementMask(value, &mask)) |
| return -1; |
| return mWn->setKeyManagement(mask); |
| } |
| |
| WifiNetwork::WifiNetworkProtocolsProperty::WifiNetworkProtocolsProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "Protocols", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkProtocolsProperty::get(int idx, char *buffer, size_t max) { |
| char tmp[80] = { '\0' }; |
| |
| if (mWn->getProtocols() & SecurityProtocolMask::WPA) |
| strcat(tmp, "WPA"); |
| if (mWn->getProtocols() & SecurityProtocolMask::RSN) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "RSN"); |
| } |
| |
| if (tmp[0] == '\0') { |
| strncpy(buffer, "(internal error)", max); |
| errno = ENOENT; |
| return NULL; |
| } |
| if (tmp[strlen(tmp)] == ' ') |
| tmp[strlen(tmp)] = '\0'; |
| |
| strncpy(buffer, tmp, max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkProtocolsProperty::set(int idx, const char *value) { |
| uint32_t mask; |
| if (mWn->parseProtocolsMask(value, &mask)) |
| return -1; |
| return mWn->setProtocols(mask); |
| } |
| |
| WifiNetwork::WifiNetworkAuthAlgorithmsProperty::WifiNetworkAuthAlgorithmsProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "AuthAlgorithms", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkAuthAlgorithmsProperty::get(int idx, char *buffer, size_t max) { |
| char tmp[80] = { '\0' }; |
| |
| if (mWn->getAuthAlgorithms() == 0) { |
| strncpy(buffer, "NONE", max); |
| return 0; |
| } |
| |
| if (mWn->getAuthAlgorithms() & AuthenticationAlgorithmMask::OPEN) |
| strcat(tmp, "OPEN"); |
| if (mWn->getAuthAlgorithms() & AuthenticationAlgorithmMask::SHARED) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "SHARED"); |
| } |
| if (mWn->getAuthAlgorithms() & AuthenticationAlgorithmMask::LEAP) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "LEAP"); |
| } |
| |
| if (tmp[0] == '\0') { |
| strncpy(buffer, "(internal error)", max); |
| errno = ENOENT; |
| return NULL; |
| } |
| if (tmp[strlen(tmp)] == ' ') |
| tmp[strlen(tmp)] = '\0'; |
| |
| strncpy(buffer, tmp, max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkAuthAlgorithmsProperty::set(int idx, const char *value) { |
| uint32_t mask; |
| if (mWn->parseAuthAlgorithmsMask(value, &mask)) |
| return -1; |
| return mWn->setAuthAlgorithms(mask); |
| } |
| |
| WifiNetwork::WifiNetworkPairwiseCiphersProperty::WifiNetworkPairwiseCiphersProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "PairwiseCiphers", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkPairwiseCiphersProperty::get(int idx, char *buffer, size_t max) { |
| if (mWn->getPairwiseCiphers() == PairwiseCiphersMask::NONE) |
| strncpy(buffer, "NONE", max); |
| else { |
| char tmp[80] = { '\0' }; |
| |
| if (mWn->getPairwiseCiphers() & PairwiseCiphersMask::TKIP) |
| strcat(tmp, "TKIP"); |
| if (mWn->getPairwiseCiphers() & PairwiseCiphersMask::CCMP) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "CCMP"); |
| } |
| if (tmp[0] == '\0') { |
| strncpy(buffer, "(internal error)", max); |
| errno = ENOENT; |
| return NULL; |
| } |
| if (tmp[strlen(tmp)] == ' ') |
| tmp[strlen(tmp)] = '\0'; |
| |
| strncpy(buffer, tmp, max); |
| } |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkPairwiseCiphersProperty::set(int idx, const char *value) { |
| uint32_t mask; |
| if (mWn->parsePairwiseCiphersMask(value, &mask)) |
| return -1; |
| return mWn->setPairwiseCiphers(mask); |
| } |
| |
| WifiNetwork::WifiNetworkGroupCiphersProperty::WifiNetworkGroupCiphersProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "GroupCiphers", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkGroupCiphersProperty::get(int idx, char *buffer, size_t max) { |
| char tmp[80] = { '\0' }; |
| |
| if (mWn->getGroupCiphers() & GroupCiphersMask::WEP40) |
| strcat(tmp, "WEP40"); |
| if (mWn->getGroupCiphers() & GroupCiphersMask::WEP104) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "WEP104"); |
| } |
| if (mWn->getGroupCiphers() & GroupCiphersMask::TKIP) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "TKIP"); |
| } |
| if (mWn->getGroupCiphers() & GroupCiphersMask::CCMP) { |
| if (tmp[0] != '\0') |
| strcat(tmp, " "); |
| strcat(tmp, "CCMP"); |
| } |
| |
| if (tmp[0] == '\0') { |
| strncpy(buffer, "(internal error)", max); |
| errno = ENOENT; |
| return -1; |
| } |
| if (tmp[strlen(tmp)] == ' ') |
| tmp[strlen(tmp)] = '\0'; |
| |
| strncpy(buffer, tmp, max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkGroupCiphersProperty::set(int idx, const char *value) { |
| uint32_t mask; |
| if (mWn->parseGroupCiphersMask(value, &mask)) |
| return -1; |
| return mWn->setGroupCiphers(mask); |
| } |
| |
| WifiNetwork::WifiNetworkHiddenSsidProperty::WifiNetworkHiddenSsidProperty(WifiNetwork *wn) : |
| WifiNetworkStringProperty(wn, "HiddenSsid", false, 1) { |
| } |
| int WifiNetwork::WifiNetworkHiddenSsidProperty::get(int idx, char *buffer, size_t max) { |
| const char *scan_ssid = mWn->getHiddenSsid(); |
| |
| strncpy(buffer, (scan_ssid ? scan_ssid : "none"), max); |
| return 0; |
| } |
| int WifiNetwork::WifiNetworkHiddenSsidProperty::set(int idx, const char *value) { |
| return mWn->setHiddenSsid(value); |
| } |