replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / common / NSUtil.c
index a5eeea2..8efb307 100755 (executable)
@@ -29,14 +29,16 @@ OCEntityHandlerRequest *NSCopyOCEntityHandlerRequest(OCEntityHandlerRequest *ent
 
     if (copyOfRequest)
     {
-        // Do shallow copy
         memcpy(copyOfRequest, entityHandlerRequest, sizeof(OCEntityHandlerRequest));
+        copyOfRequest->payload = NULL;
+        copyOfRequest->query = NULL;
+        copyOfRequest->numRcvdVendorSpecificHeaderOptions = 0;
+        copyOfRequest->rcvdVendorSpecificHeaderOptions = NULL;
 
-
-        if (copyOfRequest->query)
+        if (entityHandlerRequest->query)
         {
             copyOfRequest->query = OICStrdup(entityHandlerRequest->query);
-            if(!copyOfRequest->query)
+            if (!copyOfRequest->query)
             {
                 NS_LOG(ERROR, "Copy failed due to allocation failure");
                 OICFree(copyOfRequest);
@@ -49,10 +51,6 @@ OCEntityHandlerRequest *NSCopyOCEntityHandlerRequest(OCEntityHandlerRequest *ent
             copyOfRequest->payload = (OCPayload *)
                     (OCRepPayloadClone ((OCRepPayload*) entityHandlerRequest->payload));
         }
-
-        // Ignore vendor specific header options for example
-        copyOfRequest->numRcvdVendorSpecificHeaderOptions = 0;
-        copyOfRequest->rcvdVendorSpecificHeaderOptions = NULL;
     }
 
     if (copyOfRequest)
@@ -65,7 +63,6 @@ OCEntityHandlerRequest *NSCopyOCEntityHandlerRequest(OCEntityHandlerRequest *ent
     }
 
     NS_LOG(DEBUG, "NSCopyOCEntityHandlerRequest - OUT");
-
     return copyOfRequest;
 }
 
@@ -89,30 +86,17 @@ NSResult NSFreeMessage(NSMessage * obj)
         return NS_ERROR;
     }
 
-    if (obj->mId)
-    {
-        OICFree(obj->mId);
-        obj->mId = NULL;
-    }
-
-    if (obj->mTitle)
-    {
-        OICFree(obj->mTitle);
-        obj->mTitle = NULL;
-    }
-
-    if (obj->mContentText)
-    {
-        OICFree(obj->mContentText);
-        obj->mContentText = NULL;
-    }
-
-    if (obj->mSource)
-    {
-        OICFree(obj->mSource);
-        obj->mSource = NULL;
-    }
+    obj->messageId = 0;
+    (obj->providerId)[0] = '\0';
 
+    NSFreeMalloc(&(obj->dateTime));
+    obj->ttl = 0;
+    NSFreeMalloc(&(obj->title));
+    NSFreeMalloc(&(obj->contentText));
+    NSFreeMalloc(&(obj->sourceName));
+    NSFreeMalloc(&(obj->topic));
+    NSFreeMediaContents(obj->mediaContents);
+    OCRepPayloadDestroy(obj->extraInfo);
     OICFree(obj);
 
     return NS_OK;
@@ -122,59 +106,63 @@ NSMessage * NSDuplicateMessage(NSMessage * copyMsg)
 {
     NSMessage * newMsg = NULL;
 
-    if(copyMsg == NULL)
+    if (copyMsg == NULL)
     {
         NS_LOG(ERROR, "Copy Msg is NULL");
         return NULL;
     }
 
-    newMsg = (NSMessage *)OICMalloc(sizeof(NSMessage));
-    newMsg->mContentText = NULL;
-    newMsg->mId = NULL;
-    newMsg->mSource = NULL;
-    newMsg->mTitle = NULL;
+    newMsg = NSInitializeMessage();
+    NS_VERIFY_NOT_NULL(newMsg, NULL);
+
+    newMsg->messageId = copyMsg->messageId;
+    OICStrcpy(newMsg->providerId, UUID_STRING_SIZE, copyMsg->providerId);
 
-    if (copyMsg->mId)
+    if (copyMsg->dateTime)
     {
-        newMsg->mId = OICStrdup(copyMsg->mId);
+        newMsg->dateTime = OICStrdup(copyMsg->dateTime);
     }
 
-    if (copyMsg->mTitle)
+    newMsg->ttl = copyMsg->ttl;
+
+    if (copyMsg->title)
     {
-        newMsg->mTitle = OICStrdup(copyMsg->mTitle);
+        newMsg->title = OICStrdup(copyMsg->title);
     }
 
-    if (copyMsg->mContentText)
+    if (copyMsg->contentText)
     {
-        newMsg->mContentText = OICStrdup(copyMsg->mContentText);
+        newMsg->contentText = OICStrdup(copyMsg->contentText);
     }
 
-    if (copyMsg->mSource)
+    if (copyMsg->sourceName)
     {
-       newMsg->mSource = OICStrdup(copyMsg->mSource);
+       newMsg->sourceName = OICStrdup(copyMsg->sourceName);
     }
 
-    return newMsg;
-}
+    if (copyMsg->mediaContents)
+    {
+       newMsg->mediaContents = NSDuplicateMediaContents(copyMsg->mediaContents);
+    }
 
-NSResult NSFreeSync(NSSync * obj)
-{
-    if (!obj)
+    if (copyMsg->topic)
     {
-        return NS_ERROR;
+        newMsg->topic = OICStrdup(copyMsg->topic);
     }
 
-    if (obj->mMessageId)
+    if (copyMsg->extraInfo)
     {
-        OICFree(obj->mMessageId);
-        obj->mMessageId = NULL;
+        newMsg->extraInfo = OCRepPayloadClone(copyMsg->extraInfo);
     }
 
-    if (obj->mSourceId)
+    return newMsg;
+}
+
+NSResult NSFreeSync(NSSyncInfo * obj)
+{
+    if (!obj)
     {
-        NS_LOG_V(DEBUG, "obj->mSourceid = %s", obj->mSourceId);
-        OICFree(obj->mSourceId);
-        obj->mSourceId = NULL;
+        return NS_ERROR;
     }
 
     OICFree(obj);
@@ -182,32 +170,27 @@ NSResult NSFreeSync(NSSync * obj)
     return NS_OK;
 }
 
-NSSync* NSDuplicateSync(NSSync * copyMsg)
+NSSyncInfo* NSDuplicateSync(NSSyncInfo * copyMsg)
 {
-    NSSync * newMsg = NULL;
+    NSSyncInfo * newMsg = NULL;
 
-    if(copyMsg == NULL)
+    if (!copyMsg)
     {
         NS_LOG(ERROR, "Copy Msg is NULL");
         return NULL;
     }
 
-    newMsg = (NSSync *)OICMalloc(sizeof(NSSync));
-    newMsg->mMessageId = NULL;
-    newMsg->mSourceId = NULL;
-    newMsg->mState = -1;
+    newMsg = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
 
-    if (copyMsg->mMessageId)
+    if (!newMsg)
     {
-        newMsg->mMessageId = OICStrdup(copyMsg->mMessageId);
-    }
-
-    if (copyMsg->mSourceId)
-    {
-        newMsg->mSourceId = OICStrdup(copyMsg->mSourceId);
+        NS_LOG(ERROR, "newMsg is NULL");
+        return NULL;
     }
 
-    newMsg->mState = copyMsg->mState;
+    newMsg->messageId = copyMsg->messageId;
+    OICStrcpy(newMsg->providerId, UUID_STRING_SIZE, copyMsg->providerId);
+    newMsg->state = copyMsg->state;
 
     return newMsg;
 }
@@ -219,19 +202,10 @@ NSResult NSFreeConsumer(NSConsumer * obj)
         return NS_ERROR;
     }
 
