1 /* *****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * *****************************************************************/
23 #include "payload_logging.h"
25 #include "ocpayload.h"
26 #include "psinterface.h"
27 #include "securevirtualresourcetypes.h"
28 #include "doxmresource.h"
29 #include "oic_malloc.h"
30 #include "oic_string.h"
31 #include "srmutility.h"
32 #include "pmutility.h"
33 #include "credresource.h"
34 #include "payload_logging.h"
37 #include "cloudAuth.h"
38 #include "cloudCommon.h"
40 #define TAG "cloudAuth"
44 #define MAX_URI_QUERY MAX_URI_LENGTH + MAX_QUERY_LENGTH
58 static sessionObject_t sessionObject = {0,0,0,0,0,0,0,0};
61 * Session free function
63 * @return OCStackResult application result
65 static void SessionFree()
67 if (sessionObject.accesstoken) OICFree(sessionObject.accesstoken);
68 if (sessionObject.refreshtoken) OICFree(sessionObject.refreshtoken);
69 if (sessionObject.tokentype) OICFree(sessionObject.tokentype);
70 if (sessionObject.uid) OICFree(sessionObject.uid);
71 if (sessionObject.redirecturi) OICFree(sessionObject.redirecturi);
72 if (sessionObject.certificate) OICFree(sessionObject.certificate);
73 if (sessionObject.sid) OICFree(sessionObject.sid);
75 memset(&sessionObject, 0, sizeof(sessionObject_t));
79 * Session init function
81 * @param[in] sessionObject session data
82 * @return OCStackResult application result
84 static OCStackResult SessionInit()
86 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
88 SessionFree(sessionObject);
90 OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
96 * Session parse payload
99 * @param[in] sessionObject session data
100 * @return OCStackResult application result
102 static OCStackResult SessionParsePayload(OCRepPayload *payload)
104 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
106 VERIFY_NON_NULL(TAG, payload, ERROR);
110 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_ACCESS_TOKEN,
111 &sessionObject.accesstoken))
113 OIC_LOG(ERROR, TAG, "Can't get: accesstoken");
115 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REFRESH_TOKEN,
116 &sessionObject.refreshtoken))
118 OIC_LOG(ERROR, TAG, "Can't get: refreshtoken");
120 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_TOKEN_TYPE,
121 &sessionObject.tokentype))
123 OIC_LOG(ERROR, TAG, "Can't get: tokentype");
125 if (!OCRepPayloadGetPropInt(payload, OC_RSRVD_EXPIRES_IN,
126 &(sessionObject.expiresin)))
128 OIC_LOG(ERROR, TAG, "Can't get: expiresin");
130 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_USER_UUID,
133 OIC_LOG(ERROR, TAG, "Can't get: uid");
135 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REDIRECT_URI,
136 &sessionObject.redirecturi))
138 OIC_LOG(ERROR, TAG, "Can't get: redirecturi");
140 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_CERTIFICATE,
141 &sessionObject.certificate))
143 OIC_LOG(ERROR, TAG, "Can't get: certificate");
145 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_SUBJECT_ID,
148 OIC_LOG(ERROR, TAG, "Can't get: sid");
151 OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
157 * Sends Sign Up request to cloud
159 * @param[in] ctx context
160 * @param[in] handle handle
161 * @param[in] response response from peer
162 * @return OCStackApplicationResult application result
164 static OCStackApplicationResult handleCloudSignUpResponse(void *ctx,
166 OCClientResponse *response)
173 OIC_LOG(ERROR, TAG, "Received NULL response!");
177 if (response->payload)
179 OIC_LOG(ERROR, TAG, "Payload received");
180 OIC_LOG_PAYLOAD(DEBUG, response->payload);
183 if (response->result != LOGIN_OK)
185 OIC_LOG_V(ERROR, TAG, "Login error: %d",response->result);
189 OIC_LOG(DEBUG, TAG, "Login successful");
190 SessionParsePayload((OCRepPayload*)response->payload);
193 return OC_STACK_DELETE_TRANSACTION;
196 OCStackResult CloudSignUp(const OCDevAddr *endPoint,
197 const char *authProvider,
198 const char *authToken)
200 char uri[MAX_URI_LENGTH] = { 0 };
202 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
204 if (!endPoint || !authProvider || !authToken)
206 OIC_LOG(ERROR, TAG, "Some of the input params are NULL");
207 return OC_STACK_INVALID_PARAM;
210 char *deviceId = getDeviceId();
213 OIC_LOG(ERROR, TAG, "Can't get the device id");
214 return OC_STACK_ERROR;
217 snprintf(uri, MAX_URI_LENGTH, DEFAULT_QUERY,
218 endPoint->addr, endPoint->port, OC_RSRVD_ACCOUNT_URI);
220 OCCallbackData cbData;
221 memset(&cbData, 0, sizeof(OCCallbackData));
222 cbData.cb = handleCloudSignUpResponse;
223 cbData.cd = unlockMenu;
225 OCRepPayload *payload = OCRepPayloadCreate();
228 OIC_LOG(ERROR, TAG, "Failed to memory allocation");
229 return OC_STACK_NO_MEMORY;
232 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
233 OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHPROVIDER, OICStrdup(authProvider));
234 OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHCODE, OICStrdup(authToken));
236 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
237 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
241 * Sends Sign In request to cloud
243 * @param[in] ctx context
244 * @param[in] handle handle
245 * @param[in] response response from peer
246 * @return OCStackApplicationResult application result
248 static OCStackApplicationResult handleCloudSignInResponse(void *ctx,
250 OCClientResponse *response)
252 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
259 OIC_LOG(ERROR, TAG, "Received NULL response!");
263 if (response->payload)
265 OIC_LOG(ERROR, TAG, "Payload received");
266 OIC_LOG_PAYLOAD(DEBUG, response->payload);
269 if (response->result < 4 && response->payload)
271 OIC_LOG_V(ERROR, TAG, "Sign In error: result: %d, payload exist: %s",
272 response->result, response->payload ? "yes" : "no");
276 if (!OCRepPayloadGetPropString((OCRepPayload*)response->payload, OC_RSRVD_USER_UUID,
277 &(sessionObject.uid)))
279 OIC_LOG(ERROR, TAG, "Can't get: uid");
282 if (!OCRepPayloadGetPropInt((OCRepPayload*)response->payload, OC_RSRVD_EXPIRES_IN,
283 &(sessionObject.expiresin)))
285 OIC_LOG(ERROR, TAG, "Cann't get: expiresin");
288 OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
291 return OC_STACK_DELETE_TRANSACTION;
294 OCStackResult CloudSignIn(const OCDevAddr *endPoint)
296 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
300 OIC_LOG_V(ERROR, TAG, "%s: endPoint is NULL",__func__);
301 return OC_STACK_INVALID_PARAM;
304 if (!sessionObject.uid)
306 OIC_LOG_V(ERROR, TAG, "%s: UID is missing. Please run Sign Up first",__func__);
307 return OC_STACK_ERROR;
310 if (!sessionObject.accesstoken)
312 OIC_LOG_V(ERROR, TAG, "%s: accesstoken is missing. Please run Sign Up first",__func__);
313 return OC_STACK_ERROR;
316 char *deviceId = getDeviceId();
319 OIC_LOG(ERROR, TAG, "Can't get the device id");
320 return OC_STACK_ERROR;
323 OCRepPayload* payload = OCRepPayloadCreate();
326 OIC_LOG(ERROR, TAG, "Failed to memory allocation");
327 return OC_STACK_NO_MEMORY;
330 OCRepPayloadSetPropString(payload, OC_RSRVD_USER_UUID, sessionObject.uid);
331 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
332 OCRepPayloadSetPropString(payload, OC_RSRVD_ACCESS_TOKEN,
333 sessionObject.accesstoken);
334 OCRepPayloadSetPropBool(payload, OC_RSRVD_LOGIN, true);
336 char uri[MAX_URI_QUERY] = { 0, };
337 snprintf(uri, MAX_URI_QUERY, DEFAULT_QUERY,
338 endPoint->addr, endPoint->port,
339 OC_RSRVD_ACCOUNT_SESSION_URI);
341 OCCallbackData cbData;
342 memset(&cbData, 0, sizeof(OCCallbackData));
343 cbData.cb = handleCloudSignInResponse;
344 cbData.cd = unlockMenu;
346 return OCDoResource(NULL, OC_REST_POST, uri, NULL,
347 (OCPayload *)payload,
349 OC_LOW_QOS, &cbData, NULL, 0);
352 static OCStackApplicationResult handleCloudSignOutResponse(void *ctx,
354 OCClientResponse *response)
356 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
363 OIC_LOG(ERROR, TAG, "Received NULL response!");
367 if (response->payload)
369 OIC_LOG(ERROR, TAG, "Payload received");
370 OIC_LOG_PAYLOAD(DEBUG, response->payload);
373 if (response->result < 4 && response->payload)
375 OIC_LOG_V(ERROR, TAG, "Sign Out error");
376 return OC_STACK_DELETE_TRANSACTION;
380 OIC_LOG_V(ERROR, TAG, "Sign Out OK");
385 OIC_LOG_V(DEBUG, TAG, "OUT: %s", __func__);
388 return OC_STACK_DELETE_TRANSACTION;
392 * Sends Sign Out request to cloud
394 * @param[in] ctx context
395 * @param[in] handle handle
396 * @param[in] response response from peer
397 * @return OCStackApplicationResult application result
399 OCStackResult CloudSignOut(const OCDevAddr *endPoint)
401 OIC_LOG_V(DEBUG, TAG, "IN: %s", __func__);
405 OIC_LOG_V(ERROR, TAG, "%s: endPoint is NULL",__func__);
406 return OC_STACK_INVALID_PARAM;
409 char *deviceId = getDeviceId();
412 OIC_LOG(ERROR, TAG, "Cann't get the device id");
413 return OC_STACK_ERROR;
416 OCRepPayload* payload = OCRepPayloadCreate();
419 OIC_LOG(ERROR, TAG, "Failed to memory allocation");
420 return OC_STACK_NO_MEMORY;
423 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
424 OCRepPayloadSetPropString(payload, OC_RSRVD_ACCESS_TOKEN,
425 sessionObject.accesstoken);
426 OCRepPayloadSetPropBool(payload, OC_RSRVD_LOGIN, false);
428 char uri[MAX_URI_QUERY] = { 0, };
429 snprintf(uri, MAX_URI_QUERY, DEFAULT_QUERY,
430 endPoint->addr, endPoint->port,
431 OC_RSRVD_ACCOUNT_SESSION_URI);
433 OCCallbackData cbData;
434 memset(&cbData, 0, sizeof(OCCallbackData));
435 cbData.cb = handleCloudSignOutResponse;
436 cbData.cd = unlockMenu;
438 return OCDoResource(NULL, OC_REST_POST, uri, NULL,
439 (OCPayload *)payload,
441 OC_LOW_QOS, &cbData, NULL, 0);