signup with secured mode 96/139596/1
authorSangkoo Kim <sangkoo.kim@samsung.com>
Wed, 19 Jul 2017 11:08:33 +0000 (20:08 +0900)
committerSangkoo Kim <sangkoo.kim@samsung.com>
Wed, 19 Jul 2017 11:11:03 +0000 (20:11 +0900)
Change-Id: I654dd356e39c351c1259feb612550007cb666f54
Signed-off-by: Sangkoo Kim <sangkoo.kim@samsung.com>
packaging/controlee-firmware-resource.spec
test/CMakeLists.txt
test/controlee_firmware_test.c

index 1e877d0d263f54494370170b6b8038d48c34d9b7..f48562f19d4fb7812d311d0bffa891f821b28a03 100644 (file)
@@ -14,6 +14,7 @@ BuildRequires: pkgconfig(capi-system-info)
 BuildRequires: pkgconfig(dlog)
 BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(iotivity)
+BuildRequires: pkgconfig(key-manager)
 BuildRequires: pkgconfig(libcurl)
 
 %description
@@ -65,3 +66,5 @@ rm -rf %{buildroot}
 
 %files test
 %{_bindir}/controlee_firmware_test
+%config(noreplace) /opt/usr/data/ua-client/thawte.cert.pem
+%config(noreplace) /opt/usr/data/ua-client/oic_svr_db_client.dat
index e8c8559bd0f2090f64a74900e4073ac354cca566..94bc7edd76ba8191b737985a10a7361984542ee0 100644 (file)
@@ -8,14 +8,17 @@ SET(CONTROLEE_FIRMWARE_TEST_SRCS
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../inc)
 
+INSTALL(FILES ${CMAKE_BINARY_DIR}/test/thawte.cert.pem DESTINATION /opt/usr/data/ua-client/)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/test/oic_svr_db_client.dat DESTINATION /opt/usr/data/ua-client/)
+
 INCLUDE(FindPkgConfig)
-pkg_check_modules(test_pkgs REQUIRED glib-2.0 iotivity)
+pkg_check_modules(test_pkgs REQUIRED glib-2.0 iotivity key-manager)
 INCLUDE_DIRECTORIES(${test_pkgs_INCLUDE_DIRS})
 LINK_DIRECTORIES(${test_pkgs_LIBRARY_DIRS})
 
 FIND_LIBRARY(RD_LIB NAMES resource_directory PATHS /usr/lib)
 SET(LIBNAME controlee_firmware_resource)
 ADD_EXECUTABLE(${testapp} ${CONTROLEE_FIRMWARE_TEST_SRCS})
-TARGET_LINK_LIBRARIES(${testapp} ${test_pkgs_LIBRARIES} ${LIBNAME} ${RD_LIB})
+TARGET_LINK_LIBRARIES(${testapp} ${test_pkgs_LIBRARIES} ${LIBNAME} ${RD_LIB} -lpthread)
 
 INSTALL(TARGETS ${testapp} DESTINATION bin/)
\ No newline at end of file
index 1e1675a17b6093c2177839c0b13cf3b947f6f982..23c2574fc53fbc8d0975f1cdadc3a8ff087eaec9 100644 (file)
@@ -6,12 +6,16 @@
 #include <gio/gio.h>
 #include <fcntl.h>
 #include <sys/stat.h>
+#include <pthread.h>
 
 #include <ocstack.h>
 #include <ocpayload.h>
 #include <octypes.h>
 #include <ocprovisioningmanager.h>
 #include <rd_client.h>
+#include <oickeepalive.h>
+
+#include <ckmc/ckmc-manager.h>
 
 #include <controlee_firmware_resource.h>
 
 #define DEFAULT_CONTEXT_VALUE 0x99
 #define LOGIN_OK 4
 
-#define CERT_FILE_PATH "/opt/usr/data/ua-client/thawte.cert.pem"
-
+#define OC_SECURITY_SQL_DB_FILE_NAME   "/opt/usr/data/ua-client/PDM.db"
+#define OC_CONTROLEE_DAT_FILE_PATH             "/opt/usr/data/ua-client/oic_svr_db_client.dat"
+#define CERT_FILE_PATH                                 "/opt/usr/data/ua-client/thawte.cert.pem"
 
 OCResourceHandle aircon_handle = NULL;
 OCResourceHandle binary_switch_handle = NULL;
 OCResourceHandle firmware_handle = NULL;
 