-    if (obj->mAddress)
-    {
-        OICFree(obj->mAddress);
-        obj->mAddress = NULL;
-    }
-
-    if (obj->mDeviceId)
-    {
-        OICFree(obj->mDeviceId);
-        obj->mDeviceId = NULL;
-    }
+    (obj->consumerId)[0] = '\0';
 
     OICFree(obj);
+    obj = NULL;
 
     return NS_OK;
 }
@@ -240,25 +214,23 @@ NSConsumer* NSDuplicateConsumer(NSConsumer * copyMsg)
 {
     NSConsumer * newMsg = NULL;
 
-    if(copyMsg == NULL)
+    if (copyMsg == NULL)
     {
         NS_LOG(ERROR, "Copy Msg is NULL");
         return NULL;
     }
 
     newMsg = (NSConsumer *)OICMalloc(sizeof(NSConsumer));
-    newMsg->mAddress = NULL;
-    newMsg->mDeviceId = NULL;
 
-    if (copyMsg->mAddress)
+    if (!newMsg)
     {
-        newMsg->mAddress = OICStrdup(copyMsg->mAddress);
+        NS_LOG(ERROR, "newMsg is NULL");
+        return NULL;
     }
 
-    if (copyMsg->mDeviceId)
-    {
-        newMsg->mDeviceId = OICStrdup(copyMsg->mDeviceId);
-    }
+    (newMsg->consumerId)[0] = '\0';
+
+    OICStrcpy(newMsg->consumerId, UUID_STRING_SIZE, copyMsg->consumerId);
 
     return newMsg;
 }
