From 9aeef1a04ae5331dc5068ac48eb8df8ec1673577 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Tue, 24 Nov 2015 00:53:40 +0000 Subject: [PATCH] Revert "MAC address parsing" as per info from Thiago Macieira This reverts commit 5a27b9c30d54d4e92f0a86dc6cb05ea20b6fb296. Change-Id: I12dc5db3c8319b38e23e5580f2875c13e6428e4e Signed-off-by: Jon A. Cruz Reviewed-on: https://gerrit.iotivity.org/gerrit/4321 Tested-by: jenkins-iotivity --- resource/csdk/stack/include/octypes.h | 3 - resource/src/OCResource.cpp | 280 ++++------------------------------ 2 files changed, 32 insertions(+), 251 deletions(-) diff --git a/resource/csdk/stack/include/octypes.h b/resource/csdk/stack/include/octypes.h index 1b98443..45beceb 100644 --- a/resource/csdk/stack/include/octypes.h +++ b/resource/csdk/stack/include/octypes.h @@ -272,9 +272,6 @@ extern "C" { #define MAX_ADDR_STR_SIZE (40) #endif -/** Length of MAC address */ -#define MAC_ADDR_STR_SIZE (17) - /** Max identity size. */ #define MAX_IDENTITY_SIZE (32) diff --git a/resource/src/OCResource.cpp b/resource/src/OCResource.cpp index 52fdfa8..47bb950 100644 --- a/resource/src/OCResource.cpp +++ b/resource/src/OCResource.cpp @@ -134,282 +134,66 @@ void OCResource::setHost(const std::string& host) m_interfaces.empty(), m_clientWrapper.expired(), false, false); } - // removed 'coap://' or 'coaps://' or 'coap+tcp://' + // removed coap:// or coaps:// or coap+tcp:// std::string host_token = host.substr(prefix_len); - if (host_token[0] == '[') // ipv6 address + if(host_token[0] == '[') { - m_devAddr.flags = static_cast< OCTransportFlags >(m_devAddr.flags & OC_IP_USE_V6); + m_devAddr.flags = static_cast(m_devAddr.flags & OC_IP_USE_V6); size_t found = host_token.find(']'); - if (found == std::string::npos || found == 0) + if(found == std::string::npos || found == 0) { throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); + m_interfaces.empty(), m_clientWrapper.expired(), false, false); } - // extract the ipv6 address - std::string ip6Addr = host_token.substr(1, found - 1); + // extract the ipaddress + std::string ip6Addr = host_token.substr(1, found-1); - size_t addrLength = ip6Addr.length(); - - if (MAX_ADDR_STR_SIZE <= addrLength) + if (ip6Addr.length() >= MAX_ADDR_STR_SIZE) { throw std::length_error("host address is too long."); } - // address validity check - size_t colon = ip6Addr.find(':'); - - if (std::string::npos == colon) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - size_t colonCnt = 1; - int omittedColon = -2; - - while (std::string::npos != colon) - { - size_t nextColon = ip6Addr.find(':', colon + 1); - - if (nextColon == colon + 1) - { - if (0 < omittedColon) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - omittedColon = colon; - } - - colon = nextColon; - - if (7 < colonCnt++) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - } + ip6Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); + m_devAddr.addr[ip6Addr.length()] = '\0'; + //skip ']' and ':' characters in host string + host_token = host_token.substr(found + 2); + } + else + { + size_t found = host_token.find(':'); - if (7 >= colonCnt && 0 > omittedColon) + if(found == std::string::npos || found == 0) { throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); + m_interfaces.empty(), m_clientWrapper.expired(), false, false); } - size_t startPoint = 0; + std::string addrPart = host_token.substr(0, found); - if (0 == omittedColon) + if (addrPart.length() >= MAX_ADDR_STR_SIZE) { - startPoint = 2; - } - - while (1) - { - std::string block; - colon = ip6Addr.find(':', startPoint); - - if (std::string::npos != colon) - { - block = ip6Addr.substr(startPoint, colon - startPoint); - - if (4 < block.length() || - std::string::npos != block.find_first_not_of("0123456789ABCDEFabcdef") || - 0 == block.length()) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - startPoint = colon + 1; - } - else - { - block = ip6Addr.substr(startPoint); - - if (4 < block.length() || - std::string::npos != block.find_first_not_of("0123456789ABCDEFabcdef") || - 0 == block.length()) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - break; - } - - if ((int)colon == omittedColon) - { - if (colon == addrLength - 2) - { - break; - } - startPoint = colon + 2; - continue; - } - + throw std::length_error("host address is too long."); } - // end of address validity check - ip6Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); - m_devAddr.addr[ip6Addr.length()] = '\0'; - //skip ']' and ':' characters in host string - host_token = host_token.substr(found + 2); - - int port = std::stoi(host_token); + addrPart.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); + m_devAddr.addr[addrPart.length()] = '\0'; + //skip ':' character in host string + host_token = host_token.substr(found + 1); + } - if (0 > port || UINT16_MAX < port) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } + int port = std::stoi(host_token); - m_devAddr.port = static_cast< uint16_t >(port); - } - else if (host_token[0] == ':') + if( port < 0 || port > UINT16_MAX ) { throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - else - { - size_t dot = host_token.find('.'); - if (dot == std::string::npos) // MAC address - { - std::string macAddr = host_token; - - // address validity check - if (MAC_ADDR_STR_SIZE != macAddr.length()) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - for (size_t blockCnt = 0; blockCnt < 6; blockCnt++) - { - std::string block = macAddr.substr(blockCnt * 3, 2); - - if (std::string::npos != block.find_first_not_of("0123456789ABCDEFabcdef")) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - if (5 > blockCnt) - { - char delimiter = macAddr[blockCnt * 3 + 2]; - - if (':' != delimiter || '-' != delimiter) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), - false, false); - } - } - } - // end of address validity check - - macAddr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); - m_devAddr.addr[macAddr.length()] = '\0'; - } - else // ipv4 address - { - size_t colon = host_token.find(':'); - - if (colon == std::string::npos) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - std::string ip4Addr = host_token.substr(0, colon); - size_t addrLength = ip4Addr.length(); - - if (MAX_ADDR_STR_SIZE <= addrLength) - { - throw std::length_error("host address is too long."); - } - - // address validity check - size_t startPoint = 0; - - for (size_t blockCnt = 1; blockCnt <= 4; blockCnt++) - { - size_t dot = ip4Addr.find('.', startPoint); - std::string addrBlock; - - if (4 > blockCnt) - { - if (std::string::npos == dot || dot <= startPoint) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), - false, false); - } - addrBlock = ip4Addr.substr(startPoint, dot - startPoint); - } - else - { - if (std::string::npos != dot) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), - false, false); - } - addrBlock = ip4Addr.substr(startPoint, colon - startPoint); - } - - int i_addrBlock = std::stoi(addrBlock); - - if (std::string::npos != addrBlock.find_first_not_of("0123456789") || - 0 > i_addrBlock || 255 < i_addrBlock) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - startPoint = dot + 1; - - if (addrLength <= startPoint) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - } - // end of address validity check - - ip4Addr.copy(m_devAddr.addr, sizeof(m_devAddr.addr)); - m_devAddr.addr[ip4Addr.length()] = '\0'; - //skip ':' character in host string - host_token = host_token.substr(colon + 1); - - int port = std::stoi(host_token); - - if (0 > port || UINT16_MAX < port) - { - throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), - m_interfaces.empty(), m_clientWrapper.expired(), false, - false); - } - - m_devAddr.port = static_cast< uint16_t >(port); - } + m_interfaces.empty(), m_clientWrapper.expired(), false, false); } + + m_devAddr.port = static_cast(port); + } OCStackResult OCResource::get(const QueryParamsMap& queryParametersMap, -- 2.7.4