-#define STG_SERVER                     "52.202.112.20:443"
-#define DEV_SERVER                     "54.86.109.131:443"
-#define AUTH_PROVIDER          "samsung-us"
+#define CLOUD_STG_SERVER                       "52.202.112.20:443"
+#define CLOUD_DEV_SERVER                       "54.86.109.131:443"
+#define CLOUD_AUTH_PROVIDER            "samsung-us"
+#define CLOUD_DEVICE_TYPE              "device"
+
+#define DEVICE_ID                      "di"
+#define CLIENT_ID                      "clientid"
+#define AUTH_PROVIDER          "authprovider"
+#define DEVICE_TYPE                    "devicetype"
+#define ACCESS_TOKEN           "accesstoken"
+#define USER_ID                                "uid"
+#define CLOUD_LOGIN                    "login"
+
+#define CLOUD_ACCOUNT_RES_TYPE         "oic.wk.account"
+#define CLOUD_SESSION_RES_TYPE         "oic.wk.session"
 
-uint8_t *g_certificate;
-size_t g_cert_len;
-OicEncodingType_t g_cert_encoding_type = OIC_ENCODING_PEM;
+#define MAX_INTERVAL_NUMBER (4)
+
+typedef struct
+{
+       char *deviceId;
+       char *clientId;
+       char *authCode;
+       char *uid;
+       char *accessToken;
+       char *refreshToken;
+       char *codeVerifier;
+
+       uint8_t *certificate;
+       size_t certificateLength;
+       OicEncodingType_t encodingType;
+} CloudLoginInfo;
+
+
+bool bSignin;
+bool isExit;
 uint16_t g_cred_id = 0;
-char *g_accesstoken;
-char *g_refreshtoken;
-char *g_tokentype;
-long  g_expiresin;
-char *g_uid;
-char *g_redirecturi;
-char *g_sid;
+CloudLoginInfo loginDetails;
+
+static pthread_mutex_t pingcycle_mutex = PTHREAD_MUTEX_INITIALIZER;
+static bool is_ping_timer = false;
+
+
+OCPlatformInfo g_platform_info = {
+               "1234",                           /* platformID */
+               "Samsung",                        /* manufacturerName */
+               "https://www.example.com",        /* manufacturerUrl */
+               "Tizen2017-AAA",                  /* modelNumber */
+               "2017-07-19",                     /* dateOfManufacture */
+               "AAA",                            /* platformVersion */
+               "4.0",                            /* operatingSystemVersion */
+               "HW-001",                         /* hardwareVersion */
+               "1.0",                            /* firmwareVersion */
+               "https://www.examplesupport.com", /* supportUrl */
+               "2017-07-19T12.00"                /* systemTime */
+};
+
+
+int _signin();
+int _signup();
+
+
+int _set_auth_cert_info()
+{
+       char *certFile = CERT_FILE_PATH;
+       ckmc_cert_s* cert = NULL;
+       int ret_cert = ckmc_load_cert_from_file(certFile, &cert);
+       if (CKMC_ERROR_NONE != ret_cert) {
+               printf("ckmc_load_cert_from_file error [%d]\n", ret_cert);
+               return -1;
+       }
+
+       if (loginDetails.certificate) {
+               free(loginDetails.certificate);
+               loginDetails.certificate = NULL;
+       }
+
+       loginDetails.certificateLength = cert->cert_size;
+       loginDetails.certificate = (uint8_t *)calloc(1, sizeof(uint8_t)*cert->cert_size + 1);
+       loginDetails.encodingType = OIC_ENCODING_PEM;
+
+       if (loginDetails.certificate) {
+               memcpy(loginDetails.certificate, cert->raw_cert, sizeof(uint8_t)*cert->cert_size);
+
+               printf("Save cert file Data\n");
+               if (OCSaveTrustCertChain(loginDetails.certificate, loginDetails.certificateLength, \
+                               loginDetails.encodingType, &g_cred_id) != OC_STACK_OK) {
+                       printf("OCSaveTrustCertChain() failed\n");
+                       return -1;
+               } else {
+                       printf("Cred ID from saveCertFile = [%d]\n", g_cred_id);
+               }
+       }
+
+       return 0;
+}
+
+static FILE *client_open(const char *path, const char *mode)
+{
+       (void)path;
+
+       if (!strcmp(mode, "rb"))
+               mode = strdup("r");
+       else if(!strcmp(mode, "wb"))
+               mode = strdup("w");
+
+       return fopen(OC_CONTROLEE_DAT_FILE_PATH, mode);
+}
+
+
+
+static void _parse_payload(OCRepPayload *payload)
+{
+       if (!payload)
+               return;
+
+       char *sid, *certificate;
+       if (!OCRepPayloadGetPropString(payload, "sid", &sid))
+               printf("Can't get 'sid'\n");
+
+       if (!OCRepPayloadGetPropString(payload, "certificate", &certificate))
+               printf("Can't get 'certificate'\n");
+
+}
+
+static OCStackApplicationResult _send_keep_alive_cb(void *context, OCDoHandle handle,
+                                                       OCClientResponse * clientResponse)
+{
+       printf("_send_keep_alive_cb() is called\n");
+
+       (void)context;
+       (void)handle;
+
+       if(clientResponse->result > OC_STACK_RESOURCE_CHANGED) {
+               pthread_detach(pthread_self());
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               pthread_exit(NULL);
+       }
+
+       return OC_STACK_DELETE_TRANSACTION;
+}
 
