Fix functionality of remote service in Notification service. 27/17427/2
authorKIM JungYong <jyong2.kim@samsung.com>
Wed, 22 Feb 2017 10:52:56 +0000 (19:52 +0900)
committerUze Choi <uzchoi@samsung.com>
Fri, 24 Feb 2017 04:52:21 +0000 (04:52 +0000)
Functionality of parsing address is fixed in the consumer service.
When NSConsuemrEnableRemoteService() was called,
address parsing module used fixed for flags(transport type and secured).
And, consumer service was used previous version of prefix("/di")
for using remote service.

In this patch,
1. Whatever tcp or udp and secured or not, using ipv4 or v6,
   address will be parsed effectually.
2. Prefix of Remote service was modified to "/oic/route" from "/di".

Change-Id: I0f20c308e2e4e84cff377e938d010f195177f8bd
Signed-off-by: KIM JungYong <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/17427
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Chihyun Cho <ch79.cho@samsung.com>
Reviewed-by: Jaehong Lee <jaehong2.lee@samsung.com>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
service/notification/src/common/NSUtil.c
service/notification/src/common/NSUtil.h
service/notification/src/consumer/NSConsumerCommunication.c
service/notification/src/consumer/NSConsumerInterface.c

index 0aeb489..6f46db8 100755 (executable)
@@ -480,43 +480,100 @@ NSTopicList * NSInitializeTopicList()
     return topicList;
 }
 
-char * NSGetQueryAddress(const char * serverFullAddress)
+OCDevAddr * NSChangeAddress(const char * inputaddress)
 {
-    if (strstr(serverFullAddress, "coap+tcp://"))
+    NS_VERIFY_NOT_NULL(inputaddress, NULL);
+
+    char * address = (char *)inputaddress;
+    char * schema = strstr(inputaddress, "//");
+    if (schema)
+    {
+        address = schema + 2;
+    }
+    size_t prefixLen = schema - inputaddress;
+    if (prefixLen <= 0)
+    {
+        NS_LOG(ERROR, "Invalid Input address.");
+        return NULL;
+    }
+
+    OCTransportFlags flags = OC_DEFAULT_FLAGS;
+    OCTransportAdapter adapter = OC_ADAPTER_IP;
+    if (strstr(inputaddress, "coap+tcp://"))
+    {
+        NS_LOG(DEBUG, "address : TCP");
+        adapter |= OC_ADAPTER_TCP;
+    }
+    else if (strstr(inputaddress, "coaps://"))
     {
-        return OICStrdup(serverFullAddress+11);
+        NS_LOG(DEBUG, "address : UDP + SECURED");
+        flags |= OC_FLAG_SECURE;
     }
-    else if (strstr(serverFullAddress, "coap://"))
+    else if (strstr(inputaddress, "coaps+tcp://"))
     {
-        return OICStrdup(serverFullAddress+7);
+        NS_LOG(DEBUG, "address : TCP + SECURED");
+        flags |= OC_FLAG_SECURE;
+        adapter |= OC_ADAPTER_TCP;
+    }
+    else if (strstr(inputaddress, "coap://"))
+    {
+        NS_LOG(DEBUG, "address : UDP");
     }
     else
     {
-        return OICStrdup(serverFullAddress);
+        NS_LOG(ERROR, "Invalid CoAP Schema.");
+        return NULL;
     }
-}
 
