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 "pmutility.h"
32 #include "credresource.h"
33 #include "payload_logging.h"
34 #include "cacommonutil.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 = {NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL};
61 * Session free function
63 * @return OCStackResult application result
65 static void SessionFree()
67 OICFree(sessionObject.accesstoken);
68 OICFree(sessionObject.refreshtoken);
69 OICFree(sessionObject.tokentype);
70 OICFree(sessionObject.uid);
71 OICFree(sessionObject.redirecturi);
72 OICFree(sessionObject.certificate);
73 OICFree(sessionObject.sid);
75 memset(&sessionObject, 0, sizeof(sessionObject_t));
79 * Session parse payload
82 * @param[in] sessionObject session data
83 * @return OCStackResult application result
85 static OCStackResult SessionParsePayload(OCRepPayload *payload)
87 VERIFY_NON_NULL_RET(payload, TAG, "NULL payload", OC_STACK_ERROR);
91 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_ACCESS_TOKEN,
92 &sessionObject.accesstoken))
94 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_ACCESS_TOKEN);
96 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REFRESH_TOKEN,
97 &sessionObject.refreshtoken))
99 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_REFRESH_TOKEN);
101 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_TOKEN_TYPE,
102 &sessionObject.tokentype))
104 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_TOKEN_TYPE);
107 if (!OCRepPayloadGetPropInt(payload, OC_RSRVD_EXPIRES_IN, &tmp))
109 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_EXPIRES_IN);
113 sessionObject.expiresin = tmp;
115 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_USER_UUID,
118 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_USER_UUID);
120 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REDIRECT_URI,
121 &sessionObject.redirecturi))
123 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_REDIRECT_URI);
125 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_CERTIFICATE,
126 &sessionObject.certificate))
128 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_CERTIFICATE);
130 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_SUBJECT_ID,
133 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_SUBJECT_ID);
140 * Sends Sign Up request to cloud
142 * @param[in] ctx context
143 * @param[in] handle handle
144 * @param[in] response response from peer
145 * @return OCStackApplicationResult application result
147 static OCStackApplicationResult handleCloudSignUpResponse(void *ctx,
149 OCClientResponse *response)
154 VERIFY_NON_NULL_RET(response, TAG, "Received NULL response", OC_STACK_DELETE_TRANSACTION);
156 if (response->payload)
158 OIC_LOG(INFO, TAG, "Payload received");
159 OIC_LOG_PAYLOAD(DEBUG, response->payload);
162 if (response->result != LOGIN_OK)
164 OIC_LOG_V(ERROR, TAG, "Login error: %d",response->result);
168 SessionParsePayload((OCRepPayload*)response->payload);
169 OIC_LOG(INFO, TAG, "Sign Up OK");
172 return OC_STACK_DELETE_TRANSACTION;
175 OCStackResult CloudSignUp(const OCDevAddr *endPoint,
176 const char *authProvider,
177 const char *authToken)
179 char uri[MAX_URI_LENGTH] = { 0 };
181 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
182 VERIFY_NON_NULL_RET(authProvider, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
183 VERIFY_NON_NULL_RET(authToken, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
185 char *deviceId = getDeviceId();
186 VERIFY_NON_NULL_RET(deviceId, TAG, "Can't get the device id", OC_STACK_ERROR);
188 snprintf(uri, MAX_URI_LENGTH, DEFAULT_QUERY,
189 endPoint->addr, endPoint->port, OC_RSRVD_ACCOUNT_URI);
191 OCCallbackData cbData;
192 memset(&cbData, 0, sizeof(OCCallbackData));
193 cbData.cb = handleCloudSignUpResponse;
194 cbData.cd = unlockMenu;
196 OCRepPayload *payload = OCRepPayloadCreate();
197 VERIFY_NON_NULL_RET(payload, TAG, "Failed to allocate payload", OC_STACK_NO_MEMORY);
199 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
200 OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHPROVIDER, authProvider);
201 OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHCODE, authToken);
203 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
204 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
208 * Sends Sign In request to cloud
210 * @param[in] ctx context
211 * @param[in] handle handle
212 * @param[in] response response from peer
213 * @return OCStackApplicationResult application result
215 static OCStackApplicationResult handleCloudSignInResponse(void *ctx,
217 OCClientResponse *response)
222 VERIFY_NON_NULL_RET(response, TAG, "Received NULL response", OC_STACK_DELETE_TRANSACTION);
224 if (response->payload)
226 OIC_LOG(INFO, TAG, "Payload received");
227 OIC_LOG_PAYLOAD(DEBUG, response->payload);
230 if (response->result != LOGIN_OK)
232 OIC_LOG_V(ERROR, TAG, "Sign In error: result: %d", response->result);
233 return OC_STACK_DELETE_TRANSACTION;
236 sessionObject.expiresin = 0;
238 if (!OCRepPayloadGetPropInt((OCRepPayload*)response->payload, OC_RSRVD_EXPIRES_IN, &tmp))
240 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_EXPIRES_IN);
244 sessionObject.expiresin = tmp;
247 OIC_LOG(INFO, TAG, "Sign In OK");
249 return OC_STACK_DELETE_TRANSACTION;
252 static OCStackApplicationResult handleCloudSignOutResponse(void *ctx,
254 OCClientResponse *response)
259 VERIFY_NON_NULL_RET(response, TAG, "Received NULL response", OC_STACK_DELETE_TRANSACTION);
261 if (response->payload)
263 OIC_LOG(INFO, TAG, "Payload received");
264 OIC_LOG_PAYLOAD(DEBUG, response->payload);
267 if (response->result != LOGIN_OK)
269 OIC_LOG(ERROR, TAG, "Sign Out error");
270 return OC_STACK_DELETE_TRANSACTION;
273 OIC_LOG(INFO, TAG, "Sign Out OK");
275 return OC_STACK_DELETE_TRANSACTION;
279 * Sends Sign In/Out request to cloud
281 * @param[in] endPoint peer endPoint
282 * @param[in] signIn is it Sign In or Sign Out request
283 * @return OCStackApplicationResult application result
285 static OCStackResult CloudSign(const OCDevAddr *endPoint, bool signIn)
287 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
288 VERIFY_NON_NULL_RET(sessionObject.uid, TAG,
289 "UID is missing. Please run Sign Up first", OC_STACK_ERROR);
290 VERIFY_NON_NULL_RET(sessionObject.accesstoken, TAG,
291 "accesstoken is missing. Please run Sign Up first", OC_STACK_ERROR);
293 char *deviceId = getDeviceId();
294 VERIFY_NON_NULL_RET(deviceId, TAG, "Can't get the device id", OC_STACK_ERROR);
296 OCRepPayload* payload = OCRepPayloadCreate();
297 VERIFY_NON_NULL_RET(payload, TAG, "Failed to allocate payload", OC_STACK_NO_MEMORY);
299 OCRepPayloadSetPropString(payload, OC_RSRVD_USER_UUID, sessionObject.uid);
300 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
301 OCRepPayloadSetPropString(payload, OC_RSRVD_ACCESS_TOKEN, sessionObject.accesstoken);
302 OCRepPayloadSetPropBool(payload, OC_RSRVD_LOGIN, signIn);
304 char uri[MAX_URI_QUERY] = { 0 };
305 snprintf(uri, MAX_URI_QUERY, DEFAULT_QUERY,
306 endPoint->addr, endPoint->port,
307 OC_RSRVD_ACCOUNT_SESSION_URI);
309 OCCallbackData cbData;
310 memset(&cbData, 0, sizeof(OCCallbackData));
311 cbData.cb = signIn? handleCloudSignInResponse : handleCloudSignOutResponse;
312 cbData.cd = unlockMenu;
314 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
315 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
318 OCStackResult CloudSignIn(const OCDevAddr *endPoint)
320 return CloudSign(endPoint, true);
323 OCStackResult CloudSignOut(const OCDevAddr *endPoint)
325 return CloudSign(endPoint, false);