-static void _session_parse_payload(OCRepPayload *payload)
+static void _keep_alive_cb(OCRepPayload *payload)
 {
+       printf("_keep_alive_cb() is called\n");
+
        if (!payload)
                return;
 
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_ACCESS_TOKEN, &g_accesstoken))
-               printf("Can't get: %s\n", OC_RSRVD_ACCESS_TOKEN);
+       char *intervals;
 
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REFRESH_TOKEN, &g_refreshtoken))
-               printf("Can't get: %s\n", OC_RSRVD_REFRESH_TOKEN);
+       if (OCRepPayloadGetPropString(payload, "inarray", &intervals)) {
+               printf("[keep alive cb] intervals=[%s]\n", intervals);
 
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_TOKEN_TYPE, &g_tokentype))
-               printf("Can't get: %s\n", OC_RSRVD_TOKEN_TYPE);
+               char *temp_intervals = strdup(intervals);
+               char *token = NULL;
+               int interval[4] = {0};
+               int i = 0;
 
-       int64_t tmp = 0;
-       if (!OCRepPayloadGetPropInt(payload, OC_RSRVD_EXPIRES_IN, &tmp))
-               printf("Can't get: %s\n", OC_RSRVD_EXPIRES_IN);
-       else
-               g_expiresin = tmp;
+               token = strtok(temp_intervals, "[");
+               token = strtok(token, "]");
+               token = strtok(token, ",");
+               interval[0] = atoi(token);
+               ++i;
 
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_USER_UUID, &g_uid))
-               printf("Can't get: %s\n", OC_RSRVD_USER_UUID);
+               while ((token = strtok(NULL, ", "))) {
+                       interval[i] = atoi(token);
+                       ++i;
+               }
 
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REDIRECT_URI, &g_redirecturi))
-               printf("Can't get: %s\n", OC_RSRVD_REDIRECT_URI);
+               // Send KeepAlive each interval
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = true;
+               pthread_mutex_unlock(&pingcycle_mutex);
+
+               i = 0;
+               int timeout = 0;
+               int timer_count = 0;
+
+               while (is_ping_timer) {
+                       if(timeout == timer_count) {
+                               timer_count = 0;
+                               OCStackResult ocResult = OC_STACK_ERROR;
+
+                               if(i >= MAX_INTERVAL_NUMBER) {
+                                       i = MAX_INTERVAL_NUMBER - 1;
+                               }
+
+                               OCRepPayload *payload = OCRepPayloadCreate();
+                               if (!payload) break;
+
+                               OCRepPayloadSetPropInt(payload, "in", (int64_t)interval[i]);
+                               timeout = interval[i] * 60;
+                               ++i;
+
+                               char uri[MAX_URI_LENGTH] = { 0 };
+                               snprintf(uri, MAX_URI_LENGTH, "coap+tcp://%s%s",
+                                               CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_URI);
+
+                               OCCallbackData *cbData = (OCCallbackData *)calloc(1, sizeof(OCCallbackData));
+                               cbData->cb = _send_keep_alive_cb;
+                               cbData->context = (void *)DEFAULT_CONTEXT_VALUE;
+
+                               ocResult = OCSendKeepAliveRequest(NULL, uri, (OCPayload *)payload, cbData);
+                               printf("sendKeepAliveRequest() result : %d\n", ocResult);
+                               if (OC_STACK_OK != ocResult) {
+                                       pthread_detach(pthread_self());
+                                       pthread_mutex_lock(&pingcycle_mutex);
+                                       is_ping_timer = false;
+                                       pthread_mutex_unlock(&pingcycle_mutex);
+                                       pthread_exit(NULL);
+                               }
+                       }
 
-       char *tmp_cert;
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_CERTIFICATE, &tmp_cert))
-               printf("Can't get: %s\n", OC_RSRVD_CERTIFICATE);
-       else
-               g_certificate = (uint8_t *)tmp_cert;
+                       pthread_mutex_lock(&pingcycle_mutex);
+                       ++timer_count;
+                       pthread_mutex_unlock(&pingcycle_mutex);
 