@@ -266,59 +238,384 @@ NSConsumer* NSDuplicateConsumer(NSConsumer * copyMsg)
 void NSDuplicateSetPropertyString(OCRepPayload** msgPayload, const char * name,
         const char * copyString)
 {
-    if(copyString)
+    if (copyString)
     {
         OCRepPayloadSetPropString(*msgPayload, name, copyString);
     }
-    else
+}
+
+void NSDuplicateSetPropertyInt(OCRepPayload** msgPayload, const char * name,
+        int64_t value)
+{
+    if (value)
     {
-        OCRepPayloadSetNull(*msgPayload, name);
+        OCRepPayloadSetPropInt(*msgPayload, name, value);
     }
 }
 
-
-NSSync * NSGetSyncInfo(OCPayload * payload)
+NSSyncInfo * NSGetSyncInfo(OCPayload * payload)
 {
-    NS_LOG(DEBUG, "NSBuildOICNotificationSync - IN");
+    NS_LOG(DEBUG, "NSGetSyncInfo - IN");
+    char * providerId = NULL;
+    int64_t state = 0;
 
-    if(!payload)
+    if (!payload)
     {
         return NULL;
     }
-    NSSync * retSync = (NSSync *)OICMalloc(sizeof(NSSync));
+
+    NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
+
     if (!retSync)
     {
         return NULL;
     }
 
-    retSync->mMessageId = NULL;
-    retSync->mState = Notification_Read;
-
+    retSync->messageId = 0;
+    retSync->state = NS_SYNC_READ;
     OCRepPayload * repPayload = (OCRepPayload *)payload;
-    if (!OCRepPayloadGetPropString(repPayload, NS_ATTRIBUTE_ID, &retSync->mMessageId))
+
+    if (!OCRepPayloadGetPropInt(repPayload, NS_ATTRIBUTE_MESSAGE_ID,
+            (int64_t *)&retSync->messageId))
     {
         OICFree(retSync);
         return NULL;
     }
-    if (!OCRepPayloadGetPropString(repPayload, NS_ATTRIBUTE_SOURCE, &retSync->mSourceId))
+
+    if (!OCRepPayloadGetPropString(repPayload, NS_ATTRIBUTE_PROVIDER_ID, &providerId))
     {
         OICFree(retSync);
         return NULL;
     }
-    int64_t state;
-    if (!OCRepPayloadGetPropInt(repPayload, NS_ATTRIBUTE_STATE, & state))
+
+    if (!OCRepPayloadGetPropInt(repPayload, NS_ATTRIBUTE_STATE, &state))
     {
-        OICFree(retSync->mMessageId);
         OICFree(retSync);
         return NULL;
     }
 
-    retSync->mState = (NSSyncTypes) state;
+    retSync->state = (NSSyncType) state;
+    OICStrcpy(retSync->providerId, UUID_STRING_SIZE, providerId);
+    OICFree(providerId);
 
-    NS_LOG_V(DEBUG, "Sync ID : %s", retSync->mMessageId);
-    NS_LOG_V(DEBUG, "Sync State : %d", (int) retSync->mState);
+    NS_LOG_V(INFO_PRIVATE, "Provider ID : %s", retSync->providerId);
+    NS_LOG_V(DEBUG, "Sync ID : %lld", (long long int)retSync->messageId);
+    NS_LOG_V(DEBUG, "Sync State : %d", (int) retSync->state);
 
-    NS_LOG(DEBUG, "NSBuildOICNotificationSync - OUT");
+    NS_LOG(DEBUG, "NSGetSyncInfo - OUT");
 
     return retSync;
 }
