SQLite OS specific support (#304) 05/184705/1
authorv.irkha@samsung.com <v.irkha@samsung.com>
Mon, 9 Jul 2018 04:58:23 +0000 (07:58 +0300)
committerAmit KS <amit.s12@samsung.com>
Fri, 20 Jul 2018 08:28:35 +0000 (13:58 +0530)
Change SQL requests for WHERE statements with blob params.
(Details in [IOT-2775])

https://github.sec.samsung.net/RS7-IOTIVITY/IoTivity/pull/304
(cherry picked from commit 988f01a5cc090ef21dfde89352ceb47dd7be70bc)

Change-Id: If87ae5503fb2961601376bfd405c7949c1a5c28a
Signed-off-by: Vitalii Irkha <v.irkha@samsung.com>
Signed-off-by: Amit KS <amit.s12@samsung.com>
resource/csdk/security/provisioning/src/provisioningdatabasemanager.c

index 0bf88e0..d502fc2 100644 (file)
@@ -30,6 +30,7 @@
 #include "pmutility.h"
 #include "oic_string.h"
 #include "utlist.h"
+#include "srmutility.h"
 
 
 #define DB_FILE "PDM.db"
@@ -43,6 +44,8 @@
 #define PDM_BIND_INDEX_SECOND 2
 #define PDM_BIND_INDEX_THIRD 3
 
+#define HEX_UUID_STR_LENGTH (UUID_LENGTH*2 + 4)
+
 #define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
                                   UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);"
 
@@ -62,7 +65,8 @@
 #define PDM_SQLITE_TRANSACTION_ROLLBACK "ROLLBACK;"
 #define PDM_SQLITE_GET_STALE_INFO "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE STATE = ?"
 #define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?,?)"
-#define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?"
+#define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID = "
+#define PDM_SQLITE_GET_ID_SIZE (int)sizeof(PDM_SQLITE_GET_ID)
 #define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
 #define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
 #define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
                                            (ID = ? or ID2 = ?) and state = 0"
 #define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
                                           ID = ? and ID2 = ? and state = 0"
-#define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ?  WHERE UUID like ?"
-#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID like ?"
+#define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ? WHERE UUID = "
+#define PDM_SQLITE_UPDATE_DEVICE_SIZE (int)sizeof(PDM_SQLITE_UPDATE_DEVICE)
+#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID = "
+#define PDM_SQLITE_GET_DEVICE_STATUS_SIZE (int)sizeof(PDM_SQLITE_GET_DEVICE_STATUS)
 #define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\
                                                           WHERE ID = ? or ID2 = ?"
 
@@ -151,6 +157,42 @@ static OCStackResult rollback()
 }
 
 /**
+ * Function to convert UUID into hex representation
+ */
+static bool convertUuidToHexString(const OicUuid_t* uuidOfDevice, char* uuidHexString)
+{
+    if(NULL == uuidOfDevice || NULL == uuidHexString)
+    {
+        OIC_LOG(ERROR, TAG, "convertUuidToHexString : Invalid param");
+        return false;
+    }
+
+    char *strUUID = NULL;
+    OCStackResult ret = ConvertUuidToStr(uuidOfDevice, &strUUID);
+    if(OC_STACK_OK != ret)
+    {
+        OIC_LOG(ERROR, TAG, "SendDeleteCredentialRequest : Failed to canonical UUID encoding");
+        return OC_STACK_ERROR;
+
+    }
+    char* headPtr = strUUID;
+    strncat(uuidHexString, "x'",2);
+    while(('\0' != *headPtr))
+    {
+        char tmp = *headPtr;
+        if('-' != tmp)
+        {
+            strncat(uuidHexString, &tmp,1);
+        }
+        headPtr++;
+    }
+    strncat(uuidHexString, "'",1);
+
+    OICFree(strUUID);
+    return true;
+}
+
+/**
  * Error log callback called by SQLite stack in case of error
  */
 void errLogCallback(void *pArg, int iErrCode, const char *zMsg)
@@ -262,13 +304,22 @@ static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
 
     sqlite3_stmt *stmt = 0;
     int res = 0;
-    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
-    PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
+    char sqlStat[PDM_SQLITE_GET_ID_SIZE - 1 + HEX_UUID_STR_LENGTH];
+    char hexUUID[HEX_UUID_STR_LENGTH];
+
+    memset(sqlStat, 0, sizeof(sqlStat));
+    strncpy(sqlStat, PDM_SQLITE_GET_ID, PDM_SQLITE_GET_ID_SIZE - 1);
+    memset(hexUUID, 0, sizeof(hexUUID));
 