-       if (!OCRepPayloadGetPropString(payload, OC_RSRVD_SUBJECT_ID, &g_sid))
-               printf("Can't get: %s\n", OC_RSRVD_SUBJECT_ID);
+                       sleep(1);
+               }
+
+               g_free(token);
+               g_free(temp_intervals);
+       } else {
+               pthread_detach(pthread_self());
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               pthread_exit(NULL);
+       }
+
+       return;
 }
 
-static OCStackApplicationResult _handle_signup_response(void *ctx,
+
+void _set_platform_info()
+{
+       printf("_set_platform_info() is called\n");
+
+       if (OCSetPlatformInfo(g_platform_info) == OC_STACK_OK) {
+               printf("Platform Registration is succeeded\n");
+       } else {
+               printf("Platform Registration is failed\n");
+       }
+}
+
+
+void _set_device_info()
+{
+       printf("_set_device_info() is called\n");
+
+       OCDeviceInfo        devInfoAirConditioner;
+       OCStringLL          deviceType;
+
+       deviceType.value = "oic.d.airconditioner";
+       deviceType.next = NULL;
+       devInfoAirConditioner.deviceName = "FAC_2016";
+       devInfoAirConditioner.types = &deviceType;
+       devInfoAirConditioner.specVersion = NULL;
+       devInfoAirConditioner.dataModelVersions = NULL;
+
+       if (OCSetDeviceInfo(devInfoAirConditioner) != OC_STACK_OK) {
+               printf("OCSetDeviceInfo() failed\n");
+       } else {
+               printf("OCSetDeviceInfo() Success\n");
+       }
+}
+
+void _get_login_info()
+{
+       char tmp[64];
+
+       printf("Enter access_token : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.accessToken = g_strdup(tmp);
+       printf("access_token : %s\n", loginDetails.accessToken);
+
+       printf("Enter refresh_token : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.refreshToken = g_strdup(tmp);
+       printf("refresh_token : %s\n", loginDetails.refreshToken);
+
+       printf("Enter user_id : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.uid = g_strdup(tmp);
+       printf("user_id : %s\n", loginDetails.uid);
+
+       printf("Enter client_id : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.clientId = g_strdup(tmp);
+       printf("client_id : %s\n", loginDetails.clientId);
+
+       loginDetails.deviceId = g_strdup(OCGetServerInstanceIDString());
+       printf("Device ID = [%s]\n", loginDetails.deviceId);
+
+}
+
+
+static OCStackApplicationResult _handle_keepalive_cb(void *context, OCDoHandle handle,
+                                                                       OCClientResponse * clientResponse)
+{
+       (void)context;
+       (void)handle;
+
+       if (!clientResponse) {
+               printf("Received NULL clientResponse\n");
+               return OC_STACK_DELETE_TRANSACTION;
+       }
+
+       if (clientResponse->payload) {
+               printf("Payload received\n");
+       }
+
+       if (clientResponse->result == OC_STACK_OK) {
+               _keep_alive_cb((OCRepPayload*)clientResponse->payload);
+       }
+
+       return OC_STACK_DELETE_TRANSACTION;
+}
+
+void *_ping_timer(void *timer)
+{
+       OCStackResult ocResult = OC_STACK_ERROR;
+       (void)timer;
+
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "coap+tcp://%s%s",
+                       CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_URI);
+
+       OCCallbackData keepAliveCb = {0,};
+       keepAliveCb.cb = _handle_keepalive_cb;
+       OCFindKeepAliveResource(NULL, uri, &keepAliveCb);
+       printf("OCFindKeepAliveResource() result : %d\n", ocResult);
+
+       if (OC_STACK_OK != ocResult) {
+               pthread_detach(pthread_self());
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               pthread_exit(NULL);
+       }
+
+       return NULL;
+}
+
+
+static OCStackApplicationResult _handle_signin_response(void *ctx,
                                                                          OCDoHandle handle,
                                                                          OCClientResponse *response)
 {
@@ -97,120 +402,160 @@ static OCStackApplicationResult _handle_signup_response(void *ctx,
 
        if (response->result != LOGIN_OK) {
                printf("Login error: %d\n", response->result);
+
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = FALSE;
+               pthread_mutex_unlock(&pingcycle_mutex);
        } else {
-               _session_parse_payload((OCRepPayload*)response->payload);
-               printf("Sign Up OK\n");
+               bSignin = true;
+               printf("Sign In Success\n");
+
+               pthread_t pingThread;
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = true;
+               pthread_mutex_unlock(&pingcycle_mutex);
+
+               int ret = pthread_create(&pingThread, NULL, _ping_timer, NULL);
+               if (ret != 0)
+                       printf("ping pthread_create fail!\n");
        }
 
        return OC_STACK_DELETE_TRANSACTION;
-}
-
 
+}
 
-int _set_auth_cert_info()
+static OCStackApplicationResult _handle_signup_response(void *ctx,
+                                                                         OCDoHandle handle,
+                                                                         OCClientResponse *response)
 {
-       int fd;
-       FILE *fp;
-       uint8_t *data;
-       size_t len;
-       off_t fsize;
-       struct stat st;
-
-       fd = open(CERT_FILE_PATH, O_RDONLY);
-       if (fd == -1)
-               return -1;
+       (void)(ctx);
+       (void)(handle);
 
-       fp = fdopen(fd, "r");
-       if (fp == NULL) {
-               printf("Failed to open cert file!\n");
-               return -1;
+       if (!response) {
+               printf("Received NULL response\n");
+               return OC_STACK_DELETE_TRANSACTION;
        }
 
-       if ((fstat(fd, &st) != 0) || (!S_ISREG(st.st_mode)))
-               return -1;
+       if (response->payload) {
+               printf("Payload received\n");
+       }
 
-       if (fseeko(fp, 0, SEEK_END) == 0 && ((fsize = ftello(fp)) != -1)) {
-               data = (uint8_t *)malloc(fsize);
-               len = fsize;
+       if (response->result != LOGIN_OK) {
+               printf("Login error: %d\n", response->result);
        } else {
-               fclose(fp);
-               return -1;
+               _parse_payload((OCRepPayload*)response->payload);
+               printf("Sign Up OK\n");
+               _signin();
        }
 
-       rewind(fp);
-       size_t readLen = fread(data, 1, len , fp);
-       if (readLen != len) {
-               printf("Failed to read the cert file\n");
-               free(data);
-               fclose(fp);
-               return -1;
-       }
+       return OC_STACK_DELETE_TRANSACTION;
+}
 
-       fclose(fp);
+int _signin()
+{
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "coap+tcp://%s%s",
+                       CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_URI);
+       printf("server uri=[%s]\n", uri);
 
-       g_certificate = data;
-       g_cert_len = len;
-       if (OCSaveTrustCertChain(g_certificate, g_cert_len, g_cert_encoding_type, &g_cred_id) != OC_STACK_OK) {
-               printf("OCSaveTrustCertChain() failed\n");
-               return -1;
-       }
+       OCCallbackData *cbData = (OCCallbackData *)calloc(1, sizeof(OCCallbackData));
+       cbData->cb = _handle_signin_response;
+       cbData->context = (void *)DEFAULT_CONTEXT_VALUE;
+       cbData->cd = NULL;
 
-       return 0;
-}
+       OCRepPayload *payload = OCRepPayloadCreate();
+       if (!payload) return -1;
 
-static FILE *client_open(const char *path, const char *mode)
-{
-       (void)(path);
-    return fopen("/opt/usr/data/controlee-firmware/controlee-firmware-testapp.dat", mode);
+       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
+       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
+       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
+       OCRepPayloadSetPropBool(payload, CLOUD_LOGIN, true);
+       OCRepPayloadAddResourceType(payload, CLOUD_SESSION_RES_TYPE);
+       OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
+
+       int ret;
+       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
+                                       CT_ADAPTER_TCP, OC_LOW_QOS, cbData, NULL, 0) == OC_STACK_OK) {
+               ret = 0;
+               printf("OCDoResource() is succeeded\n");
+       } else {
+               ret = -1;
+               printf("OCDoResource() is failed\n");
+       }
+
+       return ret;
 }
 
 
 int _signup()
 {
-       char uri[MAX_URI_LENGTH] = { 0 };
 
-       OCPersistentStorage ps = {client_open, fread, fwrite, fclose, unlink};
-       if (OCRegisterPersistentStorageHandler(&ps) != OC_STACK_OK) {
-               printf("OCRegisterPersistentStorageHandler() is failed\n");
+       if (bSignin == true) {
+               printf("Already signed-in!\n");
                return -1;
        }
 
-       if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) {
-               printf("OCInit() failed\n");
-               return -1;
-       }
+       memset(&loginDetails, 0x00, sizeof(CloudLoginInfo));
+       _get_login_info();
 
-       if (_set_auth_cert_info() != 0) {
-               printf("Failed to set cert info\n");
-               return -1;
-       }
-
-       char *authToken = NULL;
-       // TODO :: Get auth token from data file :: Must fill authToken
-
-       OCUUIdentity deviceId;
-       if (OCGetDeviceId(&deviceId) != OC_STACK_OK) {
-               printf("OCGetDeviceId() is failed\n");
-               return -1;
-       }
+       _set_auth_cert_info();
 
+       char uri[MAX_URI_LENGTH] = { 0 };
        snprintf(uri, MAX_URI_LENGTH, "coap+tcp://%s%s",
-                       STG_SERVER, OC_RSRVD_ACCOUNT_URI);
+                       CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_URI);
+       printf("server uri=[%s]\n", uri);
 
-       OCCallbackData cbData;
-       memset(&cbData, 0, sizeof(OCCallbackData));
-       cbData.cb = _handle_signup_response;
-       //cbData.cd = NULL;
+       OCCallbackData *cbData = (OCCallbackData *)calloc(1, sizeof(OCCallbackData));
+       cbData->cb = _handle_signup_response;
+       cbData->context = (void *)DEFAULT_CONTEXT_VALUE;
+       cbData->cd = NULL;
 
        OCRepPayload *payload = OCRepPayloadCreate();
        if (!payload) return -1;
 
-       OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, (const char *)deviceId.id);
-       OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHPROVIDER, AUTH_PROVIDER);
-       OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHCODE, authToken);
+       OCRepPayloadSetPropString(payload, AUTH_PROVIDER, CLOUD_AUTH_PROVIDER);
+       OCRepPayloadSetPropString(payload, DEVICE_TYPE, CLOUD_DEVICE_TYPE);
+       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
+       OCRepPayloadSetPropString(payload, CLIENT_ID, (const char *)loginDetails.clientId);
+       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
+       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
+       OCRepPayloadAddResourceType(payload, CLOUD_ACCOUNT_RES_TYPE);
+       OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
+
+       int ret;
+       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
+                                       CT_ADAPTER_TCP, OC_LOW_QOS, cbData, NULL, 0) == OC_STACK_OK) {
+               ret = 0;
+               printf("OCDoResource() is succeeded\n");
+       } else {
+               ret = -1;
+               printf("OCDoResource() is failed\n");
+       }
+
+       return ret;
+}
+
 