-OCDevAddr * NSChangeAddress(const char * address)
-{
-    NS_VERIFY_NOT_NULL(address, NULL);
     OCDevAddr * retAddr = NULL;
+    retAddr = (OCDevAddr *) OICMalloc(sizeof(OCDevAddr));
+    NS_VERIFY_NOT_NULL(retAddr, NULL);
 
-    int index = 0;
-    while(address[index] != '\0')
+    char * start = address;
+    char * end = address;
+    if (address[0] == '[')
     {
-        if (address[index] == ':')
+        flags |= OC_IP_USE_V6;
+        end = strchr(++address, ']');
+        if (!end || end <= start)
         {
-            break;
+            NS_LOG(ERROR, "Invalid Input Address - IPv6.");
+            NSOICFree(retAddr);
+            return NULL;
         }
-        index++;
+        memset(retAddr->addr, 0, (size_t)MAX_ADDR_STR_SIZE);
+        OICStrcpy(retAddr->addr, (size_t)(end-start), address);
     }
-
-    if (address[index] == '\0')
+    else
     {
-        return NULL;
+        flags |= OC_IP_USE_V4;
+        end = strchr(address, ':');
+        if (!end || end <= start)
+        {
+            NS_LOG(ERROR, "Invalid Input Address - IPv4.");
+            NSOICFree(retAddr);
+            return NULL;
+        }
+        char * end2 = strchr(end + 1, ':');
+        if (end2)
+        {
+            NS_LOG(ERROR, "Invalid Input Address - IPv4.");
+            NSOICFree(retAddr);
+            return NULL;
+        }
+        memset(retAddr->addr, 0, (size_t)MAX_ADDR_STR_SIZE);
+        OICStrcpy(retAddr->addr, (size_t)(end-start)+1, address);
     }
 
-    int tmp = index + 1;
+    retAddr->adapter = adapter;
+    retAddr->flags = flags;
+
+    address = end + 1;
+    int tmp = 0;
+    if (flags & OC_IP_USE_V6)
+    {
+        address++;
+    }
     uint16_t port = address[tmp++] - '0';
 
     while(true)
@@ -525,21 +582,20 @@ OCDevAddr * NSChangeAddress(const char * address)
         {
             break;
         }
+        if (tmp >= 5 || (port >= 6553 && (address[tmp] -'0') >= 6))
+        {
+            NS_LOG_V(ERROR, "Invalid Input Address - Port. %d", tmp+1);
+            NSOICFree(retAddr);
+            return NULL;
+        }
         port *= 10;
         port += address[tmp++] - '0';
     }
 
-    retAddr = (OCDevAddr *) OICMalloc(sizeof(OCDevAddr));
-    NS_VERIFY_NOT_NULL(retAddr, NULL);
-
-    retAddr->adapter = OC_ADAPTER_TCP;
-    OICStrcpy(retAddr->addr, index + 1, address);
-    retAddr->addr[index] = '\0';
     retAddr->port = port;
-    retAddr->flags = OC_IP_USE_V6;
 
     NS_LOG(DEBUG, "Change Address for TCP request");
-    NS_LOG_V(DEBUG, "Origin : %s", address);
+    NS_LOG_V(DEBUG, "Origin : %s", inputaddress);
     NS_LOG_V(DEBUG, "Changed Addr : %s", retAddr->addr);
     NS_LOG_V(DEBUG, "Changed Port : %d", retAddr->port);
 
index bdcc03d..a48ac14 100755 (executable)
@@ -63,7 +63,6 @@ NSMediaContents * NSDuplicateMediaContents(NSMediaContents * copyObj);
 \r
 OCRepPayloadValue* NSPayloadFindValue(const OCRepPayload* payload, const char* name);\r
 \r
-char * NSGetQueryAddress(const char * serverFullAddress);\r
 OCDevAddr * NSChangeAddress(const char * address);\r
 bool NSOCResultToSuccess(OCStackResult ret);\r
 \r
index 5c1c317..3c756f6 100644 (file)
@@ -302,11 +302,11 @@ OCStackResult NSSendSyncInfo(NSSyncInfo * syncInfo, OCDevAddr * addr)
 
 char * NSGetCloudUri(const char * providerId, char * uri)
 {
-    size_t uriLen = NS_DEVICE_ID_LENGTH + 1 + strlen(uri) + 1 + 3;
+    size_t uriLen = NS_DEVICE_ID_LENGTH + 1 + strlen(uri) + 1 + 10;
     char * retUri = (char *)OICMalloc(uriLen);
     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retUri, NULL, NSOICFree(uri));
 
-    snprintf(retUri, uriLen, "/di/%s%s", providerId, uri);
+    snprintf(retUri, uriLen, "/oic/route/%s%s", providerId, uri);
     NSOICFree(uri);
     NS_LOG_V(DEBUG, "Cloud uri : %s", retUri);
 
index a735ec9..6101708 100644 (file)
@@ -103,7 +103,7 @@ NSResult NSConsumerEnableRemoteService(const char * serverAddress)
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
-    char * queryAddr = NSGetQueryAddress(serverAddress);
+    char * queryAddr = OICStrdup(serverAddress);
     NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
 
     NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)queryAddr);