+
+NSResult NSGenerateUUIDStr(char uuidStr[UUID_STRING_SIZE])
+{
+    uint8_t uuid[UUID_SIZE] = { 0, };
+
+    if (RAND_UUID_OK == OCGenerateUuid(uuid))
+    {
+        if (RAND_UUID_OK == OCConvertUuidToString(uuid, uuidStr))
+        {
+            return NS_OK;
+        }
+    }
+    return NS_ERROR;
+}
+
+char * NSGetValueFromQuery(char *query, char * compareKey)
+{
+    char *key = NULL;
+    char *value = NULL;
+    char *restOfQuery = NULL;
+    int numKeyValuePairsParsed = 0;
+
+    NS_LOG_V(INFO, "NS Query Params = %s", query);
+
+    if (!query || query[0] == '\0' || !strlen(query))
+    {
+        NS_LOG(ERROR, "query is null or \\0 or size is 0");
+        return NULL;
+    }
+
+    char *keyValuePair = strtok_r (query, NS_QUERY_SEPARATOR, &restOfQuery);
+
+    while(keyValuePair)
+    {
+        if (numKeyValuePairsParsed >= 2)
+        {
+            NS_LOG(ERROR, "More than 2 queries params in URI.");
+            return NULL;
+        }
+
+        key = strtok_r(keyValuePair, NS_KEY_VALUE_DELIMITER, &value);
+
+        if (!key || !value)
+        {
+            NS_LOG(ERROR, "More than 2 queries params in URI.");
+            return NULL;
+        }
+
+        if (strcmp(key, compareKey) == 0)
+        {
+            NS_LOG_V(DEBUG, "found Key : [%s] - Value : [%s] = ", key, value);
+            return value;
+        }
+
+        ++numKeyValuePairsParsed;
+
+        keyValuePair = strtok_r(NULL, NS_QUERY_SEPARATOR, &restOfQuery);
+    }
+
+    return NULL;
+}
+
+NSResult NSFreeMalloc(char ** obj)
+{
+    if (*obj)
+    {
+        OICFree(*obj);
+        *obj = NULL;
+        return NS_OK;
+    }
+
+    return NS_FAIL;
+}
+
+NSMediaContents * NSDuplicateMediaContents(NSMediaContents * copyObj)
+{
+    if (!copyObj)
+    {
+        return NULL;
+    }
+
+    NSMediaContents * newObj = (NSMediaContents *)OICMalloc(sizeof(NSMediaContents));
+
+    if (!newObj)
+    {
+        NS_LOG(ERROR, "contents newObj is NULL");
+        return NULL;
+    }
+
+    if (copyObj->iconImage)
+    {
+        newObj->iconImage = OICStrdup(copyObj->iconImage);
+    }
+
+    return newObj;
+}
+
+NSResult NSFreeMediaContents(NSMediaContents * obj)
+{
+    if (!obj)
+    {
+        return NS_FAIL;
+    }
+
+    NSFreeMalloc(&(obj->iconImage));
+    OICFree(obj);
+
+    return NS_OK;
+}
+
+NSMessage * NSInitializeMessage()
+{
+    NSMessage * msg = (NSMessage *)OICMalloc(sizeof(NSMessage));
+
+    if (!msg)
+    {
+        NS_LOG(ERROR, "Msg is NULL");
+        return NULL;
+    }
+
+    msg->messageId = OICGetCurrentTime(TIME_IN_MS);
+    msg->messageId = msg->messageId & 0x000000007FFFFFFF;
+    (msg->providerId)[0] = '\0';
+    msg->type = 0;
+    msg->dateTime = NULL;
+    msg->ttl = 0;
+    msg->title = NULL;
+    msg->contentText = NULL;
+    msg->sourceName = NULL;
+    msg->mediaContents = NULL;
+    msg->topic = NULL;
+    msg->extraInfo = NULL;
+
+    return msg;
+}
+
+OCRepPayloadValue* NSPayloadFindValue(const OCRepPayload* payload, const char* name)
+{
+    if (!payload || !name)
+    {
+        return NULL;
+    }
+
+    OCRepPayloadValue* val = payload->values;
+
+    while (val)
+    {
+        if (0 == strcmp(val->name, name))
+        {
+            return val;
+        }
+        val = val->next;
+    }
+
+    return NULL;
+}
+
+NSTopicList * NSInitializeTopicList()
+{
+    NSTopicList * topicList = (NSTopicList *)OICMalloc(sizeof(NSTopicList));
+
+    if (!topicList)
+    {
+        NS_LOG(ERROR, "topicList is NULL");
+        return NULL;
+    }
+
+    (topicList->consumerId)[0] = '\0';
+    topicList->head = NULL;
+    topicList->tail = NULL;
+
+    return topicList;
+}
+
+OCDevAddr * NSChangeAddress(const char * inputaddress)
+{
+    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://"))
+    {
+        NS_LOG(DEBUG, "address : UDP + SECURED");
+        flags |= OC_FLAG_SECURE;
+    }
+    else if (strstr(inputaddress, "coaps+tcp://"))
+    {
+        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
+    {
+        NS_LOG(ERROR, "Invalid CoAP Schema.");
+        return NULL;
+    }
+
+    OCDevAddr * retAddr = NULL;
+    retAddr = (OCDevAddr *) OICMalloc(sizeof(OCDevAddr));
+    NS_VERIFY_NOT_NULL(retAddr, NULL);
+
+    char * start = address;
+    char * end = address;
+    if (address[0] == '[')
+    {
+        flags |= OC_IP_USE_V6;
+        end = strchr(++address, ']');
+        if (!end || end <= start)
+        {
+            NS_LOG(ERROR, "Invalid Input Address - IPv6.");
+            NSOICFree(retAddr);
+            return NULL;
+        }
+        memset(retAddr->addr, 0, (size_t)MAX_ADDR_STR_SIZE);
+        OICStrcpy(retAddr->addr, (size_t)(end-start), address);
+    }
+    else
+    {
+        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);
+    }
+
+    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)
+    {
+        if (address[tmp] == '\0' || address[tmp] > '9' || address[tmp] < '0')
+        {
+            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->port = port;
+
+    NS_LOG(DEBUG, "Change Address for TCP request");
+    NS_LOG_V(INFO_PRIVATE, "Origin : %s", inputaddress);
+    NS_LOG_V(INFO_PRIVATE, "Changed Addr : %s", retAddr->addr);
+    NS_LOG_V(INFO_PRIVATE, "Changed Port : %d", retAddr->port);
+
+    return retAddr;
+}
+
+bool NSOCResultToSuccess(OCStackResult ret)
+{
+    switch (ret)
+    {
+        case OC_STACK_OK:
+        case OC_STACK_RESOURCE_CREATED:
+        case OC_STACK_RESOURCE_DELETED:
+        case OC_STACK_PRESENCE_STOPPED:
+        case OC_STACK_CONTINUE:
+        case OC_STACK_RESOURCE_CHANGED:
+            return true;
+        default:
+            NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);
+            return false;
+    }
+}
+