-       return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
-                                       CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
+int _initialize_oc_stack()
+{
+       OCPersistentStorage ps = {client_open, fread, fwrite, fclose, unlink};
+       OCRegisterPersistentStorageHandler(&ps);
+
+       if (OCInit(NULL, 0, OC_SERVER) == OC_STACK_OK) {
+               printf("OCInit() succeeded\n");
+       } else {
+               printf("OCInit() failed\n");
+               return -1;
+       }
+
+       if (OCInitPM(OC_SECURITY_SQL_DB_FILE_NAME) == OC_STACK_OK) {
+               printf("OCInitPM() is succeeded!\n");
+       } else {
+               printf("OCInitPM() is failed");
+               return -1;
+       }
+
+       return 0;
 }
 
 
@@ -425,6 +770,20 @@ OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle
 
 int  _init_default_test_res()
 {
+#if 0
+       OCUUIdentity deviceId;
+       if (OCGetDeviceId(&deviceId) == OC_STACK_OK) {
+               printf("OCGetDeviceId() is succeeded\n");
+       } else {
+               printf("OCGetDeviceId() is failed\n");
+               return -1;
+       }
+#endif
+
+       _set_platform_info();
+
+       _set_device_info();
+
        /* Create air conditioner resource handle */
        if (OCCreateResource(&aircon_handle, "x.com.samsung.da.device",
                                                OC_RSRVD_INTERFACE_DEFAULT,
@@ -459,21 +818,6 @@ int  _init_default_test_res()
                return -1;
        }
 
-    OCDeviceInfo        devInfoAirConditioner;
-    OCStringLL          deviceType;
-
-    deviceType.value = "oic.d.airconditioner";
-    deviceType.next = NULL;
-    devInfoAirConditioner.deviceName = "FAC_2016";
-    devInfoAirConditioner.types = &deviceType;
-    devInfoAirConditioner.specVersion = NULL;
-    devInfoAirConditioner.dataModelVersions = NULL;
-
-   if (OCSetDeviceInfo(devInfoAirConditioner) != OC_STACK_OK) {
-               printf("OCSetDeviceInfo() failed\n");
-               return -1;
-       }
-
    return 0;
 }
 
@@ -497,7 +841,7 @@ int _publish_fw_res_to_rd()
        cb_data.cb = _handle_rd_publish_callback;
        cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
 
-       if (OCRDPublish(OCF_SERVER_URL, CT_ADAPTER_TCP,
+       if (OCRDPublish(NULL, OCF_SERVER_URL, CT_ADAPTER_TCP,
                        aircon_handle, 3,
                        &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
                printf("OCRDPublish() failed\n");
@@ -514,7 +858,7 @@ int _delete_fw_res_from_rd()
        cb_data.cb = _handle_rd_delete_callback;
        cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
 
-       if (OCRDDelete(OCF_SERVER_URL, CT_ADAPTER_TCP,
+       if (OCRDDelete(NULL, OCF_SERVER_URL, CT_ADAPTER_TCP,
                        aircon_handle, 3,
                        &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
                printf("OCRDDelete() failed\n");
@@ -557,8 +901,9 @@ void _show_menu()
        printf("============================================\n");
        printf("=== Controlee firmware resource test app ===\n");
        printf("============================================\n");
-       printf(" [A] Sign Up\n");
-       printf(" [1] Create default resource)\n");
+       printf(" [A] Sign Up/In\n");
+       printf(" [Z] Sign Out\n");
+       printf(" [1] Create default resource\n");
        printf(" [2] Create firmware resource\n");
        printf(" [3] Publish resources to RD\n");
        printf(" [4] Delete resources from RD\n");
@@ -593,6 +938,10 @@ gboolean _main_thread(GIOChannel *channel, GIOCondition condition, gpointer data
                case 'a' :
                        rv = _signup();
                        break;
+               case 'Z' :
+               case 'z' :
+                       //rv = _signout();
+                       break;
                case '1':
                        rv = _init_default_test_res();
                        break;
@@ -641,6 +990,20 @@ gboolean _main_thread(GIOChannel *channel, GIOCondition condition, gpointer data
        return true;
 }
 
+void* _OCProcess_thd(void * ptr)
+{
+       (void) ptr;
+       while (!isExit) {
+               if (OCProcess() != OC_STACK_OK) {
+                       printf("OCStack process error\n");
+                       return NULL;
+               }
+       }
+
+       return NULL;
+}
+
+
 int main(int argc, char *argv[])
 {
        GMainLoop *mainloop;
@@ -649,8 +1012,15 @@ int main(int argc, char *argv[])
        g_type_init();
 #endif
 
+       bSignin = false;
+       isExit = false;
        mainloop = g_main_loop_new(NULL, false);
 
+       _initialize_oc_stack();
+
+       pthread_t oc_proc_thd;
+       pthread_create(&oc_proc_thd, NULL, _OCProcess_thd, unlink);
+
        _show_menu();
        GIOChannel *channel = g_io_channel_unix_new(0);
        g_io_add_watch(channel, (G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL), _main_thread, NULL);