-    res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC);
+    if (!convertUuidToHexString(UUID, hexUUID))
+    {
+        return OC_STACK_ERROR;
+    }
+
+    strncpy(sqlStat + PDM_SQLITE_GET_ID_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
+    res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0);
     PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
 
-    OIC_LOG(DEBUG, TAG, "Binding Done");
     while (SQLITE_ROW == sqlite3_step(stmt))
     {
         int tempId = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
@@ -278,7 +329,10 @@ static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
         OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
         return OC_STACK_OK;
     }
+
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+
     return OC_STACK_INVALID_PARAM;
 }
 
@@ -297,13 +351,22 @@ OCStackResult PDMIsDuplicateDevice(const OicUuid_t* UUID, bool *result)
     }
     sqlite3_stmt *stmt = 0;
     int res = 0;
-    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
-    PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
+    char sqlStat[PDM_SQLITE_GET_ID_SIZE - 1 + HEX_UUID_STR_LENGTH];
+    char hexUUID[HEX_UUID_STR_LENGTH];
+
+    memset(sqlStat, 0, sizeof(sqlStat));
+    strncpy(sqlStat, PDM_SQLITE_GET_ID, PDM_SQLITE_GET_ID_SIZE - 1);
+    memset(hexUUID, 0, sizeof(hexUUID));
+
+    if (!convertUuidToHexString(UUID, hexUUID))
+    {
+        return OC_STACK_ERROR;
+    }
 
-    res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC);
+    strncpy(sqlStat + PDM_SQLITE_GET_ID_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
+    res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0);
     PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
 
-    OIC_LOG(DEBUG, TAG, "Binding Done");
     bool retValue = false;
     while(SQLITE_ROW == sqlite3_step(stmt))
     {
@@ -902,17 +965,28 @@ OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* u
 static OCStackResult updateDeviceState(const OicUuid_t *uuid, PdmDeviceState_t state)
 {
     OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+    OIC_LOG_V(WARNING, TAG, "UUID is: %s", (char*) uuid);
 
     sqlite3_stmt *stmt = 0;
     int res = 0 ;
-    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_DEVICE,
-                              strlen(PDM_SQLITE_UPDATE_DEVICE) + 1, &stmt, NULL);
-    PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
+    char sqlStat[PDM_SQLITE_UPDATE_DEVICE_SIZE - 1 + HEX_UUID_STR_LENGTH];
+    char hexUUID[HEX_UUID_STR_LENGTH];
 
-    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
-    PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
+    memset(sqlStat, 0, sizeof(sqlStat));
+    strncpy(sqlStat, PDM_SQLITE_UPDATE_DEVICE, PDM_SQLITE_UPDATE_DEVICE_SIZE - 1);
+    memset(hexUUID, 0, sizeof(hexUUID));
 
-    res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, uuid, UUID_LENGTH, SQLITE_STATIC);
+    if (!convertUuidToHexString(uuid, hexUUID))
+    {
+        return OC_STACK_ERROR;
+    }
+
+    strncpy(sqlStat + PDM_SQLITE_UPDATE_DEVICE_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
+    res = sqlite3_prepare_v2(g_db, sqlStat,
+                                  (int)sizeof(sqlStat), &stmt, NULL);
+
+    PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
+    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
     PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
 
     if (SQLITE_DONE != sqlite3_step(stmt))
@@ -1011,11 +1085,20 @@ OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result)
 
     sqlite3_stmt *stmt = 0;
     int res = 0;
-    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_DEVICE_STATUS, strlen(PDM_SQLITE_GET_DEVICE_STATUS) + 1,
-                              &stmt, NULL);
-    PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
+    char sqlStat[PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1 + HEX_UUID_STR_LENGTH];
+    char hexUUID[HEX_UUID_STR_LENGTH];
+
+    memset(sqlStat, 0, sizeof(sqlStat));
+    strncpy(sqlStat, PDM_SQLITE_GET_DEVICE_STATUS, PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1);
+    memset(hexUUID, 0, sizeof(hexUUID));
 
-    res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, uuid, UUID_LENGTH, SQLITE_STATIC);
+    if (!convertUuidToHexString(uuid, hexUUID))
+    {
+        return OC_STACK_ERROR;
+    }
+
+    strncpy(sqlStat + PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
+    res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0);
     PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
 
     *result = PDM_DEVICE_UNKNOWN;
@@ -1025,8 +1108,10 @@ OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result)
         OIC_LOG_V(DEBUG, TAG, "Device state is %d", tempStaleStateFromDb);
         *result = (PdmDeviceState_t)tempStaleStateFromDb;
     }
+
     sqlite3_finalize(stmt);
     OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+
     return OC_STACK_OK;
 }